diff --git a/lib/crewai/src/crewai/llm.py b/lib/crewai/src/crewai/llm.py index e6604805d4..6c9c609119 100644 --- a/lib/crewai/src/crewai/llm.py +++ b/lib/crewai/src/crewai/llm.py @@ -573,7 +573,8 @@ def _matches_provider_pattern(cls, model: str, provider: str) -> bool: return True if provider == "dashscope": - return model_lower.startswith("qwen") + # DashScope's OpenAI-compatible endpoint serves Qwen plus DeepSeek/Kimi/GLM/etc. + return True if provider == "openrouter": # OpenRouter uses org/model format but accepts anything diff --git a/lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py b/lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py index d8747571ff..49106050ba 100644 --- a/lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py +++ b/lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py @@ -298,6 +298,20 @@ def test_llm_creates_openai_compatible_for_dashscope(self): assert isinstance(llm, OpenAICompatibleCompletion) assert llm.provider == "dashscope" + def test_llm_creates_openai_compatible_for_dashscope_non_qwen(self): + """Non-Qwen DashScope models must still use the native OpenAI-compatible path.""" + with patch.dict( + os.environ, + { + "DASHSCOPE_API_KEY": "test-key", + "DASHSCOPE_BASE_URL": "https://my-dashscope.example.com/v1", + }, + ): + llm = LLM(model="dashscope/deepseek-v3") + assert isinstance(llm, OpenAICompatibleCompletion) + assert llm.provider == "dashscope" + assert llm.base_url == "https://my-dashscope.example.com/v1" + def test_llm_with_explicit_provider(self): """Test LLM with explicit provider parameter.""" with patch.dict(os.environ, {"DEEPSEEK_API_KEY": "test-key"}):