A local-first proactive meeting assistant — a from-scratch rebuild of Proactor AI's core: it listens to a meeting live, streams a running transcript, and acts during the conversation — surfacing an evolving summary, key takeaways, implicit action items, and context-aware advice — then produces a Meeting Wiki and remembers everything for cross-meeting Q&A.
Everything runs on your machine. Audio, transcript, and meeting content never
leave localhost: STT is faster-whisper,
the LLM is Ollama (qwen2.5:7b), storage is SQLite.
| Proactor AI feature | Here |
|---|---|
| Live transcription | faster-whisper over a WebSocket audio stream |
| Insight Stream (evolving) | cadence-based analysis every N words |
| AI Advice + Multi-Round Detection | advice refined across rounds, capped at 3 |
| Task extraction | implicit action items pulled from the transcript |
| Meeting Wiki | Overview / Conclusion / Key Takeaways / To-Dos |
| Cross-meeting memory (Potor) | SQLite + embeddings semantic search, then LLM answer |
- macOS / Linux, Python ≥ 3.12,
uv - Ollama running with a model:
ollama pull qwen2.5:7b-instruct-q4_K_M - (faster-whisper downloads its
basemodel automatically on first run)
uv sync
uv run proactor # serves http://localhost:8000Open http://localhost:8000, click Start Insight, allow the microphone, and talk. Insights appear live on the right; End Meeting generates the wiki and saves it. Ask Potor questions about past meetings from the bottom bar.
| Var | Default | Meaning |
|---|---|---|
PROACTOR_STT |
whisper |
whisper | mock |
PROACTOR_LLM |
ollama |
ollama | mock |
PROACTOR_EMBED |
hash |
hash (lexical, zero-dep) | ollama (semantic, needs nomic-embed-text) |
PROACTOR_CADENCE |
40 |
words between insight refreshes |
PROACTOR_OLLAMA_MODEL |
qwen2.5:7b-instruct-q4_K_M |
any local Ollama chat model |
PROACTOR_DB |
~/.proactor/proactor.db |
SQLite path |
Set PROACTOR_STT=mock PROACTOR_LLM=mock to run fully offline with deterministic
stub engines (used by the test suite).
browser mic ─AudioWorklet→ Int16 16k PCM ─WebSocket→ FastAPI (app.py)
│
┌─────── MeetingSession (session.py) ───────┐
│ Transcript → Cadence → Analyzer (LLM) │
│ → Insight Stream (live) │
│ end → WikiGenerator → MemoryStore (Potor) │
└────────────────────────────────────────────┘
engines/ : whisper.py · ollama.py (real) | mock.py (deterministic)
STT, LLM, and Embedder are abstract interfaces (interfaces.py) with mock and
real implementations, so the entire pipeline is tested deterministically before
the heavy models are plugged into the same seams.
uv run pytest -q # full suite (real engine tests skip if unavailable)
uv run pytest tests/test_pipeline_e2e.py # deterministic core, no models
uv run pytest tests/test_ws_e2e.py # full WebSocket path, mock engines
uv run pytest tests/test_engines_real.py # real faster-whisper + Ollama
uv run python scripts/live_smoke.py # boots real server, streams a WAV over a real WSlive_smoke.py is the true end-to-end check: it starts the actual uvicorn
server with real engines and drives it exactly as the browser does.
Built the core operating loop, not the surrounding SaaS. Deliberately out of
scope: accounts / cloud sync / mobile apps / RBAC, speaker diarization, and
Potor's live web search. See PLAN.md for the full rationale.