File size: 2,189 Bytes
8d3471e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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 ""
}