From 591c02fb0efcca998568a392636a43b4cda99617 Mon Sep 17 00:00:00 2001 From: Blaine Kasten Date: Thu, 19 Mar 2026 13:37:21 -0500 Subject: [PATCH] a few updates --- .../07e-interruptible-together.py | 22 +++++++-------- src/pipecat/services/together/llm.py | 8 +++--- src/pipecat/services/together/stt.py | 3 ++- src/pipecat/services/together/tts.py | 27 +++++++++---------- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/examples/foundational/07e-interruptible-together.py b/examples/foundational/07e-interruptible-together.py index 1420e9263..e55d4dd1b 100644 --- a/examples/foundational/07e-interruptible-together.py +++ b/examples/foundational/07e-interruptible-together.py @@ -55,21 +55,17 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): stt = TogetherSTTService(api_key=os.getenv("TOGETHER_API_KEY")) - tts = TogetherTTSService( + tts = TogetherTTSService(api_key=os.getenv("TOGETHER_API_KEY")) + + llm = TogetherLLMService( api_key=os.getenv("TOGETHER_API_KEY"), - voice="tara", + settings=TogetherLLMService.Settings( + model="Qwen/Qwen3.5-9B", + system_instruction="You are a helpful LLM in a WebRTC call. Your goal is to demonstrate your capabilities in a succinct way. Your output will be spoken aloud, so avoid special characters that can't easily be spoken, such as emojis or bullet points. Respond to what the user said in a creative and helpful way.", + ), ) - llm = TogetherLLMService(api_key=os.getenv("TOGETHER_API_KEY")) - - messages = [ - { - "role": "system", - "content": "You are a helpful LLM in a WebRTC call. Your goal is to demonstrate your capabilities in a succinct way. Your output will be spoken aloud, so avoid special characters that can't easily be spoken, such as emojis or bullet points. Respond to what the user said in a creative and helpful way.", - }, - ] - - context = LLMContext(messages) + context = LLMContext() user_aggregator, assistant_aggregator = LLMContextAggregatorPair( context, user_params=LLMUserAggregatorParams(vad_analyzer=SileroVADAnalyzer()), @@ -100,7 +96,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): async def on_client_connected(transport, client): logger.info(f"Client connected") # Kick off the conversation. - messages.append({"role": "system", "content": "Please introduce yourself to the user."}) + context.add_message({"role": "user", "content": "Please introduce yourself"}) await task.queue_frames([LLMRunFrame()]) @transport.event_handler("on_client_disconnected") diff --git a/src/pipecat/services/together/llm.py b/src/pipecat/services/together/llm.py index 4ec2f8244..1e296769b 100644 --- a/src/pipecat/services/together/llm.py +++ b/src/pipecat/services/together/llm.py @@ -36,7 +36,7 @@ class TogetherLLMService(OpenAILLMService): self, *, api_key: str, - base_url: str = "https://api.together.xyz/v1", + base_url: str = "https://api.together.ai/v1", model: Optional[str] = None, settings: Optional[Settings] = None, **kwargs, @@ -45,8 +45,8 @@ class TogetherLLMService(OpenAILLMService): Args: api_key: The API key for accessing Together.ai's API. - base_url: The base URL for Together.ai API. Defaults to "https://api.together.xyz/v1". - model: The model identifier to use. Defaults to "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo". + base_url: The base URL for Together.ai API. Defaults to "https://api.together.ai/v1". + model: The model identifier to use. .. deprecated:: 0.0.105 Use ``settings=TogetherLLMService.Settings(model=...)`` instead. @@ -56,7 +56,7 @@ class TogetherLLMService(OpenAILLMService): **kwargs: Additional keyword arguments passed to OpenAILLMService. """ # 1. Initialize default_settings with hardcoded defaults - default_settings = self.Settings(model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo") + default_settings = self.Settings(model=model) # 2. Apply direct init arg overrides (deprecated) if model is not None: diff --git a/src/pipecat/services/together/stt.py b/src/pipecat/services/together/stt.py index c1ee056f7..4d2c6f76c 100644 --- a/src/pipecat/services/together/stt.py +++ b/src/pipecat/services/together/stt.py @@ -296,7 +296,7 @@ class TogetherSTTService(WebsocketSTTService): Args: evt: The delta event from the server. """ - delta = evt.get("transcript", "") + delta = evt.get("delta", "") if delta.strip(): await self.push_frame( InterimTranscriptionFrame( @@ -321,6 +321,7 @@ class TogetherSTTService(WebsocketSTTService): self._user_id, time_now_iso8601(), result=evt, + finalized=True, ) ) await self._handle_transcription_trace(transcript, True, self._settings.language) diff --git a/src/pipecat/services/together/tts.py b/src/pipecat/services/together/tts.py index e3daa3fa0..171ba6b7b 100644 --- a/src/pipecat/services/together/tts.py +++ b/src/pipecat/services/together/tts.py @@ -225,20 +225,17 @@ class TogetherTTSService(WebsocketTTSService): Args: message: The message dict to serialize and send. """ - try: - if not self._disconnecting and self._websocket: - await self._websocket.send(json.dumps(message)) - except Exception as e: - if self._disconnecting or not self._websocket: - return - await self.push_error( - error_msg=f"Error sending message: {e}", - exception=e, - ) + if not self._disconnecting: + await self.send_with_retry(json.dumps(message), self._report_error) - async def flush_audio(self): - """Flush any pending audio and finalize the current context.""" - logger.trace(f"{self}: flushing audio") + async def flush_audio(self, context_id: Optional[str] = None): + """Flush any pending audio and finalize the current context. + + Args: + context_id: Pipecat TTS context (unused for Together; required for + compatibility with :meth:`TTSService.on_turn_context_completed`). + """ + logger.trace(f"{self}: flushing audio (context_id={context_id})") await self._ws_send({"type": "input_text_buffer.commit"}) # ------------------------------------------------------------------ @@ -252,7 +249,9 @@ class TogetherTTSService(WebsocketTTSService): this method with automatic reconnection on connection errors. """ async for message in self._websocket: - if not isinstance(message, str): + if isinstance(message, bytes): + message = message.decode("utf-8") + elif not isinstance(message, str): continue try: