diff --git a/heicode/relay/claude_handler.go b/heicode/relay/claude_handler.go index c1b2dd4..a29ba6f 100644 --- a/heicode/relay/claude_handler.go +++ b/heicode/relay/claude_handler.go @@ -103,6 +103,25 @@ func ClaudeHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *typ info.UpstreamModelName = request.Model } + // Opus 4.7 rejects thinking.type="enabled"; convert to adaptive. + if strings.HasPrefix(request.Model, "claude-opus-4-7") && request.Thinking != nil && request.Thinking.Type == "enabled" { + budgetTokens := 0 + if request.Thinking.BudgetTokens != nil { + budgetTokens = *request.Thinking.BudgetTokens + } + effortLevel := "high" + if budgetTokens > 0 && budgetTokens <= 1024 { + effortLevel = "low" + } else if budgetTokens > 0 && budgetTokens <= 8192 { + effortLevel = "medium" + } + request.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"} + request.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel)) + request.Temperature = nil + request.TopP = nil + request.TopK = nil + } + if info.ChannelSetting.SystemPrompt != "" { if request.System == nil { request.SetStringSystem(info.ChannelSetting.SystemPrompt)