From 02dedc972d875384a3fae1b22e50ad4748142973 Mon Sep 17 00:00:00 2001 From: patrick-motsch Date: Sun, 15 Feb 2026 15:19:31 +0100 Subject: [PATCH] fix(teamsbot): SSE rate-limit 60/min, TTS message format for bot protocol Co-authored-by: Cursor --- modules/features/teamsbot/routeFeatureTeamsbot.py | 2 +- modules/features/teamsbot/service.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/features/teamsbot/routeFeatureTeamsbot.py b/modules/features/teamsbot/routeFeatureTeamsbot.py index 0fbd46cd..a6bf5fcf 100644 --- a/modules/features/teamsbot/routeFeatureTeamsbot.py +++ b/modules/features/teamsbot/routeFeatureTeamsbot.py @@ -242,7 +242,7 @@ async def getSession( @router.get("/{instanceId}/sessions/{sessionId}/stream") -@limiter.limit("10/minute") +@limiter.limit("60/minute") async def streamSession( request: Request, instanceId: str, diff --git a/modules/features/teamsbot/service.py b/modules/features/teamsbot/service.py index 2441400e..47a036fc 100644 --- a/modules/features/teamsbot/service.py +++ b/modules/features/teamsbot/service.py @@ -497,10 +497,14 @@ class TeamsbotService: audioContent = ttsResult.get("audioContent") if audioContent and websocket: # Send TTS audio to bot via WebSocket + # Bot expects: {type: "playAudio", sessionId, audio: {data, format}} await websocket.send_text(json.dumps({ - "type": "tts_audio", - "data": base64.b64encode(audioContent if isinstance(audioContent, bytes) else audioContent.encode()).decode(), - "format": "mp3", + "type": "playAudio", + "sessionId": sessionId, + "audio": { + "data": base64.b64encode(audioContent if isinstance(audioContent, bytes) else audioContent.encode()).decode(), + "format": "mp3", + }, })) elif audioContent and not websocket: logger.info(f"TTS audio generated for session {sessionId} (HTTP mode - no WebSocket for playback)")