From 21545c7d7ffb5451368ef7666304a00141c56995 Mon Sep 17 00:00:00 2001 From: chenchen Date: Mon, 18 May 2026 21:51:06 +0800 Subject: [PATCH] fix: use thinking.adaptive for Opus 4.7 in ReasoningEffort and Reasoning paths Opus 4.7 rejects thinking.type="enabled". The effort-suffix and -thinking suffix paths already handled this, but the ReasoningEffort and Reasoning parameter paths still sent "enabled". Now all paths use "adaptive" + output_config.effort for Opus 4.7. Co-Authored-By: Claude Opus 4.6 --- heicode/relay/channel/claude/relay-claude.go | 54 +++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/heicode/relay/channel/claude/relay-claude.go b/heicode/relay/channel/claude/relay-claude.go index f7fb130..4f335cb 100644 --- a/heicode/relay/channel/claude/relay-claude.go +++ b/heicode/relay/channel/claude/relay-claude.go @@ -204,22 +204,32 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe } } + isOpus47 := strings.HasPrefix(claudeRequest.Model, "claude-opus-4-7") + if textRequest.ReasoningEffort != "" { - switch textRequest.ReasoningEffort { - case "low": - claudeRequest.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: common.GetPointer[int](1280), - } - case "medium": - claudeRequest.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: common.GetPointer[int](2048), - } - case "high": - claudeRequest.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: common.GetPointer[int](4096), + if isOpus47 { + claudeRequest.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"} + claudeRequest.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, textRequest.ReasoningEffort)) + claudeRequest.Temperature = nil + claudeRequest.TopP = nil + claudeRequest.TopK = nil + } else { + switch textRequest.ReasoningEffort { + case "low": + claudeRequest.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: common.GetPointer[int](1280), + } + case "medium": + claudeRequest.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: common.GetPointer[int](2048), + } + case "high": + claudeRequest.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: common.GetPointer[int](4096), + } } } } @@ -233,9 +243,17 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe budgetTokens := reasoning.MaxTokens if budgetTokens > 0 { - claudeRequest.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: &budgetTokens, + if isOpus47 { + claudeRequest.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"} + claudeRequest.OutputConfig = json.RawMessage(`{"effort":"high"}`) + claudeRequest.Temperature = nil + claudeRequest.TopP = nil + claudeRequest.TopK = nil + } else { + claudeRequest.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: &budgetTokens, + } } } }