From ac064389cad10ecf74968e1db61f0699b8dcc42d Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 23 Nov 2025 11:32:37 +0800 Subject: [PATCH] **feat(executor, translator): enhance token handling and payload processing** - Improved Antigravity executor to handle `thinkingConfig` adjustments and default `thinkingBudget` when `thinkingLevel` is removed. - Updated translator response handling to set default values for output token counts when specific token data is missing. --- internal/runtime/executor/antigravity_executor.go | 9 +++++++++ .../openai/responses/gemini_openai-responses_response.go | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/internal/runtime/executor/antigravity_executor.go b/internal/runtime/executor/antigravity_executor.go index 0fa664d6..c41d8d0e 100644 --- a/internal/runtime/executor/antigravity_executor.go +++ b/internal/runtime/executor/antigravity_executor.go @@ -544,12 +544,21 @@ func geminiToAntigravity(modelName string, payload []byte) []byte { template, _ = sjson.Delete(template, "request.safetySettings") template, _ = sjson.Set(template, "request.toolConfig.functionCallingConfig.mode", "VALIDATED") + template, _ = sjson.Delete(template, "request.generationConfig.maxOutputTokens") + if !strings.HasPrefix(modelName, "gemini-3-") { + if thinkingLevel := gjson.Get(template, "request.generationConfig.thinkingConfig.thinkingLevel"); thinkingLevel.Exists() { + template, _ = sjson.Delete(template, "request.generationConfig.thinkingConfig.thinkingLevel") + template, _ = sjson.Set(template, "request.generationConfig.thinkingConfig.thinkingBudget", -1) + } + } gjson.Get(template, "request.contents").ForEach(func(key, content gjson.Result) bool { if content.Get("role").String() == "model" { content.Get("parts").ForEach(func(partKey, part gjson.Result) bool { if part.Get("functionCall").Exists() { template, _ = sjson.Set(template, fmt.Sprintf("request.contents.%d.parts.%d.thoughtSignature", key.Int(), partKey.Int()), "skip_thought_signature_validator") + } else if part.Get("thoughtSignature").Exists() { + template, _ = sjson.Set(template, fmt.Sprintf("request.contents.%d.parts.%d.thoughtSignature", key.Int(), partKey.Int()), "skip_thought_signature_validator") } return true }) diff --git a/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go b/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go index ff77e4da..ce221863 100644 --- a/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go +++ b/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go @@ -433,12 +433,18 @@ func ConvertGeminiResponseToOpenAIResponses(_ context.Context, modelName string, // output tokens if v := um.Get("candidatesTokenCount"); v.Exists() { completed, _ = sjson.Set(completed, "response.usage.output_tokens", v.Int()) + } else { + completed, _ = sjson.Set(completed, "response.usage.output_tokens", 0) } if v := um.Get("thoughtsTokenCount"); v.Exists() { completed, _ = sjson.Set(completed, "response.usage.output_tokens_details.reasoning_tokens", v.Int()) + } else { + completed, _ = sjson.Set(completed, "response.usage.output_tokens_details.reasoning_tokens", 0) } if v := um.Get("totalTokenCount"); v.Exists() { completed, _ = sjson.Set(completed, "response.usage.total_tokens", v.Int()) + } else { + completed, _ = sjson.Set(completed, "response.usage.total_tokens", 0) } }