API reference

The ModelPanel CLI, HTTP endpoints, response headers, virtual models, environment variables, and file layout.

CLI

npx modelpanel serve
npx modelpanel add-key <provider>
npx modelpanel models
npx modelpanel status
npx modelpanel doctor
serve cmd OPTIONAL

Start the gateway on 127.0.0.1:8787 (spawns the fusion sidecar on 127.0.0.1:8791). Flags: —host, —port — or the MODELPANEL_HOST / MODELPANEL_PORT env vars.

add-key cmd REQUIRED

Prompted key entry for a provider — stored in ~/.modelpanel/keys.json (chmod 600) with a tier flag. Env alternative: MODELPANEL_<PROVIDER>_API_KEY wins over the vault file.

models cmd OPTIONAL

Print the merged registry view — every probe-verified model with its task class and tier.

status cmd OPTIONAL

Probe summary and recent changelog.

doctor cmd OPTIONAL

Key validity check per provider.

HTTP endpoints

EndpointDialectNotes
POST /v1/chat/completionsOpenAI Chat Completionsstreaming + non-streaming, tools, JSON-schema response format
POST /v1/responsesOpenAI Responses (priority dialect)typed stream events, previous_response_id via TTL store, built-in tools rejected with a clear 400
POST /v1/messagesAnthropic Messagesstreaming + non-streaming, tool_use blocks, Claude Code drop-in
GET /v1/modelsmerged registry view; per-provider discovery, tagged with task class and tier
GET /healthgateway + fusion sidecar status

Response headers

Every response says who served:

HeaderMeaning
x-modelpanel-providerThe provider that served the request
x-modelpanel-modelThe model that served the request
x-modelpanel-fallback-fromPresent when the first choice failed over
x-modelpanel-noticeOpportunity notice — the served model also lives somewhere healthier
x-modelpanel-mode: fusion-degradedThe fusion panel exceeded the latency budget; the best single member served

Notices also appear as a notice body field (non-streamed) and a terminal-event field (streamed) — once per (model, provider-pair) per 24h, never auto-switching.

Virtual models

ModelResolves to
free/autoBest healthy model overall
free/reasoning / free/code / free/fastCurrent best candidate per task class
modelpanel/fusion (alias free/fusion)Reasoning panel + judge — 95.0% on matched GSM1K
modelpanel/fusion-fastFast roster (gpt-oss-20b-class) — gated on fast-panel evidence
modelpanel/fusion-codeCode roster — gated on livecodebench evidence
modelpanel/fusion-generalGeneral-chat roster — gated on general evidence
modelpanel/fusion/<your-combo>Your recipe from ~/.modelpanel/combos.json{members, method, judge}
groq/openai/gpt-oss-120bDirect provider-id routing
Streaming fallback semantics

Fallback happens before the first token only. Mid-stream failures surface as an error chunk — retrying is the client’s call (documented behavior, not a bug).

Environment variables

VariablePurpose
MODELPANEL_HOST / MODELPANEL_PORTBind address (default 127.0.0.1:8787)
MODELPANEL_REGISTRY_DIRRegistry directory (default registry/)
MODELPANEL_KEYS_PATHKey vault path (default ~/.modelpanel/keys.json)
MODELPANEL_<PROVIDER>_API_KEYPer-provider key — env wins over the vault file
OPENAI_BASE_URLPoint OpenAI SDK apps at the gateway (http://127.0.0.1:8787/v1)
ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN / ANTHROPIC_MODELPoint Claude Code at the gateway

File layout

FilePurpose
~/.modelpanel/keys.jsonKey vault (chmod 600, tier flags per key)
~/.modelpanel/combos.jsonYour fusion recipes — {members, method, judge}
registry/registry.jsonModel catalog (schema v1, hot-reloaded, fail-fast at boot if missing)
Seed the registry on a fresh clone

The gateway fail-fasts at boot without registry/registry.json: mkdir -p registry && cp gateway/test/fixtures/registry.json registry/registry.json.

Security posture

Keys are sent only to the provider that owns them; never logged (redacted), never resold. Prompts are never persisted (in-memory only); logs are metadata (provider, latency, status). The gateway binds 127.0.0.1 by default.

Source of truth for this page: ModelPanel · open-assistants-lab/ModelPanel