package util import "strings" func ResolveThinkingEnabled(req map[string]any, defaultEnabled bool) bool { if enabled, ok := ResolveThinkingOverride(req); ok { return enabled } return defaultEnabled } func ResolveThinkingOverride(req map[string]any) (bool, bool) { if req == nil { return false, false } if enabled, ok := parseThinkingSetting(req["thinking"]); ok { return enabled, true } if enabled, ok := parseReasoningSetting(req["reasoning"]); ok { return enabled, true } if extraBody, ok := req["extra_body"].(map[string]any); ok { if enabled, ok := parseThinkingSetting(extraBody["thinking"]); ok { return enabled, true } if enabled, ok := parseReasoningSetting(extraBody["reasoning"]); ok { return enabled, true } if enabled, ok := parseReasoningEffort(extraBody["reasoning_effort"]); ok { return enabled, true } } if enabled, ok := parseReasoningEffort(req["reasoning_effort"]); ok { return enabled, true } return false, false } func parseThinkingSetting(raw any) (bool, bool) { switch v := raw.(type) { case bool: return v, true case string: switch strings.ToLower(strings.TrimSpace(v)) { case "enabled", "enable", "on", "true": return true, true case "disabled", "disable", "off", "false", "none": return false, true default: return false, false } case map[string]any: if typ, ok := v["type"]; ok { return parseThinkingSetting(typ) } } return false, false } func parseReasoningSetting(raw any) (bool, bool) { switch v := raw.(type) { case bool: return v, true case string: return parseReasoningEffort(v) case map[string]any: for _, key := range []string{"effort", "type", "enabled"} { if enabled, ok := parseReasoningSetting(v[key]); ok { return enabled, true } } } return false, false } func parseReasoningEffort(raw any) (bool, bool) { switch strings.ToLower(strings.TrimSpace(toString(raw))) { case "minimal", "low", "medium", "high", "xhigh": return true, true case "none", "disabled", "disable", "off", "false": return false, true default: return false, false } } func toString(raw any) string { if s, ok := raw.(string); ok { return s } return "" }