From ea8cffee3cca1d59706d0359bd660d144f0268a9 Mon Sep 17 00:00:00 2001
From: patrick-motsch
Date: Tue, 24 Feb 2026 14:55:43 +0100
Subject: [PATCH] fix: log teamsbot audio capture diagnostics in gateway
Read and log per-chunk capture diagnostics (trackId, readyState, rms, nativeSampleRate) from bot audioChunk messages to support root-cause analysis of silent audio streams.
Co-authored-by: Cursor
---
modules/features/teamsbot/service.py | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/modules/features/teamsbot/service.py b/modules/features/teamsbot/service.py
index 7969a701..221f3a05 100644
--- a/modules/features/teamsbot/service.py
+++ b/modules/features/teamsbot/service.py
@@ -302,11 +302,13 @@ class TeamsbotService:
audioData = message.get("audio", {})
audioBase64 = audioData.get("data", "")
sampleRate = audioData.get("sampleRate", 16000)
+ captureDiagnostics = audioData.get("captureDiagnostics") or {}
if audioBase64:
await self._processAudioChunk(
sessionId=sessionId,
audioBase64=audioBase64,
sampleRate=sampleRate,
+ captureDiagnostics=captureDiagnostics,
interface=interface,
voiceInterface=voiceInterface,
websocket=websocket,
@@ -390,6 +392,7 @@ class TeamsbotService:
sessionId: str,
audioBase64: str,
sampleRate: int,
+ captureDiagnostics: Optional[Dict[str, Any]],
interface,
voiceInterface,
websocket: WebSocket,
@@ -401,6 +404,16 @@ class TeamsbotService:
if len(audioBytes) < 1000:
return
+ if captureDiagnostics:
+ trackId = captureDiagnostics.get("trackId")
+ readyState = captureDiagnostics.get("readyState")
+ rms = captureDiagnostics.get("rms")
+ nativeSampleRate = captureDiagnostics.get("nativeSampleRate")
+ logger.debug(
+ f"[AudioChunk] diagnostics: track={trackId}, readyState={readyState}, "
+ f"rms={rms}, nativeRate={nativeSampleRate}, bytes={len(audioBytes)}"
+ )
+
# Detect silent/all-zeros audio early to avoid expensive STT calls
if len(set(audioBytes[100:min(500, len(audioBytes))])) < 3:
logger.debug(f"[AudioChunk] Skipping silent audio ({len(audioBytes)} bytes, low byte variation)")