# @generated by `harn provider catalog generate`; do not edit directly.
# Edit crates/harn-vm/src/llm/catalog_sources/**/*.toml instead.
# --- source: 00-base.toml ---
# Harn's built-in LLM provider/model catalog source fragments.
#
# The files under catalog_sources/ are the source of truth for Harn's
# bundled defaults:
# providers, model aliases, inference + tier routing rules, canonical
# model metadata + pricing, qc defaults, and per-pattern hyperparameter
# overrides. `harn provider catalog generate` concatenates these fragments into
# llm/providers.toml and every checked-in provider catalog projection. The
# provider TOML deserializes into `ProvidersConfig` via the same
# Serde pipeline that loads HARN_HOST_PROVIDERS_CONFIG /
# HARN_PROVIDERS_CONFIG / ~/.config/harn/providers.toml / harn.toml [providers] /
# package-manifest [llm] sections at runtime.
#
# Resolution order at startup (later overlays win on per-key basis):
# 1. Generated llm/providers.toml (embedded into the VM via include_str!)
# 2. HARN_HOST_PROVIDERS_CONFIG (embedding-host defaults)
# 3. HARN_PROVIDERS_CONFIG, otherwise ~/.config/harn/providers.toml
# (user-global override)
# 4. harn.toml [llm] and package-manifest [llm] sections
# 5. Per-run programmatic overlays installed by hosts via
# llm_config::set_user_overrides()
#
# Edit these fragments to change defaults, then run
# `harn provider catalog generate`. Do not re-add
# equivalent data as Rust literals in llm_config.rs — that creates the
# parallel system this catalog exists to eliminate.
# The provider a call uses when it names neither a provider nor a model. Its
# model comes from `provider_defaults.<provider>.runtime`, like every other
# provider's; there is no separate global fallback model.
default_provider = "anthropic"
# --- source: 10-providers/all.toml ---
# ── Providers ────────────────────────────────────────────────────────────────
# Each [providers.X] block defines an LLM endpoint Harn can dial. The
# `auth_env` field can be a single string or an array (tried in order).
# `cost_per_1k_in/out` are coarse provider-level fallbacks used when a
# specific [models.X] entry has no `pricing` table.
# `cache_usage_accounting` records whether zero cache fields are a real miss.
# Usage-accounting declarations are fail-closed, but absence must not look like
# a researched `false`. This typed registry makes every OpenAI-SSE provider
# either evidence-backed or part of one explicit, expiring audit queue. A
# partial verified row leaves its omitted field in that queue.
[usage_accounting_audit]
reviewed_on = "2026-08-26"
expires_on = "2026-10-31"
tracking_issue = 7320
unverified = [
"atlas",
"azure_openai",
"baseten",
"cloudflare_ai_gateway",
"cohere",
"dashscope",
"flexai",
"friendli",
"github_models",
"hunyuan",
"hyperbolic",
"inception",
"local",
"mistral",
"mlx",
"nebius",
"parasail",
"qianfan",
"siliconflow",
"tgi",
"vercel_ai_gateway",
"vllm",
"volcengine_ark",
"zai",
]
[[usage_accounting_audit.verified]]
provider = "deepinfra"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://docs.deepinfra.com/chat/streaming",
"https://docs.deepinfra.com/chat/prompt-caching",
]
[[usage_accounting_audit.verified]]
provider = "deepseek"
checked_on = "2026-08-25"
fields = ["cache", "stream"]
sources = [
"https://api-docs.deepseek.com/api/create-chat-completion",
]
# Both fields verified against live responses, not against the docs alone: a
# non-streaming call reported prompt_tokens_details.cached_tokens = 113 on a
# repeated prefix, and a stream=true call with stream_options.include_usage
# delivered a terminal chunk carrying the same usage shape.
[[usage_accounting_audit.verified]]
provider = "meta"
checked_on = "2026-09-02"
fields = ["cache", "stream"]
sources = [
"https://dev.meta.ai/docs/overview/",
]
[[usage_accounting_audit.verified]]
provider = "fireworks"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://docs.fireworks.ai/api-reference/post-chatcompletions",
"https://docs.fireworks.ai/guides/prompt-caching",
]
[[usage_accounting_audit.verified]]
provider = "groq"
checked_on = "2026-08-25"
fields = ["cache", "stream"]
sources = [
"https://console.groq.com/docs/prompt-caching",
"https://github.com/groq/groq-python/blob/main/src/groq/types/chat/chat_completion_chunk.py",
]
[[usage_accounting_audit.verified]]
provider = "huggingface"
checked_on = "2026-08-27"
fields = ["stream"]
sources = [
"https://huggingface.co/docs/inference-providers/en/tasks/chat-completion",
]
[[usage_accounting_audit.verified]]
provider = "cerebras"
checked_on = "2026-08-25"
fields = ["cache"]
sources = [
"https://inference-docs.cerebras.ai/api-reference/chat-completions",
]
[[usage_accounting_audit.verified]]
provider = "llamacpp"
checked_on = "2026-08-25"
fields = ["cache", "stream"]
sources = [
"https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md",
"https://github.com/burin-labs/harn/pull/7311",
]
[[usage_accounting_audit.verified]]
provider = "minimax"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://platform.minimax.io/docs/api-reference/text-post",
"https://platform.minimax.io/docs/api-reference/text-prompt-caching",
]
[[usage_accounting_audit.verified]]
provider = "moonshot"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://platform.kimi.ai/docs/guide/utilize-the-streaming-output-feature-of-kimi-api",
"https://platform.kimi.ai/docs/guide/use-context-caching-feature-of-kimi-api",
]
[[usage_accounting_audit.verified]]
provider = "nvidia"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://docs.nvidia.com/aiperf/dev/reference/per-request-speculative-decoding-acceptance",
"https://docs.nvidia.com/dynamo/dev/reference/observability/metrics-catalog",
]
[[usage_accounting_audit.verified]]
provider = "openai"
checked_on = "2026-08-25"
fields = ["cache", "stream"]
sources = [
"https://platform.openai.com/docs/api-reference/chat/create#chat-create-stream_options",
"https://platform.openai.com/docs/guides/prompt-caching#monitoring-cache-usage",
]
[[usage_accounting_audit.verified]]
provider = "openrouter"
checked_on = "2026-08-25"
fields = ["cache", "stream"]
sources = [
"https://openrouter.ai/docs/cookbook/administration/usage-accounting",
]
[[usage_accounting_audit.verified]]
provider = "sambanova"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://github.com/sambanova/sambanova-python/blob/main/src/sambanova/types/chat/completion_create_params.py",
"https://github.com/sambanova/sambanova-python/blob/main/src/sambanova/types/chat/chat_completion_stream_response.py",
]
[[usage_accounting_audit.verified]]
provider = "together"
checked_on = "2026-08-26"
fields = ["stream"]
sources = [
"https://docs.together.ai/reference/chat-completions-1",
"https://github.com/burin-labs/harn/pull/7394",
]
[[usage_accounting_audit.verified]]
provider = "xai"
checked_on = "2026-08-26"
fields = ["cache", "stream"]
sources = [
"https://docs.x.ai/developers/cost-tracking",
"https://docs.x.ai/developers/advanced-api-usage/prompt-caching/usage-and-pricing",
]
[providers.anthropic]
cache_usage_accounting = true
base_url = "https://api.anthropic.com/v1"
auth_style = "header"
auth_header = "x-api-key"
auth_env = "ANTHROPIC_API_KEY"
chat_endpoint = "/messages"
features = ["prompt_caching", "thinking", "batch"]
cost_per_1k_in = 0.003
cost_per_1k_out = 0.015
latency_p50_ms = 2500
extra_headers = { "anthropic-version" = "2023-06-01" }
[providers.anthropic.healthcheck]
method = "GET"
path = "/models"
[providers.openai]
display_name = "OpenAI"
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.openai.com/v1"
auth_style = "bearer"
auth_env = "OPENAI_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
embeddings_endpoint = "/embeddings"
features = ["batch", "embeddings"]
cost_per_1k_in = 0.0025
cost_per_1k_out = 0.010
latency_p50_ms = 1800
[providers.openai.healthcheck]
method = "GET"
path = "/models"
[providers.openrouter]
display_name = "OpenRouter"
# Credit-purchase fee allocated to usage, excluding the $0.80 minimum.
# https://openrouter.ai/docs/faq#how-much-does-openrouter-cost
platform_fee_percent = 5.5
features = ["model_proxy"]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://openrouter.ai/api/v1"
auth_style = "bearer"
auth_env = "OPENROUTER_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.003
cost_per_1k_out = 0.015
latency_p50_ms = 2200
[providers.openrouter.healthcheck]
method = "GET"
path = "/auth/key"
[providers.huggingface]
stream_usage_accounting = true
base_url = "https://router.huggingface.co/v1"
auth_style = "bearer"
auth_env = ["HF_TOKEN", "HUGGINGFACE_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
latency_p50_ms = 2400
[providers.huggingface.healthcheck]
method = "GET"
url = "https://huggingface.co/api/whoami-v2"
# Ollama defaults to /api/chat (native NDJSON) so the test stubs keep
# working; hosts can flip to /v1/chat/completions via a providers.toml
# overlay to bypass Ollama's per-model tool-call post-processors
# (qwen3coder.go, qwen35.go) that raise HTTP 500s on text-mode responses
# for the Qwen3.5 family.
[providers.ollama]
cache_usage_accounting = false
base_url = "http://localhost:11434"
base_url_env = "OLLAMA_HOST"
auth_style = "none"
chat_endpoint = "/api/chat"
completion_endpoint = "/api/generate"
embeddings_endpoint = "/api/embed"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 1200
[providers.ollama.healthcheck]
method = "GET"
path = "/api/tags"
[providers.gemini]
display_name = "Google Gemini"
base_url = "https://generativelanguage.googleapis.com"
base_url_env = "GEMINI_BASE_URL"
auth_style = "header"
auth_header = "x-goog-api-key"
auth_env = ["GEMINI_API_KEY", "GOOGLE_API_KEY"]
chat_endpoint = "/v1beta/models"
features = ["batch"]
cost_per_1k_in = 0.00125
cost_per_1k_out = 0.005
latency_p50_ms = 1800
[providers.gemini.healthcheck]
method = "GET"
path = "/v1beta/models"
[providers.mistral]
base_url = "https://api.mistral.ai/v1"
base_url_env = "MISTRAL_BASE_URL"
auth_style = "bearer"
auth_env = "MISTRAL_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
embeddings_endpoint = "/embeddings"
cost_per_1k_in = 0.0005
cost_per_1k_out = 0.0015
latency_p50_ms = 1800
features = ["native_tools", "batch", "embeddings"]
[providers.mistral.healthcheck]
method = "GET"
path = "/models"
[providers.cohere]
base_url = "https://api.cohere.ai/compatibility/v1"
base_url_env = "COHERE_BASE_URL"
auth_style = "bearer"
auth_env = "COHERE_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0025
cost_per_1k_out = 0.010
latency_p50_ms = 1900
features = ["native_tools", "reasoning"]
[providers.cohere.healthcheck]
method = "GET"
path = "/models"
[providers.xai]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.x.ai/v1"
base_url_env = "XAI_BASE_URL"
auth_style = "bearer"
auth_env = "XAI_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.001
cost_per_1k_out = 0.002
latency_p50_ms = 1600
features = ["responses_api", "native_tools", "reasoning", "batch"]
[providers.xai.healthcheck]
method = "GET"
path = "/models"
[providers.together]
# Verified 2026-08-26 against api.together.xyz: streamed completions append an
# empty-choices accounting frame after the finish-reason frame. The frame
# carries prompt, completion, cached-input, and reasoning-token counters.
# Together also accepts `stream_options.include_usage`.
stream_usage_accounting = true
base_url = "https://api.together.xyz/v1"
base_url_env = "TOGETHER_AI_BASE_URL"
auth_style = "bearer"
auth_env = "TOGETHER_AI_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0002
cost_per_1k_out = 0.0006
latency_p50_ms = 1600
features = ["batch"]
[providers.together.healthcheck]
method = "GET"
path = "/models"
# Groq — OpenAI-compatible LPU-hosted fast inference. Headline ~840 tok/s
# on Llama 3.1 8B, ~594 tok/s on Llama 4 Scout. Useful executor target
# when sub-100ms TTFT matters more than raw quality.
[providers.groq]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.groq.com/openai/v1"
base_url_env = "GROQ_BASE_URL"
auth_style = "bearer"
auth_env = "GROQ_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0001
cost_per_1k_out = 0.0003
latency_p50_ms = 450
features = ["native_tools", "batch"]
[providers.groq.healthcheck]
method = "GET"
path = "/models"
# Cerebras — OpenAI-compatible wafer-scale inference. High token throughput
# makes it a strong fit for latency-budgeted binder workloads; end-to-end
# p50 still includes client/provider round-trip time, so callers should keep
# their own wall-clock budget. Provider-level pricing here is a coarse
# default; per-model rows under [models.X] hold the authoritative numbers
# from Cerebras's public model discovery endpoint.
[providers.cerebras]
cache_usage_accounting = true
base_url = "https://api.cerebras.ai/v1"
base_url_env = "CEREBRAS_BASE_URL"
auth_style = "bearer"
auth_env = "CEREBRAS_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.00035
cost_per_1k_out = 0.00075
latency_p50_ms = 150
features = ["native_tools"]
[providers.cerebras.healthcheck]
method = "GET"
path = "/models"
[providers.deepseek]
display_name = "DeepSeek"
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.deepseek.com/v1"
base_url_env = "DEEPSEEK_BASE_URL"
auth_style = "bearer"
auth_env = "DEEPSEEK_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.00014
cost_per_1k_out = 0.00028
latency_p50_ms = 1800
[providers.deepseek.healthcheck]
method = "GET"
path = "/models"
[providers.fireworks]
cache_usage_accounting = true
base_url = "https://api.fireworks.ai/inference/v1"
base_url_env = "FIREWORKS_BASE_URL"
auth_style = "bearer"
auth_env = "FIREWORKS_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0002
cost_per_1k_out = 0.0006
latency_p50_ms = 1400
features = ["batch"]
# Verified 2026-08-15 against api.fireworks.ai: a streamed completion ends with
# a trailing accounting frame (`"choices": []`, populated `usage`) AFTER the
# finish-reason frame, with or without `stream_options.include_usage`, and the
# request extension is accepted without error. Leaving this unset made
# `awaits_stream_usage` false, so the parser treated the finish-reason frame as
# terminal and dropped the accounting frame: every streamed agent call reported
# `accounting_status = "unknown"` and `cost_usd = null` while non-streamed
# structured calls on the same route priced correctly.
stream_usage_accounting = true
[providers.fireworks.healthcheck]
method = "GET"
path = "/models"
[providers.dashscope]
base_url = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
base_url_env = "DASHSCOPE_BASE_URL"
region_env = "DASHSCOPE_REGION"
auth_style = "bearer"
auth_env = "DASHSCOPE_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0003
cost_per_1k_out = 0.0012
latency_p50_ms = 1600
[providers.dashscope.regions.intl]
base_url = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
label = "International"
source_url = "https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope"
last_verified = "2026-07-09"
[providers.dashscope.regions.cn]
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
label = "China"
source_url = "https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope"
last_verified = "2026-07-09"
[providers.dashscope.healthcheck]
method = "GET"
path = "/models"
# Meta Model API — Meta's first-party hosted endpoint for the Muse family,
# documented as drop-in compatible with the OpenAI SDK, so it reuses the
# existing OpenAI chat-completions dialect rather than carrying an adapter of
# its own. Bearer auth, /v1/models for the healthcheck.
#
# Note that this replaces the wound-down Llama API; Llama weights themselves
# are served by the third-party providers already in this catalog.
#
# Meta publishes each Muse Spark generation under TWO model ids at two very
# different prices. The cheaper `-contributor` id is a training grant, not a
# volume discount, and each row declares that for itself in
# `[models.<id>.data_controls]`.
[providers.meta]
display_name = "Meta"
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.meta.ai/v1"
base_url_env = "META_BASE_URL"
auth_style = "bearer"
auth_env = "META_API_KEY"
chat_endpoint = "/chat/completions"
latency_p50_ms = 1900
[providers.meta.healthcheck]
method = "GET"
path = "/models"
# MiniMax — OpenAI-compatible endpoint for MiniMax M2/M3 models. The direct
# API serves MiniMax-M3 plus the open-weight M2 family on the same
# /v1/chat/completions URL; the wire format mirrors OpenAI chat completions
# with native tool calls and model-specific thinking controls.
[providers.minimax]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.minimax.io/v1"
base_url_env = "MINIMAX_BASE_URL"
auth_style = "bearer"
auth_env = "MINIMAX_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0006
cost_per_1k_out = 0.0024
latency_p50_ms = 1700
[providers.minimax.healthcheck]
method = "GET"
path = "/models"
# Z.AI — OpenAI-compatible GLM API. Override `ZAI_BASE_URL` for custom plans.
[providers.zai]
base_url = "https://api.z.ai/api/paas/v4"
base_url_env = "ZAI_BASE_URL"
region_env = "ZAI_REGION"
auth_style = "bearer"
auth_env = ["ZAI_API_KEY", "ZHIPU_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0004
cost_per_1k_out = 0.0017
latency_p50_ms = 1900
[providers.zai.regions.global]
base_url = "https://api.z.ai/api/paas/v4"
label = "Global"
source_url = "https://docs.z.ai/guides/start/quickstart"
last_verified = "2026-07-09"
[providers.zai.regions.cn]
base_url = "https://open.bigmodel.cn/api/paas/v4"
label = "China"
source_url = "https://bigmodel.cn/dev/api/normal-model/glm-4"
last_verified = "2026-07-09"
[providers.zai.healthcheck]
method = "GET"
path = "/models"
# Moonshot AI — first-party host of the Kimi K2 family. Harn dials the
# OpenAI-compatible `/v1/chat/completions` endpoint so the shared
# openai_chat_completions wire format Just Works.
[providers.moonshot]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.moonshot.ai/v1"
base_url_env = "MOONSHOT_BASE_URL"
region_env = "MOONSHOT_REGION"
auth_style = "bearer"
auth_env = ["MOONSHOT_API_KEY", "MOONSHOT_AI_API_KEY", "KIMI_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0006
cost_per_1k_out = 0.0025
latency_p50_ms = 1900
features = ["native_tools", "reasoning", "prompt_caching"]
[providers.moonshot.regions.global]
base_url = "https://api.moonshot.ai/v1"
label = "Global"
source_url = "https://platform.moonshot.ai/docs/intro"
last_verified = "2026-07-09"
[providers.moonshot.regions.cn]
base_url = "https://api.moonshot.cn/v1"
label = "China"
source_url = "https://platform.moonshot.cn/docs"
last_verified = "2026-07-09"
[providers.moonshot.healthcheck]
method = "GET"
path = "/models"
# Baseten Model APIs — OpenAI-compatible serverless inference for current
# open-weight frontier models. Baseten's GLM-5.2 route is optimized with
# Blackwell, KV-aware routing, prefill/decode disaggregation, and speculative
# decoding; catalog rows use a `baseten/<wire-id>` prefix so the same weights
# can be compared against Z.AI, Together, DeepInfra, OpenRouter, and NVIDIA.
[providers.baseten]
base_url = "https://inference.baseten.co/v1"
base_url_env = "BASETEN_BASE_URL"
auth_style = "bearer"
auth_env = "BASETEN_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0014
cost_per_1k_out = 0.0044
latency_p50_ms = 800
features = ["native_tools", "reasoning", "prompt_caching"]
rate_limits = { rpm = 15, tpm = 100000, tier = "basic_unverified", source_url = "https://docs.baseten.co/inference/model-apis/rate-limits-and-budgets", last_verified = "2026-06-23", notes = "Conservative default. Baseten also publishes Basic verified at 120 RPM / 500k TPM, Pro at 120 RPM / 1M TPM, and custom Enterprise limits." }
[providers.baseten.healthcheck]
method = "GET"
path = "/models"
# DeepInfra — OpenAI-compatible host for open-weight models (DeepSeek,
# Qwen, Llama, Kimi, GPT-OSS, Gemma). The compat surface lives under the
# `/v1/openai` path prefix, so the base_url carries it and chat_endpoint
# stays the standard `/chat/completions`. Catalog rows are keyed with a
# `deepinfra/<hf-id>` prefix and carry `wire_model` so they stay
# collision-free with the bare/openrouter ids for the same weights.
[providers.deepinfra]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.deepinfra.com/v1/openai"
base_url_env = "DEEPINFRA_BASE_URL"
auth_style = "bearer"
auth_env = ["DEEPINFRA_API_KEY", "DEEPINFRA_TOKEN"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0002
cost_per_1k_out = 0.0006
latency_p50_ms = 1500
features = ["native_tools"]
[providers.deepinfra.healthcheck]
method = "GET"
path = "/models"
# SambaNova Cloud — OpenAI-compatible RDU-hosted inference with very high
# token throughput on large open-weight models (DeepSeek, Llama 4, Qwen).
# A latency-budgeted executor target alongside Groq/Cerebras with a
# different model mix. Catalog rows use a `sambanova/<wire-id>` prefix +
# `wire_model` so they don't collide with other hosts of the same weights.
[providers.sambanova]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://api.sambanova.ai/v1"
base_url_env = "SAMBANOVA_BASE_URL"
auth_style = "bearer"
auth_env = "SAMBANOVA_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
cost_per_1k_in = 0.0006
cost_per_1k_out = 0.0012
latency_p50_ms = 350
features = ["native_tools"]
[providers.sambanova.healthcheck]
method = "GET"
path = "/models"
# NVIDIA NIM — OpenAI-compatible hosted inference through the NVIDIA API
# Catalog. Use NVIDIA_NIM_BASE_URL for self-hosted NIM or enterprise
# gateways; the generic NVIDIA_BASE_URL is intentionally not consumed here
# because common examples set it to the host root, while the OpenAI-compatible
# API lives under /v1.
[providers.nvidia]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "https://integrate.api.nvidia.com/v1"
base_url_env = "NVIDIA_NIM_BASE_URL"
auth_style = "bearer"
auth_env = ["NVIDIA_API_KEY", "NIM_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
latency_p50_ms = 1400
features = ["native_tools"]
[providers.nvidia.healthcheck]
method = "GET"
path = "/models"
# Nebius Token Factory — OpenAI-compatible hosted inference for agentic
# open-weight models. Public docs advertise native function calling and JSON
# structured output; live per-model facts should come from /models/model cards.
[providers.nebius]
base_url = "https://api.tokenfactory.nebius.com/v1"
base_url_env = "NEBIUS_BASE_URL"
auth_style = "bearer"
auth_env = "NEBIUS_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "reasoning"]
[providers.nebius.healthcheck]
method = "GET"
path = "/models"
# FlexAI Token Factory — OpenAI-compatible API with model-discovery metadata
# for context windows, pricing, health, and support flags.
[providers.flexai]
base_url = "https://tokens.flex.ai/v1"
base_url_env = "FLEXAI_BASE_URL"
auth_style = "bearer"
auth_env = "FLEXAI_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "reasoning", "vision"]
[providers.flexai.healthcheck]
method = "GET"
path = "/models"
# Hyperbolic — OpenAI-compatible inference with documented function calling
# on current Qwen/Llama coding-agent routes.
[providers.hyperbolic]
base_url = "https://api.hyperbolic.xyz/v1"
base_url_env = "HYPERBOLIC_BASE_URL"
auth_style = "bearer"
auth_env = "HYPERBOLIC_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools"]
rate_limits = { rpm = 60, tier = "basic", source_url = "https://www.hyperbolic.ai/docs/inference/text-apis", last_verified = "2026-06-23", notes = "Docs also publish a 600 RPM Pro tier after account upgrade/deposit; this row records the conservative default tier." }
[providers.hyperbolic.healthcheck]
method = "GET"
path = "/models"
# SiliconFlow — OpenAI-compatible hosted inference for inexpensive DeepSeek,
# Qwen, GLM, and other open-weight routes.
[providers.siliconflow]
base_url = "https://api.siliconflow.com/v1"
base_url_env = "SILICONFLOW_BASE_URL"
region_env = "SILICONFLOW_REGION"
auth_style = "bearer"
auth_env = "SILICONFLOW_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "reasoning"]
[providers.siliconflow.regions.global]
base_url = "https://api.siliconflow.com/v1"
label = "Global"
source_url = "https://docs.siliconflow.com/api-reference/chat-completions/chat-completions"
last_verified = "2026-07-09"
[providers.siliconflow.regions.cn]
base_url = "https://api.siliconflow.cn/v1"
label = "China"
source_url = "https://docs.siliconflow.cn/cn/api-reference/chat-completions/chat-completions"
last_verified = "2026-07-09"
[providers.siliconflow.healthcheck]
method = "GET"
path = "/models"
# Parasail — OpenAI-compatible serverless and batch API. Batch jobs are
# particularly useful for offline eval/replay workloads where latency is not
# on the critical path.
[providers.parasail]
base_url = "https://api.parasail.io/v1"
base_url_env = "PARASAIL_BASE_URL"
auth_style = "bearer"
auth_env = "PARASAIL_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "batch"]
[providers.parasail.healthcheck]
method = "GET"
path = "/models"
# Atlas Cloud — OpenAI-compatible coding-plan/provider surface that overlaps
# GLM, Kimi, DeepSeek, Qwen, and MiniMax families.
[providers.atlas]
base_url = "https://api.atlascloud.ai/v1"
base_url_env = "ATLAS_BASE_URL"
auth_style = "bearer"
auth_env = ["ATLAS_API_KEY", "ATLASCLOUD_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "reasoning"]
[providers.atlas.healthcheck]
method = "GET"
path = "/models"
# GitHub Models — OpenAI-compatible inference over GitHub's model catalog.
[providers.github_models]
base_url = "https://models.github.ai/inference"
base_url_env = "GITHUB_MODELS_BASE_URL"
auth_style = "bearer"
auth_env = "GITHUB_MODELS_TOKEN"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools"]
[providers.github_models.healthcheck]
method = "GET"
url = "https://models.github.ai/catalog/models"
# Vercel AI Gateway — one OpenAI-compatible endpoint for providers routed
# through a Vercel project.
[providers.vercel_ai_gateway]
display_name = "Vercel AI Gateway"
base_url = "https://ai-gateway.vercel.sh/v1"
base_url_env = "VERCEL_AI_GATEWAY_BASE_URL"
auth_style = "bearer"
auth_env = ["AI_GATEWAY_API_KEY", "VERCEL_AI_GATEWAY_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["responses_api", "native_tools", "reasoning", "prompt_caching", "wire_model_capabilities"]
[providers.vercel_ai_gateway.healthcheck]
method = "GET"
path = "/models"
# TypeSafe — System One decision models. NOT a chat provider: the published
# API is `POST /v1/systemone`, which answers typed questions over one shared
# state and returns probabilities, not prose.
#
# `chat_endpoint` names that same `/systemone` path rather than an invented
# `/chat/completions`. The catalog contract requires a non-empty endpoint on
# every provider, a requirement that predates decision-only providers, and the
# choice is between the real path and a path that does not exist. The value is
# inert either way: no `typesafe` model row declares `text_generation`, so
# operation admission refuses a chat request before transport. How the decision
# operation is actually dialled is named by the `decision_protocol` capability
# rule, which is the authoritative owner.
#
# Direct access was waitlisted on 2026-09-20 and Harn holds no TYPESAFE_API_KEY;
# the `vercel/typesafe-ai/jev` route is the one reachable today.
# https://docs.typesafe.ai/api
[providers.typesafe]
display_name = "TypeSafe"
base_url = "https://api.typesafe.ai/v1"
base_url_env = "TYPESAFE_BASE_URL"
auth_style = "bearer"
auth_env = "TYPESAFE_API_KEY"
chat_endpoint = "/systemone"
[providers.typesafe.healthcheck]
method = "GET"
path = "/models"
# Cloudflare Workers AI / AI Gateway — OpenAI-compatible path is scoped by
# account id. Set CLOUDFLARE_AI_BASE_URL to the concrete account/gateway URL.
[providers.cloudflare_ai_gateway]
base_url = "https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/v1"
base_url_env = "CLOUDFLARE_AI_BASE_URL"
auth_style = "bearer"
auth_env = ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["responses_api", "native_tools", "reasoning"]
# Inception Labs — diffusion LLM APIs exposed through OpenAI-compatible chat.
[providers.inception]
base_url = "https://api.inceptionlabs.ai/v1"
base_url_env = "INCEPTION_BASE_URL"
auth_style = "bearer"
auth_env = "INCEPTION_API_KEY"
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools", "reasoning"]
[providers.inception.healthcheck]
method = "GET"
path = "/models"
# Friendli Serverless Endpoints — OpenAI-compatible chat/completions.
[providers.friendli]
base_url = "https://api.friendli.ai/serverless/v1"
base_url_env = "FRIENDLI_BASE_URL"
auth_style = "bearer"
auth_env = ["FRIENDLI_API_KEY", "FRIENDLI_TOKEN"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools"]
[providers.friendli.healthcheck]
method = "GET"
path = "/models"
# Volcengine Ark — OpenAI-compatible ByteDance model serving endpoint.
[providers.volcengine_ark]
base_url = "https://ark.cn-beijing.volces.com/api/v3"
base_url_env = "VOLCENGINE_ARK_BASE_URL"
auth_style = "bearer"
auth_env = ["ARK_API_KEY", "VOLCENGINE_ARK_API_KEY", "VOLCENGINE_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["responses_api", "native_tools"]
[providers.volcengine_ark.healthcheck]
method = "GET"
path = "/models"
# Tencent Hunyuan — OpenAI-compatible `/v1/chat/completions` endpoint.
[providers.hunyuan]
base_url = "https://api.hunyuan.cloud.tencent.com/v1"
base_url_env = "HUNYUAN_BASE_URL"
auth_style = "bearer"
auth_env = ["HUNYUAN_API_KEY", "TENCENT_HUNYUAN_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools"]
[providers.hunyuan.healthcheck]
method = "GET"
path = "/models"
# Baidu Qianfan v2 — OpenAI-compatible endpoint with tool-calling support.
[providers.qianfan]
base_url = "https://qianfan.baidubce.com/v2"
base_url_env = "QIANFAN_BASE_URL"
auth_style = "bearer"
auth_env = ["QIANFAN_API_KEY", "BAIDU_QIANFAN_API_KEY"]
chat_endpoint = "/chat/completions"
completion_endpoint = "/completions"
features = ["native_tools"]
[providers.qianfan.healthcheck]
method = "GET"
path = "/models"
# AWS Bedrock — resolves credentials through env, profile, container, or
# EC2 instance roles, then signs Converse API calls with SigV4.
[providers.bedrock]
base_url = "https://bedrock-runtime.{region}.amazonaws.com"
base_url_env = "BEDROCK_BASE_URL"
auth_style = "aws_sigv4"
credential_resolution = "platform_managed"
# The AWS credential chain's secret-bearing variables, plus the profile that
# selects stored credentials. Declared so no child process inherits them.
credential_env = [
"AWS_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY",
"AWS_SESSION_TOKEN",
"AWS_SECURITY_TOKEN",
"AWS_PROFILE",
"AWS_CONTAINER_AUTHORIZATION_TOKEN",
]
chat_endpoint = "/model/{model}/converse"
features = ["native_tools"]
latency_p50_ms = 2600
# Azure OpenAI — deployment name is routed in the URL; callers can
# either pass the deployment as the Harn model field or set
# AZURE_OPENAI_DEPLOYMENT.
[providers.azure_openai]
base_url = "https://{resource}.openai.azure.com"
base_url_env = "AZURE_OPENAI_ENDPOINT"
auth_style = "azure_openai"
auth_env = ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_AD_TOKEN", "AZURE_OPENAI_BEARER_TOKEN"]
chat_endpoint = "/openai/deployments/{deployment}/chat/completions?api-version={api_version}"
features = ["native_tools", "batch"]
cost_per_1k_in = 0.0025
cost_per_1k_out = 0.010
latency_p50_ms = 1900
[providers.vertex]
base_url = "https://aiplatform.googleapis.com/v1"
base_url_env = "VERTEX_AI_BASE_URL"
auth_style = "bearer"
auth_env = ["VERTEX_AI_ACCESS_TOKEN", "GOOGLE_OAUTH_ACCESS_TOKEN", "GOOGLE_APPLICATION_CREDENTIALS"]
credential_resolution = "platform_managed"
chat_endpoint = "/projects/{project}/locations/{location}/publishers/google/models/{model}:generateContent"
features = ["native_tools", "wire_model_capabilities"]
cost_per_1k_in = 0.00125
cost_per_1k_out = 0.005
latency_p50_ms = 2100
[providers.local]
features = ["model_proxy"]
base_url = "http://localhost:8000"
base_url_env = "LOCAL_LLM_BASE_URL"
auth_style = "none"
chat_endpoint = "/v1/chat/completions"
completion_endpoint = "/v1/completions"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 900
[providers.local.healthcheck]
method = "GET"
path = "/v1/models"
# llama.cpp — separate from `local` so capability rules can isolate Qwen
# chat-template thinking quirks from other local OpenAI-compatible hosts.
[providers.llamacpp]
cache_usage_accounting = true
stream_usage_accounting = true
base_url = "http://127.0.0.1:8001"
base_url_env = "LLAMACPP_BASE_URL"
auth_style = "none"
chat_endpoint = "/v1/chat/completions"
completion_endpoint = "/v1/completions"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 900
[providers.llamacpp.healthcheck]
method = "GET"
path = "/v1/models"
# Apple Silicon MLX. Harn owns readiness probing; hosts that want
# script-based auto-start should launch the process first, then call
# Harn again to verify readiness.
[providers.mlx]
base_url = "http://127.0.0.1:8002"
base_url_env = "MLX_BASE_URL"
auth_style = "none"
chat_endpoint = "/v1/chat/completions"
completion_endpoint = "/v1/completions"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 900
[providers.mlx.healthcheck]
method = "GET"
path = "/v1/models"
[providers.vllm]
base_url = "http://localhost:8000"
base_url_env = "VLLM_BASE_URL"
auth_style = "none"
chat_endpoint = "/v1/chat/completions"
completion_endpoint = "/v1/completions"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 800
[providers.vllm.healthcheck]
method = "GET"
path = "/v1/models"
[providers.tgi]
base_url = "http://localhost:8080"
base_url_env = "TGI_BASE_URL"
auth_style = "none"
chat_endpoint = "/v1/chat/completions"
completion_endpoint = "/v1/completions"
cost_per_1k_in = 0.0
cost_per_1k_out = 0.0
latency_p50_ms = 950
[providers.tgi.healthcheck]
method = "GET"
path = "/health"
# --- source: 10-providers/zz-data-controls.toml ---
# ── Provider data controls (retention / training) ────────────────────────────
#
# One owner for a per-provider fact hosts otherwise re-derive: what a provider
# lets a caller decide per request about retention and training, what happens
# when Harn sets nothing, and the documentation backing both.
#
# `control_scope`:
# per_request — a documented header or body field Harn can set per call.
# account — the posture exists but is selected on the account, project,
# organization, or contract. Harn must not pretend a request
# can change it.
# none — the provider documents no control at either level.
#
# `retention_default` / `training_default` describe the provider's behavior
# with NOTHING set. `unspecified` means the provider publishes no answer; it is
# deliberately not the same claim as `not_retained` / `does_not_train`.
#
# Harn applies `request_controls` only when a caller asks for the
# `strictest_available` posture, and records a receipt on every request saying
# which of applied / no_control_available / provider_unresearched / not_
# requested occurred. See `llm/api/data_controls.rs`.
#
# Every provider in the catalog is either declared here or named in
# `[data_controls_audit].unverified`. Absence is not a classification.
[data_controls_audit]
reviewed_on = "2026-08-30"
expires_on = "2026-11-30"
tracking_issue = 7674
unverified = [
"atlas",
"baseten",
"cloudflare_ai_gateway",
"dashscope",
"deepinfra",
"flexai",
"friendli",
"github_models",
"huggingface",
"hunyuan",
"hyperbolic",
"inception",
"minimax",
"moonshot",
"nebius",
"nvidia",
"parasail",
"qianfan",
"sambanova",
"siliconflow",
"volcengine_ark",
"zai",
]
# ── Per-request controls ─────────────────────────────────────────────────────
# `store` is documented for both the Responses API and Chat Completions. The
# Responses API defaults to storing 30 days of application state; Chat
# Completions stores none by default. Setting `store: false` does not end the
# separate 30-day abuse-monitoring retention, which is an account-level (ZDR)
# concern with no request header.
[providers.openai.data_controls]
control_scope = "per_request"
retention_default = "retained"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://developers.openai.com/api/docs/guides/your-data"]
note = "store: false ends application-state retention only; the 30-day abuse-monitoring store is ended by an approved org/project ZDR configuration, which has no per-request form."
[[providers.openai.data_controls.request_controls]]
location = "body"
name = "store"
value = false
effect = "retention"
caveat = "Abuse-monitoring retention continues regardless; a ZDR organization forces store to false server-side."
# Azure exposes OpenAI's `store` as the stored-completions opt-in. The 30-day
# abuse-monitoring store is separate and is disabled only via the Modified
# Abuse Monitoring application.
[providers.azure_openai.data_controls]
control_scope = "per_request"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = [
"https://learn.microsoft.com/en-us/azure/foundry-classic/openai/how-to/stored-completions",
"https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/abuse-monitoring",
]
note = "Stored completions are off unless store is true; the separate abuse-monitoring store is an account-level application, not a request field."
[[providers.azure_openai.data_controls.request_controls]]
location = "body"
name = "store"
value = false
effect = "retention"
# OpenRouter has per-request controls over training and retention:
# `provider.data_collection` selects providers
# by their data policy, and `provider.zdr` restricts routing to zero-retention
# endpoints. Both are routing restrictions, so the effective posture still
# depends on the upstream provider actually serving the call.
[providers.openrouter.data_controls]
control_scope = "per_request"
retention_default = "unspecified"
training_default = "unspecified"
checked_on = "2026-08-30"
sources = [
"https://openrouter.ai/docs/features/provider-routing",
"https://openrouter.ai/docs/features/privacy-and-logging",
]
note = "Both controls restrict which upstream providers may serve the call; retention and training behavior is otherwise the routed provider's. The alpha decisions endpoint has not been verified to honor these chat controls, so native decisions do not apply them."
[[providers.openrouter.data_controls.request_controls]]
location = "body"
name = "provider.data_collection"
value = "deny"
effect = "training"
applies_to = ["open_ai_sse"]
caveat = "Defaults to allow. Restricts routing to providers that do not collect prompts; it does not retroactively bind one that does."
[[providers.openrouter.data_controls.request_controls]]
location = "body"
name = "provider.zdr"
value = true
effect = "retention"
applies_to = ["open_ai_sse"]
# The evaluation route was reached on 2026-09-22 with both controls. Its
# routing metadata reported one successful TypeSafe attempt eligible for ZDR
# and no prompt training. This proves routing admission, not backend storage.
[providers.vercel_ai_gateway.data_controls]
control_scope = "per_request"
retention_default = "unspecified"
training_default = "unspecified"
checked_on = "2026-09-22"
sources = [
"https://vercel.com/blog/zdr-on-ai-gateway",
"https://vercel.com/docs/ai-gateway/security-and-compliance/disallow-prompt-training",
"https://vercel.com/docs/ai-gateway/modalities/evaluation",
]
note = "The native evaluation route honors providerOptions.gateway privacy filters. These are routing restrictions, not proof of storage behavior. Chat dialect controls are not declared by this evaluation-route probe; default upstream retention and training remain unspecified."
[[providers.vercel_ai_gateway.data_controls.request_controls]]
location = "body"
name = "providerOptions.gateway.zeroDataRetention"
value = true
effect = "retention"
applies_to = ["vercel_evaluate"]
caveat = "Routes only to providers with gateway ZDR agreements; per-request ZDR availability depends on the gateway account plan."
[[providers.vercel_ai_gateway.data_controls.request_controls]]
location = "body"
name = "providerOptions.gateway.disallowPromptTraining"
value = true
effect = "training"
applies_to = ["vercel_evaluate"]
# Gemini's `store` is an Interactions API field. `generateContent` documents no
# equivalent, so the control is scoped to the Interactions dialect rather than
# invented on the sibling wire.
[providers.gemini.data_controls]
control_scope = "per_request"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = [
"https://ai.google.dev/gemini-api/docs/zdr",
"https://ai.google.dev/gemini-api/docs/logs-policy",
]
note = "Paid tier only. Full zero-data-retention is a per-project approval; Search grounding retains for 30 days regardless."
[[providers.gemini.data_controls.request_controls]]
location = "body"
name = "store"
value = false
effect = "retention"
applies_to = ["gemini_interactions_sse"]
# ── Account- or contract-scoped providers ────────────────────────────────────
[providers.typesafe.data_controls]
control_scope = "account"
retention_default = "retained"
training_default = "does_not_train"
checked_on = "2026-09-22"
sources = [
"https://docs.typesafe.ai/legal",
"https://typesafe.ai/legal/privacy-policy",
]
note = "The privacy policy excludes training and fine-tuning on inputs but permits retention for service and business purposes. Zero data retention is offered to enterprise customers by agreement, not as the default or a documented per-request control. This direct-provider posture does not establish gateway decision-route controls."
[providers.anthropic.data_controls]
control_scope = "account"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = [
"https://platform.claude.com/docs/en/api/messages",
"https://platform.claude.com/docs/en/manage-claude/api-and-data-retention",
]
note = "The Messages API documents no retention parameter and no retention-related anthropic-beta value; zero data retention is enabled per organization by the account team. Some models require 30-day retention and reject ZDR organizations."
[providers.vertex.data_controls]
control_scope = "account"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://cloud.google.com/vertex-ai/generative-ai/docs/data-governance"]
note = "Governed by project configuration; implicit context caching is on by default in the serving region."
[providers.bedrock.data_controls]
control_scope = "account"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://docs.aws.amazon.com/bedrock/latest/userguide/data-retention.html"]
note = "Retention is set by the account/project data_retention mode, not by the Converse request Harn sends. AWS documents store: false on its Responses surface as insufficient for guaranteed zero retention."
[providers.mistral.data_controls]
control_scope = "account"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = [
"https://docs.mistral.ai/admin/monitor-comply/privacy-data-controls",
"https://docs.mistral.ai/admin/monitor-comply/zero-data-retention",
]
note = "Paid API traffic is excluded from training by default; free-tier training is opted out in the Admin Console. ZDR is a contract."
[providers.groq.data_controls]
control_scope = "account"
retention_default = "abuse_monitoring_only"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://console.groq.com/docs/your-data"]
note = "Inference content is not retained by default; troubleshooting and abuse logs are kept up to 30 days."
[providers.xai.data_controls]
control_scope = "account"
retention_default = "retained"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://docs.x.ai/developers/faq/security"]
note = "30-day encrypted retention. Zero data retention is a team-level arrangement; xAI documents no way to enable it for a specific API key."
[providers.cohere.data_controls]
control_scope = "account"
retention_default = "abuse_monitoring_only"
training_default = "trains"
checked_on = "2026-08-30"
sources = ["https://cohere.com/enterprise-data-commitments"]
note = "Training is opted in by default and is turned off in the dashboard under Settings, Data Controls; there is no request field."
[providers.together.data_controls]
control_scope = "account"
retention_default = "not_retained"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://docs.together.ai/docs/privacy-and-security"]
note = "Inputs and outputs are not stored by default; training is opt-in."
[providers.fireworks.data_controls]
control_scope = "account"
retention_default = "not_retained"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://docs.fireworks.ai/guides/security_compliance/data_handling"]
note = "Zero retention by default on the chat-completions surface Harn dials. Fireworks documents store on its Responses API, which this route does not use."
[providers.cerebras.data_controls]
control_scope = "none"
retention_default = "not_retained"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://support.cerebras.net/articles/1811589793-does-cerebras-retain-my-data"]
note = "Cerebras documents that it retains no prompts, requests, responses, or logs, so there is nothing to opt out of."
[providers.deepseek.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "trains"
checked_on = "2026-08-30"
sources = [
"https://cdn.deepseek.com/policies/en-US/deepseek-privacy-policy.html",
"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-service.html",
]
note = "The privacy policy asserts a general opt-out right but publishes no API mechanism, and does not separate API traffic from consumer chat. Treat as training by default."
# ── Local and self-hosted endpoints ──────────────────────────────────────────
#
# No third party receives the request. Retention is whatever the operator's own
# server does, which is why these declare `unspecified` rather than
# `not_retained`: Harn is not in a position to assert the operator's behavior.
[providers.ollama.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://github.com/ollama/ollama/blob/main/docs/api.md"]
note = "Local endpoint. The API documents no retention or training control because no third party receives the request."
[providers.llamacpp.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md"]
note = "Self-hosted endpoint. Retention is the operator's server behavior."
[providers.vllm.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html"]
note = "Self-hosted endpoint. Retention is the operator's server behavior."
[providers.tgi.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://huggingface.co/docs/text-generation-inference/en/reference/api_reference"]
note = "Self-hosted endpoint. Retention is the operator's server behavior."
[providers.mlx.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/SERVER.md"]
note = "Self-hosted endpoint. Retention is the operator's server behavior."
[providers.local.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-08-30"
sources = ["https://platform.openai.com/docs/api-reference/chat"]
note = "Generic user-configured OpenAI-compatible endpoint. The wire contract it speaks documents no retention control beyond store, which a local server is not required to honor."
# Meta sells the training posture per MODEL ID, not per request and not on the
# account: `muse-spark-1.3` is priced at list and not trained on, while
# `muse-spark-1.3-contributor` is ~12x cheaper on input and ~21x on output in
# exchange for permission to train on the traffic.
#
# So the provider-level row records the posture that applies when a caller
# names a standard route, and each `-contributor` row overrides it in
# `[models.<id>.data_controls]`. `control_scope` is `none` because that is
# literally true of a request: there is no header or body field to set. It is
# NOT a claim that no control exists — the control is the model id, and the
# model rows carry it.
[providers.meta.data_controls]
control_scope = "none"
retention_default = "unspecified"
training_default = "does_not_train"
checked_on = "2026-09-02"
sources = [
"https://developer.meta.com/ai/products/meta-model-api/",
"https://developer.meta.com/ai/models/muse-spark/",
]
note = "Standard routes are documented as not used to improve Meta's products. The separately priced -contributor routes ARE, and each declares that on its own model row."
# --- source: 12-local-runtime/lifecycle.toml ---
# Local runtime lifecycle metadata for `harn local`.
# These rows describe provider mechanics, not machine-specific model paths.
[providers.local.local_runtime]
kind = "external"
wire_protocol = "open_ai_compatible"
default_port = 8000
stop = "external"
notes = "User-managed generic OpenAI-compatible local endpoint. Harn can inspect and select it, but does not launch or stop its process."
[providers.ollama.local_runtime]
kind = "daemon_api"
wire_protocol = "ollama_api"
command = "ollama"
default_port = 11434
stop = "keep_alive_zero"
source_url = "https://github.com/ollama/ollama/blob/main/docs/api.md"
last_verified = "2026-06-05"
notes = "Load via Ollama generate/chat warmup; unload by posting an empty prompt with keep_alive=0."
[providers.llamacpp.local_runtime]
kind = "managed_process"
wire_protocol = "open_ai_compatible"
command = "llama-server"
model_source_env = "LLAMACPP_MODEL"
default_port = 8001
model_arg = "--model"
served_model_arg = "--alias"
host_arg = "--host"
port_arg = "--port"
ctx_arg = "--ctx-size"
parallel_arg = "--parallel"
gpu_layers_arg = "--n-gpu-layers"
cache_type_k_arg = "--cache-type-k"
cache_type_v_arg = "--cache-type-v"
cache_ram_arg = "--cache-ram"
chat_template_kwargs_arg = "--chat-template-kwargs"
jinja_arg = "--jinja"
reasoning_arg = "--reasoning"
reasoning_format_arg = "--reasoning-format"
flash_attn_arg = "--flash-attn"
metrics_arg = "--metrics"
default_args = ["--jinja", "--reasoning", "off", "--reasoning-format", "deepseek", "--metrics", "--flash-attn", "on"]
stop = "pid"
source_url = "https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md"
last_verified = "2026-06-05"
notes = "OpenAI-compatible HTTP server. Use --model-source or LLAMACPP_MODEL for the GGUF path; Harn records the launched PID for local stop."
[providers.mlx.local_runtime]
kind = "managed_process"
wire_protocol = "open_ai_compatible"
command = "mlx_lm.server"
model_source_env = "MLX_MODEL"
default_port = 8002
model_arg = "--model"
host_arg = "--host"
port_arg = "--port"
stop = "pid"
source_url = "https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/SERVER.md"
last_verified = "2026-06-05"
notes = "OpenAI-like MLX-LM server. Use --model-source or MLX_MODEL for an MLX-compatible path or Hugging Face repo id."
[providers.vllm.local_runtime]
kind = "managed_process"
wire_protocol = "open_ai_compatible"
command = "vllm"
prefix_args = ["serve"]
model_source_env = "VLLM_MODEL"
default_port = 8000
model_arg = "--model"
served_model_arg = "--served-model-name"
host_arg = "--host"
port_arg = "--port"
ctx_arg = "--max-model-len"
enable_lora_arg = "--enable-lora"
lora_modules_arg = "--lora-modules"
lora_modules_value_format = "json_with_base_model"
max_lora_rank_arg = "--max-lora-rank"
stop = "pid"
source_url = "https://docs.vllm.ai/en/stable/cli/serve/"
last_verified = "2026-07-02"
notes = "OpenAI-compatible vLLM server. `harn local launch --lora-adapter name=path` maps to vLLM's startup LoRA module flags with base-model lineage so the adapter appears as a request model."
[providers.tgi.local_runtime]
kind = "managed_process"
wire_protocol = "open_ai_compatible"
command = "text-generation-launcher"
model_source_env = "TGI_MODEL"
default_port = 8080
model_arg = "--model-id"
host_arg = "--hostname"
port_arg = "--port"
stop = "pid"
source_url = "https://huggingface.co/docs/text-generation-inference/en/basic_tutorials/using_cli"
last_verified = "2026-07-17"
notes = "OpenAI-compatible Hugging Face Text Generation Inference server. Use --model-source or TGI_MODEL for the Hugging Face model id or local model directory; Harn records the launched PID for local stop."
# --- source: 20-routing/inference.toml ---
# ── Inference rules ──────────────────────────────────────────────────────────
# Map a model ID shape to a default provider when the caller doesn't
# specify one. First match wins. User overlays prepend, so they can
# preempt these defaults without removing them.
[[inference_rules]]
pattern = "claude-*"
provider = "anthropic"
[[inference_rules]]
pattern = "gpt-*"
provider = "openai"
[[inference_rules]]
pattern = "o1*"
provider = "openai"
[[inference_rules]]
pattern = "o3*"
provider = "openai"
[[inference_rules]]
pattern = "o4*"
provider = "openai"
[[inference_rules]]
pattern = "anthropic.claude-*"
provider = "bedrock"
[[inference_rules]]
pattern = "meta.llama*"
provider = "bedrock"
[[inference_rules]]
pattern = "amazon.*"
provider = "bedrock"
[[inference_rules]]
pattern = "mistral.*"
provider = "bedrock"
[[inference_rules]]
pattern = "cohere.*"
provider = "bedrock"
[[inference_rules]]
pattern = "gemini-*"
provider = "gemini"
[[inference_rules]]
pattern = "mistral-*"
provider = "mistral"
[[inference_rules]]
pattern = "devstral-*"
provider = "mistral"
[[inference_rules]]
pattern = "codestral-*"
provider = "mistral"
[[inference_rules]]
pattern = "magistral-*"
provider = "mistral"
[[inference_rules]]
pattern = "command-*"
provider = "cohere"
[[inference_rules]]
pattern = "grok-*"
provider = "xai"
[[inference_rules]]
pattern = "groq/*"
provider = "groq"
# Cerebras model IDs come back as bare names ("gpt-oss-120b",
# "llama-3.3-70b") from /v1/models, so callers slash-prefix
# them as "cerebras/<model>" to disambiguate from OpenRouter's
# one-slash convention. Match the prefix before the generic
# single-slash rule routes it elsewhere.
[[inference_rules]]
pattern = "cerebras/*"
provider = "cerebras"
# Baseten catalog rows carry `baseten/<provider>/<model>` ids so they don't
# collide with the same native IDs on Z.AI, Together, DeepInfra, or OpenRouter.
[[inference_rules]]
pattern = "baseten/*"
provider = "baseten"
# DashScope catalog rows carry `dashscope/<model>` ids for the same reason
# (the bare `qwen3.6-35b-a3b` id belongs to the llamacpp route).
[[inference_rules]]
pattern = "dashscope/*"
provider = "dashscope"
# MiniMax — released-name canonical IDs (capital-M) sit on the direct
# API. OpenRouter mirrors the same family under `minimax/*` slugs; that
# routing is handled by the generic slash-prefix rule.
[[inference_rules]]
pattern = "MiniMax-*"
provider = "minimax"
# Z.AI — GLM family. Bare IDs ("glm-5", "glm-5.1") dial the direct
# OpenAI-compatible Z.AI endpoint; `zhipu/*` is accepted as a legacy
# prefix some packagers still use.
[[inference_rules]]
pattern = "glm-*"
provider = "zai"
[[inference_rules]]
pattern = "zhipu/*"
provider = "zai"
# DeepSeek — V4 family. The direct API uses bare IDs while OpenRouter
# slugs them as `deepseek/*`; only the bare form needs an inference
# rule because slash-prefixed IDs hit the generic OpenRouter rule.
[[inference_rules]]
pattern = "deepseek-v4*"
provider = "deepseek"
# --- source: 20-routing/tier-defaults.toml ---
# ── Tier defaults ────────────────────────────────────────────────────────────
# Tier is self-declared on each model row via `tier = "small" | "mid" |
# "frontier" | "reasoning"`. The legacy pattern-based [[tier_rules]] table
# has been removed; the catalog is the single source of truth. Models
# without an explicit `tier` resolve to `tier_defaults.default`.
#
# Picking the right value for a row is a judgement call with real downstream
# effects. See "Choosing a tier" in ../README.md before setting one.
[tier_defaults]
default = "mid"
# --- source: 30-aliases/aliases.toml ---
# ── Aliases ──────────────────────────────────────────────────────────────────
# Short symbolic names → (model id, provider, optional tool_format). The
# tier-resolution path (`resolve_tier_model("frontier", None)`) reads
# `frontier`, `mid`, `small`; provider-scoped tiers like `tier/mid` let
# callers force a specific resolution per provider.
# Short flagship aliases — these track whatever the current
# generation is. Bump these when a successor lands.
[aliases.sonnet]
id = "claude-sonnet-5-5"
provider = "anthropic"
[aliases.sonnet55]
id = "claude-sonnet-5-5"
provider = "anthropic"
# Previous Sonnet generations, kept addressable for pinned workflows.
[aliases.sonnet5]
id = "claude-sonnet-5"
provider = "anthropic"
[aliases.sonnet46]
id = "claude-sonnet-4-6"
provider = "anthropic"
[aliases.opus]
id = "claude-opus-5-5"
provider = "anthropic"
[aliases.opus55]
id = "claude-opus-5-5"
provider = "anthropic"
# Previous Opus generations, kept addressable for pinned workflows.
[aliases.opus5]
id = "claude-opus-5"
provider = "anthropic"
[aliases.opus48]
id = "claude-opus-4-8"
provider = "anthropic"
# Fable is the Mythos-class tier above Opus, not an Opus successor — the
# `opus` alias tracks the current Opus generation (claude-opus-5-5), not Fable.
[aliases.fable]
id = "claude-fable-5-1"
provider = "anthropic"
[aliases.fable51]
id = "claude-fable-5-1"
provider = "anthropic"
# Previous Fable generation, kept addressable for pinned workflows.
[aliases.fable5]
id = "claude-fable-5"
provider = "anthropic"
[aliases.haiku]
id = "claude-haiku-5-5"
provider = "anthropic"
[aliases.haiku55]
id = "claude-haiku-5-5"
provider = "anthropic"
# Previous Haiku generation, kept addressable for pinned workflows. Unlike
# Haiku 5.5 it accepts temperature and assistant prefill.
[aliases.haiku45]
id = "claude-haiku-4-5-20251001"
provider = "anthropic"
[aliases.frontier]
id = "claude-sonnet-5-5"
provider = "anthropic"
[aliases."tier/frontier"]
id = "claude-sonnet-5-5"
provider = "anthropic"
# Default balanced hosted route for routine coding-agent work.
[aliases.mid]
id = "qwen/qwen3-coder-next"
provider = "openrouter"
[aliases."tier/mid"]
id = "qwen/qwen3-coder-next"
provider = "openrouter"
# Meter-measured interim automatic route for Burin hosts. Keep the generic
# `mid` tier independent: this alias names the exact provider/model receipt.
[aliases."fw-gpt-oss-120b"]
id = "accounts/fireworks/models/gpt-oss-120b"
provider = "fireworks"
# GPT-6 tiers: Astra is the frontier, Sol the balanced tier (GPT-6 has no
# Terra; Sol is cheaper than GPT-5.6 Terra), Luna the small tier. The balanced
# tier tracks the newest Sol, GPT-6.1 Sol (2026-09-29); GPT-6 Sol stays
# addressable by id and as `sol6`.
[aliases."openai/mid"]
id = "gpt-6.1-sol"
provider = "openai"
[aliases."openai/frontier"]
id = "gpt-6-astra"
provider = "openai"
[aliases."openai/small"]
id = "gpt-6-luna"
provider = "openai"
# Preserve OpenAI's public GPT-5.6 family alias while resolving to the
# explicit tier for stable catalog metadata, receipts, and cost projections.
[aliases."gpt-5.6"]
id = "gpt-5.6-sol"
provider = "openai"
# OpenAI publishes no bare `gpt-6` id; the family alias names the flagship.
# Tier names resolve to the GPT-6 generation.
[aliases."gpt-6"]
id = "gpt-6-astra"
provider = "openai"
[aliases.astra]
id = "gpt-6-astra"
provider = "openai"
[aliases.sol]
id = "gpt-6.1-sol"
provider = "openai"
[aliases.sol61]
id = "gpt-6.1-sol"
provider = "openai"
[aliases.sol6]
id = "gpt-6-sol"
provider = "openai"
[aliases.luna]
id = "gpt-6-luna"
provider = "openai"
# The small tier default stays on an open-weight host by policy (see
# test_resolve_tier_model_default_aliases). Was Qwen/Qwen3.5-9B on
# OpenRouter — that route went stale (Burin suppresses it); Gemma 4
# 26B-A4B on OpenRouter is the current cheap open-weight default
# ($0.06/$0.33, 4B active params, native tools).
[aliases.small]
id = "google/gemma-4-26b-a4b-it"
provider = "openrouter"
[aliases."tier/small"]
id = "google/gemma-4-26b-a4b-it"
provider = "openrouter"
# Local Gemma 4 variants (vLLM / OpenAI-compat backend at `providers.local`).
[aliases.local-gemma4]
id = "gemma-4-26b-a4b-it"
provider = "local"
[aliases.local-gemma4-26b]
id = "gemma-4-26b-a4b-it"
provider = "local"
[aliases.local-gemma4-31b]
id = "gemma-4-31b-it"
provider = "local"
[aliases.local-gemma4-e4b]
id = "gemma-4-e4b-it"
provider = "local"
[aliases.local-gemma4-e2b]
id = "gemma-4-e2b-it"
provider = "local"
[aliases.ollama-gemma4]
id = "gemma4:26b"
provider = "ollama"
tool_format = "text"
[aliases.ollama-gemma4-26b]
id = "gemma4:26b"
provider = "ollama"
tool_format = "text"
[aliases.ollama-gemma4-12b]
id = "gemma4:12b-mlx"
provider = "ollama"
tool_format = "text"
[aliases.ollama-gemma4-12b-nvfp4]
id = "gemma4:12b-nvfp4"
provider = "ollama"
tool_format = "text"
[aliases.local-gemma4-12b]
id = "gemma-4-12b-it"
provider = "local"
# Gemma 4 26B/31B via hosted APIs (the 12B is on-device only). The Gemini API
# serves Gemma under its bare id; OpenRouter/Together use org-prefixed ids.
[aliases.gemini-gemma4-31b]
id = "models/gemma-4-31b-it"
provider = "gemini"
[aliases.gemini-gemma4-26b]
id = "models/gemma-4-26b-a4b-it"
provider = "gemini"
[aliases.openrouter-gemma4-31b]
id = "google/gemma-4-31b-it"
provider = "openrouter"
[aliases.openrouter-gemma4-26b]
id = "google/gemma-4-26b-a4b-it"
provider = "openrouter"
[aliases.together-gemma4-31b]
id = "google/gemma-4-31B-it"
provider = "together"
# Kimi via OpenRouter. Keep the short alias on the current code-focused route;
# the full model id remains available for callers that want explicit slugs.
[aliases."kimi-k2.7-code"]
id = "moonshotai/kimi-k2.7-code"
provider = "openrouter"
[aliases."openrouter-kimi-k2.7-code"]
id = "moonshotai/kimi-k2.7-code"
provider = "openrouter"
# Kimi via Moonshot's first-party API. Native tool calls are reliable on
# the direct route, so pin `native`.
[aliases."kimi-direct"]
id = "moonshot/kimi-k2.6"
provider = "moonshot"
tool_format = "native"
[aliases."moonshot-kimi"]
id = "moonshot/kimi-k2.6"
provider = "moonshot"
tool_format = "native"
[aliases."kimi-k3"]
id = "moonshot/kimi-k3"
provider = "moonshot"
tool_format = "native"
[aliases."moonshot-kimi-k3"]
id = "moonshot/kimi-k3"
provider = "moonshot"
tool_format = "native"
[aliases."moonshot-kimi-k2.7-code"]
id = "moonshot/kimi-k2.7-code"
provider = "moonshot"
tool_format = "json"
[aliases."moonshot-kimi-k2.7-code-highspeed"]
id = "moonshot/kimi-k2.7-code-highspeed"
provider = "moonshot"
tool_format = "json"
# DeepInfra — open-weight OpenAI-compatible host.
[aliases."deepinfra-deepseek"]
id = "deepinfra/deepseek-ai/DeepSeek-V4-Pro"
provider = "deepinfra"
tool_format = "native"
# Stays on the fenced-JSON text channel while every other GLM route moved to
# native: DeepInfra's GLM-5.2 deployment emits 38 duplicate native tool calls
# for a single intent under tool_choice=required (2026-08-15, deterministic
# 4/4). See the `*glm-5.2*` rule in 36-deepinfra.toml.
[aliases."deepinfra-glm-5.2"]
id = "deepinfra/zai-org/GLM-5.2"
provider = "deepinfra"
tool_format = "json"
[aliases."deepinfra-kimi-k2.7-code"]
id = "deepinfra/moonshotai/Kimi-K2.7-Code"
provider = "deepinfra"
tool_format = "native"
# probed 2026-06-24 (provider-tool-mode-sweep): native bills empty / json flaky,
# heredoc text 5/5 byte-clean. Route is native_unreliable; pin text.
[aliases."deepinfra-qwen3.6"]
id = "deepinfra/Qwen/Qwen3.6-35B-A3B"
provider = "deepinfra"
tool_format = "text"
# Baseten Model APIs. Every alias here was re-probed live on 2026-08-15 and
# returned clean OpenAI `message.tool_calls`, so they all ride the native
# channel. GLM used to pin the text grammar on a 2026-06-23 markup-leak
# observation; a 16/16 re-probe across sync/streaming and tool_choice
# auto/required found no leak, so that pin is gone. See 39-baseten.toml.
#
# `baseten-nemotron-super` is deliberately absent: Baseten returned HTTP 410
# "deprecated" for `nvidia/Nemotron-120B-A12B` on 2026-08-15 and serves no
# successor for that size, so the alias would only route to an error.
[aliases."baseten-glm-5.2"]
id = "baseten/zai-org/GLM-5.2"
provider = "baseten"
tool_format = "native"
[aliases."baseten-glm-5.2-fast"]
id = "baseten/zai-org/GLM-5.2-Fast"
provider = "baseten"
tool_format = "native"
[aliases."baseten-kimi-k2.7-code"]
id = "baseten/moonshotai/Kimi-K2.7-Code"
provider = "baseten"
tool_format = "native"
[aliases."baseten-deepseek-v4-pro"]
id = "baseten/deepseek-ai/DeepSeek-V4-Pro"
provider = "baseten"
tool_format = "native"
[aliases."baseten-deepseek-v4-pro-0813"]
id = "baseten/deepseek-ai/DeepSeek-V4-Pro-0813"
provider = "baseten"
tool_format = "native"
[aliases."baseten-deepseek-v4-flash-0731"]
id = "baseten/deepseek-ai/DeepSeek-V4-Flash-0731"
provider = "baseten"
tool_format = "native"
[aliases."baseten-nemotron-ultra"]
id = "baseten/nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B"
provider = "baseten"
tool_format = "native"
[aliases."baseten-gpt-oss-120b"]
id = "baseten/openai/gpt-oss-120b"
provider = "baseten"
tool_format = "native"
# SambaNova Cloud — fast RDU inference.
[aliases."sambanova-deepseek"]
id = "sambanova/DeepSeek-V3.2"
provider = "sambanova"
tool_format = "native"
[aliases."sambanova-llama"]
id = "sambanova/Meta-Llama-3.3-70B-Instruct"
provider = "sambanova"
tool_format = "native"
# Retired the M2.7 alias after its recorded 2026-10-01 sunset. The historical
# model row keeps its identity and retirement facts; M3 has its own selector.
# M3 traffic was unavailable during the 2026-08-26 audit. Keep the proven
# SambaNova MiniMax family format until a route-specific fidelity sweep passes.
[aliases."sambanova-minimax-m3"]
id = "sambanova/MiniMax-M3"
provider = "sambanova"
tool_format = "text"
# gpt-oss (Harmony) native channel is a footgun on the SambaNova pay-per-token
# route (empty tool_calls / reasoning-channel-only); the route is pinned to TEXT
# in 37-sambanova.toml, so this alias pins `text` to match (a `native` pin would
# auto-correct anyway).
[aliases."sambanova-gpt-oss-120b"]
id = "sambanova/gpt-oss-120b"
provider = "sambanova"
tool_format = "text"
# Qwen 3.7 via OpenRouter/Together. Keep bare aliases on OpenRouter because it
# exposes both Max and Plus; Together currently serves only Max.
[aliases."qwen3.7"]
id = "qwen/qwen3.7-max"
provider = "openrouter"
[aliases."qwen3.7-max"]
id = "qwen/qwen3.7-max"
provider = "openrouter"
[aliases."qwen3.7-plus"]
id = "qwen/qwen3.7-plus"
provider = "openrouter"
[aliases."openrouter-qwen3.7-max"]
id = "qwen/qwen3.7-max"
provider = "openrouter"
[aliases."openrouter-qwen3.7-plus"]
id = "qwen/qwen3.7-plus"
provider = "openrouter"
[aliases."together-qwen3.7-max"]
id = "Qwen/Qwen3.7-Max"
provider = "together"
# Qwen 3.8 Max. OpenRouter publishes only the dated 0902 snapshot.
[aliases."qwen3.8-max"]
id = "qwen/qwen3.8-max-0902"
provider = "openrouter"
[aliases."openrouter-qwen3.8-max"]
id = "qwen/qwen3.8-max-0902"
provider = "openrouter"
[aliases."deepinfra-qwen3.8-max"]
id = "deepinfra/Qwen/Qwen3.8-Max"
provider = "deepinfra"
[aliases."openrouter-kimi-k3"]
id = "moonshotai/kimi-k3"
provider = "openrouter"
[aliases."deepinfra-minimax-m3"]
id = "deepinfra/MiniMaxAI/MiniMax-M3"
provider = "deepinfra"
# Qwen 3.6 via OpenRouter. These route through Harn capability rows that keep
# provider-native tools, disable Qwen reasoning automatically for tool-bearing
# turns, and deny the OpenRouter Ambient upstream for structured tool calls.
[aliases."qwen3.6"]
id = "qwen/qwen3.6-flash"
provider = "openrouter"
[aliases."qwen3.6-flash"]
id = "qwen/qwen3.6-flash"
provider = "openrouter"
[aliases."qwen3.6-plus"]
id = "qwen/qwen3.6-plus"
provider = "openrouter"
[aliases."qwen3.6-35b"]
id = "qwen/qwen3.6-35b-a3b"
provider = "openrouter"
[aliases."openrouter-qwen3.6"]
id = "qwen/qwen3.6-flash"
provider = "openrouter"
[aliases."openrouter-qwen3.6-flash"]
id = "qwen/qwen3.6-flash"
provider = "openrouter"
[aliases."openrouter-qwen3.6-plus"]
id = "qwen/qwen3.6-plus"
provider = "openrouter"
[aliases."openrouter-qwen3.6-35b"]
id = "qwen/qwen3.6-35b-a3b"
provider = "openrouter"
# OpenRouter-only coding specialist.
[aliases."kat-coder-pro-v2"]
id = "kwaipilot/kat-coder-pro-v2"
provider = "openrouter"
[aliases."openrouter-kat-coder-pro-v2"]
id = "kwaipilot/kat-coder-pro-v2"
provider = "openrouter"
# Together mirror of DeepSeek V4 Pro. The stable aliases follow Together's
# current dated production route; the retired preview remains addressable only
# by its exact provider id for historical attribution.
[aliases."together-deepseek"]
id = "deepseek-ai/DeepSeek-V4-Pro-0813"
provider = "together"
[aliases."together-deepseek-v4-pro"]
id = "deepseek-ai/DeepSeek-V4-Pro-0813"
provider = "together"
[aliases."together-deepseek-v4-pro-0813"]
id = "deepseek-ai/DeepSeek-V4-Pro-0813"
provider = "together"
# StepFun long-context agent route via OpenRouter.
[aliases."step-3.7-flash"]
id = "stepfun/step-3.7-flash"
provider = "openrouter"
[aliases."openrouter-step-3.7-flash"]
id = "stepfun/step-3.7-flash"
provider = "openrouter"
# Together mirrors for current GLM/MiniMax agent routes.
#
# There is no `together-glm-5.1` alias: Together serves GLM-5.1 and GLM-5 only
# through a provisioned dedicated endpoint, so serverless calls fail with HTTP
# 400 `model_not_available` (2026-08-15 sweep). GLM-5.2 is the one serverless
# Together GLM route, and `together-glm` points at it so the obvious name works.
[aliases."together-glm"]
id = "zai-org/GLM-5.2"
provider = "together"
[aliases."together-glm-5.2"]
id = "zai-org/GLM-5.2"
provider = "together"
[aliases."together-minimax-m2.7"]
id = "MiniMaxAI/MiniMax-M2.7"
provider = "together"
# NVIDIA NIM.
[aliases."nvidia-nemotron-ultra"]
id = "nvidia/nemotron-3-ultra-550b-a55b"
provider = "nvidia"
tool_format = "native"
[aliases."nvidia-nemotron-super"]
id = "nvidia/nemotron-3-super-120b-a12b"
provider = "nvidia"
tool_format = "native"
[aliases."nvidia-nemotron-nano"]
id = "nvidia/nemotron-nano-3-30b-a3b"
provider = "nvidia"
tool_format = "native"
# NIM end-of-lifed both undated DeepSeek V4 builds on 2026-08-07, and by
# 2026-09-26 the dated Flash snapshot too. This alias names V4, so it stays on
# the deprecated snapshot row, whose `superseded_by` names the V4.1 route,
# rather than silently moving callers to a different model.
[aliases."nvidia-deepseek-v4-flash"]
id = "nvidia/deepseek-v4-flash-0731"
provider = "nvidia"
tool_format = "native"
# Removed 2026-09-20 with the nvidia/minimax-m3 row: NIM no longer serves any
# MiniMax build. `minimax-m3` and the SambaNova/Fireworks/OpenRouter aliases
# still reach the model.
[aliases."nvidia-kimi-k2.6"]
id = "nvidia/kimi-k2.6"
provider = "nvidia"
tool_format = "native"
# qwen3.6 has no working Ollama route — Ollama's qwen3.5-family server-side
# tool-call parser 500s on text-tool output (ollama/ollama#14986, #14570).
# Use the llamacpp provider for local qwen3.x.
# llama.cpp — Unsloth Dynamic 2.0 GGUF served by llama-server.
# No `tool_format` pin on any llama.cpp qwen3.6 alias: they all inherit the
# `*qwen3.6*` capability row's native default (re-promoted 2026-07-18 — see that
# row's tool_mode_parity_notes and harn#5162), matching the mlx/vLLM siblings
# that serve the same weights. To force the text channel instead, set
# `tool_format = "text"` (heredoc) or `"json"` (fenced-JSON, whose ```tool fence
# sidesteps the reserved <tool_call> token so the reserved-token remap stays
# correct).
[aliases."llamacpp-qwen3.6"]
id = "qwen3.6-35b-a3b"
provider = "llamacpp"
[aliases."llamacpp-qwen3.6-q4"]
id = "qwen3.6-35b-a3b-ud-q4-k-xl"
provider = "llamacpp"
[aliases."local-qwen3.6"]
id = "qwen3.6-35b-a3b-ud-q4-k-xl"
provider = "llamacpp"
[aliases."local-qwen3.6-gguf"]
id = "qwen3.6-35b-a3b-ud-q4-k-xl"
provider = "llamacpp"
# MLX (Apple Silicon). Local MLX routes use the coding-tuned Qwen3.6-35B-A3B
# MoE served via `mlx_lm.server` (burin #2717). Keep every MLX alias pointed at
# live MoE weights so `auto`/preset selection lands on real weights. These
# share the `qwen3.6-35b-a3b` equivalence_group with the llama.cpp GGUF route,
# so eval aggregation compares the two runtimes directly.
[aliases."mlx-qwen3.6"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
[aliases."mlx-qwen3.6-q4"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
[aliases."mlx-qwen3.6-q8"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-8bit"
provider = "mlx"
# Back-compat: the old 27B alias names resolve to the live 35B-A3B MoE so any
# pinned config keeps working instead of pointing at non-existent weights.
[aliases.mlx-qwen36-27b]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
[aliases."mlx-qwen3.6-27b"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
[aliases."mlx-qwen3.6-27b-q4"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
[aliases."local-qwen3.6-27b"]
id = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
provider = "mlx"
# MiniMax direct API aliases.
[aliases.minimax]
id = "MiniMax-M3"
provider = "minimax"
[aliases."minimax-m2"]
id = "MiniMax-M2"
provider = "minimax"
[aliases."minimax-m2.5"]
id = "MiniMax-M2.5"
provider = "minimax"
[aliases."minimax-m2.7"]
id = "MiniMax-M2.7"
provider = "minimax"
[aliases."minimax-m3"]
id = "MiniMax-M3"
provider = "minimax"
# Z.AI GLM aliases. These previously pinned `tool_format = "text"` to match the
# zai GLM-5 rows' text pin. The 2026-08-15 cross-host re-probe found GLM's
# native channel clean on every reachable host, so 98-zai.toml now prefers
# native and these aliases carry no tool_format override — they inherit the
# capability matrix instead of hard-coding a channel that has to be kept in
# sync by hand.
# `glm` tracks the current GLM flagship. GLM-5.3 supersedes GLM-5.2 at the
# same tariff and the same wire shape, so the bare name follows it.
[aliases.glm]
id = "glm-5.3"
provider = "zai"
[aliases."glm-5"]
id = "glm-5"
provider = "zai"
[aliases."glm-5.1"]
id = "glm-5.1"
provider = "zai"
[aliases."glm-5.2"]
id = "glm-5.2"
provider = "zai"
[aliases."glm-5.3"]
id = "glm-5.3"
provider = "zai"
[aliases."glm-5.3-flash"]
id = "glm-5.3-flash"
provider = "zai"
# GLM-5.3-FlashX, Z.AI's higher-throughput Flash build (released 2026-09-18).
[aliases."glm-5.3-flashx"]
id = "glm-5.3-flashx"
provider = "zai"
[aliases."glm-flash"]
id = "glm-5.3-flash"
provider = "zai"
[aliases."openrouter-glm-5.2"]
id = "z-ai/glm-5.2"
provider = "openrouter"
[aliases."openrouter-glm-5.3"]
id = "z-ai/glm-5.3"
provider = "openrouter"
[aliases."openrouter-glm-5.3-flash"]
id = "z-ai/glm-5.3-flash"
provider = "openrouter"
# DeepSeek direct API aliases. The legacy V4 Flash ID now serves V4.1 Flash.
[aliases.deepseek]
id = "deepseek-flash"
provider = "deepseek"
[aliases."deepseek-flash"]
id = "deepseek-flash"
provider = "deepseek"
[aliases."deepseek-pro"]
id = "deepseek-v4-pro"
provider = "deepseek"
[aliases."deepseek-v4-flash"]
id = "deepseek-v4-flash"
provider = "deepseek"
[aliases."deepseek-v4-pro"]
id = "deepseek-v4-pro"
provider = "deepseek"
# Dated DeepSeek V4 snapshots, routed via OpenRouter (the host these were
# verified serving on 2026-08-15; both returned a single clean native
# `message.tool_calls`). Use these when a run must pin one fixed build — the
# undated aliases above float with whatever DeepSeek promotes, which silently
# moves eval baselines. On OpenRouter the 0813 snapshot is also ~2.7x cheaper
# than the undated `deepseek/deepseek-v4-pro` route.
#
# No `tool_format` pin here, matching every sibling DeepSeek alias: the
# capability matrix already resolves these routes to the native channel, and a
# pin repeated here would override a later host-specific correction instead of
# inheriting it.
[aliases."deepseek-v4-pro-0813"]
id = "deepseek/deepseek-v4-pro-0813"
provider = "openrouter"
[aliases."deepseek-v4-flash-0731"]
id = "deepseek/deepseek-v4-flash-0731"
provider = "openrouter"
[aliases."together-deepseek-v4-flash-0731"]
id = "deepseek-ai/DeepSeek-V4-Flash-0731"
provider = "together"
[aliases.cohere]
id = "command-a-plus-05-2026"
provider = "cohere"
[aliases."command-a-plus"]
id = "command-a-plus-05-2026"
provider = "cohere"
[aliases.grok]
id = "grok-4.5"
provider = "xai"
tool_format = "native"
[aliases."grok-4.5"]
id = "grok-4.5"
provider = "xai"
tool_format = "native"
[aliases."grok-4.5-latest"]
id = "grok-4.5"
provider = "xai"
tool_format = "native"
# Grok 4.6 shipped 2026-08-06. The bare `grok` alias deliberately stays on 4.5:
# xAI still points its own `grok-4.5-latest` and `grok-build-latest` aliases at
# 4.5 and publishes no `-latest` alias for 4.6 (https://api.x.ai/v1/models,
# observed 2026-09-20), so moving the default would be our claim, not xAI's.
[aliases."grok-4.6"]
id = "grok-4.6"
provider = "xai"
tool_format = "native"
[aliases."grok-4.3"]
id = "grok-4.3"
provider = "xai"
tool_format = "native"
[aliases.grok-code]
id = "grok-build-0.1"
provider = "xai"
[aliases."grok-code-fast"]
id = "grok-build-0.1"
provider = "xai"
# The provider-published logical id resolves through the same alias path as the
# short selectors. Tool format remains capability-owned.
[aliases."grok-code-fast-1"]
id = "grok-build-0.1"
provider = "xai"
# Devstral (Mistral's agentic-coding tune).
# No `tool_format` pin: these aliases inherit the `devstral-small-2*` capability
# row's `json` (fenced-JSON) text-channel default. devstral has no
# reserved-token constraint, so json is delimiter-safe and avoids heredoc's
# `<<EOF` content leak. To force heredoc, set `tool_format = "text"` here or pin
# the capability row.
[aliases.devstral-small-2]
id = "devstral-small-2:24b"
provider = "ollama"
[aliases.ollama-devstral-small-2]
id = "devstral-small-2:24b"
provider = "ollama"
# NOTE: there is intentionally no `ollama-devstral-small-2-native` alias.
# Devstral Small 2 on Ollama is text-tool-only (see the `devstral-small-2*`
# capability rule: native_tools = false). A `tool_format = "native"` pin here
# would be silently half-supported — accepted by resolution but degraded to
# the text protocol downstream — which the catalog validator rejects.
# Mistral direct code routes.
[aliases.codestral]
id = "codestral-2508"
provider = "mistral"
[aliases."devstral-medium"]
id = "mistral-medium-3-5"
provider = "mistral"
[aliases."devstral-small"]
id = "mistral-medium-3-5"
provider = "mistral"
# Current cheap open-weight coder routes.
[aliases."qwen3-coder-next"]
id = "qwen/qwen3-coder-next"
provider = "openrouter"
[aliases."openrouter-qwen3-coder-next"]
id = "qwen/qwen3-coder-next"
provider = "openrouter"
[aliases."huggingface-qwen3-coder"]
id = "Qwen/Qwen3-Coder-480B-A35B-Instruct"
provider = "huggingface"
tool_format = "native"
[aliases."hf-qwen3-coder"]
id = "Qwen/Qwen3-Coder-480B-A35B-Instruct"
provider = "huggingface"
tool_format = "native"
[aliases."openrouter-qwen3.5-397b"]
id = "qwen/qwen3.5-397b-a17b"
provider = "openrouter"
# Removed 2026-09-20 with the qwen/qwen3.6-27b row: Groq's live /models index
# no longer serves it. `groq-qwen3.8` below is the successor alias and already
# existed, so no alias was re-pointed.
[aliases."groq-qwen3.8"]
id = "qwen/qwen3.8-27b"
provider = "groq"
tool_format = "native"
# Z.AI cheap coding route (confirmed serving at paas/v4).
[aliases."glm-4.6"]
id = "glm-4.6"
provider = "zai"
# Together mirrors for MiniMax M3 / Kimi K2.7 Code.
[aliases."together-minimax-m3"]
id = "MiniMaxAI/MiniMax-M3"
provider = "together"
[aliases."together-kimi-k2.7-code"]
id = "moonshotai/Kimi-K2.7-Code"
provider = "together"
# DashScope first-party Qwen routes.
[aliases."dashscope-qwen3-coder-next"]
id = "dashscope/qwen3-coder-next"
provider = "dashscope"
[aliases."dashscope-qwen3.7-max"]
id = "dashscope/qwen3.7-max"
provider = "dashscope"
# Vercel AI Gateway routes. These aliases intentionally resolve to
# collision-free catalog ids while the catalog's `wire_model` carries the
# creator/model slug used by the Gateway API.
[aliases."vercel-gpt-5.4-nano"]
id = "vercel/openai/gpt-5.4-nano"
provider = "vercel_ai_gateway"
[aliases."vercel-claude-haiku-4.5"]
id = "vercel/anthropic/claude-haiku-4.5"
provider = "vercel_ai_gateway"
[aliases."vercel-gemini-3.1-flash-lite"]
id = "vercel/google/gemini-3.1-flash-lite"
provider = "vercel_ai_gateway"
# --- source: 30-aliases/tool-calling.toml ---
# ── Alias tool-calling probe state ───────────────────────────────────────────
# Per-alias overrides recording the last-observed native vs. text vs.
# streaming tool-call probe outcome and the desired fallback. Hosts may
# update these via providers.toml overlays as they re-probe a model.
[alias_tool_calling.ollama-gemma4]
native = "unknown"
text = "unknown"
streaming_native = "unknown"
fallback_mode = "disabled"
failure_reason = "requires_tool_probe"
[alias_tool_calling.ollama-gemma4-12b]
native = "unknown"
text = "unknown"
streaming_native = "unknown"
fallback_mode = "disabled"
failure_reason = "requires_tool_probe"
[alias_tool_calling."llamacpp-qwen3.6-q4"]
native = "pass"
text = "unknown"
streaming_native = "pass"
fallback_mode = "native"
last_probe_at = "2026-06-05"
[alias_tool_calling."local-qwen3.6"]
native = "pass"
text = "unknown"
streaming_native = "pass"
fallback_mode = "native"
last_probe_at = "2026-06-05"
[alias_tool_calling."local-qwen3.6-gguf"]
native = "pass"
text = "unknown"
streaming_native = "pass"
fallback_mode = "native"
last_probe_at = "2026-06-05"
# MLX route serves the Qwen3.6-35B-A3B MoE via mlx_lm.server (burin #2717).
# Native is UNPROVEN on mlx_lm.server (the runtime profile requires a tool_probe
# before native is trusted; the validated `native` precedent is the llama.cpp
# sibling, a different server). Keep native = "unknown" so the readiness/probe
# path verifies served identity + a one-tool probe before selecting native.
[alias_tool_calling."mlx-qwen3.6"]
native = "unknown"
text = "unknown"
streaming_native = "unknown"
fallback_mode = "native"
failure_reason = "requires_served_identity_and_tool_probe"
[alias_tool_calling."mlx-qwen3.6-27b"]
native = "unknown"
text = "unknown"
streaming_native = "unknown"
fallback_mode = "native"
failure_reason = "requires_served_identity_and_tool_probe"
# --- source: 40-defaults/generation.toml ---
# Generation defaults are inherited when a call does not set the option.
# Exact route patterns may override publisher defaults selected through
# `logical:<logical_model>`.
# OpenAI's GPT-OSS reference configuration recommends neutral sampling and
# high reasoning effort for maximum coding/reasoning quality. Every hosted
# route below shares `logical_model = "openai-gpt-oss-120b"`; provider-specific
# wire translation remains owned by the capability registry.
# https://huggingface.co/openai/gpt-oss-120b/discussions/21
[model_defaults."logical:openai-gpt-oss-120b"]
temperature = 1.0
top_p = 1.0
reasoning_effort = "high"
# Baseten's managed GPT-OSS route does not expose nucleus sampling. Keep the
# remaining logical defaults while omitting the unsupported field at the route
# boundary. https://docs.baseten.co/inference/model-apis/overview
[model_defaults."baseten/openai/gpt-oss-120b"]
_unset = ["top_p"]
# Groq compound systems publish an 8192-token completion ceiling.
[model_defaults."groq/compound*"]
max_tokens = 8192
# K3 always reasons and accepts low, high, or maximum effort. Sampling is
# omitted by the capability row; this default preserves Moonshot's documented
# maximum-effort default without leaking route-specific logic into callers.
[model_defaults."moonshot/kimi-k3"]
reasoning_effort = "max"
# GLM-5.3 always reasons; Z.AI accepts `low`, `high`, and `max` and defaults
# to `max`. Harn defaults it to `high` instead, and that is a deliberate
# cost/quality choice rather than a claim about the provider -- the previous
# `low` pin's mistake was disguising exactly such a choice as a compatibility
# note, so this one is stated plainly.
#
# The ladder is not evenly spaced in cost. Measured 2026-08-23 over 24
# short-answer CS/Python tasks x 3 trials x 3 levels (two independent sets,
# ~70 samples per level), against the live `glm-5.3` route:
#
# level accuracy [95% CI] output tokens $/100 correct
# low 85.1% [76.1, 92.5] 1.0x $0.057
# high 90.3% [83.3, 97.2] 1.4x $0.060
# max 95.7% [90.0, 100.0] 13.4x $0.224
#
# Only `max` - `low` (+10.6 pts) clears the noise floor at that sample size;
# the adjacent steps do not. But `high` costs 40% more output than `low` while
# `max` costs 13x, so `high` sits on the cheap side of the cliff and captures
# roughly half the total gain for 3% more spend per correct answer. `max`
# remains one option away for callers that want it.
#
# This also makes Harn's two entry points agree. Since the ladder snap landed,
# the reasoning policy resolves `high` for an agent or code task at the default
# scale, and the policy outranks this default -- which applies only to a bare
# `llm_call` that sets neither an explicit effort nor a policy. Pinning `max`
# here would have made "GLM-5.3 with no special instruction" mean two different
# things depending on the entry point, with the expensive reading attached to
# the less deliberate one.
[model_defaults."zai/glm-5.3"]
reasoning_effort = "high"
# --- source: 40-defaults/provider-models.toml ---
# Provider defaults are selected here, beside the model rows they reference.
# Runtime is the bare CLI/VM fallback; portal is the model offered by the
# setup UI. The two may differ deliberately, including in price.
# Host-supplied local/MLX model environment variables still take precedence.
[provider_defaults.anthropic]
runtime = "claude-sonnet-4-6"
portal = "claude-sonnet-4-6"
[provider_defaults.local]
runtime = "gemma-4-26b-a4b-it"
portal = "gemma-4-26b-a4b-it"
[provider_defaults.mlx]
runtime = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
portal = "unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"
[provider_defaults.openai]
runtime = "gpt-4o-mini"
portal = "gpt-4o"
[provider_defaults.ollama]
runtime = "llama3.2"
portal = "llama3.2"
[provider_defaults.openrouter]
runtime = "anthropic/claude-sonnet-4-6"
# Was Qwen/Qwen3.5-9B, which OpenRouter retires 2026-10-21. Gemma 4 26B is
# the `small` alias target at a similar price.
portal = "google/gemma-4-26b-a4b-it"
# A provider with no `runtime` entry has no default model: a call that names
# only that provider fails before dispatch and lists the provider's routes.
# It never borrows another provider's model. Catalog generation requires the
# built-in default_provider to have one.
# --- source: 40-defaults/qc.toml ---
# ── QC defaults ──────────────────────────────────────────────────────────────
# Default low-cost model per provider for cheap quality-check / repair
# passes. Scripts read these via `qc_default_model(provider)`.
[qc_defaults]
anthropic = "claude-haiku-4-5-20251001"
openai = "gpt-6-luna"
# OpenRouter retires google/gemini-2.5-flash on 2026-10-20 (typed
# `expiration_date` on its /models index, read 2026-10-01). Gemini 3.5
# Flash-Lite is the direct Gemini QC default and the 2.5 row's successor.
openrouter = "google/gemini-3.5-flash-lite"
ollama = "llama3.2"
# `local` previously pointed at gpt-4o, a hosted OpenAI model that the
# bundled local server does not serve. Use the
# bundled vLLM Gemma 4 route instead.
local = "gemma-4-26b-a4b-it"
mistral = "mistral-small-2603"
cohere = "command-a-plus-05-2026"
xai = "grok-build-0.1"
# Groq retired qwen/qwen3.6-27b (absent from its live /models index on
# 2026-09-20). Qwen3.8 27B is Groq's only remaining Qwen route, at a higher
# rate ($0.80/$4.00 per MTok versus $0.60/$3.00). If the QC rate matters more
# than staying in the Qwen family, groq/openai/gpt-oss-20b is catalogued at
# $0.075/$0.30.
groq = "qwen/qwen3.8-27b"
minimax = "MiniMax-M2.5-highspeed"
# GLM-4.6 is Z.AI's cheap coding route, confirmed serving at paas/v4.
zai = "glm-4.6"
deepseek = "deepseek-flash"
gemini = "gemini-3.5-flash-lite"
# --- source: 50-presentation/00-model-selection.toml ---
# Host-facing model-selection metadata. These rows describe picker choices and,
# when backed by automatic_eligibility receipts, the one measured host default.
# They do not change runtime routing, escalation, or request parameters.
# Providers Harn names first when a surface has room for only a few: the
# "no credentials" error, onboarding copy, and host setup pickers. Order is
# display order, not routing preference — every other catalogued provider is
# equally usable, and `harn doctor` still prints the complete list.
#
# Keep this short. Six or seven entries stay readable in a one-line error;
# a longer list is the wall of names this exists to replace.
[presentation]
featured_providers = [
"anthropic",
"openai",
"gemini",
"openrouter",
"groq",
"deepseek",
"ollama",
]
[presentation.variants.fast]
order = 10
label = "Fast"
description = "Lowest-latency general route for quick, routine work."
selector = { kind = "alias", name = "small" }
[presentation.variants.balanced]
order = 20
label = "Balanced"
description = "Default cost and capability trade-off for everyday work."
selector = { kind = "alias", name = "fw-gpt-oss-120b" }
automatic_eligibility = { schema = "harn.automatic_model_eligibility.v1", decision = "eligible", receipts = [
{ kind = "meter_holdout", source = "burin-labs/burin-code:scripts/meter-records/ledger.ndjson#f2a100670546|fw-gpt-oss-120b|meter-holdout", observed_at = "2026-07-08", harn_version = "v0.10.0", passed = 80, trials = 100 },
{ kind = "tool_call_fidelity", source = "burin-labs/burin-code:scripts/meter-records/ledger.ndjson#f2a100670546|fw-gpt-oss-120b|meter-holdout|outcome_kind_counts.tool_call_format_parse_loop", observed_at = "2026-07-08", harn_version = "v0.10.0", passed = 97, trials = 100 },
{ kind = "provider_health", source = "burin-labs/burin-code:scripts/meter-records/ledger.ndjson#f2a100670546|fw-gpt-oss-120b|meter-holdout|timeouts+harness_error_count", observed_at = "2026-07-08", harn_version = "v0.10.0", passed = 99, trials = 100 },
] }
[presentation.variants.high-reasoning]
order = 30
label = "High reasoning"
description = "Most capable route for difficult planning, repair, and review."
selector = { kind = "alias", name = "frontier" }
[presentation.variants.local]
order = 40
label = "Local"
description = "Largest-context local or offline route in this catalog."
selector = { kind = "best_local" }
[presentation.variants.cheap]
order = 50
label = "Cheap"
description = "Lowest known hosted input-plus-output token price."
selector = { kind = "cheapest_hosted" }
[presentation.variants.vision-capable]
order = 60
label = "Vision capable"
description = "Largest-context route that accepts image input."
selector = { kind = "largest_vision_context" }
[presentation.variants.long-context]
order = 70
label = "Long context"
description = "Largest context-window route in this catalog."
selector = { kind = "largest_context" }
[presentation.families.openai-gpt-6]
label = "GPT-6"
plain_description = "Choose a model size and how much time it spends reasoning."
[[presentation.families.openai-gpt-6.dimensions]]
key = "variant"
label = "Model size"
plain_description = "Larger variants trade speed and cost for more capability."
kind = "model"
ordered_values = [
{ value = "luna", label = "Luna", plain_description = "Fastest and lowest cost for routine work.", relative_cost_hint = 1, relative_speed_hint = 5, model_id = "gpt-6-luna" },
{ value = "sol", label = "Sol", plain_description = "Strong reasoning for everyday coding and analysis.", relative_cost_hint = 3, relative_speed_hint = 3, model_id = "gpt-6.1-sol" },
{ value = "astra", label = "Astra", plain_description = "Most capable and most expensive for the hardest work.", relative_cost_hint = 5, relative_speed_hint = 1, model_id = "gpt-6-astra" },
]
# Only the levels every offered GPT-6 model accepts. Luna also takes `none`,
# but Astra and GPT-6.1 Sol reject it, and all three reject `max` despite the
# model pages listing it (live probes 2026-09-22 and 2026-09-29).
[[presentation.families.openai-gpt-6.dimensions]]
key = "effort"
label = "Thinking time"
plain_description = "More thinking time can improve difficult answers but takes longer and costs more."
kind = "reasoning_effort"
ordered_values = [
{ value = "low", label = "Low", plain_description = "Brief reasoning for straightforward work.", relative_cost_hint = 1, relative_speed_hint = 5 },
{ value = "medium", label = "Medium", plain_description = "Balanced reasoning for everyday work.", relative_cost_hint = 2, relative_speed_hint = 4 },
{ value = "high", label = "High", plain_description = "More reasoning for difficult tasks.", relative_cost_hint = 3, relative_speed_hint = 3 },
{ value = "xhigh", label = "Extra high", plain_description = "Deepest reasoning for the hardest tasks.", relative_cost_hint = 5, relative_speed_hint = 1 },
]
[[presentation.families.openai-gpt-6.presets]]
id = "fast"
label = "Fast"
plain_blurb = "Quick, low-cost responses for routine edits and questions."
coordinates = { variant = "luna", effort = "low" }
[[presentation.families.openai-gpt-6.presets]]
id = "balanced"
label = "Balanced"
plain_blurb = "A practical default for everyday coding and analysis."
coordinates = { variant = "sol", effort = "medium" }
[[presentation.families.openai-gpt-6.presets]]
id = "deep"
label = "Deep"
plain_blurb = "Maximum capability and reasoning for the hardest work."
coordinates = { variant = "astra", effort = "xhigh" }
# --- source: 60-models/00-anthropic.toml ---
# ── Models ───────────────────────────────────────────────────────────────────
# Canonical model metadata: display name, provider, context window,
# capabilities, pricing (USD per 1M tokens), and deprecation status.
# Pricing reflects public provider pages snapshotted at the comment
# beside each section; edit the literal here and the change shows up in
# `git blame`.
# Cache writes have two rates: `cache_write_per_mtok` is the five-minute write
# at 1.25x input, and `cache_write_1h_per_mtok` is the one-hour write at 2x
# input (https://platform.claude.com/docs/en/docs/build-with-claude/prompt-caching,
# read 2026-09-20). Harn sends `cache_control.ttl = "1h"` when a request asks
# for it, so both rates must be here or the longer write settles at the
# shorter rate. Claude routes served through other providers carry only the
# five-minute rate until each passthrough card is read at its own source.
# Anthropic ─ pricing pages: https://www.anthropic.com/pricing &
# https://platform.claude.com/docs/en/about-claude/model-deprecations.
# Verified 2026-09-30 against the provider /v1/models API and the
# deprecations page: Sonnet 4 / Opus 4 / Opus 4.1 / Opus 3 are retired, and
# dated Sonnet 4.5 is deprecated (announced 2026-09-30). The deprecations page
# gives its retirement as 2026-11-30 while the customer notice email gives
# 2026-11-24 9AM PT with reduced availability from 2026-10-30; the row carries
# the earlier date. Since the 4.6 generation the full 1M-token
# context window ships at standard per-token pricing (no long-context beta
# or premium tier), so 4.6+ rows carry context_window = 1000000.
[models."claude-3-5-haiku-20241022"]
name = "Claude Haiku 3.5"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.80, output_per_mtok = 4.00, cache_read_per_mtok = 0.08, cache_write_per_mtok = 1.00, cache_write_1h_per_mtok = 1.60 }
deprecated = true
deprecation_note = "Retired 2026-02-19 per Anthropic deprecations page. Use claude-haiku-4-5-20251001."
superseded_by = "claude-haiku-4-5-20251001"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "summarization", "tool_use"]
# Also serves the `decision` operation through strict JSON-schema structured
# output; the protocol binding is in capability_sources/10-decisions/00-decision-contracts.toml.
[models."claude-haiku-4-5-20251001"]
name = "Claude Haiku 4.5"
provider = "anthropic"
operations = ["text_generation", "decision"]
context_window = 200000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 1.25, cache_write_1h_per_mtok = 2.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-haiku-5-5"
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
# Claude Haiku 5.5 (released 2026-10-07) — the current Haiku and the `haiku`
# alias target. Haiku 4.5 is not superseded: the deprecations page (read
# 2026-10-09) lists it active, retiring no sooner than 2026-10-15, and Haiku
# 5.5 no sooner than 2027-10-07. 1M context and 128K output (OpenRouter's
# per-endpoint index, read 2026-10-09). Pricing has two rate cards chosen by
# prompt length: $0.10 / $0.50 per MTok up to 100K input tokens and $0.50 /
# $2.50 above, with cache reads at 0.1x, five-minute writes at 1.25x and
# one-hour writes at 2x the input rate on both cards; the band's 5x input
# multiplier therefore scales the cache rates exactly. Haiku 4.5 is $1 / $5 at
# any length. A newer tokenizer counts the same text as about 30% more tokens
# than Haiku 4.5. The request surface (see the capability row) is
# generation-5: adaptive thinking on by default, effort low..max with a
# `medium` default, no sampling parameters, no assistant prefill.
[models."claude-haiku-5-5"]
name = "Claude Haiku 5.5"
provider = "anthropic"
context_window = 1000000
released = "2026-10-07"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125, cache_write_1h_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 100001, input_multiplier = 5.0, output_multiplier = 5.0 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization", "long_context"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."claude-3-5-sonnet-20240620"]
name = "Claude Sonnet 3.5 (2024-06-20)"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00 }
deprecated = true
deprecation_note = "Retired 2025-10-28 per Anthropic deprecations page. Use claude-sonnet-4-6."
superseded_by = "claude-sonnet-4-6"
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context"]
released = "2024-06-20"
row_kind = "snapshot"
[models."claude-3-5-sonnet-20241022"]
name = "Claude Sonnet 3.5 (2024-10-22)"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00 }
deprecated = true
deprecation_note = "Retired 2025-10-28 per Anthropic deprecations page. Use claude-sonnet-4-6."
superseded_by = "claude-sonnet-4-6"
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context"]
released = "2024-10-22"
row_kind = "snapshot"
[models."claude-sonnet-4-20250514"]
name = "Claude Sonnet 4"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
deprecated = true
deprecation_note = "Sunset 2026-06-15 per Anthropic deprecations page. Replaced by claude-sonnet-4-6."
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 49.0 }
[models."claude-sonnet-4-5"]
name = "Claude Sonnet 4.5"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
deprecated = true
deprecation_note = "Undated compatibility selector for claude-sonnet-4-5-20250929, which Anthropic deprecated 2026-09-30. Use claude-sonnet-5-5."
superseded_by = "claude-sonnet-5-5"
sunset_date = "2026-11-24"
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 77.2 }
row_kind = "selector"
current_snapshot = "claude-sonnet-4-5-20250929"
[models."claude-sonnet-4-5-20250929"]
name = "Claude Sonnet 4.5"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 77.2 }
released = "2025-09-29"
row_kind = "snapshot"
deprecated = true
deprecation_note = "Deprecated 2026-09-30. Retires 2026-11-24 9AM PT per Anthropic's customer notice (the deprecations page lists 2026-11-30), with reduced availability and rate errors from 2026-10-30. Use claude-sonnet-5-5."
sunset_date = "2026-11-24"
superseded_by = "claude-sonnet-5-5"
[models."claude-sonnet-4-6"]
name = "Claude Sonnet 4.6"
provider = "anthropic"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 79.6 }
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# NOTE: an erroneous `claude-sonnet-4-7` row used to live here. No such
# model exists — Anthropic's models overview (verified 2026-07-02) goes
# Sonnet 4.5 -> 4.6 -> 5; only the Opus line had a 4.7 release.
# Claude Sonnet 5 (released 2026-06-30), now the previous Sonnet generation.
# Same request surface as Opus 4.8: adaptive thinking only (extended
# thinking budgets return 400), `output_config.effort` defaults to high,
# sampling params rejected, no assistant prefill. 1M-token context at
# standard pricing. Anthropic made the $2 / $10 launch price permanent and
# cancelled the planned 2026-09-01 rise to $3 / $15 (pricing page read
# 2026-09-29). Anthropic lists it as active, retiring no sooner than
# 2027-06-30.
[models."claude-sonnet-5"]
name = "Claude Sonnet 5"
provider = "anthropic"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
released = "2026-06-30"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, cache_write_1h_per_mtok = 4.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-sonnet-5-5"
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Claude Sonnet 5.5 (released 2026-09-28) — the current Sonnet generation and
# the `sonnet` / `frontier` alias target. Same price, context, and 128K output
# ceiling as Sonnet 5 (pricing and model pages read 2026-09-29; the live
# /v1/models entry reports max_input_tokens 1000000 and max_tokens 128000).
# Knowledge cutoff moves to 2026-06. Its request surface differs from Sonnet
# 5 in three ways the capability row records: thinking turns off with
# `{"type":"between_tools"}`, forced tool choice is removed, and the minimum
# cacheable prefix drops to 512 tokens. Thinking blocks are bound to the
# model: Sonnet 5.5 reads Sonnet 5 and older blocks, and no other model reads
# its blocks.
[models."claude-sonnet-5-5"]
name = "Claude Sonnet 5.5"
provider = "anthropic"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
released = "2026-09-28"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, cache_write_1h_per_mtok = 4.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# OpenRouter-routed Anthropic models. Kept as distinct catalog entries
# so `openrouter:anthropic/claude-*` resolves with the right capability
# matrix — without these, native-tools requests fail with `option `tools`
# is not supported by ... (provider openrouter)` because the lookup
# falls back to a no-tools shape. OpenRouter passes Anthropic's
# native-tools API through verbatim, including prompt-caching headers
# (cache attribution surface differs — tracked separately in #2320).
# Pricing matches the direct Anthropic API; OpenRouter adds its own
# margin at request time.
[models."anthropic/claude-haiku-4-5"]
name = "Claude Haiku 4.5 (via OpenRouter)"
provider = "openrouter"
wire_model = "anthropic/claude-haiku-4.5"
context_window = 200000
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 1.25, cache_write_1h_per_mtok = 2.00 }
superseded_by = "anthropic/claude-haiku-5.5"
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
# OpenRouter serves Haiku 5.5 under a dotted slug at Anthropic's list price on
# its first-party-priced endpoints (per-endpoint index read 2026-10-09: $0.10 /
# $0.50, cache read $0.01, five-minute write $0.125, one-hour write $0.20, and
# a `min_prompt_tokens = 100000` override at 5x). Some Bedrock, Google and
# Azure endpoints list a 10% regional premium; the row carries the list price.
[models."anthropic/claude-haiku-5.5"]
name = "Claude Haiku 5.5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
released = "2026-10-07"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125, cache_write_1h_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 100001, input_multiplier = 5.0, output_multiplier = 5.0 }] }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization", "long_context"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."anthropic/claude-fable-5"]
name = "Claude Fable 5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, cache_write_1h_per_mtok = 20.00 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_pro = 80.3 }
[models."anthropic/claude-sonnet-4-6"]
name = "Claude Sonnet 4.6 (via OpenRouter)"
provider = "openrouter"
wire_model = "anthropic/claude-sonnet-4.6"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30, cache_write_per_mtok = 3.75, cache_write_1h_per_mtok = 6.00 }
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."anthropic/claude-sonnet-5"]
name = "Claude Sonnet 5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, cache_write_1h_per_mtok = 4.00 }
superseded_by = "anthropic/claude-sonnet-5.5"
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# OpenRouter serves Sonnet 5.5 under a dotted slug at Anthropic's list price
# (live /models index 2026-09-29: $2 / $10, cache read $0.20, write $2.50).
[models."anthropic/claude-sonnet-5.5"]
name = "Claude Sonnet 5.5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
released = "2026-09-28"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "reasoning", "tool_use", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."claude-3-opus-20240229"]
name = "Claude Opus 3"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 15.00, output_per_mtok = 75.00, cache_read_per_mtok = 1.50, cache_write_per_mtok = 18.75, cache_write_1h_per_mtok = 30.00 }
deprecated = true
deprecation_note = "Retired 2026-01-05 per Anthropic deprecations page. Harn recommends claude-opus-5-5."
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "long_context"]
[models."claude-opus-4-20250514"]
name = "Claude Opus 4"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 15.00, output_per_mtok = 75.00, cache_read_per_mtok = 1.50, cache_write_per_mtok = 18.75, cache_write_1h_per_mtok = 30.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
deprecated = true
deprecation_note = "Sunset 2026-06-15 per Anthropic deprecations page. Harn recommends claude-opus-5-5."
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 77.6 }
[models."claude-opus-4-1-20250805"]
name = "Claude Opus 4.1"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 15.00, output_per_mtok = 75.00, cache_read_per_mtok = 1.50, cache_write_per_mtok = 18.75, cache_write_1h_per_mtok = 30.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
deprecated = true
deprecation_note = "Deprecated 2026-06-05 per Anthropic deprecations page; retired 2026-08-05. Harn recommends claude-opus-5-5."
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 78.9 }
[models."claude-opus-4-5-20251101"]
name = "Claude Opus 4.5"
provider = "anthropic"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
[models."claude-opus-4-6"]
name = "Claude Opus 4.6"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 80.8, swe_bench_pro = 53.4 }
[models."claude-opus-4-7"]
name = "Claude Opus 4.7"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 87.6, swe_bench_pro = 64.3 }
# Fast mode (research preview): 6x standard pricing, ~2.5x output tok/s.
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "speed", value = "fast", beta_header = "fast-mode-2026-02-01" }, otps_speedup = 2.5, cost_multiplier = 6.0, status = "research_preview", pricing = { input_per_mtok = 30.00, output_per_mtok = 150.00, cache_read_per_mtok = 3.00, cache_write_per_mtok = 37.50, cache_write_1h_per_mtok = 60.00 }, latency = "higher output-token throughput than standard Claude serving", reliability = "research preview, account-manager gated", unsuitable_workloads = ["batch"], note = "Claude API + Managed Agents only. Migrate to Opus 4.8 fast mode for the cheaper 2x rate." },
]
# Claude Opus 4.8 (released 2026-05-28) — Anthropic's most capable model
# for complex reasoning, long-horizon agentic coding, and high-autonomy
# work. Adaptive thinking only (extended
# thinking budgets return 400); the `effort` parameter controls reasoning
# depth and defaults to `high` on every surface. Sampling params
# (temperature/top_p/top_k) are rejected — steer via prompting instead.
# 1M-token context window at standard per-token pricing (the former
# long-context beta graduated; there is no premium tier), matching every
# 4.6+ Claude row. Pricing per the Anthropic models overview: $5 / $25
# per MTok in/out (cache read 0.1x, 5-min cache write 1.25x).
[models."claude-opus-4-8"]
name = "Claude Opus 4.8"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 88.6, swe_bench_pro = 69.2 }
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Fast mode (research preview): 2x standard pricing, ~2.5x output tok/s.
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "speed", value = "fast", beta_header = "fast-mode-2026-02-01" }, otps_speedup = 2.5, cost_multiplier = 2.0, status = "research_preview", pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, cache_write_1h_per_mtok = 20.00 }, latency = "higher output-token throughput than standard Claude serving", reliability = "research preview, account-manager gated", unsuitable_workloads = ["batch"], note = "Claude API + Managed Agents only (not Bedrock/Vertex/Foundry); excluded from Batch and Priority Tier. Switching speed invalidates the prompt cache. Waitlist/account-manager gated." },
]
# Claude Opus 5 (released 2026-07-24) — superseded by Opus 5.5 and pinned by
# the `opus5` alias: a drop-in upgrade from Opus 4.8 at identical $5 / $25
# per MTok pricing (cache read 0.1x, 5-min cache write 1.25x). Inherits the
# Opus 4.7+ request surface (adaptive thinking only, sampling params rejected,
# no assistant prefill) with two changes verified against the live API on
# 2026-07-24:
# 1. Thinking is ON by default — omitting `thinking` returns thinking blocks,
# unlike Opus 4.7/4.8 where omission meant no thinking. `Disabled` must be
# sent explicitly as `{"type": "disabled"}`.
# 2. Disabling thinking is capped at effort `high`. `thinking:{disabled}`
# with effort `xhigh`/`max` is a 400 ("Use effort 'high' or below, or
# enable thinking").
# The minimum cacheable prefix also halves to 512 tokens (measured: a
# 691-token prefix caches on Opus 5 and silently does not on Opus 4.8) — see
# `prompt_cache_min_prefix_tokens` in the capability rules.
# Rate limits are a bucket separate from the combined Opus 4.x pool.
[models."claude-opus-5"]
name = "Claude Opus 5"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
superseded_by = "claude-opus-5-5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Fast mode (research preview): 2x standard pricing, ~2.5x output tok/s.
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "speed", value = "fast", beta_header = "fast-mode-2026-02-01" }, otps_speedup = 2.5, cost_multiplier = 2.0, status = "research_preview", pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, cache_write_1h_per_mtok = 20.00 }, latency = "higher output-token throughput than standard Claude serving", reliability = "research preview, account-manager gated", unsuitable_workloads = ["batch"], note = "Claude API + Managed Agents only (not Bedrock/Vertex/Foundry); excluded from Batch and Priority Tier. Switching speed invalidates the prompt cache." },
]
[models."anthropic/claude-opus-5"]
name = "Claude Opus 5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00 }
superseded_by = "anthropic/claude-opus-5.5"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
# Claude Opus 5.5 (released 2026-09-21) — the current Opus generation and the
# `opus` alias target. Cheaper than Opus 5 ($4 / $20 per MTok, cache read
# $0.20 = 0.05x, 5-min cache write 1.25x) with the same 1M context, 128K
# output, and tokenizer. Verified against the live API on 2026-09-22:
# 1. Thinking cannot be disabled. `{"type":"disabled"}` and
# `{"type":"enabled","budget_tokens":N}` are both 400s at every effort;
# effort is the only control and its API default is `medium` (Opus 5
# defaulted to `high`).
# 2. Forced `tool_choice` (`any` / `tool`) is a 400; `auto` and `none` pass.
# 3. Minimum cacheable prefix stays at 512 tokens (a 608-token prefix cached
# on Opus 5.5 and silently did not on Opus 4.8).
# 4. Fast mode (`speed: "fast"`) is accepted at 2x standard pricing.
# Thinking blocks are bound to the model and conversation ("preserved
# thinking"), so history must stay append-only; only Fable 5.1 / Mythos 5.1
# read an Opus 5.5 block, other models drop it silently.
[models."claude-opus-5-5"]
name = "Claude Opus 5.5"
provider = "anthropic"
context_window = 1000000
released = "2026-09-21"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 4.00, output_per_mtok = 20.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 5.00, cache_write_1h_per_mtok = 8.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic", "vision"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Fast mode (research preview): 2x standard pricing, ~2.5x output tok/s.
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "speed", value = "fast", beta_header = "fast-mode-2026-02-01" }, otps_speedup = 2.5, cost_multiplier = 2.0, status = "research_preview", pricing = { input_per_mtok = 8.00, output_per_mtok = 40.00, cache_read_per_mtok = 0.40, cache_write_per_mtok = 10.00, cache_write_1h_per_mtok = 16.00 }, latency = "higher output-token throughput than standard Claude serving", reliability = "research preview, account-manager gated", unsuitable_workloads = ["batch"], note = "Claude API + Managed Agents only (not Bedrock/Vertex/Foundry); excluded from Batch and Priority Tier. Switching speed invalidates the prompt cache." },
]
# OpenRouter serves Opus 5.5 under a dotted slug at Anthropic's list price.
[models."anthropic/claude-opus-5.5"]
name = "Claude Opus 5.5 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
released = "2026-09-22"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 4.00, output_per_mtok = 20.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 5.00 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic", "vision"]
[models."anthropic/claude-opus-4.8"]
name = "Claude Opus 4.8 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 25.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, cache_write_1h_per_mtok = 10.00 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_verified = 88.6, swe_bench_pro = 69.2 }
# Claude Fable 5 (released 2026-06-09) — Anthropic's most capable widely
# released model: the first generally available Mythos-class model, a new
# tier *above* Opus (Opus 4.8 stays current and keeps the `opus` alias;
# nothing is superseded). Same request surface as Opus 4.7/4.8 — adaptive
# thinking only, sampling params rejected, no assistant prefill — plus one
# new constraint: an explicit `thinking: {type: "disabled"}` is also a 400
# (thinking is always on; omit the field instead, which our request
# builder already does for the Disabled config). Safety classifiers can
# decline requests with stop_reason="refusal"; the `fallbacks` beta
# retries on Opus 4.8. No fast mode tier. 1M-token context window at
# standard pricing, like every 4.6+ row. Pricing per the Anthropic
# pricing page:
# $10 / $50 per MTok in/out (cache read 0.1x, 5-min cache write 1.25x);
# Batch API 50% discount applies. SWE-bench Verified not published for
# Fable 5 itself at launch (only for Mythos Preview), so it is omitted.
[models."claude-fable-5"]
name = "Claude Fable 5"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, cache_write_1h_per_mtok = 20.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
benchmarks = { swe_bench_pro = 80.3 }
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Claude Fable 5.1 (released 2026-09-01) — successor to Claude Fable 5 in the
# same Mythos-class tier above Opus, at the same $10 / $50 per MTok. It does
# NOT supersede Opus 5; the `opus` alias keeps tracking the Opus generation.
# Claude Mythos 5.1 is the same underlying model behind a restricted access
# program (Project Glasswing) and is deliberately absent from this catalog —
# a row nobody on a normal API key can call is a route that only fails.
#
# Same request surface as Fable 5 — thinking always on (an explicit
# `disabled` is a 400, so the request builder omits the field), effort
# low..max, no assistant prefill, sampling params rejected — with three
# changes that matter to the wire:
# 1. Forced tool choice is gone. `tool_choice` `any` / `tool` return a 400
# on this model (also on count_tokens and Batches), so the capability
# row narrows `allowed_tool_choice_modes` to auto/none. Use `auto` plus
# an instruction naming the tool, `strict: true`, or structured output.
# 2. Thinking blocks are bound to the producing model, and editing earlier
# turns invalidates them ("preserved thinking"). Append-only history is
# the safe harness shape.
# 3. Cache reads drop to $0.25 per MTok (0.025x input, not the uniform 0.1x
# ladder every other Anthropic row uses). 5-min cache write stays 1.25x.
# No fast mode tier and no Priority Tier. Covered Model: zero-data-retention
# orgs get a 400 unless expressly authorized by Anthropic. 1M context, 128K
# max output. SWE-bench Verified is not published at launch, so it is omitted
# rather than carried over from Fable 5.
[models."claude-fable-5-1"]
name = "Claude Fable 5.1"
provider = "anthropic"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 0.25, cache_write_per_mtok = 12.50, cache_write_1h_per_mtok = 20.00, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# OpenRouter serves Fable 5.1 under a dotted slug at Anthropic's list price,
# including Fable 5.1's $0.25 cache-read rate.
[models."anthropic/claude-fable-5.1"]
name = "Claude Fable 5.1 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
released = "2026-09-01"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 0.25, cache_write_per_mtok = 12.50 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
# --- source: 60-models/10-openai-gemini-mistral.toml ---
# OpenAI ─ pricing pages: https://platform.openai.com/docs/pricing.
# OpenAI section verified 2026-08-22 against the models and pricing docs
# (platform.openai.com now redirects to developers.openai.com), and the GPT-6
# Astra row verified 2026-09-04 against the live API. Current
# lineup: gpt-6-astra, the GPT-5.6 family (Sol/Terra/Luna), gpt-5.5 / gpt-5.5-pro,
# and the gpt-5.4 tier family. The entire
# GPT-4/o-series legacy exits by 2026-10-23 (announced 2026-04-22),
# the gpt-5 dated snapshots plus o3/o3-pro shut down 2026-12-11
# (announced 2026-06-11), and gpt-5.1, gpt-5.3-codex, and gpt-5.4-nano shut
# down 2027-04-01 (announced 2026-10-01).
# GPT-6 Astra — OpenAI's frontier release of 2026-09-03, verified against the
# live API on 2026-09-04. One id only (`gpt-6-astra`); OpenAI publishes no
# dated snapshot for it, so there is nothing to pin a `current_snapshot` to.
#
# Two constraints make this row differ from the GPT-5.6 family in ways that
# matter at request time, both probed rather than transcribed:
#
# 1. The effort ladder is low/medium/high/xhigh. `none` and `max` are both
# rejected, and OpenAI's own model page is wrong about `max`.
# 2. Function tools are unusable on `/v1/chat/completions` for this model at
# ANY effort, including when the caller omits `reasoning_effort` entirely.
# The 400 advises falling back to `reasoning_effort: "none"`, which this
# model also rejects, so that suggestion is unsatisfiable. Tools must go
# through the Responses API. The capability row carries
# `reasoning_tools_require_responses` so Harn routes there automatically.
#
# Pricing carries the same >272k input band as GPT-5.6 (2x input, 1.5x output
# applied to the whole request). Flex and Fast serving tiers are both accepted
# by the live API; only Flex has a published rate (50% of standard), so Fast is
# deliberately absent here rather than carrying an invented multiplier.
[models."gpt-6-astra"]
name = "GPT-6 Astra"
blurb = "OpenAI's most capable model, for the hardest planning, coding, and review work at the highest cost."
provider = "openai"
context_window = 1050000
logical_model = "gpt-6-astra"
equivalence_group = "gpt-6-astra"
released = "2026-09-03"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
# GPT-6 Sol and Luna (announced 2026-09-22) — the GPT-6 successors to
# GPT-5.6 Sol and Luna at about half their promotional price. There is no
# GPT-6 Terra: Sol now covers the balanced tier and is cheaper than GPT-5.6
# Terra. Unlike Astra, both accept effort `none`. Live probe 2026-09-22 on
# both models:
# reasoning_effort none/low/medium/high/xhigh -> 200; minimal and max -> 400
# (the model pages list `max`; the API does not accept it)
# temperature=0.2 at effort none -> 200; at the default effort -> 400
# function tools on /v1/chat/completions -> 400 unless effort is none
# service_tier=fast -> 200, echoes "fast"; reasoning.mode=pro -> 200
# Long-context band: prompts over 272K input tokens bill input and cache at 2x
# and output at 1.5x. Default effort is `medium`.
[models."gpt-6-sol"]
name = "GPT-6 Sol"
blurb = "Strong GPT-6 reasoning for everyday coding, planning, and review at a moderate cost."
provider = "openai"
context_window = 1050000
logical_model = "gpt-6-sol"
equivalence_group = "gpt-6-sol"
released = "2026-09-22"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
# Still served with no announced shutdown. Unlike GPT-6.1 Sol it accepts
# effort `none`, and with it function tools on Chat Completions.
superseded_by = "gpt-6.1-sol"
tier = "mid"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, cost_multiplier = 2.0, status = "ga", pricing = { input_per_mtok = 4.00, output_per_mtok = 20.00, cache_read_per_mtok = 0.4, cache_write_per_mtok = 5.00 }, latency = "faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "GPT-6 responses echo service_tier=fast when the premium tier was served (live probe 2026-09-22)." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.1, cache_write_per_mtok = 1.25 }, latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and independent of `reasoning.effort`; it bills at this row's standard token rates and its extra work shows up as token volume, mostly on the input side. The GPT-6 Responses API accepts `reasoning.mode = \"pro\"` (live probe 2026-09-22). `token_multiplier` is carried over from the GPT-5.6 Sol measurement and has not been re-measured on GPT-6. OpenRouter's `-pro` slugs sell this knob, not a separate model." },
]
# GPT-6.1 Sol (released 2026-09-29) — the balanced-tier successor to GPT-6
# Sol at the same $2 / $10 list price, with cached input halved to $0.10 (5%
# of input) and knowledge cutoff moved to 2026-04-30 (model and pricing pages
# read 2026-09-29). It is the only GPT-6.1 model: OpenAI publishes no 6.1
# Astra, Terra, or Luna, and no `gpt-6.1-sol-pro` id — OpenRouter's `-pro`
# slug sells `reasoning.mode = "pro"` on this model. Its request surface is
# Astra's, not GPT-6 Sol's: effort is low/medium/high/xhigh only (`none`,
# `minimal`, and the documented `max` are 400s) and function tools need the
# Responses API at every effort. Long-context band as GPT-6. Live probe
# 2026-09-29: service_tier fast and flex echo their tier; reasoning.mode=pro
# returns 200.
[models."gpt-6.1-sol"]
name = "GPT-6.1 Sol"
blurb = "Newest GPT-6 reasoning for everyday coding, planning, and review at a moderate cost."
provider = "openai"
context_window = 1050000
logical_model = "gpt-6.1-sol"
equivalence_group = "gpt-6.1-sol"
released = "2026-09-29"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "mid"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, cost_multiplier = 2.0, status = "ga", pricing = { input_per_mtok = 4.00, output_per_mtok = 20.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 5.00 }, latency = "faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "Not available with EU data residency. GPT-6.1 responses echo service_tier=fast when the premium tier was served (live probe 2026-09-29)." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.05, cache_write_per_mtok = 1.25 }, latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and independent of `reasoning.effort`; it bills at this row's standard token rates and its extra work shows up as token volume, mostly on the input side. The GPT-6.1 Responses API accepts `reasoning.mode = \"pro\"` (live probe 2026-09-29). `token_multiplier` is carried over from the GPT-5.6 Sol measurement and has not been re-measured on GPT-6.1. OpenRouter's `-pro` slugs sell this knob, not a separate model." },
]
# OpenAI names this as GPT-5.4 Nano's replacement, and a strict `json_schema`
# response_format returned HTTP 200 with schema-valid JSON (live probe
# 2026-10-01, default effort and `none`). Decision evaluations still refuse it
# before dispatch: the structured profile requires temperature 0, which GPT-6
# accepts only at an explicit effort of `none`, and the capability rule cannot
# express that condition (harn#9157). gpt-5.4-mini serves decisions meanwhile.
[models."gpt-6-luna"]
name = "GPT-6 Luna"
blurb = "Fastest and lowest-cost GPT-6 option for routine edits, summaries, and extraction."
provider = "openai"
context_window = 1050000
logical_model = "gpt-6-luna"
equivalence_group = "gpt-6-luna"
released = "2026-09-22"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, cost_multiplier = 2.0, status = "ga", pricing = { input_per_mtok = 0.2, output_per_mtok = 1.00, cache_read_per_mtok = 0.02, cache_write_per_mtok = 0.25 }, latency = "faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "GPT-6 responses echo service_tier=fast when the premium tier was served (live probe 2026-09-22)." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", pricing = { input_per_mtok = 0.05, output_per_mtok = 0.25, cache_read_per_mtok = 0.005, cache_write_per_mtok = 0.0625 }, latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and independent of `reasoning.effort`; it bills at this row's standard token rates and its extra work shows up as token volume, mostly on the input side. The GPT-6 Responses API accepts `reasoning.mode = \"pro\"` (live probe 2026-09-22). `token_multiplier` is carried over from the GPT-5.6 Sol measurement and has not been re-measured on GPT-6. OpenRouter's `-pro` slugs sell this knob, not a separate model." },
]
# GPT-5.6 — previous OpenAI family, superseded by GPT-6 Sol and Luna. OpenAI
# has not announced a sunset, so the rows stay routable (not `deprecated`);
# GPT-5.6 Terra has no GPT-6 counterpart and points at GPT-6 Sol, which is
# cheaper and stronger. The bare gpt-5.6 API alias routes to Sol;
# Harn resolves it through the alias catalog so receipts keep the explicit
# tier. All three models accept none/low/medium/high/xhigh/max effort, support
# image input, and expose the Responses-first hosted tool surface. Cache writes
# cost 1.25x standard input; the catalog records that rate separately so cost
# projections remain correct when usage reports cache_write_tokens.
[models."gpt-5.6-sol"]
name = "GPT-5.6 Sol"
blurb = "Most capable GPT-5.6 option for difficult planning, coding, and review, with the highest cost."
provider = "openai"
context_window = 1050000
logical_model = "gpt-5.6-sol"
equivalence_group = "gpt-5.6-sol"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 30.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], promotions = [{ id = "openai-2026-08-sol", starts_on = "2026-08-21", review_after = "2026-11-21", source_url = "https://developers.openai.com/api/docs/models/gpt-5.6-sol", input_per_mtok = 4.00, output_per_mtok = 20.00, cache_read_per_mtok = 0.40, cache_write_per_mtok = 5.00 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
superseded_by = "gpt-6.1-sol"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, otps_speedup = 2.5, cost_multiplier = 2.0, status = "ga", latency = "up to 2.5x faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "OpenAI renamed Priority processing to Fast mode on 2026-07-30. Requests use service_tier=fast; GPT-5.6 responses still echo service_tier=priority when the premium tier was served." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
# `reasoning.mode = "pro"` is a per-request execution mode, NOT a serving tier
# and NOT a separate model. It is listed here rather than under
# `serving_tiers` because the two knobs differ in kind: a serving tier changes
# how fast the same work is served and is priced by a different per-token
# rate, while a reasoning mode changes how much work happens at unchanged
# rates. They are independent and a request may set both.
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and is independent of `reasoning.effort`: mode picks the execution path, effort controls how hard the model works within it. OpenAI bills pro mode at this row's standard token rates and charges for the extra work it does, so the cost increase shows up as token volume rather than a higher rate. There is no separate `gpt-5.6-*-pro` model id on OpenAI; aggregators that publish one are selling this knob. `token_multiplier` is measured, not published: two Burin planning prompts on gpt-5.6-sol at effort=high billed 5.8x and 7.6x a standard call at the same effort (2026-09-02, N=1 per cell). Most of that inflation lands on INPUT tokens (390 -> 5790 and 430 -> 10496 on those prompts) because pro aggregates its internal attempts back through the input side, so prompt caching does not absorb it and the 272k input band multiplier can stack on top." },
]
[models."gpt-5.6-terra"]
name = "GPT-5.6 Terra"
blurb = "Balanced GPT-5.6 option for everyday coding work, with lower cost and latency than Sol."
provider = "openai"
context_window = 1050000
logical_model = "gpt-5.6-terra"
equivalence_group = "gpt-5.6-terra"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 12.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
superseded_by = "gpt-6.1-sol"
tier = "mid"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, cost_multiplier = 2.0, status = "ga", pricing = { input_per_mtok = 4.00, output_per_mtok = 24.00, cache_read_per_mtok = 0.40, cache_write_per_mtok = 5.00 }, latency = "faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "OpenAI renamed Priority processing to Fast mode on 2026-07-30. Requests use service_tier=fast; GPT-5.6 responses still echo service_tier=priority when the premium tier was served." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", pricing = { input_per_mtok = 1.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 1.25 }, latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and is independent of `reasoning.effort`: mode picks the execution path, effort controls how hard the model works within it. OpenAI bills pro mode at this row's standard token rates and charges for the extra work it does, so the cost increase shows up as token volume rather than a higher rate. There is no separate `gpt-5.6-*-pro` model id on OpenAI; aggregators that publish one are selling this knob. `token_multiplier` is measured, not published: two Burin planning prompts on gpt-5.6-sol at effort=high billed 5.8x and 7.6x a standard call at the same effort (2026-09-02, N=1 per cell). Most of that inflation lands on INPUT tokens (390 -> 5790 and 430 -> 10496 on those prompts) because pro aggregates its internal attempts back through the input side, so prompt caching does not absorb it and the 272k input band multiplier can stack on top." },
]
[models."gpt-5.6-luna"]
name = "GPT-5.6 Luna"
blurb = "Fastest and lowest-cost GPT-5.6 option for routine edits, summaries, and quick iterations."
provider = "openai"
context_window = 1050000
logical_model = "gpt-5.6-luna"
equivalence_group = "gpt-5.6-luna"
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.20, cache_read_per_mtok = 0.02, cache_write_per_mtok = 0.25, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
superseded_by = "gpt-6-luna"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, cost_multiplier = 2.0, status = "ga", pricing = { input_per_mtok = 0.40, output_per_mtok = 2.40, cache_read_per_mtok = 0.04, cache_write_per_mtok = 0.50 }, latency = "faster output with more consistent latency for user-facing traffic", reliability = "provider may downgrade ramp-limited traffic to standard rates and echo service_tier=default", unsuitable_workloads = ["batch"], note = "OpenAI renamed Priority processing to Fast mode on 2026-07-30. Requests use service_tier=fast; GPT-5.6 responses still echo service_tier=priority when the premium tier was served." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", pricing = { input_per_mtok = 0.10, output_per_mtok = 0.60, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125 }, latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"] },
]
reasoning_modes = [
{ id = "pro", label = "Pro mode", economics = "premium", request = { param_path = ["reasoning", "mode"], value = "pro", response_values = ["pro"] }, token_multiplier = 6.0, status = "ga", latency = "multi-minute for hard prompts; far slower than standard mode at the same effort", suitable_workloads = ["hard_planning", "architecture_review", "oracle_consult"], unsuitable_workloads = ["interactive_chat", "agent_inner_loop", "bulk_judge", "corpus"], note = "Pro mode is Responses-API only and is independent of `reasoning.effort`: mode picks the execution path, effort controls how hard the model works within it. OpenAI bills pro mode at this row's standard token rates and charges for the extra work it does, so the cost increase shows up as token volume rather than a higher rate. There is no separate `gpt-5.6-*-pro` model id on OpenAI; aggregators that publish one are selling this knob. `token_multiplier` is measured, not published: two Burin planning prompts on gpt-5.6-sol at effort=high billed 5.8x and 7.6x a standard call at the same effort (2026-09-02, N=1 per cell). Most of that inflation lands on INPUT tokens (390 -> 5790 and 430 -> 10496 on those prompts) because pro aggregates its internal attempts back through the input side, so prompt caching does not absorb it and the 272k input band multiplier can stack on top." },
]
# GPT-5.5 — superseded by the GPT-5.6 and GPT-6 generations but still served.
# It is NOT deprecated in the API: the OpenAI deprecations page and
# changelog (read 2026-09-29) list no shutdown for gpt-5.5 or gpt-5.5-pro,
# and both remain on the pricing page. A reported October 2026 removal is
# ChatGPT-app only and unconfirmed by OpenAI. Mark it deprecated only when a
# first-party API shutdown date exists.
# Reasoning model driven by `reasoning_effort` (none/low/medium/high/
# xhigh; reasoning tokens bill as output). Standard $5 / $30 per MTok
# (cached input $0.50); short-context rates shown — prompts over 272k
# input tokens bill the ENTIRE request at the long-context tier
# ($10 in / $1 cached / $45 out per MTok) per the GPT-5.5 model page.
# Accelerated serving rides the `service_tier` knob. OpenAI renamed Priority
# processing to Fast mode on 2026-07-30; both `fast` and `priority` request
# values are accepted, while GPT-5.6 and earlier responses echo `priority`.
# GPT-5.5 bills this tier at 2.5x standard. Off by default.
[models."gpt-5.5"]
name = "GPT-5.5"
provider = "openai"
context_window = 1050000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 30.00, cache_read_per_mtok = 0.50, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
superseded_by = "gpt-6.1-sol"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "fast", label = "Fast mode", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "fast", response_values = ["fast", "priority"] }, otps_speedup = 1.5, cost_multiplier = 2.5, status = "ga", pricing = { input_per_mtok = 12.50, output_per_mtok = 75.00, cache_read_per_mtok = 1.25 }, latency = "lower latency and faster output than default serving", reliability = "provider may downgrade or reject unavailable premium capacity", unsuitable_workloads = ["batch"], note = "OpenAI renamed Priority processing to Fast mode on 2026-07-30. GPT-5.5 responses echo service_tier=priority even when requests use service_tier=fast. Not offered for long-context, fine-tuned models, or embeddings." },
{ id = "flex", label = "Flex processing", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "beta", latency = "slower and variable synchronous latency", reliability = "best-effort availability; provider can return resource unavailable", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Docs describe Flex as model-availability limited and priced at Batch API rates; do not treat it as an async Batch API route." },
]
[models."gpt-5.5-pro"]
name = "GPT-5.5 Pro"
provider = "openai"
context_window = 1050000
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 30.00, output_per_mtok = 180.00, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
superseded_by = "gpt-6.1-sol"
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
# GPT-5.4 tier family — the current cost ladder below gpt-5.5. All are
# reasoning models (reasoning_effort) with vision input and cached-input
# pricing at 0.1x. gpt-5.4-nano shuts down 2027-04-01; gpt-6-luna replaces
# it as the cheapest OpenAI model.
[models."gpt-5.4"]
name = "GPT-5.4"
provider = "openai"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 15.00, cache_read_per_mtok = 0.25, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
[models."gpt-5.4-pro"]
name = "GPT-5.4 Pro"
provider = "openai"
context_window = 1050000
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 30.00, output_per_mtok = 180.00, input_token_bands = [{ minimum_input_tokens = 272001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
# Also serves the `decision` operation through strict JSON-schema structured
# output; the protocol binding is in capability_sources/10-decisions/00-decision-contracts.toml.
[models."gpt-5.4-mini"]
name = "GPT-5.4 Mini"
provider = "openai"
operations = ["text_generation", "decision"]
context_window = 400000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.75, output_per_mtok = 4.50, cache_read_per_mtok = 0.075, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
# Also serves the `decision` operation through strict JSON-schema structured
# output; the protocol binding is in capability_sources/10-decisions/00-decision-contracts.toml.
# Calls still dispatch until the shutdown; GET /v1/models listed it with a
# null `shutdown_date` on 2026-10-01, the day of the announcement.
[models."gpt-5.4-nano"]
name = "GPT-5.4 Nano"
provider = "openai"
operations = ["text_generation", "decision"]
context_window = 400000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.25, cache_read_per_mtok = 0.02, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
deprecated = true
deprecation_note = "Shutdown 2027-04-01 (announced 2026-10-01) per OpenAI deprecations page and developer email. OpenAI names gpt-6-luna as the replacement."
sunset_date = "2027-04-01"
superseded_by = "gpt-6-luna"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "summarization", "tool_use"]
# GPT-5.3-Codex — agentic-coding tune (released 2026-02-05). Shutdown
# announced 2026-10-01; OpenAI names gpt-6-sol rather than gpt-6.1-sol, and
# gpt-6-sol is also the GPT-6 route that keeps function tools on Chat
# Completions (at effort `none`).
[models."gpt-5.3-codex"]
name = "GPT-5.3-Codex"
provider = "openai"
context_window = 400000
capabilities = ["tools", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.75, output_per_mtok = 14.00, cache_read_per_mtok = 0.175, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
deprecated = true
deprecation_note = "Shutdown 2027-04-01 (announced 2026-10-01) per OpenAI deprecations page and developer email. OpenAI names gpt-6-sol as the replacement."
sunset_date = "2027-04-01"
superseded_by = "gpt-6-sol"
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use", "agentic"]
# GPT-5.1 — listed so callers still on the bare id resolve pricing and see the
# shutdown before it lands; Harn never routes to it by default. Model page
# (read 2026-10-01): 400K context, $1.25 / $10 per MTok, $0.125 cached input.
# Live probe 2026-10-01 on /v1/chat/completions: a one-tool request returned a
# native tool call; a PNG image was read correctly; reasoning_effort
# none/low/high -> 200 and minimal/xhigh -> 400 ("Supported values are:
# 'none', 'low', 'medium', and 'high'"); a repeated 2.7K-token prefix
# reported 2560 cached tokens on the second call.
[models."gpt-5.1"]
name = "GPT-5.1"
provider = "openai"
context_window = 400000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 10.00, cache_read_per_mtok = 0.125, hosted_tool_fees = { web_search = { per_1k_calls = 10.0, source_url = "https://developers.openai.com/api/docs/pricing" }, file_search = { per_1k_calls = 2.50, source_url = "https://developers.openai.com/api/docs/pricing" } } }
deprecated = true
deprecation_note = "Shutdown 2027-04-01 (announced 2026-10-01) per OpenAI deprecations page and developer email. OpenAI names gpt-6-sol as the replacement."
sunset_date = "2027-04-01"
superseded_by = "gpt-6-sol"
tier = "mid"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "vision"]
# The `chatgpt-4o-latest` API alias was retired
# on 2026-02-17. The API model `gpt-4o` remains available.
[models."gpt-4o"]
name = "GPT-4o"
provider = "openai"
context_window = 128000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 10.00, cache_read_per_mtok = 1.25 }
tier = "frontier"
open_weight = false
strengths = ["coding", "vision", "tool_use"]
[models."gpt-4o-mini"]
name = "GPT-4o Mini"
provider = "openai"
context_window = 128000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60, cache_read_per_mtok = 0.075 }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "summarization", "tool_use"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
[models."gpt-4.1"]
name = "GPT-4.1"
provider = "openai"
context_window = 1047576
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 8.00, cache_read_per_mtok = 0.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use", "long_context", "vision"]
[models."gpt-4.1-mini"]
name = "GPT-4.1 Mini"
provider = "openai"
context_window = 1047576
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.40, output_per_mtok = 1.60, cache_read_per_mtok = 0.10 }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "long_context", "vision"]
[models."gpt-4.1-nano"]
name = "GPT-4.1 Nano"
provider = "openai"
context_window = 1047576
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.40, cache_read_per_mtok = 0.025 }
deprecated = true
deprecation_note = "Shutdown 2026-10-23 (announced 2026-04-22) per OpenAI deprecations page and the typed shutdown_date on GET /v1/models (read 2026-09-29). OpenAI names gpt-5.6-luna; Harn recommends gpt-6-luna."
sunset_date = "2026-10-23"
superseded_by = "gpt-6-luna"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "tool_use", "long_context", "vision"]
[models."text-embedding-3-small"]
name = "Text Embedding 3 Small"
provider = "openai"
context_window = 8191
capabilities = ["embeddings"]
embedding_dim = 1536
embedding_max_tokens = 8191
pricing = { input_per_mtok = 0.02, output_per_mtok = 0.00 }
tier = "small"
open_weight = false
strengths = ["embeddings"]
[models."gpt-4-turbo"]
name = "GPT-4 Turbo"
provider = "openai"
context_window = 128000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 30.00 }
deprecated = true
deprecation_note = "Shutdown 2026-10-23 (announced 2026-04-22) per OpenAI deprecations page and the typed shutdown_date on GET /v1/models (read 2026-09-29). Listed for cost-attribution backfill; Harn recommends gpt-6.1-sol."
sunset_date = "2026-10-23"
superseded_by = "gpt-6.1-sol"
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use"]
[models.o1]
name = "OpenAI o1"
provider = "openai"
context_window = 200000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 15.00, output_per_mtok = 60.00, cache_read_per_mtok = 7.50 }
deprecated = true
deprecation_note = "Shutdown 2026-10-23 (announced 2026-04-22) per OpenAI deprecations page. Harn recommends gpt-6.1-sol."
# The retirement date was prose only. OpenAI publishes it as a typed
# `shutdown_date` on the model record (GET /v1/models, read 2026-09-20), so it
# belongs in the typed field consumers read.
sunset_date = "2026-10-23"
superseded_by = "gpt-6.1-sol"
tier = "reasoning"
open_weight = false
strengths = ["reasoning"]
# Removed 2026-09-20: o1-mini. It is gone from GET /v1/models ahead of the
# announced 2026-10-23 legacy exit, while o1 and o3 are still listed (with
# `shutdown_date` 2026-10-23 and null respectively), so those rows stay.
[models.o3]
name = "OpenAI o3"
provider = "openai"
context_window = 200000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 8.00, cache_read_per_mtok = 0.50 }
deprecated = true
deprecation_note = "Shutdown 2026-12-11 (announced 2026-06-11) per OpenAI deprecations page, which retires the only o3 snapshot (o3-2025-04-16; read 2026-10-09). Harn recommends gpt-6.1-sol."
sunset_date = "2026-12-11"
superseded_by = "gpt-6.1-sol"
tier = "reasoning"
open_weight = false
strengths = ["reasoning", "coding"]
benchmarks = { swe_bench_verified = 69.1 }
[models."o4-mini"]
name = "OpenAI o4-mini"
provider = "openai"
context_window = 200000
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.10, output_per_mtok = 4.40, cache_read_per_mtok = 0.275 }
deprecated = true
deprecation_note = "Shutdown 2026-10-23 (announced 2026-04-22) per OpenAI deprecations page and the typed shutdown_date on GET /v1/models (read 2026-09-29). OpenAI names gpt-5.6-terra; Harn recommends gpt-6.1-sol."
sunset_date = "2026-10-23"
superseded_by = "gpt-6.1-sol"
tier = "mid"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "vision"]
[models."o3-mini"]
name = "OpenAI o3-mini"
provider = "openai"
context_window = 200000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 1.10, output_per_mtok = 4.40, cache_read_per_mtok = 0.55 }
deprecated = true
deprecation_note = "Shutdown 2026-10-23 (announced 2026-04-22) per OpenAI deprecations page. Use gpt-5.4-mini."
sunset_date = "2026-10-23"
superseded_by = "gpt-5.4-mini"
tier = "reasoning"
open_weight = false
strengths = ["reasoning", "coding", "cheap"]
benchmarks = { swe_bench_verified = 49.3 }
# Google Gemini ─ pricing: https://ai.google.dev/gemini-api/docs/pricing,
# verified 2026-08-22. Gemini 1.0 / 1.5 already retired; Gemini 2.0
# Flash + Flash-Lite shut down 2026-06-01 per the deprecations page.
# Gemini 2.5 Flash is no longer servable on the direct Gemini API: the
# endpoint 404s the id for new users and points at the 3.x lineup
# (Gemini 3.7 Flash, Gemini 3.6 Flash, and Gemini 3.5 Flash-Lite are
# current GA routes). The row stays for pricing history and for the
# OpenRouter mirror, which still serves it. Thinking tokens bill as output; implicit
# caching is automatic (90% discount on cache hits), explicit caching
# adds hourly storage.
# NOTE: this row previously carried Flash-Lite's $0.10/$0.40 rates.
# Gemini 2.5 Flash is $0.30 in / $2.50 out (cache read $0.03) per the
# pricing page; the $0.10/$0.40 tier is gemini-2.5-flash-lite below.
[models."gemini-2.5-flash"]
name = "Gemini 2.5 Flash"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 2.50, cache_read_per_mtok = 0.03 }
deprecated = true
deprecation_note = "generativelanguage.googleapis.com returns HTTP 404 model_unavailable for this id: \"no longer available to new users\", naming models/gemini-3.6-flash as the replacement. Observed 2026-09-03. The OpenRouter mirror google/gemini-2.5-flash still serves."
superseded_by = "gemini-3.5-flash-lite"
tier = "mid"
open_weight = false
strengths = ["speed", "long_context", "vision", "cheap", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
[models."gemini-2.5-flash-lite"]
name = "Gemini 2.5 Flash-Lite"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.40, cache_read_per_mtok = 0.01 }
deprecated = true
deprecation_note = "Unavailable to new Gemini API users as of August 2026 and scheduled to shut down 2026-10-16. Use gemini-3.5-flash-lite."
superseded_by = "gemini-3.5-flash-lite"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "long_context", "summarization", "tool_use"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.8 Flash — GA September 2, 2026. Google's live models endpoint
# reports a 1,048,576-token input limit and a 65,536-token output ceiling for
# `gemini-3.8-flash`; the id carries no preview suffix. Regular pricing is
# $1.50/$7.50 per MTok with a $0.15 cache read, with an introductory period
# through December 31, 2026. A "Gemini 3.8 Flash Cyber" sibling was announced
# the same day but is gated behind an early-access program and is absent from
# the models endpoint, so it gets no row until it is actually servable.
[models."gemini-3.8-flash"]
name = "Gemini 3.8 Flash"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "google-gemini-3.8-intro", starts_on = "2026-09-02", ends_on = "2026-12-31", source_url = "https://ai.google.dev/gemini-api/docs/pricing", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075 }], hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["speed", "coding", "reasoning", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, cost_multiplier = 1.8, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.7 Flash — GA August 2026. Google lists a 1M context window,
# 64k output ceiling, native tools, and $1.50/$7.50 regular pricing after its
# introductory period.
[models."gemini-3.7-flash"]
name = "Gemini 3.7 Flash"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "google-gemini-3.7-intro", starts_on = "2026-08-13", ends_on = "2026-12-31", source_url = "https://ai.google.dev/gemini-api/docs/pricing", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075 }], hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["speed", "coding", "reasoning", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, cost_multiplier = 1.8, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.6 Flash — GA July 2026. Google applies the 3.7 introductory
# price to 3.6 through December 31, 2026.
# This model uses the Interactions live endpoint; its capability row also
# removes the deprecated sampling knobs and maps Harn effort to thinking_level.
[models."gemini-3.6-flash"]
name = "Gemini 3.6 Flash"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "google-gemini-3.6-intro", starts_on = "2026-08-13", ends_on = "2026-12-31", source_url = "https://ai.google.dev/gemini-api/docs/pricing", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075 }], hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["speed", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, cost_multiplier = 1.8, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.5 Flash-Lite — GA July 2026. Google positions this as the
# throughput/latency route at $0.30/$2.50 per MTok with a 1M context window.
[models."gemini-3.5-flash-lite"]
name = "Gemini 3.5 Flash-Lite"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 2.50, cache_read_per_mtok = 0.03, hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "long_context", "vision", "tool_use", "agentic"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.5 Flash is Google's current speed/cost frontier route for agentic
# workflows. Google lists a 1,048,576-token input window and 65,536-token
# output ceiling on the Gemini API model page.
[models."gemini-3.5-flash"]
name = "Gemini 3.5 Flash"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 9.00, cache_read_per_mtok = 0.15, hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["speed", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Gemini 3.1 Pro (Preview) — context-length-tiered pricing: $2 in / $12
# out per MTok up to 200k input, $4 / $18 beyond (the catalog records
# the <=200k tier). Paid tier only. Cache read $0.20 (<=200k) plus
# $4.50/MTok/hr storage for explicit caches.
[models."gemini-3.1-pro-preview"]
name = "Gemini 3.1 Pro (Preview)"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 12.00, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 1.5 }], hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Also serves the `decision` operation through strict JSON-schema structured
# output; the protocol binding is in capability_sources/10-decisions/00-decision-contracts.toml.
[models."gemini-3.1-flash-lite"]
name = "Gemini 3.1 Flash-Lite"
provider = "gemini"
operations = ["text_generation", "decision"]
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 0.25, output_per_mtok = 1.50, cache_read_per_mtok = 0.025, hosted_tool_fees = { google_search = { per_1k_calls = 14.0, free_per_month = 5000, source_url = "https://ai.google.dev/gemini-api/docs/pricing" } } }
deprecated = true
deprecation_note = "Shutdown 2027-05-07 per the Gemini API deprecations page (read 2026-09-29). Use gemini-3.5-flash-lite."
sunset_date = "2027-05-07"
superseded_by = "gemini-3.5-flash-lite"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "long_context", "tool_use"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# OpenRouter-routed variants of the same models. Pricing matches the native
# Gemini API; OpenRouter adds its own margin at request time.
# Gemini 2.5 Flash stays catalogued through its OpenRouter retirement so
# in-flight callers still resolve pricing; no Harn default names it.
[models."google/gemini-2.5-flash"]
name = "Gemini 2.5 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking"]
# Cache write added 2026-09-20: OpenRouter bills $0.0833333333333333 per MTok
# to write a cache entry on every Gemini Flash route. It was missing here, so
# cache writes were estimated at zero.
pricing = { input_per_mtok = 0.30, output_per_mtok = 2.50, cache_read_per_mtok = 0.03, cache_write_per_mtok = 0.0833333333333333 }
deprecated = true
deprecation_note = "OpenRouter retires this route 2026-10-20 (typed expiration_date on https://openrouter.ai/api/v1/models, read 2026-10-01; google/gemini-2.5-pro and -flash-lite expire the same day). Google's own page lists no shutdown for gemini-2.5-flash but limits 2.5 access to existing users. Use google/gemini-3.5-flash-lite."
sunset_date = "2026-10-20"
superseded_by = "google/gemini-3.5-flash-lite"
tier = "mid"
open_weight = false
strengths = ["speed", "long_context", "vision", "cheap", "tool_use"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
[models."google/gemini-3.6-flash"]
name = "Gemini 3.6 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
# Corrected 2026-09-20: the promotion carried no cache rates, so cached reads
# billed at the undiscounted $0.15 base. OpenRouter publishes $0.075 cache read
# and $0.0416666666666667 cache write for this route, the same as the 3.7 and
# 3.8 rows. Verified against https://openrouter.ai/api/v1/models on 2026-09-20.
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "openrouter-google-gemini-3.6-intro", starts_on = "2026-08-13", ends_on = "2026-12-31", source_url = "https://openrouter.ai/api/v1/models", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075, cache_write_per_mtok = 0.0416666666666667 }] }
tier = "frontier"
open_weight = false
strengths = ["speed", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
# OpenRouter mirrors Gemini 3.8 Flash. Observed on openrouter.ai/api/v1/models
# on 2026-09-03 at $0.75 in / $3.75 out per MTok, which tracks Google's own
# introductory period rather than a separate OpenRouter discount.
[models."google/gemini-3.8-flash"]
name = "Gemini 3.8 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "openrouter-google-gemini-3.8-intro", starts_on = "2026-09-02", ends_on = "2026-12-31", source_url = "https://openrouter.ai/api/v1/models", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075, cache_write_per_mtok = 0.0416666666666667 }] }
tier = "frontier"
open_weight = false
strengths = ["speed", "coding", "reasoning", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
[models."google/gemini-3.7-flash"]
name = "Gemini 3.7 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
# Corrected 2026-09-20: the promotion recorded 75% off, but OpenRouter bills
# this route at $0.75 / $3.75 per MTok with a $0.075 cache read — the same 50%
# intro rate as the 3.6 and 3.8 rows above. Verified against
# https://openrouter.ai/api/v1/models on 2026-09-20.
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15, promotions = [{ id = "openrouter-google-gemini-3.7-intro", starts_on = "2026-08-13", ends_on = "2026-12-31", source_url = "https://openrouter.ai/api/v1/models", input_per_mtok = 0.75, output_per_mtok = 3.75, cache_read_per_mtok = 0.075, cache_write_per_mtok = 0.0416666666666667 }] }
tier = "frontier"
open_weight = false
strengths = ["speed", "coding", "reasoning", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
[models."google/gemini-3.5-flash-lite"]
name = "Gemini 3.5 Flash-Lite (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching", "thinking"]
# Cache write added 2026-09-20; see the 2.5 Flash row above.
pricing = { input_per_mtok = 0.30, output_per_mtok = 2.50, cache_read_per_mtok = 0.03, cache_write_per_mtok = 0.0833333333333333 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
[models."google/gemini-3.5-flash"]
name = "Gemini 3.5 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
# Cache write added 2026-09-20; see the 2.5 Flash row above.
pricing = { input_per_mtok = 1.50, output_per_mtok = 9.00, cache_read_per_mtok = 0.15, cache_write_per_mtok = 0.0833333333333333 }
tier = "frontier"
open_weight = false
strengths = ["speed", "long_context", "vision", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
# Gemini 2.5 Pro — context-length-tiered: $1.25 in / $10 out per MTok up
# to 200k input, $2.50 / $15 beyond (the catalog records the <=200k
# tier; the previous $5 output figure and 2M context were wrong — the
# model page lists a 1,048,576-token window).
[models."gemini-2.5-pro"]
name = "Gemini 2.5 Pro"
provider = "gemini"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 10.00, cache_read_per_mtok = 0.125, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "frontier"
open_weight = false
strengths = ["long_context", "vision", "reasoning", "coding"]
benchmarks = { swe_bench_verified = 63.8 }
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
serving_tiers = [
{ id = "flex", label = "Flex inference", mode = "synchronous", economics = "discounted", request = { param = "service_tier", value = "flex" }, discount_percent = 50, status = "research_preview", latency = "variable synchronous latency for latency-tolerant workloads", reliability = "best-effort availability; resource unavailability is possible", suitable_workloads = ["offline_eval", "corpus", "bulk_judge"], unsuitable_workloads = ["interactive_chat"], note = "Flex is synchronous and distinct from Gemini Batch. Cache and batch discounts do not stack; cache-hit discount takes precedence where documented." },
{ id = "priority", label = "Priority inference", mode = "synchronous", economics = "premium", request = { param = "service_tier", value = "priority" }, status = "research_preview", latency = "predictable low-latency serving for user-facing traffic", reliability = "traffic can gracefully downgrade to standard when dynamic priority limits are exceeded", unsuitable_workloads = ["batch"], note = "GenerateContent responses expose downgrade via x-gemini-service-tier." },
]
# Mistral ─ pricing: https://mistral.ai/pricing/api/, verified
# 2026-07-02. Direct rows first, then OpenRouter mirrors.
[models."mistral-medium-3-5"]
name = "Mistral Medium 3.5"
provider = "mistral"
context_window = 262144
logical_model = "mistral-medium-3.5-128b"
equivalence_group = "mistral-medium-3.5-128b"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.15 }
architecture = { parameter_count_b = 128.0, moe = false, license = "Modified MIT", source_url = "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", last_verified = "2026-06-20" }
tier = "frontier"
open_weight = true
strengths = ["coding", "tool_use", "reasoning", "long_context", "vision", "agentic"]
# Mistral Large 4 (public preview v26.10, released 2026-10-06): 52B active /
# 1.05T total MoE with a vision encoder and a 1M context window. Mistral's
# model page (read 2026-10-09) lists a launch sale of $0.68 in / $0.07 cached /
# $2.09 out against an original $1.36 / $0.14 / $4.18 per MTok; it states no
# end date, and Artificial Analysis reports a two-week window (to about
# 2026-10-20), so the row carries the original card with the sale as a
# promotion to review then. The catalog id follows the docs slug and
# OpenRouter, while the wire id is the API name the model card lists first
# (`mistral-large-4`, shown with one alias; the reasoning guide names the
# `mistral-large-4-0` alias). Medium 3.5's card lists `mistral-medium-3-5`
# first the same way, and that is the id its row sends. No source confirms
# that `mistral-large-latest` has moved. Mistral documents only `reasoning_effort`
# `high` and `none` for it. Not call-verified on the direct route (no
# MISTRAL_API_KEY on this host); see the OpenRouter row for the probe.
[models."mistral-large-4-0"]
name = "Mistral Large 4"
provider = "mistral"
wire_model = "mistral-large-4"
context_window = 1048576
released = "2026-10-06"
logical_model = "mistral-large-4-0"
equivalence_group = "mistral-large-4-0"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.36, output_per_mtok = 4.18, cache_read_per_mtok = 0.14, promotions = [
{ id = "mistral-large-4-launch", starts_on = "2026-10-06", review_after = "2026-10-20", source_url = "https://docs.mistral.ai/models/mistral-large-4-0", input_per_mtok = 0.68, output_per_mtok = 2.09, cache_read_per_mtok = 0.07 },
] }
architecture = { parameter_count_b = 1050.0, active_parameter_count_b = 52.0, moe = true, source_url = "https://docs.mistral.ai/models/mistral-large-4-0", last_verified = "2026-10-09" }
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use", "reasoning", "long_context", "vision", "agentic"]
[models."mistral-large-2512"]
name = "Mistral Large 3 2512"
provider = "mistral"
context_window = 262144
logical_model = "mistral-large-3-2512"
equivalence_group = "mistral-large-3-2512"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.50, output_per_mtok = 1.50, cache_read_per_mtok = 0.05 }
architecture = { parameter_count_b = 675.0, active_parameter_count_b = 41.0, moe = true, license = "Apache-2.0", source_url = "https://docs.mistral.ai/models/model-cards/mistral-large-3-25-12", last_verified = "2026-06-05" }
tier = "frontier"
open_weight = true
strengths = ["coding", "tool_use", "long_context", "vision"]
[models."mistral-small-2603"]
name = "Mistral Small 4"
provider = "mistral"
context_window = 262144
logical_model = "mistral-small-4-2603"
equivalence_group = "mistral-small-4-2603"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60, cache_read_per_mtok = 0.015 }
architecture = { parameter_count_b = 119.0, active_parameter_count_b = 6.5, moe = true, license = "Apache-2.0", source_url = "https://docs.mistral.ai/models/model-cards/mistral-small-4-0-26-03", last_verified = "2026-06-05" }
tier = "mid"
open_weight = true
strengths = ["cheap", "coding", "speed", "tool_use", "long_context"]
# Codestral — Mistral's FIM/code-completion line (version 25.08; the
# `codestral-latest` API handle currently resolves here).
[models."codestral-2508"]
name = "Codestral 25.08"
provider = "mistral"
context_window = 262144
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 0.90 }
tier = "mid"
open_weight = false
strengths = ["coding", "speed", "cheap"]
[models."mistralai/mistral-medium-3-5"]
name = "Mistral Medium 3.5 (via OpenRouter)"
provider = "openrouter"
context_window = 262144
logical_model = "mistral-medium-3.5-128b"
equivalence_group = "mistral-medium-3.5-128b"
served_variant = "openrouter"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 7.50 }
architecture = { parameter_count_b = 128.0, moe = false, license = "Modified MIT", source_url = "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", last_verified = "2026-06-20" }
tier = "frontier"
open_weight = true
strengths = ["coding", "tool_use", "reasoning", "long_context", "vision", "agentic"]
# Removed 2026-09-20: the OpenRouter mistralai/mistral-large-2512 route. The
# interactive slug is absent from https://openrouter.ai/api/v1/models, and its
# endpoints API (/api/v1/models/mistralai/mistral-large-2512/endpoints) returns
# the model record with an empty endpoint list. OpenRouter does still list a
# `:batch` slug for it; Harn catalogues no `:batch` routes on any provider, so
# that variant is deliberately not picked up in its place. The direct
# Mistral `mistral-large-2512` row is unaffected and unverified this pass (no
# MISTRAL_API_KEY on this host, and api.mistral.ai/v1/models is 401 without one).
# Mistral Large 4 through OpenRouter's Mistral endpoint (listed 2026-10-06;
# 1,048,576 context, 262,144 max output, text and image input, $0.68 / $0.07
# cached / $2.09 at the launch sale). Probed 2026-10-09 pinned to that
# endpoint: a native tool call, the tool-result round trip and a required tool
# choice returned 200; reasoning off returned zero reasoning tokens and effort
# `low` and `high` both reasoned. The EU endpoint has a 524,288 context and a
# 10% premium; the row carries the global endpoint.
[models."mistralai/mistral-large-4-0"]
name = "Mistral Large 4 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
released = "2026-10-06"
logical_model = "mistral-large-4-0"
equivalence_group = "mistral-large-4-0"
served_variant = "openrouter"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.36, output_per_mtok = 4.18, cache_read_per_mtok = 0.14, promotions = [
{ id = "mistral-large-4-launch", starts_on = "2026-10-06", review_after = "2026-10-20", source_url = "https://openrouter.ai/api/v1/models/mistralai/mistral-large-4-0/endpoints", input_per_mtok = 0.68, output_per_mtok = 2.09, cache_read_per_mtok = 0.07 },
] }
architecture = { parameter_count_b = 1050.0, active_parameter_count_b = 52.0, moe = true, source_url = "https://docs.mistral.ai/models/mistral-large-4-0", last_verified = "2026-10-09" }
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use", "reasoning", "long_context", "vision", "agentic"]
[models."mistralai/mistral-small-2603"]
name = "Mistral Small 4"
provider = "openrouter"
context_window = 262144
logical_model = "mistral-small-4-2603"
equivalence_group = "mistral-small-4-2603"
served_variant = "openrouter"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60, cache_read_per_mtok = 0.015 }
architecture = { parameter_count_b = 119.0, active_parameter_count_b = 6.5, moe = true, license = "Apache-2.0", source_url = "https://docs.mistral.ai/models/model-cards/mistral-small-4-0-26-03", last_verified = "2026-06-05" }
# Inline metadata matches the mistral-small-4-2603 equivalence group and keeps
# this row independent of fragment-order defaults.
tier = "mid"
open_weight = true
strengths = ["cheap", "coding", "speed", "tool_use", "long_context"]
# --- source: 60-models/12-meta.toml ---
# Meta Muse Spark ─ Meta Model API (https://api.meta.ai/v1), OpenAI-compatible.
#
# Rate card, verified 2026-09-02 against dev.meta.ai/docs/pricing-rate-limits:
# standard $1.25 in / $0.15 cached / $4.25 out per MTok, 3,000 rpm
# contributor $0.10 in / $0.002 cached / $0.20 out per MTok, 100 rpm
# Every generation shares its tier's rate card, so 1.1, 1.2 and 1.3 carry the
# same standard prices. Do not "correct" one row toward another generation.
#
# Context window is 1,048,576, as the docs spell it, not a rounded 1,000,000.
#
# THE CONTRIBUTOR ROWS ARE NOT A VOLUME DISCOUNT. Meta publishes the same
# model twice; the cheaper id buys the discount with permission to train on
# your prompts and completions. That is declared per row in
# `[models.<id>.data_controls]`, which overrides the provider's declaration,
# and `strictest_available` refuses to route to a row declaring `trains`.
#
# Wire facts below were verified with live calls on 2026-09-02, not inferred:
# - native OpenAI-shape tool calls (finish_reason "tool_calls", verified)
# - prompt caching real (usage reported cached_tokens > 0, verified)
# - reasoning is native and NOT optional; usage always reports
# reasoning_tokens
# - `reasoning_effort` is ACCEPTED but appears inert: "low" and "high" spent
# an identical 197 reasoning tokens on the same trivial prompt. No effort
# levels are declared here, because a lever that does not move is worse
# than an absent one. Re-probe before adding them.
#
# Sizing quirk worth knowing: the model spends heavily on reasoning before it
# emits anything. "What is 2+2" returned "4" only after 274 reasoning tokens,
# and a 16-token cap returned finish_reason "length" with null content. Any
# caller or smoke fixture must budget max_tokens in the thousands.
[models."muse-spark-1.3"]
name = "Muse Spark 1.3"
provider = "meta"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching", "vision"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 4.25, cache_read_per_mtok = 0.15 }
tier = "reasoning"
strengths = ["reasoning", "coding", "tool_use", "long_context"]
rate_limits = { rpm = 3000 }
[models."muse-spark-1.3".data_controls]
training_default = "does_not_train"
checked_on = "2026-09-02"
sources = ["https://developer.meta.com/ai/products/meta-model-api/"]
note = "Meta documents the standard tier as not used to improve its products."
[models."muse-spark-1.3-contributor"]
name = "Muse Spark 1.3 (contributor tier)"
provider = "meta"
wire_model = "muse-spark-1.3-contributor"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching", "vision"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.20, cache_read_per_mtok = 0.002 }
tier = "reasoning"
strengths = ["reasoning", "coding", "tool_use", "long_context", "cheap"]
rate_limits = { rpm = 100 }
[models."muse-spark-1.3-contributor".data_controls]
training_default = "trains"
checked_on = "2026-09-02"
sources = ["https://developer.meta.com/ai/products/meta-model-api/"]
note = "Meta prices this route ~12x below the standard tier in exchange for permission to train future Meta models on your prompts and completions. Meta's own wording is that the traffic is used to improve our products."
[models."muse-spark-1.2"]
name = "Muse Spark 1.2"
provider = "meta"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching", "vision"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 4.25, cache_read_per_mtok = 0.15 }
tier = "reasoning"
strengths = ["reasoning", "coding", "tool_use", "long_context"]
rate_limits = { rpm = 3000 }
[models."muse-spark-1.2".data_controls]
training_default = "does_not_train"
checked_on = "2026-09-02"
sources = ["https://developer.meta.com/ai/products/meta-model-api/"]
note = "Meta documents the standard tier as not used to improve its products."
[models."muse-spark-1.2-contributor"]
name = "Muse Spark 1.2 (contributor tier)"
provider = "meta"
wire_model = "muse-spark-1.2-contributor"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching", "vision"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.20, cache_read_per_mtok = 0.002 }
tier = "reasoning"
strengths = ["reasoning", "coding", "tool_use", "long_context", "cheap"]
rate_limits = { rpm = 100 }
[models."muse-spark-1.2-contributor".data_controls]
training_default = "trains"
checked_on = "2026-09-02"
sources = ["https://developer.meta.com/ai/products/meta-model-api/"]
note = "Meta prices this route ~12x below the standard tier in exchange for permission to train future Meta models on your prompts and completions. Meta's own wording is that the traffic is used to improve our products."
# 1.1 has no contributor counterpart; Meta lists it only on the standard tier.
[models."muse-spark-1.1"]
name = "Muse Spark 1.1"
provider = "meta"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching", "vision"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 4.25, cache_read_per_mtok = 0.15 }
tier = "frontier"
strengths = ["reasoning", "tool_use", "long_context"]
rate_limits = { rpm = 3000 }
[models."muse-spark-1.1".data_controls]
training_default = "does_not_train"
checked_on = "2026-09-02"
sources = ["https://developer.meta.com/ai/products/meta-model-api/"]
note = "Meta documents the standard tier as not used to improve its products."
# --- source: 60-models/20-open-weight-openrouter.toml ---
# Open-weight executor candidates (<$2/Mtok with function calling). Use
# these via OpenRouter or Fireworks for fast secondary-model dispatch.
# Pricing snapshot 2026-05 from OpenRouter / Artificial Analysis.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20; rates and
# context windows below are that read.
[models."qwen/qwen3-coder"]
name = "Qwen3 Coder 480B A35B"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.00, cache_read_per_mtok = 0.10 }
availability = "serverless"
tier = "frontier"
open_weight = true
strengths = ["coding", "long_context", "agentic", "tool_use"]
benchmarks = { swe_bench_verified = 67.0 }
# Qwen3-Coder-Next — 80B/3B MoE non-thinking coder.
[models."qwen/qwen3-coder-next"]
name = "Qwen3 Coder Next"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.12, output_per_mtok = 0.80, cache_read_per_mtok = 0.07 }
availability = "serverless"
architecture = { parameter_count_b = 80.0, active_parameter_count_b = 3.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3-Coder-Next", last_verified = "2026-07-02" }
benchmarks = { swe_bench_verified = 70.6, swe_bench_pro = 44.3 }
tier = "mid"
open_weight = true
strengths = ["coding", "cheap", "long_context", "agentic", "tool_use"]
# Qwen3.5-397B-A17B — the open-tier Qwen flagship (native VLM MoE).
# OpenRouter serverless rate verified 2026-07-02.
[models."qwen/qwen3.5-397b-a17b"]
name = "Qwen3.5 397B A17B"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.55, output_per_mtok = 3.50, cache_read_per_mtok = 0.225 }
availability = "serverless"
architecture = { parameter_count_b = 397.0, active_parameter_count_b = 17.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.5-397B-A17B", last_verified = "2026-07-02" }
benchmarks = { swe_bench_verified = 76.4 }
tier = "frontier"
open_weight = true
strengths = ["coding", "reasoning", "tool_use", "long_context", "vision"]
# Together lists Qwen3-Coder-Next-FP8 in GET /v1/models alongside its
# serverless catalog, but normal chat-completion calls fail with
# `model_not_available` and instruct the caller to create a dedicated
# endpoint. Carry the catalog row so price/route metadata is preserved,
# but mark `availability = "dedicated"` so hosts don't surface it as a
# one-click serverless option.
[models."Qwen/Qwen3-Coder-Next-FP8"]
name = "Qwen3 Coder Next FP8 (Together, dedicated)"
provider = "together"
context_window = 262144
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.50, output_per_mtok = 1.20 }
availability = "dedicated"
tier = "frontier"
open_weight = true
strengths = ["coding", "long_context", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."deepseek/deepseek-v3.2"]
name = "DeepSeek V3.2"
provider = "openrouter"
context_window = 163840
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.28, output_per_mtok = 0.42, cache_read_per_mtok = 0.028 }
tier = "mid"
open_weight = true
strengths = ["coding", "tool_use", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# Kimi K3 on OpenRouter (listed since 2026-07-16; catalogued 2026-10-01, when
# it was the only K3 host without a row). The index headline of $2.70 /
# $13.50 is one endpoint's rate; every probe call that day was routed to a
# $3 / $15 endpoint and billed at that rate, which is also Moonshot's list
# price, so the row records it. Capability evidence is on the
# `moonshotai/kimi-k3` OpenRouter capability rule.
[models."moonshotai/kimi-k3"]
name = "Kimi K3 (via OpenRouter)"
provider = "openrouter"
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."moonshotai/kimi-k2.6"]
name = "Kimi K2.6"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.65, output_per_mtok = 3.41, cache_read_per_mtok = 0.15 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
benchmarks = { swe_bench_pro = 58.6, humanitys_last_exam_with_tools = 54.0 }
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."moonshotai/kimi-k2.7-code"]
name = "Kimi K2.7 Code"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.6712, output_per_mtok = 3.35, cache_read_per_mtok = 0.18 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."openai/gpt-oss-120b"]
name = "GPT-OSS 120B"
provider = "openrouter"
context_window = 131072
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "openrouter"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.037, output_per_mtok = 0.17, cache_read_per_mtok = 0.075 }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-05" }
# Explicit metadata keeps this row self-described across fragment boundaries.
# GPT-OSS 120B is Apache-2.0 (open weight) and text-only; it is Burin's cheap
# coding executor.
# `tier`/`open_weight`/`strengths` match the rest of the openai-gpt-oss-120b
# equivalence group (the validator requires one tier per logical model — the
# conservative shared baseline is `frontier`).
tier = "mid"
open_weight = true
strengths = ["cheap", "coding", "tool_use", "reasoning"]
# --- source: 60-models/25-openrouter-frontier-agents.toml ---
# Current OpenRouter-hosted coding/agent models that are not direct provider
# defaults. Pricing snapshots are from OpenRouter's live `/api/v1/models`.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20; rates and
# context windows below are that read.
[models."qwen/qwen3.7-plus"]
name = "Qwen3.7 Plus"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.32, output_per_mtok = 1.28, cache_read_per_mtok = 0.064, cache_write_per_mtok = 0.40, input_token_bands = [{ minimum_input_tokens = 256000, input_multiplier = 3.0, output_multiplier = 3.0 }] }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "long_context", "tool_use", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."qwen/qwen3.7-max"]
name = "Qwen3.7 Max"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# The cache-write rate moved with the headline rates and was left behind at
# $1.5625; OpenRouter bills $1.84375 per MTok (read 2026-09-20).
pricing = { input_per_mtok = 1.475, output_per_mtok = 4.425, cache_read_per_mtok = 0.295, cache_write_per_mtok = 1.84375 }
# Still served with no announced shutdown.
superseded_by = "qwen/qwen3.8-max-0902"
# OpenRouter describes Max as the flagship Qwen3.7 route; keep it out of the
# value/mid tier so price-sensitive selectors do not confuse it with Flash.
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# Qwen3.8 Max (0902 snapshot, listed 2026-09-03), Alibaba's hosted flagship.
# One serving endpoint (Alibaba) at $2 / $6 per MTok, $0.25 cache read and
# $2.50 cache write (index and endpoint list read 2026-10-01). OpenRouter's
# `qwen3.8-max-prime` is a faster SKU of the same model at 2x the price and is
# not catalogued. Capability evidence, including mandatory reasoning, is on
# the `qwen/qwen3.8-max-0902` OpenRouter capability rule.
[models."qwen/qwen3.8-max-0902"]
name = "Qwen3.8 Max (via OpenRouter)"
provider = "openrouter"
logical_model = "qwen3.8-max"
equivalence_group = "qwen3.8-max"
served_variant = "openrouter"
released = "2026-09-03"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.25, cache_write_per_mtok = 2.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."kwaipilot/kat-coder-pro-v2"]
name = "KAT-Coder-Pro V2"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
# OpenRouter's model index no longer lists V2 (read 2026-09-26). It lists
# `kwaipilot/kat-coder-pro-v2.5` instead, served by one host that answered three
# one-tool requests with HTTP 400 the same day, so there is no working
# successor to point at.
deprecated = true
deprecation_note = "Removed from OpenRouter's model index by 2026-09-26. Its listed successor, kwaipilot/kat-coder-pro-v2.5, rejected tool-calling requests when probed that day, so no replacement route is recorded."
tier = "mid"
open_weight = false
strengths = ["agentic", "long_context", "tool_use", "reasoning", "speed"]
complementary_with = ["qwen", "deepseek", "kimi", "minimax", "zai-glm"]
[models."stepfun/step-3.7-flash"]
name = "Step 3.7 Flash"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.15, cache_read_per_mtok = 0.04 }
# Inline metadata matches the step-3.7-flash equivalence group and keeps this
# row independent of fragment-order defaults.
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "long_context", "tool_use", "reasoning"]
# Xiaomi MiMo v2.6 (released 2026-09-21, MIT licence). Pro is a 1.02T / 42B
# active MoE, Flash 309B / 15B active; both take text, image, video and audio
# with a ~1M context and 131,072 max output on Xiaomi's endpoint. Prices are
# the live OpenRouter index only (read 2026-10-09), as #9023 asked, because
# secondary sources disagree on Flash: Pro $0.435 / $0.0036 cached / $0.87 and
# Flash $0.14 / $0.0028 cached / $0.28. Probed 2026-10-09 pinned to the Xiaomi
# endpoint: native tool calls, the tool-result round trip, a required tool
# choice, reasoning off and on all returned 200, and a second tool turn
# succeeded without echoing the prior reasoning back.
[models."xiaomi/mimo-v2.6-pro"]
name = "MiMo v2.6 Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
released = "2026-09-21"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.435, output_per_mtok = 0.87, cache_read_per_mtok = 0.0036 }
architecture = { parameter_count_b = 1020.0, active_parameter_count_b = 42.0, moe = true, license = "MIT", source_url = "https://huggingface.co/XiaomiMiMo/MiMo-V2.6-Pro-RL", last_verified = "2026-10-09" }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "cheap"]
[models."xiaomi/mimo-v2.6-flash"]
name = "MiMo v2.6 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
released = "2026-09-21"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.14, output_per_mtok = 0.28, cache_read_per_mtok = 0.0028 }
architecture = { parameter_count_b = 309.0, active_parameter_count_b = 15.0, moe = true, license = "MIT", source_url = "https://openrouter.ai/api/v1/models", last_verified = "2026-10-09" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
# --- source: 60-models/26-together-frontier-agents.toml ---
# Current Together serverless frontier/agent routes observed through
# `GET /v1/models`. Keep rows here when Harn supports the provider but the
# model is absent from direct-provider catalogs.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20; rates and
# context windows below are that read.
[models."moonshotai/Kimi-K3"]
name = "Kimi K3 (Together)"
provider = "together"
wire_model = "moonshotai/Kimi-K3"
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "together"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
# Together's model library and authenticated inventory agreed on this rate and
# route shape on 2026-08-26.
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."Qwen/Qwen3.8-2.4T-A95B"]
name = "Qwen3.8 2.4T A95B (Together)"
provider = "together"
wire_model = "Qwen/Qwen3.8-2.4T-A95B"
logical_model = "qwen3.8-2.4t-a95b"
equivalence_group = "qwen3.8-2.4t-a95b"
served_variant = "together"
api_dialect = "openai_chat"
context_window = 1010000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# Together's model library and authenticated inventory agreed on this rate on
# 2026-08-26. The inventory reports the exact 1,010,000-token window.
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.25 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."Qwen/Qwen3.7-Max"]
name = "Qwen3.7 Max (Together)"
provider = "together"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.50 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# Removed 2026-09-20: deepseek-ai/DeepSeek-V4-Pro, the undated preview route.
# Together retired it on its announced 2026-08-27 sunset date and it is absent
# from GET /v1/models (observed 2026-09-20). Every alias already pointed at the
# dated -0813 row below.
# Together's public model page lists this dated successor on serverless and
# dedicated infrastructure with a 1.05M-token context window. Pricing and
# route metadata were verified there on 2026-08-26.
[models."deepseek-ai/DeepSeek-V4-Pro-0813"]
name = "DeepSeek V4 Pro 0813 (Together)"
provider = "together"
wire_model = "deepseek-ai/DeepSeek-V4-Pro-0813"
logical_model = "deepseek-v4-pro-0813"
equivalence_group = "deepseek-v4-pro-0813"
served_variant = "together"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.32, output_per_mtok = 3.96, cache_read_per_mtok = 0.13 }
architecture = { parameter_count_b = 1600.0, active_parameter_count_b = 49.0, moe = true, license = "MIT", source_url = "https://www.together.ai/models/deepseek-v4-pro-0813", last_verified = "2026-08-26" }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# DeepSeek V4 Flash 0731 — the dated snapshot Together actually serves
# serverless (the undated `DeepSeek-V4-Flash` is not on the serverless tier).
# Pricing read from Together's `/v1/models` rate card on 2026-08-15:
# $0.14 in / $0.28 out / $0.03 cached-input per MTok. Native tool calling
# verified clean the same day.
[models."deepseek-ai/DeepSeek-V4-Flash-0731"]
name = "DeepSeek V4 Flash 0731 (Together)"
provider = "together"
context_window = 1048576
logical_model = "deepseek-v4-flash"
equivalence_group = "deepseek-v4-flash"
served_variant = "together"
wire_model = "deepseek-ai/DeepSeek-V4-Flash-0731"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.14, output_per_mtok = 0.28, cache_read_per_mtok = 0.03 }
deprecated = true
deprecation_note = "Together's customer notice (support@together.ai, received 2026-10-08) deprecates this serverless model on 2026-10-22 and names deepseek-ai/DeepSeek-V4.1-Flash as the replacement. Together's deprecations page did not list it yet on 2026-10-09. Together cancelled an earlier 2026-09-29 date for the same model, so recheck before the sunset."
sunset_date = "2026-10-22"
superseded_by = "deepseek-ai/DeepSeek-V4.1-Flash"
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
# DeepSeek V4.1 Flash on Together serverless (launched 2026-09-11 per Together's
# changelog: 1M context, FP8, function calling, structured outputs). Pricing
# from Together's serverless models and pricing pages, read 2026-10-09: $0.30
# in / $1.20 out / $0.006 cached-input per MTok; OpenRouter's Together endpoint
# lists the same card. Probed 2026-10-09 through OpenRouter pinned to its
# Together endpoint: a native tool call, the tool-result round trip, a
# required tool choice, reasoning off (zero reasoning tokens) and effort
# `high` all returned 200. The direct Together adapter was not call-verified.
[models."deepseek-ai/DeepSeek-V4.1-Flash"]
name = "DeepSeek V4.1 Flash (Together)"
provider = "together"
context_window = 1048576
released = "2026-09-11"
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
served_variant = "together"
wire_model = "deepseek-ai/DeepSeek-V4.1-Flash"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.006 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
# 2026-08-15 reachability sweep: Together serves `zai-org/GLM-5.1` only via a
# provisioned dedicated endpoint, so every serverless call returns HTTP 400
# `model_not_available`. GLM-5.2 below is the serverless Together GLM route.
[models."zai-org/GLM-5.2"]
name = "GLM 5.2 (Together)"
provider = "together"
# Together's models API reports the full 1M-token serverless window.
context_window = 1048575
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["agentic", "coding", "long_context", "tool_use", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# MiniMax M3 on Together — 524K serverless window, billed at the same
# $0.30/$1.20 rate as the first-party API. Verified 2026-07-02.
[models."MiniMaxAI/MiniMax-M3"]
name = "MiniMax M3 (Together)"
provider = "together"
context_window = 524288
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
# Kimi K2.7 Code on Together — int4-native weights at the first-party
# list rate. Verified 2026-07-02.
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."moonshotai/Kimi-K2.7-Code"]
name = "Kimi K2.7 Code (Together)"
provider = "together"
availability = "dedicated"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.19 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning"]
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."MiniMaxAI/MiniMax-M2.7"]
name = "MiniMax M2.7 (Together)"
provider = "together"
availability = "dedicated"
context_window = 196608
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
# Inline metadata matches the minimax-m2.7 equivalence group and keeps this row
# independent of fragment-order defaults.
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
# Reliable Together serverless sample routes (harn#3645 §4). The prior
# representative serverless rows were unusable as one-click samples:
# `Qwen/Qwen3-Coder-Next-FP8` returns `model_not_available` on serverless
# chat-completions (needs a dedicated endpoint; carried as
# `availability = "dedicated"` in 20-open-weight-openrouter.toml), and the
# Together `google/gemma-4-31B-it` route is a reasoning model with an
# empty-content footgun. These two non-reasoning Turbo routes are live on
# Together's serverless `/v1/chat/completions` with native tool calls and
# serve as dependable cheap executor samples. Verified live ids on
# together.ai/models (Qwen2.5 7B Instruct Turbo, Llama 3.3 70B Instruct
# Turbo).
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."Qwen/Qwen2.5-7B-Instruct-Turbo"]
name = "Qwen2.5 7B Instruct Turbo (Together)"
provider = "together"
availability = "dedicated"
context_window = 32768
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 0.30 }
tier = "small"
open_weight = true
strengths = ["speed", "cheap", "tool_use"]
[models."meta-llama/Llama-3.3-70B-Instruct-Turbo"]
name = "Llama 3.3 70B Instruct Turbo (Together)"
provider = "together"
context_window = 131072
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 1.04, output_per_mtok = 1.04 }
deprecated = true
deprecation_note = "Together's customer notice (support@together.ai, received 2026-10-08) deprecates this serverless model on 2026-10-22 and recommends transitioning; it names no single replacement, and Together's deprecations page did not list it yet on 2026-10-09."
sunset_date = "2026-10-22"
logical_model = "llama-3.3-70b-instruct"
equivalence_group = "llama-3.3-70b-instruct"
served_variant = "together"
api_dialect = "openai_chat"
tier = "mid"
open_weight = true
strengths = ["tool_use", "cheap"]
# --- source: 60-models/30-cerebras.toml ---
# Cerebras-hosted open-weight models. Serverless rows mirror
# https://api.cerebras.ai/public/v1/models; dedicated-endpoint families are
# intentionally not added as one-click routes unless Cerebras exposes a stable
# public wire ID for the standard endpoint. The headline binder-substrate
# candidate is gpt-oss-120b at very high token throughput; qwen-3.8-27b is the
# vision-capable coding/agentic route.
#
# Verified 2026-09-20: public discovery returns exactly these two models.
#
# Catalog keys are bare wire IDs (Cerebras's /v1/chat/completions wants
# the raw model name). Users routing via `model: "cerebras/<name>"` get
# the slash-prefixed selector stripped by `normalize_model_id` while
# `infer_provider` routes them to this provider.
[models."gpt-oss-120b"]
name = "GPT-OSS 120B (Cerebras)"
provider = "cerebras"
context_window = 131072
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "cerebras-wafer-scale"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.35, output_per_mtok = 0.75 }
rate_limits = { rpm = 250, tpm = 250000, tph = 1000000, tpd = 1000000, tier = "developer", source_url = "https://inference-docs.cerebras.ai/support/rate-limits", last_verified = "2026-06-12", notes = "Developer (Pay as You Go) tier confirmed live from x-ratelimit-limit-requests/tokens response headers 2026-06-12 (250 RPM / 250K TPM). The prior Free Trial row (5 RPM / 30K TPM) needlessly throttled the proactive sliding-window limiter to a crawl. Override per-deployment with HARN_RATE_LIMIT_CEREBRAS_RPM / HARN_RATE_LIMIT_CEREBRAS_TPM." }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-05" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use"]
# Serverless Cerebras route, and the only other one Cerebras serves.
# Verified 2026-09-20 against https://api.cerebras.ai/public/v1/models, whose
# record carries pricing ($0.99 / $1.49 per MTok), capabilities (vision,
# tools, parallel tool calls, structured outputs, reasoning) and
# `deprecated: false`. The public record's `max_context_length` is the
# free-tier 65,536; https://inference-docs.cerebras.ai/models/overview
# publishes 128k on the paid tier, which is the tier this catalog rate-limits
# for, so the row records 131072 like its gpt-oss-120b sibling.
[models."qwen-3.8-27b"]
name = "Qwen 3.8 27B (Cerebras)"
provider = "cerebras"
context_window = 131072
logical_model = "qwen3.8-27b"
equivalence_group = "qwen3.8-27b"
served_variant = "cerebras-wafer-scale"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "structured_output"]
pricing = { input_per_mtok = 0.99, output_per_mtok = 1.49 }
architecture = { parameter_count_b = 27.0, moe = false, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.8-27B", last_verified = "2026-09-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "vision", "tool_use", "reasoning"]
# Removed 2026-09-20: gemma-4-31b, zai-glm-4.7 and llama-3.3-70b. Cerebras
# public discovery (https://api.cerebras.ai/public/v1/models) and
# https://inference-docs.cerebras.ai/models/overview both list exactly two
# serverless models, gpt-oss-120b and qwen-3.8-27b. Nothing in 20-routing,
# 30-aliases or 62-ladders referenced the three removed rows.
# --- source: 60-models/40-minimax.toml ---
# MiniMax family ─ pricing pages:
# https://platform.minimax.io/docs/guides/pricing-paygo
# https://platform.minimax.io/docs/guides/model-invocation
# https://platform.minimax.io/docs/api-reference/text-openai-api
# llm-stats.com/models/minimax-m2-7.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20; rates and
# context windows below are that read.
# M3 pricing below is the billed <=512K-input rate verified 2026-07-02:
# $0.30/M input, $1.20/M output, $0.06/M cache-read. MiniMax labels this
# a *permanent* 50% discount off the $0.60/$2.40 list rate on the
# pay-as-you-go page, so the discounted rate — what callers are actually
# billed — is the source of truth (the earlier revision of this comment
# treated it as a transient launch promo). The >512K-input tier bills
# the entire request at 2x and is sales-gated; this catalog's
# ModelPricing shape is a single rate card, so the base tier stands.
#
# MiniMax M2: 230B total / 10B active MoE shared across M2/M2.5/M2.7.
# Context windows from artificialanalysis.ai/models/minimax-m2-7 (205K).
# Pricing reflects the direct MiniMax API surface; OpenRouter mirrors are
# listed separately below.
#
# Tool calls + thinking-mode are supported (release notes call out
# "agentic harness" support); structured output is delimited (no native
# JSON schema mode), and prompt caching is hit-priced at 20% of input.
[models."MiniMax-M3"]
name = "MiniMax M3"
provider = "minimax"
context_window = 1000000
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
# Weights published on HF (MiniMaxAI/MiniMax-M3, 427B MoE + MXFP8
# variant) ~10 days after the API launch, so open_weight flipped true.
architecture = { parameter_count_b = 427.0, moe = true, source_url = "https://huggingface.co/MiniMaxAI/MiniMax-M3", last_verified = "2026-07-02" }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
benchmarks = { swe_bench_pro = 59.0 }
[models."MiniMax-M2"]
name = "MiniMax M2"
provider = "minimax"
context_window = 204800
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.255, output_per_mtok = 1.00, cache_read_per_mtok = 0.051 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "cheap", "tool_use"]
benchmarks = { aa_intelligence_index = 45.0 }
[models."MiniMax-M2.5"]
name = "MiniMax M2.5"
provider = "minimax"
context_window = 204800
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.28, output_per_mtok = 1.10, cache_read_per_mtok = 0.056 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context"]
[models."MiniMax-M2.5-highspeed"]
name = "MiniMax M2.5 (highspeed)"
provider = "minimax"
context_window = 204800
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.28, output_per_mtok = 1.10, cache_read_per_mtok = 0.056 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic"]
[models."MiniMax-M2.7"]
name = "MiniMax M2.7"
provider = "minimax"
context_window = 204800
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
benchmarks = { aa_intelligence_index = 50.0 }
[models."MiniMax-M2.7-highspeed"]
name = "MiniMax M2.7 (highspeed)"
provider = "minimax"
context_window = 204800
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic"]
# Removed 2026-09-20: MiniMax-Text-01, dead on api.minimax.io since 2026-06-28
# and still absent from GET /v1/models (observed 2026-09-20). No alias, tier
# default or ladder referenced it.
# MiniMax mirror on OpenRouter — same family, OpenRouter adds margin and
# bundles native-tools passthrough so the openai_chat_completions wire
# format Just Works for callers without a direct MiniMax key. The M3 row
# matches the billed first-party rate (see the M3 comment above).
[models."minimax/minimax-m3"]
name = "MiniMax M3 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
[models."minimax/minimax-m2.7"]
name = "MiniMax M2.7 (via OpenRouter)"
provider = "openrouter"
context_window = 204800
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.21, output_per_mtok = 0.84, cache_read_per_mtok = 0.042 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
[models."minimax/minimax-m2.5"]
name = "MiniMax M2.5 (via OpenRouter)"
provider = "openrouter"
context_window = 204800
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.27, output_per_mtok = 1.08, cache_read_per_mtok = 0.027 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context"]
[models."minimax/minimax-m2"]
name = "MiniMax M2 (via OpenRouter)"
provider = "openrouter"
context_window = 204800
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.3, output_per_mtok = 1.2 }
# Inline metadata keeps this row independent of fragment-order defaults.
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning"]
# --- source: 60-models/50-zai.toml ---
# Z.AI GLM family, served via the OpenAI-compatible `/api/paas/v4` endpoint
# (the `.../v1` base 404s). The live `/models` listing on 2026-09-20 reports:
# glm-4.5, glm-4.5-air, glm-4.6, glm-4.7, glm-5, glm-5-turbo, glm-5.1,
# glm-5.2, glm-5.3, glm-5.3-flash, and glm-5.3-flashx. Nothing was retired
# since the 2026-08-22 read; FlashX is the one addition. The GLM-4.x line stays catalogued as the
# cheap independent-bucket coding/judge routes (glm-4.6 is confirmed serving
# 200 at paas/v4). Pricing per docs.z.ai.
#
# GLM-5.3 joined the public model list and OpenRouter on 2026-08-22 and is now
# on the public rate card at GLM-5.2's tariff ($1.40 / $4.40 per MTok, $0.26
# cache hit). Z.AI's own migration note is a one-parameter swap: same base
# model, same wire shape, `model="glm-5.2"` -> `model="glm-5.3"`. It is the
# current GLM flagship, so the bare `glm` alias resolves to it, and the
# retired Cerebras and NVIDIA GLM rows already name it in `superseded_by`.
#
# GLM-5-Turbo's price was re-read against the same rate card on 2026-08-22:
# it is $1.20 / $4.00 / $0.24, not the $0.60 / $2.00 / $0.11 this file
# previously carried.
# GLM-4.6 — 200K-context coding model, confirmed serving at paas/v4.
[models."glm-4.6"]
name = "GLM 4.6"
provider = "zai"
context_window = 204800
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.20, cache_read_per_mtok = 0.11 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "cheap"]
# GLM-4.5 — prior-generation coding flagship; GLM-4.5-Air is the lighter
# MoE variant. Kept as cheap independent-bucket routes.
[models."glm-4.5"]
name = "GLM 4.5"
provider = "zai"
context_window = 131072
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.20, cache_read_per_mtok = 0.11 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "cheap"]
[models."glm-4.5-air"]
name = "GLM 4.5 Air"
provider = "zai"
context_window = 131072
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.10, cache_read_per_mtok = 0.03 }
tier = "small"
open_weight = true
strengths = ["speed", "cheap", "coding", "tool_use"]
# GLM-4.7 — current GLM-4.x generation coding model.
[models."glm-4.7"]
name = "GLM 4.7"
provider = "zai"
context_window = 204800
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.20, cache_read_per_mtok = 0.11 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "cheap"]
# GLM-5 family. GLM-5.2 is the current 1M-context open-weight flagship;
# GLM-5.1 / GLM-5 are kept for pinned callers. glm-5-turbo is the current
# accelerated tier. OpenRouter mirrors live below.
[models."glm-5-turbo"]
name = "GLM 5 Turbo"
provider = "zai"
context_window = 202752
capabilities = ["tools", "streaming", "thinking"]
# docs.z.ai rate card, 2026-08-22: $1.20 / $4.00 per MTok (cache hit $0.24).
# OpenRouter's `z-ai/glm-5-turbo` mirror quotes the same three numbers.
pricing = { input_per_mtok = 1.20, output_per_mtok = 4.00, cache_read_per_mtok = 0.24 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "cheap"]
[models."glm-5"]
name = "GLM 5"
provider = "zai"
context_window = 202752
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# docs.z.ai pricing verified 2026-07-02: $1.00 / $3.20 per MTok (cache
# hit $0.20). The prior 0.98/3.08 figures matched no published tier.
pricing = { input_per_mtok = 1.00, output_per_mtok = 3.20, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use"]
[models."glm-5.1"]
name = "GLM 5.1"
provider = "zai"
context_window = 202752
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
benchmarks = { swe_bench_pro_lead = 1.0 }
[models."glm-5.2"]
name = "GLM 5.2"
provider = "zai"
context_window = 1048576
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
benchmarks = { swe_bench_pro_lead = 1.0 }
[models."glm-5.3"]
name = "GLM 5.3"
provider = "zai"
context_window = 1048576
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# docs.z.ai rate card, 2026-08-22: GLM-5.3 lists at GLM-5.2's tariff, which
# is what Z.AI's launch note means by "available at the same price".
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
# GLM-5.3-Flash is the natively multimodal, efficiency-focused sibling of
# GLM-5.3. Z.AI's 2026-08-26 model card documents 320B total / 18B active
# parameters, 1M context, native image/video/file input, mandatory reasoning,
# tools, structured output, streaming, caching, and MIT-licensed weights.
# The 50% launch promotion expires at 24:00 Singapore time on September 9,
# which is the exclusive UTC instant 2026-09-09T16:00:00Z.
[models."glm-5.3-flash"]
name = "GLM 5.3 Flash"
provider = "zai"
context_window = 1048576
logical_model = "glm-5.3-flash"
equivalence_group = "glm-5.3-flash"
served_variant = "zai-direct"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.50, cache_read_per_mtok = 0.03, promotions = [{ id = "zai-glm-5.3-flash-launch", starts_on = "2026-08-26", ends_at = "2026-09-09T16:00:00Z", source_url = "https://docs.z.ai/guides/overview/pricing", input_per_mtok = 0.075, output_per_mtok = 0.25, cache_read_per_mtok = 0.015 }] }
architecture = { parameter_count_b = 320.0, active_parameter_count_b = 18.0, moe = true, license = "MIT", source_url = "https://docs.z.ai/guides/vlm/glm-5.3-flash", last_verified = "2026-08-28" }
tier = "frontier"
open_weight = true
strengths = ["cheap", "coding", "agentic", "tool_use", "reasoning", "long_context", "vision", "speed"]
# OpenRouter mirror of GLM-5 family so callers without a Z.AI key still
# resolve a route. OR doesn't list GLM-4.6/4.7 — the canonical OR slugs
# are the GLM-5 generation.
[models."z-ai/glm-5"]
name = "GLM 5 (via OpenRouter)"
provider = "openrouter"
context_window = 204800
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 1.92, cache_read_per_mtok = 0.12 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic"]
[models."z-ai/glm-5.1"]
name = "GLM 5.1 (via OpenRouter)"
provider = "openrouter"
context_window = 204800
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 1.4, output_per_mtok = 4.4, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
[models."z-ai/glm-5.2"]
name = "GLM 5.2 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.25, output_per_mtok = 3.99, cache_read_per_mtok = 0.2 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
[models."z-ai/glm-5.3"]
name = "GLM 5.3 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.4, output_per_mtok = 4.4, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
# GLM-5.3 Prime is an OpenRouter-only row: Z.ai publishes no first-party
# `glm-5.3-prime` id (docs.z.ai pricing, read 2026-10-09), and OpenRouter's
# only endpoint is Alibaba, whose Model Studio "Prime mode" serves the same
# weights on a faster lane at exactly this card ($2.80 / $0.56 cached / $8.80;
# Singapore). Text input only, 1M context, 131,072 max output. Probed
# 2026-10-09 pinned to that endpoint: a native tool call, the tool-result
# round trip and a required tool choice returned 200, effort `low` and `high`
# reasoned, and reasoning off was a 400 "Reasoning is mandatory", which the
# `z-ai/glm-5.3*` rule already encodes.
[models."z-ai/glm-5.3-prime"]
name = "GLM 5.3 Prime (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
released = "2026-09-23"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.80, output_per_mtok = 8.80, cache_read_per_mtok = 0.56 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "speed"]
[models."z-ai/glm-5.3-flash"]
name = "GLM 5.3 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
logical_model = "glm-5.3-flash"
equivalence_group = "glm-5.3-flash"
served_variant = "openrouter"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
# Re-read 2026-09-20. Z.AI's launch promotion expired on 2026-09-09, but
# OpenRouter did not return to Z.AI's list rate: it now bills $0.09 / $0.30
# with a $0.018 cache read, below the $0.15 / $0.50 list the direct row still
# carries (docs.z.ai rate card, re-checked the same day). That is OpenRouter's
# own rate for this route, not a Z.AI promotion, so it is the base here and the
# expired promotion is gone.
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.5, cache_read_per_mtok = 0.03 }
architecture = { parameter_count_b = 320.0, active_parameter_count_b = 18.0, moe = true, license = "MIT", source_url = "https://openrouter.ai/api/v1/models", last_verified = "2026-08-28" }
tier = "frontier"
open_weight = true
strengths = ["cheap", "coding", "agentic", "tool_use", "reasoning", "long_context", "vision", "speed"]
# GLM-5.3-FlashX, added 2026-09-20. Z.AI's higher-throughput FlashX build of
# GLM-5.3-Flash, released 2026-09-18 (`created` on the OpenRouter record). Same
# 320B/18B hybrid sparse-plus-linear-attention architecture and the same
# 1M-token window as Flash; the trade is roughly 200 output tok/s for a higher
# rate. Rates agree across two sources read on 2026-09-20: the docs.z.ai rate
# card ($0.37 in / $0.075 cached / $1.25 out per MTok) and
# https://openrouter.ai/api/v1/models ($0.37 / $1.25).
#
# Capabilities are inherited from the glm-5.3-flash rows, which is a family
# default, not a verified FlashX fact: Z.AI publishes no separate FlashX model
# card, so its vision, video and caching support are unverified here.
[models."glm-5.3-flashx"]
name = "GLM 5.3 FlashX"
provider = "zai"
context_window = 1048576
logical_model = "glm-5.3-flashx"
equivalence_group = "glm-5.3-flashx"
served_variant = "zai-direct"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.37, output_per_mtok = 1.25, cache_read_per_mtok = 0.075 }
architecture = { parameter_count_b = 320.0, active_parameter_count_b = 18.0, moe = true, license = "MIT", source_url = "https://docs.z.ai/guides/overview/pricing", last_verified = "2026-09-20" }
tier = "frontier"
open_weight = true
strengths = ["speed", "cheap", "coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
[models."z-ai/glm-5.3-flashx"]
name = "GLM 5.3 FlashX (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
logical_model = "glm-5.3-flashx"
equivalence_group = "glm-5.3-flashx"
served_variant = "openrouter"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.37, output_per_mtok = 1.25, cache_read_per_mtok = 0.09 }
architecture = { parameter_count_b = 320.0, active_parameter_count_b = 18.0, moe = true, license = "MIT", source_url = "https://openrouter.ai/api/v1/models", last_verified = "2026-09-20" }
tier = "frontier"
open_weight = true
strengths = ["speed", "cheap", "coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
[models."z-ai/glm-5v-turbo"]
name = "GLM 5V Turbo (via OpenRouter)"
provider = "openrouter"
context_window = 202752
capabilities = ["tools", "streaming", "vision"]
pricing = { input_per_mtok = 1.20, output_per_mtok = 4.00, cache_read_per_mtok = 0.24 }
# Inline metadata keeps this row independent of fragment-order defaults.
tier = "frontier"
open_weight = true
strengths = ["vision", "coding", "agentic"]
# --- source: 60-models/60-deepseek-openrouter-qwen.toml ---
# DeepSeek direct API: https://api-docs.deepseek.com/quick_start/pricing/.
# The current rate card names `deepseek-flash` for V4.1 Flash and keeps
# `deepseek-v4-pro` on V4 Pro 0813. Both have 1M context and 384K output.
# V4 Flash is retired: its legacy ID temporarily serves V4.1 Flash.
# Direct prices below are peak rates; the schedules halve all token rates
# outside 01:00-04:00 and 06:00-10:00 UTC on weekdays.
# Chinese public holidays also receive off-peak pricing, but Harn has no
# holiday calendar; estimates on those weekdays use peak rates.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20. OpenRouter rows
# were read again on 2026-09-29; each changed rate matched at least one
# serving endpoint's own price.
[models."deepseek-flash"]
name = "DeepSeek V4.1 Flash"
provider = "deepseek"
context_window = 1000000
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.3, output_per_mtok = 1.2, cache_read_per_mtok = 0.006, schedules = [
{ id = "deepseek-flash-offpeak-0000", days = ["mon", "tue", "wed", "thu", "fri"], start = "00:00", end = "01:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-flash-offpeak-0400", days = ["mon", "tue", "wed", "thu", "fri"], start = "04:00", end = "06:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-flash-offpeak-1000", days = ["mon", "tue", "wed", "thu", "fri"], start = "10:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-flash-offpeak-weekend", days = ["sat", "sun"], start = "00:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
] }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context", "vision"]
[models."deepseek-v4-flash"]
name = "DeepSeek V4 Flash (legacy ID)"
provider = "deepseek"
wire_model = "deepseek-v4-flash"
context_window = 1000000
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.3, output_per_mtok = 1.2, cache_read_per_mtok = 0.006, schedules = [
{ id = "deepseek-legacy-flash-offpeak-0000", days = ["mon", "tue", "wed", "thu", "fri"], start = "00:00", end = "01:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-legacy-flash-offpeak-0400", days = ["mon", "tue", "wed", "thu", "fri"], start = "04:00", end = "06:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-legacy-flash-offpeak-1000", days = ["mon", "tue", "wed", "thu", "fri"], start = "10:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-legacy-flash-offpeak-weekend", days = ["sat", "sun"], start = "00:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
] }
deprecated = true
deprecation_note = "V4 Flash retired 2026-09-10; this temporary compatibility ID serves V4.1 Flash. Use deepseek-flash."
superseded_by = "deepseek-flash"
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context", "vision"]
# `deepseek-v4-pro` still serves V4-Pro-0813 at its own rate card. DeepSeek's
# 2026-09-10 news post said the id would route to V4.1 Flash at Flash rates
# from 2026-09-14, but its changelog entry for the same date says the id
# "continues to be offered after September 14, with billing unchanged", and
# the live pricing page (read 2026-10-09) lists it as DeepSeek-V4-Pro-0813 at
# $1.32 / $3.96 / $0.044 cached at peak, half off-peak, without vision.
# The row follows the pricing page; no direct DeepSeek key was available to
# call-verify the routing.
[models."deepseek-v4-pro"]
name = "DeepSeek V4 Pro 0813"
provider = "deepseek"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.32, output_per_mtok = 3.96, cache_read_per_mtok = 0.044, schedules = [
{ id = "deepseek-pro-offpeak-0000", days = ["mon", "tue", "wed", "thu", "fri"], start = "00:00", end = "01:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-pro-offpeak-0400", days = ["mon", "tue", "wed", "thu", "fri"], start = "04:00", end = "06:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-pro-offpeak-1000", days = ["mon", "tue", "wed", "thu", "fri"], start = "10:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
{ id = "deepseek-pro-offpeak-weekend", days = ["sat", "sun"], start = "00:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://api-docs.deepseek.com/quick_start/pricing/", review_after = "2026-12-26" },
] }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
benchmarks = { aa_intelligence_index = 68.0 }
# DeepSeek V4 OpenRouter mirrors. OpenRouter publishes an independent
# rate card and a binary 1M-token context window for these routes.
#
# Prices below are the live OpenRouter rate card read from
# `GET /api/v1/models` on 2026-09-29. The undated `deepseek/deepseek-v4-*`
# aliases previously carried DeepSeek's DIRECT rate card, which understated
# OpenRouter V4 Pro by ~2.7x ($0.435 recorded vs $1.168 charged per MTok in).
# The dated snapshot rows further below are the ones that actually match the
# direct rate card — do not copy prices between the two.
[models."deepseek/deepseek-v4-flash"]
name = "DeepSeek V4 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.14, output_per_mtok = 0.28, cache_read_per_mtok = 0.028 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
[models."deepseek/deepseek-v4-pro"]
name = "DeepSeek V4 Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.95526, output_per_mtok = 1.91052, cache_read_per_mtok = 0.079605 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
# Dated DeepSeek V4 snapshots. The undated aliases float to whatever DeepSeek
# ships; these pin a fixed build, which is what eval baselines need so a
# silent upstream swap cannot move a measured number. Both verified serving on
# 2026-08-15 and both returned a single clean native `message.tool_calls`.
# On OpenRouter these snapshots price on DeepSeek's own peak/off-peak clock
# rather than the undated alias's flat card, so which of the two is cheaper for
# identical weights depends on the hour the call starts.
[models."deepseek/deepseek-v4-pro-0813"]
name = "DeepSeek V4 Pro 0813 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "streaming", "prompt_caching"]
# OpenRouter bills this route on a UTC clock. The base card below is the
# weekday PEAK rate (01:00-04:00 and 06:00-10:00 UTC); every other hour, and
# all weekend, is exactly half of it. The `overrides` array on the OpenRouter
# model record is the source, read 2026-09-20. The off-peak hours are declared
# as `schedules` rather than folded into the base rate, so a call settles at
# the rate the provider charged for the hour it started in.
#
# DeepSeek excludes Chinese public holidays from its peak hours. That calendar
# is not modeled: a holiday that falls on a weekday still settles at the peak
# rate, which over-records rather than under-records.
pricing = { input_per_mtok = 1.32, output_per_mtok = 3.96, cache_read_per_mtok = 0.044, schedules = [
{ id = "deepseek-offpeak-weekday-0000", days = ["mon", "tue", "wed", "thu", "fri"], start = "00:00", end = "01:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://openrouter.ai/api/v1/models", review_after = "2026-12-20", note = "Chinese public holidays are excluded from DeepSeek's peak hours and are not modeled; a holiday weekday settles at the peak rate." },
{ id = "deepseek-offpeak-weekday-0400", days = ["mon", "tue", "wed", "thu", "fri"], start = "04:00", end = "06:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://openrouter.ai/api/v1/models", review_after = "2026-12-20", note = "Chinese public holidays are excluded from DeepSeek's peak hours and are not modeled; a holiday weekday settles at the peak rate." },
{ id = "deepseek-offpeak-weekday-1000", days = ["mon", "tue", "wed", "thu", "fri"], start = "10:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://openrouter.ai/api/v1/models", review_after = "2026-12-20", note = "Chinese public holidays are excluded from DeepSeek's peak hours and are not modeled; a holiday weekday settles at the peak rate." },
{ id = "deepseek-offpeak-weekend", days = ["sat", "sun"], start = "00:00", end = "24:00", utc_offset = "+00:00", input_multiplier = 0.5, output_multiplier = 0.5, source_url = "https://openrouter.ai/api/v1/models", review_after = "2026-12-20" },
] }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
# The 2026-09-29 model index listed $0.01 / $0.64 for this snapshot, a
# per-field composite that none of its 29 endpoints charges (the cheapest
# input and the output rates come from different hosts). The context window
# was taken from that read; the price stays at the last coherent card.
[models."deepseek/deepseek-v4-flash-0731"]
name = "DeepSeek V4 Flash 0731 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.04, output_per_mtok = 0.16, cache_read_per_mtok = 0.016 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
# OpenRouter's list rate for DeepSeek V4.1 Flash, https://openrouter.ai/api/v1/models
# (read 2026-09-26). A one-tool `tool_choice: auto` probe the same day returned
# a native tool call.
[models."deepseek/deepseek-v4.1-flash"]
name = "DeepSeek V4.1 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.3, output_per_mtok = 1.2, cache_read_per_mtok = 0.006 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context", "vision"]
# OpenRouter Qwen3.5 9B. Stays catalogued through its OpenRouter retirement
# so in-flight callers still resolve pricing; no Harn default names it.
[models."Qwen/Qwen3.5-9B"]
name = "Qwen3.5 9B"
provider = "openrouter"
wire_model = "qwen/qwen3.5-9b"
context_window = 262144
capabilities = ["tools", "streaming"]
# The row carried no rate card at all. OpenRouter publishes $0.10 in /
# $0.15 out per MTok and no cache rate for it
# (https://openrouter.ai/api/v1/models, read 2026-09-20).
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.15 }
deprecated = true
deprecation_note = "OpenRouter retires this route 2026-10-21 (typed expiration_date on https://openrouter.ai/api/v1/models, read 2026-10-09). No provider notice explains it; Together still serves Qwen/Qwen3.5-9B directly. Use qwen/qwen3.6-35b-a3b."
sunset_date = "2026-10-21"
superseded_by = "qwen/qwen3.6-35b-a3b"
# Inline metadata keeps this row independent of fragment-order defaults.
tier = "small"
open_weight = true
strengths = ["cheap", "speed"]
# OpenRouter Qwen3.6 routes. Live OpenRouter `/api/v1/models` snapshot on
# 2026-07-02 reports tools/tool_choice, structured_outputs/response_format,
# reasoning, text+image+video input, and the prices below. A 2026-07-03
# refresh also reports input_cache_write for Flash. Harn's capability matrix
# owns the runtime quirks: native tools stay enabled, reasoning is disabled
# automatically for tool-bearing tasks, and the broken Ambient OpenRouter
# upstream is denied through provider_route_denylist.
[models."qwen/qwen3.6-flash"]
name = "Qwen3.6 Flash (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.1875, output_per_mtok = 1.125, cache_write_per_mtok = 0.234375, input_token_bands = [{ minimum_input_tokens = 256000, input_multiplier = 4.0, output_multiplier = 2.666667 }] }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "reasoning", "long_context"]
[models."qwen/qwen3.6-plus"]
name = "Qwen3.6 Plus (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "streaming", "thinking"]
# Cache write added 2026-09-20: OpenRouter publishes $0.40625 per MTok and no
# cache-read rate for this route.
pricing = { input_per_mtok = 0.325, output_per_mtok = 1.95, cache_write_per_mtok = 0.40625, input_token_bands = [{ minimum_input_tokens = 256000, input_multiplier = 4.0, output_multiplier = 2.0 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
benchmarks = { swe_bench_verified = 78.8 }
[models."qwen/qwen3.6-35b-a3b"]
name = "Qwen3.6 35B A3B (via OpenRouter)"
provider = "openrouter"
context_window = 262144
logical_model = "qwen3.6-35b-a3b"
equivalence_group = "qwen3.6-35b-a3b"
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 1.00, cache_read_per_mtok = 0.05 }
tier = "mid"
open_weight = true
strengths = ["cheap", "coding", "tool_use", "reasoning"]
# --- source: 60-models/70-local-ollama.toml ---
# Ollama / local models — no `pricing` (free); context_window reflects
# model card ceiling. `runtime_context_window` caps what Harn will
# actually feed the runtime (host memory budget).
[models."llama3.2"]
name = "Llama 3.2"
provider = "ollama"
context_window = 32000
stream_timeout = 300.0
capabilities = ["tools", "streaming"]
tier = "small"
open_weight = true
strengths = ["cheap", "speed"]
[models."gemma4:26b"]
name = "Gemma 4 26B MoE"
provider = "ollama"
context_window = 262144
runtime_context_window = 32768
stream_timeout = 300.0
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["vision", "tool_use"]
# Gemma 4 12B — encoder-free unified multimodal model (Apache 2.0), built to run
# on a 16GB laptop. Published on Ollama only as quantized variants (no bare
# `gemma4:12b` tag). Verified via `ollama show`: the quantized 12B builds expose
# `tools` + native `thinking` but are TEXT-ONLY at 128K context — the vision
# projector is dropped in these conversions, unlike the larger 26b/31b builds.
# MLX is the Apple-Silicon path; nvfp4 targets NVIDIA Blackwell; mxfp8 is the
# higher-fidelity quant.
[models."gemma4:12b-mlx"]
name = "Gemma 4 12B (MLX)"
provider = "ollama"
context_window = 131072
runtime_context_window = 32768
stream_timeout = 240.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["speed", "cheap"]
[models."gemma4:12b-nvfp4"]
name = "Gemma 4 12B (NVFP4)"
provider = "ollama"
context_window = 131072
runtime_context_window = 32768
stream_timeout = 240.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["cheap", "tool_use"]
[models."gemma4:12b-mxfp8"]
name = "Gemma 4 12B (MXFP8)"
provider = "ollama"
context_window = 131072
runtime_context_window = 32768
stream_timeout = 240.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["cheap", "tool_use"]
[models."devstral-small-2:24b"]
name = "Devstral Small 2 24B"
provider = "ollama"
context_window = 262144
runtime_context_window = 32768
stream_timeout = 600.0
capabilities = ["tools", "streaming"]
# Inline metadata keeps this row independent of fragment-order defaults.
tier = "mid"
open_weight = true
strengths = ["coding", "agentic"]
# --- source: 60-models/80-local-runtimes.toml ---
# llama.cpp — Unsloth Dynamic 2.0 GGUF served by llama-server.
[models."qwen3.6-35b-a3b-ud-q4-k-xl"]
name = "Qwen3.6 35B (Unsloth Q4_K_XL, llama.cpp)"
provider = "llamacpp"
context_window = 262144
runtime_context_window = 262144
stream_timeout = 900.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["coding"]
[models."qwen3.6-35b-a3b-ud-q4-k-xl".local_memory]
measured_resident_gib = 19.5
measured_context_window = 8192
measured_cache_type = "q8_0"
base_resident_gib = 19.0
kv_cache_gib_per_1k_ctx = 0.0135
default_cache_type = "q8_0"
safety_margin_gib = 4.0
max_recommended_context = 262144
cache_type_multipliers = { q8_0 = 1.0, f16 = 2.0, q4_0 = 0.5, q4_1 = 0.5, q5_0 = 0.625, q5_1 = 0.625 }
last_verified = "2026-06-28"
notes = "Empirical llama.cpp b9821 / CUDA 12.8 / RTX 5090 measurements with q8_0 KV showed SWA-capped KV growth of about 0.87 GiB per 65k tokens and full 262144 ctx fitting with headroom. Treat as a sizing estimate, not an allocator guarantee."
[models."qwen3.6-35b-a3b-ud-q5-k-xl"]
name = "Qwen3.6 35B (Unsloth Q5_K_XL, llama.cpp)"
provider = "llamacpp"
context_window = 262144
runtime_context_window = 65536
stream_timeout = 900.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["coding"]
[models."qwen3.6-35b-a3b"]
name = "Qwen3.6 35B (llama.cpp)"
provider = "llamacpp"
context_window = 262144
runtime_context_window = 65536
stream_timeout = 900.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["coding"]
# Apple Silicon MLX. Burin #2717 switched the local MLX route from the
# never-downloaded dense vision model `unsloth/Qwen3.6-27B-UD-MLX-4bit` to the
# coding-tuned Qwen3.6-35B-A3B MoE served via `mlx_lm.server` (text MoE, no
# vision). Shares the `qwen3.6-35b-a3b` logical_model / equivalence_group with
# the llama.cpp GGUF route so eval aggregation treats the two runtimes as the
# same model and compares them directly. Keep strengths conservative until
# `mlx_lm.server` has its own tool/agentic probe evidence; equivalence groups
# use the least-decorated host baseline for escalation decisions.
[models."unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit"]
name = "Qwen3.6 35B-A3B (MLX 4-bit)"
provider = "mlx"
logical_model = "qwen3.6-35b-a3b"
equivalence_group = "qwen3.6-35b-a3b"
context_window = 262144
runtime_context_window = 65536
stream_timeout = 900.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["coding"]
[models."unsloth/Qwen3.6-35B-A3B-UD-MLX-8bit"]
name = "Qwen3.6 35B-A3B (MLX 8-bit)"
provider = "mlx"
logical_model = "qwen3.6-35b-a3b"
equivalence_group = "qwen3.6-35b-a3b"
context_window = 262144
runtime_context_window = 65536
stream_timeout = 900.0
capabilities = ["tools", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["coding"]
# Local OpenAI-compatible servers (vLLM / bring-your-own).
[models."gemma-4-e2b-it"]
name = "Gemma 4 E2B (local)"
provider = "local"
context_window = 131072
stream_timeout = 300.0
capabilities = ["streaming", "tools", "vision", "thinking", "structured_output"]
tier = "small"
open_weight = true
strengths = ["cheap", "speed"]
[models."gemma-4-e4b-it"]
name = "Gemma 4 E4B (local)"
provider = "local"
context_window = 131072
stream_timeout = 300.0
capabilities = ["streaming", "tools", "vision", "thinking", "structured_output"]
tier = "small"
open_weight = true
strengths = ["cheap"]
[models."gemma-4-26b-a4b-it"]
name = "Gemma 4 26B MoE (local)"
provider = "local"
context_window = 131072
stream_timeout = 600.0
capabilities = ["streaming", "tools", "vision", "thinking", "structured_output"]
tier = "mid"
open_weight = true
strengths = ["coding"]
[models."gemma-4-31b-it"]
name = "Gemma 4 31B (local)"
provider = "local"
context_window = 131072
stream_timeout = 600.0
capabilities = ["streaming", "tools", "vision", "thinking", "structured_output"]
tier = "frontier"
open_weight = true
strengths = ["coding", "long_context"]
[models."gemma-4-12b-it"]
name = "Gemma 4 12B (local)"
provider = "local"
context_window = 131072
stream_timeout = 300.0
capabilities = ["streaming", "tools", "vision", "thinking", "structured_output"]
tier = "mid"
open_weight = true
strengths = ["cheap", "speed"]
# --- source: 60-models/85-huggingface-router.toml ---
# Hugging Face Inference Providers router rows. The router is
# OpenAI-compatible, but availability and pricing can vary by selected
# upstream provider, so these rows encode stable model identity/capability
# metadata rather than a route-specific rate card.
[models."Qwen/Qwen3-Coder-480B-A35B-Instruct"]
name = "Qwen3-Coder 480B A35B Instruct (Hugging Face Router)"
provider = "huggingface"
wire_model = "Qwen/Qwen3-Coder-480B-A35B-Instruct"
context_window = 262144
logical_model = "qwen3-coder-480b-a35b"
equivalence_group = "qwen3-coder-480b-a35b"
served_variant = "huggingface-router"
api_dialect = "openai_chat"
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
architecture = { parameter_count_b = 480.0, active_parameter_count_b = 35.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3-Coder-480B-A35B-Instruct", last_verified = "2026-07-15" }
# --- source: 60-models/90-hosted-gemma-cohere-xai-groq.toml ---
# Gemma 4 — hosted (Apache 2.0, multimodal text+image, 256K context, native
# thinking). The 12B is on-device only; the 26B MoE and 31B dense are also served
# directly by hosted APIs. Each provider route is registered as its own catalog
# row keyed by that provider's wire id (the alias-validation contract requires a
# matching row): OpenRouter ids are org-prefixed and the Gemini API rows use the
# `models/` REST resource name — both collision-free with the bare `local` keys.
[models."google/gemma-4-31b-it"]
name = "Gemma 4 31B (OpenRouter)"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.09, output_per_mtok = 0.34, cache_read_per_mtok = 0.05 }
tier = "frontier"
open_weight = true
strengths = ["vision", "reasoning", "coding", "cheap"]
[models."google/gemma-4-26b-a4b-it"]
name = "Gemma 4 26B MoE (OpenRouter)"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.0765, output_per_mtok = 0.255, cache_read_per_mtok = 0.0425 }
tier = "mid"
open_weight = true
strengths = ["vision", "cheap", "speed"]
[models."models/gemma-4-31b-it"]
name = "Gemma 4 31B (Gemini API)"
provider = "gemini"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "frontier"
open_weight = true
strengths = ["vision", "reasoning", "coding", "cheap"]
[models."models/gemma-4-26b-a4b-it"]
name = "Gemma 4 26B MoE (Gemini API)"
provider = "gemini"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "mid"
open_weight = true
strengths = ["vision", "cheap", "speed"]
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."google/gemma-4-31B-it"]
name = "Gemma 4 31B (Together)"
provider = "together"
availability = "dedicated"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.39, output_per_mtok = 0.97 }
tier = "frontier"
open_weight = true
strengths = ["vision", "reasoning", "coding"]
[models."groq/openai/gpt-oss-120b"]
name = "GPT-OSS 120B (Groq)"
provider = "groq"
context_window = 131072
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "groq-lpu"
wire_model = "openai/gpt-oss-120b"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60, cache_read_per_mtok = 0.075 }
rate_limits = { rpm = 1000, tpm = 250000, tier = "developer", source_url = "https://console.groq.com/docs/models", last_verified = "2026-06-05" }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-05" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
[models."groq/openai/gpt-oss-20b"]
name = "GPT-OSS 20B (Groq)"
provider = "groq"
context_window = 131072
logical_model = "openai-gpt-oss-20b"
equivalence_group = "openai-gpt-oss-20b"
served_variant = "groq-lpu"
wire_model = "openai/gpt-oss-20b"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.075, output_per_mtok = 0.30, cache_read_per_mtok = 0.0375 }
rate_limits = { rpm = 1000, tpm = 250000, tier = "developer", source_url = "https://console.groq.com/docs/models", last_verified = "2026-06-20" }
architecture = { parameter_count_b = 21.0, active_parameter_count_b = 3.6, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-20b", last_verified = "2026-06-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
# Fireworks-hosted gpt-oss routes. Without a catalog row the wire id
# `accounts/fireworks/models/gpt-oss-*` has NO context window, so the
# agent's auto-compaction budget falls back to a placeholder and the prompt
# can grow until Fireworks rejects the turn with HTTP 400 [context_overflow]
# ("maximum context length of 131071"). Cataloging the real 131072-token
# window lets compaction trigger before the hard limit. Verified against the
# Fireworks-served gpt-oss spec (131072 ctx; the overflow error itself names
# the 131071 ceiling).
[models."accounts/fireworks/models/gpt-oss-120b"]
name = "GPT-OSS 120B (Fireworks)"
provider = "fireworks"
context_window = 131072
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/gpt-oss-120b"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
# Standard serverless tier, https://docs.fireworks.ai/serverless/pricing
# (read 2026-09-26).
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60, cache_read_per_mtok = 0.015 }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-19" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
# Unlike the other Fireworks rows marked dedicated here, this model's metadata
# reports `supportsServerless: true`. Its only deployment is a public but
# non-default one, so this plain id returns HTTP 404 "Model not found,
# inaccessible, and/or not deployed" (2026-10-01 and 2026-10-02), while the
# deployment-qualified id
# `accounts/fireworks/models/glm-5p2#accounts/fireworks/deployments/jpmnep80`
# answers 200. The plain id is therefore not routable on the API-key path.
[models."accounts/fireworks/models/glm-5p2"]
name = "GLM 5.2 (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 1048576
logical_model = "glm-5.2"
equivalence_group = "glm-5.2"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/glm-5p2"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# Cached input is $0.14 on the standard tier; $0.26 is GLM 5.3's cached rate.
# https://docs.fireworks.ai/serverless/pricing (read 2026-09-26).
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.14 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
# Fireworks routes added 2026-09-26 from the serverless model index
# (https://api.fireworks.ai/inference/v1/models) and the standard-tier rates at
# https://docs.fireworks.ai/serverless/pricing. Each returned a native
# `tool_calls` entry on a one-tool `tool_choice: auto` probe the same day.
# Fireworks also sells Priority, Fast, and US-only tiers of these at higher
# rates; the rate cards below are the standard tier only.
[models."accounts/fireworks/models/glm-5p3"]
name = "GLM 5.3 (Fireworks)"
provider = "fireworks"
context_window = 1048576
logical_model = "glm-5.3"
equivalence_group = "glm-5.3"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/glm-5p3"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.26 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
[models."accounts/fireworks/models/glm-5p3-flash"]
name = "GLM 5.3 Flash (Fireworks)"
provider = "fireworks"
context_window = 1048576
logical_model = "glm-5.3-flash"
equivalence_group = "glm-5.3-flash"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/glm-5p3-flash"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.50, cache_read_per_mtok = 0.03 }
tier = "frontier"
open_weight = true
strengths = ["cheap", "coding", "agentic", "tool_use", "reasoning", "long_context", "vision", "speed"]
[models."accounts/fireworks/models/deepseek-v4p1-flash"]
name = "DeepSeek V4.1 Flash (Fireworks)"
provider = "fireworks"
context_window = 1048576
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/deepseek-v4p1-flash"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.006 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context", "vision"]
# Fireworks lists this model but a 2026-10-01 chat call returned HTTP 404
# "Model not found, inaccessible, and/or not deployed"; it needs a dedicated
# deployment.
[models."accounts/fireworks/models/deepseek-v4-flash-0731"]
name = "DeepSeek V4 Flash 0731 (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 1048576
logical_model = "deepseek-v4-flash-0731"
equivalence_group = "deepseek-v4-flash"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/deepseek-v4-flash-0731"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.22, output_per_mtok = 0.66, cache_read_per_mtok = 0.007 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
# Fireworks lists this model but a 2026-10-01 chat call returned HTTP 404
# "Model not found, inaccessible, and/or not deployed"; it needs a dedicated
# deployment.
[models."accounts/fireworks/models/deepseek-v4-pro-0813"]
name = "DeepSeek V4 Pro 0813 (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 1048576
logical_model = "deepseek-v4-pro-0813"
equivalence_group = "deepseek-v4-pro-0813"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/deepseek-v4-pro-0813"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.32, output_per_mtok = 3.96, cache_read_per_mtok = 0.044 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "agentic", "tool_use", "long_context"]
[models."accounts/fireworks/models/kimi-k3"]
name = "Kimi K3 (Fireworks)"
provider = "fireworks"
context_window = 1048576
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/kimi-k3"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
# Fireworks lists this model READY with `supportsServerless: true`, but its
# serverless chat endpoint does not answer. On 2026-10-02 two non-streaming
# requests and one streaming request each returned 0 bytes in 150 s, while
# `deepseek-v4p1-flash` on the same key answered in 1.4 s; the hosted provider
# contract probe timed out on every request to it on 2026-09-28 and 2026-10-02.
# Until a serverless request answers again it needs a dedicated deployment.
[models."accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b"]
name = "Nemotron 3.5 Lightning 30B A3B (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 262144
logical_model = "nemotron-3.5-lightning-30b-a3b"
equivalence_group = "nemotron-3.5-lightning-30b-a3b"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.05, output_per_mtok = 0.20, cache_read_per_mtok = 0.01 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic", "reasoning", "tool_use", "long_context"]
# Fireworks lists this model but a 2026-10-01 chat call returned HTTP 404
# "Model not found, inaccessible, and/or not deployed"; it needs a dedicated
# deployment.
[models."accounts/fireworks/models/deepseek-v4-pro"]
name = "DeepSeek V4 Pro (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 1048576
logical_model = "deepseek-v4-pro"
equivalence_group = "deepseek-v4-pro"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/deepseek-v4-pro"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# Fireworks serverless rate verified 2026-07-02: $1.74/$3.48 (cached
# input $0.145). The prior 0.60/1.20 figures matched no published tier.
pricing = { input_per_mtok = 1.74, output_per_mtok = 3.48, cache_read_per_mtok = 0.145 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
# Fireworks lists this model but a 2026-10-01 chat call returned HTTP 404
# "Model not found, inaccessible, and/or not deployed"; it needs a dedicated
# deployment.
[models."accounts/fireworks/models/kimi-k2p6"]
name = "Kimi K2.6 (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 262144
logical_model = "moonshot-kimi-k2.6"
equivalence_group = "moonshot-kimi-k2.6"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/kimi-k2p6"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
# Standard serverless tier, https://docs.fireworks.ai/serverless/pricing
# (read 2026-09-26).
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.16 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
# Fireworks lists this model but a 2026-10-01 chat call returned HTTP 404
# "Model not found, inaccessible, and/or not deployed"; it needs a dedicated
# deployment.
[models."accounts/fireworks/models/kimi-k2p7-code"]
name = "Kimi K2.7 Code (Fireworks)"
provider = "fireworks"
availability = "dedicated"
context_window = 262144
logical_model = "moonshot-kimi-k2.7-code"
equivalence_group = "moonshot-kimi-k2.7-code"
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/kimi-k2p7-code"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
# Base serverless tier verified 2026-07-02; Fireworks also sells
# Priority/Fast tiers up to $1.90/$8.00 that this rate card omits.
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.19 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
[models."accounts/fireworks/models/minimax-m3"]
name = "MiniMax M3 (Fireworks)"
provider = "fireworks"
context_window = 524288
served_variant = "fireworks"
wire_model = "accounts/fireworks/models/minimax-m3"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.20, cache_read_per_mtok = 0.06 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
# Removed 2026-09-20: qwen/qwen3.6-27b. Groq's live /models index
# (https://api.groq.com/openai/v1/models, observed 2026-09-20) no longer
# lists it; qwen/qwen3.8-27b below is Groq's only Qwen route. The
# `groq-qwen3.6` alias, the `groq` QC default, and both escalation ladder
# rungs were re-pointed at qwen/qwen3.8-27b.
[models."qwen/qwen3.8-27b"]
name = "Qwen3.8 27B (Groq)"
provider = "groq"
context_window = 131072
logical_model = "qwen3.8-27b"
equivalence_group = "qwen3.8-27b"
served_variant = "groq-lpu-preview"
wire_model = "qwen/qwen3.8-27b"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking"]
# Groq's public preview model page supplied the route, context limit, feature
# list, and rates. Native tools, strict JSON Schema, reasoning effort, and the
# tools-plus-JSON rejection were verified against the live route on 2026-08-26.
# The cache-read rate was missing; Groq's live /models record publishes
# $0.40 per MTok for it (https://api.groq.com/openai/v1/models, 2026-09-20).
pricing = { input_per_mtok = 0.80, output_per_mtok = 4.00, cache_read_per_mtok = 0.40 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "tool_use", "reasoning", "vision"]
# Command A+ through OpenRouter's single Cohere endpoint (listed 2026-09-22 as
# `cohere/command-a-plus`, canonical `command-a-plus-05-2026`; 192,000
# context, 64,000 max output, text and image input, $0.30 / $0.15 cached /
# $1.50). Cohere's own docs give 128K context and publish no per-token price.
# Probed 2026-10-09 pinned to that endpoint: a native tool call, the
# tool-result round trip and effort `high` returned 200. With reasoning off the
# model wrote its deliberation into the visible answer ("The user asks: ..."),
# so prefer leaving reasoning on. OpenRouter lists no `tool_choice` for it.
[models."cohere/command-a-plus"]
name = "Command A+ (via OpenRouter)"
provider = "openrouter"
context_window = 192000
released = "2026-09-22"
logical_model = "command-a-plus-05-2026"
equivalence_group = "command-a-plus-05-2026"
served_variant = "openrouter"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "vision", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.50, cache_read_per_mtok = 0.15 }
tier = "frontier"
open_weight = true
strengths = ["agentic", "tool_use", "reasoning", "multilingual", "vision"]
# Cohere and xAI first-party routes. Both are OpenAI-compatible enough for
# Harn's chat-completions adapter, but their economics are unusual: Command A+
# is free up to account limits, while xAI's coding model exposes very high TPM
# on regional clusters.
[models."command-a-plus-05-2026"]
name = "Command A+"
provider = "cohere"
context_window = 128000
logical_model = "command-a-plus-05-2026"
equivalence_group = "command-a-plus-05-2026"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming", "thinking", "vision"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 10.00 }
rate_limits = { rpm = 20, tier = "trial", source_url = "https://docs.cohere.com/docs/rate-limits", last_verified = "2026-06-05", notes = "Command A+ trial keys are 20 RPM and 1,000 calls/month; production is sales-gated. Token pricing is the public Command A+ API tariff." }
architecture = { parameter_count_b = 111.0, moe = true, source_url = "https://docs.cohere.com/docs/command-a-plus", last_verified = "2026-06-05" }
tier = "frontier"
open_weight = true
strengths = ["agentic", "tool_use", "reasoning", "multilingual", "vision"]
[models."grok-4.3"]
name = "Grok 4.3"
provider = "xai"
context_window = 1000000
logical_model = "grok-4.3"
equivalence_group = "grok-4.3"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming", "thinking", "vision", "prompt_caching"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 2.50, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/developers/models", last_verified = "2026-06-20" }
tier = "frontier"
open_weight = false
strengths = ["agentic", "tool_use", "reasoning", "vision", "long_context"]
# Grok 4.3 and Grok Build 0.1 bill every token at 2x once a request reaches
# 200K input tokens, cache reads included (docs.x.ai model pages, read
# 2026-10-09), like Grok 4.5-4.7; the band was missing from both rows.
[models."grok-build-0.1"]
name = "Grok Build 0.1"
provider = "xai"
context_window = 256000
logical_model = "grok-code-fast-1"
equivalence_group = "grok-code-fast-1"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "streaming", "thinking", "vision", "prompt_caching"]
pricing = { input_per_mtok = 1.00, output_per_mtok = 2.00, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { rpm = 1800, tpm = 10000000, tier = "us-east-1", source_url = "https://docs.x.ai/developers/models/grok-code-fast-1", last_verified = "2026-06-05" }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision"]
# --- source: 60-models/91-bedrock-batch.toml ---
# Conservative Bedrock batch catalog rows. Add a row only after AWS documents
# batch inference support for the exact model and region combination; ordinary
# Bedrock Converse availability is intentionally broader than this list.
[models."anthropic.claude-sonnet-4-5-20250929-v1:0"]
name = "Claude Sonnet 4.5 (Amazon Bedrock)"
provider = "bedrock"
context_window = 200000
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision"]
[models."meta.llama3-1-70b-instruct-v1:0"]
name = "Llama 3.1 70B Instruct (Amazon Bedrock)"
provider = "bedrock"
context_window = 128000
capabilities = ["tools", "streaming"]
tier = "mid"
open_weight = true
strengths = ["general", "tool_use"]
# --- source: 60-models/92-vertex.toml ---
# Stable Vertex AI Gemini route. The collision-free catalog id keeps the
# direct Gemini API row distinct while `wire_model` carries the model id used
# by Vertex's generateContent endpoint.
[models."vertex/gemini-2.5-flash"]
name = "Gemini 2.5 Flash (Vertex AI)"
provider = "vertex"
context_window = 1048576
logical_model = "gemini-2.5-flash"
equivalence_group = "gemini-2.5-flash"
served_variant = "vertex"
wire_model = "gemini-2.5-flash"
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "mid"
open_weight = false
strengths = ["speed", "long_context", "vision", "cheap", "tool_use", "agentic"]
complementary_with = ["anthropic-claude", "openai-gpt", "qwen", "deepseek", "kimi"]
# --- source: 60-models/95-moonshot-deepinfra-sambanova.toml ---
# Direct first-party / fast-inference routes for models also available through
# aggregator providers.
#
# Each row is keyed by a `provider/<wire-id>` selector so it stays
# collision-free with the same weights hosted elsewhere (e.g. the
# OpenRouter/Together `moonshotai/kimi-k2.6` rows). `normalize_model_id`
# strips the leading known-provider segment, and `wire_model` records the
# exact id sent on the wire for clarity.
#
# Structure note: this fragment opens with a `[models.X]` header (not a
# bare defaults block) so it does not collide with the trailing defaults
# block of the preceding fragment. Each model's `tier`/`open_weight`/
# `strengths`/`complementary_with` defaults trail its own table.
# ---------- Moonshot AI — direct Kimi K2 routes -------------------------------
[models."moonshot/kimi-k2.6"]
name = "Kimi K2.6 (Moonshot direct)"
provider = "moonshot"
wire_model = "kimi-k2.6"
logical_model = "moonshot-kimi-k2.6"
equivalence_group = "moonshot-kimi-k2.6"
served_variant = "moonshot-direct"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.50, cache_read_per_mtok = 0.15 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."moonshot/kimi-k3"]
name = "Kimi K3 (Moonshot direct)"
provider = "moonshot"
wire_model = "kimi-k3"
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "moonshot-direct"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
# Moonshot K3 tariff: $0.30 cache hit / $3.00 cache miss input and $15.00
# output per MTok. This frontier route is catalogued but intentionally has no
# automatic/QC/eval placement.
pricing = { input_per_mtok = 3.00, output_per_mtok = 15.00, cache_read_per_mtok = 0.30 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."moonshot/kimi-k2.7-code"]
name = "Kimi K2.7 Code (Moonshot direct)"
provider = "moonshot"
wire_model = "kimi-k2.7-code"
logical_model = "moonshot-kimi-k2.7-code"
equivalence_group = "moonshot-kimi-k2.7-code"
served_variant = "moonshot-direct"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
# First-party tariff verified 2026-07-02: $0.95 / $4.00 per MTok
# (cache hit $0.19), matching the Fireworks/Baseten/Together list rate
# for the same weights. The prior 0.80/3.20 row was stale.
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.19 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# Highspeed tariff not published on the per-model pricing page as of
# 2026-07-02; the row below keeps the last-known figures.
[models."moonshot/kimi-k2.7-code-highspeed"]
name = "Kimi K2.7 Code Highspeed (Moonshot direct)"
provider = "moonshot"
wire_model = "kimi-k2.7-code-highspeed"
logical_model = "moonshot-kimi-k2.7-code"
equivalence_group = "moonshot-kimi-k2.7-code"
served_variant = "moonshot-direct-highspeed"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.80, output_per_mtok = 3.20, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# ---------- DeepInfra — open-weight OpenAI-compatible host --------------------
[models."deepinfra/moonshotai/Kimi-K3"]
name = "Kimi K3 (DeepInfra)"
provider = "deepinfra"
wire_model = "moonshotai/Kimi-K3"
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
# DeepInfra's authenticated model inventory and live usage receipts agreed on
# this rate on 2026-08-26.
pricing = { input_per_mtok = 2.85, output_per_mtok = 14.25, cache_read_per_mtok = 0.285 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# Retired the DeepInfra Qwen3.8 route before its 2026-10-12 23:48:18 UTC
# redirect to zai-org/GLM-5.3. Sunset metadata does not enforce dispatch, and
# a different model must not inherit Qwen's identity. Together's separate
# Qwen route remains in 26-together-frontier-agents.toml.
# https://status.deepinfra.com/models/qwen3-8-2-4t-a95b
[models."deepinfra/deepseek-ai/DeepSeek-V4-Pro"]
name = "DeepSeek V4 Pro (DeepInfra)"
provider = "deepinfra"
wire_model = "deepseek-ai/DeepSeek-V4-Pro"
logical_model = "deepseek-v4-pro"
equivalence_group = "deepseek-v4-pro"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# DeepInfra catalog rate verified 2026-07-02 (fp4 serving): $1.30/$2.60.
# The prior 0.50/1.50 figures matched no published DeepInfra tariff.
pricing = { input_per_mtok = 1.30, output_per_mtok = 2.60, cache_read_per_mtok = 0.10 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# DeepSeek V4 Flash on DeepInfra — the budget 1M-context agent route
# (fp4). Catalog rate verified 2026-07-02: $0.09/$0.18 vs $0.14/$0.28
# first-party.
[models."deepinfra/deepseek-ai/DeepSeek-V4-Flash"]
name = "DeepSeek V4 Flash (DeepInfra)"
provider = "deepinfra"
wire_model = "deepseek-ai/DeepSeek-V4-Flash"
logical_model = "deepseek-v4-flash"
equivalence_group = "deepseek-v4-flash"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.09, output_per_mtok = 0.18, cache_read_per_mtok = 0.018 }
architecture = { parameter_count_b = 284.0, active_parameter_count_b = 13.0, moe = true, quantization = "fp4", license = "MIT", source_url = "https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash", last_verified = "2026-07-02" }
# tier matches the deepseek-v4-flash equivalence group (mid across hosts).
tier = "mid"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# DeepInfra /models listed this exact route on 2026-09-27. The first-party
# model page publishes 1,048,576 context and a 30% price promotion without an
# end date, so the promotional rates need a near-term review. Harn's live
# one-tool probe returned one native call in both non-streaming and streaming
# mode after accepting an unreported (null) cache-write counter.
[models."deepinfra/deepseek-ai/DeepSeek-V4.1-Flash"]
name = "DeepSeek V4.1 Flash (DeepInfra)"
provider = "deepinfra"
wire_model = "deepseek-ai/DeepSeek-V4.1-Flash"
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 0.60, cache_read_per_mtok = 0.006, promotions = [
{ id = "deepinfra-v41-flash-intro", starts_on = "2026-09-26", review_after = "2026-10-04", source_url = "https://deepinfra.com/deepseek-ai/DeepSeek-V4.1-Flash", input_per_mtok = 0.14, output_per_mtok = 0.42, cache_read_per_mtok = 0.004 },
] }
tier = "mid"
open_weight = true
strengths = ["tool_use", "long_context", "cheap"]
[models."deepinfra/Qwen/Qwen3.6-35B-A3B"]
name = "Qwen3.6 35B A3B (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.6-35B-A3B"
logical_model = "qwen3.6-35b-a3b"
equivalence_group = "qwen3.6-35b-a3b"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.95 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context", "cheap", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."deepinfra/deepseek-ai/DeepSeek-V3.2"]
name = "DeepSeek V3.2 (DeepInfra)"
provider = "deepinfra"
wire_model = "deepseek-ai/DeepSeek-V3.2"
logical_model = "deepseek-v3.2"
equivalence_group = "deepseek-v3.2"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 163840
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.26, output_per_mtok = 0.38, cache_read_per_mtok = 0.13 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."deepinfra/zai-org/GLM-5.2"]
name = "GLM 5.2 (DeepInfra)"
provider = "deepinfra"
wire_model = "zai-org/GLM-5.2"
logical_model = "glm-5.2"
equivalence_group = "glm-5.2"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# DeepInfra's published GLM-5.2 rate, verified 2026-06-28 against their pricing
# API (cents_per_input_token 9.5e-05 -> $0.95/MTok; cents_per_output_token
# 3e-04 -> $3.00/MTok; cached-read ratio -> $0.18/MTok) and reconciled against a
# live chat-completion `estimated_cost` (175 in + 36 out billed $0.00027425,
# exact). OpenRouter's z-ai/glm-5.2 listing agrees ($0.95/$3.00/$0.18). The prior
# 1.40/4.40/0.26 was the together/baseten placeholder, not DeepInfra's rate.
pricing = { input_per_mtok = 0.75, output_per_mtok = 2.40, cache_read_per_mtok = 0.14 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."deepinfra/Qwen/Qwen3.7-Max"]
name = "Qwen3.7 Max (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.7-Max"
logical_model = "qwen3.7-max"
equivalence_group = "qwen3.7-max"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 256000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.50 }
superseded_by = "deepinfra/Qwen/Qwen3.8-Max"
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
# Qwen3.8 Max on DeepInfra, listed in its model index (read 2026-10-01) at
# $1.65 / $4.951 per MTok with $0.206 cached input and a 256,000-token
# window. Alibaba's hosted flagship, not the open-weight 2.4T build: no image
# input, and response_format json_schema is rejected upstream, so structured
# output runs on Harn's prompt validation. Probe evidence is on the
# `*qwen3.8-max*` DeepInfra capability rule.
[models."deepinfra/Qwen/Qwen3.8-Max"]
name = "Qwen3.8 Max (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.8-Max"
logical_model = "qwen3.8-max"
equivalence_group = "qwen3.8-max"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 256000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.65, output_per_mtok = 4.951, cache_read_per_mtok = 0.206 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[models."deepinfra/moonshotai/Kimi-K2.7-Code"]
name = "Kimi K2.7 Code (DeepInfra)"
provider = "deepinfra"
wire_model = "moonshotai/Kimi-K2.7-Code"
logical_model = "moonshot-kimi-k2.7-code"
equivalence_group = "moonshot-kimi-k2.7-code"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
# DeepInfra undercuts the first-party $0.95/$4.00 list; verified
# 2026-07-02 (int4-native weights).
pricing = { input_per_mtok = 0.68, output_per_mtok = 3.40, cache_read_per_mtok = 0.136 }
deprecated = true
deprecation_note = "Absent from DeepInfra's model index (https://api.deepinfra.com/v1/openai/models, read 2026-09-26), which now carries Kimi K3 and Kimi K2.6 only."
superseded_by = "deepinfra/moonshotai/Kimi-K3"
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."deepinfra/openai/gpt-oss-120b"]
name = "GPT-OSS 120B (DeepInfra)"
provider = "deepinfra"
wire_model = "openai/gpt-oss-120b"
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 131072
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.037, output_per_mtok = 0.17 }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
# ---------- SambaNova Cloud — fast RDU inference ------------------------------
# Removed 2026-09-20: sambanova/DeepSeek-V4-Pro and sambanova/Llama-4-Maverick.
# Both had carried `deprecated = true` since 2026-06-20 and both are still
# absent from https://api.sambanova.ai/v1/models (observed 2026-09-20). Nothing
# in 20-routing, 30-aliases, 40-defaults or 62-ladders referenced either row.
[models."sambanova/DeepSeek-V3.2"]
name = "DeepSeek V3.2 (SambaNova)"
provider = "sambanova"
wire_model = "DeepSeek-V3.2"
logical_model = "deepseek-v3.2"
equivalence_group = "deepseek-v3.2"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 32768
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 3.00, output_per_mtok = 4.50 }
tier = "frontier"
open_weight = true
strengths = ["speed", "reasoning", "coding", "tool_use"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."sambanova/MiniMax-M2.7"]
name = "MiniMax M2.7 (SambaNova)"
provider = "sambanova"
wire_model = "MiniMax-M2.7"
logical_model = "minimax-m2.7"
equivalence_group = "minimax-m2.7"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 196608
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.40, cache_read_per_mtok = 0.06, cache_write_per_mtok = 0.0 }
deprecated = true
deprecation_note = "SambaNova's customer notice dated the deprecation 2026-10-01 with MiniMax M3 as the upgrade, and the route is absent from its model index (https://api.sambanova.ai/v1/models, read 2026-10-01), which lists MiniMax-M3 as its only MiniMax route. Its docs still listed MiniMax-M2.7 under Production on 2026-10-09, so the notice is the dated source. Not call-verified: the probe key was rejected with HTTP 401 on 2026-10-01."
sunset_date = "2026-10-01"
superseded_by = "sambanova/MiniMax-M3"
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."sambanova/MiniMax-M3"]
name = "MiniMax M3 (SambaNova)"
provider = "sambanova"
wire_model = "MiniMax-M3"
logical_model = "minimax-m3"
equivalence_group = "minimax-m3"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.40, cache_read_per_mtok = 0.06, cache_write_per_mtok = 0.0 }
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."sambanova/gpt-oss-120b"]
name = "GPT-OSS 120B (SambaNova)"
provider = "sambanova"
wire_model = "gpt-oss-120b"
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 131072
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.22, output_per_mtok = 0.59 }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-120b", last_verified = "2026-06-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
[models."sambanova/gemma-4-31B-it"]
name = "Gemma 4 31B (SambaNova)"
provider = "sambanova"
wire_model = "gemma-4-31B-it"
logical_model = "gemma-4-31b-it"
equivalence_group = "gemma-4-31b-it"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 131072
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.38, output_per_mtok = 1.15 }
tier = "frontier"
open_weight = true
strengths = ["speed", "vision", "reasoning", "coding", "cheap"]
[models."sambanova/Meta-Llama-3.3-70B-Instruct"]
name = "Llama 3.3 70B Instruct (SambaNova)"
provider = "sambanova"
wire_model = "Meta-Llama-3.3-70B-Instruct"
logical_model = "llama-3.3-70b-instruct"
equivalence_group = "llama-3.3-70b-instruct"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 131072
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 1.20 }
tier = "mid"
open_weight = true
strengths = ["speed", "tool_use", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
# --- source: 60-models/96-nvidia.toml ---
# NVIDIA NIM hosted LLM routes. The API Catalog exposes 100+ OpenAI-compatible
# model IDs; Harn catalogues the current agent/coding routes that are useful as
# first-class selectors and lets the live refresh workflow surface the rest.
[models."nvidia/nemotron-3-ultra-550b-a55b"]
name = "Nemotron 3 Ultra 550B A55B (NVIDIA NIM)"
provider = "nvidia"
context_window = 1048576
logical_model = "nemotron-3-ultra-550b-a55b"
equivalence_group = "nemotron-3-ultra-550b-a55b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
architecture = { parameter_count_b = 550.0, active_parameter_count_b = 55.0, moe = true, source_url = "https://build.nvidia.com/nvidia/nemotron-3-ultra-550b-a55b/modelcard", last_verified = "2026-06-20" }
tier = "frontier"
open_weight = true
strengths = ["agentic", "reasoning", "coding", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."nvidia/nemotron-3-super-120b-a12b"]
name = "Nemotron 3 Super 120B A12B (NVIDIA NIM)"
provider = "nvidia"
context_window = 1048576
logical_model = "nemotron-3-super-120b-a12b"
equivalence_group = "nemotron-3-super-120b-a12b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
architecture = { parameter_count_b = 120.0, active_parameter_count_b = 12.0, moe = true, source_url = "https://build.nvidia.com/nvidia/nemotron-3-super-120b-a12b/modelcard", last_verified = "2026-06-20" }
tier = "frontier"
open_weight = true
strengths = ["agentic", "reasoning", "coding", "tool_use", "long_context", "speed"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# Renamed 2026-09-20: NIM now serves this as `nvidia/nemotron-nano-3-30b-a3b`.
# The old `nvidia/nemotron-3-nano-30b-a3b` id is absent from
# https://integrate.api.nvidia.com/v1/models (observed 2026-09-20); the
# `nvidia-nemotron-nano` alias follows the new id. The sibling
# `nemotron-3-nano-omni-30b-a3b-reasoning` route kept its old-style id.
[models."nvidia/nemotron-nano-3-30b-a3b"]
name = "Nemotron Nano 3 30B A3B (NVIDIA NIM)"
provider = "nvidia"
context_window = 262144
logical_model = "nemotron-nano-3-30b-a3b"
equivalence_group = "nemotron-nano-3-30b-a3b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
architecture = { parameter_count_b = 30.0, active_parameter_count_b = 3.0, moe = true, source_url = "https://build.nvidia.com/nvidia/nemotron-nano-3-30b-a3b/modelcard", last_verified = "2026-09-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "reasoning", "coding", "tool_use", "long_context"]
[models."nvidia/nemotron-3.5-lightning-30b-a3b"]
name = "Nemotron 3.5 Lightning 30B A3B (NVIDIA NIM)"
provider = "nvidia"
context_window = 1048576
logical_model = "nemotron-3.5-lightning-30b-a3b"
equivalence_group = "nemotron-3.5-lightning-30b-a3b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "structured_output"]
architecture = { parameter_count_b = 30.0, active_parameter_count_b = 3.0, moe = true, source_url = "https://build.nvidia.com/nvidia/nemotron-3.5-lightning-30b-a3b/modelcard", last_verified = "2026-08-26" }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic", "reasoning", "tool_use", "long_context"]
[models."nvidia/nemotron-3-nano-omni-30b-a3b-reasoning"]
name = "Nemotron 3 Nano Omni 30B A3B Reasoning (NVIDIA NIM)"
provider = "nvidia"
context_window = 262144
logical_model = "nemotron-3-nano-omni-30b-a3b-reasoning"
equivalence_group = "nemotron-3-nano-omni-30b-a3b-reasoning"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "video", "audio", "streaming", "thinking"]
architecture = { parameter_count_b = 30.0, active_parameter_count_b = 3.0, moe = true, source_url = "https://build.nvidia.com/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning/modelcard", last_verified = "2026-06-20" }
tier = "mid"
open_weight = true
strengths = ["vision", "reasoning", "tool_use", "summarization", "long_context"]
# 2026-08-15 reachability sweep: NIM retired both undated DeepSeek V4 builds
# (HTTP 410, end of life 2026-08-07). There is no DeepSeek V4 Pro build on NIM
# any more, so the Pro row is gone rather than left pointing at a 410 — a
# catalog entry that cannot be called is worse than an absent one, because it is
# selectable. By 2026-09-26 NIM had dropped the dated V4 Flash snapshot too and
# serves DeepSeek V4.1 Flash in its place.
[models."nvidia/deepseek-v4.1-flash"]
name = "DeepSeek V4.1 Flash (NVIDIA NIM)"
provider = "nvidia"
wire_model = "deepseek-ai/deepseek-v4.1-flash"
context_window = 1048576
logical_model = "deepseek-v4.1-flash"
equivalence_group = "deepseek-v4.1-flash"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
# A one-tool `tool_choice: auto` probe on 2026-09-26 returned a native tool call
# and reported cached prompt tokens.
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
[models."nvidia/deepseek-v4-flash-0731"]
name = "DeepSeek V4 Flash 0731 (NVIDIA NIM)"
provider = "nvidia"
wire_model = "deepseek-ai/deepseek-v4-flash-0731"
context_window = 1048576
logical_model = "deepseek-v4-flash-0731"
equivalence_group = "deepseek-v4-flash"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
deprecated = true
deprecation_note = "Absent from NIM's model index (https://integrate.api.nvidia.com/v1/models, read 2026-09-26). NIM serves DeepSeek V4.1 Flash instead."
superseded_by = "nvidia/deepseek-v4.1-flash"
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# Removed 2026-09-20: nvidia/minimax-m3. NIM no longer serves any MiniMax
# build — `minimaxai/minimax-m3` is absent from
# https://integrate.api.nvidia.com/v1/models (observed 2026-09-20). The
# `nvidia-minimax-m3` alias went with it; MiniMax M3 stays reachable through
# the direct MiniMax, SambaNova, Fireworks and OpenRouter rows.
[models."nvidia/kimi-k2.6"]
name = "Kimi K2.6 (NVIDIA NIM)"
provider = "nvidia"
wire_model = "moonshotai/kimi-k2.6"
context_window = 262144
logical_model = "moonshot-kimi-k2.6"
equivalence_group = "moonshot-kimi-k2.6"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.50, cache_read_per_mtok = 0.15 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# Removed 2026-09-20: nvidia/openai/gpt-oss-120b. NIM's index now carries only
# the 20B sibling below (https://integrate.api.nvidia.com/v1/models, observed
# 2026-09-20). GPT-OSS 120B remains catalogued on Cerebras, Groq, Fireworks,
# DeepInfra, SambaNova and Baseten.
[models."nvidia/openai/gpt-oss-20b"]
name = "GPT-OSS 20B (NVIDIA NIM)"
provider = "nvidia"
wire_model = "openai/gpt-oss-20b"
context_window = 131072
logical_model = "openai-gpt-oss-20b"
equivalence_group = "openai-gpt-oss-20b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
architecture = { parameter_count_b = 21.0, active_parameter_count_b = 3.6, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-20b", last_verified = "2026-06-20" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
# Removed 2026-09-20: nvidia/step-3.7-flash. `stepfun-ai/step-3.7-flash` is
# absent from https://integrate.api.nvidia.com/v1/models (observed 2026-09-20).
# The stepfun/step-3.7-flash route on OpenRouter is unaffected.
# Added 2026-09-20, observed on https://integrate.api.nvidia.com/v1/models the
# same day: NIM now serves Kimi K3 and both Z.ai GLM 5.3 builds. Per-token
# rates are not published on the NIM index, so these rows carry no `pricing`,
# like their Nemotron siblings above. Context windows and capabilities are
# inherited from the first-party rows (Moonshot's /v1/models reports 1,048,576
# for kimi-k3; the GLM rows follow the direct Z.AI rows): NIM publishes neither
# per-route limits nor a tool matrix, so treat both as unverified for NIM.
[models."nvidia/kimi-k3"]
name = "Kimi K3 (NVIDIA NIM)"
provider = "nvidia"
wire_model = "moonshotai/kimi-k3"
context_window = 1048576
logical_model = "moonshot-kimi-k3"
equivalence_group = "moonshot-kimi-k3"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking"]
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."nvidia/glm-5.3"]
name = "GLM 5.3 (NVIDIA NIM)"
provider = "nvidia"
wire_model = "z-ai/glm-5.3"
context_window = 1048576
logical_model = "glm-5.3"
equivalence_group = "glm-5.3"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context"]
[models."nvidia/glm-5.3-flash"]
name = "GLM 5.3 Flash (NVIDIA NIM)"
provider = "nvidia"
wire_model = "z-ai/glm-5.3-flash"
context_window = 1048576
logical_model = "glm-5.3-flash"
equivalence_group = "glm-5.3-flash"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
# `frontier` matches the direct Z.AI and OpenRouter rows: tier is a property of
# the logical model, and every row in an equivalence group must agree.
tier = "frontier"
open_weight = true
strengths = ["speed", "cheap", "coding", "tool_use", "reasoning"]
# --- source: 60-models/97-baseten.toml ---
# Baseten Model APIs. Live /v1/models re-verified 2026-08-15 with
# BASETEN_API_KEY: ids, served context windows, pricing, features, modalities,
# and route quantization come from the provider-owned endpoint. Rows are keyed
# with `baseten/<wire-id>` so failover/eval tooling can compare the same
# weights across Baseten, Z.AI, Together, DeepInfra, OpenRouter, and NVIDIA.
#
# The 2026-08-15 sweep POSTed a 5-token completion to every row rather than
# diffing the models listing, because a listed id is not necessarily a callable
# one. Four rows returned HTTP 410 "the model version you are trying to access
# has been deprecated" and were removed:
#
# zai-org/GLM-5, zai-org/GLM-5.1 -- superseded by GLM-5.2 / GLM-5.2-Fast
# moonshotai/Kimi-K2.5 -- superseded by Kimi-K2.6 / K2.7-Code
# nvidia/Nemotron-120B-A12B -- no successor at that size is served
#
# The same sweep found two context windows and one cache-read rate stale
# against the provider-owned metadata (GLM-5.2 was catalogued at 262144 tokens
# and $0.26/Mtok cache reads against a served 1048576 and $0.14; DeepSeek V4
# Pro at 131000 against a served 262144), so every surviving row below now
# carries the value the endpoint reports.
[models."baseten/zai-org/GLM-5.2"]
name = "GLM 5.2 (Baseten)"
provider = "baseten"
wire_model = "zai-org/GLM-5.2"
logical_model = "glm-5.2"
equivalence_group = "glm-5.2"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.40, output_per_mtok = 4.40, cache_read_per_mtok = 0.14 }
architecture = { parameter_count_b = 744.0, active_parameter_count_b = 40.0, moe = true, quantization = "fp8", license = "MIT", source_url = "https://www.baseten.co/blog/how-we-built-the-worlds-fastest-api-for-glm-52/", last_verified = "2026-08-15" }
performance = { output_tokens_per_sec = 281.2, time_to_answer_s = 7.95, source = "artificial_analysis", source_url = "https://artificialanalysis.ai/models/glm-5-2/providers", last_verified = "2026-06-23", notes = "Artificial Analysis GLM-5.2 provider benchmark. The 2026-06-23 Harn probe that accompanied this figure also recorded native-tool unreliability; a 2026-08-15 re-probe found 16/16 clean native tool calls and that verdict was withdrawn." }
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "kimi", "deepseek"]
# Same weights as the row above (Baseten reports `hugging_face_id
# zai-org/GLM-5.2` for both); the `-Fast` id is a higher-throughput serving
# tier priced at a 50% premium. Modelled the way `deepinfra-turbo` and
# `moonshot-direct-highspeed` are: one equivalence group, distinct
# served_variant.
[models."baseten/zai-org/GLM-5.2-Fast"]
name = "GLM 5.2 Fast (Baseten)"
provider = "baseten"
wire_model = "zai-org/GLM-5.2-Fast"
logical_model = "glm-5.2"
equivalence_group = "glm-5.2"
served_variant = "baseten-model-api-fast"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.10, output_per_mtok = 6.60, cache_read_per_mtok = 0.21 }
architecture = { parameter_count_b = 744.0, active_parameter_count_b = 40.0, moe = true, quantization = "fp8", license = "MIT", source_url = "https://www.baseten.co/blog/how-we-built-the-worlds-fastest-api-for-glm-52/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "kimi", "deepseek"]
[models."baseten/moonshotai/Kimi-K2.7-Code"]
name = "Kimi K2.7 Code (Baseten)"
provider = "baseten"
wire_model = "moonshotai/Kimi-K2.7-Code"
logical_model = "moonshot-kimi-k2.7-code"
equivalence_group = "moonshot-kimi-k2.7-code"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 262000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.16 }
architecture = { quantization = "fp4", source_url = "https://www.baseten.co/library/kimi-k27-code/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
[models."baseten/deepseek-ai/DeepSeek-V4-Pro"]
name = "DeepSeek V4 Pro (Baseten)"
provider = "baseten"
wire_model = "deepseek-ai/DeepSeek-V4-Pro"
logical_model = "deepseek-v4-pro"
equivalence_group = "deepseek-v4-pro"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.74, output_per_mtok = 3.48, cache_read_per_mtok = 0.145 }
architecture = { parameter_count_b = 1600.0, active_parameter_count_b = 49.0, moe = true, quantization = "fp4", source_url = "https://www.baseten.co/library/deepseek-v4/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
# Dated snapshots. Baseten serves these alongside the undated ids, and they are
# the builds an eval should pin so a silent upstream reroute cannot change what
# a recorded trial measured.
[models."baseten/deepseek-ai/DeepSeek-V4-Pro-0813"]
name = "DeepSeek V4 Pro 0813 (Baseten)"
provider = "baseten"
wire_model = "deepseek-ai/DeepSeek-V4-Pro-0813"
logical_model = "deepseek-v4-pro-0813"
equivalence_group = "deepseek-v4-pro-0813"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.32, output_per_mtok = 3.96, cache_read_per_mtok = 0.132 }
architecture = { parameter_count_b = 1600.0, active_parameter_count_b = 49.0, moe = true, quantization = "fp4", source_url = "https://www.baseten.co/library/deepseek-v4/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."baseten/deepseek-ai/DeepSeek-V4-Flash-0731"]
name = "DeepSeek V4 Flash 0731 (Baseten)"
provider = "baseten"
wire_model = "deepseek-ai/DeepSeek-V4-Flash-0731"
logical_model = "deepseek-v4-flash-0731"
equivalence_group = "deepseek-v4-flash-0731"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.13, output_per_mtok = 0.26, cache_read_per_mtok = 0.028 }
architecture = { parameter_count_b = 284.0, active_parameter_count_b = 13.0, moe = true, quantization = "fp8", source_url = "https://www.baseten.co/library/deepseek-v4/", last_verified = "2026-08-15" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "reasoning", "coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."baseten/nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B"]
name = "Nemotron 3 Ultra 550B A55B (Baseten)"
provider = "baseten"
wire_model = "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B"
logical_model = "nemotron-3-ultra-550b-a55b"
equivalence_group = "nemotron-3-ultra-550b-a55b"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 202800
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.40, cache_read_per_mtok = 0.12 }
architecture = { parameter_count_b = 550.0, active_parameter_count_b = 55.0, moe = true, quantization = "fp4", source_url = "https://www.baseten.co/library/nemotron-3-ultra/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "agentic", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
[models."baseten/openai/gpt-oss-120b"]
name = "GPT-OSS 120B (Baseten)"
provider = "baseten"
wire_model = "openai/gpt-oss-120b"
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 128072
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.10 }
architecture = { parameter_count_b = 117.0, active_parameter_count_b = 5.1, moe = true, quantization = "fp4", license = "Apache-2.0", source_url = "https://www.baseten.co/library/gpt-oss-120b/", last_verified = "2026-08-15" }
tier = "mid"
open_weight = true
strengths = ["cheap", "tool_use", "reasoning", "coding"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
[models."baseten/zai-org/GLM-4.7"]
name = "GLM 4.7 (Baseten)"
provider = "baseten"
wire_model = "zai-org/GLM-4.7"
logical_model = "glm-4.7"
equivalence_group = "glm-4.7"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 200000
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.20, cache_read_per_mtok = 0.12 }
architecture = { quantization = "fp4", source_url = "https://www.baseten.co/pricing/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context"]
[models."baseten/moonshotai/Kimi-K2.6"]
name = "Kimi K2.6 (Baseten)"
provider = "baseten"
wire_model = "moonshotai/Kimi-K2.6"
logical_model = "moonshot-kimi-k2.6"
equivalence_group = "moonshot-kimi-k2.6"
served_variant = "baseten-model-api"
api_dialect = "openai_chat"
context_window = 262000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.95, output_per_mtok = 4.00, cache_read_per_mtok = 0.16 }
architecture = { quantization = "fp4", source_url = "https://www.baseten.co/pricing/", last_verified = "2026-08-15" }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
# --- source: 60-models/98-dashscope.toml ---
# DashScope (Alibaba Model Studio, international endpoint) — first-party
# Qwen routes. Pricing verified 2026-07-02 against
# https://www.alibabacloud.com/help/en/model-studio/model-pricing.
#
# Rows are keyed `dashscope/<wire-id>` so they stay collision-free with
# the same weights hosted elsewhere (e.g. the bare `qwen3.6-35b-a3b`
# llamacpp row); `wire_model` records the exact id sent on the wire.
#
# DashScope bills per request at the tier the TOTAL input size lands in
# (<=32K / <=128K / <=256K / <=1M); this catalog's single-rate-card shape
# records the base <=32K tier, so long-context requests cost more than a
# naive rate-card estimate. Implicit prompt caching bills cache hits at
# 20% of the input rate (explicit caches at 10%); cache_read below uses
# the implicit 20% figure.
[models."dashscope/qwen3-coder-plus"]
name = "Qwen3 Coder Plus (DashScope)"
provider = "dashscope"
wire_model = "qwen3-coder-plus"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 1048576
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "long_context", "tool_use"]
[models."dashscope/qwen3-coder-next"]
name = "Qwen3 Coder Next (DashScope)"
provider = "dashscope"
wire_model = "qwen3-coder-next"
logical_model = "qwen3-coder-next"
equivalence_group = "qwen3-coder-next"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.50, cache_read_per_mtok = 0.06 }
architecture = { parameter_count_b = 80.0, active_parameter_count_b = 3.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3-Coder-Next", last_verified = "2026-07-02" }
benchmarks = { swe_bench_verified = 70.6, swe_bench_pro = 44.3 }
tier = "mid"
open_weight = true
strengths = ["coding", "cheap", "long_context", "agentic", "tool_use"]
[models."dashscope/qwen3.6-35b-a3b"]
name = "Qwen3.6 35B A3B (DashScope)"
provider = "dashscope"
wire_model = "qwen3.6-35b-a3b"
logical_model = "qwen3.6-35b-a3b"
equivalence_group = "qwen3.6-35b-a3b"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.375, output_per_mtok = 2.25, cache_read_per_mtok = 0.075 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context", "cheap"]
[models."dashscope/qwen3.5-397b-a17b"]
name = "Qwen3.5 397B A17B (DashScope)"
provider = "dashscope"
wire_model = "qwen3.5-397b-a17b"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 3.60, cache_read_per_mtok = 0.12 }
architecture = { parameter_count_b = 397.0, active_parameter_count_b = 17.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.5-397B-A17B", last_verified = "2026-07-02" }
benchmarks = { swe_bench_verified = 76.4 }
tier = "frontier"
open_weight = true
strengths = ["coding", "reasoning", "tool_use", "long_context", "vision"]
# Qwen3.7-Max — Alibaba's closed frontier tier; flat (non-tiered) $2.50 /
# $7.50 per MTok with a 1M window on DashScope.
[models."dashscope/qwen3.7-max"]
name = "Qwen3.7 Max (DashScope)"
provider = "dashscope"
wire_model = "qwen3.7-max"
logical_model = "qwen3.7-max"
equivalence_group = "qwen3.7-max"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.50, output_per_mtok = 7.50, cache_read_per_mtok = 0.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning"]
# Qwen3.8 Max on DashScope international (Singapore). Model Studio's pricing
# page (read 2026-10-09) lists both the `qwen3.8-max` alias and the
# `qwen3.8-max-0902` snapshot at $2 / $6 per MTok in one 0-1M tier, the same
# for thinking and non-thinking output; it discounts cache hits without a
# figure, so the cache rates are those of Alibaba's own endpoint as OpenRouter
# lists it ($0.25 read, $2.50 write). Probed 2026-10-09 through OpenRouter
# pinned to that Alibaba endpoint (no DashScope key on this host): a native
# tool call, the tool-result round trip, a required tool choice and effort
# `high` returned 200, and reasoning off was a 400 "Reasoning is mandatory".
# Model Studio documents `enable_thinking` as a hybrid toggle for this model;
# the capability rule takes the probe's side so Harn never sends the disable.
[models."dashscope/qwen3.8-max"]
name = "Qwen3.8 Max (DashScope)"
provider = "dashscope"
wire_model = "qwen3.8-max"
logical_model = "qwen3.8-max"
equivalence_group = "qwen3.8-max"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 1000000
released = "2026-09-02"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.25, cache_write_per_mtok = 2.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning", "vision"]
[models."dashscope/qwen3.8-max-0902"]
name = "Qwen3.8 Max 0902 (DashScope)"
provider = "dashscope"
wire_model = "qwen3.8-max-0902"
logical_model = "qwen3.8-max"
equivalence_group = "qwen3.8-max"
served_variant = "dashscope"
api_dialect = "openai_chat"
context_window = 1000000
released = "2026-09-02"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.25, cache_write_per_mtok = 2.50 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "long_context", "reasoning", "vision"]
# --- source: 60-models/99-gateway-regional-deltas.toml ---
# Current provider/model deltas discovered in the July 2026 provider catalog
# pass. Rows here are either new providers with official OpenAI-compatible APIs
# or live catalog rows observed with provider API keys. Keep route-specific ids
# collision-free and use `wire_model` for the exact provider payload where
# needed.
#
# Every OpenRouter, Together and DeepInfra row in this file was re-read
# against the provider's live models endpoint on 2026-09-20; rates and
# context windows below are that read.
# Inception Labs Mercury routes.
[models."mercury-2"]
name = "Mercury 2"
provider = "inception"
context_window = 128000
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.25, output_per_mtok = 0.75 }
tier = "mid"
open_weight = false
strengths = ["speed", "reasoning", "tool_use", "agentic"]
[models."mercury-coder-small"]
name = "Mercury Coder Small"
provider = "inception"
context_window = 32768
capabilities = ["tools", "streaming"]
tier = "mid"
open_weight = false
strengths = ["speed", "coding", "tool_use"]
# xAI direct and OpenRouter mirrors.
#
# Verified 2026-09-20 against https://api.x.ai/v1/models, whose per-model
# record carries context_length, per-token rates, and the long-context band.
# Both 4.5 and 4.6 bill double above a 200,000-token prompt
# (`long_context_threshold` / `*_long_context` in the record), which the rows
# below now record as `input_token_bands`; that band was missing from the 4.5
# row and understated the cost of its long prompts by 2x.
[models."grok-4.5"]
name = "Grok 4.5"
provider = "xai"
context_window = 500000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.30, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/developers/models", last_verified = "2026-07-09" }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
[models."x-ai/grok-4.5"]
name = "Grok 4.5 (via OpenRouter)"
provider = "openrouter"
context_window = 500000
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.30, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
# Grok 4.6, xAI's release of 2026-08-06 (`created` on the /v1/models record).
# Same context window, headline rates and long-context band as 4.5; the cache
# read rate is higher ($0.50 versus $0.30 per MTok). Reasoning effort accepts
# low, medium, high and xhigh and defaults to high, unchanged from 4.5, so the
# xai capability rules need no edit.
# Grok 4.7 (xAI index created 2026-09-01; OpenRouter listed 2026-09-21).
# xAI's /v1/language-models prices it identically to Grok 4.6 ($2 / $6, cached
# $0.50); OpenRouter lists it at $1.60 / $4.80, cached $0.40. Same 500K
# context and image input as Grok 4.6. The `grok-*` capability rules cover it.
[models."grok-4.7"]
name = "Grok 4.7"
provider = "xai"
context_window = 500000
released = "2026-09-01"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.50, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/developers/models", last_verified = "2026-09-22" }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
[models."x-ai/grok-4.7"]
name = "Grok 4.7 (via OpenRouter)"
provider = "openrouter"
context_window = 500000
released = "2026-09-21"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.0, output_per_mtok = 6.0, cache_read_per_mtok = 0.5, input_token_bands = [{ minimum_input_tokens = 200000, input_multiplier = 2.0, output_multiplier = 2.0 }] }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
# Grok 4.20 (0309 snapshots), still current on xAI's model index with no
# retirement notice (docs.x.ai, read 2026-10-09): one reasoning id, one
# non-reasoning id and a multi-agent id, all 1M context with image input, at
# $1.25 / $2.50 per MTok and $0.20 cached, doubling at 200K input tokens like
# the rest of the line. Probed 2026-10-09 through OpenRouter pinned to its xAI
# endpoint (no direct xAI key was available):
# * `x-ai/grok-4.20` (the reasoning id): a native tool call, the tool-result
# round trip and a required tool choice returned 200, effort `low` and
# `high` both reasoned, and unlike Grok 4.5-4.7 reasoning off also
# returned 200;
# * `x-ai/grok-4.20-multi-agent`: effort `low` and `xhigh` reasoned (2,581
# and 9,247 reasoning tokens; xAI documents effort as the agent count), but
# OpenRouter found no endpoint that accepts tools, so the row claims none
# despite xAI's page listing function calling.
[models."grok-4.20-0309-reasoning"]
name = "Grok 4.20 Reasoning"
provider = "xai"
context_window = 1000000
released = "2026-03-09"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 2.50, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/docs/models/grok-4.20-0309-reasoning", last_verified = "2026-10-09" }
tier = "frontier"
open_weight = false
strengths = ["agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."grok-4.20-0309-non-reasoning"]
name = "Grok 4.20 Non-Reasoning"
provider = "xai"
context_window = 1000000
released = "2026-03-09"
api_dialect = "openai_chat_compat"
capabilities = ["tools", "vision", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 2.50, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/docs/models/grok-4.20-0309-non-reasoning", last_verified = "2026-10-09" }
tier = "mid"
open_weight = false
strengths = ["speed", "tool_use", "vision", "long_context"]
[models."grok-4.20-multi-agent-0309"]
name = "Grok 4.20 Multi-Agent"
provider = "xai"
context_window = 1000000
released = "2026-03-09"
api_dialect = "openai_chat_compat"
capabilities = ["vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 2.50, cache_read_per_mtok = 0.20, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/docs/models/grok-4.20-multi-agent-0309", last_verified = "2026-10-09" }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "vision", "long_context"]
[models."grok-4.6"]
name = "Grok 4.6"
provider = "xai"
context_window = 500000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.50, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
rate_limits = { source_url = "https://docs.x.ai/developers/models", last_verified = "2026-09-20" }
superseded_by = "grok-4.7"
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
[models."x-ai/grok-4.6"]
name = "Grok 4.6 (via OpenRouter)"
provider = "openrouter"
context_window = 500000
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.50, input_token_bands = [{ minimum_input_tokens = 200001, input_multiplier = 2.0, output_multiplier = 2.0 }] }
superseded_by = "x-ai/grok-4.7"
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.5"]
name = "GPT-5.5 (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 30.00, cache_read_per_mtok = 0.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6.1-sol"
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
# GPT-5.6 gateway routes. OpenRouter exposes standard and provider-managed Pro
# slugs for each tier; Pro is a serving behavior, not an independent model
# lineage, so both routes share the same equivalence group. Base rates remain
# durable while the API's current discount is represented as a promotion.
# GPT-6 on OpenRouter (listed 2026-09-04 for Astra, 2026-09-22 for Sol and
# Luna) at OpenAI's list prices. The `-pro` slugs are OpenRouter's packaging
# of the pro reasoning mode on the same model, so they share the logical model.
[models."openai/gpt-6-astra"]
name = "GPT-6 Astra (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-astra"
equivalence_group = "gpt-6-astra"
served_variant = "openrouter"
released = "2026-09-04"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6-astra-pro"]
name = "GPT-6 Astra Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-astra"
equivalence_group = "gpt-6-astra"
served_variant = "openrouter_pro"
released = "2026-09-04"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 10.00, output_per_mtok = 50.00, cache_read_per_mtok = 1.00, cache_write_per_mtok = 12.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6-sol"]
name = "GPT-6 Sol (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-sol"
equivalence_group = "gpt-6-sol"
served_variant = "openrouter"
released = "2026-09-22"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6.1-sol"
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6-sol-pro"]
name = "GPT-6 Sol Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-sol"
equivalence_group = "gpt-6-sol"
served_variant = "openrouter_pro"
released = "2026-09-22"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6.1-sol-pro"
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
# GPT-6.1 Sol on OpenRouter, listed 2026-09-29 at OpenAI's list price (live
# /models index: $2 / $10, cache read $0.10, cache write $2.50). The `-pro`
# slug is the same model with pro reasoning mode, priced identically per
# token. Probed 2026-09-29: function tools over chat completions return a
# tool call (OpenRouter routes to Responses), and `reasoning.effort = "none"`
# is a 400 ("Reasoning is mandatory"), as on the direct route. The index read
# 2026-10-01 adds a 272K-token override at 2x input and cache and 1.5x
# output, the same long-prompt band as the direct row, on both slugs.
[models."openai/gpt-6.1-sol"]
name = "GPT-6.1 Sol (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6.1-sol"
equivalence_group = "gpt-6.1-sol"
served_variant = "openrouter"
released = "2026-09-29"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6.1-sol-pro"]
name = "GPT-6.1 Sol Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6.1-sol"
equivalence_group = "gpt-6.1-sol"
served_variant = "openrouter_pro"
released = "2026-09-29"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6-luna"]
name = "GPT-6 Luna (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-luna"
equivalence_group = "gpt-6-luna"
served_variant = "openrouter"
released = "2026-09-22"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "small"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-6-luna-pro"]
name = "GPT-6 Luna Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-6-luna"
equivalence_group = "gpt-6-luna"
served_variant = "openrouter_pro"
released = "2026-09-22"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.10, output_per_mtok = 0.50, cache_read_per_mtok = 0.01, cache_write_per_mtok = 0.125, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "small"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-sol"]
name = "GPT-5.6 Sol (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-sol"
equivalence_group = "gpt-5.6-sol"
served_variant = "openrouter"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 30.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, promotions = [{ id = "openrouter-sol-2026-08", starts_on = "2026-08-21", review_after = "2026-11-21", source_url = "https://openrouter.ai/api/v1/models", input_per_mtok = 2.00, output_per_mtok = 10.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50 }], input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-sol"
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-sol-pro"]
name = "GPT-5.6 Sol Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-sol"
equivalence_group = "gpt-5.6-sol"
served_variant = "openrouter_pro"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 5.00, output_per_mtok = 30.00, cache_read_per_mtok = 0.50, cache_write_per_mtok = 6.25, promotions = [{ id = "openrouter-sol-pro-2026-08", starts_on = "2026-08-21", review_after = "2026-11-21", source_url = "https://openrouter.ai/api/v1/models", input_per_mtok = 4.0, output_per_mtok = 20.0, cache_read_per_mtok = 0.4, cache_write_per_mtok = 5.0 }], input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-sol-pro"
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-terra"]
name = "GPT-5.6 Terra (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-terra"
equivalence_group = "gpt-5.6-terra"
served_variant = "openrouter"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 12.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-sol"
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-terra-pro"]
name = "GPT-5.6 Terra Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-terra"
equivalence_group = "gpt-5.6-terra"
served_variant = "openrouter_pro"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 2.00, output_per_mtok = 12.00, cache_read_per_mtok = 0.20, cache_write_per_mtok = 2.50, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-sol-pro"
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-luna"]
name = "GPT-5.6 Luna (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-luna"
equivalence_group = "gpt-5.6-luna"
served_variant = "openrouter"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.20, cache_read_per_mtok = 0.02, cache_write_per_mtok = 0.25, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-luna"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.6-luna-pro"]
name = "GPT-5.6 Luna Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
logical_model = "gpt-5.6-luna"
equivalence_group = "gpt-5.6-luna"
served_variant = "openrouter_pro"
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.20, cache_read_per_mtok = 0.02, cache_write_per_mtok = 0.25, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
superseded_by = "openai/gpt-6-luna-pro"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.5-pro"]
name = "GPT-5.5 Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 30.00, output_per_mtok = 180.00, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.4-pro"]
name = "GPT-5.4 Pro (via OpenRouter)"
provider = "openrouter"
context_window = 1050000
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 30.00, output_per_mtok = 180.00, input_token_bands = [{ minimum_input_tokens = 272000, input_multiplier = 2.0, output_multiplier = 1.5 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."openai/gpt-5.4-mini"]
name = "GPT-5.4 Mini (via OpenRouter)"
provider = "openrouter"
operations = ["text_generation", "decision"]
context_window = 400000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.75, output_per_mtok = 4.50, cache_read_per_mtok = 0.075 }
tier = "mid"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "cheap"]
# OpenRouter still listed this slug with a null `expiration_date` on
# 2026-10-01; it follows OpenAI's shutdown of the underlying model.
[models."openai/gpt-5.4-nano"]
name = "GPT-5.4 Nano (via OpenRouter)"
provider = "openrouter"
operations = ["text_generation", "decision"]
context_window = 400000
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.25, cache_read_per_mtok = 0.02 }
deprecated = true
deprecation_note = "OpenAI shuts down gpt-5.4-nano 2027-04-01 (announced 2026-10-01) and names gpt-6-luna as the replacement; this OpenRouter route ends with it."
sunset_date = "2027-04-01"
superseded_by = "openai/gpt-6-luna"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "tool_use", "reasoning"]
# Removed 2026-09-20: anthropic/claude-opus-4.8-fast. OpenRouter's index lists
# anthropic/claude-opus-4.8 and its `:batch` variant but no `-fast` slug
# (observed 2026-09-20). Fast mode stays catalogued as a `serving_tiers` entry
# on the direct Anthropic Opus rows, which is where it is actually sold.
[models."openrouter/free"]
name = "OpenRouter Free Router"
provider = "openrouter"
context_window = 200000
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.00, output_per_mtok = 0.00 }
tier = "small"
open_weight = false
strengths = ["cheap", "router", "tool_use"]
quality_tags = ["free_tier", "aggregate_router", "avoid_reviewer"]
[models."cohere/north-mini-code:free"]
name = "North Mini Code Free (via OpenRouter)"
provider = "openrouter"
context_window = 256000
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.00, output_per_mtok = 0.00 }
tier = "mid"
open_weight = false
strengths = ["coding", "cheap", "tool_use", "long_context"]
quality_tags = ["free_tier", "avoid_reviewer"]
[models."nvidia/nemotron-3-super-120b-a12b:free"]
name = "Nemotron 3 Super 120B A12B Free (via OpenRouter)"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.00, output_per_mtok = 0.00 }
tier = "frontier"
open_weight = false
strengths = ["cheap", "tool_use", "reasoning", "long_context"]
quality_tags = ["free_tier", "avoid_reviewer"]
# OpenRouter serves this free route only to accounts that allow free-model
# prompt training. With that privacy setting off, every request returns 404
# "0 endpoints out of 1 requested are available matching your guardrail
# restrictions and data policy ... Free model training violation (account
# settings)" (provider contract probe run 37030330916, re-checked 2026-10-02).
[models."nvidia/nemotron-3-super-120b-a12b:free".data_controls]
training_default = "trains"
checked_on = "2026-10-02"
sources = ["https://openrouter.ai/settings/privacy"]
note = "OpenRouter excludes this endpoint as a free-model training violation unless the account allows training on free models, so prompts sent here may be used for training."
[models."bytedance-seed/seed-2.0-lite"]
name = "Seed 2.0 Lite (via OpenRouter)"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.25, output_per_mtok = 2.00, input_token_bands = [{ minimum_input_tokens = 128000, input_multiplier = 2.0, output_multiplier = 2.0 }] }
tier = "mid"
open_weight = false
strengths = ["cheap", "tool_use", "reasoning", "vision", "long_context"]
[models."qwen/qwen3.5-plus-20260420"]
name = "Qwen3.5 Plus 20260420 (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.80, cache_write_per_mtok = 0.375, input_token_bands = [{ minimum_input_tokens = 256000, input_multiplier = 1.25, output_multiplier = 1.25 }] }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
[models."qwen/qwen3.6-max-preview"]
name = "Qwen3.6 Max Preview (via OpenRouter)"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.027, output_per_mtok = 6.162, cache_write_per_mtok = 1.28375, input_token_bands = [{ minimum_input_tokens = 128000, input_multiplier = 1.538462, output_multiplier = 1.538462 }] }
deprecated = true
deprecation_note = "OpenRouter retires this preview 2026-10-09 (typed expiration_date on https://openrouter.ai/api/v1/models, read 2026-10-01), together with its other Qwen3 and Qwen3.6-Max routes. Use qwen/qwen3.8-max-0902."
sunset_date = "2026-10-09"
superseded_by = "qwen/qwen3.8-max-0902"
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "vision", "long_context"]
# Groq announced both Compound systems by developer email (2026-08-25 for
# Compound, 2026-08-24 for Compound Mini); both stop serving requests after
# 2026-09-21. Groq's documented process emails first and updates the public
# deprecations page afterwards, so the rows stay listed upstream for now. Keep
# them here through the shutdown so in-flight callers still resolve pricing,
# context, and a migration target instead of hitting an unknown-model error.
[models."groq/compound"]
name = "Groq Compound"
provider = "groq"
wire_model = "groq/compound"
context_window = 131072
capabilities = ["streaming"]
rate_limits = { rpm = 200, tpm = 200000, tier = "developer", source_url = "https://console.groq.com/docs/models", last_verified = "2026-08-25", notes = "Groq compound systems publish 8192 max completion tokens and about 450 output tokens/sec." }
deprecated = true
deprecation_note = "Decommissioned 2026-09-21; announced by Groq developer email 2026-08-25 and not yet on https://console.groq.com/docs/deprecations. Use groq/openai/gpt-oss-120b, the Groq route that keeps built-in web search and code execution."
superseded_by = "groq/openai/gpt-oss-120b"
tier = "frontier"
open_weight = false
strengths = ["speed", "agentic"]
[models."groq/compound-mini"]
name = "Groq Compound Mini"
provider = "groq"
wire_model = "groq/compound-mini"
context_window = 131072
capabilities = ["streaming"]
rate_limits = { rpm = 200, tpm = 200000, tier = "developer", source_url = "https://console.groq.com/docs/models", last_verified = "2026-08-25", notes = "Groq compound systems publish 8192 max completion tokens and about 450 output tokens/sec." }
deprecated = true
deprecation_note = "Decommissioned 2026-09-21; announced by Groq developer email 2026-08-24 and not yet on https://console.groq.com/docs/deprecations. Use groq/openai/gpt-oss-20b, Groq's recommended replacement for its retired small routes."
superseded_by = "groq/openai/gpt-oss-20b"
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "agentic"]
# Removed 2026-09-20: moonshot/kimi-k2.5. Its deprecation note recorded that
# Moonshot still listed the route; https://api.moonshot.ai/v1/models no longer
# does (observed 2026-09-20 — the index is exactly kimi-k2.6, kimi-k2.7-code,
# kimi-k2.7-code-highspeed and kimi-k3). Its `temperature = 1.0` entry in
# 40-defaults/generation.toml went with it.
# Together serverless rows observed from GET /v1/models.
[models."moonshotai/Kimi-K2.6"]
name = "Kimi K2.6 (Together)"
provider = "together"
context_window = 262144
logical_model = "moonshot-kimi-k2.6"
equivalence_group = "moonshot-kimi-k2.6"
served_variant = "together"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.20, output_per_mtok = 4.50, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."openai/gpt-oss-20b"]
name = "GPT-OSS 20B (Together)"
provider = "together"
availability = "dedicated"
context_window = 131072
logical_model = "openai-gpt-oss-20b"
equivalence_group = "openai-gpt-oss-20b"
served_variant = "together"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.05, output_per_mtok = 0.20 }
architecture = { parameter_count_b = 21.0, active_parameter_count_b = 3.6, moe = true, license = "Apache-2.0", source_url = "https://developers.openai.com/api/docs/models/gpt-oss-20b", last_verified = "2026-07-09" }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning"]
[models."Qwen/Qwen3.7-Plus"]
name = "Qwen3.7 Plus (Together)"
provider = "together"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.32, output_per_mtok = 1.28 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
[models."Qwen/Qwen3.6-Plus"]
name = "Qwen3.6 Plus (Together)"
provider = "together"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.50, output_per_mtok = 3.00 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."Qwen/Qwen3.5-397B-A17B"]
name = "Qwen3.5 397B A17B (Together)"
provider = "together"
availability = "dedicated"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 3.60, cache_read_per_mtok = 0.35 }
architecture = { parameter_count_b = 397.0, active_parameter_count_b = 17.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.5-397B-A17B", last_verified = "2026-07-09" }
tier = "frontier"
open_weight = true
strengths = ["coding", "reasoning", "tool_use", "long_context", "vision"]
# 2026-08-15 reachability sweep: `zai-org/GLM-5` is non-serverless on Together
# (HTTP 400 `model_not_available`), same as GLM-5.1. Removed rather than left
# selectable; `zai-org/GLM-5.2` is the reachable Together GLM route.
# Together lists this model but a 2026-09-29 chat call returned "Unable to
# access non-serverless model"; it needs a dedicated endpoint.
[models."together/nvidia/nemotron-3-ultra-550b-a55b"]
name = "Nemotron 3 Ultra 550B A55B (Together)"
provider = "together"
availability = "dedicated"
wire_model = "nvidia/nemotron-3-ultra-550b-a55b"
context_window = 512288
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 3.60, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "tool_use", "long_context"]
# DeepInfra live model detail rows.
[models."deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo"]
name = "Qwen3 Coder 480B A35B Turbo (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo"
logical_model = "qwen3-coder-480b-a35b"
equivalence_group = "qwen3-coder-480b-a35b"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 1.00, cache_read_per_mtok = 0.10 }
tier = "frontier"
open_weight = true
strengths = ["coding", "long_context", "agentic", "tool_use"]
[models."deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507"]
name = "Qwen3 235B A22B Instruct 2507 (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3-235B-A22B-Instruct-2507"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.09, output_per_mtok = 0.55 }
tier = "mid"
open_weight = true
strengths = ["cheap", "tool_use", "long_context"]
[models."deepinfra/Qwen/Qwen3.6-27B"]
name = "Qwen3.6 27B (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.6-27B"
logical_model = "qwen3.6-27b"
equivalence_group = "qwen3.6-27b"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "video", "streaming", "thinking"]
pricing = { input_per_mtok = 0.32, output_per_mtok = 3.20 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "vision", "long_context"]
[models."deepinfra/MiniMaxAI/MiniMax-M2.7-Turbo"]
name = "MiniMax M2.7 Turbo (DeepInfra)"
provider = "deepinfra"
wire_model = "MiniMaxAI/MiniMax-M2.7-Turbo"
logical_model = "minimax-m2.7"
equivalence_group = "minimax-m2.7"
served_variant = "deepinfra-turbo"
api_dialect = "openai_chat"
context_window = 196608
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.38, output_per_mtok = 1.70, cache_read_per_mtok = 0.07 }
deprecated = true
deprecation_note = "Absent from DeepInfra's model index (https://api.deepinfra.com/v1/openai/models, read 2026-10-01) though a direct call still returned HTTP 200 that day; DeepInfra announced no shutdown date. Use deepinfra/MiniMaxAI/MiniMax-M3."
superseded_by = "deepinfra/MiniMaxAI/MiniMax-M3"
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
# MiniMax M3 on DeepInfra, listed in its model index (read 2026-10-01) at
# $0.28 / $1.10 per MTok with $0.056 cached input and a 524,288-token
# window. Live probe 2026-10-01 on /v1/openai/chat/completions:
# tool_choice auto and required -> one native tool call each
# reasoning_effort none/low/high and temperature=0.2 -> 200; reasoning
# arrives in `reasoning_content`
# strict json_schema -> 200 with schema-valid JSON
# repeated prompts reported 128-384 cached input tokens
# a solid red PNG was answered "Brown", so vision is not claimed here
# although the index tags the model `vision`.
[models."deepinfra/MiniMaxAI/MiniMax-M3"]
name = "MiniMax M3 (DeepInfra)"
provider = "deepinfra"
wire_model = "MiniMaxAI/MiniMax-M3"
logical_model = "minimax-m3"
equivalence_group = "minimax-m3"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 524288
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.28, output_per_mtok = 1.10, cache_read_per_mtok = 0.056 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "cheap"]
[models."deepinfra/zai-org/GLM-4.6"]
name = "GLM 4.6 (DeepInfra)"
provider = "deepinfra"
wire_model = "zai-org/GLM-4.6"
logical_model = "glm-4.6"
equivalence_group = "glm-4.6"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 202752
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.50, output_per_mtok = 2.00, cache_read_per_mtok = 0.10 }
tier = "mid"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "cheap", "long_context"]
[models."deepinfra/Qwen/Qwen3.5-397B-A17B"]
name = "Qwen3.5 397B A17B (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.5-397B-A17B"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.45, output_per_mtok = 3.00, cache_read_per_mtok = 0.22 }
architecture = { parameter_count_b = 397.0, active_parameter_count_b = 17.0, moe = true, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.5-397B-A17B", last_verified = "2026-07-09" }
tier = "frontier"
open_weight = true
strengths = ["coding", "reasoning", "tool_use", "long_context", "vision"]
# Fireworks compatibility fill-ins returned by live model discovery.
# 2026-08-15 reachability sweep: Fireworks no longer deploys `glm-5p1`
# (HTTP 404 `Model not found, inaccessible, and/or not deployed`); its model
# listing carries only `glm-5p2`, which stays catalogued above.
# --- source: 60-models/99-typesafe-jev.toml ---
# ── TypeSafe Jev — decision-only routes ──────────────────────────────────────
#
# Jev is a System One decision model: it answers typed questions over a shared
# state with probabilities, and it cannot hold a conversation. Every row here
# declares `operations = ["decision"]` and nothing else, so the checker and the
# runtime refuse it as a chat driver before any request is made. A chat call to
# `typesafe-ai/jev` on the Vercel gateway is refused upstream too, with
# `ModelTypeMismatchError` on `/v1/chat/completions` (observed 2026-09-20).
#
# How the operation is dialled per route lives in the capability rules, not
# here: see `capability_sources/10-decisions/00-decision-contracts.toml`. These
# three endpoints are not interchangeable chat endpoints, so the protocol is a
# typed capability rather than something inferred from the provider id.
#
# Shared facts, all from TypeSafe's own documentation:
# * `jev-latest` is an alias currently pointing at `jev-1.13.0`, alongside a
# `jev-preview` alias. https://docs.typesafe.ai/models
# * Pricing is input-only, $0.042 per million tokens; output tokens are free.
# https://typesafe.ai/blog/introducing-system-one-models-and-jev
# * The documented request ceiling is 64k tokens overall, of which at most
# 32k may be `state` plus the longest question. `context_window` records the
# 32k state ceiling, because that is the bound a caller has to plan against
# and the one OpenRouter publishes for the route.
# https://docs.typesafe.ai/models, https://openrouter.ai/typesafe
# * Text and structured JSON only; no image, audio, or video input.
# https://docs.typesafe.ai/concepts/system-one
#
# `logical_model` and `equivalence_group` are shared so that cross-route
# equivalence is visible to a human reading the catalog. They are NOT a
# licence to fail a predicate over from one route to another: a decision model
# answers with a probability distribution, and silently re-asking a different
# serving route would change the distribution without changing the receipt.
#
# Availability: Vercel and OpenRouter answered all three question kinds through
# the canonical evaluator on 2026-09-22. Direct TypeSafe access remains
# unverified and its rows retain availability = "unknown".
# Direct TypeSafe, pinned snapshot. Documented, not reached: access is
# waitlisted. https://docs.typesafe.ai/api
[models."typesafe/jev-1.13.0"]
name = "Jev 1.13.0 (TypeSafe)"
blurb = "Answers yes/no, multiple-choice, and rating questions about a shared state in well under a second, and cannot write prose."
provider = "typesafe"
wire_model = "jev-1.13.0"
logical_model = "typesafe-jev-1.13"
equivalence_group = "typesafe-jev-1.13"
served_variant = "direct"
operations = ["decision"]
context_window = 32000
pricing = { input_per_mtok = 0.042, output_per_mtok = 0.0 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap"]
availability = "unknown"
row_kind = "snapshot"
family = "typesafe-jev"
lineage = "typesafe-jev-1"
# Direct TypeSafe, moving selector. `jev-latest` resolves to `jev-1.13.0`
# today. https://docs.typesafe.ai/models
[models."typesafe/jev-latest"]
name = "Jev Latest (TypeSafe)"
blurb = "Follows TypeSafe's current flagship decision model instead of pinning a version."
provider = "typesafe"
wire_model = "jev-latest"
logical_model = "typesafe-jev-1.13"
equivalence_group = "typesafe-jev-1.13"
served_variant = "direct"
operations = ["decision"]
context_window = 32000
pricing = { input_per_mtok = 0.042, output_per_mtok = 0.0 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap"]
availability = "unknown"
row_kind = "selector"
current_snapshot = "typesafe/jev-1.13.0"
family = "typesafe-jev"
lineage = "typesafe-jev-1"
# Vercel AI Gateway. On 2026-09-20 the gateway
# model list carried `typesafe-ai/jev` with `"type": "evaluation"`, and
# `/v1/chat/completions` refused it with `ModelTypeMismatchError`.
# https://vercel.com/docs/ai-gateway/modalities/evaluation
[models."vercel/typesafe-ai/jev"]
name = "Jev (Vercel AI Gateway)"
blurb = "Jev's decision answers over the gateway key Harn already holds, with no separate TypeSafe account."
provider = "vercel_ai_gateway"
wire_model = "typesafe-ai/jev"
logical_model = "typesafe-jev-1.13"
equivalence_group = "typesafe-jev-1.13"
served_variant = "vercel-ai-gateway"
operations = ["decision"]
context_window = 32000
pricing = { input_per_mtok = 0.042, output_per_mtok = 0.0 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap"]
row_kind = "selector"
current_snapshot = "typesafe/jev-1.13.0"
family = "typesafe-jev"
lineage = "typesafe-jev-1"
# OpenRouter /api/alpha/decisions answered boolean, choice and score on
# 2026-09-22. The provider returned typesafe/jev-1.13-20260917, input356/output61,
# and $0.000014952. Receipt identity must use the actual response model, not
# assume the requested route alias is an immutable revision.
# https://openrouter.ai/typesafe
[models."openrouter/typesafe/jev-1.13"]
name = "Jev 1.13 (OpenRouter)"
blurb = "Jev's decision answers through OpenRouter's alpha decisions endpoint."
provider = "openrouter"
wire_model = "typesafe/jev-1.13"
logical_model = "typesafe-jev-1.13"
equivalence_group = "typesafe-jev-1.13"
served_variant = "openrouter"
operations = ["decision"]
context_window = 32000
pricing = { input_per_mtok = 0.042, output_per_mtok = 0.0 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap"]
row_kind = "snapshot"
family = "typesafe-jev"
lineage = "typesafe-jev-1"
# OpenRouter moving selector. On 2026-09-26 a boolean question sent to
# `~typesafe/jev-latest` on /api/alpha/decisions came back from
# typesafe/jev-1.13-20260917. https://openrouter.ai/api/v1/models/~typesafe/jev-latest/endpoints
[models."openrouter/typesafe/jev-latest"]
name = "Jev Latest (OpenRouter)"
blurb = "Follows TypeSafe's current Jev release through OpenRouter's alpha decisions endpoint."
provider = "openrouter"
wire_model = "~typesafe/jev-latest"
logical_model = "typesafe-jev-1.13"
equivalence_group = "typesafe-jev-1.13"
served_variant = "openrouter"
operations = ["decision"]
context_window = 32000
pricing = { input_per_mtok = 0.042, output_per_mtok = 0.0 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap"]
row_kind = "selector"
current_snapshot = "openrouter/typesafe/jev-1.13"
family = "typesafe-jev"
lineage = "typesafe-jev-1"
# --- source: 60-models/99-vercel-ai-gateway.toml ---
# Curated Vercel AI Gateway routes used by Harn's provider probes and Burin's
# model picker. Catalog keys are provider-qualified to avoid colliding with
# direct and OpenRouter routes; `wire_model` is the creator/model slug Vercel
# expects. Prices and context windows come from the Gateway model catalog
# (GET https://ai-gateway.vercel.sh/v1/models) and were re-verified against a
# live read on 2026-09-20: the GPT-5.4 Nano and Claude Haiku 4.5 rows matched
# exactly, and the Gemini Flash Lite route graduated out of preview.
#
# The gateway served 376 models on that read. This file stays a deliberate
# curation of the routes Harn probes, not a mirror of the gateway index.
[models."vercel/openai/gpt-5.4-nano"]
name = "GPT-5.4 Nano (Vercel AI Gateway)"
provider = "vercel_ai_gateway"
operations = ["text_generation", "decision"]
wire_model = "openai/gpt-5.4-nano"
logical_model = "openai-gpt-5.4-nano"
equivalence_group = "openai-gpt-5.4-nano"
served_variant = "vercel-ai-gateway"
api_dialect = "openai_chat"
context_window = 400000
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.25, cache_read_per_mtok = 0.02 }
# No `superseded_by`: the gateway lists openai/gpt-6-luna, but the probe key's
# free-tier team got HTTP 403 "Free tier users do not have access to this
# model" on 2026-10-01, so there is no probed Vercel route to point at yet.
deprecated = true
deprecation_note = "OpenAI shuts down gpt-5.4-nano 2027-04-01 (announced 2026-10-01) and names gpt-6-luna as the replacement; this gateway route ends with it. Vercel lists openai/gpt-6-luna, which Harn has not yet probed on this gateway."
sunset_date = "2027-04-01"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "tool_use", "reasoning"]
[models."vercel/anthropic/claude-haiku-4.5"]
name = "Claude Haiku 4.5 (Vercel AI Gateway)"
provider = "vercel_ai_gateway"
wire_model = "anthropic/claude-haiku-4.5"
logical_model = "anthropic-claude-haiku-4.5"
equivalence_group = "anthropic-claude-haiku-4.5"
served_variant = "vercel-ai-gateway"
api_dialect = "openai_chat"
context_window = 200000
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.00, output_per_mtok = 5.00, cache_read_per_mtok = 0.10, cache_write_per_mtok = 1.25 }
tier = "mid"
open_weight = false
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "vision"]
# Graduated out of preview: the gateway now serves this as
# `google/gemini-3.1-flash-lite` and no longer lists the `-preview` slug. Rates
# and context are unchanged; the record also publishes a cache-read rate the
# preview row did not carry.
[models."vercel/google/gemini-3.1-flash-lite"]
name = "Gemini 3.1 Flash Lite (Vercel AI Gateway)"
provider = "vercel_ai_gateway"
wire_model = "google/gemini-3.1-flash-lite"
logical_model = "google-gemini-3.1-flash-lite"
equivalence_group = "google-gemini-3.1-flash-lite"
served_variant = "vercel-ai-gateway"
api_dialect = "openai_chat"
context_window = 1000000
capabilities = ["tools", "vision", "files", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.25, output_per_mtok = 1.50, cache_read_per_mtok = 0.03 }
# Follows Google's schedule for the model, as the direct gemini-3.1-flash-lite
# row does. No `superseded_by`: no Vercel Gemini 3.5 Flash-Lite route has been
# probed (the probe key's free-tier team gets HTTP 403 on Gemini routes).
deprecated = true
deprecation_note = "Google shuts down gemini-3.1-flash-lite 2027-05-07 and names gemini-3.5-flash-lite as the replacement (https://ai.google.dev/gemini-api/docs/deprecations, read 2026-10-01); this gateway route ends with it."
sunset_date = "2027-05-07"
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "long_context", "tool_use", "reasoning", "vision"]
# --- source: 62-ladders/00-ladders.toml ---
# ── Model ladders ────────────────────────────────────────────────────────────
# Named model-fallback ladders resolved by a `ladder: "<name>"` option on
# `llm_call`. A ladder lowers onto the first-class routing chain: each step is
# one transport attempt, and the loop advances to the NEXT step only on a
# transport-class failure (connection / timeout / 429 / 5xx / throttled-empty).
# Schema-validation failures never advance — they re-ask the same step's model.
#
# Steps are ordered cheapest/first to most-capable/last. `provider` is optional
# and inferred from the model id (or the call's base provider) when omitted.
# Model aliases (haiku / sonnet / opus, resolved via `[aliases]`) are allowed.
[model_ladders.frugal]
label = "frugal: cheap-first with frontier escalation"
steps = [
{ model = "haiku", label = "cheap" },
{ model = "sonnet", label = "mid" },
{ model = "opus", label = "frontier" },
]
# Canonical route policies consumed by std/agent presets. Volatile model
# identity belongs here; preset code carries only these stable policy names.
[model_ladders.agent_frontier]
label = "agent frontier route with transport fallback"
steps = [
{ model = "claude-opus-5-5", provider = "anthropic", label = "frontier" },
{ model = "claude-sonnet-5-5", provider = "anthropic", label = "fallback" },
]
[model_ladders.agent_cheap]
label = "low-cost agent summary and verification route"
steps = [
{ model = "gpt-4o-mini", provider = "openai", label = "cheap" },
]
# The sitrep, judge and approval-reviewer rows below (and the Anthropic QC
# default) stay on Claude Haiku 4.5 rather than the `haiku` alias's Haiku 5.5:
# std/agent/sitrep sends temperature 0.2 and the judge task profile sends 0.0,
# and Haiku 5.5 rejects any non-default sampling parameter, which Harn refuses
# locally as a terminal capability denial. Moving these roles needs those
# callers to stop authoring temperature on routes that decline it first.
#
# Reverse-chronological cheap summarizers used by std/agent/sitrep. The stdlib
# filters these routes by provider availability but never owns their model IDs.
[model_ladders.sitrep]
label = "sitrep summarizers, newest and strongest first"
steps = [
{ provider = "anthropic", model = "claude-haiku-4-5-20251001" },
{ provider = "openai", model = "gpt-4o-mini" },
{ provider = "gemini", model = "gemini-3.5-flash-lite" },
{ provider = "openrouter", model = "google/gemini-3.5-flash-lite" },
{ provider = "deepseek", model = "deepseek-flash" },
{ provider = "groq", model = "qwen/qwen3.8-27b" },
{ provider = "cerebras", model = "gpt-oss-120b" },
{ provider = "together", model = "Qwen/Qwen3-Coder-Next-FP8" },
{ provider = "ollama", model = "llama3.2" },
{ provider = "local", model = "gemma-4-e4b-it" },
{ provider = "mock", model = "mock" },
]
# The default judge role. `std/agent/judge` resolves a judge's model here when
# the judge's own configuration does not name one, so that the simplest
# harness -- `turn_end_condition: true` and nothing else -- still grades with a
# model, and never with the actor's own (harn#7937, harn#7910).
#
# This ladder is NOT a fallback chain. Each step is the judge model for ONE
# provider family, and resolution picks the step matching the judge's (or the
# run's) provider. There is deliberately no cross-provider fallthrough: a run
# on a provider with no judge row gets a typed refusal naming the missing
# setting, not a judge dispatched against a provider the caller never chose.
#
# Rows are cheap, capable, instruction-following models -- a judge reads a
# short transcript and returns one small JSON verdict.
[model_ladders.judge]
label = "default judge model per provider family"
steps = [
{ provider = "anthropic", model = "claude-haiku-4-5-20251001", label = "anthropic" },
{ provider = "openai", model = "gpt-4o-mini", label = "openai" },
{ provider = "gemini", model = "gemini-3.5-flash-lite", label = "gemini" },
{ provider = "openrouter", model = "google/gemini-3.5-flash-lite", label = "openrouter" },
{ provider = "deepseek", model = "deepseek-flash", label = "deepseek" },
{ provider = "groq", model = "qwen/qwen3.8-27b", label = "groq" },
{ provider = "cerebras", model = "gpt-oss-120b", label = "cerebras" },
{ provider = "together", model = "Qwen/Qwen3-Coder-Next-FP8", label = "together" },
{ provider = "mock", model = "mock-judge-default", label = "mock" },
]
# The approval reviewer's cheap tier. `std/agent/approval_review` resolves an
# approval reviewer here when the caller's policy names no reviewer model and
# the reviewer runs inside a loop. It keeps the loop's PROVIDER, whose
# credential the run already holds, and trades the loop's model for this row:
# a decision is one short structured verdict, and a frontier loop otherwise
# pays frontier prices for every one of them.
#
# Like `judge`, this is a per-family table, not a fallback chain. A provider
# with no row keeps the loop's own route; the reviewer never moves to a
# provider the run holds no credential for.
[model_ladders.approval_reviewer]
label = "cheap approval reviewer model per provider family"
steps = [
{ provider = "anthropic", model = "claude-haiku-4-5-20251001", label = "anthropic" },
{ provider = "openai", model = "gpt-4o-mini", label = "openai" },
{ provider = "gemini", model = "gemini-3.5-flash-lite", label = "gemini" },
{ provider = "openrouter", model = "google/gemini-3.5-flash-lite", label = "openrouter" },
{ provider = "fireworks", model = "accounts/fireworks/models/gpt-oss-120b", label = "fireworks" },
{ provider = "deepseek", model = "deepseek-flash", label = "deepseek" },
{ provider = "groq", model = "qwen/qwen3.8-27b", label = "groq" },
{ provider = "cerebras", model = "gpt-oss-120b", label = "cerebras" },
{ provider = "together", model = "Qwen/Qwen3-Coder-Next-FP8", label = "together" },
{ provider = "mock", model = "mock-approval-reviewer", label = "mock" },
]