diff --git a/internal/util/thinking.go b/internal/util/thinking.go index bcf92c5b..37200980 100644 --- a/internal/util/thinking.go +++ b/internal/util/thinking.go @@ -113,45 +113,3 @@ func defaultReasoningLevel(levels []string) string { } return "" } - -// standardReasoningEfforts defines the canonical set of reasoning effort levels. -// This serves as the single source of truth for valid effort values. -var standardReasoningEfforts = []string{"none", "auto", "minimal", "low", "medium", "high", "xhigh"} - -// IsValidReasoningEffort checks if the given effort string is a valid reasoning effort level. -// This is a registry-independent check against the standard effort levels. -func IsValidReasoningEffort(effort string) bool { - if effort == "" { - return false - } - lowered := strings.ToLower(strings.TrimSpace(effort)) - for _, e := range standardReasoningEfforts { - if e == lowered { - return true - } - } - return false -} - -// NormalizeReasoningEffort normalizes a reasoning effort string to its canonical form. -// It first tries registry-based normalization if a model is provided, then falls back -// to the standard effort levels. Returns empty string and false if invalid. -func NormalizeReasoningEffort(model, effort string) (string, bool) { - if effort == "" { - return "", false - } - lowered := strings.ToLower(strings.TrimSpace(effort)) - - if model != "" { - if normalized, ok := NormalizeReasoningEffortLevel(model, effort); ok { - return normalized, true - } - } - - for _, e := range standardReasoningEfforts { - if e == lowered { - return e, true - } - } - return "", false -} diff --git a/internal/util/thinking_suffix.go b/internal/util/thinking_suffix.go index 1a1a8715..c2d806ad 100644 --- a/internal/util/thinking_suffix.go +++ b/internal/util/thinking_suffix.go @@ -58,11 +58,14 @@ func NormalizeThinkingModel(modelName string) (string, map[string]any) { baseModel = modelName[:idx] budgetOverride = &parsed matched = true - } else if IsValidReasoningEffort(value) { + } else { baseModel = modelName[:idx] - effort := strings.ToLower(strings.TrimSpace(value)) - reasoningEffort = &effort - matched = true + if normalized, ok := NormalizeReasoningEffortLevel(baseModel, value); ok { + reasoningEffort = &normalized + matched = true + } else { + baseModel = modelName + } } } } else if strings.HasSuffix(lower, "-thinking") { @@ -186,9 +189,7 @@ func ReasoningEffortFromMetadata(metadata map[string]any) (string, bool) { return "", false } if effort != nil && *effort != "" { - if IsValidReasoningEffort(*effort) { - return strings.ToLower(strings.TrimSpace(*effort)), true - } + return strings.ToLower(strings.TrimSpace(*effort)), true } if budget != nil { switch *budget { @@ -210,9 +211,9 @@ func ThinkingEffortToBudget(model, effort string) (int, bool) { if effort == "" { return 0, false } - normalized, ok := NormalizeReasoningEffort(model, effort) + normalized, ok := NormalizeReasoningEffortLevel(model, effort) if !ok { - return 0, false + normalized = strings.ToLower(strings.TrimSpace(effort)) } switch normalized { case "none":