Commit Graph

7 Commits

Author SHA1 Message Date
marauder-actual 89a5a85c56 fix(ws): wrap TTS in timeout so it doesn't block WebSocket after text streams 2026-05-29 17:41:49 +02:00
marauder-actual df2791a4de feat(persona): samantha uses chatterbox-turbo with paralinguistic tags 2026-05-29 17:26:24 +02:00
marauder-actual ae384fe618 feat: chatterbox TTS via madcat-tts daemon, Web Speech API STT, styled persona picker
- tts.py: replace piper subprocess with HTTP POST to madcat-tts /v1/audio/speech (chatterbox voice cloning)
- chat.js: replace whisper server upload with browser Web Speech API (webkitSpeechRecognition)
- chat.css: style persona picker — appearance:none select, themed with CSS vars, mobile responsive
- main.py: default TTS voice → bt7274-en
2026-05-29 16:43:41 +02:00
marauder-actual f3c35eba72 fix(persona): always call sidecar, even in PREVIEW_MODE 2026-05-29 16:16:32 +02:00
marauder-actual 6dee0e8c6f fix(transport): use cart-specific voice IDs and TTS engine backends in PERSONAS 2026-05-29 14:27:18 +02:00
marauder-actual b0893a3699 feat(transport): swap Anthropic → opencode; add persona switcher
Part 1 — Transport swap:
- Replace anthropic.AsyncAnthropic streaming with httpx SSE client
  calling opencode's OpenAI-compat /v1/chat/completions on sin:4096
- Auth: basic auth opencode:$OPENCODE_PASSWORD
- Env: OPENCODE_URL (default http://sin:4096), OPENCODE_PASSWORD
- Sidecar binding (sin:4098) consulted per message to resolve active
  persona; voice read from binding → cart → env default
- Helper _session_id_for_user: deterministic sha256 slug per email
  so sidecar binding survives WebSocket reconnects
- anthropic dep retained in pyproject.toml (not removed — P4 may use it)

Part 2 — Persona switcher:
- PERSONAS dict: bt7274, friday, samantha (slug → voice/backend/prompt)
- POST /api/persona  — bind persona via sidecar, maps slug → full config
- GET  /api/persona/current — return current binding
- GET  /api/personas — list available personas
- chat.html: persona <select> in topnav with server-rendered active state
- chat.js: onChange → fetch /api/persona, update __personaName +
  status badge + system message in conversation feed

TODO: add CSS polish for .topnav__persona-wrap (inherits base styles for now)
2026-05-29 14:18:47 +02:00
marauder-actual 96ba8f4b6e chore: initial commit — chat-saiden web chat baseline 2026-05-29 13:47:34 +02:00