Models

Every run executes on a model. Set model on an agent (the default for all its runs) or on a single run. Omit it for the platform default: deepseek-v4-1-flash at high reasoning effort.

List models

client.models.list() returns every selectable model with USD prices per million tokens. It is the live source of truth: an id outside the list returns a 422 naming the valid choices, and new models become selectable with no SDK change (model is a plain string).

Python
from m8tes import M8tes

client = M8tes()

for m in client.models.list().data:
    print(m.id, m.name, m.pricing.input_per_mtok, m.pricing.output_per_mtok)

Each entry:

FieldMeaning
idPass as model on an agent or run
providerAuthor slug (anthropic, openai, ...)
defaulttrue on the model used when model is omitted. Per viewer: accounts whose runs cannot route the gateway default (own Claude subscription, gateway off) see the Claude fallback flagged instead
max_effortHighest effort tier the model accepts. See Reasoning effort
pricingUSD per million tokens: input_per_mtok, output_per_mtok, plus prompt-cache read and write rates. These are base rates: a model with a long-context band bills a whole request over its line at a higher rate
zdr_supportedtrue if at least one provider supports zero data retention. See ZDR
zdr_providersProvider slugs with ZDR support. Empty when zdr_supported is false
retention_noteHuman-readable retention guidance
runnabletrue when the current catalog viewer can pin and fund this model (connected provider or gateway route). The list is account-scoped by default; an end-user-scoped write may still accept a model that is false here when that tenant's prepaid/gateway lane can fund it. Discovery may list non-runnable rows — connecting a provider can unlock account-scoped pins
Advanced: filters, aliases, and SDK field coverage

GET /api/v2/models accepts query filters:

  • ?zdr=true filters by zdr_supported
  • ?author=openai filters by provider slug
  • ?curated=true returns the short Platform list instead of the full catalog (100+ models)
  • On a Teams plan, runs use gpt-6.1-sol, so the list shows only that model plus any your own connected provider serves. Setting another model returns 403 TEAMS_MODEL_LOCKED. Enterprise accounts can use every model.

zdr in the response is a deprecated alias of zdr_supported (same value). The Python and TypeScript SDKs expose runnable plus the ZDR fields on each Model entry.

Set the model

