Fix #215: pluggable LLM + embedding provider abstraction #235

Merged
justin merged 1 commits from model-provider-abstraction into main 2026-06-09 12:51:03 -04:00
Owner

Vendor-agnostic seam for the AI assistant + match ranking.

  • LLMProvider / EmbeddingProvider ABCs — separate (Anthropic has no embeddings endpoint; each configured independently, either can be off).
  • NullLLMProvider/NullEmbeddingProvider default — fail loud with a clear "not configured" error.
  • AnthropicLLMProvider (official anthropic SDK, default claude-opus-4-8). A local provider (Ollama) would be another subclass.
  • Factory in deps.py selects by MODEL_PROVIDER/EMBEDDING_PROVIDER; documented in .env.example.

Providers never touch the DB — the AI-never-writes invariant holds; writes go through ChangeProposal (#214). Tests: selection + null fail-loud. 81 passed.

Closes #215

🤖 Generated with Claude Code

Vendor-agnostic seam for the AI assistant + match ranking. - `LLMProvider` / `EmbeddingProvider` ABCs — **separate** (Anthropic has no embeddings endpoint; each configured independently, either can be off). - `NullLLMProvider`/`NullEmbeddingProvider` default — fail loud with a clear "not configured" error. - `AnthropicLLMProvider` (official `anthropic` SDK, default `claude-opus-4-8`). A local provider (Ollama) would be another subclass. - Factory in deps.py selects by `MODEL_PROVIDER`/`EMBEDDING_PROVIDER`; documented in `.env.example`. Providers never touch the DB — the AI-never-writes invariant holds; writes go through ChangeProposal (#214). Tests: selection + null fail-loud. **81 passed.** Closes #215 🤖 Generated with [Claude Code](https://claude.com/claude-code)
justin added 1 commit 2026-06-09 12:51:03 -04:00
Adds the vendor-agnostic seam the AI assistant + match-ranking plug into:
- LLMProvider / EmbeddingProvider ABCs (base.py). LLM and embeddings are
  SEPARATE abstractions — Anthropic has no embeddings endpoint, so each is
  configured independently and either can be off.
- NullLLMProvider / NullEmbeddingProvider — the default; fail loud with a clear
  "not configured" error so AI-off deployments don't silently no-op.
- AnthropicLLMProvider — first concrete LLM impl, via the official anthropic SDK
  (default model claude-opus-4-8). A local provider (e.g. Ollama) would be
  another subclass of the same interface.
- Factory in deps.py (get_llm_provider / get_embedding_provider) selects by
  env (MODEL_PROVIDER / EMBEDDING_PROVIDER); documented in .env.example.

Providers are read-only text/vector producers — they never touch the DB, so the
"AI never writes autonomously" invariant (CLAUDE.md #1) holds; writes will go
through ChangeProposal (#214).

Tests: provider selection (null default, anthropic when keyed, fallback without
key) + null providers raise. 81 passed.

Closes #215

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Justin Paul <justin@jpaul.me>
justin merged commit 251a10a087 into main 2026-06-09 12:51:03 -04:00
justin deleted branch model-provider-abstraction 2026-06-09 12:51:03 -04:00
Sign in to join this conversation.