Skip to main content

Models

GET /api/models lists every model a chat session can run, one entry per reasoning effort, and one more per effort for each speed the model is sold at. Pass an entry's value, such as anthropic:opus__xhigh, wherever a route takes a model. In the CLI this is kosuke models list.

MethodPathDescription
GET/api/modelsList the models a chat session can start with: value is what --model takes (such as anthropic:opus__xhigh), with its provider, model, reasoning, speed and label. speed is null at standard speed, or a paid tier, fast or ultrafast (openai:gpt-6-astra__high__fast). Retired models carry legacy true. The whole catalog, whichever providers you can run.

Response​

Any API key can read the list. Everyone gets the same catalog, including providers they cannot run.

curl -s https://app.kosuke.ai/api/models \
-H "Authorization: Bearer $KOSUKE_API_KEY"
{
"data": [
{ "value": "anthropic:opus__xhigh", "provider": "anthropic", "model": "opus", "reasoning": "xhigh", "speed": null, "label": "Anthropic - Opus 5.5 (xHigh)" },
{ "value": "anthropic:sonnet-5-5__medium", "provider": "anthropic", "model": "sonnet-5-5", "reasoning": "medium", "speed": null, "label": "Anthropic - Sonnet 5.5 (Medium)" },
{ "value": "openai:gpt-6-astra__high__ultrafast", "provider": "openai", "model": "gpt-6-astra", "reasoning": "high", "speed": "ultrafast", "label": "OpenAI - GPT 6 Astra (High, Ultrafast)" },
{ "value": "openai:gpt-6-luna__medium__fast", "provider": "openai", "model": "gpt-6-luna", "reasoning": "medium", "speed": "fast", "label": "OpenAI - GPT 6 Luna (Medium, Fast)" },
{ "value": "openai:gpt-6.1-sol__ultra", "provider": "openai", "model": "gpt-6.1-sol", "reasoning": "ultra", "speed": null, "label": "OpenAI - GPT 6.1 Sol (Ultra)" },
{ "value": "openai:gpt-6-sol__xhigh", "provider": "openai", "model": "gpt-6-sol", "reasoning": "xhigh", "speed": null, "label": "OpenAI - GPT 6 Sol (xHigh)", "legacy": true },
{ "value": "zai:glm-5.3__high", "provider": "zai", "model": "glm-5.3", "reasoning": "high", "speed": null, "label": "Z.ai - GLM-5.3 (High)" },
{ "value": "moonshot:k3__high", "provider": "moonshot", "model": "k3", "reasoning": "high", "speed": null, "label": "Moonshot AI - Kimi K3 (High)" }
]
}

The example shows eight entries. The real list holds every model at every reasoning effort.

FieldMeaning
valueThe whole id, provider:model__reasoning, followed by __speed when speed is set, as in openai:gpt-6-astra__high__fast. It is the only field you pass back.
provideranthropic, openai, zai or moonshot.
modelThe model family, such as opus or gpt-6.1-sol.
reasoningThe reasoning effort, such as medium or xhigh. Each effort is its own entry.
speednull at standard speed, or a paid speed tier, listed as its own entry at each reasoning effort. fast is on GPT 6.1 Sol, GPT 6 Astra, GPT 6 Luna, GPT 5.6 Terra and the legacy GPT 6 Sol, GPT 5.6 Sol and GPT 5.6 Luna. ultrafast is on GPT 6 Astra only.
labelThe name the web app's model picker shows.
legacyPresent and true on a retired model. A session can still start on it.

To list the current models at standard speed only:

kosuke models list | jq -r '.data[] | select((.legacy | not) and .speed == null) | .value'

Where a value goes​

RouteFieldWhat it sets
POST /api/projects/{projectId}/chat-sessionsmodelThe model a new chat session starts on. The CLI flag is --model.
POST /api/projects/{projectId}/chat-sessions/{sessionId}/jobs/chatmodelSwitches the session to this model from this message's Turn on. The value is ignored when the message is sent mid-turn and waits Up next. It is also ignored when it is not in the catalog, or when the Assignee cannot run its provider. The Turn then runs on the session's own model.
PUT /api/projects/{projectId}/chat-sessions/{sessionId}modelA Backlog session's model, or an Active session's while no Turn is running. Under Review, Archived and Completed sessions refuse a model change.
PATCH /api/user/subscriptionsdefaultModelYour Default Model, for sessions nobody picks a model for.
POST /api/organizations/{workspaceId}/cronsmodelThe model the Cron Agent runs on, and the sessions it files unless the prompt names another.
PUT /api/projects/{projectId}/settings/agentic-deploy/modelmodelThe deploy agent's model. Anthropic and OpenAI models only.

How switching models works in a running session is on Models in the product guide.

Check which providers you can run​

The catalog does not say what you can run. Before you pick a model, read providers from GET /api/organizations/{workspaceId}/access-status. See Workspaces.

A chat session runs on its Assignee's providers, except one filed from a Slack Thread, which runs on the workspace's Credentials, and one booked to Kosuke, such as a session a Cron Run filed, which does too until a member reassigns it. Changing a session's model with PUT, or filing a Backlog session on a model whose provider the Assignee cannot run, answers 400 BAD_REQUEST, and the error says what to do, for example:

{
"error": "You can't run OpenAI models in this workspace. Connect a Subscription, switch the model, or reassign this session.",
"code": "BAD_REQUEST"
}

Creating a session with a first message on such a model answers 400 BAD_REQUEST with a generic message. Starting a Backlog session names the cause, as above. jobs/chat drops the requested model and runs the Turn on the session's own model.

The deploy agent runs on the workspace's Credentials. Its model route refuses a GLM or Kimi model and a provider the workspace holds no Credentials for, both with 400 BAD_REQUEST.

Errors​

StatusCodeWhen
400VALIDATION_ERRORA chat session create or update, a Cron, or defaultModel got a value that is not in the catalog. jobs/chat ignores such a value and keeps the session's model.
400BAD_REQUESTThe Assignee cannot run the model's provider, or the deploy model route got an unsupported value, a GLM or Kimi model, or a provider without workspace Credentials.
401UNAUTHORIZEDThe API key is missing, revoked or expired.

The full list is in Responses and errors.

Next steps​