from __future__ import annotations import unittest from unittest.mock import patch from models import AssistantConfig from pipecat.processors.aggregators.llm_context import LLMContext from services.pipecat.service_factory import ( HTTP_TTS_STOP_FRAME_TIMEOUT_S, WEBSOCKET_TTS_STOP_FRAME_TIMEOUT_S, create_llm, create_tts, ) class LLMServiceFactoryTest(unittest.TestCase): def test_openai_compatible_llm_converts_async_tool_developer_result(self): service = create_llm( AssistantConfig( llm_interface_type="openai-llm", model="deepseek-chat", llm_api_key="test-key", llm_base_url="https://llm.example.test/v1", ) ) context = LLMContext( messages=[ {"role": "system", "content": "你是助手"}, { "role": "developer", "content": '{"type":"async_tool","status":"finished"}', }, {"role": "user", "content": "ok"}, ] ) params = service.get_llm_adapter().get_llm_invocation_params( context, convert_developer_to_user=not service.supports_developer_role, ) self.assertEqual( [message["role"] for message in params["messages"]], ["system", "user", "user"], ) self.assertNotIn("developer", str(params["messages"])) def test_provider_can_explicitly_enable_developer_role(self): service = create_llm( AssistantConfig( llm_interface_type="openai-llm", model="gpt-compatible", llm_api_key="test-key", llm_base_url="https://llm.example.test/v1", llm_values={"supportsDeveloperRole": True}, ) ) self.assertTrue(service.supports_developer_role) class TTSServiceFactoryTest(unittest.TestCase): def test_http_tts_keeps_wider_audio_chunk_timeout(self): config = AssistantConfig( tts_interface_type="openai-tts", tts_model="test-model", voice="test-voice", tts_api_key="test-key", tts_base_url="https://tts.example.test/v1", ) with patch( "services.pipecat.service_factory.OpenAITTSService" ) as service_type: create_tts(config) self.assertEqual(HTTP_TTS_STOP_FRAME_TIMEOUT_S, 3.0) self.assertEqual( service_type.call_args.kwargs["stop_frame_timeout_s"], HTTP_TTS_STOP_FRAME_TIMEOUT_S, ) def test_websocket_tts_keeps_short_completion_fallback(self): config = AssistantConfig( tts_interface_type="xfyun-tts", voice="test-voice", tts_secrets={ "appId": "test-app", "apiKey": "test-key", "apiSecret": "test-secret", }, ) with patch( "services.pipecat.service_factory.XfyunTTSService" ) as service_type: create_tts(config) self.assertEqual(WEBSOCKET_TTS_STOP_FRAME_TIMEOUT_S, 1.0) self.assertEqual( service_type.call_args.kwargs["stop_frame_timeout_s"], WEBSOCKET_TTS_STOP_FRAME_TIMEOUT_S, ) if __name__ == "__main__": unittest.main()