Prefer runnable rows when choosing an account-scoped pin. Setting a model this write's scope cannot fund returns 400 MODEL_NOT_RUNNABLE — the models list is account-scoped by default, so an end-user-scoped agent/task/run may still accept a row that is runnable: false on the list when that tenant's prepaid/gateway lane can fund it. Connect the matching provider (or pass the write's end-user scope into your own visibility check) when the list flag is false.

A per-run choice wins for that run only:

Python
client.agents.create(name="support agent", instructions="...", model="sonnet", user_id="customer_42")
client.agents.update(agent_id, model="opus", user_id="customer_42")   # change it later
client.agents.update(agent_id, model=None, user_id="customer_42")     # back to the platform default

# per-run override, agent default untouched
client.runs.create(agent_id=bot.id, message="draft the weekly report", model="opus", user_id="customer_42")

Resolution precedence, most specific first: per-run model, then the task's model, then the agent's, then the platform default.

A task can override its agent's model, which is the tool for a mixed workload: pin one high-stakes recurring task to a stronger model while the agent's routine work stays on the default.

Python
task = client.tasks.create(
    agent_id=bot.id,
    instructions="review the contract and flag risk",
    model="opus",           # this task only; the agent is untouched
    effort="max",
    user_id="customer_42",
)
client.tasks.update(task.id, model=None, user_id="customer_42")   # clear the pin, inherit the agent's again

effort follows the same cascade and the same null-clears-the-pin rule.

Model examples

Use the live catalog for current models and prices.

ModelProviderNotes
deepseek-v4-1-flashDeepSeekPlatform default. Cheap ZDR flash; check the catalog for current ZDR support
grok-4.7xAICurated frontier; xAI subscription default
grok-4.6xAIPrevious Grok generation; API-selectable
grok-build-0.1xAIGrok Build 0.1. Fast agentic coding model, 256k-token context
gpt-6-astraOpenAIAvailable in the Platform picker; compare prices in the catalog
gpt-6.1-solOpenAIGPT-6.1 Sol. OpenAI / Codex subscription default + Teams model lock; same list price as gpt-6-sol
gpt-6-solOpenAIGPT-6 Sol. API-selectable predecessor of gpt-6.1-sol
gpt-6.1-terraOpenAIGPT-6.1 Terra. About half Sol's cost, 1M-token context
gpt-6-lunaOpenAIGPT-6 Luna. Fast, lowest-cost GPT-6 tier
opusAnthropicClaude Opus 5.5. Claude frontier; in the Platform picker
sonnetAnthropicClaude Sonnet 5.5. In the Platform picker; the default on a Claude subscription and when the gateway is off
haikuAnthropicClaude Haiku 5.5. Fastest, lowest-cost Claude; in the Platform picker. A request over 100k input tokens bills at 5x the listed rates
fableAnthropicClaude Fable 5.1. About 2.5x Opus cost. No ZDR host — API-only, not in the Platform pickers
claude-sonnet-5AnthropicClaude Sonnet 5. What sonnet meant until 2026-10-11; still selectable by this id
gpt-5.6-solOpenAIGPT-5.6 Sol. Previous Sol generation (API)
gpt-5.6-terraOpenAIAbout half Sol's cost
gpt-5.6-lunaOpenAIFast, lowest-cost OpenAI 5.6 tier
gemini-4-argonGoogleGemini 4 Argon. Google frontier reasoning, 1M-token context
gemini-3.8-flashGoogle1M-token context, newest Google Flash
gemini-3.7-flashGooglePrevious Flash generation, superseded by gemini-3.8-flash
gemini-3.6-flashGoogleEarlier Flash generation
muse-wonderMetaMuse Wonder (preview), 1M-token context. No ZDR host — API-only; check zdr_supported before customer data
muse-spark-1.3MetaMuse Spark 1.3. No ZDR host — API-only; check zdr_supported before customer data
muse-spark-openMetaMuse Spark Open. Open-weight, tuned for agentic coding, 1M-token context
glm-5.2z.aiOpen source, 1M-token context
glm-5.3z.aiSucceeds glm-5.2
glm-5.3-flashz.aiCheap flash tier
minimax-m3-1-flashMiniMaxMiniMax M3.1 Flash, 1M-token context. No ZDR host — API-only
minimax-m3MiniMaxOpen source, 1M-token context
minimax-m2-7MiniMaxOpen source mid-tier
deepseek-v4-1-flash-1017DeepSeekThe 2026-10-17 update to deepseek-v4-1-flash
deepseek-v4-pro-0813DeepSeekOpen source reasoning, 1M-token context, latest point release
deepseek-v4-proDeepSeekOpen source reasoning, 1M-token context
deepseek-v4-flash-0731DeepSeekOpen source flash
kimi-k3-1-proMoonshot AIKimi K3.1 Pro, 1M-token context. No ZDR host — API-only
kimi-k2-7-codeMoonshot AITuned for coding, 262k-token context
kimi-k2-6Moonshot AIPrevious K2 generation
deepseek-v3-2DeepSeekPrevious DeepSeek generation
qwen3.8-maxAlibaba1M-token context
qwen3.7-maxAlibabaPrevious Max generation
gpt-5.4OpenAIGPT-5.4
gpt-5.4-proOpenAIGPT-5.4 Pro
gpt-5.4-miniOpenAIGPT-5.4 Mini
gpt-5.4-nanoOpenAIGPT-5.4 Nano
mimo-v2.6-proXiaomiMiMo v2.6 Pro
mimo-v2.6-flashXiaomiMiMo v2.6 Flash
mimo-v2.5-proXiaomiPrevious MiMo Pro
nemotron-3.5-super-vlNVIDIANemotron 3.5 Super VL. Open multimodal: documents, OCR, GUI screenshots
nemotron-3-120bNVIDIAOpen source
nemotron-3-ultra-nvfp4NVIDIANemotron Ultra
nemotron-3-nano-30bNVIDIANemotron 3 Nano 30B
nemotron-3-nano-omniNVIDIANemotron 3 Nano Omni
gemma-4-31bGoogleGemma 4 31B
gemma-4-26bGoogleGemma 4 26B
gemma-4-e4bGoogleGemma 4 E4B
muse-glimmer-30bMetaMuse Glimmer 30B
step-3-7-flashStepFunStep 3.7 Flash
kimi-k2-thinkingMoonshot AIK2 thinking
hy3TencentHunyuan Hy3
inklingInklingInkling frontier
beam-1.0-501b-a23bReflectionBeam 1.0. Open-weight coding and agentic tool use
nemotron-lightning-3.5-30bNVIDIANemotron Lightning 3.5
mimo-v2.5XiaomiMiMo v2.5 (base)
qwen3.8-27bAlibabaQwen3.8 27B
qwen3.7-plusAlibabaQwen3.7 Plus. No ZDR host — API-only
qwen3.7-flashAlibabaQwen3.7 Flash. No ZDR host — API-only
qwen3.8-flashAlibabaQwen3.8 Flash. No ZDR host — API-only
grok-4.3xAIMid-tier Grok
grok-4.5xAIPrevious Grok generation

Use your own provider subscription

Use your own model subscription for personal runs without user_id.

ProviderSubscriptionMatching models
claudeClaude Pro/MaxClaude
openaiOpenAI CodexGPT/Codex
xaixAIGrok
geminiGoogle AI / GeminiGemini

Provider terms and limits apply. Production runs with user_id use the prepaid balance.

How subscription requests are routed

Claude Code runs the agent and tools. For OpenAI, xAI, and Gemini, an isolated CLIProxyAPI process translates requests inside the sandbox. CLIProxyAPI is an independent third-party project.

1. Connect in the dashboard

Open Account → Model providers, connect an external model provider, and continue on the provider's own sign-in page. Some providers show a one-time device code; others ask you to paste a code from the provider page. m8tes saves the encrypted connection automatically. You never download or upload a token file.

After Connect succeeds, choosing Make default sets that provider as your account default. Platform mates still following the default then run on your plan; Keep as default leaves the current default unchanged. Disconnect clears a matching preference. On Teams the account default is Auto (m8tes-funded); upgrading from Hobby or Individual clears a preferred external provider so Auto is selected. To switch back to Auto without disconnecting, call client.model_connections.clear_default() (DELETE /api/v2/model-connections/preferred-default).

Each connected provider also has its own Default model picker. Saving a model does not switch your preferred provider. Mates following Default use that provider's saved model when routed through the connection; an explicit mate or run model keeps precedence. The setting applies to new runs, not an already-running turn. End-user-scoped API agents do not inherit these personal account defaults.

Use client.model_connections.set_default_model("claude", model="sonnet") to save a choice, or pass model=None to reset it. The corresponding endpoint is PATCH /api/v2/model-connections/{provider}/default-model with {"model": "sonnet"} or {"model": null}. Models must be known and belong to that connected provider. Connection responses include the saved default_model (null when following the platform's provider default), the effective resolved_default_model, and provider_default_model: the model the provider runs when nothing is saved.

OpenAI device authorization is a Codex beta feature. If the provider page says it is disabled, enable device-code authorization in your ChatGPT account or workspace settings and try again.

2. Connect through the API or SDK

OpenAI and xAI use device codes. Show the URL and code, then poll until connected. This example handles expiry and timeout:

Python
import time
from m8tes import M8tes

client = M8tes()
auth = client.model_connections.authorize("xai")
print("Open:", auth.authorization_url)
print("Enter code:", auth.user_code)

deadline = time.monotonic() + 600
while auth.status == "pending":
    if time.monotonic() >= deadline:
        raise TimeoutError("Connection timed out. Run this script again.")
    time.sleep(max(auth.interval_seconds, 1))
    auth = client.model_connections.authorization_status("xai", auth.state)

if auth.status != "connected":
    raise RuntimeError("Connection failed: " + auth.status)
print("Connected. Run the Grok example below.")

For OpenAI, replace both "xai" values with "openai" and use a GPT/Codex model.

Claude and Gemini: exchange a pasted code
Python
from m8tes import M8tes

client = M8tes()
auth = client.model_connections.authorize("gemini")  # or client.model_connections.authorize("claude")
print("Open:", auth.authorization_url)
result = client.model_connections.complete_authorization(
    auth.provider, auth.state, code=input("Paste the provider code: ")
)
print(result.status)

Claude also accepts paste_claude(access_token=..., refresh_token=...) from a local Claude Code connection. Keep tokens out of source control.

Provider values are claude, openai, xai, and gemini. Pending sessions expire and are bound to the account that started them. List redacted connection status with GET /api/v2/model-connections; cancel a pending session with DELETE /api/v2/model-connections/{provider}/authorizations/{state}; disconnect with DELETE /api/v2/model-connections/{provider}.

3. Select a matching model

Set model="gpt-6.1-sol" for Codex, model="grok-4.7" for xAI, or model="gemini-3.6-flash" for Gemini. Omitting model does not mean xAI just because it is connected: an active provider preference wins first; eligible own-inference plans then follow connected-provider precedence; platform plans without a preference can still use the platform default (and platform credits). Only once xAI is the selected provider does the omitted-model default become that provider's default (grok-4.7). A run uses a subscription only when its model matches that provider; run.auth_method is "oauth_subscription" and run.auth_provider identifies "openai", "xai", "gemini", or "claude".

Credentials are account-level. They are never attached to a run carrying user_id, because that workload acts for an API end user rather than the credential owner. Disconnecting deletes m8tes' encrypted copy. Codex and Grok OAuth refreshes produced during a run are persisted back through an authenticated, run-scoped callback. Gemini tokens are refreshed at run start instead.

Reasoning effort

effort controls how hard the model reasons before acting: low | medium | high | xhigh | max. Higher effort means deeper reasoning and more tokens per run; lower is faster and cheaper. Omit it for the platform default: max on Claude models, high on all others.

Same shape as model: set it on the agent, override it per run, explicit null resets.

Python
client.agents.create(name="intake bot", instructions="...", effort="low", user_id="customer_42")   # cheap, fast default
client.runs.create(agent_id=bot.id, message="untangle this billing bug", effort="max", user_id="customer_42")
client.agents.update(agent_id, effort=None, user_id="customer_42")   # back to the platform default

Precedence mirrors model: per-run effort, then the task's effort, then the agent's, then the platform default. Resumes and replies inherit the run's effort, so a conversation keeps the depth it started with.

Ceilings, not errors. xhigh and max are Claude-only tiers. Other models clamp a higher request down to high, never reject it, so an agent set to max stays valid when a run overrides the model. Each model's ceiling is max_effort in the catalog. An invalid tier returns a 422 naming the valid choices.

Advanced: where effort takes effect

effort changes reasoning depth on Claude models and the GPT-5.6 / GPT-6 families (gpt-5.6-sol / terra / luna, gpt-6.1-sol / terra, gpt-6-sol / luna, gpt-6-astra). grok-4.7 (and grok-4.6, grok-build-0.1) also honor effort via LiteLLM. The platform default (deepseek-v4-1-flash, and its -1017 update) pins high reasoning effort on its gateway route; other models (gpt-5.5, gemini-4-argon and the Gemini Flash models, glm-5.2, minimax-m3, other DeepSeek models, kimi-k2-7-code, kimi-k3, kimi-k3-1-pro, qwen3.8-max, muse-wonder, muse-spark-1.3 and grok-4.5) accept the field but currently run at their native depth.

Zero data retention (ZDR)

zdr_supported=true means at least one provider for that model supports zero data retention. It does not mean every route is ZDR, and it does not mean ZDR is enabled for your account. Retention protection applies only when routing lands on a ZDR-capable host and ZDR is enabled on the key. zdr_providers names the capable hosts.

zdr_supported=false means we have no confirmed zero-data-retention host for that model. Either none exists, or the model is not in the synced provider catalog. Either way treat it as may-retain: those models stay selectable on the API, so check the flag before sending customer data, or filter with GET /api/v2/models?zdr=true.

See Data Retention for the account-level picture.

Next: Agents · Data Retention

Was this page helpful?