feat(voice): the answer streams unless the body opts out
This commit is contained in:
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user