fix(CF-1170): Fix STT by correcting agent dispatch flow

Three fixes for voice agent not responding to speech:
1. Agent name: add --agent-name matrix-ai to CLI (was empty, dispatch couldnt match)
2. Move dispatch from on_invite to on_unknown call handler (dispatch when call starts, not on room join)
3. Use LiveKit room name from foci_preferred instead of raw Matrix room ID

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-02-15 17:21:32 +02:00
parent 7032fef5c4
commit d5af90c7c7
2 changed files with 23 additions and 15 deletions

36
bot.py
View File

@@ -97,22 +97,9 @@ class Bot:
async def on_invite(self, room, event: InviteMemberEvent):
if event.state_key != BOT_USER:
return
logger.info("Invited to %s", room.room_id)
logger.info("Invited to %s, joining room", room.room_id)
await self.client.join(room.room_id)
lk_room_name = room.room_id
try:
await self.lkapi.agent_dispatch.create_dispatch(
api.CreateAgentDispatchRequest(
agent_name=AGENT_NAME,
room=lk_room_name,
)
)
self.dispatched_rooms.add(room.room_id)
logger.info("Agent dispatched to %s", lk_room_name)
except Exception:
logger.exception("Dispatch failed for %s", room.room_id)
async def on_sync(self, response: SyncResponse):
"""After each sync, trust all devices in our rooms."""
for user_id in list(self.client.device_store.users):
@@ -145,6 +132,27 @@ class Bot:
"livekit_alias": room_id,
}])
# Extract LiveKit room name from foci and dispatch agent
lk_room_name = room_id # fallback
for f in foci:
if f.get("type") == "livekit" and f.get("livekit_alias"):
lk_room_name = f["livekit_alias"]
break
logger.info("LiveKit room name: %s (from foci_preferred)", lk_room_name)
if room_id not in self.dispatched_rooms:
try:
await self.lkapi.agent_dispatch.create_dispatch(
api.CreateAgentDispatchRequest(
agent_name=AGENT_NAME,
room=lk_room_name,
)
)
self.dispatched_rooms.add(room_id)
logger.info("Agent dispatched to LiveKit room %s", lk_room_name)
except Exception:
logger.exception("Dispatch failed for %s", lk_room_name)
# Send our own call member state event
call_content = {
"application": "m.call",