mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-14 05:05:09 +08:00
fix: align tool call protocol and thinking controls
This commit is contained in:
@@ -3,27 +3,48 @@ package util
|
||||
import "strings"
|
||||
|
||||
func ResolveThinkingEnabled(req map[string]any, defaultEnabled bool) bool {
|
||||
if enabled, ok := parseThinkingSetting(req["thinking"]); ok {
|
||||
return enabled
|
||||
}
|
||||
if extraBody, ok := req["extra_body"].(map[string]any); ok {
|
||||
if enabled, ok := parseThinkingSetting(extraBody["thinking"]); ok {
|
||||
return enabled
|
||||
}
|
||||
}
|
||||
if enabled, ok := parseReasoningEffort(req["reasoning_effort"]); ok {
|
||||
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":
|
||||
case "enabled", "enable", "on", "true":
|
||||
return true, true
|
||||
case "disabled":
|
||||
case "disabled", "disable", "off", "false", "none":
|
||||
return false, true
|
||||
default:
|
||||
return false, false
|
||||
@@ -36,10 +57,28 @@ func parseThinkingSetting(raw any) (bool, bool) {
|
||||
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 "low", "medium", "high", "xhigh":
|
||||
case "minimal", "low", "medium", "high", "xhigh":
|
||||
return true, true
|
||||
case "none", "disabled", "disable", "off", "false":
|
||||
return false, true
|
||||
default:
|
||||
return false, false
|
||||
}
|
||||
|
||||
@@ -27,13 +27,24 @@ func TestResolveThinkingEnabledUsesExtraBodyFallback(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestResolveThinkingEnabledMapsReasoningEffortToEnabled(t *testing.T) {
|
||||
for _, effort := range []string{"low", "medium", "high", "xhigh"} {
|
||||
for _, effort := range []string{"minimal", "low", "medium", "high", "xhigh"} {
|
||||
if got := ResolveThinkingEnabled(map[string]any{"reasoning_effort": effort}, false); !got {
|
||||
t.Fatalf("expected reasoning_effort=%s to enable thinking", effort)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveThinkingEnabledMapsReasoningObject(t *testing.T) {
|
||||
req := map[string]any{"reasoning": map[string]any{"effort": "none"}}
|
||||
if got := ResolveThinkingEnabled(req, true); got {
|
||||
t.Fatalf("expected reasoning.effort=none to disable thinking")
|
||||
}
|
||||
req = map[string]any{"reasoning": map[string]any{"effort": "medium"}}
|
||||
if got := ResolveThinkingEnabled(req, false); !got {
|
||||
t.Fatalf("expected reasoning.effort=medium to enable thinking")
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveThinkingEnabledDefaultsWhenUnset(t *testing.T) {
|
||||
if !ResolveThinkingEnabled(nil, true) {
|
||||
t.Fatal("expected default thinking=true when unset")
|
||||
|
||||
Reference in New Issue
Block a user