Canonical distinction · Sprint 37 GAP-S37-03
Two layers, two counts, zero conflation. This page is the public mirror of the canonical doc at docs/AI_CLI_VS_LLM_PROVIDER_CANONICAL.md. Any marketing surface that talks about either layer links here.
| AI CLIs | LLM Providers | |
|---|---|---|
| Count | 6 | 12 |
| Where | User’s machine | LYDOS backend gateway |
| User picks | Yes — lydos login enrolls one | Indirectly — Q159 router picks the best fit |
| Audit attribution | cli:<cli_id> surface_origin tag | provider:<slug> in ASR chain |
Each one is shipped as a _StandardBridge subclass and registered at boot via the side-effect mount in user_integration_routes.py.
core/ai_cli_bridges/claude_code.py · Reference adapter — every other inherits _StandardBridge
core/ai_cli_bridges/cursor.py · Via .cursor/mcp.json external MCP support
core/ai_cli_bridges/cline.py · VS Code extension, native MCP
core/ai_cli_bridges/codex_cli.py · Non-MCP, local HTTP shim
core/ai_cli_bridges/aider.py · Non-MCP, slash-command wrapper
core/ai_cli_bridges/vscode_continue.py · Via ~/.continue/config.json
Note on Windsurf / GitHub Copilot: Earlier marketing copy listed both as supported CLIs. Neither has a shipped _StandardBridge adapter yet. They are tracked as Roadmap in the closure audit and will not be claimed as shipped on any LYDOS surface until their adapters land (KURAL 13).
Backend providers the Q159 router dispatches to. Each entry lives in SUPPORTED_LLM_PROVIDERS in core/integrations/llm_canonical_manifest.py. Per-user API keys live in the AES-256-GCM vault — never on the server in plaintext.
| # | Provider | Slug | Default model | Cost tier |
|---|---|---|---|---|
| 1 | Groq Cloud | groq | llama-3.3-70b-versatile | free |
| 2 | Anthropic Claude | anthropic | claude-sonnet-4-6 | medium |
| 3 | OpenAI GPT | openai | gpt-4o | high |
| 4 | Mistral AI | mistral | mistral-large-latest | low |
| 5 | Google Gemini | gemini | gemini-2.0-flash | low |
| 6 | DeepSeek | deepseek | deepseek-chat | low |
| 7 | Z.AI GLM | zai | glm-4.7 | free |
| 8 | Alibaba Qwen | qwen | qwen-max | medium |
| 9 | Cohere | cohere | command-r-plus | medium |
| 10 | NVIDIA NIM | nim | llama-3.1-nemotron-70b | medium |
| 11 | Kimi (Moonshot) | kimi | kimi-k2-instruct | medium |
| 12 | Ollama (local) | ollama | user-pulled | free |
Operator endpoint: GET /api/llm/manifest?surface={web|mobile|desktop|cli|mcp|sdk} returns the configured/unconfigured state per provider for the calling user. Raw keys are never returned (KURAL 23).
Sprint 43 ship surfaced a control-panel bug where only 4 of the 12 providers rendered. Root cause: a hard-coded 4-entry list inside one route module. Drift like that recurs whenever marketing copy and code disagree on a count. This page pins the counts on the public surface, and a CI test (tests/test_sprint37_phase1_ai_cli_llm_copy.py) blocks PRs that re-introduce the dropped seven-CLI or six-provider claims.