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.")