From 7a628426dc45b83fa116cc369d5b373ba558ad01 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 7 Dec 2025 01:48:24 +0800 Subject: [PATCH] Fixed: #433 refactor(translator): normalize finish reason casing across all OpenAI response handlers --- .../chat-completions/antigravity_openai_response.go | 5 +++-- .../chat-completions/gemini-cli_openai_response.go | 5 +++-- .../openai/chat-completions/gemini_openai_response.go | 9 +++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go index c392b625..e069f7ec 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go @@ -10,6 +10,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "time" . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/openai/chat-completions" @@ -75,8 +76,8 @@ func ConvertAntigravityResponseToOpenAI(_ context.Context, _ string, originalReq // Extract and set the finish reason. if finishReasonResult := gjson.GetBytes(rawJSON, "response.candidates.0.finishReason"); finishReasonResult.Exists() { - template, _ = sjson.Set(template, "choices.0.finish_reason", finishReasonResult.String()) - template, _ = sjson.Set(template, "choices.0.native_finish_reason", finishReasonResult.String()) + template, _ = sjson.Set(template, "choices.0.finish_reason", strings.ToLower(finishReasonResult.String())) + template, _ = sjson.Set(template, "choices.0.native_finish_reason", strings.ToLower(finishReasonResult.String())) } // Extract and set usage metadata (token counts). diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go index d4084ec6..9c422a07 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go @@ -10,6 +10,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "time" . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/openai/chat-completions" @@ -75,8 +76,8 @@ func ConvertCliResponseToOpenAI(_ context.Context, _ string, originalRequestRawJ // Extract and set the finish reason. if finishReasonResult := gjson.GetBytes(rawJSON, "response.candidates.0.finishReason"); finishReasonResult.Exists() { - template, _ = sjson.Set(template, "choices.0.finish_reason", finishReasonResult.String()) - template, _ = sjson.Set(template, "choices.0.native_finish_reason", finishReasonResult.String()) + template, _ = sjson.Set(template, "choices.0.finish_reason", strings.ToLower(finishReasonResult.String())) + template, _ = sjson.Set(template, "choices.0.native_finish_reason", strings.ToLower(finishReasonResult.String())) } // Extract and set usage metadata (token counts). diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go index 4f0b01e7..12e28cca 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go @@ -10,6 +10,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "time" "github.com/tidwall/gjson" @@ -78,8 +79,8 @@ func ConvertGeminiResponseToOpenAI(_ context.Context, _ string, originalRequestR // Extract and set the finish reason. if finishReasonResult := gjson.GetBytes(rawJSON, "candidates.0.finishReason"); finishReasonResult.Exists() { - template, _ = sjson.Set(template, "choices.0.finish_reason", finishReasonResult.String()) - template, _ = sjson.Set(template, "choices.0.native_finish_reason", finishReasonResult.String()) + template, _ = sjson.Set(template, "choices.0.finish_reason", strings.ToLower(finishReasonResult.String())) + template, _ = sjson.Set(template, "choices.0.native_finish_reason", strings.ToLower(finishReasonResult.String())) } // Extract and set usage metadata (token counts). @@ -230,8 +231,8 @@ func ConvertGeminiResponseToOpenAINonStream(_ context.Context, _ string, origina } if finishReasonResult := gjson.GetBytes(rawJSON, "candidates.0.finishReason"); finishReasonResult.Exists() { - template, _ = sjson.Set(template, "choices.0.finish_reason", finishReasonResult.String()) - template, _ = sjson.Set(template, "choices.0.native_finish_reason", finishReasonResult.String()) + template, _ = sjson.Set(template, "choices.0.finish_reason", strings.ToLower(finishReasonResult.String())) + template, _ = sjson.Set(template, "choices.0.native_finish_reason", strings.ToLower(finishReasonResult.String())) } if usageResult := gjson.GetBytes(rawJSON, "usageMetadata"); usageResult.Exists() {