Models
GET /api/models/catalog
Section titled “GET /api/models/catalog”Get Model Catalog
Return the enabled chat models, in display order.
Replaces the model array that used to be hardcoded in the web app. Only enabled rows are exposed — a model switched off in the admin panel must disappear from every picker, and is rejected server-side regardless. Embedding models share the catalog (same pricing shape, same admin surface) but are never conversational, so they are filtered out here.
org_id is optional and membership-checked: with it the caller gets
that org’s merged view, so a model the org offers itself appears in its
picker and a model it re-routed shows its own route. Without it, the
platform’s — which is what every caller sent before PR 4 and still means the
same thing.
Optional rather than required because this endpoint is user-scoped and
mounted outside /orgs/{org_id}; making it required would break every
existing caller to serve a case only enterprise orgs have. A caller passing
an org it does not belong to gets 403 rather than a quietly platform-only
answer — a silent downgrade here would show a picker missing the org’s own
models with no indication why.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| org_id | query | string (uuid) | no |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | Successful Response | CatalogModel[] |
| 422 | Validation Error | HTTPValidationError |
GET /api/models/pricing
Section titled “GET /api/models/pricing”Get Model Pricing
Return LLM model pricing in per-1-million-token units.
Served from the platform model catalog — the same numbers runs are billed on, so what a picker shows and what a chat costs cannot drift. A model whose catalog row has no input/output price is omitted; admins fill those in (or sync them from the LiteLLM dataset) in the admin panel.
Responses
| Status | Description | Body |
|---|---|---|
| 200 | Successful Response | object |
| 422 | Validation Error | HTTPValidationError |