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)")