- content/songs/: 6 curated mp3s (tracked via Git LFS), content/songs.json
now points to them and is loaded by ContentLibrary (loader.py).
- activities.json: drop the old text-only song_* placeholders, now that
"song" intent plays real audio (mirrors the "story" pattern: the LLM
only announces, never sings/invents lyrics).
- engine.py: dedicated <nota> + no-LLM fallback for the "song" intent;
FALLBACK_REPLY now points users at the real cause (ZeroGPU limit)
instead of a vague "se me trabó la lengua"; log each failed
_generate attempt for easier diagnosis without burning extra quota.
- frontend: songs.js plays/pauses the suggested song (auto-play on
overlay open, tap to pause), wired up in app.js.
- voice/tts.py + app.py: precache all content/stories.json audio at
startup, so "Escuchar cuento" never hits a cold ~25s synthesis wait.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add Sofia color-change, Cuentos frontend section, Ollama local backend
- content/colors.json + content/loader.py: paleta curada para "Sofía,
cambiate a <color>"; llm/engine.py detecta la intención sofia_color y
presenta el <contenido> curado, frontend/static/sofia.js aplica la
paleta a las variables CSS de Sofía.
- frontend: nueva sección "Cuentos" (frontend/static/stories.js,
content/stories.json, index.html, style.css) junto con ajustes en
activities.js, app.js, songs.js.
- llm/engine.py: bloques <nota> para saludo y presentación de cuentos,
backend alternativo vía Ollama (LUMI_LLM_BACKEND=ollama) para correr
local sin GPU grande, documentado en CLAUDE.md/requirements.txt.
- voice/tts.py: silencio inicial en el audio para que parlantes
Bluetooth no se coman las primeras sílabas.
- parental/store.py: quita líneas de fase/nombre de memory_block.
Initial commit: Lumi pipeline migrated to llama.cpp, local-first TTS
- llm/engine.py: migrate from Ollama to llama-cpp-python (GGUF, chatml),
add real conversation history from ParentalStore, fix system prompt to
neutral Latin American Spanish
- voice/tts.py: remove edge-tts fallback, reuse a single Kokoro pipeline
instance, add warmup() to pay cold-load cost at startup not on first reply
- safety/blocklist.txt: expand from 3 to 44 terms
- requirements.txt, README.md: sync with actual stack