From 8de0885b7dff2e52318856be617650f97277383e Mon Sep 17 00:00:00 2001 From: margbug01 Date: Sun, 1 Mar 2026 00:54:17 +0800 Subject: [PATCH] fix: support thinking.type="auto" from Amp client for Antigravity Claude models ## Problem When using Antigravity Claude models through CLIProxyAPI, the thinking chain (reasoning content) does not display in the Amp client. ## Root Cause The Amp client sends `thinking: {"type": "auto"}` in its requests, but `ConvertClaudeRequestToAntigravity` only handled `"enabled"` and `"adaptive"` types in its switch statement. The `"auto"` type was silently ignored, resulting in no `thinkingConfig` being set in the translated Gemini request. Without `thinkingConfig`, the Antigravity API returns responses without any thinking content. Additionally, the Antigravity API for Claude models does not support `thinkingBudget: -1` (auto mode sentinel). It requires a concrete positive budget value. The fix uses 128000 as the budget for "auto" mode, which `ApplyThinking` will then normalize to stay within the model's actual limits (e.g., capped to `maxOutputTokens - 1`). ## Changes ### internal/translator/antigravity/claude/antigravity_claude_request.go 1. **Add "auto" case** to the thinking type switch statement. Sets `thinkingBudget: 128000` and `includeThoughts: true`. The budget is subsequently normalized by `ApplyThinking` based on model-specific limits. 2. **Add "auto" to hasThinking check** so that interleaved thinking hints are injected for tool-use scenarios when Amp sends `thinking.type="auto"`. ### internal/registry/model_definitions_static_data.go 3. **Add Thinking configuration** for `claude-sonnet-4-6`, `claude-sonnet-4-5`, and `claude-opus-4-6` in `GetAntigravityModelConfig()` -- these were previously missing, causing `ApplyThinking` to skip thinking config entirely. ## Testing - Deployed to Railway test instance (cpa-thinking-test) - Verified via debug logging that: - Amp sends `thinking: {"type": "auto"}` - CPA now translates this to `thinkingConfig: {thinkingBudget: 128000, includeThoughts: true}` - `ApplyThinking` normalizes the budget to model-specific limits - Antigravity API receives the correct thinkingConfig Amp-Thread-ID: https://ampcode.com/threads/T-019ca511-710d-776d-a07c-4b750f871a93 Co-authored-by: Amp --- internal/registry/model_definitions_static_data.go | 5 +++-- .../antigravity/claude/antigravity_claude_request.go | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/internal/registry/model_definitions_static_data.go b/internal/registry/model_definitions_static_data.go index b0e59092..2342f59e 100644 --- a/internal/registry/model_definitions_static_data.go +++ b/internal/registry/model_definitions_static_data.go @@ -958,8 +958,9 @@ func GetAntigravityModelConfig() map[string]*AntigravityModelConfig { "claude-sonnet-4-5-thinking": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, "claude-opus-4-5-thinking": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, "claude-opus-4-6-thinking": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, - "claude-sonnet-4-5": {MaxCompletionTokens: 64000}, - "claude-sonnet-4-6": {MaxCompletionTokens: 64000}, + "claude-opus-4-6": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 128000}, + "claude-sonnet-4-5": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, + "claude-sonnet-4-6": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, "claude-sonnet-4-6-thinking": {Thinking: &ThinkingSupport{Min: 1024, Max: 128000, ZeroAllowed: true, DynamicAllowed: true}, MaxCompletionTokens: 64000}, "gpt-oss-120b-medium": {}, "tab_flash_lite_preview": {}, diff --git a/internal/translator/antigravity/claude/antigravity_claude_request.go b/internal/translator/antigravity/claude/antigravity_claude_request.go index b634436d..a9939a3b 100644 --- a/internal/translator/antigravity/claude/antigravity_claude_request.go +++ b/internal/translator/antigravity/claude/antigravity_claude_request.go @@ -400,7 +400,7 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ hasTools := toolDeclCount > 0 thinkingResult := gjson.GetBytes(rawJSON, "thinking") thinkingType := thinkingResult.Get("type").String() - hasThinking := thinkingResult.Exists() && thinkingResult.IsObject() && (thinkingType == "enabled" || thinkingType == "adaptive") + hasThinking := thinkingResult.Exists() && thinkingResult.IsObject() && (thinkingType == "enabled" || thinkingType == "adaptive" || thinkingType == "auto") isClaudeThinking := util.IsClaudeThinkingModel(modelName) if hasTools && hasThinking && isClaudeThinking { @@ -440,6 +440,12 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ out, _ = sjson.Set(out, "request.generationConfig.thinkingConfig.thinkingBudget", budget) out, _ = sjson.Set(out, "request.generationConfig.thinkingConfig.includeThoughts", true) } + case "auto": + // Amp sends thinking.type="auto" — use max budget from model config + // Antigravity API for Claude models requires a concrete positive budget, + // not -1. Use a high default that ApplyThinking will cap to model max. + out, _ = sjson.Set(out, "request.generationConfig.thinkingConfig.thinkingBudget", 128000) + out, _ = sjson.Set(out, "request.generationConfig.thinkingConfig.includeThoughts", true) case "adaptive": // Keep adaptive as a high level sentinel; ApplyThinking resolves it // to model-specific max capability.