From f69a33794b6e7a612e546d73223c5f85fd88c8ce Mon Sep 17 00:00:00 2001 From: huanshan5195 Date: Fri, 3 Jul 2026 16:22:47 +0800 Subject: [PATCH] fix: forward reasoning_effort for custom providers (GLM-5.2 on ARK) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 'max' to VALID_REASONING_EFFORTS (GLM-5.2 native parameter) - Emit top-level reasoning_effort string for custom providers - Stop hardcoding 'medium' in legacy extra_body.reasoning, use actual effort Custom providers (e.g. GLM-5.2 on Volcengine ARK) silently dropped reasoning_effort — the value never reached the upstream API. Kimi, TokenHub, and LM Studio all had dedicated branches for this, but custom providers had none. --- agent/transports/chat_completions.py | 21 ++++++++++++++++++++- hermes_constants.py | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/agent/transports/chat_completions.py b/agent/transports/chat_completions.py index 878045da66d..9eac7a659e6 100644 --- a/agent/transports/chat_completions.py +++ b/agent/transports/chat_completions.py @@ -377,6 +377,22 @@ class ChatCompletionsTransport(ProviderTransport): if _lm_effort is not None: api_kwargs["reasoning_effort"] = _lm_effort + # Custom provider (e.g. GLM-5.2 on ARK): send top-level reasoning_effort + # string so the upstream API receives its native parameter format. + if params.get("is_custom_provider", False): + _custom_thinking_off = bool( + reasoning_config + and isinstance(reasoning_config, dict) + and reasoning_config.get("enabled") is False + ) + if not _custom_thinking_off: + _custom_effort = "medium" + if reasoning_config and isinstance(reasoning_config, dict): + _custom_effort = ( + reasoning_config.get("effort", "medium") or "medium" + ) + api_kwargs["reasoning_effort"] = _custom_effort + # extra_body assembly extra_body: dict[str, Any] = {} @@ -423,7 +439,10 @@ class ChatCompletionsTransport(ProviderTransport): if gh_reasoning is not None: extra_body["reasoning"] = gh_reasoning else: - extra_body["reasoning"] = {"enabled": True, "effort": "medium"} + _effort = "medium" + if reasoning_config and isinstance(reasoning_config, dict): + _effort = reasoning_config.get("effort", "medium") or "medium" + extra_body["reasoning"] = {"enabled": True, "effort": _effort} if provider_name == "gemini": raw_thinking_config = _build_gemini_thinking_config(model, reasoning_config) diff --git a/hermes_constants.py b/hermes_constants.py index c0f4d48e172..64331299345 100644 --- a/hermes_constants.py +++ b/hermes_constants.py @@ -791,7 +791,7 @@ def apply_subprocess_home_env(env: dict[str, str]) -> None: env["HOME"] = home -VALID_REASONING_EFFORTS = ("minimal", "low", "medium", "high", "xhigh") +VALID_REASONING_EFFORTS = ("minimal", "low", "medium", "high", "xhigh", "max") def parse_reasoning_effort(effort) -> dict | None: