ANTHROPIC_BASE_URL (Claude Code) or OPENAI_BASE_URL (Codex) pointing at it, plus a session token. No executor, workspace or harness ever holds a provider key.
What passes through it
- Every turn of an agent on Claude Code, Codex or OpenCode.
- xpander’s own model calls: thread titles, context compaction, evaluation judges, and the gateway model that filters entries ahead of the agent’s model.
- Guardrail moderation, when enabled.
On a self-hosted install
The controller forwards calls to the LLM Gateway in the cluster:- The gateway is always on. It applies allowed models, provider keys, fallbacks and budgets, and logs every call.
- Every provider your agents use needs a key, saved in the organization or set on the install (
secrets.static). Otherwise the call is refused with a message naming the missing key. - New runs wait for a healthy gateway. See LLM Gateway on a self-hosted install.
- Preflight refuses an install with no provider for model calls: an organization default, a gateway provider, or a per-provider in-cluster endpoint must exist.
Where it is configured
The organization’s default provider sets a new agent’s harness: Anthropic gives Claude Code, Amazon Bedrock with an Anthropic model gives Claude Code on Bedrock, OpenAI gives Codex, any other provider gives OpenCode on that model.
Any model on any harness
The gateway translates between each harness’s API and each provider’s API. So Claude Code, Codex and OpenCode can each run any model your organization allows, not only their own vendor’s models. On an Air-Gapped install, all three harnesses can run the model of your own provider (for example vLLM on your own GPUs).- Pick the model in the composer’s Harness and model picker. See Harness and model.
- A harness lists its own vendor’s models, plus models from other vendors that passed xpander’s test on that harness: chat, a tool call, streaming, long context and images (when the model accepts images). Untested pairs are not listed.
- A model from your own provider is listed for a harness after an admin runs Test model on it for that harness and it passes.
- Each turn is recorded in Platform > AI governance > Logs with the model that ran it.
- A personal Claude or ChatGPT plan applies only to its own vendor’s models. A model from another vendor runs on the organization’s providers.
Routing through a gateway you already run
Each provider’s upstream is an environment variable on the Agent Controller, so your own AI gateway can sit between xpander and the vendor:
The controller egresses to
api.anthropic.com by default. With an override, the override is the only host it needs. xpander applies its policy, budget and record before the call leaves. Your gateway’s other clients stay outside xpander’s controls.
Verify
1
Check the Agent Controller
2
Check the LLM Gateway pods
llm-gw pods (one on a single-node cluster installed with install.sh), each 1/1 and Running.3
Check the product
The Locations tab of Platform > Agents > Runtime shows the installation as Connected. A model call appears in the task’s usage and in Platform > AI governance > Logs.
Next steps
Set up providers and keys
On a self-hosted install.
Run a local model air-gapped
Local LLM inference.
Manage LLM keys on Hybrid
Where provider keys live.

