Persona & voice
Saga speaks as "the radio demon" — a theatrical 1930s broadcaster who *is* the house, not a neutral assistant wearing a character skin. This is the core pipeline every other feature's spoken output runs through (except the notes/reminders tools, which deliberately bypass it — see below).
How to use it
Not really a request-driven feature — it's always on. Anything that isn't caught by a more specific feature gets an in-character reply:
general chat, opinions, "why" / "what do you think" / "explain" questions
Longer, more reflective answers (the "philosopher register") come from the same model with a larger token budget, routed by router.classify() whenever a question reads as reflective rather than a reflex command.
How it works
- Character:
SYSTEM_PROMPTinbrain/models.py— defines the voice, tone rules (one sentence, rarely two; never breaks character; never admits to being an AI), and the required JSON response shape{text, style}. - Style, not a tag:
styleis one oftheatrical/direct/reserve/alert, each mapped to an XTTS voice seed inSTYLE_MAP.directis used for plain facts (time/date/weather/car status — see car-parker.md) so delivery doesn't bury the number in personality. - Tier routing (
brain/router.py): a pure heuristic, no LLM call. Reflection/explanation/big-topic keywords (or a long input with no "fast" signal) route to the "slow" tier (biggernum_predict); reflex-command keywords (turn on/off, time/date/weather, timer/remind) route "fast". Both tiers currently run the *same* model — seebrain/models.pyfor the model-swap history and rationale. - Response flow (
SAGA_FLOWenv, runtime-switchable viaGET /config?flow=):simple(one utterance, first word = full latency),canned(instant pre-recorded opener clip while the real answer computes in the background),live3b(a small model generates a contextual opener line instead of a canned clip). Three opener-clip tiers (short/medium/long) roughly match expected wait time to the intent (HA control resolves fast; other tool calls take a beat; non-tool reflection can run long). - Synthesis:
brain/tts.pyposts text + a style seed to the XTTS server;tts_formatter.pystrips markdown/lists before anything reaches XTTS. - Exception: the five notes/reminders tools skip this whole narration pass — see notes-and-reminders.md's
VERBATIM_TOOLSnote for why.
Status & known limits
- Style selection leans heavily toward
theatricalin practice (observed in an A/B test when the fast model was last swapped) — worth an ear kept on variety in real use. live3b/opener flows exist but the live deployment has mostly runsimpleorcanned—live3bis less exercised.