Status: ✅ in use · 🔄 in progress · ⬜ to adopt
| Feature we want |
Library |
Status |
| Agent loop, tool calling, structured output |
pydantic-ai |
✅ |
| Provider/model switching (cloud + local Ollama) |
pydantic-ai models |
✅ (OpenRouter first-class, #20) |
| Tool server (MCP) |
fastmcp |
✅ |
Config from env / .env |
pydantic-settings |
✅ (#10) |
| Recover from failing tool calls |
pydantic-ai (ModelRetry) |
✅ (#11) |
| CLI commands, flags, subcommands (entry point) |
click / rich-click |
✅ (#24) |
| HITL / approval gate before writes |
pydantic-ai tool approval (requires_approval / DeferredToolRequests) |
✅ (PR #8's custom path moved onto the primitive) |
| Multi-line input + vim keybindings + history |
prompt_toolkit (PromptSession(multiline=True, vi_mode=True)) |
✅ (#19) |
| Spinner, live output, Markdown rendering |
rich (console.status, Markdown) |
✅ (#19) |
| Doc retrieval / RAG |
ChromaDB + Ollama / sentence-transformers embeddings |
✅ |
| Eval harness (golden queries, scoring, reports) |
pydantic-evals (Dataset/Case/LLMJudge) |
✅ (Discourse eval set + grounding harness) |
| Streaming replies |
pydantic-ai (run_stream) |
⬜ was in, removed; restore pending |
| Tracing / per-run tokens + latency |
Pydantic Logfire (OTel) |
⬜ optional; a custom trace log exists, Logfire not adopted |
| Full TUI (only if we outgrow a REPL) |
Textual |
⬜ later, maybe never |
Status: ✅ in use · 🔄 in progress · ⬜ to adopt
.envModelRetry)requires_approval/DeferredToolRequests)PromptSession(multiline=True, vi_mode=True))console.status,Markdown)Dataset/Case/LLMJudge)run_stream)