From c8cee547fde537d68094b5fa99fa77f4b169dadb Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Thu, 27 Nov 2025 00:52:17 +0800 Subject: [PATCH] **fix(translator): ensure partial content is retained while skipping encrypted thoughtSignature** - Updated handling of `thoughtSignature` across all translator modules to retain other content payloads if present. - Adjusted logic for `thought_signature` and `inline_data` keys for consistent processing. --- .../chat-completions/antigravity_openai_response.go | 11 ++++++++--- .../chat-completions/gemini-cli_openai_response.go | 11 ++++++++--- .../openai/chat-completions/gemini_openai_response.go | 7 +++++-- 3 files changed, 21 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 c70daaf2..c392b625 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go @@ -105,14 +105,19 @@ func ConvertAntigravityResponseToOpenAI(_ context.Context, _ string, originalReq partTextResult := partResult.Get("text") functionCallResult := partResult.Get("functionCall") thoughtSignatureResult := partResult.Get("thoughtSignature") + if !thoughtSignatureResult.Exists() { + thoughtSignatureResult = partResult.Get("thought_signature") + } inlineDataResult := partResult.Get("inlineData") if !inlineDataResult.Exists() { inlineDataResult = partResult.Get("inline_data") } - // Handle thoughtSignature - this is encrypted reasoning content that should not be exposed to the client - if thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" { - // Skip thoughtSignature processing - it's internal encrypted data + hasThoughtSignature := thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" + hasContentPayload := partTextResult.Exists() || functionCallResult.Exists() || inlineDataResult.Exists() + + // Ignore encrypted thoughtSignature but keep any actual content in the same part. + if hasThoughtSignature && !hasContentPayload { continue } 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 73df7a7c..d4084ec6 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 @@ -105,14 +105,19 @@ func ConvertCliResponseToOpenAI(_ context.Context, _ string, originalRequestRawJ partTextResult := partResult.Get("text") functionCallResult := partResult.Get("functionCall") thoughtSignatureResult := partResult.Get("thoughtSignature") + if !thoughtSignatureResult.Exists() { + thoughtSignatureResult = partResult.Get("thought_signature") + } inlineDataResult := partResult.Get("inlineData") if !inlineDataResult.Exists() { inlineDataResult = partResult.Get("inline_data") } - // Handle thoughtSignature - this is encrypted reasoning content that should not be exposed to the client - if thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" { - // Skip thoughtSignature processing - it's internal encrypted data + hasThoughtSignature := thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" + hasContentPayload := partTextResult.Exists() || functionCallResult.Exists() || inlineDataResult.Exists() + + // Ignore encrypted thoughtSignature but keep any actual content in the same part. + if hasThoughtSignature && !hasContentPayload { continue } 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 24112f0f..4f0b01e7 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go @@ -116,8 +116,11 @@ func ConvertGeminiResponseToOpenAI(_ context.Context, _ string, originalRequestR thoughtSignatureResult = partResult.Get("thought_signature") } - // Skip thoughtSignature parts (encrypted reasoning not exposed downstream). - if thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" { + hasThoughtSignature := thoughtSignatureResult.Exists() && thoughtSignatureResult.String() != "" + hasContentPayload := partTextResult.Exists() || functionCallResult.Exists() || inlineDataResult.Exists() + + // Skip pure thoughtSignature parts but keep any actual payload in the same part. + if hasThoughtSignature && !hasContentPayload { continue }