|
@@ -154,33 +154,52 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(textRequest.Model); ok && effortLevel != "" &&
|
|
if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(textRequest.Model); ok && effortLevel != "" &&
|
|
|
- strings.HasPrefix(textRequest.Model, "claude-opus-4-6") {
|
|
|
|
|
|
|
+ (strings.HasPrefix(textRequest.Model, "claude-opus-4-6") || strings.HasPrefix(textRequest.Model, "claude-opus-4-7")) {
|
|
|
claudeRequest.Model = baseModel
|
|
claudeRequest.Model = baseModel
|
|
|
claudeRequest.Thinking = &dto.Thinking{
|
|
claudeRequest.Thinking = &dto.Thinking{
|
|
|
Type: "adaptive",
|
|
Type: "adaptive",
|
|
|
}
|
|
}
|
|
|
claudeRequest.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel))
|
|
claudeRequest.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel))
|
|
|
- claudeRequest.TopP = nil
|
|
|
|
|
- claudeRequest.Temperature = common.GetPointer[float64](1.0)
|
|
|
|
|
|
|
+ if strings.HasPrefix(baseModel, "claude-opus-4-7") {
|
|
|
|
|
+ // Opus 4.7 rejects non-default temperature/top_p/top_k with 400
|
|
|
|
|
+ // and defaults display to "omitted"; restore the 4.6 visible summary.
|
|
|
|
|
+ claudeRequest.Thinking.Display = "summarized"
|
|
|
|
|
+ claudeRequest.Temperature = nil
|
|
|
|
|
+ claudeRequest.TopP = nil
|
|
|
|
|
+ claudeRequest.TopK = nil
|
|
|
|
|
+ } else {
|
|
|
|
|
+ claudeRequest.TopP = nil
|
|
|
|
|
+ claudeRequest.Temperature = common.GetPointer[float64](1.0)
|
|
|
|
|
+ }
|
|
|
} else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
|
|
} else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
|
|
|
strings.HasSuffix(textRequest.Model, "-thinking") {
|
|
strings.HasSuffix(textRequest.Model, "-thinking") {
|
|
|
|
|
|
|
|
- // 因为BudgetTokens 必须大于1024
|
|
|
|
|
- if claudeRequest.MaxTokens == nil || *claudeRequest.MaxTokens < 1280 {
|
|
|
|
|
- claudeRequest.MaxTokens = common.GetPointer[uint](1280)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ trimmedModel := strings.TrimSuffix(textRequest.Model, "-thinking")
|
|
|
|
|
+ if strings.HasPrefix(trimmedModel, "claude-opus-4-7") {
|
|
|
|
|
+ // Opus 4.7 rejects thinking.type="enabled"; use adaptive at high effort.
|
|
|
|
|
+ claudeRequest.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"}
|
|
|
|
|
+ claudeRequest.OutputConfig = json.RawMessage(`{"effort":"high"}`)
|
|
|
|
|
+ claudeRequest.Temperature = nil
|
|
|
|
|
+ claudeRequest.TopP = nil
|
|
|
|
|
+ claudeRequest.TopK = nil
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 因为BudgetTokens 必须大于1024
|
|
|
|
|
+ if claudeRequest.MaxTokens == nil || *claudeRequest.MaxTokens < 1280 {
|
|
|
|
|
+ claudeRequest.MaxTokens = common.GetPointer[uint](1280)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // BudgetTokens 为 max_tokens 的 80%
|
|
|
|
|
- claudeRequest.Thinking = &dto.Thinking{
|
|
|
|
|
- Type: "enabled",
|
|
|
|
|
- BudgetTokens: common.GetPointer[int](int(float64(*claudeRequest.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)),
|
|
|
|
|
|
|
+ // BudgetTokens 为 max_tokens 的 80%
|
|
|
|
|
+ claudeRequest.Thinking = &dto.Thinking{
|
|
|
|
|
+ Type: "enabled",
|
|
|
|
|
+ BudgetTokens: common.GetPointer[int](int(float64(*claudeRequest.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)),
|
|
|
|
|
+ }
|
|
|
|
|
+ // TODO: 临时处理
|
|
|
|
|
+ // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking
|
|
|
|
|
+ claudeRequest.TopP = nil
|
|
|
|
|
+ claudeRequest.Temperature = common.GetPointer[float64](1.0)
|
|
|
}
|
|
}
|
|
|
- // TODO: 临时处理
|
|
|
|
|
- // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking
|
|
|
|
|
- claudeRequest.TopP = nil
|
|
|
|
|
- claudeRequest.Temperature = common.GetPointer[float64](1.0)
|
|
|
|
|
if !model_setting.ShouldPreserveThinkingSuffix(textRequest.Model) {
|
|
if !model_setting.ShouldPreserveThinkingSuffix(textRequest.Model) {
|
|
|
- claudeRequest.Model = strings.TrimSuffix(textRequest.Model, "-thinking")
|
|
|
|
|
|
|
+ claudeRequest.Model = trimmedModel
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|