From 12b3d6fc3d8115abfde625fbf80c39bf04557e35 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Wed, 1 Jan 2025 20:11:42 +0100 Subject: [PATCH] Fixed OpenAI `o` models (#239) --- .../Provider/BaseProvider.cs | 11 ++++++- .../Provider/OpenAI/ProviderOpenAI.cs | 30 +++++++++++++++++-- .../wwwroot/changelog/v0.9.23.md | 1 + 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 32ee685..bf5501c 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -1,3 +1,5 @@ +using System.Net; + using AIStudio.Chat; using RustService = AIStudio.Tools.RustService; @@ -102,6 +104,13 @@ public abstract class BaseProvider : IProvider, ISecretId response = nextResponse; break; } + + if(nextResponse.StatusCode is HttpStatusCode.BadRequest) + { + this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); + errorMessage = nextResponse.ReasonPhrase; + break; + } errorMessage = nextResponse.ReasonPhrase; var timeSeconds = Math.Pow(RETRY_DELAY_SECONDS, retry + 1); @@ -112,7 +121,7 @@ public abstract class BaseProvider : IProvider, ISecretId await Task.Delay(TimeSpan.FromSeconds(timeSeconds), token); } - if(retry >= MAX_RETRIES) + if(retry >= MAX_RETRIES || !string.IsNullOrWhiteSpace(errorMessage)) return new HttpRateLimitedStreamResult(false, true, errorMessage ?? $"Failed after {MAX_RETRIES} retries; no provider message available", response); return new HttpRateLimitedStreamResult(true, false, string.Empty, response); diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index 767d4fe..1c55af6 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -32,11 +32,36 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o var requestedSecret = await RUST_SERVICE.GetAPIKey(this); if(!requestedSecret.Success) yield break; + + // Unfortunately, OpenAI changed the name of the system prompt based on the model. + // All models that start with "o" (the omni aka reasoning models) and all GPT4o models + // have the system prompt named "developer". All other models have the system prompt + // named "system". We need to check this to get the correct system prompt. + // + // To complicate it even more: The early versions of reasoning models, which are released + // before the 17th of December 2024, have no system prompt at all. We need to check this + // as well. + + // Apply the basic rule first: + var systemPromptRole = chatModel.Id.StartsWith('o') || chatModel.Id.Contains("4o") ? "developer" : "system"; + + // Check if the model is an early version of the reasoning models: + systemPromptRole = chatModel.Id switch + { + "o1-mini" => "user", + "o1-mini-2024-09-12" => "user", + "o1-preview" => "user", + "o1-preview-2024-09-12" => "user", + + _ => systemPromptRole, + }; + + this.logger.LogInformation($"Using the system prompt role '{systemPromptRole}' for model '{chatModel.Id}'."); // Prepare the system prompt: var systemPrompt = new Message { - Role = "system", + Role = systemPromptRole, Content = chatThread.SystemPrompt, }; @@ -55,7 +80,7 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o ChatRole.USER => "user", ChatRole.AI => "assistant", ChatRole.AGENT => "assistant", - ChatRole.SYSTEM => "system", + ChatRole.SYSTEM => systemPromptRole, _ => "user", }, @@ -71,7 +96,6 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o // Right now, we only support streaming completions: Stream = true, - FrequencyPenalty = 0f, }, JSON_SERIALIZER_OPTIONS); async Task RequestBuilder() diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.23.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.23.md index 660f2f0..e8a2ba5 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.23.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.23.md @@ -3,6 +3,7 @@ - Improved provider requests by handling rate limits by retrying requests. - Improved the creation of the "the bias of the day" workspace; create that workspace only when the bias of the day feature is used. - Improved the save operation of settings by using a temporary file to avoid data loss in rare cases. +- Fixed OpenAI `o` (aka omni, aka reasoning) models. The early preview versions (released before 17th December 2024) could not use any system prompts —- we translated the system prompts to be user prompts. Final versions of the OpenAI `o` models can now use system prompts, by they are named `developer` instead of `system`. - Fixed layout issues when selecting `other` items (e.g., programming languages). - Fixed a bug about the bias of the day workspace when the workspace component was hidden. - Upgraded dependencies to the latest versions. \ No newline at end of file