diff --git a/OpenAI-DotNet/Extensions/ResponseExtensions.cs b/OpenAI-DotNet/Extensions/ResponseExtensions.cs index 4cd48f09..e468f7a9 100644 --- a/OpenAI-DotNet/Extensions/ResponseExtensions.cs +++ b/OpenAI-DotNet/Extensions/ResponseExtensions.cs @@ -256,7 +256,7 @@ private static async Task ReadAsStringAsync(this HttpResponseMessage res if (@event.Data != null) { - @object[ServerSentEventKind.Data.ToString().ToLower()] = JsonNode.Parse(@event.Data.ToJsonString()); + @object[nameof(ServerSentEventKind.Data).ToLower()] = JsonNode.Parse(@event.Data.ToJsonString()); } array.Add(@object); diff --git a/OpenAI-DotNet/OpenAI-DotNet.csproj b/OpenAI-DotNet/OpenAI-DotNet.csproj index 2e81ad85..235e3f0e 100644 --- a/OpenAI-DotNet/OpenAI-DotNet.csproj +++ b/OpenAI-DotNet/OpenAI-DotNet.csproj @@ -29,8 +29,11 @@ More context [on Roger Pincombe's blog](https://rogerpincombe.com/openai-dotnet- OpenAI-DotNet.pfx true true - 8.8.3 + 8.8.4 +Version 8.8.4 +- Fix RealtimeSessionConfiguration and CreateResponseRequest model parameter overriding prompt settings +- Fix Threads.MessageResponse.Status not being properly set to Completed Version 8.8.3 - Fix regression ObjectDisposedException from OpenAIBaseEndpoint refactoring - Add Azure Blob Batch API compatible fields for CreateBatchRequest diff --git a/OpenAI-DotNet/Realtime/SessionConfiguration.cs b/OpenAI-DotNet/Realtime/SessionConfiguration.cs index d6f4eaa6..3e76bb53 100644 --- a/OpenAI-DotNet/Realtime/SessionConfiguration.cs +++ b/OpenAI-DotNet/Realtime/SessionConfiguration.cs @@ -29,42 +29,85 @@ public SessionConfiguration( int? maxResponseOutputTokens, int? expiresAfter) : this( - model: model, - modalities: modalities, - voice: voice, - instructions: instructions, - inputAudioFormat: inputAudioFormat, - outputAudioFormat: outputAudioFormat, + model, + prompt: null, + instructions, + modalities, + voice, + speed: null, + inputAudioFormat, + outputAudioFormat, + inputAudioNoiseSettings: null, inputAudioTranscriptionSettings: new(transcriptionModel), - turnDetectionSettings: turnDetectionSettings, - tools: tools, - toolChoice: toolChoice, - temperature: temperature, - maxResponseOutputTokens: maxResponseOutputTokens, - expiresAfter: expiresAfter) + turnDetectionSettings, + tools, + toolChoice, + temperature, + maxResponseOutputTokens, + expiresAfter) { } + [Obsolete("Use new ctor overload")] public SessionConfiguration( Model model, + Modality modalities, + Voice voice, + string instructions, + RealtimeAudioFormat inputAudioFormat, + RealtimeAudioFormat outputAudioFormat, + InputAudioTranscriptionSettings inputAudioTranscriptionSettings, + IVoiceActivityDetectionSettings turnDetectionSettings, + IEnumerable tools, + string toolChoice, + float? temperature, + int? maxResponseOutputTokens, + int? expiresAfter, + NoiseReductionSettings inputAudioNoiseSettings, + float? speed, + Prompt prompt) + : this( + model, + prompt, + instructions, + modalities, + voice, + speed, + inputAudioFormat, + outputAudioFormat, + inputAudioNoiseSettings, + inputAudioTranscriptionSettings, + turnDetectionSettings, + tools, + toolChoice, + temperature, + maxResponseOutputTokens, + expiresAfter) + { + } + + public SessionConfiguration( + Model model = null, + Prompt prompt = null, + string instructions = null, Modality modalities = Modality.Text | Modality.Audio, Voice voice = null, - string instructions = null, + float? speed = null, RealtimeAudioFormat inputAudioFormat = RealtimeAudioFormat.PCM16, RealtimeAudioFormat outputAudioFormat = RealtimeAudioFormat.PCM16, + NoiseReductionSettings inputAudioNoiseSettings = null, InputAudioTranscriptionSettings inputAudioTranscriptionSettings = null, IVoiceActivityDetectionSettings turnDetectionSettings = null, IEnumerable tools = null, string toolChoice = null, float? temperature = null, int? maxResponseOutputTokens = null, - int? expiresAfter = null, - NoiseReductionSettings inputAudioNoiseSettings = null, - float? speed = null, - Prompt prompt = null) + int? expiresAfter = null) { ClientSecret = new ClientSecret(expiresAfter); - Model = string.IsNullOrWhiteSpace(model?.Id) ? Models.Model.GPT4oRealtime : model; + Model = string.IsNullOrWhiteSpace(model?.Id) && prompt == null + ? Models.Model.GPT4oRealtime + : model; Modalities = modalities; Voice = string.IsNullOrWhiteSpace(voice?.Id) ? OpenAI.Voice.Alloy : voice; Instructions = string.IsNullOrWhiteSpace(instructions) @@ -153,6 +196,7 @@ internal SessionConfiguration( /// [JsonInclude] [JsonPropertyName("model")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string Model { get; private set; } /// diff --git a/OpenAI-DotNet/Responses/CreateResponseRequest.cs b/OpenAI-DotNet/Responses/CreateResponseRequest.cs index b314ba77..65bf0abb 100644 --- a/OpenAI-DotNet/Responses/CreateResponseRequest.cs +++ b/OpenAI-DotNet/Responses/CreateResponseRequest.cs @@ -159,7 +159,9 @@ public CreateResponseRequest( int? topLogProbs = null) { Input = input?.ToArray() ?? throw new ArgumentNullException(nameof(input)); - Model = string.IsNullOrWhiteSpace(model) ? Models.Model.ChatGPT4o : model; + Model = string.IsNullOrWhiteSpace(model?.Id) && prompt == null + ? Models.Model.GPT4oRealtime + : model; Background = background; Include = include?.ToList(); Instructions = instructions; @@ -214,6 +216,7 @@ public CreateResponseRequest( /// [JsonInclude] [JsonPropertyName("model")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string Model { get; private set; } /// diff --git a/OpenAI-DotNet/Threads/MessageResponse.cs b/OpenAI-DotNet/Threads/MessageResponse.cs index bd23673e..c1f4b13c 100644 --- a/OpenAI-DotNet/Threads/MessageResponse.cs +++ b/OpenAI-DotNet/Threads/MessageResponse.cs @@ -255,8 +255,7 @@ internal void AppendFrom(MessageResponse other) IncompleteAtUnixTimeSeconds = other.IncompleteAtUnixTimeSeconds; } - if (Status == 0 && - other.Status > 0) + if (other.Status > 0) { Status = other.Status; }