diff --git a/src/pipecat/services/gemini_multimodal_live/events.py b/src/pipecat/services/gemini_multimodal_live/events.py index 8f89b977f..3fb04b147 100644 --- a/src/pipecat/services/gemini_multimodal_live/events.py +++ b/src/pipecat/services/gemini_multimodal_live/events.py @@ -195,7 +195,7 @@ class VideoInputMessage(BaseModel): class TextInputMessage(BaseModel): """Message containing text input data.""" - text: str + realtimeInput: RealtimeInput @classmethod def from_text(cls, text: str) -> "TextInputMessage": @@ -207,7 +207,7 @@ class TextInputMessage(BaseModel): Returns: A TextInputMessage instance. """ - return cls(text=text) + return cls(realtimeInput=RealtimeInput(text=text)) class ClientContentMessage(BaseModel): diff --git a/src/pipecat/services/gemini_multimodal_live/gemini.py b/src/pipecat/services/gemini_multimodal_live/gemini.py index b7adb8c49..c62a9c86e 100644 --- a/src/pipecat/services/gemini_multimodal_live/gemini.py +++ b/src/pipecat/services/gemini_multimodal_live/gemini.py @@ -976,17 +976,14 @@ class GeminiMultimodalLiveLLMService(LLMService): with audio and video inputs, preventing temporal misalignment that can occur when different modalities are processed through separate API pathways. - After sending the text, we signal turn completion to trigger a model response - for text-only interactions. + For realtimeInput, turn completion is automatically inferred by the API based + on user activity, so no explicit turnComplete signal is needed. Args: text: The text to send as user input. """ evt = events.TextInputMessage.from_text(text) await self.send_client_event(evt) - # After sending text, we need to signal that the turn is complete. - evt = events.ClientContentMessage.model_validate({"clientContent": {"turnComplete": True}}) - await self.send_client_event(evt) async def _send_user_video(self, frame): """Send user video frame to Gemini Live API."""