perf(MAT): fire-and-forget auto-rename + harden memory-extract None response
Some checks failed
Build & Deploy / test (push) Failing after 9s
Build & Deploy / build-and-deploy (push) Has been skipped
Tests / test (push) Failing after 8s

- `_auto_rename_room` now runs as a tracked bg task. Title generation
  latency no longer affects when the handler returns and frees the
  room lock, so users can fire the next message sooner.
- Memory extraction guards against providers returning `None` for
  `choices[0].message.content` (observed in logs: AttributeError on
  .strip). Logs once and returns cleanly instead of raising.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-04-15 19:00:32 +03:00
parent 7e5b39ea72
commit f16c94b2dc

18
bot.py
View File

@@ -1974,7 +1974,13 @@ class Bot:
], ],
max_tokens=300, max_tokens=300,
) )
raw = resp.choices[0].message.content.strip() raw_content = resp.choices[0].message.content
if not raw_content:
# Some providers return None content when the model decides to emit nothing
# (e.g. safety filter, empty JSON array would still be a string though).
logger.info("Memory extraction: empty model response, nothing to store")
return
raw = raw_content.strip()
logger.info("Memory extraction raw response: %s", raw[:200]) logger.info("Memory extraction raw response: %s", raw[:200])
if raw.startswith("```"): if raw.startswith("```"):
@@ -3306,12 +3312,18 @@ class Bot:
self._bg_tasks.add(task) self._bg_tasks.add(task)
task.add_done_callback(self._bg_tasks.discard) task.add_done_callback(self._bg_tasks.discard)
# Auto-rename: only for group rooms with explicit opt-in (not DMs) # Auto-rename: only for group rooms with explicit opt-in (not DMs).
# Fire-and-forget so the title-generation LLM call doesn't gate
# the turn return path.
if room.room_id in self.auto_rename_rooms: if room.room_id in self.auto_rename_rooms:
last_rename = self.renamed_rooms.get(room.room_id, 0) last_rename = self.renamed_rooms.get(room.room_id, 0)
gap_seconds = time.time() - last_rename if last_rename else float("inf") gap_seconds = time.time() - last_rename if last_rename else float("inf")
if gap_seconds > 300: if gap_seconds > 300:
await self._auto_rename_room(room, user_message, reply) rename_task = asyncio.create_task(
self._auto_rename_room(room, user_message, reply)
)
self._bg_tasks.add(rename_task)
rename_task.add_done_callback(self._bg_tasks.discard)
return reply return reply
except _openai.APIStatusError as e: except _openai.APIStatusError as e: