From d9fe103c89df5e7150cd46864d0f83278976861e Mon Sep 17 00:00:00 2001 From: caigee-cmd <210803857+caigee-cmd@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:24:47 +0800 Subject: [PATCH] fix(workbuddy): keep advertised max reasoning effort Fixes #321 --- changelog/unreleased/workbuddy-max-effort.md | 7 +++++++ internal/providers/workbuddy/mapping.go | 3 --- internal/providers/workbuddy/mapping_test.go | 22 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 changelog/unreleased/workbuddy-max-effort.md diff --git a/changelog/unreleased/workbuddy-max-effort.md b/changelog/unreleased/workbuddy-max-effort.md new file mode 100644 index 00000000..fbc95ed6 --- /dev/null +++ b/changelog/unreleased/workbuddy-max-effort.md @@ -0,0 +1,7 @@ +### English + +- WorkBuddy no longer silently downgrades `max` reasoning effort to `xhigh` when the model catalog advertises `max`. + +### 中文 + +- WorkBuddy 在模型目录声明支持 `max` 时,不再把 `max` 推理档位静默降级为 `xhigh`。 diff --git a/internal/providers/workbuddy/mapping.go b/internal/providers/workbuddy/mapping.go index 7fa6db76..31187544 100644 --- a/internal/providers/workbuddy/mapping.go +++ b/internal/providers/workbuddy/mapping.go @@ -88,9 +88,6 @@ func applyChatReasoning(obj map[string]any, req translate.ChatRequest, storedLev return "" } } - if level == "max" { - level = "xhigh" - } if usesTopLevelReasoningFields(req.Model) { delete(obj, "reasoning") obj["reasoning_effort"] = level diff --git a/internal/providers/workbuddy/mapping_test.go b/internal/providers/workbuddy/mapping_test.go index 42eaa9af..9a183614 100644 --- a/internal/providers/workbuddy/mapping_test.go +++ b/internal/providers/workbuddy/mapping_test.go @@ -61,3 +61,25 @@ func TestApplyChatReasoningDeepseekUsesCatalogDefault(t *testing.T) { t.Fatalf("default effort=%v", obj["reasoning_effort"]) } } + +// Regression for #321: a catalog that advertises "max" receives "max" +// upstream instead of a silent downgrade to "xhigh". +func TestApplyChatReasoningKeepsAdvertisedMax(t *testing.T) { + caps := providers.ModelCapabilities{ + ReasoningOptions: []string{"low", "high", "max"}, + ReasoningDefault: "max", + } + obj := map[string]any{} + if got := applyChatReasoning(obj, translate.ChatRequest{Model: "glm-5.3", ReasoningEffort: json.RawMessage(`"max"`)}, "", caps); got != "max" { + t.Fatalf("resolved level=%q", got) + } + reasoning, _ := obj["reasoning"].(map[string]any) + if reasoning["effort"] != "max" { + t.Fatalf("reasoning=%v", obj["reasoning"]) + } + obj = map[string]any{} + applyChatReasoning(obj, translate.ChatRequest{Model: "deepseek-v4-pro", ReasoningEffort: json.RawMessage(`"max"`)}, "", caps) + if obj["reasoning_effort"] != "max" { + t.Fatalf("top-level reasoning_effort=%v", obj["reasoning_effort"]) + } +}