Fourth LLM provider: NVIDIA API Catalog with Kimi K2.6 as new default
rmerk adds `backend/src/lib/llm/nvidia.ts` as a fourth provider alongside Claude, Gemini, and OpenAI, targeting NVIDIA's OpenAI-compatible endpoint at `integrate.api.nvidia.com/v1`. Kimi K2.6 becomes the new default model for chat, titles, and tabular review - replacing the prior Gemini default across the board.
The provider file is 327 LOC implementing streaming and multi-turn tool calls against the Chat Completions endpoint. Routing is via a slash-based heuristic in providerForModel: NVIDIA catalog IDs use a vendor/name shape, which no existing provider uses, so model.includes("/") reliably dispatches to the new branch. The three main NVIDIA models registered are moonshotai/kimi-k2.6, meta/llama-3.3-70b-instruct, and deepseek-ai/deepseek-r1, plus mid and low tiers with Llama 3.1 70B and 8B.
NVIDIA_BASE_URL is overridable via env, which means the same provider file works against a self-hosted NIM, a local Ollama instance, or vLLM - any OpenAI-compatible server. That's a practical escape hatch if you want the abstraction without a hard dependency on NVIDIA's hosted endpoint.
Two things worth checking before importing. First, the default model swap is global: DEFAULT_MAIN_MODEL, DEFAULT_TITLE_MODEL, and DEFAULT_TABULAR_MODEL all move to moonshotai/kimi-k2.6. Any environment without an NVIDIA_API_KEY will fail on those defaults where previously it might have worked with a Gemini key. Second, per-user NVIDIA key storage doesn't work yet. The ApiKeyProvider union gains "nvidia" in TypeScript, but the DB CHECK constraint on user_api_keys still rejects it. The UI path for per-user NVIDIA keys produces an error until a migration relaxes that constraint. For now, NVIDIA_API_KEY is env-only.
modelAvailability.ts gains an "nvidia" branch so the frontend picker doesn't grey out NVIDIA models regardless of which env keys are present. Without that companion change, the UI would show the models as unavailable even when the backend could serve them.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?