# @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.
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"
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"
# 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"
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",
"vercel_ai_gateway",
"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 is the only catalog provider with a per-request control over
# training as well as 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."
[[providers.openrouter.data_controls.request_controls]]
location = "body"
name = "provider.data_collection"
value = "deny"
effect = "training"
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"
# 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.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"
provider = "anthropic"
[aliases.sonnet5]
id = "claude-sonnet-5"
provider = "anthropic"
# Previous Sonnet generation, kept addressable for pinned workflows.
[aliases.sonnet46]
id = "claude-sonnet-4-6"
provider = "anthropic"
[aliases.opus]
id = "claude-opus-5"
provider = "anthropic"
[aliases.opus5]
id = "claude-opus-5"
provider = "anthropic"
# Previous Opus generation, kept addressable for pinned workflows.
[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), 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-4-5-20251001"
provider = "anthropic"
[aliases.frontier]
id = "claude-sonnet-5"
provider = "anthropic"
[aliases."tier/frontier"]
id = "claude-sonnet-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"
[aliases."openai/mid"]
id = "gpt-5.6-terra"
provider = "openai"
[aliases."openai/frontier"]
id = "gpt-5.6-sol"
provider = "openai"
[aliases."openai/small"]
id = "gpt-5.6-luna"
provider = "openai"
# Preserve OpenAI's public 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"
# GPT-6 ships a single model, so the family alias and the marketing name both
# resolve to the one id. Kept as aliases rather than extra catalog rows so
# receipts and cost projections stay on the canonical `gpt-6-astra`.
[aliases."gpt-6"]
id = "gpt-6-astra"
provider = "openai"
[aliases.astra]
id = "gpt-6-astra"
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"
# probed 2026-06-24 (provider-tool-mode-sweep): native AND fenced-JSON both
# corrupt backslash bodies (0/5), heredoc text 5/5 byte-clean. Pin text.
[aliases."sambanova-minimax-m2.7"]
id = "sambanova/MiniMax-M2.7"
provider = "sambanova"
tool_format = "text"
# 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.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-3-nano-30b-a3b"
provider = "nvidia"
tool_format = "native"
# NIM end-of-lifed both undated DeepSeek V4 builds on 2026-08-07. This alias
# follows NIM to the dated Flash snapshot. There is no NIM DeepSeek V4 Pro
# build to point at.
[aliases."nvidia-deepseek-v4-flash"]
id = "nvidia/deepseek-v4-flash-0731"
provider = "nvidia"
tool_format = "native"
[aliases."nvidia-minimax-m3"]
id = "nvidia/minimax-m3"
provider = "nvidia"
tool_format = "native"
[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"
[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 V4 direct API aliases.
[aliases.deepseek]
id = "deepseek-v4-flash"
provider = "deepseek"
[aliases."deepseek-flash"]
id = "deepseek-v4-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"
[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"
# Groq LPU speed route for Qwen3.6 (native tool calls, ~500 tok/s).
[aliases."groq-qwen3.6"]
id = "qwen/qwen3.6-27b"
provider = "groq"
tool_format = "native"
[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-preview"
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
# Moonshot's direct Kimi K2.5 route accepts only temperature 1.
[model_defaults."moonshot/kimi-k2.5"]
temperature = 1.0
# 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/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-5.6-luna"
openrouter = "google/gemini-2.5-flash"
ollama = "llama3.2"
# `local` previously pointed at gpt-4o — a hosted (and now sunset)
# OpenAI model that no local OpenAI-compat server would 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 = "qwen/qwen3.6-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-v4-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-5-6]
label = "GPT-5.6"
plain_description = "Choose a model size and how much time it spends reasoning."
[[presentation.families.openai-gpt-5-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-5.6-luna" },
{ value = "terra", label = "Terra", plain_description = "Balanced capability, speed, and cost.", relative_cost_hint = 3, relative_speed_hint = 3, model_id = "gpt-5.6-terra" },
{ value = "sol", label = "Sol", plain_description = "Most capable and most expensive for difficult work.", relative_cost_hint = 5, relative_speed_hint = 1, model_id = "gpt-5.6-sol" },
]
[[presentation.families.openai-gpt-5-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 = "none", label = "None", plain_description = "Respond directly without extra reasoning.", relative_cost_hint = 1, relative_speed_hint = 5 },
{ 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 = "Deep reasoning for complex tasks.", relative_cost_hint = 4, relative_speed_hint = 2 },
{ value = "max", label = "Maximum", plain_description = "Most reasoning for the hardest tasks.", relative_cost_hint = 5, relative_speed_hint = 1 },
]
[[presentation.families.openai-gpt-5-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-5-6.presets]]
id = "balanced"
label = "Balanced"
plain_blurb = "A practical default for everyday coding and analysis."
coordinates = { variant = "terra", effort = "medium" }
[[presentation.families.openai-gpt-5-6.presets]]
id = "deep"
label = "Deep"
plain_blurb = "Maximum capability and reasoning for the hardest work."
coordinates = { variant = "sol", effort = "max" }
# --- 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`.
# Anthropic ─ pricing pages: https://www.anthropic.com/pricing &
# https://platform.claude.com/docs/en/about-claude/model-deprecations.
# Verified 2026-07-02 against the provider /v1/models API and the
# deprecations page: Sonnet 4 / Opus 4 are retired, Opus 4.1 is deprecated
# (retires 2026-08-05), Opus 3 is retired, dated Sonnet 4.5 remains active,
# and Sonnet 5 joined the lineup. 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 }
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"]
[models."claude-haiku-4-5-20251001"]
name = "Claude Haiku 4.5"
provider = "anthropic"
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 }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
[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 }
deprecated = true
deprecation_note = "Retired 2025-10-28 per Anthropic deprecations page. Use claude-sonnet-4-5-20250929 or 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 }
deprecated = true
deprecation_note = "Retired 2025-10-28 per Anthropic deprecations page. Use claude-sonnet-4-5-20250929 or 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 }
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 }
deprecated = true
deprecation_note = "Undated compatibility selector. Anthropic's active API id is claude-sonnet-4-5-20250929; prefer that dated id or claude-sonnet-4-6."
superseded_by = "claude-sonnet-4-5-20250929"
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 }
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"
[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 }
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-05) — the current 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. Introductory pricing ($2 / $10 per MTok in/out,
# cache read 0.1x, 5-min cache write 1.25x) runs through 2026-08-31;
# standard $3 / $15 applies from 2026-09-01 — update this row then.
[models."claude-sonnet-5"]
name = "Claude Sonnet 5"
provider = "anthropic"
context_window = 1000000
equivalence_group = "frontier-agent-coding"
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 }
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 }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
[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 }
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 }
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 }
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 }
deprecated = true
deprecation_note = "Retired 2026-01-05 per Anthropic deprecations page. Harn recommends claude-opus-5."
superseded_by = "claude-opus-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 }
deprecated = true
deprecation_note = "Sunset 2026-06-15 per Anthropic deprecations page. Harn recommends claude-opus-5."
superseded_by = "claude-opus-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 }
deprecated = true
deprecation_note = "Deprecated 2026-06-05 per Anthropic deprecations page; retired 2026-08-05. Harn recommends claude-opus-5."
superseded_by = "claude-opus-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 }
superseded_by = "claude-opus-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 }
superseded_by = "claude-opus-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 }
superseded_by = "claude-opus-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 }, 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; the current `opus` alias target. 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 }
superseded_by = "claude-opus-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 }, 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) — the current Opus generation and the
# `opus` alias target: 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 }
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 }, 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 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
[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 }
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 }
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 }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "long_context", "agentic"]
complementary_with = ["openai-gpt", "google-gemini", "qwen", "deepseek", "kimi"]
# --- 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,
# the gpt-5.4 tier family, and gpt-5.3-codex for agentic coding. The entire
# GPT-4/o-series legacy exits by 2026-10-23 (announced 2026-04-22), and
# the gpt-5 dated snapshots plus o3/o3-pro shut down 2026-12-11
# (announced 2026-06-11).
# 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 }] }
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-5.6 — current OpenAI family. 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 }] }
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 }] }
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 }] }
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 — current OpenAI frontier (Responses + Chat Completions).
# 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 }] }
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 }] }
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-mini is the modern `mid` tier default;
# gpt-5.4-nano is the cheapest current 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 }] }
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 }] }
tier = "frontier"
open_weight = false
strengths = ["reasoning", "coding", "tool_use", "long_context", "vision", "agentic"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
[models."gpt-5.4-mini"]
name = "GPT-5.4 Mini"
provider = "openai"
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 }
tier = "mid"
open_weight = false
strengths = ["speed", "cheap", "coding", "tool_use", "summarization"]
complementary_with = ["anthropic-claude", "google-gemini", "qwen", "deepseek", "kimi"]
[models."gpt-5.4-nano"]
name = "GPT-5.4 Nano"
provider = "openai"
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 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "summarization", "tool_use"]
# GPT-5.3-Codex — agentic-coding tune (released 2026-02-05). OpenAI now
# recommends gpt-5.5 for most Codex tasks; kept for cost-sensitive
# coding loops.
[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 }
tier = "frontier"
open_weight = false
strengths = ["coding", "tool_use", "agentic"]
# GPT-4o retired from ChatGPT 2026-02-13; chatgpt-4o-latest removed
# from API 2026-02-17 (Enterprise/Edu grace until 2026-04-03).
[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 }
deprecated = true
deprecation_note = "API sunset 2026-02-17 per OpenAI deprecations page. Switch to gpt-5.4-mini for cheap routing or gpt-5.5 for frontier."
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 }
# No individually announced sunset as of 2026-07-02, but the GPT-4-era
# legacy exits by 2026-10-23 per the 2026-04-22 deprecations
# announcement. The `mid` tier default moved to gpt-5.4-mini.
superseded_by = "gpt-5.4-mini"
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 }
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 = "Superseded by gpt-5 family. Listed for cost-attribution backfill only."
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. Use gpt-5.5."
superseded_by = "gpt-5.5"
tier = "reasoning"
open_weight = false
strengths = ["reasoning"]
[models."o1-mini"]
name = "OpenAI o1-mini"
provider = "openai"
context_window = 128000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 1.10, output_per_mtok = 4.40, cache_read_per_mtok = 0.55 }
deprecated = true
deprecation_note = "Legacy o-series; the GPT-4/o-series legacy exits by 2026-10-23 per OpenAI deprecations page. Use gpt-5.4-mini."
superseded_by = "gpt-5.4-mini"
tier = "reasoning"
open_weight = false
strengths = ["reasoning", "cheap"]
[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. Use gpt-5.5."
superseded_by = "gpt-5.5"
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 }
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."
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 }] }
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 }] }
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 }] }
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 }
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 }
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 }] }
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." },
]
[models."gemini-3.1-flash-lite"]
name = "Gemini 3.1 Flash-Lite"
provider = "gemini"
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 }
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 — kept as distinct
# catalog entry so the `qc_defaults.openrouter` lookup resolves to a
# registered ID. Pricing matches the native Gemini API; OpenRouter adds
# its own margin at request time.
[models."google/gemini-2.5-flash"]
name = "Gemini 2.5 Flash (via OpenRouter)"
provider = "openrouter"
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 }
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"]
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 }] }
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"]
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.375, output_per_mtok = 1.875, cache_read_per_mtok = 0.0375, cache_write_per_mtok = 0.0208333333333333 }] }
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"]
pricing = { input_per_mtok = 0.30, output_per_mtok = 2.50, cache_read_per_mtok = 0.03 }
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"]
pricing = { input_per_mtok = 1.50, output_per_mtok = 9.00, cache_read_per_mtok = 0.15 }
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"]
[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"]
[models."mistralai/mistral-large-2512"]
name = "Mistral Large 3 2512"
provider = "openrouter"
context_window = 262144
logical_model = "mistral-large-3-2512"
equivalence_group = "mistral-large-3-2512"
served_variant = "openrouter"
api_dialect = "openai_chat"
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"]
[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.
[models."qwen/qwen3-coder"]
name = "Qwen3 Coder 480B A35B"
provider = "openrouter"
context_window = 262144
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.22, output_per_mtok = 1.80 }
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.11, 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.385, output_per_mtok = 2.45 }
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.18, output_per_mtok = 0.18 }
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 = 131072
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.2288, output_per_mtok = 0.3432 }
tier = "mid"
open_weight = true
strengths = ["coding", "tool_use", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[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.68, output_per_mtok = 3.41, cache_read_per_mtok = 0.34 }
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.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"]
[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.15, output_per_mtok = 0.60 }
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`.
[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 }
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"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 3.75, cache_read_per_mtok = 0.25, cache_write_per_mtok = 1.5625 }
# 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"]
[models."kwaipilot/kat-coder-pro-v2"]
name = "KAT-Coder-Pro V2"
provider = "openrouter"
context_window = 256000
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 = 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 = 256000
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"]
# --- 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.
[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.50, output_per_mtok = 6.25, cache_read_per_mtok = 0.50 }
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 = 1.25, output_per_mtok = 3.75, cache_read_per_mtok = 0.125 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."deepseek-ai/DeepSeek-V4-Pro"]
name = "DeepSeek V4 Pro (Together)"
provider = "together"
context_window = 512000
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.74, output_per_mtok = 3.48, cache_read_per_mtok = 0.20 }
deprecated = true
deprecation_note = "Together retires this preview route on 2026-08-27. Use deepseek-ai/DeepSeek-V4-Pro-0813."
sunset_date = "2026-08-27"
superseded_by = "deepseek-ai/DeepSeek-V4-Pro-0813"
tier = "frontier"
open_weight = true
strengths = ["agentic", "coding", "long_context", "tool_use", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "deepseek"]
# 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 = 1050000
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 }
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.
[models."moonshotai/Kimi-K2.7-Code"]
name = "Kimi K2.7 Code (Together)"
provider = "together"
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"]
[models."MiniMaxAI/MiniMax-M2.7"]
name = "MiniMax M2.7 (Together)"
provider = "together"
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).
[models."Qwen/Qwen2.5-7B-Instruct-Turbo"]
name = "Qwen2.5 7B Instruct Turbo (Together)"
provider = "together"
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 = 0.88, output_per_mtok = 0.88 }
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; GLM 4.7 is the
# public preview coding/agentic route.
#
# 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. Its public model record is the source for the
# context window, capabilities, and per-token rates below.
[models."gemma-4-31b"]
name = "Gemma 4 31B (Cerebras)"
provider = "cerebras"
context_window = 131072
logical_model = "gemma-4-31b"
equivalence_group = "gemma-4-31b"
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 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "vision", "tool_use", "reasoning"]
[models."zai-glm-4.7"]
name = "Z.ai GLM 4.7 (Cerebras)"
provider = "cerebras"
context_window = 131072
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 2.25, output_per_mtok = 2.75 }
deprecated = true
deprecation_note = "Absent from Cerebras public model discovery on 2026-08-22. Use glm-5.3 on Z.AI or OpenRouter."
superseded_by = "glm-5.3"
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning"]
[models."llama-3.3-70b"]
name = "Llama 3.3 70B (Cerebras, dedicated legacy)"
provider = "cerebras"
context_window = 131072
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.85, output_per_mtok = 1.20 }
availability = "dedicated"
deprecated = true
deprecation_note = "Cerebras no longer returns this model from public discovery; use a provisioned dedicated endpoint alias if your organization still serves these weights."
# Inline metadata keeps this deprecated legacy route independent of
# fragment-order defaults.
tier = "mid"
open_weight = true
strengths = ["tool_use"]
# --- 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.
# 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"]
[models."MiniMax-Text-01"]
name = "MiniMax Text 01"
provider = "minimax"
context_window = 1000000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 1.10 }
deprecated = true
deprecation_note = "Dead on api.minimax.io 2026-06-28 (harn#3645 §4): HTTP 500 'token plan not support model (2061)' and absent from GET /v1/models. Use MiniMax-M2 (or M2.5/M2.7)."
superseded_by = "MiniMax-M2"
# 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).
tier = "mid"
open_weight = true
strengths = ["long_context"]
[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.25, output_per_mtok = 1.00 }
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 = 205000
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.90 }
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.33, output_per_mtok = 1.20 }
# 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-08-22 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, and glm-5.3-flash. 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 = 202752
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 1.20, output_per_mtok = 4.00 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic"]
[models."z-ai/glm-5.1"]
name = "GLM 5.1 (via OpenRouter)"
provider = "openrouter"
context_window = 202752
equivalence_group = "frontier-agent-coding"
capabilities = ["tools", "streaming"]
pricing = { input_per_mtok = 0.98, output_per_mtok = 3.08 }
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.966, output_per_mtok = 3.036, cache_read_per_mtok = 0.1932 }
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.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."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"]
# OpenRouter's public model endpoint reports the direct launch rates and the
# same 1M-token serving window. Preserve Z.AI's list price as the durable base
# so cost accounting restores it automatically when the promotion expires.
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://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"]
[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 }
# 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 V4 family ─ pricing pages: api-docs.deepseek.com/quick_start/pricing.
# Both V4 models share a 1M-token context window and 384K-token output
# cap. DeepSeek's 2026-04-24 V4 notice says to keep the base_url and use
# `deepseek-v4-flash` or `deepseek-v4-pro`; `deepseek-chat` and
# `deepseek-reasoner` become inaccessible after 2026-07-24 15:59 UTC.
[models."deepseek-v4-flash"]
name = "DeepSeek V4 Flash"
provider = "deepseek"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.14, output_per_mtok = 0.28, cache_read_per_mtok = 0.0028 }
tier = "mid"
open_weight = true
strengths = ["speed", "cheap", "tool_use", "reasoning", "long_context"]
benchmarks = { aa_intelligence_index = 58.0 }
[models."deepseek-v4-pro"]
name = "DeepSeek V4 Pro"
provider = "deepseek"
context_window = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.435, output_per_mtok = 0.87, cache_read_per_mtok = 0.003625 }
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-08-15. 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.06426, output_per_mtok = 0.12852, cache_read_per_mtok = 0.012852 }
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 = 1.168, output_per_mtok = 2.336, cache_read_per_mtok = 0.09855 }
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 at the direct DeepSeek rate card, so
# `deepseek-v4-pro-0813` is currently ~2.7x CHEAPER than the undated
# `deepseek/deepseek-v4-pro` alias for identical weights.
[models."deepseek/deepseek-v4-pro-0813"]
name = "DeepSeek V4 Pro 0813 (via OpenRouter)"
provider = "openrouter"
context_window = 1048576
capabilities = ["tools", "streaming", "prompt_caching"]
pricing = { input_per_mtok = 0.435, output_per_mtok = 0.87, cache_read_per_mtok = 0.003625 }
tier = "frontier"
open_weight = true
strengths = ["reasoning", "coding", "tool_use", "long_context"]
[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.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"]
# Open-router Qwen3.5 9B (kept for the `small` tier alias).
[models."Qwen/Qwen3.5-9B"]
name = "Qwen3.5 9B"
provider = "openrouter"
wire_model = "qwen/qwen3.5-9b"
context_window = 131072
capabilities = ["tools", "streaming"]
# 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 }
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"]
pricing = { input_per_mtok = 0.325, output_per_mtok = 1.95 }
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.14, output_per_mtok = 1.00 }
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.12, output_per_mtok = 0.37 }
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.06, output_per_mtok = 0.33 }
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"]
[models."google/gemma-4-31B-it"]
name = "Gemma 4 31B (Together)"
provider = "together"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking"]
pricing = { input_per_mtok = 0.20, output_per_mtok = 0.50 }
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"]
pricing = { input_per_mtok = 0.15, output_per_mtok = 0.60 }
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"]
[models."accounts/fireworks/models/glm-5p2"]
name = "GLM 5.2 (Fireworks)"
provider = "fireworks"
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"]
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/deepseek-v4-pro"]
name = "DeepSeek V4 Pro (Fireworks)"
provider = "fireworks"
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"]
[models."accounts/fireworks/models/kimi-k2p6"]
name = "Kimi K2.6 (Fireworks)"
provider = "fireworks"
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"]
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"]
[models."accounts/fireworks/models/kimi-k2p7-code"]
name = "Kimi K2.7 Code (Fireworks)"
provider = "fireworks"
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"]
[models."qwen/qwen3.6-27b"]
name = "Qwen3.6 27B (Groq)"
provider = "groq"
context_window = 131072
logical_model = "qwen3.6-27b"
equivalence_group = "qwen3.6-27b"
served_variant = "groq-lpu"
wire_model = "qwen/qwen3.6-27b"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
# ~500 output tok/s on Groq LPUs; rate verified 2026-07-02 on
# groq.com/pricing. Dense 27B, hybrid Gated DeltaNet+Attention; SWE-bench
# Verified 77.2 per the Qwen3.6-27B model card.
pricing = { input_per_mtok = 0.60, output_per_mtok = 3.00, cache_read_per_mtok = 0.30 }
architecture = { parameter_count_b = 27.0, moe = false, license = "Apache-2.0", source_url = "https://huggingface.co/Qwen/Qwen3.6-27B", last_verified = "2026-07-02" }
benchmarks = { swe_bench_verified = 77.2 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "tool_use", "agentic"]
[models."qwen/qwen3.8-27b"]
name = "Qwen3.8 27B (Groq)"
provider = "groq"
context_window = 131042
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.
pricing = { input_per_mtok = 0.80, output_per_mtok = 4.00 }
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "tool_use", "reasoning", "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 }
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"]
[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 }
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"]
[models."deepinfra/Qwen/Qwen3.8-2.4T-A95B"]
name = "Qwen3.8 2.4T A95B (DeepInfra)"
provider = "deepinfra"
wire_model = "Qwen/Qwen3.8-2.4T-A95B"
logical_model = "qwen3.8-2.4t-a95b"
equivalence_group = "qwen3.8-2.4t-a95b"
served_variant = "deepinfra"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
# DeepInfra's authenticated model inventory and live usage receipts agreed on
# this rate and context window on 2026-08-26.
pricing = { input_per_mtok = 2.00, output_per_mtok = 6.00, cache_read_per_mtok = 0.20 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[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 = 163840
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 }
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 = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.09, output_per_mtok = 0.18 }
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"]
[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.30 }
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.50, output_per_mtok = 1.50 }
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.95, output_per_mtok = 3.00, cache_read_per_mtok = 0.18 }
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 = 1000000
capabilities = ["tools", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 1.25, output_per_mtok = 3.75, cache_read_per_mtok = 0.125 }
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "tool_use", "long_context", "cheap"]
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.74, output_per_mtok = 3.50 }
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.15, output_per_mtok = 0.60 }
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 ------------------------------
[models."sambanova/DeepSeek-V4-Pro"]
name = "DeepSeek V4 Pro (SambaNova)"
provider = "sambanova"
wire_model = "DeepSeek-V4-Pro"
logical_model = "deepseek-v4-pro"
equivalence_group = "deepseek-v4-pro"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 163840
capabilities = ["tools", "streaming", "thinking"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 1.20 }
deprecated = true
deprecation_note = "Not returned from SambaNova /v1/models on 2026-06-20. Use sambanova/DeepSeek-V3.2 or another DeepSeek V4 Pro host."
superseded_by = "sambanova/DeepSeek-V3.2"
tier = "frontier"
open_weight = true
strengths = ["speed", "reasoning", "coding", "tool_use", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[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 }
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.0, 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/Llama-4-Maverick"]
name = "Llama 4 Maverick (SambaNova)"
provider = "sambanova"
wire_model = "Llama-4-Maverick-17B-128E-Instruct"
logical_model = "llama-4-maverick"
equivalence_group = "llama-4-maverick"
served_variant = "sambanova-rdu"
api_dialect = "openai_chat"
context_window = 131072
capabilities = ["tools", "vision", "streaming"]
pricing = { input_per_mtok = 0.63, output_per_mtok = 1.80 }
deprecated = true
deprecation_note = "Not returned from SambaNova /v1/models on 2026-06-20. Use sambanova/Meta-Llama-3.3-70B-Instruct for the live Llama route."
superseded_by = "sambanova/Meta-Llama-3.3-70B-Instruct"
tier = "mid"
open_weight = true
strengths = ["speed", "vision", "tool_use", "long_context", "cheap"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "deepseek", "kimi"]
[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"]
[models."nvidia/nemotron-3-nano-30b-a3b"]
name = "Nemotron 3 Nano 30B A3B (NVIDIA NIM)"
provider = "nvidia"
context_window = 262144
logical_model = "nemotron-3-nano-30b-a3b"
equivalence_group = "nemotron-3-nano-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-3-nano-30b-a3b/modelcard", last_verified = "2026-06-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). It still serves the dated Flash snapshot,
# so that row survives below. 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.
[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"]
tier = "mid"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
complementary_with = ["anthropic-claude", "openai-gpt", "google-gemini", "qwen", "kimi"]
[models."nvidia/minimax-m3"]
name = "MiniMax M3 (NVIDIA NIM)"
provider = "nvidia"
wire_model = "minimaxai/minimax-m3"
context_window = 1048576
logical_model = "minimax-m3"
equivalence_group = "minimax-m3"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "video", "streaming", "thinking", "prompt_caching"]
pricing = { input_per_mtok = 0.60, output_per_mtok = 2.40, cache_read_per_mtok = 0.12 }
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "tool_use", "reasoning", "long_context", "vision"]
[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"]
[models."nvidia/openai/gpt-oss-120b"]
name = "GPT-OSS 120B (NVIDIA NIM)"
provider = "nvidia"
wire_model = "openai/gpt-oss-120b"
context_window = 131072
logical_model = "openai-gpt-oss-120b"
equivalence_group = "openai-gpt-oss-120b"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "streaming", "thinking"]
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 = ["cheap", "tool_use", "reasoning"]
[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"]
[models."nvidia/step-3.7-flash"]
name = "Step 3.7 Flash (NVIDIA NIM)"
provider = "nvidia"
wire_model = "stepfun-ai/step-3.7-flash"
context_window = 131072
logical_model = "step-3.7-flash"
equivalence_group = "step-3.7-flash"
served_variant = "nvidia-nim"
api_dialect = "openai_chat"
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
tier = "frontier"
open_weight = false
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
# --- 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"]
# --- 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.
# 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.
[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.50 }
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.50 }
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 }
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.
[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 }] }
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 = 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", "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 }
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 }
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 }
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 }
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 }
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 }
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"
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"]
[models."openai/gpt-5.4-nano"]
name = "GPT-5.4 Nano (via OpenRouter)"
provider = "openrouter"
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 }
tier = "small"
open_weight = false
strengths = ["speed", "cheap", "tool_use", "reasoning"]
[models."anthropic/claude-opus-4.8-fast"]
name = "Claude Opus 4.8 Fast (via OpenRouter)"
provider = "openrouter"
context_window = 1000000
capabilities = ["tools", "vision", "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 }
tier = "frontier"
open_weight = false
strengths = ["agentic", "coding", "tool_use", "reasoning", "vision", "long_context"]
[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"]
[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 }
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 }
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.04, output_per_mtok = 6.24, cache_write_per_mtok = 1.30 }
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"]
[models."moonshot/kimi-k2.5"]
name = "Kimi K2.5 (Moonshot direct)"
provider = "moonshot"
wire_model = "kimi-k2.5"
logical_model = "moonshot-kimi-k2.5"
equivalence_group = "moonshot-kimi-k2.5"
served_variant = "moonshot-direct"
api_dialect = "openai_chat"
context_window = 262144
capabilities = ["tools", "vision", "streaming", "thinking", "prompt_caching"]
deprecated = true
deprecation_note = "Moonshot /v1/models still lists kimi-k2.5, but Kimi K2.6 and K2.7 Code are the active agent routes."
superseded_by = "moonshot/kimi-k2.6"
tier = "frontier"
open_weight = true
strengths = ["coding", "agentic", "long_context", "tool_use", "reasoning", "vision"]
# 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"]
[models."openai/gpt-oss-20b"]
name = "GPT-OSS 20B (Together)"
provider = "together"
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"]
[models."Qwen/Qwen3.5-397B-A17B"]
name = "Qwen3.5 397B A17B (Together)"
provider = "together"
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.
[models."together/nvidia/nemotron-3-ultra-550b-a55b"]
name = "Nemotron 3 Ultra 550B A55B (Together)"
provider = "together"
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.10 }
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.40, output_per_mtok = 2.00 }
tier = "frontier"
open_weight = true
strengths = ["speed", "coding", "agentic", "tool_use", "reasoning", "long_context"]
[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.43, output_per_mtok = 1.74, cache_read_per_mtok = 0.08 }
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-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 and
# were verified on 2026-07-17.
[models."vercel/openai/gpt-5.4-nano"]
name = "GPT-5.4 Nano (Vercel AI Gateway)"
provider = "vercel_ai_gateway"
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 }
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"]
[models."vercel/google/gemini-3.1-flash-lite-preview"]
name = "Gemini 3.1 Flash Lite Preview (Vercel AI Gateway)"
provider = "vercel_ai_gateway"
wire_model = "google/gemini-3.1-flash-lite-preview"
logical_model = "google-gemini-3.1-flash-lite-preview"
equivalence_group = "google-gemini-3.1-flash-lite-preview"
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 }
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", provider = "anthropic", label = "frontier" },
{ model = "claude-sonnet-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" },
]
# 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-2.5-flash" },
{ provider = "deepseek", model = "deepseek-v4-flash" },
{ provider = "groq", model = "qwen/qwen3.6-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-2.5-flash", label = "openrouter" },
{ provider = "deepseek", model = "deepseek-v4-flash", label = "deepseek" },
{ provider = "groq", model = "qwen/qwen3.6-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" },
]