Skip to content

v0.3.0 — run every model locally

Latest

Choose a tag to compare

@ngoanpv ngoanpv released this 02 Aug 06:43
· 40 commits to main since this release
b645bdf

An interview now runs with no LLM, speech-to-text or text-to-speech key at all.

LLM_PROVIDER=ollama  STT_PROVIDER=whisper  TTS_PROVIDER=kokoro

No new dependency was added — this reuses the already-installed
livekit-plugins-openai with a base_url override. Provider values name a
contract ("an OpenAI-compatible server at a base URL"), not a vendor, so the
stack is genuinely swappable:

Stage Endpoint Accepted values
LLM /v1/chat/completions ollama · vllm · llamacpp · lmstudio · local
STT /v1/audio/transcriptions whisper · faster-whisper · qwen3-asr · speaches · local
TTS /v1/audio/speech kokoro · local

Also ships deepinterview init → "100% local models", a
docker compose --profile local stack, and docs/LOCAL_MODELS.md.

Verified

Apple M5 Pro (24 GB), qwen3:8b + Speaches + kokoro-fastapi:

  • A live microphone interview, end to end — the agent spoke in Kokoro's
    voice, the local Whisper server transcribed real speech, and the report
    rendered complete, with zero recognition failures and no stage falling back
    to a cloud provider.
  • Prep → question plan in ~2 minutes, CV-grounded with difficulty ramping
    1→5 and no degraded stages.
  • 216 pytest + 26 vitest, lint, schema parity, compose (all profiles) and the
    agent image build, all green.

Not verified, so not claimed

  • Turn latency is not benchmarked. Optimizing it is follow-up work.
  • Kokoro has no Vietnamese voice — vi sessions honestly fall back to a
    cloud voice rather than mispronouncing it.
  • LiveKit remains the transport. The claim is "no cloud model keys", never
    "no cloud"; livekit-server --dev is documented for a fully offline stack.
  • CI has no models, so the local path is maintainer-verified only.
  • Small local models lean on the shutdown-time answer recovery more than cloud
    models do — qwen3:8b did not reliably call save_answer during the live run.

Two defaults worth knowing

  • WHISPER_MODEL=Systran/faster-whisper-base, not small. The OpenAI plugin
    hard-codes a 30s per-request ceiling no setting can raise, so an oversized
    model doesn't degrade — the turn dies. small needs ~3.4 GB resident and, in a
    memory-tight Docker VM, took 32s on a 3.6s clip; base needs ~220 MB and was
    just as accurate.
  • KOKORO_MODEL=tts-1 is load-bearing: any other id routes synthesis down an
    SSE branch that yields no audio and no error. A wrong value is coerced with a
    warning.

Closes #55, #56, #57.

🤖 Generated with Claude Code