# Claude Code Facts from the Claude Code documentation (2026-10-15): - Model: `--model`, `/model`, `ANTHROPIC_MODEL`, `model` in settings; aliases `haiku`, `sonnet`, `opus`, `fable`, `opusplan` (Opus in plan mode, Sonnet to execute); `CLAUDE_CODE_SUBAGENT_MODEL`; a sub-agent can pin `model` and `effort` in its frontmatter. - Effort: `--effort`, `/effort`, `CLAUDE_CODE_EFFORT_LEVEL`, `effortLevel` in settings; levels `low`, `medium`, `high`, `xhigh`, `max` (`max` not accepted in `effortLevel`); `ultrathink` in a prompt raises depth for one turn. - Gateway: `ANTHROPIC_BASE_URL` + `ANTHROPIC_AUTH_TOKEN`. **Anthropic does not support routing Claude Code to non-Claude models through a gateway**: keep the pool to Claude models. - With `CLAUDE_CODE_GATEWAY_HINT_HEADERS=1` (v2.1.273+) a custom gateway receives `x-claude-code-session-id`, `x-claude-code-prompt-id` (one id per user prompt), `x-claude-code-request-class` (`main`, `subagent`, `workflow`, `compaction`, `auxiliary`). ## 1. Simplest: choose at launch (*documented flags, router untested*) ```bash python integrations/serve.py --model scombat/s1d1-router --policy integrations/policy.example.yaml & python integrations/routed.py claude "refactor the parser and add tests" ``` `routed.py` asks the router about your first prompt and starts `claude --model --effort ""`. The session keeps that model; use `/model` and `/effort` to change it. Nothing is intercepted. ## 2. Per request, through a gateway (*untested end to end*) ```bash export ANTHROPIC_BASE_URL=http://localhost:4000 export ANTHROPIC_AUTH_TOKEN= export CLAUDE_CODE_GATEWAY_HINT_HEADERS=1 claude --model s1d1-auto ``` with the LiteLLM hook of `02-litellm.md` (A). The hook routes on the last human text of the request (tool results are skipped), remembers one decision per `x-claude-code-prompt-id`, and leaves `auxiliary` requests alone. Cautions from the gateway guide: - keep forwarding `anthropic-beta`/`anthropic-version` and the `system` array unchanged; do not rewrite bodies except `model` and the effort field; - changing the model between turns can make the API reject old thinking blocks ("bound to a different conversation"); Claude Code then drops earlier thinking and retries, at the price of the cache. This is why the policy is escalate-only per session; - a rejected `output_config.effort` is retried without it by Claude Code. ## 3. No router at all: the same policy as static settings ```json { "model": "sonnet", "effortLevel": "medium", "availableModels": ["haiku", "sonnet", "opus", "fable"] } ``` plus `CLAUDE_CODE_SUBAGENT_MODEL=haiku` for exploration sub-agents, a sub-agent frontmatter with `model: haiku` and `effort: low` for cheap searches, and `opusplan` to plan with Opus and execute with Sonnet. The router replaces these fixed choices with a choice per prompt.