Merge pull request #5815 from 771373073/fix/grok46-xhigh

fix(grok): preserve xhigh effort for grok-4.6
This commit is contained in:
Wesley Liddick
2026-08-19 16:42:52 +08:00
committed by GitHub
2 changed files with 29 additions and 13 deletions
@@ -558,7 +558,7 @@ func normalizeGrokResponsesReasoningEffort(body []byte, upstreamModel string) ([
if !value.Exists() {
continue
}
normalized, keep := normalizeGrokReasoningEffortValue(value.String())
normalized, keep := normalizeGrokReasoningEffortValue(value.String(), upstreamModel)
if !supportsEffort || !keep {
out, err = sjson.DeleteBytes(out, field)
} else {
@@ -569,7 +569,7 @@ func normalizeGrokResponsesReasoningEffort(body []byte, upstreamModel string) ([
}
}
if camel := gjson.GetBytes(out, "reasoningEffort"); camel.Exists() {
normalized, keep := normalizeGrokReasoningEffortValue(camel.String())
normalized, keep := normalizeGrokReasoningEffortValue(camel.String(), upstreamModel)
out, err = sjson.DeleteBytes(out, "reasoningEffort")
if err != nil {
return nil, fmt.Errorf("remove Grok reasoningEffort: %w", err)
@@ -595,7 +595,7 @@ func normalizeGrokChatReasoningEffort(body []byte, upstreamModel string) ([]byte
if raw == "" {
raw = strings.TrimSpace(gjson.GetBytes(body, "reasoningEffort").String())
}
normalized, keep := normalizeGrokReasoningEffortValue(raw)
normalized, keep := normalizeGrokReasoningEffortValue(raw, upstreamModel)
keep = keep && grokSupportsReasoningEffort(upstreamModel)
out := body
var err error
@@ -615,20 +615,30 @@ func normalizeGrokChatReasoningEffort(body []byte, upstreamModel string) ([]byte
return out, err
}
func normalizeGrokReasoningEffortValue(raw string) (string, bool) {
func normalizeGrokReasoningEffortValue(raw, model string) (string, bool) {
value := strings.NewReplacer("-", "", "_", "", " ", "").Replace(strings.ToLower(strings.TrimSpace(raw)))
switch value {
case "none", "low", "medium", "high":
return value, true
case "minimal":
return "low", true
case "xhigh", "extrahigh", "max", "ultra":
case "xhigh", "extrahigh":
if grokSupportsXHighReasoningEffort(model) {
return "xhigh", true
}
return "high", true
case "max", "ultra":
return "high", true
default:
return "", false
}
}
func grokSupportsXHighReasoningEffort(model string) bool {
model = strings.ToLower(xai.StripGrokProviderPrefix(strings.TrimSpace(model)))
return model == "grok-4.6" || model == "grok-4.6-latest"
}
func grokSupportsReasoningEffort(model string) bool {
model = strings.ToLower(xai.StripGrokProviderPrefix(strings.TrimSpace(model)))
switch model {
@@ -157,18 +157,20 @@ func TestPatchGrokResponsesBodyNormalizesReasoningEffortAliases(t *testing.T) {
t.Parallel()
tests := []struct {
name string
body string
path string
want string
name string
body string
upstreamModel string
path string
want string
}{
{name: "minimal nested", body: `{"input":"hi","reasoning":{"effort":"minimal"}}`, path: "reasoning.effort", want: "low"},
{name: "xhigh snake", body: `{"input":"hi","reasoning_effort":"xhigh"}`, path: "reasoning_effort", want: "high"},
{name: "max camel", body: `{"input":"hi","reasoningEffort":"max"}`, path: "reasoning_effort", want: "high"},
{name: "minimal nested", body: `{"input":"hi","reasoning":{"effort":"minimal"}}`, upstreamModel: "grok-4.5", path: "reasoning.effort", want: "low"},
{name: "xhigh stays high for 4.5", body: `{"input":"hi","reasoning_effort":"xhigh"}`, upstreamModel: "grok-4.5", path: "reasoning_effort", want: "high"},
{name: "xhigh nested for 4.6", body: `{"input":"hi","reasoning":{"effort":"xhigh"}}`, upstreamModel: "grok-4.6", path: "reasoning.effort", want: "xhigh"},
{name: "xhigh snake for 4.6 latest", body: `{"input":"hi","reasoning_effort":"xhigh"}`, upstreamModel: "grok-4.6-latest", path: "reasoning_effort", want: "xhigh"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
patched, err := patchGrokResponsesBody([]byte(tt.body), "grok-4.5")
patched, err := patchGrokResponsesBody([]byte(tt.body), tt.upstreamModel)
require.NoError(t, err)
require.Equal(t, tt.want, gjson.GetBytes(patched, tt.path).String(), string(patched))
require.False(t, gjson.GetBytes(patched, "reasoningEffort").Exists())
@@ -194,6 +196,10 @@ func TestNormalizeGrokChatReasoningEffort(t *testing.T) {
require.Equal(t, "high", gjson.GetBytes(patched, "reasoning_effort").String())
require.False(t, gjson.GetBytes(patched, "reasoningEffort").Exists())
patched, err = normalizeGrokChatReasoningEffort([]byte(`{"reasoning_effort":"xhigh"}`), "grok-4.6")
require.NoError(t, err)
require.Equal(t, "xhigh", gjson.GetBytes(patched, "reasoning_effort").String())
patched, err = normalizeGrokChatReasoningEffort([]byte(`{"reasoning_effort":"high"}`), "grok-composer-2.5-fast")
require.NoError(t, err)
require.False(t, gjson.GetBytes(patched, "reasoning_effort").Exists())