Provider setup and conformance matrix¶
This is the user-facing mirror of the 70-entry PROVIDERS catalog in
src/providers.rs. The base URL, request style, default
model, and environment variable below are the exact current catalog values, not
recommendations inferred from a vendor's marketing page.
Set the listed environment variable and use /login <id> to select the row.
/login also pins one entry that is deliberately not in this catalog:
TypeSafe · Jev (id typesafe), shown first with its own borders. It is a
credential that gives every provider typed judgments, not a chat model, so
selecting it stores a key and never becomes your active provider. It can also
run with no key at all against a local engine (NUR_JEV_LOCAL_URL; see
jev-local.md). See typesafe.md.
Enclave · security agents (id enclave) is pinned beside it on the same
terms: Enclave serves MCP, not chat, so its key (ENCLAVE_MCP_API_KEY) gives
every provider Enclave's security agents through the enclave tool. See
enclave.md.
R means Nur sends the Responses shape (/responses); CC means Chat
Completions (/chat/completions); AM means the native Anthropic Messages
shape (/v1/messages); and GCC means Google's Cloud Code native
v1internal:streamGenerateContent path. A vendor's OpenAI-compatible claim is
not, by itself, evidence that every model supports tools, streaming, or
authoritative usage. Unless the caveat says otherwise, verify those three
features for the selected model and account before relying on them for an
agent/budget workflow.
Official links are first-party documentation only. Not established is
intentional: it means the linked public documentation does not establish the
capability for this exact Nur route/model, so Nur must treat it as unverified.
| ID / provider | Auth, exact route, default model | First-party docs | Tool / stream / usage caveat | Setup note |
|---|---|---|---|---|
meta - Meta Model API |
META_API_KEY / MODEL_API_KEY; https://api.meta.ai/v1; R; muse-spark-1.2 |
Meta Model API models | Muse Spark is multimodal (text, image, video, PDF); verify tools/stream/usage for your account. | Catalog default vendor. Browser: Muse Code (muse login) or paste a key. /model lists muse-spark-1.1, muse-spark-1.2, muse-spark-1.2-contributor. |
openai - OpenAI |
OPENAI_API_KEY; https://api.openai.com/v1; R; gpt-5.5 |
OpenAI API | Official Responses docs cover streaming, tools, and usage, subject to model availability. | API key or Nur's ChatGPT OAuth login. |
openai-cc - OpenAI (Chat Completions) |
OPENAI_API_KEY; https://api.openai.com/v1; CC; gpt-5.5 |
Chat Completions | Chat route is retained for compatibility; feature availability is model-specific. | Same key as openai; prefer openai unless a Chat-only endpoint is required. |
anthropic - Anthropic |
ANTHROPIC_API_KEY; https://api.anthropic.com/v1; AM; claude-sonnet-5 |
Messages API | Official Messages docs cover streaming, tools, and usage. | API key or supported browser OAuth. |
google - Google Gemini |
GEMINI_API_KEY; https://generativelanguage.googleapis.com/v1beta/openai; CC; gemini-3.1-pro-preview |
Gemini OpenAI compatibility | Compatibility and feature support are model-specific; verify tool and usage fields. | Gemini key or gcloud SSO; keep the -preview suffix for this first-party route. |
antigravity - Antigravity |
GEMINI_API_KEY; https://cloudcode-pa.googleapis.com; GCC; gemini-2.5-flash |
Gemini Code Assist | Cloud Code is a native OAuth route. Public Gemini API docs do not establish tool/stream/usage conformance for it. | Use agy/gcloud OAuth and a project ID, not a Gemini key against the OpenAI-compatible host. |
xai - xAI Grok |
XAI_API_KEY; https://api.x.ai/v1; CC; grok-4.5 |
xAI API | Verify tool/stream/usage on the chosen Grok model. | API key or supported browser login. |
deepseek - DeepSeek |
DEEPSEEK_API_KEY; https://api.deepseek.com/v1; CC; deepseek-v4-flash |
DeepSeek API | Verify OpenAI-compatible tools and usage for the chosen model. Official models: deepseek-v4-flash, deepseek-v4-pro. |
Import $DSH_HOME/.credentials.yaml from DeepSeek Harness, or paste a platform key. No official OAuth. |
mistral - Mistral |
MISTRAL_API_KEY; https://api.mistral.ai/v1; CC; mistral-large-latest |
Mistral API | Tool/stream/usage support depends on model and endpoint. | Create an API key in Mistral's console. |
cohere - Cohere |
COHERE_API_KEY; https://api.cohere.ai/compatibility/v1; CC; command-a-03-2025 |
Cohere OpenAI compatibility | Compatibility coverage is not a blanket tools/usage guarantee. | Use a Cohere API key. |
ai21 - AI21 |
AI21_API_KEY; https://api.ai21.com/studio/v1; CC; jamba-large |
AI21 Studio | Not established publicly for this exact CC route/model. | Create a Studio key. |
reka - Reka |
REKA_API_KEY; https://api.reka.ai/v1; CC; reka-core |
Reka API | Not established publicly for full tools/stream/usage conformance. | Create a Reka API key. |
inception - Inception (Mercury) |
INCEPTION_API_KEY; https://api.inceptionlabs.ai/v1; CC; mercury-2 |
Inception API | Verify CC tools/stream/usage for the account's live catalog. | The catalog's current public default is mercury-2. |
writer - Writer (Palmyra) |
WRITER_API_KEY; https://api.writer.com/v1; CC-compatible; palmyra-x5 |
Writer chat endpoint | Writer uses its first-party POST /v1/chat path, not /chat/completions; Nur routes it explicitly. |
Create a Writer API key. |
upstage - Upstage (Solar) |
UPSTAGE_API_KEY; https://api.upstage.ai/v1; CC; solar-pro3 |
Upstage console | Tool and detailed usage fields remain model-specific. | Create an Upstage key for Solar. |
thinkingmachines - Thinking Machines |
TINKER_API_KEY; https://tinker.thinkingmachines.dev/services/tinker-prod/oai/api/v1; CC; thinkingmachines/Inkling |
Tinker docs | Live model list is key-scoped; public docs do not establish all CC features. | Set the key, then use /model to inspect models available to it. |
poolside - Poolside |
POOLSIDE_API_KEY; https://inference.poolside.ai/v1; CC; poolside/laguna-m.1 |
Poolside Platform | Verify tools/stream/usage for the selected Platform deployment. | For self-hosted Platform use https://<domain>/openai/v1. |
huggingface - Hugging Face |
HF_TOKEN; https://router.huggingface.co/v1; CC; meta-llama/Llama-3.3-70B-Instruct |
Inference Providers | Features vary by routed provider/model; no universal tools or usage guarantee. | Create an HF access token. |
azure - Azure OpenAI |
AZURE_OPENAI_API_KEY; https://YOUR_RESOURCE.openai.azure.com/openai/v1; CC; gpt-5.5 |
Azure OpenAI REST | Deployment, API version, tools, and usage are resource/model-specific. | Replace YOUR_RESOURCE; API key or supported az login flow. |
bedrock - Amazon Bedrock |
AWS_BEARER_TOKEN_BEDROCK; https://bedrock-runtime.YOUR_REGION.amazonaws.com/openai/v1; CC; us.amazon.nova-lite-v1:0 |
Bedrock OpenAI compatibility | Compatibility and tool/usage support are model and region-specific. | Replace YOUR_REGION; use /model for models entitled in that region. |
groq - Groq |
GROQ_API_KEY; https://api.groq.com/openai/v1; CC; llama-3.3-70b-versatile |
Groq API | Verify tools and reported usage for the selected model. | Create a Groq API key. |
liquidinference - Liquid Inference |
LIQUID_API_KEY; https://router.inference.ai.exchange/v1; CC; liquid.auto:balanced |
Liquid Inference | Auction exchange: each request is quoted across providers and capped before the first token (x-liquid-cap-usd); the settled charge is in the exchange block of the response. Tool support is per model; GET /v1/models lists models that accept tools. :smartest / :fastest / :cheapest suffixes re-rank. |
Create a spend-scope key (sk-liquid-…). |
cerebras - Cerebras |
CEREBRAS_API_KEY; https://api.cerebras.ai/v1; CC; gpt-oss-120b |
Cerebras Inference | Verify compatibility features by model tier. | Create a Cerebras API key. |
together - Together AI |
TOGETHER_API_KEY; https://api.together.xyz/v1; CC; meta-llama/Llama-3.3-70B-Instruct-Turbo |
Together API | Tool and usage support varies by served model. | Create a Together API key. |
fireworks - Fireworks AI |
FIREWORKS_API_KEY; https://api.fireworks.ai/inference/v1; CC; accounts/fireworks/models/llama-v3p3-70b-instruct |
Fireworks API | Verify tool calling and usage on this model. | Create a Fireworks key. |
deepinfra - DeepInfra |
DEEPINFRA_API_KEY; https://api.deepinfra.com/v1/openai; CC; meta-llama/Llama-3.3-70B-Instruct-Turbo |
DeepInfra API | Compatibility does not establish full feature parity. | Use the -Turbo model spelling used by this host. |
novita - NovitaAI |
NOVITA_API_KEY; https://api.novita.ai/openai; CC; minimaxai/minimax-m1-80k |
Novita API | Not established publicly for full tools/stream/usage conformance. | Create a Novita key. |
hyperbolic - Hyperbolic |
HYPERBOLIC_API_KEY; https://api.hyperbolic.xyz/v1; CC; meta-llama/Llama-3.3-70B-Instruct |
Hyperbolic API | Verify model-level support. | Create a Hyperbolic API key. |
nebius - Nebius Token Factory |
NEBIUS_API_KEY; https://api.tokenfactory.nebius.com/v1; CC; Qwen/Qwen3.5-397B-A17B-fast |
Nebius Token Factory | Verify compatibility features for the selected endpoint/model. | Create a Nebius API key. |
sambanova - SambaNova |
SAMBANOVA_API_KEY; https://api.sambanova.ai/v1; CC; Meta-Llama-3.3-70B-Instruct |
SambaNova Cloud API | Not established publicly for full tools/usage conformance. | Create a SambaNova key. |
nvidia - NVIDIA NIM |
NVIDIA_API_KEY; https://integrate.api.nvidia.com/v1; CC; meta/llama-3.3-70b-instruct |
NVIDIA API catalog | Tool/stream/usage is model-specific. | Create an NVIDIA API key. |
perplexity - Perplexity |
PERPLEXITY_API_KEY; https://api.perplexity.ai/v1; R (Agent API); perplexity/sonar |
Agent API | Sonar's Chat Completions endpoint was retired on 2026-09-27. The Agent API takes provider/model ids (perplexity/sonar, anthropic/..., openai/..., google/..., xai/...) and a narrower Responses schema; nur fits each request to it (no replayed reasoning, text-only assistant turns, image URLs up to 2048 characters). Perplexity's hosted web_search tool is not enabled; nur's own web tools are offered instead. |
Create a Perplexity API key. |
baseten - Baseten |
BASETEN_API_KEY; https://inference.baseten.co/v1; CC; deepseek-ai/DeepSeek-V3-0324 |
Baseten API | Not established publicly for full OpenAI-tool conformance. | Create a Baseten API key. |
friendli - Friendli |
FRIENDLI_TOKEN; https://api.friendli.ai/serverless/v1; CC; Qwen/Qwen3-235B-A22B-Instruct-2507 |
Friendli API | Live serverless catalog and features can change; verify before use. | Use a Friendli token. |
chutes - Chutes |
CHUTES_API_TOKEN; https://llm.chutes.ai/v1; CC; deepseek-ai/DeepSeek-V3.2-TEE |
Chutes API | Verify tools/stream/usage for the chosen chute. | Use a Chutes API token; this model requires its -TEE suffix. |
venice - Venice AI |
VENICE_API_KEY; https://api.venice.ai/api/v1; CC; zai-org-glm-5-1 |
Venice Chat Completions | Current docs expose function calls, required usage, and prompt-cache affinity; model capabilities still vary. | Create a Venice key. Nur forwards its stable session cache key on this route. |
kimi - Kimi Code (kimi.com) |
KIMI_API_KEY; https://api.kimi.com/coding/v1; CC; kimi-for-coding |
Kimi Code | Managed coding route; public docs do not establish full OpenAI-tool conformance. | API key or supported browser OAuth. |
moonshot - Moonshot AI |
MOONSHOT_API_KEY; https://api.moonshot.ai/v1; CC; kimi-k2.7-code |
Moonshot API | Verify model-specific tools/stream/usage. | Platform API key, distinct from Kimi Code OAuth. |
zhipu - Z.AI |
ZAI_API_KEY; https://api.z.ai/api/paas/v4; CC; glm-5.2 |
Z.AI API · ZCode connect | Coding Plan / ZCode OAuth uses https://api.z.ai/api/coding/paas/v4 and glm-5.3. |
zcode login, or paste a key. Do not point a Coding Plan key at /api/paas/v4. |
paperinstruments - Paper Instruments |
PAPERINSTRUMENTS_API_KEY; https://api.paperinstruments.com/v1; CC; ultramarine-1-flash |
Ultramarine API · Chat completions | One model, a GLM-5.3 Flash post-train for finance, law, consulting and operations deliverables (Excel, PowerPoint, Word). Docs cover function tools, streaming with usage and cached_tokens. Reasoning is mandatory: the effort ladder is low/high/max (/effort medium lands on high), and the output ceiling is 32,768 tokens including reasoning. Also speaks Responses and Messages; nur uses Chat Completions. |
Create a key at platform.paperinstruments.com. Nur sends the sticky x-session-id header so turns stay on one deployment. |
qwen - Alibaba Qwen (DashScope) |
DASHSCOPE_API_KEY; https://dashscope-intl.aliyuncs.com/compatible-mode/v1; CC; qwen-max |
DashScope OpenAI compatibility | Tool/stream/usage depend on Qwen model and region. | Use an international DashScope key for this endpoint. |
minimax - MiniMax (minimaxi.com) |
MINIMAX_API_KEY; https://api.minimaxi.com/anthropic/v1; AM; MiniMax-M2.7 |
MiniMax API overview | Anthropic compatibility does not establish every Anthropic telemetry field; the direct catalog currently documents M2.7/M2.5 families. | Use a MiniMax API key; preserve model casing. |
stepfun - StepFun (China) |
STEPFUN_API_KEY; https://api.stepfun.ai/v1; CC; step-3.5-flash-2603 |
StepFun models | Reasoning and tool behavior are model-specific; Nur uses the current documented agent model instead of the nonexistent step-3.7-flash. |
Create a StepFun API key. |
baichuan - Baichuan |
BAICHUAN_API_KEY; https://api.baichuan-ai.com/v1; CC; Baichuan4 |
Baichuan API | Not established publicly for full tools/usage conformance. | Create a Baichuan API key. |
openrouter - OpenRouter |
OPENROUTER_API_KEY; https://openrouter.ai/api/v1; CC; openai/gpt-5.5 |
OpenRouter API | Router features and usage vary by upstream model/provider. | Create one OpenRouter key; use namespaced model ids. |
experiential - Experiential Labs |
EXPLABS_API_KEY; https://api.experientiallabs.ai/v1; CC; claude-sonnet-5 |
Experiential Labs docs · Model catalog | 1,100+ models behind per-model provider waterfalls; also speaks Responses, /messages and the System One judgment schema on the same key. Model slugs are bare (claude-opus-5, kimi-k3), not namespaced. |
Create an xpl_ key at platform.experientiallabs.ai; BYOK or credits, with free tiers. One key also unlocks nur jev use --engine jev-via-experiential. |
opendesign - OpenDesign |
OPENDESIGN_API_KEY; https://amr-link.open-design.ai/v1; CC; deepseek-v4.1-flash |
OpenDesign model credits & API · Pricing | The console's "Connection setup" offers Chat Completions, Responses and Anthropic Messages on the same host; Nur uses Chat Completions. API calls spend the same Design Plan / plan model credits as the desktop app (Go: 5-hour and 7-day windows). Ids use dotted versions (deepseek-v4.1-flash, kimi-k2.7-code, claude-sonnet-5.5); /model lists what your plan can call. |
Create a key at open-design.ai/cloud/api-keys (any paid plan, Go upward). |
cline - Cline |
CLINE_API_KEY; https://api.cline.bot/api/v1; CC; anthropic/claude-sonnet-5 |
Cline API · Models | Official docs cover streaming, tool calling, usage.cost, and delta.reasoning; capability is per model (supportsImages / supportsReasoning). |
Account sign-in (cline auth cline) or an API key from app.cline.bot. Ids are OpenRouter-style vendor/model and must not be rewritten. |
commandcode - Command Code |
COMMAND_CODE_API_KEY / CMD_API_KEY; https://api.commandcode.ai/provider/v1; CC with per-model AM; deepseek/deepseek-v4-flash |
Command Code Provider API | One gateway, 70+ models. Claude ids cannot use /chat/completions on this host; Nur routes those to /messages automatically. |
First-party studio sign-in (same flow as cmd login) or a Studio key. See authentication.md for the credential map. |
requesty - Requesty |
REQUESTY_API_KEY; https://router.requesty.ai/v1; CC; openai/gpt-5.5 |
Requesty docs | Router compatibility does not establish upstream tools/usage. | Create a Requesty key and select a routed model. |
glama - Glama |
GLAMA_API_KEY; https://gateway.glama.ai/v1; CC; openai/gpt-5.6-terra |
Glama AI Gateway API | Gateway support does not guarantee identical upstream tool/usage fields. | Create a Glama key; catalog default is namespaced. |
portkey - Portkey |
PORTKEY_API_KEY; https://api.portkey.ai/v1; CC; @openai/gpt-5.5 |
Portkey API | Virtual-key routing governs upstream features and billing usage. | Replace @openai with your virtual-key slug via /model. |
litellm - LiteLLM Proxy |
LITELLM_API_KEY optional; http://localhost:4000/v1; CC; gpt-5.5 |
LiteLLM Proxy | Local proxy configuration determines tools/stream/usage. | Start/configure your proxy; key is optional in this catalog row. |
vercel - Vercel AI Gateway |
AI_GATEWAY_API_KEY; https://ai-gateway.vercel.sh/v1; CC; openai/gpt-5.5 |
Vercel AI Gateway | Gateway passes model-specific feature and usage semantics. | Create an AI Gateway key. |
cloudflare - Cloudflare AI Gateway |
CLOUDFLARE_API_TOKEN; https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/ai/v1; CC; openai/gpt-5.5 |
Cloudflare REST API | The old unified gateway.ai.cloudflare.com compatibility path is deprecated; upstream tools/usage remain model-specific. |
Replace YOUR_ACCOUNT_ID; authenticate with a Cloudflare API token. |
featherless - Featherless |
FEATHERLESS_API_KEY; https://api.featherless.ai/v1; CC; Qwen/Qwen3.5-397B-A17B |
Featherless tool calling | Native function calling is documented for Qwen 3 and Kimi K2 families, not every hosted model. | Create a Featherless key; Nur defaults to a current Qwen 3.5 model instead of a Llama model that required a JSON workaround. |
nano-gpt - NanoGPT |
NANOGPT_API_KEY; https://nano-gpt.com/api/v1; CC; openai/gpt-5.6-terra |
NanoGPT API | Verify routed model support and usage fields. | Create a NanoGPT key; use namespaced modern model ids. |
opencode - OpenCode |
OPENCODE_API_KEY; https://opencode.ai/zen/v1; model-routed R/AM/Gemini-native/CC; claude-sonnet-5 |
OpenCode Zen endpoints | Nur follows the live model table: GPT/Grok use Responses; Claude and Qwen 3.5-3.7 use Messages; Gemini uses native GenerateContent; DeepSeek/MiniMax/GLM/Kimi/free models use CC. | Use opencode auth login; Go-family models route to /zen/go/v1 with the same model-specific protocol selection. |
nous - Nous Portal |
NOUS_API_KEY; https://inference-api.nousresearch.com/v1; CC; stealth/ox-alpha |
Nous Portal | One endpoint reaches 300+ first-party and frontier ids (including a free tier); tools/stream/usage are per model. | Hermes Agent sign-in (hermes auth add nous) is imported automatically, or paste a NOUS_API_KEY. |
github-models - GitHub Models |
GITHUB_TOKEN; https://models.github.ai/inference; CC; openai/gpt-5 |
GitHub Models | Model availability and usage limits are account-specific. | Use gh auth or a PAT with GitHub Models access. |
github-copilot - GitHub Copilot |
COPILOT_GITHUB_TOKEN; https://api.githubcopilot.com; CC; gpt-5.5 |
Copilot API | Subscription APIs and model/tool availability are entitlement-specific. | Use supported gh OAuth or a fine-grained PAT. |
cursor - Cursor |
CURSOR_API_KEY; https://api2.cursor.sh; CC catalog placeholder; auto |
Cursor CLI | Not CC: Nur uses cursor-agent -p; public docs do not establish API tools/stream/usage receipts. |
Run cursor-agent login; no pasted key is required for CLI chat. |
factory - Factory Droid |
FACTORY_API_KEY (optional); https://app.factory.ai CC catalog placeholder; claude-sonnet-5 |
Droid Exec | Not HTTP: every round is droid exec --output-format json in read-only spec mode with nur's tools offered through the nur-tools fence; --session-id is reused so later rounds ship only the delta. Usage is reported only when the CLI returns it. NUR_DROID_NATIVE=1 delegates the task to Droid itself with --auto (NUR_DROID_AUTO, default medium). Model ids: /model asks the installed CLI (droid exec --help, cached per binary under ~/.nur/cache/droid-models.json, warmed at startup); the Factory-managed catalog is only the fallback. |
Install the CLI (curl -fsSL https://app.factory.ai/cli \| sh or npm i -g @factory/cli), then sign in once with droid - /login → Factory Droid → browser imports that OAuth session (nothing secret is copied; the sealed keyring stays with the CLI). A pasted fk-… key still works. Nur looks for droid in ~/.factory/bin, ~/.local/bin, ~/bin, the local programs directory, the Factory desktop app's bundle (%LOCALAPPDATA%\Factory\app-*\resources\bin, /Applications/Factory.app/Contents/Resources/bin) and PATH, and uses the most recently built one - an installer launcher that is never run does not self-update, and an old build hides the models its catalog predates. Set NUR_DROID_BIN to pin a specific binary. |
helicone - Helicone AI Gateway |
HELICONE_API_KEY; https://ai-gateway.helicone.ai/v1; CC; gpt-5.4 |
Helicone Gateway | Gateway observability is not authoritative upstream usage unless its docs/provider response expose it. | Create a Helicone key; this gateway currently uses bare model ids. |
aimlapi - AI/ML API |
AIMLAPI_KEY; https://api.aimlapi.com/v1; CC; openai/gpt-5.6-terra |
AI/ML API docs | Router conformance is model-specific. | Create an AI/ML API key. |
ollama - Ollama (local) |
OLLAMA_API_KEY optional; http://localhost:11434/v1; CC; local-model (resolved from /models) |
Ollama OpenAI compatibility | Local server/model determines tools, streaming, and usage; no remote billing receipt. | Run Ollama and pull a model; Nur selects an installed model instead of assuming llama3.3. |
lmstudio - LM Studio (local) |
LMSTUDIO_API_KEY optional; http://localhost:1234/v1; CC; local-model |
LM Studio API | Installed server/model determines feature and usage fields. | Start the local server; Nur resolves the first live model from /models, and /model remains available for an explicit choice. |
llamacpp - llama.cpp (local) |
LLAMACPP_API_KEY optional; http://localhost:8080/v1; CC; local-model |
llama-server | Server build/model determines tools and usage; no remote billing receipt. | Start llama-server; Nur resolves its loaded model from /models. |
vllm - vLLM (local) |
VLLM_API_KEY optional; http://localhost:8000/v1; CC; local-model |
vLLM tool calling | Installed version, model, chat template, and tool parser determine agent behavior. | Start the OpenAI-compatible server; Nur resolves the served model from /models. Configure the model's documented tool parser for agent use. |
jan - Jan (local) |
JAN_API_KEY optional; http://localhost:1337/v1; CC; local-model |
Jan API server | Local runtime/model determines tool, stream, and usage behavior. | Start Jan's API server; Nur resolves the active model from /models. |
Prompt caching¶
Every provider that caches prompts does so by prefix: a request is served from cache up to the first byte that differs from an earlier one. Nur shapes every request so that prefix is as long and as stable as it can be:
- The system prompt is static for the session. Permission mode, the todo
list and the session inventories (goal, harness, context variables, routed
memory) are not in it. They ride as the last input item of each request,
headed
[nur turn state], which is rebuilt per request and never persisted into the history. The prompt the model reads is byte-identical from the first request of a turn to the last, whatever mode you switch to in between. - The full tool roster is sent on every request, in a stable order, so the schemas are cached once instead of re-read every time the offered set changes.
- Skill activation is a conversation item, not a prompt edit: when a skill fires, its body is appended after the user message and cached with the history.
- Anthropic cache breakpoints sit on the system prompt and the tool roster, then roll along the conversation; the turn-state block never carries one.
- Session affinity. Several backends shard their caches per session and
only serve a prefix from the replica that already holds it. Nur sends one
stable id, derived from the nur session id (so it survives
/model,/resumeand failover), as whichever header the route understands:x-opencode-sessionon the OpenCode Go route (gated on the URL, so a custom provider pointed at Go gets it too),session_idon the Codex OAuth path,x-session-affinityon Fireworks, andx-session-idon Paper Instruments. OpenAI-style routes also setprompt_cache_keyto the session id. - Compaction is cache-aware: pruning happens in the oldest part of the transcript only when the window is actually full, which is the one moment the prefix has to change anyway.
What you see: when a provider reports cached tokens, each request posts a
transient status line, prompt cache · 84% of input read from cache (31k of
37k tok), in the TUI footer (printed in nur run --verbose). Cached tokens are
priced at the model's cache-read rate in the cost estimate. E2E scenario 31
asserts the stable prefix across a whole turn.
Catalog conformance check¶
The matrix must have exactly 70 data rows, matching PROVIDERS.len(). A row
is a catalog contract, not a promise that a remote model is available to every
account. The primary expected catalog mismatches are intentional placeholders:
azurerequiresYOUR_RESOURCE.bedrockrequiresYOUR_REGIONand region/model entitlement.cloudflarerequiresYOUR_ACCOUNT_ID.cursoris acursor-agentCLI integration despite its catalog CC marker.- Local rows and LiteLLM intentionally use optional keys and depend on a user-operated server.