Merge branch 'router-for-me:main' into main

This commit is contained in:
Luis Pater
2025-12-12 22:09:08 +08:00
committed by GitHub
3 changed files with 37 additions and 15 deletions
@@ -54,13 +54,14 @@ func (e *OpenAICompatExecutor) Execute(ctx context.Context, auth *cliproxyauth.A
from := opts.SourceFormat from := opts.SourceFormat
to := sdktranslator.FromString("openai") to := sdktranslator.FromString("openai")
translated := sdktranslator.TranslateRequest(from, to, req.Model, bytes.Clone(req.Payload), opts.Stream) translated := sdktranslator.TranslateRequest(from, to, req.Model, bytes.Clone(req.Payload), opts.Stream)
if modelOverride := e.resolveUpstreamModel(req.Model, auth); modelOverride != "" { modelOverride := e.resolveUpstreamModel(req.Model, auth)
if modelOverride != "" {
translated = e.overrideModel(translated, modelOverride) translated = e.overrideModel(translated, modelOverride)
} }
translated = applyPayloadConfigWithRoot(e.cfg, req.Model, to.String(), "", translated) translated = applyPayloadConfigWithRoot(e.cfg, req.Model, to.String(), "", translated)
translated = applyReasoningEffortMetadata(translated, req.Metadata, req.Model, "reasoning_effort") translated = applyReasoningEffortMetadata(translated, req.Metadata, req.Model, "reasoning_effort")
upstreamModel := util.ResolveOriginalModel(req.Model, req.Metadata) upstreamModel := util.ResolveOriginalModel(req.Model, req.Metadata)
if upstreamModel != "" { if upstreamModel != "" && modelOverride == "" {
translated, _ = sjson.SetBytes(translated, "model", upstreamModel) translated, _ = sjson.SetBytes(translated, "model", upstreamModel)
} }
translated = normalizeThinkingConfig(translated, upstreamModel) translated = normalizeThinkingConfig(translated, upstreamModel)
@@ -148,13 +149,14 @@ func (e *OpenAICompatExecutor) ExecuteStream(ctx context.Context, auth *cliproxy
from := opts.SourceFormat from := opts.SourceFormat
to := sdktranslator.FromString("openai") to := sdktranslator.FromString("openai")
translated := sdktranslator.TranslateRequest(from, to, req.Model, bytes.Clone(req.Payload), true) translated := sdktranslator.TranslateRequest(from, to, req.Model, bytes.Clone(req.Payload), true)
if modelOverride := e.resolveUpstreamModel(req.Model, auth); modelOverride != "" { modelOverride := e.resolveUpstreamModel(req.Model, auth)
if modelOverride != "" {
translated = e.overrideModel(translated, modelOverride) translated = e.overrideModel(translated, modelOverride)
} }
translated = applyPayloadConfigWithRoot(e.cfg, req.Model, to.String(), "", translated) translated = applyPayloadConfigWithRoot(e.cfg, req.Model, to.String(), "", translated)
translated = applyReasoningEffortMetadata(translated, req.Metadata, req.Model, "reasoning_effort") translated = applyReasoningEffortMetadata(translated, req.Metadata, req.Model, "reasoning_effort")
upstreamModel := util.ResolveOriginalModel(req.Model, req.Metadata) upstreamModel := util.ResolveOriginalModel(req.Model, req.Metadata)
if upstreamModel != "" { if upstreamModel != "" && modelOverride == "" {
translated, _ = sjson.SetBytes(translated, "model", upstreamModel) translated, _ = sjson.SetBytes(translated, "model", upstreamModel)
} }
translated = normalizeThinkingConfig(translated, upstreamModel) translated = normalizeThinkingConfig(translated, upstreamModel)
+9 -2
View File
@@ -52,10 +52,14 @@ func applyReasoningEffortMetadata(payload []byte, metadata map[string]any, model
if len(metadata) == 0 { if len(metadata) == 0 {
return payload return payload
} }
if !util.ModelSupportsThinking(model) { if field == "" {
return payload return payload
} }
if field == "" { baseModel := util.ResolveOriginalModel(model, metadata)
if baseModel == "" {
baseModel = model
}
if !util.ModelSupportsThinking(baseModel) && !util.IsOpenAICompatibilityModel(baseModel) {
return payload return payload
} }
if effort, ok := util.ReasoningEffortFromMetadata(metadata); ok && effort != "" { if effort, ok := util.ReasoningEffortFromMetadata(metadata); ok && effort != "" {
@@ -226,6 +230,9 @@ func normalizeThinkingConfig(payload []byte, model string) []byte {
} }
if !util.ModelSupportsThinking(model) { if !util.ModelSupportsThinking(model) {
if util.IsOpenAICompatibilityModel(model) {
return payload
}
return stripThinkingFields(payload) return stripThinkingFields(payload)
} }
+22 -9
View File
@@ -25,33 +25,33 @@ func ModelSupportsThinking(model string) bool {
// or min (0 if zero is allowed and mid <= 0). // or min (0 if zero is allowed and mid <= 0).
func NormalizeThinkingBudget(model string, budget int) int { func NormalizeThinkingBudget(model string, budget int) int {
if budget == -1 { // dynamic if budget == -1 { // dynamic
if found, min, max, zeroAllowed, dynamicAllowed := thinkingRangeFromRegistry(model); found { if found, minBudget, maxBudget, zeroAllowed, dynamicAllowed := thinkingRangeFromRegistry(model); found {
if dynamicAllowed { if dynamicAllowed {
return -1 return -1
} }
mid := (min + max) / 2 mid := (minBudget + maxBudget) / 2
if mid <= 0 && zeroAllowed { if mid <= 0 && zeroAllowed {
return 0 return 0
} }
if mid <= 0 { if mid <= 0 {
return min return minBudget
} }
return mid return mid
} }
return -1 return -1
} }
if found, min, max, zeroAllowed, _ := thinkingRangeFromRegistry(model); found { if found, minBudget, maxBudget, zeroAllowed, _ := thinkingRangeFromRegistry(model); found {
if budget == 0 { if budget == 0 {
if zeroAllowed { if zeroAllowed {
return 0 return 0
} }
return min return minBudget
} }
if budget < min { if budget < minBudget {
return min return minBudget
} }
if budget > max { if budget > maxBudget {
return max return maxBudget
} }
return budget return budget
} }
@@ -105,3 +105,16 @@ func NormalizeReasoningEffortLevel(model, effort string) (string, bool) {
} }
return "", false return "", false
} }
// IsOpenAICompatibilityModel reports whether the model is registered as an OpenAI-compatibility model.
// These models may not advertise Thinking metadata in the registry.
func IsOpenAICompatibilityModel(model string) bool {
if model == "" {
return false
}
info := registry.GetGlobalRegistry().GetModelInfo(model)
if info == nil {
return false
}
return strings.EqualFold(strings.TrimSpace(info.Type), "openai-compatibility")
}