File: Realtime\RealtimeSessionOptionsTests.cs
Project: ..\..\..\test\Libraries\Microsoft.Extensions.AI.Abstractions.Tests\Microsoft.Extensions.AI.Abstractions.Tests.csproj (Microsoft.Extensions.AI.Abstractions.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using Xunit;
 
#pragma warning disable MEAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates.
 
namespace Microsoft.Extensions.AI;
 
public class RealtimeSessionOptionsTests
{
    [Fact]
    public void Constructor_Parameterless_PropsDefaulted()
    {
        RealtimeSessionOptions options = new();
 
        Assert.Equal(RealtimeSessionKind.Conversation, options.SessionKind);
        Assert.Null(options.Model);
        Assert.Null(options.InputAudioFormat);
        Assert.Null(options.TranscriptionOptions);
        Assert.Null(options.OutputAudioFormat);
        Assert.Null(options.Voice);
        Assert.Null(options.Instructions);
        Assert.Null(options.MaxOutputTokens);
        Assert.Null(options.OutputModalities);
        Assert.Null(options.ToolMode);
        Assert.Null(options.Tools);
        Assert.Null(options.VoiceActivityDetection);
    }
 
    [Fact]
    public void Properties_Roundtrip()
    {
        var inputFormat = new RealtimeAudioFormat("audio/pcm", 16000);
        var outputFormat = new RealtimeAudioFormat("audio/pcm", 24000);
        List<string> modalities = ["text", "audio"];
        List<AITool> tools = [AIFunctionFactory.Create(() => 42)];
        var transcriptionOptions = new TranscriptionOptions { SpeechLanguage = "en", ModelId = "whisper-1", Prompt = "greeting" };
 
        RealtimeSessionOptions options = new()
        {
            SessionKind = RealtimeSessionKind.Transcription,
            Model = "gpt-4-realtime",
            InputAudioFormat = inputFormat,
            OutputAudioFormat = outputFormat,
            TranscriptionOptions = transcriptionOptions,
            Voice = "alloy",
            Instructions = "Be helpful",
            MaxOutputTokens = 500,
            OutputModalities = modalities,
            ToolMode = ChatToolMode.Auto,
            Tools = tools,
        };
 
        Assert.Equal(RealtimeSessionKind.Transcription, options.SessionKind);
        Assert.Equal("gpt-4-realtime", options.Model);
        Assert.Same(inputFormat, options.InputAudioFormat);
        Assert.Same(outputFormat, options.OutputAudioFormat);
        Assert.Same(transcriptionOptions, options.TranscriptionOptions);
        Assert.Equal("alloy", options.Voice);
        Assert.Equal("Be helpful", options.Instructions);
        Assert.Equal(500, options.MaxOutputTokens);
        Assert.Same(modalities, options.OutputModalities);
        Assert.Equal(ChatToolMode.Auto, options.ToolMode);
        Assert.Same(tools, options.Tools);
    }
 
    [Fact]
    public void TranscriptionOptions_Properties_Roundtrip()
    {
        var options = new TranscriptionOptions { SpeechLanguage = "en", ModelId = "whisper-1", Prompt = "greeting" };
 
        Assert.Equal("en", options.SpeechLanguage);
        Assert.Equal("whisper-1", options.ModelId);
        Assert.Equal("greeting", options.Prompt);
 
        options.SpeechLanguage = "fr";
        options.ModelId = "whisper-2";
        options.Prompt = null;
 
        Assert.Equal("fr", options.SpeechLanguage);
        Assert.Equal("whisper-2", options.ModelId);
        Assert.Null(options.Prompt);
    }
 
    [Fact]
    public void TranscriptionOptions_PromptDefaultsToNull()
    {
        var options = new TranscriptionOptions { SpeechLanguage = "en", ModelId = "whisper-1" };
        Assert.Null(options.Prompt);
    }
 
    [Fact]
    public void VoiceActivityDetection_DefaultsToNull()
    {
        RealtimeSessionOptions options = new();
        Assert.Null(options.VoiceActivityDetection);
    }
 
    [Fact]
    public void VoiceActivityDetection_Roundtrip()
    {
        var vad = new VoiceActivityDetectionOptions();
        RealtimeSessionOptions options = new()
        {
            VoiceActivityDetection = vad,
        };
 
        Assert.Same(vad, options.VoiceActivityDetection);
    }
 
    [Fact]
    public void VoiceActivityDetectionOptions_DefaultValues()
    {
        var vad = new VoiceActivityDetectionOptions();
        Assert.True(vad.Enabled);
        Assert.True(vad.AllowInterruption);
    }
 
    [Fact]
    public void VoiceActivityDetectionOptions_Properties_Roundtrip()
    {
        var vad = new VoiceActivityDetectionOptions
        {
            Enabled = false,
            AllowInterruption = false,
        };
 
        Assert.False(vad.Enabled);
        Assert.False(vad.AllowInterruption);
 
        vad.Enabled = true;
        vad.AllowInterruption = true;
 
        Assert.True(vad.Enabled);
        Assert.True(vad.AllowInterruption);
    }
}