feat(voice): the answer streams unless the body opts out

This commit is contained in:
hh
2026-09-07 00:06:46 +02:00
parent 106f801e3c
commit bba8d9ce99
2 changed files with 36 additions and 9 deletions
+14 -1
View File
@@ -43,6 +43,9 @@ class VoiceFrontend(Frontend):
Тёрн идёт мимо очереди, а значит и мимо конверта: справка по vault в
этот разговор не попадает даже случайно. В телеграм-ветку вопрос
кладётся отдельной репликой, ответ пишется черновиком, как обычно.
Отвечает SSE по умолчанию - колонке важно начать говорить раньше;
`"stream": false` в теле переключает на один JSON.
"""
name = FRONTEND
@@ -103,7 +106,7 @@ class VoiceFrontend(Frontend):
prompt = await self._prompt(
conv, texts.HEARD.format(room=room, device=device, text=content)
)
if bool(body.get("stream")):
if _flag(body, "stream", default=True):
return StreamingResponse(
self._sse(conv, prompt, body),
media_type="text/event-stream",
@@ -211,6 +214,16 @@ async def _body(request: Request) -> Mapping[str, Any]:
return data
def _flag(body: Mapping[str, Any], name: str, *, default: bool) -> bool:
"""Флаг из тела; строку разбираем словом, иначе `"false"` включит стрим."""
value = body.get(name)
if value is None:
return default
if isinstance(value, str):
return value.strip().lower() in ("1", "true", "yes", "on")
return bool(value)
def _field(body: Mapping[str, Any], name: str) -> str:
value = body.get(name)
if not isinstance(value, str) or not value.strip():