From 8c0e7d235eec1f73e9378eace92a22e0744f45ca Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:18:44 +0000 Subject: [PATCH] Fix Deepseek-v3-250324 empty responses issue (#2657) Co-Authored-By: Joe Moura --- src/crewai/llm.py | 12 ++++++++++++ tests/llm_test.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/crewai/llm.py b/src/crewai/llm.py index 332582744..e4f062260 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -91,6 +91,7 @@ LLM_CONTEXT_WINDOW_SIZES = { "gemini-1.5-flash-8b": 1048576, # deepseek "deepseek-chat": 128000, + "deepseek-v3-250324": 128000, # groq "gemma2-9b-it": 8192, "gemma-7b-it": 8192, @@ -930,6 +931,17 @@ class LLM(BaseLLM): ) # Create a copy to avoid modifying the original messages.append({"role": "user", "content": "Please continue."}) return messages + + # Handle Deepseek-v3-250324 model - it also requires the last message to have a role of 'user' + if "deepseek-v3-250324" in self.model.lower(): + # Check if the last message has a role of 'assistant' + if messages and messages[-1]["role"] == "assistant": + # Add a dummy user message to ensure the last message has a role of 'user' + messages = ( + messages.copy() + ) # Create a copy to avoid modifying the original + messages.append({"role": "user", "content": "Please continue."}) + return messages # Handle Anthropic models if not self.is_anthropic: diff --git a/tests/llm_test.py b/tests/llm_test.py index 2bd03306b..e73d11b1b 100644 --- a/tests/llm_test.py +++ b/tests/llm_test.py @@ -407,6 +407,37 @@ def test_anthropic_message_formatting(anthropic_llm, system_message, user_messag assert formatted[0] == system_message +@pytest.fixture +def deepseek_llm(): + """Fixture for Deepseek-v3-250324 LLM instance.""" + return LLM(model="deepseek-v3-250324") + + +def test_deepseek_message_formatting(deepseek_llm): + """Test Deepseek-v3-250324 message formatting.""" + # Test when last message is assistant + messages = [ + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": "Hi there"}, + ] + formatted = deepseek_llm._format_messages_for_provider(messages) + assert len(formatted) == 3 + assert formatted[0]["role"] == "user" + assert formatted[1]["role"] == "assistant" + assert formatted[2]["role"] == "user" + assert formatted[2]["content"] == "Please continue." + + # Test when last message is not assistant + messages = [ + {"role": "assistant", "content": "Hi there"}, + {"role": "user", "content": "Hello"}, + ] + formatted = deepseek_llm._format_messages_for_provider(messages) + assert len(formatted) == 2 + assert formatted[0]["role"] == "assistant" + assert formatted[1]["role"] == "user" + + def test_deepseek_r1_with_open_router(): if not os.getenv("OPEN_ROUTER_API_KEY"): pytest.skip("OPEN_ROUTER_API_KEY not set; skipping test.")