From e2c5f0351f508d7a556cad4554cbcd4cb954858d Mon Sep 17 00:00:00 2001 From: ice789ice <146094571+ice789ice@users.noreply.github.com> Date: Sun, 13 Sep 2026 22:58:12 +0800 Subject: [PATCH] [fix] handle OpenAI thinking parameter compatibility --- backend/app/services/llm/resolver.py | 12 +++++++++--- backend/app/services/llm/runtime.py | 12 +++++++++--- backend/tests/test_llm_resolver.py | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/backend/app/services/llm/resolver.py b/backend/app/services/llm/resolver.py index a0792ac0..d908e7e5 100644 --- a/backend/app/services/llm/resolver.py +++ b/backend/app/services/llm/resolver.py @@ -10,6 +10,7 @@ from app.models.llm import Model, ModelCategoryKey, ModelSettings, Provider from app.services.common import entity_not_found from app.services.llm.provider_resolver import resolve_effective_base_url +from app.services.llm.provider_registry import resolve_provider_key_from_name def _settings_model_id(settings_row: ModelSettings | None, category: ModelCategoryKey) -> str | None: @@ -178,8 +179,13 @@ def _build_chat_openai_model( kwargs.setdefault("base_url", base_url) if not thinking: - extra_body = dict(kwargs.get("extra_body") or {}) - extra_body["enable_thinking"] = False - kwargs["extra_body"] = extra_body + provider_key = resolve_provider_key_from_name(provider.name) + + if provider_key == "openai": + kwargs.setdefault("reasoning_effort", "none") + else: + extra_body = dict(kwargs.get("extra_body") or {}) + extra_body["enable_thinking"] = False + kwargs["extra_body"] = extra_body return ChatOpenAI(**kwargs) diff --git a/backend/app/services/llm/runtime.py b/backend/app/services/llm/runtime.py index 9bbb2116..04b798c0 100644 --- a/backend/app/services/llm/runtime.py +++ b/backend/app/services/llm/runtime.py @@ -10,6 +10,7 @@ from app.models.llm import Model, ModelCategoryKey, ModelSettings, Provider from app.services.llm.provider_resolver import resolve_effective_base_url +from app.services.llm.provider_registry import resolve_provider_key_from_name def _default_model_id(settings_row: ModelSettings | None, category: ModelCategoryKey) -> str | None: @@ -69,8 +70,13 @@ def build_default_text_llm_sync( kwargs.setdefault("base_url", base_url) if not thinking: - extra_body = dict(kwargs.get("extra_body") or {}) - extra_body["enable_thinking"] = False - kwargs["extra_body"] = extra_body + provider_key = resolve_provider_key_from_name(provider.name) + + if provider_key == "openai": + kwargs.setdefault("reasoning_effort", "none") + else: + extra_body = dict(kwargs.get("extra_body") or {}) + extra_body["enable_thinking"] = False + kwargs["extra_body"] = extra_body return ChatOpenAI(**kwargs) diff --git a/backend/tests/test_llm_resolver.py b/backend/tests/test_llm_resolver.py index a163a5e5..761e16cc 100644 --- a/backend/tests/test_llm_resolver.py +++ b/backend/tests/test_llm_resolver.py @@ -202,8 +202,10 @@ def __init__(self, **kwargs): # noqa: ANN003, ANN204 assert isinstance(thinking_llm, FakeChatOpenAI) assert "extra_body" not in thinking_llm.kwargs + assert isinstance(nothinking_llm, FakeChatOpenAI) - assert nothinking_llm.kwargs["extra_body"]["enable_thinking"] is False + assert nothinking_llm.kwargs["reasoning_effort"] == "none" + assert "extra_body" not in nothinking_llm.kwargs await engine.dispose() @@ -229,4 +231,3 @@ def test_resolve_effective_base_url_prefers_category_specific_url() -> None: resolve_effective_base_url(provider=provider, category=ModelCategoryKey.video) == "https://video-gateway.example/v1" ) -