From 4b98c2b7f15164ceb85f81bb89214f3524a86ced Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Mon, 18 May 2026 10:11:46 -0400 Subject: [PATCH] Handle developer messages conservatively for OpenRouter --- src/pipecat/services/openrouter/llm.py | 1 + tests/test_run_inference.py | 30 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/pipecat/services/openrouter/llm.py b/src/pipecat/services/openrouter/llm.py index 4de5190dd..f58dd718a 100644 --- a/src/pipecat/services/openrouter/llm.py +++ b/src/pipecat/services/openrouter/llm.py @@ -37,6 +37,7 @@ class OpenRouterLLMService(OpenAILLMService): Settings = OpenRouterLLMSettings _settings: Settings + supports_developer_role = False def __init__( self, diff --git a/tests/test_run_inference.py b/tests/test_run_inference.py index 755560ec9..5603a2fe5 100644 --- a/tests/test_run_inference.py +++ b/tests/test_run_inference.py @@ -23,6 +23,7 @@ from pipecat.services.openai.responses.llm import ( OpenAIResponsesHttpLLMService, OpenAIResponsesLLMService, ) +from pipecat.services.openrouter.llm import OpenRouterLLMService @pytest.mark.asyncio @@ -105,6 +106,35 @@ async def test_openai_run_inference_client_exception(): await service.run_inference(mock_context) +@pytest.mark.asyncio +async def test_openrouter_run_inference_converts_developer_messages_to_user(): + """Test OpenRouter requests convert developer messages for broad model compatibility.""" + with patch.object(OpenRouterLLMService, "create_client"): + service = OpenRouterLLMService(settings=OpenRouterLLMService.Settings(model="gpt-4")) + service._client = AsyncMock() + + mock_context = MagicMock(spec=LLMContext) + mock_adapter = MagicMock() + mock_adapter.get_llm_invocation_params.return_value = OpenAILLMInvocationParams( + messages=[{"role": "user", "content": "Tool result"}], + tools=OPENAI_NOT_GIVEN, + tool_choice=OPENAI_NOT_GIVEN, + ) + service.get_llm_adapter = MagicMock(return_value=mock_adapter) + + mock_response = MagicMock() + mock_response.choices = [MagicMock()] + mock_response.choices[0].message.content = "Done" + service._client.chat.completions.create.return_value = mock_response + + result = await service.run_inference(mock_context) + + assert result == "Done" + mock_adapter.get_llm_invocation_params.assert_called_once_with( + mock_context, system_instruction=None, convert_developer_to_user=True + ) + + @pytest.mark.asyncio async def test_anthropic_run_inference_with_llm_context(): """Test run_inference with LLMContext returns expected response for Anthropic."""