Skip to main content
The control plane is the admin API behind the dashboard. It listens on RELAY_CONTROL_PORT (separate from the inference port) and serves the admin UI, CRUD for every catalog entity, auth, and operational endpoints.
All control-API routes are mounted under the /api prefix (e.g. GET /api/providers). The prefix keeps the API from shadowing the embedded admin UI’s client-side routes (/models, /policies, …), which are served on the same origin — a hard reload of /models must return the UI, not JSON. Only /config.json and /metrics stay at the listener root.

Authentication

Two ways to authenticate:

CRUD surface

Eight catalog kinds share one uniform shape:
Plurals: providers, hosts, models, host-keys, rate-limits, policies, pricings, relay-keys.
Every write triggers a Postgres NOTIFY; the change propagates to every pod’s in-memory snapshot within ~1 second. No manual reload needed for CRUD operations.

Host keys

A host key is your upstream provider credential (e.g. your OpenAI key). Two value modes:
Stored-mode values are encrypted with RELAY_MASTER_KEY and only the ciphertext is persisted.

Relay keys

A relay key is the inbound bearer your callers use. The server generates the plaintext via crypto/rand, stores only sha256(plaintext) + a short display prefix, and returns the plaintext once on create.
Response:
The plaintext field is returned exactly once. Persist it on receipt — it cannot be retrieved later, only rotated.

Operational endpoints

/reload is a manual fallback; normal CRUD writes propagate automatically via NOTIFY.