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.
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)
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) <[email protected]>
Signed-off-by: Justin Paul <[email protected]>
justin
merged commit 251a10a087 into main2026-06-09 12:51:03 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Vendor-agnostic seam for the AI assistant + match ranking.
LLMProvider/EmbeddingProviderABCs — separate (Anthropic has no embeddings endpoint; each configured independently, either can be off).NullLLMProvider/NullEmbeddingProviderdefault — fail loud with a clear "not configured" error.AnthropicLLMProvider(officialanthropicSDK, defaultclaude-opus-4-8). A local provider (Ollama) would be another subclass.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