Models (BYOK)
Level 0 never calls a model
Deterministic replay — the default, and the only thing that runs unless you pass --max-level — never touches an LLM. This is true by construction, not convention: no LLM client is ever constructed at --max-level 0. You can run Reelier with zero model configuration and zero model spend, indefinitely.
Bring your own key
Escalation (L1/L2, opt-in) is the only place a model is ever called, and it speaks through one narrow BYOK surface. Two wire adapters, chosen by your base URL’s host:
- Native Anthropic Messages API for
api.anthropic.com. - OpenAI-compatible chat-completionsfor every other host — OpenRouter, Ollama, Gemini’s OpenAI-compat endpoint, Groq, vLLM, LM Studio, Kimi (Moonshot), or anything else that speaks the same chat-completions shape.
Kimi (Moonshot) — a worked example
Kimi isn’t a special integration; it rides the same OpenAI-compatible path as every non-Anthropic provider. Point the base URL at Moonshot’s endpoint and it works:
REELIER_LLM_BASE_URL=https://api.moonshot.ai/v1 \ REELIER_LLM_API_KEY=<your-moonshot-key> \ REELIER_LLM_MODEL=kimi-k2-0711-preview \ reelier run skills/my-skill.skill.md --max-level 1
As with any provider, the key is used only on escalation — Level-0 replay calls no model, so a skill that never diverges never sends a token to Kimi or anyone else.
Point at a different endpoint with flags or env vars — resolved flags > env vars > defaults:
| Flag | Env var | Default | |
|---|---|---|---|
| Base URL | --llm-base-url | REELIER_LLM_BASE_URL | https://api.anthropic.com |
| API key | --llm-api-key | REELIER_LLM_API_KEY (falls back to ANTHROPIC_API_KEY only on the default Anthropic host) | none — required only when a step actually diverges |
| L1 model | --llm-model | REELIER_LLM_MODEL | claude-haiku-4-5-20251001 |
| L2 model | --llm-l2-model | REELIER_LLM_L2_MODEL | claude-sonnet-5 |
reelier run skills/my-skill.skill.md --max-level 1 \ --llm-base-url https://openrouter.ai/api/v1 \ --llm-api-key sk-... \ --llm-model <model-id>
The key is only checked when it’s needed
The API key is required, and only checked, the first time a step actually escalates — a --max-level 1run whose skill never diverges never needs a key at all. Your LLM API key is never received or stored by Reelier Cloud; it’s a local CLI flag/env var, sent directly to whichever endpoint you configured.
What escalation actually sees
On divergence, the prompt sent to your configured LLM includes the step’s text, the failure messages, and a bounded summary of the tool’s response (status, body truncated to ~2000 chars, a truncated sample of extracted values) — never the full unredacted body, but still real data from your workflow. This goes only to the endpoint you pointed --llm-base-url at.
Better models help for free
Reelier doesn’t bundle or fine-tune a model. Point --llm-base-urlat a stronger one and every skill’s next self-heal gets smarter, without recompiling anything by hand.