diff --git a/rag/advanced_rag/knowlege_compile/_common.py b/rag/advanced_rag/knowlege_compile/_common.py index 1fceea9408..f426b61071 100644 --- a/rag/advanced_rag/knowlege_compile/_common.py +++ b/rag/advanced_rag/knowlege_compile/_common.py @@ -63,7 +63,9 @@ def knowledge_compile_gen_conf(chat_mdl, gen_conf: Optional[dict] = None) -> dic conf["extra_body"] = extra_body elif "qwen3" in model_name: # chat_model.py maps this flag to the provider-specific request body. - conf["enable_thinking"] = False + # -preview variants (e.g. qwen3.8-max-preview) only accept + # enable_thinking=True on their API endpoint. + conf["enable_thinking"] = True if "-preview" in model_name else False else: # LiteLLM maps this common control for providers that support it and # drops it for providers that do not. Keep model-specific overrides diff --git a/rag/llm/chat_model.py b/rag/llm/chat_model.py index c3a917528d..d4015e1673 100644 --- a/rag/llm/chat_model.py +++ b/rag/llm/chat_model.py @@ -151,7 +151,12 @@ def _apply_model_family_policies( # Qwen3 keeps RAGFlow's system default of disabling thinking unless explicitly overridden. if "qwen3" in model_name_lower: _pop_thinking_controls() - enable_thinking = thinking_type == "enabled" if thinking_type else False + # -preview variants (e.g. qwen3.8-max-preview) only accept + # enable_thinking=True; the API rejects any other value. + if "-preview" in model_name_lower: + enable_thinking = True + else: + enable_thinking = thinking_type == "enabled" if thinking_type else False if backend == "litellm" and provider in { SupportedLiteLLMProvider.Tongyi_Qianwen, SupportedLiteLLMProvider.Dashscope, diff --git a/test/unit_test/rag/llm/test_chat_model_thinking_policy.py b/test/unit_test/rag/llm/test_chat_model_thinking_policy.py index cc9ce65351..ae512abcee 100644 --- a/test/unit_test/rag/llm/test_chat_model_thinking_policy.py +++ b/test/unit_test/rag/llm/test_chat_model_thinking_policy.py @@ -46,6 +46,33 @@ def test_qwen3_can_enable_thinking_explicitly(): assert kwargs["extra_body"] == {"seed": 1, "enable_thinking": True} +def test_qwen3_preview_variant_forces_thinking_true(): + """qwen3.x-preview models (e.g. qwen3.8-max-preview) only accept enable_thinking=True.""" + gen_conf, kwargs = _apply_model_family_policies( + "qwen3.8-max-preview", + backend="base", + gen_conf={}, + request_kwargs={}, + ) + + assert gen_conf == {} + assert kwargs["extra_body"]["enable_thinking"] is True + + +def test_qwen3_preview_ignores_disabled_thinking(): + """Even with thinking=disabled, -preview still forces enable_thinking=True.""" + gen_conf, kwargs = _apply_model_family_policies( + "qwen3.8-max-preview", + backend="base", + gen_conf={"thinking": "disabled", "temperature": 0.2}, + request_kwargs={}, + ) + + assert "thinking" not in gen_conf + assert gen_conf == {"temperature": 0.2} + assert kwargs["extra_body"]["enable_thinking"] is True + + @pytest.mark.parametrize( "provider", [SupportedLiteLLMProvider.Tongyi_Qianwen, SupportedLiteLLMProvider.Dashscope],