diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0efd44..0f15243 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,11 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.12" + - name: Isolamento Linux para testes do loop + run: sudo apt-get update && sudo apt-get install -y bubblewrap - name: Lint das skills, agentes e hooks run: python3 qa/lint_skills.py - name: Testes do gate e dos hooks run: python3 qa/test_gate.py + - name: Testes comportamentais de catálogo, roteador, adapters e loop + run: python3 -m unittest discover -s qa -p 'test_*.py' -q diff --git a/CHANGELOG.md b/CHANGELOG.md index 2873b3c..7ed938e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## Unreleased (2026-09-25) + +### Added +- Catalog sync/list/route for OpenCode and OMP with exact model IDs, public Zen/Go sources, OpenRouter reference tariffs, manually audited Artificial Analysis v1.5/account evidence, provenance, fixed score bands and fail-closed billing checks. +- Opt-in external goal loop with protected evaluator, isolated detached git worktrees, current quality-gate verification, budgets, evidence, stop/resume and no automatic merge or publish. +- Native OMP package installation with seven agents and skills; Hermes remains skills-only. Claude Code/OpenCode/OMP goal-loop runners use constrained role tools. +- Full 2026-09-25 Zen/Go catalog CSV with public-source hashes, missing-score/price coverage and account-eligibility exclusions; CLI and integration regressions. + +### Security +- Autonomous evaluator and quality gate require Linux bubblewrap and run without network access; agent CLIs retain network access for their configured providers. Neither the worktree nor this sandbox guarantees provider-only egress. +- Detached attempts keep `.git` read-only to untrusted processes, revalidate the worktree before staging, and gate/score separate clean copies of each candidate commit. Unreported paid usage blocks automatic resume. +- OMP discovery and dispatch validate each advertised thinking level and preserve slash-bearing model IDs; routing requires a matching exact harness or explicit proxy approval and an explicit budget for Zen. OpenRouter long-context overrides affect comparative costs, and archived CSV staleness can be replayed at a fixed UTC time. + ## 2.0.0 (2026-09-24) ### Added diff --git a/README.md b/README.md index b04abc9..a3eba41 100644 --- a/README.md +++ b/README.md @@ -2,125 +2,208 @@ # Dev Workflows -**A Claude Code plugin (also for opencode and Hermes Agent) that sizes the process to the request**: a router picks the tier, least-privilege agents do the work, and a deterministic quality gate decides when it is done. +**A proportional development workflow for coding agents.** + +Claude Code plugin · OpenCode and OMP adapters · Hermes skills-only installation [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Agent Skills](https://img.shields.io/badge/Agent%20Skills-1.0-8A2BE2)](https://agentskills.io) [![CI](https://github.com/evandrodevbr/dev-workflows/actions/workflows/ci.yml/badge.svg)](.github/workflows/ci.yml) -**🇧🇷 [Ler em português](README.pt-BR.md)** +[Português (Brasil)](README.pt-BR.md) + +[Overview](#overview) · [Install](#install) · [Daily workflow](#daily-workflow) · +[Goal loop](#optional-goal-driven-loop) · [Model routing](#model-catalog-and-routing) · +[Safety](#safety-and-limitations) ---- +## Overview -## Why +Agents can write code quickly; deciding **how much process a change needs** and **whether it was actually verified** is harder. Dev Workflows supplies a small workflow router, least-privilege agents, and a deterministic quality gate. Two separate command-line tools add model discovery and goal-driven iteration when you explicitly use them. -Agents write code fast and are bad at two things: knowing when a task deserves more process, and -admitting what they did not verify. This plugin handles both: - -- **Process proportional to the request.** A typo does not get a design review; an auth change does. -- **Proof, not claims.** "Done" requires a quality-gate report on the current diff. A tool that is not installed shows up as *unverified*, never as passed. -- **Least code.** Reuse before writing, delete before adding, no dependency without a reason. -- **Security from live sources.** A model's CVE knowledge stops at its training cutoff, so reviews query OSV.dev and stamp the date. - -## How it works - -`dev-router` loads first and declares a tier: - -| Tier | When | What runs | +| Capability | What it does | How it starts | |---|---|---| -| 0, trivial | nothing changes behavior | the change + gate tier 0 | -| 1, small | 1–3 files, no new public surface | `wf-bugfix` or `wf-refactor`, regression test, gate tier 1 | -| 2, feature | new endpoint/screen, contract change, new dependency | explore, short plan, TDD, independent review, gate tier 2 | -| 3, large/risky | several modules, existing data, architecture, release | EARS spec + ADR approved by you, reviews, security audit, gate tier 3 | +| **Development workflow** | Chooses a tier (0–3), loads relevant skills/agents, and checks the current diff. | Install the plugin or skills. | +| **Model catalog** | Shows exact provider IDs, account eligibility, evidence, scores, and reference prices without invoking a model. | Run `scripts/model_catalog.py`. | +| **Goal loop** | Measures an application goal, tests isolated changes, and retains only verified improvements. | Configure the project and explicitly run `scripts/goal_loop.py`. | -Security triggers raise the tier at any point: auth, money, personal data, uploads, raw SQL, -shell/exec, deserialization, schema migrations, new dependencies, features that call an LLM. - -## What is inside - -| Kind | Items | -|---|---| -| Router and rules | `dev-router`, `lean-code` | -| Workflows | `wf-bugfix`, `wf-refactor`, `wf-frontend`, `wf-backend`, `wf-architecture`, `wf-security-review`, `wf-readme` | -| Agents | `explorer` (haiku, read-only), `planner` (opus, read-only), `implementer` (sonnet), `reviewer` (opus, read-only, sees only the diff), `security-auditor` (opus, read-only), `ui-critic` (sonnet, read-only), `verifier` (haiku, runs the gate) | -| Hooks | `Stop`: blocks "done" while code changed without a fresh passing gate · `PreToolUse`: denies `--no-verify` and force-push, asks before `reset --hard`, `clean -f`, `DROP TABLE` · `PostToolUse`: formats edited files with the project's own formatter | -| Quality gate | [`scripts/quality-gate`](scripts/quality-gate): lint, typecheck, tests, gitleaks (tier 0); diff coverage, semgrep, dead code (tier 1); build, mutation testing, osv-scanner, architecture rules, duplication (tier 2); trivy, requirement→test traceability (tier 3) | -| Vendored skills | security pillar (OWASP secure-agent-playbook, UnitOneAI SecuritySkills, safedeps, hermaguard) and taste-skill for frontend. Origin and license: [`skills/NOTICE.md`](skills/NOTICE.md) | - -The gate runs only the checks of the requested tier, only on the diff, and needs no AI: it is -plain tooling. Checks that need the app running (Lighthouse CI budgets, Playwright + axe, schemathesis, -k6) are added per project in `.dev-workflows.toml`. Reference: -[`skills/dev-router/references/quality-gate.md`](skills/dev-router/references/quality-gate.md). +**Installing the plugin does not start the goal loop, buy model access, or alter your project.** The model's coding-benchmark score and your application's goal score are different measurements. ## Install -```bash -git clone https://github.com/evandrodevbr/dev-workflows && cd dev-workflows +Clone the repository, then choose the runtime you use: -python3 scripts/install.py claude # plugin: skills + agents + hooks -python3 scripts/install.py opencode # skills, agents and a plugin in ~/.config/opencode -python3 scripts/install.py hermes # skills only, in ~/.hermes/skills +```bash +git clone https://github.com/evandrodevbr/dev-workflows +cd dev-workflows + +python3 scripts/install.py claude # Claude Code: plugin, agents, skills, hooks +python3 scripts/install.py opencode # OpenCode: plugin, agents, skills +python3 scripts/install.py omp # OMP: native package, agents, skills +python3 scripts/install.py hermes # Hermes Agent: skills only ``` -Claude Code without cloning: +For Claude Code, you can instead install from its marketplace without cloning: ```text /plugin marketplace add evandrodevbr/dev-workflows /plugin install dev-workflows@dev-workflows ``` -Differences between agents: +| Runtime | Installation result | Gate behavior | +|---|---|---| +| Claude Code | Plugin with seven agents, skills, and Claude hooks | `Stop` hook blocks an unverified completion. | +| OpenCode | Plugin and deny-by-default subagents | Its end-of-turn hook warns; the external goal loop enforces the gate itself. | +| OMP | Linked native plugin with seven agents and skills | No copied Claude hooks; the external goal loop enforces the gate. | +| Hermes Agent | Skills only | Run the gate manually; there is no Hermes goal-loop executor. | -- **opencode** cannot block the end of a turn, so a missing or failing gate is logged instead of blocking. Agents are converted to opencode subagents with the same permissions. -- **Hermes** gets the skills only; run the gate yourself. -- For opencode and Hermes the copies point at your checkout, so keep it in place (or re-run the install after moving it). +OpenCode and Hermes copies refer to this checkout; keep it in place or reinstall after moving it. The generated OMP package is self-contained. See the [skill inventory](docs/SKILLS.md) for vendored sources and optional external skills. -Turn the `Stop` hook off for one session with `DW_GATE=off`. +## Daily workflow -## External skills (optional) +The `dev-router` skill selects a tier and `lean-code` favors reuse, deletion, and the smallest justified change. Higher-risk work raises the tier; authentication, money, personal data, uploads, raw SQL, shell execution, schema migrations, new dependencies, and LLM integrations are explicit triggers. -Workflows use these when installed and fall back to their own rules when not. Install commands: -[`docs/SKILLS.md`](docs/SKILLS.md). +| Tier | Typical change | Minimum workflow | +|---|---|---| +| **0 — trivial** | No behavior change | Make the change; run the tier-0 gate. | +| **1 — small** | Localized behavior change, no new public surface | Reproduce or characterize behavior, test the change, run tier 1. | +| **2 — feature** | New endpoint/screen, contract change, or cross-file feature | Plan briefly, test, review independently, run tier 2. | +| **3 — high risk** | Architecture, existing data, migration, or release | Approve a spec/ADR, review and audit, run tier 3. | -| Area | Skills | -|---|---| -| Frontend | `frontend-design` (Anthropic), `impeccable` (pbakaus), `vercel-react-best-practices`, `vercel-composition-patterns` (Vercel Labs), `animate` (emilkowalski), `web-design`, `avoid-ai-writing` | -| Backend | `secure-coding`, `bola-detector`, `auth-rbac-scaffold`, `injection-checker`, `openapi-hardener`, `security-test-generator` (apisec-inc) | -| Architecture | `system-design`, `c4-architecture`, `isaqb-architecture-governance`, `secure-architecture-governance` (Kotivskyi) | -| README | `readme-crafter`, `good-readme`, `curating-readme` | +The [quality gate](scripts/quality-gate) runs ordinary project tools against the current diff, including the checks required for the chosen tier. **`pass` is evidence; missing tools are `incomplete`, not silently green.** Project-specific commands and checks live in `.dev-workflows.toml`; see the [gate reference](skills/dev-router/references/quality-gate.md). Claude's `Stop`, `PreToolUse`, and `PostToolUse` hooks preserve gate, dangerous-command, and formatting behavior. `DW_GATE=off` disables Claude's `Stop` hook for one session; it does **not** override the external goal loop's gate. -## Quality of this repository +Optional frontend, backend, architecture, security, and documentation skills are listed with their origins and installation instructions in [docs/SKILLS.md](docs/SKILLS.md). Workflows can operate without those external skills. + +## Optional goal-driven loop + +The loop is an **external controller**, not an agent promise to keep trying. It runs only on a clean Git checkout, measures a baseline, and commits each candidate inside a detached attempt worktree. The gate and evaluator run in separate fresh worktrees made from that exact candidate commit, so agent-created ignored files cannot inflate the accepted score. It stops at the target or an explicit iteration, time, stagnation, or authorization limit. Your original branch is not merged, reset, or published. + +### 1. Prepare the project + +You need Python 3.11+, Git, Linux `bubblewrap`, the selected agent CLI and its account, the project's gate tools, and an evaluator maintained **outside** the editable checkout. The evaluator must write JSON to stdout with `schema_version: 1`, the configured metric/value/unit/direction, passing `checks`, and evidence files under `DW_REPORT_DIR`. Its approved SHA-256 is checked before execution. See the [evaluator contract](docs/goal-loop-model-routing-spec.md#4-contratos-de-dados-e-interface-proposta). + +Keep your project's existing gate `[commands]` and add the following to its `.dev-workflows.toml`. This example uses an explicitly chosen, **unranked** Claude subscription alias; it does not invent an Artificial Analysis score or a per-token subscription price. + +```toml +[loop] +enabled = false # set true only when you authorize a run +harness = "claude" +tier = 1 # localized change; raise the tier for larger/riskier work +max_iterations = 3 +max_minutes = 30 +max_stagnant = 2 +min_improvement = 1 +max_paid_usd = 0 + +[loop.goal] +name = "app_quality" +unit = "points" +direction = "maximize" +target = 80 + +[loop.evaluator] +argv = ["python3", "/absolute/outside/checkout/evaluate.py"] +trusted_sha256 = "" +required_checks = ["test", "lint"] + +[models.roles.implementer] +model_key = "sonnet" +billing_mode = "claude_subscription" +manual_unranked_approval = true +``` + +Replace the path, digest, goal, and limits with values you have reviewed. Confirm the digest with `sha256sum /absolute/outside/checkout/evaluate.py`; required checks must be configured and available in the app. A higher tier can require additional agent roles and gate tools. **The example is not ready to run until its placeholders are replaced and `enabled` is set deliberately.** + +### 2. Plan, run, inspect + +From the **app checkout** (not this repository), set `DW` to this repository's absolute path: ```bash -python3 qa/lint_skills.py # frontmatter, size limits, references, links, machine-specific paths -python3 qa/test_gate.py # quality gate and hooks on a throwaway repo -python3 qa/check_upstream.py # vendored skills behind their upstream +DW=/absolute/path/to/dev-workflows +python3 "$DW/scripts/goal_loop.py" plan --config .dev-workflows.toml + +# Review the plan; then set enabled = true and commit the app config. +python3 "$DW/scripts/goal_loop.py" run --config .dev-workflows.toml + +# Copy run_id from the run's JSON output into RUN_ID. +RUN_ID=your-run-id +python3 "$DW/scripts/goal_loop.py" status --config .dev-workflows.toml --run "$RUN_ID" +python3 "$DW/scripts/goal_loop.py" resume --config .dev-workflows.toml --run "$RUN_ID" +python3 "$DW/scripts/goal_loop.py" stop --config .dev-workflows.toml --run "$RUN_ID" +``` + +`plan` preflights the evaluator, isolation, gate, and routes without calling an agent. `run` evaluates the same goal from baseline through each attempt; a current `pass` gate and required checks must precede acceptance. `status` reports baseline, best score, target, attempts, gate and evidence. `resume` rechecks the configuration, evaluator, gate, base, and model route; a paid call with unreported usage cannot be resumed automatically. `stop` prevents subsequent attempts rather than killing an in-flight call. + +State and evidence live outside the app at `$XDG_STATE_HOME/dev-workflows` (by default `~/.local/state/dev-workflows`). Inspect the winning worktree and commit before **you** decide whether to apply its diff. The controller never applies or publishes it for you. + +## Model catalog and routing + +Catalog commands inspect sources and local account evidence; they **do not dispatch models**: + +```bash +# Run these from the dev-workflows repository. +python3 scripts/model_catalog.py sync --tool opencode --providers opencode,opencode-go +python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv +python3 scripts/model_catalog.py route --tool opencode --role planner \ + --providers opencode,opencode-go --explain + +# For configured OMP providers, discover their local models instead: +python3 scripts/model_catalog.py sync --tool omp --providers your-provider +``` + +| Evidence | Source | Meaning | +|---|---|---| +| Model IDs and variants | Public [Zen](https://opencode.ai/zen/v1/models) and [Go](https://opencode.ai/zen/go/v1/models) catalogs; local tool discovery | A public listing or local login alone **does not prove** entitlement. Zen and Go are distinct billing routes. | +| Comparative prices | [OpenRouter Models API](https://openrouter.ai/api/v1/models) | USD/token, displayed in USD/1M for matched IDs; published long-context overrides affect reference costs. These are **not** Zen, Go, or Claude billing. Missing cache components are `n/d`, never zero. | +| Coding scores | Authorized, attributed [Artificial Analysis Coding Agent Index](https://artificialanalysis.ai/agents/coding-agents) v1.5 snapshot | Manual audited import only; exact scores require a matching runtime harness and model effort. Cross-harness scores require explicit proxy approval. No automatic scraping or borrowed Intelligence Index scores. | +| Eligibility and native cost | Your audited account evidence, native tariffs, balances, and Go quotas | Required for paid/eligible routing; missing or stale evidence blocks automatic selection. | + +Fixed coding-score bands are **light `[10,20)`**, **medium `[20,50)`**, and **high `[50,100]`**. The router filters by tool, provider, account, evidence, role, and budget, then compares real native cost inside the best-score plateau; OpenRouter prices remain reference only. An empty band stays empty rather than acquiring a fabricated score. A manually fixed Claude alias is labeled `unranked`. + +To supply your own authorized data, `sync` accepts `--aa-snapshot`, `--availability-snapshot`, and `--price-overrides` (including `native_tariffs`). See the [validated input contracts](docs/goal-loop-model-routing-spec.md#4-contratos-de-dados-e-interface-proposta). A paid `route` also needs a task token profile (`--tokens`), explicit providers, and an appropriate `--budget-usd`; routing alone never makes a paid call. + +### Reproducible public snapshot + +The [captured CSV](docs/model-catalog-zen-go-2026-09-25.csv) contains **122 public models** from 2026-09-25 07:18:38 UTC: 80 Zen, 42 Go, eight curated OpenRouter price matches, **0/122 licensed AA scores imported**, and no locally confirmed account eligibility. It is a catalog, **not** a recommendation or invoice. Reproduce its exact bytes offline from the [archived normalized JSON snapshot](docs/model-catalog-snapshot-2026-09-25/catalog-opencode.json): + +```bash +python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv \ + --cache-dir docs/model-catalog-snapshot-2026-09-25 \ + --as-of-utc 2026-09-25T07:18:38Z +``` + +The CSV output SHA-256 is `80e2930877b20e5c47d4fd18f394c17a4683b257ca715496e91c63520d528230`; the archived JSON SHA-256 is `a5a1ec44587976a9fe96399bb275662ccdf90e1d8149ac7857f03ae05bb83dcc`. A new `sync` obtains **current** catalogs and may yield different rows or prices. With no authorized benchmark or confirmed account evidence, `route` reports no eligible scored model rather than pretending one is available. + +## Safety and limitations + +- **No implicit spending.** Zen and pay-as-you-go routes require an explicit task budget; dispatch needs recent audited balance and native prices, a nonzero cap, a task estimate, and interactive authorization before each call. Go checks the three per-model quota windows (5h, weekly, monthly) and does not silently fall back to paid Zen balance. Unknown real usage pauses the loop and blocks automatic resume; an estimate is **not a hard billing limit**. Claude subscriptions are not converted into fictional USD/token costs. +- **Isolation has boundaries.** The evaluator and quality gate run under Linux `bubblewrap` without network access. The agent CLI can edit its isolated worktree but its `.git` pointer is mounted read-only and rechecked before Git writes; it retains network access for providers and can read host files. This is **not** provider-only egress isolation. Add stronger isolation before using sensitive code or data. +- **Evidence beats agent output.** Missing tools, failed or stale gates, invalid evaluator results, changed protected files, and unavailable models do not count as success. No install, merge, publish, destructive Git operation, or cleanup of winning worktrees is performed by the loop. +- **No measured quality uplift claim.** The CLI was exercised on a disposable app with a fake Claude CLI and fake scanner: the app score moved from **0 to 2 in two gate-approved iterations**, without paid inference or a real account entitlement check. Whether the kit improves agent-produced code across projects still needs an A/B benchmark; public [SkillsBench](https://arxiv.org/abs/2602.12670) and [SWE-Skills-Bench](https://arxiv.org/abs/2603.15401) results show skills are not automatically beneficial. + +## Verify this repository + +```bash +python3 qa/lint_skills.py +python3 qa/test_gate.py +python3 -m unittest discover -s qa -p 'test_*.py' -q claude plugin validate --strict .claude-plugin/plugin.json ``` -CI runs the first two on every PR; the upstream check runs monthly. +CI runs skill lint, gate/hook tests, and the behavioral suite on every PR. `python3 qa/check_upstream.py` checks vendored skills against upstream separately each month. See the [changelog](CHANGELOG.md) and the [full goal-loop specification](docs/goal-loop-model-routing-spec.md) for contracts, requirements, and limitations. -**Not measured yet:** whether the kit improves the code an agent produces. Public studies -([SkillsBench](https://arxiv.org/abs/2602.12670), [SWE-Skills-Bench](https://arxiv.org/abs/2603.15401)) -show skills can also make results worse, so the next step is an A/B benchmark (with vs. without the -kit) on [Harbor](https://github.com/harbor-framework/harbor) with hidden tests, mutation score and -security checks. +## Repository map -## Layout - -``` -.claude-plugin/ plugin.json, marketplace.json -skills/ dev-router, lean-code, wf-* workflows, vendored skills (NOTICE.md) -agents/ explorer, planner, implementer, reviewer, security-auditor, ui-critic, verifier -hooks/hooks.json Stop, PreToolUse, PostToolUse -scripts/ quality-gate, install.py, hooks/*.py -adapters/opencode/ opencode plugin -qa/ lint, gate tests, upstream check -docs/SKILLS.md skill inventory and install commands -``` +| Path | Purpose | +|---|---| +| `skills/`, `agents/`, `hooks/` | Canonical workflows, least-privilege agents, Claude hooks | +| `scripts/quality-gate`, `scripts/install.py` | Deterministic verification and installation | +| `scripts/model_catalog.py`, `scripts/model_router.py` | Provenance-aware inventory and per-role selection | +| `scripts/goal_loop.py`, `scripts/harness_runner.py` | External controller and runtime invocation | +| `adapters/opencode/`, `adapters/omp/` | Native integration packages | +| `qa/`, `docs/` | Behavioral tests, source inventory, specification, captured data | ## License -[MIT](LICENSE) © 2026 [Evandro Fonseca Junior](https://github.com/evandrodevbr). Vendored skills keep their own licenses ([`skills/NOTICE.md`](skills/NOTICE.md)). +[MIT](LICENSE) © 2026 [Evandro Fonseca Junior](https://github.com/evandrodevbr). Vendored skills retain their own licenses; see [`skills/NOTICE.md`](skills/NOTICE.md). diff --git a/README.pt-BR.md b/README.pt-BR.md index 74ab795..7831e88 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -2,7 +2,7 @@ # Dev Workflows -**Plugin do Claude Code (também para opencode e Hermes Agent) que ajusta o processo ao tamanho do pedido**: um roteador escolhe o nível, agentes com permissão mínima fazem o trabalho e um gate de qualidade determinístico decide quando terminou. +**Plugin do Claude Code (também para OpenCode e OMP; Hermes recebe só skills) que ajusta o processo ao tamanho do pedido**: um roteador escolhe o nível, agentes com permissão mínima fazem o trabalho e um gate de qualidade determinístico decide quando terminou. [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Agent Skills](https://img.shields.io/badge/Agent%20Skills-1.0-8A2BE2)](https://agentskills.io) @@ -62,6 +62,7 @@ git clone https://github.com/evandrodevbr/dev-workflows && cd dev-workflows python3 scripts/install.py claude # plugin: skills + agentes + hooks python3 scripts/install.py opencode # skills, agentes e plugin em ~/.config/opencode python3 scripts/install.py hermes # só skills, em ~/.hermes/skills +python3 scripts/install.py omp # pacote nativo OMP: skills + agentes (sem hooks Claude) ``` Claude Code sem clonar: @@ -73,9 +74,10 @@ Claude Code sem clonar: Diferenças entre os agentes: -- **opencode** não consegue bloquear o fim do turno, então gate ausente ou falho vira aviso no log em vez de bloqueio. Os agentes viram subagentes do opencode com as mesmas permissões. -- **Hermes** recebe só as skills; rode o gate você mesmo. -- No opencode e no Hermes as cópias apontam para o seu clone: mantenha-o no lugar (ou rode a instalação de novo depois de mover). +- **OpenCode** não consegue bloquear o fim do turno, então gate ausente ou falho vira aviso no log. Seus subagentes têm ferramentas negadas por padrão; o controlador externo verifica o gate por conta própria. +- **OMP** usa plugin nativo com skills e sete agentes, sem hooks Claude. O controlador externo impõe o gate. +- **Hermes** recebe só as skills; rode o gate você mesmo. Não existe executor Hermes para o loop. +- No OpenCode e no Hermes as cópias apontam para o seu clone: mantenha-o no lugar (ou reinstale depois de mover). O pacote OMP é construído independentemente do clone. Desligue o hook de `Stop` numa sessão com `DW_GATE=off`. @@ -96,11 +98,12 @@ instalação: [`docs/SKILLS.md`](docs/SKILLS.md). ```bash python3 qa/lint_skills.py # frontmatter, limites de tamanho, referências, links, caminhos de máquina python3 qa/test_gate.py # gate e hooks num repositório descartável +python3 -m unittest discover -s qa -p 'test_*.py' -q # catálogo, roteador, adapters, loop python3 qa/check_upstream.py # skills vendorizadas atrás do upstream claude plugin validate --strict .claude-plugin/plugin.json ``` -O CI roda os dois primeiros em todo PR; a checagem de upstream roda todo mês. +O CI roda lint, testes do gate/hooks e a suíte comportamental em todo PR; a checagem de upstream roda todo mês. **Ainda não medido:** se o kit melhora o código que um agente produz. Estudos públicos ([SkillsBench](https://arxiv.org/abs/2602.12670), [SWE-Skills-Bench](https://arxiv.org/abs/2603.15401)) @@ -108,6 +111,67 @@ mostram que skills também podem piorar o resultado, então o próximo passo é sem o kit) no [Harbor](https://github.com/harbor-framework/harbor), com testes ocultos, score de mutação e checagens de segurança. +## Catálogo de modelos e loop de meta opt-in + +A [spec de roteamento e loop](docs/goal-loop-model-routing-spec.md) está implementada em CLIs independentes; instalar um plugin **nunca inicia o loop**. Requisitos: Python 3.11+, Git, `bubblewrap` no Linux, CLI de agente suportada configurada, avaliador externo aprovado, checkout limpo e ferramentas do gate do projeto. Não rode em projetos sensíveis sem isolamento adicional: a CLI do agente pode acessar a rede e ler arquivos do host; **não** há sandbox de rede restrita só ao provider. Avaliador e gate rodam sem acesso à rede. + +Para inspecionar modelos sem chamar nenhum deles (neste repositório): + +```bash +python3 scripts/model_catalog.py sync --tool opencode --providers opencode,opencode-go +python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv +python3 scripts/model_catalog.py route --tool opencode --role planner --providers opencode,opencode-go --explain +``` + +`sync` consulta fontes públicas [Zen](https://opencode.ai/zen/v1/models), [Go](https://opencode.ai/zen/go/v1/models), [OpenRouter](https://openrouter.ai/api/v1/models) e `opencode models --refresh` local; para OMP, passe `--tool omp --providers ` para descobrir modelos locais. Lista, login armazenado ou tarifa OpenRouter **não comprovam** acesso da conta, cota Go, saldo Zen ou cobrança real. Rota pontuada elegível exige seus próprios `--availability-snapshot` e `--aa-snapshot` auditados; para cobranças/cotas nativas, `--price-overrides` com `native_tariffs`. Veja os [contratos](docs/goal-loop-model-routing-spec.md#4-contratos-de-dados-e-interface-proposta) e validadores de `scripts/model_catalog.py`. O Coding Agent Index v1.5 da AA é importado manualmente, com autorização e atribuição: sem scraping da leaderboard ou notas inventadas. Faixas fixas de nota de código: `[10,20)`, `[20,50)`, `[50,100]`; modelos inacessíveis ou sem nota não vencem uma rota pontuada. Preços OpenRouter em USD/1M são **comparativos**, não cobrança Zen/Go/Claude; cache ausente é `n/d`, não gratuito. +Uma nota `exact` exige o mesmo harness e esforço de execução; outro harness só entra como `proxy` autorizado. No OMP, apenas esforços `thinking` anunciados pelo modelo local são elegíveis, inclusive IDs de modelo com `/`. Overrides públicos de contexto longo do OpenRouter entram no custo **referencial** do perfil de tokens. + +A [tabela CSV completa capturada](docs/model-catalog-zen-go-2026-09-25.csv) inclui **122 modelos públicos** (Zen 80, Go 42) em 2026-09-25 07:18:38 UTC: **0/122 notas AA licenciadas importadas**, oito pareamentos de preço OpenRouter curados e nenhum acesso de conta confirmado localmente nesta captura. Reproduza **exatamente estes bytes, sem rede**, usando o [snapshot normalizado arquivado](docs/model-catalog-snapshot-2026-09-25/catalog-opencode.json) com `python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv --cache-dir docs/model-catalog-snapshot-2026-09-25 --as-of-utc 2026-09-25T07:18:38Z`; o SHA-256 da saída é `80e2930877b20e5c47d4fd18f394c17a4683b257ca715496e91c63520d528230`. Sem `--as-of-utc`, o relatório de obsolescência usa o horário atual. Rode `sync` e `list --format csv` para catálogos/preços *atuais*. Dados públicos não são fatura nem garantia de acesso. + +No `.dev-workflows.toml` **do aplicativo**, preserve seus `[commands]` do gate e defina um avaliador independente mantido fora do checkout. O stdout deve ser JSON com `schema_version: 1`, métrica/valor/unidade/direção configuradas, `checks` aprovados e evidências geradas sob `DW_REPORT_DIR` (veja o [contrato do avaliador](docs/goal-loop-model-routing-spec.md#4-contratos-de-dados-e-interface-proposta)). Exemplo com assinatura Claude e alias fixo, deliberadamente **sem ranking**: + +```toml +[loop] +enabled = false # mude para true apenas quando decidir executar +harness = "claude" +tier = 1 # mudança de comportamento pequena; aumente para tarefas de risco +max_iterations = 3 +max_minutes = 15 +max_stagnant = 2 +min_improvement = 1 +max_paid_usd = 0 + +[loop.goal] +name = "app_quality" +unit = "points" +direction = "maximize" +target = 80 + +[loop.evaluator] +argv = ["python3", "/caminho/absoluto/fora/do/checkout/evaluate.py"] +trusted_sha256 = "" +required_checks = ["test", "lint"] + +[models.roles.implementer] +model_key = "sonnet" +billing_mode = "claude_subscription" +manual_unranked_approval = true +``` + +Aprove o arquivo/hash do avaliador (`sha256sum /caminho/absoluto/fora/do/checkout/evaluate.py`), defina meta mensurável e comandos do gate. Depois, **num checkout limpo do app** (troque `DW` pelo caminho absoluto deste repositório): + +```bash +DW=/caminho/absoluto/para/dev-workflows +python3 "$DW/scripts/goal_loop.py" plan --config .dev-workflows.toml +# Mude enabled = true no app, faça commit dessa escolha deliberada e então: +python3 "$DW/scripts/goal_loop.py" run --config .dev-workflows.toml +python3 "$DW/scripts/goal_loop.py" status --config .dev-workflows.toml --run +python3 "$DW/scripts/goal_loop.py" resume --config .dev-workflows.toml --run +python3 "$DW/scripts/goal_loop.py" stop --config .dev-workflows.toml --run +``` + +`plan` não chama agentes; `run` mede o score inicial do app e tenta mudanças em worktrees separados. Cada tentativa cria um commit candidato detached; o gate e o avaliador executam em cópias limpas e separadas desse commit, sem arquivos ignorados criados pelo agente. Só aceita melhora após gate `pass` atual, checks obrigatórios e avaliação independente. Não faz merge, publicação ou exclusão da sua branch/worktrees; inspecione `status` e o worktree/commit vencedor antes de decidir aplicar. Estado/evidências ficam em `$XDG_STATE_HOME/dev-workflows` (padrão `~/.local/state/dev-workflows`). `resume` revalida configuração/avaliador/gate/base/rota; `stop` solicita parar novas tentativas, sem interromper imediatamente uma chamada em andamento. Zen/pay-as-you-go requer auditoria recente de conta/saldo, estimativa nativa, orçamento explícito e positivo **e** autorização interativa antes de cada chamada; consumo real desconhecido pausa o loop e impede retomada automática, pois estimativas não são limite rígido de cobrança. Go exige cotas recentes por modelo para 5h/semana/mês, sem fallback para saldo Zen. Assinatura Claude **não** recebe custo fictício USD/token nem nota AA emprestada do alias. + ## Estrutura ``` @@ -115,9 +179,10 @@ mutação e checagens de segurança. skills/ dev-router, lean-code, workflows wf-*, skills vendorizadas (NOTICE.md) agents/ explorer, planner, implementer, reviewer, security-auditor, ui-critic, verifier hooks/hooks.json Stop, PreToolUse, PostToolUse -scripts/ quality-gate, install.py, hooks/*.py -adapters/opencode/ plugin do opencode -qa/ lint, testes do gate, checagem de upstream +scripts/ quality-gate, instalação, catálogo/roteador, loop, executores e hooks +adapters/opencode/ plugin do OpenCode +adapters/omp/ construtor do pacote nativo OMP +qa/ lint, testes do gate e de integração, checagem de upstream docs/SKILLS.md inventário de skills e comandos de instalação ``` diff --git a/adapters/omp/build.py b/adapters/omp/build.py new file mode 100644 index 0000000..06a656f --- /dev/null +++ b/adapters/omp/build.py @@ -0,0 +1,168 @@ +"""Build the native OMP package from the canonical dev-workflows checkout.""" +from __future__ import annotations + +import hashlib +import json +import os +import re +import shutil +import tempfile +from pathlib import Path + + +OWNER_MARKER = ".dev-workflows-omp-package" +def _owner_value(src: Path) -> str: + return f"dev-workflows\nsource_root={src}\n" + + +def _content_digest(package: Path) -> str: + h = hashlib.sha256() + for path in sorted(package.rglob("*")): + if path.is_symlink(): + raise FileExistsError(f"symlink em pacote gerado: {path}") + if not path.is_file() or path.name == OWNER_MARKER: + continue + h.update(path.relative_to(package).as_posix().encode("utf-8")) + h.update(b"\0") + h.update(str(path.stat().st_mode & 0o777).encode("ascii")) + with path.open("rb") as src: + for chunk in iter(lambda: src.read(1024 * 1024), b""): + h.update(chunk) + return h.hexdigest() + +AGENT_NAMES = ( + "explorer", "implementer", "planner", "reviewer", + "security-auditor", "ui-critic", "verifier", +) +MODEL_ID = re.compile(r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+(?::(?:none|minimal|low|medium|high|xhigh|max))?$") +TOOL_NAMES = { + "Read": "read", "Edit": "edit", "Write": "write", "Bash": "bash", + "Grep": "grep", "Glob": "glob", "WebFetch": "web_search", +} + + +def _agent(src: Path, name: str, models: dict[str, str], package_root: Path) -> str: + text = (src / "agents" / f"{name}.md").read_text(encoding="utf-8") + match = re.match(r"\A---\s*\n(.*?)\n---\s*\n(.*)\Z", text, re.S) + if not match: + raise ValueError(f"frontmatter inválido em agents/{name}.md") + raw, prompt = match.groups() + meta: dict[str, str] = {} + for line in raw.splitlines(): + key, sep, value = line.partition(":") + if sep: + meta[key.strip()] = value.strip() + if meta.get("name") != name or not meta.get("description"): + raise ValueError(f"metadados incompletos em agents/{name}.md") + + source_tools = [item.strip() for item in meta.get("tools", "").split(",") if item.strip()] + # An explicit OMP allowlist prevents read-only agents from inheriting write tools. + tools = list(dict.fromkeys(TOOL_NAMES[item] for item in source_tools if item in TOOL_NAMES)) + if not tools: + raise ValueError(f"nenhuma ferramenta OMP reconhecida em agents/{name}.md") + lines = ["---", f"name: {name}", f"description: {meta['description']}", "tools: " + ", ".join(tools)] + skills = re.search(r"^skills:\s*\[(.*?)\]\s*$", raw, re.M) + if skills: + values = [value.strip().strip("'\"") for value in skills.group(1).split(",") if value.strip()] + if values: + lines.append("autoloadSkills:") + lines.extend(f" - {value}" for value in values) + model = models.get(name) + if model is not None: + if not isinstance(model, str) or not MODEL_ID.fullmatch(model): + raise ValueError(f"ID de modelo inválido para {name}: {model!r}") + lines.append(f"model: {model}") + body = prompt.replace("${CLAUDE_PLUGIN_ROOT}", str(package_root)) + return "\n".join(lines + ["---", "", body]) + + +def build_package(src_root, dest, models=None): + """Atomically build an owned OMP plugin package at *dest*. + + ``models`` maps canonical agent names (roles) to verified concrete + ``provider/model[:thinking]`` selectors. Missing roles intentionally omit + ``model`` so OMP inherits the parent model. + """ + src = Path(src_root).resolve() + target = Path(dest).expanduser().absolute() + roles = {} if models is None else dict(models) + unknown = set(roles) - set(AGENT_NAMES) + if unknown: + raise ValueError("papéis desconhecidos: " + ", ".join(sorted(unknown))) + if not (src / "agents").is_dir() or not (src / "skills").is_dir(): + raise ValueError(f"checkout canônico inválido: {src}") + if target.is_symlink(): + raise FileExistsError(f"destino é symlink; recusando substituir: {target}") + if target.exists(): + marker = target / OWNER_MARKER + if not target.is_dir() or not marker.is_file(): + raise FileExistsError(f"destino existente não pertence a dev-workflows: {target}") + if marker.read_text(encoding="utf-8") != _owner_value(src) + f"sha256={_content_digest(target)}\n": + raise FileExistsError(f"pacote existente tem alterações manuais ou origem diferente: {target}") + + target.parent.mkdir(parents=True, exist_ok=True) + stage = Path(tempfile.mkdtemp(prefix=f".{target.name}.stage-", dir=target.parent)) + backup = None + try: + skills_src = src / "skills" + skills_dest = stage / "skills" + shutil.copytree(skills_src, skills_dest, symlinks=False, + ignore=shutil.ignore_patterns(".git", "__pycache__", "*.pyc")) + skill_count = sum(1 for path in skills_dest.glob("*/SKILL.md") if path.is_file()) + for path in skills_dest.rglob("*"): + if not path.is_file(): + continue + try: + content = path.read_text(encoding="utf-8") + except UnicodeError: + continue + if "${CLAUDE_PLUGIN_ROOT}" in content: + path.write_text(content.replace("${CLAUDE_PLUGIN_ROOT}", str(target)), encoding="utf-8") + if skill_count != 21: + raise ValueError(f"esperadas 21 skills canônicas; encontradas {skill_count}") + + agents_dest = stage / "agents" + agents_dest.mkdir() + for name in AGENT_NAMES: + if not (src / "agents" / f"{name}.md").is_file(): + raise ValueError(f"agente canônico ausente: {name}") + (agents_dest / f"{name}.md").write_text(_agent(src, name, roles, target), encoding="utf-8") + + # The quality-gate executable is a package asset; Claude hooks are deliberately + # excluded. The loop/controller remains responsible for enforcing its verdict. + gate = src / "scripts" / "quality-gate" + if gate.is_file(): + (stage / "scripts").mkdir() + shutil.copy2(gate, stage / "scripts" / "quality-gate") + manifest = { + "name": "dev-workflows", + "version": "1.0.0", + "description": "Skills e agentes nativos para oh-my-pi; gate imposto pelo controlador externo.", + "omp": {"extensions": []}, + } + (stage / "package.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + (stage / OWNER_MARKER).write_text(_owner_value(src) + f"sha256={_content_digest(stage)}\n", encoding="utf-8") + + if target.exists(): + backup = Path(tempfile.mkdtemp(prefix=f".{target.name}.backup-", dir=target.parent)) + backup.rmdir() + os.replace(target, backup) + try: + os.replace(stage, target) + except BaseException: + if backup is not None: + os.replace(backup, target) + backup = None + raise + if backup is not None: + shutil.rmtree(backup) + backup = None + return target + finally: + if stage.exists(): + shutil.rmtree(stage) + if backup is not None and backup.exists(): + if not target.exists(): + os.replace(backup, target) + else: + shutil.rmtree(backup) diff --git a/docs/SKILLS.md b/docs/SKILLS.md index ca9d7df..83521ca 100644 --- a/docs/SKILLS.md +++ b/docs/SKILLS.md @@ -1,7 +1,9 @@ # Skills: inventário e origem -Cada skill é um diretório `skills//SKILL.md`. O plugin carrega todas; `scripts/install.py` -copia para o opencode ou o Hermes. +Cada skill é um diretório `skills//SKILL.md`. O plugin Claude carrega todas; +`scripts/install.py` instala skills e agentes em OpenCode ou OMP e apenas skills no Hermes. +O adapter OMP gera um pacote nativo independente em `~/.omp/plugins/dev-workflows`, +registra os sete agentes do repositório e não reutiliza os hooks Claude. ## Do próprio repositório diff --git a/docs/goal-loop-model-routing-spec.md b/docs/goal-loop-model-routing-spec.md new file mode 100644 index 0000000..b469784 --- /dev/null +++ b/docs/goal-loop-model-routing-spec.md @@ -0,0 +1,246 @@ +# Spec: loop de melhoria por meta e roteamento de modelos por ferramenta + +**Estado:** implementada como CLIs opt-in; ranking e despacho pagos dependem de evidência válida da conta, benchmark autorizado e autorização pontual. Nesta captura não há notas AA importadas nem elegibilidade de conta confirmada. +**Consulta de fontes:** 2026-09-25 (UTC). **Escopo:** `dev-workflows` como kit multi-ferramenta, não somente OMP. +**Decisões já recebidas:** faixas de qualidade por **notas fixas**, Claude Code usado por **assinatura**, OpenRouter como fonte dos preços unitários de **referência** para cruzar os modelos do OpenCode. + +## 1. Problema e resultado esperado + +Na base anterior, `skills/dev-router/SKILL.md` dimensionava tarefas em níveis 0–3; `agents/*.md` fixavam Haiku/Sonnet/Opus; `scripts/quality-gate` escrevia `.dev-workflows/gate.json`; o hook Claude bloqueava o encerramento sem gate atual, enquanto o adapter OpenCode apenas avisava. Agora catálogo, roteador e controlador externo acrescentam avaliação de meta sem substituir esses mecanismos; `scripts/install.py` inclui OMP nativo, mantendo Hermes apenas com skills. + +Entregar duas capacidades independentes e combináveis: + +1. **Roteador:** listar os modelos realmente utilizáveis por ferramenta/conta, cruzar preços OpenRouter e evidência de benchmark de programação, mostrar ranking e escolher um modelo por função dentro de uma faixa de nota e de um orçamento explícitos. +2. **Controlador externo de experimentos:** medir um objetivo do **aplicativo** com avaliador independente, executar mudanças limitadas em worktrees isolados, aplicar o quality gate, aceitar apenas melhorias válidas e repetir até atingir o alvo ou um limite. Instalar skills/agentes não liga esse controlador automaticamente. + +**Duas escalas diferentes:** `coding_score` (Artificial Analysis, seleção do agente/modelo, 0–100) não é `app_score` (avaliador específico do projeto, com unidade/direção/alvo configuráveis). Não usar um como prova do outro. + +### Fora de escopo + +Assinar serviços, criar chaves, alterar a cobrança Zen/Go, prometer preços iguais entre gateways, extrair dados protegidos da Artificial Analysis, publicar resultados/código, remover worktrees com mudanças, alterar testes protegidos, reimplementar o quality gate, ou rodar o loop em projetos sem objetivo verificável. Não adotar um framework Ralph como dependência obrigatória: aproveitar o padrão de contexto fresco e verificação externa com o Python já usado pelo projeto. + +## 2. Fontes e interpretação + +| Informação | Autoridade / campo | Regra | +|---|---|---| +| Catálogo Zen | [Zen `/v1/models`](https://opencode.ai/zen/v1/models), [docs Zen](https://opencode.ai/docs/zen); ID de uso `opencode/` | Lista pública não prova acesso da conta nem cobrança. Zen tem modelos Claude; não excluir a família por suposição. | +| Catálogo Go | [Go `/v1/models`](https://opencode.ai/zen/go/v1/models), [docs Go](https://opencode.ai/docs/go); ID `opencode-go/` | Assinatura de US$10/mês; cotas **por modelo** em equivalentes USD: 20% do limite mensal a cada 5h, 50% semanal, 100% mensal. A lista atual inclui GPT Luna, mas não Claude; reconsultar. | +| Acesso OpenCode local | [Modelos e providers](https://opencode.ai/docs/models), CLI `opencode models --refresh`; autenticação local/conta | Interseção com IDs exatos do provider instalado e habilitado; lista pública e credencial, isoladamente, não bastam. Erro de autorização retira candidato. | +| Preço comparativo | [OpenRouter Models API](https://openrouter.ai/docs/api/api-reference/models/get-models), `GET /api/v1/models` | `prompt`, `completion`, `input_cache_read`, `input_cache_write` são USD **por token**: multiplicar por 1.000.000 para mostrar USD/1M. Campo ausente = `n/d`, nunca zero. IDs OpenRouter não são IDs OpenCode. | +| Preço real e limites | Docs/console [Zen](https://opencode.ai/docs/zen) e [Go](https://opencode.ai/docs/go), ou plano da ferramenta usada | **Não** cobrar, estimar saldo Zen nem debitar cota Go por preço OpenRouter. Considerar overrides de contexto, janelas de pico e cache; quando indisponível, bloquear despacho automático pago. | +| Benchmark principal | [Artificial Analysis Coding Agent Index](https://artificialanalysis.ai/agents/coding-agents), [metodologia v1.5](https://artificialanalysis.ai/methodology/coding-agents-benchmarking) | Média de DeepSWE v1.1, Terminal-Bench 4.0 e SWE-Atlas-QnA; guardar agente/harness, variante, esforço, fallback, versão, data, link e score. Score do harness **não** é propriedade intrínseca de toda rota do modelo. | +| API AA | [Data API](https://artificialanalysis.ai/data-api/docs) e [API legada](https://artificialanalysis.ai/api-reference) | Endpoints autenticados de modelos expõem índices de natureza/versão distintas; a documentação consultada não oferece export público documentado do **Coding Agent Index v1.5**. `artificial_analysis_coding_index` da API legada, quando disponível, não é automaticamente o índice de agentes v1.5. Nunca trocar pelo Intelligence Index. Respeitar termos e atribuição. | + +**Ingestão do benchmark:** preferir export/API oficial **documentado e autorizado** para o índice de agentes; até existir, aceitar snapshot auditado/importado manualmente da página pública com a atribuição e evidência por linha, observando seus termos. Sem scraping automático de interface privada, sem inventar pontuações para preencher lacunas. Qualquer outro benchmark entra com `metric_id` diferente e ranking separado; não juntar scores entre índices, versões ou harnesses sem justificativa experimental. + +### Amostra auditável de cruzamento (não é ranking completo nem tabela de cobranças) + +Valores observados em 2026-09-25: preço **OpenRouter** em USD/1M tokens (entrada / saída / leitura de cache / escrita de cache); nota do **Coding Agent Index v1.5**, com harness e variante indicados. A presença nos catálogos públicos não afirma elegibilidade de nenhuma conta. + +| Modelo e IDs de exemplo | Preço OpenRouter | Nota AA da variante avaliada | Observação | +|---|---|---|---| +| GLM 5.3: `z-ai/glm-5.3`; `opencode/glm-5.3`; `opencode-go/glm-5.3` | 1,40 / 4,40 / 0,26 / n/d | 54, OpenCode (max) | Go publica cota mensal de US$15 para este modelo; benchmark no OpenCode não prova equivalência do backend de todas as rotas. | +| GPT-6 Luna: `openai/gpt-6-luna`; `opencode/gpt-6-luna`; `opencode-go/gpt-6-luna` | 0,10 / 0,50 / 0,01 / 0,125 | 41, Codex (max) | Faixa **média pela nota**, apesar do preço baixo; Go publica cota mensal de US$15. OpenRouter aplica preços diferentes acima de 272k tokens. | +| GPT-6 Sol: `openai/gpt-6-sol`; `opencode/gpt-6-sol` | 2,00 / 10,00 / 0,20 / 2,50 | 57, Codex (max) | Pontuação em outro harness; preço muda acima de 272k tokens. | +| Claude Opus 5.5: `anthropic/claude-opus-5.5`; `opencode/claude-opus-5-5` | 4,00 / 20,00 / 0,20 / 5,00 | 66, Claude Code (max) | Zen oferece esse ID publicamente; não presumir acesso na conta nem equiparar preço OpenRouter à assinatura Claude. | +| Kimi K3: `moonshotai/kimi-k3`; `opencode-go/kimi-k3`; `opencode/kimi-k3` | 0,8845 / 10,5346 / 0,33 / n/d | 52, Kimi Code CLI | Variante avaliada em outro harness; Go publica cota mensal de US$15. | +| Claude Sonnet/Haiku, MiMo-V2.6-Pro | IDs conforme catálogo de cada ferramenta; pareamento exige revisão | **n/d** | Não foi localizada nota dessas variantes no recorte público consultado; não atribuir nota de outra família/harness. | + +Os preços acima vêm do [JSON OpenRouter](https://openrouter.ai/api/v1/models); notas da [leaderboard](https://artificialanalysis.ai/agents/coding-agents); cotas e IDs das [docs Go](https://opencode.ai/docs/go) e [Zen](https://opencode.ai/docs/zen). Cache `n/d` significa *não informado*, não gratuito. Listar também condição de preço/contexto e origem por modelo na saída gerada; dados mudam. + +## 3. Política de roteamento + +### 3.1 Faixas e funções + +Usar **nota fixa** de 0 a 100; cortes configuráveis, defaults abaixo. Faixa não é preço nem tamanho físico do modelo: + +| Faixa de qualidade | Intervalo | Uso padrão | Restrições | +|---|---|---|---| +| `leve` | `[10, 20)` | exploração/leitura em volume, coleta de dados públicos, sumarização mecânica e relatório do `verifier` | Agentes só de leitura; se nenhum candidato medido, faixa fica vazia. Nota `<10` inelegível por padrão. | +| `media` | `[20, 50)` | `implementer`, `ui-critic` nível 2 | Exigir ferramentas e contexto suficientes; escalar tarefas de alto risco para `alta`. | +| `alta` | `[50, 100]` | `planner`, `reviewer`, `security-auditor`, implementação nível 3/risco | Planejamento/revisão independentes e limites de custo. Notas `>80` continuam nesta **terceira** faixa. | + +Não assumir que haverá candidato em todas as faixas: os exemplos publicados de 2026-09-25 não preenchem a faixa `leve`. Se vazia, registrar `no_scored_candidate`; propor o menor custo de outra faixa que cumpra o piso **após** orçamento/autorizações, ou usar um modelo fixado pelo usuário e rotular `unranked`; não afirmar que esta opção venceu no benchmark. `dev-router` continua a escolher nível e gatilhos de segurança; a faixa nunca reduz nível/gate nem torna revisão opcional. + +### 3.2 Elegibilidade, custo e seleção + +Para cada função, aplicar nesta ordem: + +1. Escolher ferramenta/harness **em uso**, provider e conta de cobrança permitidos pelo usuário. Elegível só se `(provider, id, variante)` constar do catálogo local revalidado, autenticação/entitlement não negado e houver contexto, modalidade, tool calling e permissões requeridos. IDs e versões vinculados por mapa curado com proveniência; sem `fuzzy match` de nomes. `opencode/*` e `opencode-go/*` são rotas distintas. OMP pode usar esses providers se realmente configurados; Claude Code não vira multi-provider por declarar um ID Zen. +2. Para seleção **pontuada**, exigir benchmark de métrica/versão única e mapeamento de variante. `exact`: harness, modelo, esforço e caminho avaliados equivalentes; `proxy`: modelo e esforço compatíveis, mas harness/provider diferem, com risco explícito. Proxy só se a política da função autorizar; para migração/auth/segurança de nível 3, exigir `exact` ou aprovação humana da incerteza. `unranked` não entra em fronteira de qualidade nem ganha score emprestado. +3. Filtrar pelo intervalo da função e pelo custo/limite de cobrança autorizado. `score_top = max(score)` dos elegíveis da faixa; formar platô `score >= score_top - delta_points` (**pontos de nota**, não porcentagem). Defaults: `delta_points = 2` para `alta`, `3` para `media` e `leve`. No platô, escolher **menor consumo relevante para a ferramenta** no perfil de tokens da função: tarifa Zen para Zen, débito de cota Go para Go, consumo observado da assinatura para Claude quando medível. Publicar também o ranking **comparativo OpenRouter**, mas não usá-lo como custo real de outro gateway. Se o consumo relevante for desconhecido, não alegar escolha ótima: manter rota estática ou pedir seleção explícita. Desempate: nota maior, maior folga de cota, ID lexicográfico. Reportar top absoluto, economia estimada e fronteira de Pareto (nota e custo na mesma base). +4. Custo **referencial** por tarefa: `C_OR = u*P_entrada + o*P_saida + r*P_cache_leitura + w*P_cache_escrita + taxas_extras`, com `u,o,r,w` em tokens e preços da API OpenRouter **em USD por token**. Equivalentemente, se usar valores exibidos **em USD/1M**, dividir a soma dos quatro produtos por `1_000_000`. Usar `Decimal`, sem ponto flutuante para moeda. Se o perfil usa cache e seu preço não é informado, `C_OR = n/d`, sem comparar artificialmente como zero; componente com zero tokens não requer tarifa. Respeitar overrides de contexto/TTL/endpoint. Perfil de tokens vem de medições do próprio harness ou configuração explícita; previsão é **estimativa**, não fatura. +5. Zen: orçamento real conservador calculado com tarifa **Zen**, independente de `C_OR`, e saldo/limite confirmados; Go: verificar cota restante **do modelo** nas três janelas e estimar débito pela **tarifa Go**, não por `C_OR`. Quando saldo/restante não puder ser confirmado, não iniciar despacho automático com risco de cobrança; permitir execução manual fora do loop. Claude por assinatura: mostrar `C_OR` só como comparação, contar tokens/limites observáveis e parar ao atingir aviso de plano; sem consumo comparável não afirmar economia entre Opus/Sonnet/Haiku nem converter USD OpenRouter em cobrança. Nenhum fallback Go→saldo Zen sem autorização explícita separada; a opção `Use balance` da console pode cobrar automaticamente quando a cota acabar. +6. Se seleção mudar, exibir motivo (novo score, preço, disponibilidade, quota, contexto) e não trocar a ferramenta/provider/assinatura silenciosamente. Falha de autenticação, preço obsoleto, métrica ausente, índice diferente, rate-limit ou limite esgotado = `unavailable`/pausa; fallback só para rota previamente permitida que ainda cumpre requisitos e orçamento. + +Na implementação, o ID de modelo OMP é opaco (pode conter `/`); apenas seu `selector` é qualificado pelo provider, e variantes `#esforço` só são elegíveis quando o `thinking` da CLI local anuncia esse esforço. `exact` exige o harness da ferramenta em execução; outra origem exige `proxy` autorizado. Rotas Zen e OMP pay-as-you-go exigem `--budget-usd` explícito antes mesmo de serem selecionadas. Overrides publicados pela API OpenRouter acima de um limiar de tokens entram apenas no preço comparativo do perfil. + +**Exemplo de custo comparativo, não fatura:** perfil hipotético de 50k tokens de entrada sem cache, 150k de leitura de cache, 10k de saída e 0 de escrita dá aproximadamente US$0,0115 no OpenRouter para GPT-6 Luna e US$0,153 para GLM-5.3 nas tarifas-base observadas. A primeira tem nota 41 (`media`), a segunda 54 (`alta`); não chamar Luna de faixa `leve` por ser barata. Não usar esse perfil fictício para cobrar ou fixar o ranking final. + +**Atualização:** cada snapshot contém data UTC e hash. Revalidar catálogo local por sessão, preços antes de aprovar gasto (24h no máximo), quotas antes de cada execução e score ao mudar versão do índice (recaptura pelo menos a cada 30 dias). Dados obsoletos impedem **autoescolha paga**; `models list` ainda os mostra como `stale`. Nenhum refresh automático de AA sem fonte/permissão documentada. + +## 4. Contratos de dados e interface proposta + +Manter a config do projeto em `.dev-workflows.toml` (já lida pelo gate), adicionando seções **sem alterar** `[commands]`, `[thresholds]`, `[spec]` e `[[check]]` existentes. `~/.config` pode conter preferências de conta, nunca chaves em arquivos do projeto. Exemplo de contrato, não arquivo configurado: + +```toml +[loop] +enabled = false # somente comando explícito inicia experimento +harness = "opencode" # claude | opencode | omp; Hermes após adapter real +max_iterations = 8 +max_minutes = 90 +max_stagnant = 2 +min_improvement = 0.5 +max_paid_usd = 0 # >0 só com autorização interativa para Zen/pay-as-you-go + +[loop.goal] +name = "qualidade_do_app" +direction = "maximize" # minimize também permitido +unit = "points" # unidade do produto, não do AA +baseline_required = true +target = 80.0 + +[loop.evaluator] +argv = ["python3", "/caminho/fora/do/worktree/evaluate.py", "--json"] +timeout_seconds = 600 +trusted_sha256 = "" +required_checks = ["test", "lint"] +require_gate_verdict = "pass" # incomplete não é sucesso do loop + +[models] +benchmark_metric = "aa_coding_agent_index_v1.5" +allow_proxy_score = false +max_price_age_hours = 24 +max_score_age_days = 30 + +[models.bands] +leve = [10, 20] +media = [20, 50] +alta = [50, 100] # último limite inclusivo + +[models.roles.explorer] +band = "leve" +max_loss_points = 3 + +[models.roles.implementer] +band = "media" +max_loss_points = 3 + +[models.roles.planner] +band = "alta" +max_loss_points = 2 +``` + +**Contrato de avaliação (stdout exclusivamente JSON, erro em stderr):** + +```json +{"schema_version":1,"metric":"qualidade_do_app","value":81.2,"unit":"points","direction":"maximize","checks":{"regression":"pass","security":"pass"},"evidence":["/relatorios/avaliacao.json"]} +``` + +Apenas o processo controlador interpreta `value`; saída ausente, NaN, métrica/unidade/direção divergente, evidência não verificável, prazo excedido, exit não zero, ou check obrigatório diferente de `pass` é **falha**, nunca score zero. Nomes de caminhos são ilustrativos; o avaliador real e seu alvo são definidos pelo projeto. Repetir baseline e candidato sob o mesmo avaliador, versão, dados e sementes. Expor variabilidade: para avaliador estocástico, fixar sementes/repetições e comparar média/intervalo conforme config do projeto, sem inferir melhoria de ruído. + +**Registro de modelo:** `model_key=(provider,model_id,variant)`, `tool`, `billing_mode`, `openrouter_id`, `openrouter_canonical_slug`, `or_price_per_token={input,output,cache_read?,cache_write?,cache_write_1h?}`, `price_conditions`, `zen_or_go_native_tariff?`, `quota_window_remaining?`, `score={metric_id,version,value?,agent,harness,variant,settings,match_grade,source_url,observed_at}`, `availability={listed,authenticated,entitled,verified_at}`, `source_hash`. Tipos monetários como string decimal, `null` para desconhecido. Não gravar API keys, prompts do app ou dados privados no ranking. Não confundir variantes `max/high` do benchmark com preço base sem estimar seus tokens. + +**Comandos de produto implementados:** + +```text +python3 scripts/model_catalog.py sync --tool opencode --providers opencode,opencode-go +python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv +python3 scripts/model_catalog.py route --tool opencode --role planner --explain +python3 scripts/goal_loop.py plan --config .dev-workflows.toml +python3 scripts/goal_loop.py run --config .dev-workflows.toml +python3 scripts/goal_loop.py status --run +python3 scripts/goal_loop.py resume --run +python3 scripts/goal_loop.py stop --run +``` + +**Tabela completa gerada, não preenchida manualmente nesta spec:** uma linha por `(ferramenta, provider, ID, variante)` de **todos** os modelos publicados para Zen e Go no snapshot, inclusive os indisponíveis na conta e os sem nota. Colunas CSV/JSON: `nome`, `tool`, `provider/model#variant`, `openrouter_id`, `preco_or_entrada_usd_1m`, `preco_or_saida_usd_1m`, `preco_or_cache_leitura_usd_1m`, `preco_or_cache_escrita_usd_1m`, `condicao_de_preco`, `coding_index_versao`, `coding_index_nota`, `benchmark_por_componente_se_publicado`, `harness_aa`, `reasoning_aa`, `grau_do_match`, `faixa`, `preco_native_ou_cota`, `disponivel_na_conta`, `motivo_da_exclusao`, `fonte` e `capturado_em`. Reportar cobertura `pontuados/total` por ferramenta/faixa; ordenar ranking só entre notas comparáveis. `n/d` permanece explícito para score ou preço ausente, não omitir linhas. Export não contém credenciais nem dados do usuário. + +`sync` de AA só aceita snapshot manual licenciado/verificado ou API específica oficialmente documentada; não há comando para raspar leaderboard não documentado. `plan` é sem gastos/mutações: imprime fontes, notas e `n/d`, mapeamentos, cotas, perfil de tokens, rotas por papel, baseline/evaluator e riscos. `run` exige aprovação explícita para orçamento pago, comandos com efeitos externos e mudanças de provider; nunca ativar por instalar o plugin. `status` mostra score inicial/melhor/meta, iterações, custo real/estimado separados, snapshots, gate e motivos de pausa. `stop` cancela novas tentativas e não apaga worktrees. + +**Captura reproduzível da tabela:** [`model-catalog-zen-go-2026-09-25.csv`](model-catalog-zen-go-2026-09-25.csv), gerada pelos comandos `sync --tool opencode --providers opencode,opencode-go` e `list --tool opencode --show-missing --format csv` em **2026-09-25T07:18:38Z**. Contém 80 modelos Zen e 42 Go, cobertura AA 0/122 (não foi fornecido snapshot autorizado), oito pareamentos curados de preços OpenRouter e acesso local não confirmado (`opencode models --refresh` falhou para ambos); nenhum deles é automaticamente elegível. Hash do snapshot `1930d91de7992963aec39d4188f36d97a849ead60f4dc91ae66dc4b38c708cd7`; hashes dos corpos das fontes: Zen `1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4`, Go `4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4`, OpenRouter `0d552d4f08b7c600c0aa2d8f8b926e1356856fd81a6c9ad0c02c5a3f3a7eab3c`. SHA-256 do CSV `80e2930877b20e5c47d4fd18f394c17a4683b257ca715496e91c63520d528230`. Rodar `sync` novamente atualiza preços/listas e **não** reproduz necessariamente os mesmos bytes históricos; preserve o snapshot JSON local se precisar reprocessar a captura exata. Os dados públicos de [Zen](https://opencode.ai/zen/v1/models), [Go](https://opencode.ai/zen/go/v1/models) e [OpenRouter](https://openrouter.ai/api/v1/models) não são prova de acesso ou fatura. + +O [snapshot normalizado arquivado](model-catalog-snapshot-2026-09-25/catalog-opencode.json) permite reproduzir a captura **offline**: `python3 scripts/model_catalog.py list --tool opencode --show-missing --format csv --cache-dir docs/model-catalog-snapshot-2026-09-25 --as-of-utc 2026-09-25T07:18:38Z` gera exatamente o CSV acima (SHA-256 comprovado na execução CLI). Sem `--as-of-utc`, a obsolescência é recalculada com o horário atual e os bytes históricos podem mudar. SHA-256 dos bytes do JSON `a5a1ec44587976a9fe96399bb275662ccdf90e1d8149ac7857f03ae05bb83dcc`; o arquivo contém os 122 registros Zen/Go normalizados e 460 entradas públicas OpenRouter, sem evidência privada de conta nem AA licenciada. + +**Importação auditada pelo usuário:** `--aa-snapshot` exige `metric_id=aa_coding_agent_index`, `version=1.5`, `ingestion=manual_audited`, `terms_accepted=true` **somente após aceitar os termos**, atribuição, URL oficial HTTPS, data UTC e linhas com ID/variante, score, agente, harness, configurações, match e URL da evidência. `--availability-snapshot` exige `tool`, `ingestion=manual_audited`, `user_confirmed=true`, data UTC e linhas com ID exato, `local_listed`, `authenticated`, `entitled`, `verified_at` e origem; não inclua tokens/chaves. `--price-overrides` pode incluir `native_tariffs` indexado por `model_key`: Zen/OMP payg exige tarifa USD/token, `available_balance_usd` e confirmação de conta/saldo recente; Go exige `quota_window_remaining` e `quota_window_debit` por modelo em `5h`, `weekly`, `monthly` e `use_balance_fallback=false`. Sem evidência atual das permissões e do perfil de tokens da tarefa, o roteador permanece indisponível; o comando `route` nunca invoca modelos. + +**Limite de isolamento:** o agente usa ferramentas por papel e worktree com escrita limitada; seu ponteiro `.git` é montado somente para leitura e revalidado antes de operações Git do controlador. A CLI compartilha a rede para alcançar providers e pode ler arquivos do host. O avaliador e o gate usam `bubblewrap --unshare-net`; não confundir com filtro de egress do agente nem isolamento contra código malicioso do próprio usuário. Sem cotas/saldo auditados recentes, uso real confiável e autorização interativa, qualquer caminho cobrado é bloqueado ou pausado; uma chamada paga sem consumo reportado não pode ser retomada automaticamente. Previsões não impõem teto rígido de faturamento. A prova de execução sem gasto usa uma CLI Claude fictícia e verificador fictício em repositório descartável: baseline 0 → score 2 em duas iterações com gate aprovado; não comprova cobrança/entitlement de uma conta real. + +### Adaptadores e responsabilidades + +- **Núcleo Python sem SDK proprietário:** descoberta, tabela/relatório, política, estado transacional do loop e leitura do `gate.json`. Processo do controlador fora da pasta editável pelo agente; metadados por execução fora do worktree e artefatos `.dev-workflows/` ignorados para Git quando gerados no projeto. Sem polling/serviço silencioso. +- **Claude Code:** usar `claude -p --model` e subagentes `agents/*.md` com aliases permitidos `haiku|sonnet|opus|inherit`; não escrever `provider/model` incompatível no frontmatter canônico. Instalação via plugin existente; preservar hooks e autorização da ferramenta. Resolver versão/modelo da conta antes de anunciar score; `model` alias não prova variante exata. Assinatura não é precificação por token. +- **OpenCode:** usar `opencode run --model provider/id#variant --agent ...` conforme versão local. `scripts/install.py` gera agentes em `~/.config/opencode/agents` e plugin de hooks; estender conversão para `model` por papel/conta com **deny-by-default** de ferramentas nos subagentes de leitura, sem herdar permissão `* allow`. Não sobrepor arquivo existente não pertencente ao pacote. O plugin OpenCode apenas avisa no fim: controlador deve bloquear por conta própria em `gate.json`. +- **OMP:** adicionar alvo `omp` ao instalador com package/adapter OMP próprio, skills/agentes nativos e papéis `modelRoles` resolvidos no runtime, sem reusar diretamente `hooks/hooks.json` do Claude. OMP descobre agentes de extensões e aceita aliases de papel `@nome` ([docs](https://github.com/can1357/oh-my-pi/blob/main/docs/task-agent-discovery.md)); se papel não estiver configurado, herdar do pai ou bloquear com diagnóstico — nunca criar ID fictício. Hooks só com port nativo e testes; sem eles, controlador externo impõe gate. Não depender do worktree local de um usuário para distribuição. +- **Hermes:** instalação atual é só de skills; não alegar suporte a subagentes ou loop até existir executor/adapter testado. Scripts de ranking/report ainda podem operar fora do Hermes. + +## 5. Algoritmo do loop + +```text +INICIALIZAR: validar config, meta, avaliador protegido, orçamento, permissões, + working tree do usuário e catálogo; obter baseline em sandbox isolado. +SE baseline já atinge target E checks/gate exigidos passaram: finalizar sem editar. +PARA i em 1..max_iterations, respeitando relógio/orçamento: + criar worktree descartável A PARTIR do melhor estado aceito (nunca reset no tree do usuário) + planejar UMA hipótese de melhoria com contexto fresco + feedback anterior e papel roteado + implementar mudança pequena dentro de escopo e permissões do dev-router + verificar arquivos protegidos, ponteiro Git detached e isolamento; criar commit candidato + rodar quality-gate --tier N em worktree limpo do commit; validar base, diff, tempo e checks + SE fail/incomplete obrigatório: rejeitar e registrar motivo, sem declarar sucesso + SENÃO executar avaliador independente em OUTRO worktree limpo do mesmo commit + SE score válido, não regrediu e melhorou >= min_improvement: guardar commit como melhor + SENÃO: marcar tentativa rejeitada e incrementar estagnação + persistir decisão, custo/uso, evidências e hashes atomicamente + SE melhor.score atinge target E todos os checks obrigatórios passam: parar com success + SE estagnação/limite/cancelamento: parar com estado explícito, não success +FIM: produzir patch/worktree do melhor estado; usuário decide se incorpora. +``` + +Estados da execução: `planned → baselined → running → success|exhausted|paused|cancelled|error`; resultados por tentativa: `accepted|rejected|paused|interrupted`. `success` só vem do avaliador **externo** atual + gate `pass` + invariantes; texto do agente, `COMPLETE`, exit zero isolado e `incomplete` nunca são conclusão. Rejeição não apaga evidência nem altera branch do usuário. `resume` confere hash do avaliador, config, snapshot de modelos, branch/base e último estado aceito; se houve edição concorrente do usuário ou atualização de dependência crítica, pausa até decisão. Uma única execução ativa por projeto, escrita atômica com lock; interrupção é retomável sem contabilizar a mesma tentativa duas vezes, salvo chamada paga de consumo indeterminado. + +**Controle de riscos:** agente não pode escrever avaliador/testes ocultos, metas, snapshots de catálogo, relatório de execução ou hashes de aceitação; executar verificação em contexto separado do workspace editável, com checkout limpo dos checks/dados aprovados. Config/linhas de comando, páginas externas e saída do agente são dados não confiáveis, não autorização para instalar dependências, enviar dados, gastar saldo, publicar, executar migrations, modificar serviços de produção ou desativar gate. Para ações com efeito externo, legal, financeiro ou dados sensíveis, interromper para aprovação explícita do usuário no momento da ação. Nenhum `--dangerously-skip-permissions`, `--auto` indiscriminado ou force-push. Guardar diffs sem segredos e limitar retenção de logs. + +## 6. Requisitos verificáveis (EARS) + +- **REQ-001** WHEN `models sync` for chamado, THE SYSTEM SHALL identificar IDs exatos e variantes dos catálogos Zen/Go e da ferramenta local sem presumir acesso pela lista pública. +- **REQ-002** WHEN preços forem importados, THE SYSTEM SHALL preservar cada preço OpenRouter por token, cache read/write separados, condições, ID, URL, data e unidade USD/1M apresentada. +- **REQ-003** IF um preço/campo de cache estiver ausente, THEN THE SYSTEM SHALL mostrá-lo como `n/d` e impedir custo comparativo inválido para o perfil afetado. +- **REQ-004** WHEN uma nota AA for importada, THE SYSTEM SHALL preservar índice, versão, harness, agente, variante, configurações, pontuação, proveniência e data. +- **REQ-005** IF índice, variante, versão, origem ou correspondência não forem compatíveis, THEN THE SYSTEM SHALL rejeitar a comparação/roteamento pontuado, sem substituir por Intelligence Index. +- **REQ-006** WHEN `models list` for chamado, THE SYSTEM SHALL listar modelos disponíveis e indisponíveis, ID por ferramenta, faixas fixas, preço entrada/saída/cache, nota ou `n/d`, licença de cobrança e justificativa da elegibilidade. +- **REQ-007** WHEN escolher modelo por papel, THE SYSTEM SHALL filtrar requisitos, nota/intervalo e orçamento, selecionar menor custo dentro do platô de pontos do melhor da faixa e explicar escolhas/empates. +- **REQ-008** IF uma faixa estiver vazia, THEN THE SYSTEM SHALL reportar ausência, oferecer opção explícita rotulada (ou rota fixa `unranked`) e nunca fabricar uma nota para preencher a faixa. +- **REQ-009** IF provider, ID ou conta não estiverem efetivamente disponíveis, THEN THE SYSTEM SHALL não despachar o modelo, ainda que conste das docs públicas. +- **REQ-010** IF uma rota Go exceder uma janela de cota ou cair em `Use balance` sem autorização de pagamento, THEN THE SYSTEM SHALL pausar antes da chamada cobrada. +- **REQ-011** WHEN mostrar custo, THE SYSTEM SHALL distinguir `C_OR` de referência, cobrança Zen, débito de cota Go e assinatura Claude; tokens estimados não são fatura. +- **REQ-012** IF metadados pagos estiverem expirados ou indisponíveis, THEN THE SYSTEM SHALL bloquear seleção automática cobrada, mantendo relatório legível. +- **REQ-013** WHEN `plan` for chamado, THE SYSTEM SHALL validar objetivo, avaliador, isolamento, modelos, gate, riscos e orçamento **sem** executar agentes, criar branches nem gastar tokens. +- **REQ-014** IF a base do projeto tiver mudanças do usuário, THEN THE SYSTEM SHALL evitar apagá-las ou absorvê-las sem consentimento e exigir snapshot/base deliberados. +- **REQ-015** WHEN `run` for autorizado, THE SYSTEM SHALL medir baseline pelo mesmo avaliador protegido e contexto usado nas tentativas. +- **REQ-016** WHILE o loop estiver ativo, THE SYSTEM SHALL limitar tentativas por iteração, tempo, custo, estagnação e permissões; manter hipótese/contexto novo por iteração. +- **REQ-017** WHEN um agente modificar código, THE SYSTEM SHALL rodar o tier do `dev-router` e validar `gate.json` atual e checks obrigatórios antes de medir sucesso. +- **REQ-018** IF gate `fail` ou `incomplete` obrigatório, regressão, score inválido ou tampering ocorrer, THEN THE SYSTEM SHALL rejeitar a tentativa com evidência, sem alterar o melhor estado. +- **REQ-019** WHEN houver melhoria válida, THE SYSTEM SHALL promover somente o estado isolado vencedor e registrar score, dados, gate, custo e hashes que sustentam a decisão. +- **REQ-020** IF o score atingir a meta com checks válidos, THEN THE SYSTEM SHALL parar como `success` e oferecer patch/worktree, **sem** aplicar/publicar na branch do usuário. +- **REQ-021** IF limite, cancelamento ou erro ocorrer primeiro, THEN THE SYSTEM SHALL parar como `exhausted|cancelled|error` com melhor evidência e sem afirmar que atingiu a meta. +- **REQ-022** WHEN `resume` for chamado, THE SYSTEM SHALL verificar invariantes/hashes e retomar sem duplicar gastos/tentativas; mudança concorrente exige pausa. +- **REQ-023** WHILE qualquer adapter estiver ativo, THE SYSTEM SHALL preservar restrições de ferramentas/hook/gate aplicáveis e nunca promover permissões de agentes de leitura por herança. +- **REQ-024** WHEN gerar documentação ou ranking com dados AA, THE SYSTEM SHALL atribuir fonte e respeitar seus termos, mantendo métricas de índices diferentes em tabelas separadas. + +## 7. Plano de implementação e prova de aceitação + +| Ordem | Entrega e locais previstos | Requisitos | Prova comportamental | +|---|---|---|---| +| 1 | `scripts/model_catalog.py` + módulo pequeno de parsing em `scripts/` e fixtures em `qa/` | 001–006, 011, 012, 024 | Importar JSON oficial OpenRouter e snapshot AA consentido; testar preço com/sem cache, 1M, override 272k, desambiguação de alias e índices não misturados; `models list` real sem chave AA quando snapshot local existe. | +| 2 | `scripts/model_router.py`, contrato TOML e `qa/test_model_router.py` | 007–012 | Matriz Zen vs Go vs Claude/OMP; falta de score/faixa vazia, custo no platô, proxy, quota Go 5h/semana/mês, queda para saldo Zen negada, empate determinístico. Teste de integração com catálogo CLI local, sem despachar modelo pago. | +| 3 | `scripts/goal_loop.py`, estado isolado e `qa/test_goal_loop.py` | 013–022 | Projeto temporário com avaliador que mede qualidade real: baseline abaixo, primeira tentativa melhora, segunda atinge meta; gate atual obrigatório; regressão/`incomplete`/tampering rejeitados; retomada, limite e árvore de trabalho suja preservada. Teste executa CLI e inspeciona worktrees e relatórios, não somente mocks. | +| 4 | Converter por ferramenta em `scripts/install.py`, `adapters/opencode/`, novo `adapters/omp/`, `agents/`, `skills/dev-router/` | 001, 007, 009, 023 | Smoke de instalação e descoberta dos 7 agentes por runtime, modelos resolvidos e ferramenta de leitura sem permissão de escrita; OpenCode warning não substitui veredito do controlador; Hermes segue explicitamente skills-only. | +| 5 | README em inglês/português, `docs/SKILLS.md`, `CHANGELOG.md`, testes CI | Todos | Quickstart com `plan`/`run`/`resume`, fontes/atribuição, preços dinâmicos, caso `n/d` e gates; `qa/lint_skills.py`, `qa/test_gate.py` e novos testes verdes. | + +**Critérios de pronto do produto:** um projeto descartável atinge meta numérica apenas após duas iterações comprovadas; falha de gate nunca encerra como sucesso; Zen e Go escolhem listas distintas sem cobrança cruzada; preço OpenRouter e tarifa real aparecem separados; modelos sem benchmark não entram no ranking por nota; Claude por assinatura não recebe custo fictício; estado retoma após interrupção; nenhuma branch/arquivo do usuário é destruído. Testar também um caso em que meta não é atingida antes de `max_iterations`. Roteamento sozinho não conta como entrega do loop, nem o inverso. + +**Migração e reversão:** manter o comportamento atual por padrão (`[loop].enabled=false`, agentes existentes preservados); ativar explicitamente por projeto e ferramenta após diagnóstico; distribuir adapter OMP nativo sem presumir o worktree local; remover/corrigir caminhos antigos de modelo ao ativar roteamento em cada runtime. Desativar execução retornando `enabled=false` e usar papéis estáticos atuais. Não excluir relatórios/worktrees automaticamente; fornecer passos de recuperação e escolha de aplicação do patch. Spec nível 3: revisar com o usuário antes da implementação, conforme `agents/planner.md`. + +## 8. Prompt original de implementação (registro histórico) + +> Implemente no `dev-workflows` a spec `docs/goal-loop-model-routing-spec.md`, sem reduzir nenhum REQ-001…024. Preserve `dev-router`, quality gate e hooks atuais. Comece pelo importador de catálogo com proveniência e pelo roteador, depois integre Claude Code, OpenCode e OMP, e por fim o controlador de loop com worktrees/avaliador independente; Hermes permanece skills-only até existir adapter real. Use faixas **fixas de nota de código** `[10,20)`, `[20,50)`, `[50,100]`, não quantis relativos. Descubra apenas modelos acessíveis à conta/ferramenta. Cruze IDs curados Zen/Go/Claude/OMP com tarifas **OpenRouter** de entrada, saída, leitura e escrita de cache; marque campos faltantes `n/d` e informe os preços OpenRouter como **referência**, distintos da cobrança Zen, cota Go e assinatura Claude. Use exclusivamente um índice/versionamento de programação da Artificial Analysis por ranking; atribua fonte, guarde variante/harness e jamais converta nota do Intelligence Index em nota de código. Mostre ranking auditável por papel, escolha o modelo de menor custo dentro do platô dos melhores da faixa, bloqueie seleção cobrada sem autorização e nunca faça fallback Go→Zen cobrado sem aceite. No loop, estabeleça baseline, aceite apenas melhoria numérica com gate/checks obrigatórios aprovados e avaliador protegido, pare ao atingir alvo ou orçamento e preserve o trabalho do usuário. Entregue testes comportamentais, smoke CLI real, docs, tabela reproduzível com IDs/notas/preços `n/d` e limites honestamente reportados. Não apresente instalação de skills como se fosse o loop em funcionamento. diff --git a/docs/model-catalog-snapshot-2026-09-25/catalog-opencode.json b/docs/model-catalog-snapshot-2026-09-25/catalog-opencode.json new file mode 100644 index 0000000..39a7cee --- /dev/null +++ b/docs/model-catalog-snapshot-2026-09-25/catalog-opencode.json @@ -0,0 +1,24049 @@ +{ + "benchmark": { + "metric_id": "aa_coding_agent_index", + "records": [], + "version": "1.5" + }, + "captured_at": "2026-09-25T07:18:38Z", + "models": [ + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-fable-5", + "model_key": "opencode/claude-fable-5", + "name": "claude-fable-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-fable-5-1", + "model_key": "opencode/claude-fable-5-1", + "name": "claude-fable-5-1", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "anthropic/claude-opus-5.5", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "claude-opus-5-5", + "model_key": "opencode/claude-opus-5-5", + "name": "claude-opus-5-5", + "openrouter": { + "canonical_slug": "anthropic/claude-opus-5.5-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "5.000000", + "cache_write_1h": "8.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "4.000000", + "output": "20.00000" + }, + "id": "anthropic/claude-opus-5.5", + "name": "Anthropic: Claude Opus 5.5", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000005", + "cache_write_1h": "0.000008", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000004", + "output": "0.00002" + }, + "price_unit": "USD/token", + "source_hash": "4b645dfbf41f276cee10fa5df0ccb37ea65cf6a0820aa70063f8f595152db3b0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.0000002", + "cache_write": "0.000005", + "cache_write_1h": "0.000008", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000004", + "output": "0.00002" + }, + "price_conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-opus-5", + "model_key": "opencode/claude-opus-5", + "name": "claude-opus-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-opus-4-8", + "model_key": "opencode/claude-opus-4-8", + "name": "claude-opus-4-8", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-opus-4-7", + "model_key": "opencode/claude-opus-4-7", + "name": "claude-opus-4-7", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-opus-4-6", + "model_key": "opencode/claude-opus-4-6", + "name": "claude-opus-4-6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-opus-4-5", + "model_key": "opencode/claude-opus-4-5", + "name": "claude-opus-4-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-sonnet-5", + "model_key": "opencode/claude-sonnet-5", + "name": "claude-sonnet-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-sonnet-4-6", + "model_key": "opencode/claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-sonnet-4-5", + "model_key": "opencode/claude-sonnet-4-5", + "name": "claude-sonnet-4-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-sonnet-4", + "model_key": "opencode/claude-sonnet-4", + "name": "claude-sonnet-4", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "claude-haiku-4-5", + "model_key": "opencode/claude-haiku-4-5", + "name": "claude-haiku-4-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.6-flash", + "model_key": "opencode/gemini-3.6-flash", + "name": "gemini-3.6-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.8-flash", + "model_key": "opencode/gemini-3.8-flash", + "name": "gemini-3.8-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.7-flash", + "model_key": "opencode/gemini-3.7-flash", + "name": "gemini-3.7-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.5-flash-lite", + "model_key": "opencode/gemini-3.5-flash-lite", + "name": "gemini-3.5-flash-lite", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.5-flash", + "model_key": "opencode/gemini-3.5-flash", + "name": "gemini-3.5-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3.1-pro", + "model_key": "opencode/gemini-3.1-pro", + "name": "gemini-3.1-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gemini-3-flash", + "model_key": "opencode/gemini-3-flash", + "name": "gemini-3-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-6-astra", + "model_key": "opencode/gpt-6-astra", + "name": "gpt-6-astra", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "openai/gpt-6-sol", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "gpt-6-sol", + "model_key": "opencode/gpt-6-sol", + "name": "gpt-6-sol", + "openrouter": { + "canonical_slug": "openai/gpt-6-sol-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "openai/gpt-6-sol", + "name": "OpenAI: GPT-6 Sol", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "7d623fda751fe5fc2fbd585fe5148be49cc22e6a6b79b77f20249b4fb09ef5dd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "openai/gpt-6-luna", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "gpt-6-luna", + "model_key": "opencode/gpt-6-luna", + "name": "gpt-6-luna", + "openrouter": { + "canonical_slug": "openai/gpt-6-luna-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.5000000" + }, + "id": "openai/gpt-6-luna", + "name": "OpenAI: GPT-6 Luna", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "d1668d002fc09c5c6c96efd0e688d6a0c6bd9ad8ea4c5a4da2ae342aff0d659b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.6-sol", + "model_key": "opencode/gpt-5.6-sol", + "name": "gpt-5.6-sol", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.6-terra", + "model_key": "opencode/gpt-5.6-terra", + "name": "gpt-5.6-terra", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.6-luna", + "model_key": "opencode/gpt-5.6-luna", + "name": "gpt-5.6-luna", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.5", + "model_key": "opencode/gpt-5.5", + "name": "gpt-5.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.5-pro", + "model_key": "opencode/gpt-5.5-pro", + "name": "gpt-5.5-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.4", + "model_key": "opencode/gpt-5.4", + "name": "gpt-5.4", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.4-pro", + "model_key": "opencode/gpt-5.4-pro", + "name": "gpt-5.4-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.4-mini", + "model_key": "opencode/gpt-5.4-mini", + "name": "gpt-5.4-mini", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.4-nano", + "model_key": "opencode/gpt-5.4-nano", + "name": "gpt-5.4-nano", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.3-codex-spark", + "model_key": "opencode/gpt-5.3-codex-spark", + "name": "gpt-5.3-codex-spark", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.3-codex", + "model_key": "opencode/gpt-5.3-codex", + "name": "gpt-5.3-codex", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.2", + "model_key": "opencode/gpt-5.2", + "name": "gpt-5.2", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.2-codex", + "model_key": "opencode/gpt-5.2-codex", + "name": "gpt-5.2-codex", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.1", + "model_key": "opencode/gpt-5.1", + "name": "gpt-5.1", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.1-codex-max", + "model_key": "opencode/gpt-5.1-codex-max", + "name": "gpt-5.1-codex-max", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.1-codex", + "model_key": "opencode/gpt-5.1-codex", + "name": "gpt-5.1-codex", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.1-codex-mini", + "model_key": "opencode/gpt-5.1-codex-mini", + "name": "gpt-5.1-codex-mini", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5", + "model_key": "opencode/gpt-5", + "name": "gpt-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5-codex", + "model_key": "opencode/gpt-5-codex", + "name": "gpt-5-codex", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5-nano", + "model_key": "opencode/gpt-5-nano", + "name": "gpt-5-nano", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-build-0.1", + "model_key": "opencode/grok-build-0.1", + "name": "grok-build-0.1", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.7", + "model_key": "opencode/grok-4.7", + "name": "grok-4.7", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.6", + "model_key": "opencode/grok-4.6", + "name": "grok-4.6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.5", + "model_key": "opencode/grok-4.5", + "name": "grok-4.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.3", + "model_key": "opencode/muse-spark-1.3", + "name": "muse-spark-1.3", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.2", + "model_key": "opencode/muse-spark-1.2", + "name": "muse-spark-1.2", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4.1-flash", + "model_key": "opencode/deepseek-v4.1-flash", + "name": "deepseek-v4.1-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-pro", + "model_key": "opencode/deepseek-v4-pro", + "name": "deepseek-v4-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-flash", + "model_key": "opencode/deepseek-v4-flash", + "name": "deepseek-v4-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-flash-vision-exp", + "model_key": "opencode/deepseek-v4-flash-vision-exp", + "name": "deepseek-v4-flash-vision-exp", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.3-flash", + "model_key": "opencode/glm-5.3-flash", + "name": "glm-5.3-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "z-ai/glm-5.3", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "glm-5.3", + "model_key": "opencode/glm-5.3", + "name": "glm-5.3", + "openrouter": { + "canonical_slug": "z-ai/glm-5.3-20260816", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048575, + "is_moderated": false, + "max_completion_tokens": 943717 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.26000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.4000000", + "output": "4.4000000" + }, + "id": "z-ai/glm-5.3", + "name": "Z.ai: GLM 5.3", + "price_per_token_usd": { + "cache_read": "0.00000026", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000014", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "743f6a1e792d5c4a8f946ddd3e425aa51452baf43efa1d9b9ec08e8c92d01b01", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.00000026", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000014", + "output": "0.0000044" + }, + "price_conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048575, + "is_moderated": false, + "max_completion_tokens": 943717 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.2", + "model_key": "opencode/glm-5.2", + "name": "glm-5.2", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.1", + "model_key": "opencode/glm-5.1", + "name": "glm-5.1", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5", + "model_key": "opencode/glm-5", + "name": "glm-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m3", + "model_key": "opencode/minimax-m3", + "name": "minimax-m3", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m2.7", + "model_key": "opencode/minimax-m2.7", + "name": "minimax-m2.7", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m2.5", + "model_key": "opencode/minimax-m2.5", + "name": "minimax-m2.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "moonshotai/kimi-k3", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "kimi-k3", + "model_key": "opencode/kimi-k3", + "name": "kimi-k3", + "openrouter": { + "canonical_slug": "moonshotai/kimi-k3-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "moonshotai/kimi-k3", + "name": "MoonshotAI: Kimi K3", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "47247fcca26b3410bcca74fd3d9694f28b1c2dbc79427ccf647736d06f726dd9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.7-code", + "model_key": "opencode/kimi-k2.7-code", + "name": "kimi-k2.7-code", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.6", + "model_key": "opencode/kimi-k2.6", + "name": "kimi-k2.6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.5", + "model_key": "opencode/kimi-k2.5", + "name": "kimi-k2.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.8-flash", + "model_key": "opencode/qwen3.8-flash", + "name": "qwen3.8-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.6-plus", + "model_key": "opencode/qwen3.6-plus", + "name": "qwen3.6-plus", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.5-plus", + "model_key": "opencode/qwen3.5-plus", + "name": "qwen3.5-plus", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "jev-1.13", + "model_key": "opencode/jev-1.13", + "name": "jev-1.13", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "big-pickle", + "model_key": "opencode/big-pickle", + "name": "big-pickle", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "jev-1.13-free", + "model_key": "opencode/jev-1.13-free", + "name": "jev-1.13-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-flash-free", + "model_key": "opencode/deepseek-v4-flash-free", + "name": "deepseek-v4-flash-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.3-contributor-free", + "model_key": "opencode/muse-spark-1.3-contributor-free", + "name": "muse-spark-1.3-contributor-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.2-contributor-free", + "model_key": "opencode/muse-spark-1.2-contributor-free", + "name": "muse-spark-1.2-contributor-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.6-flash-free", + "model_key": "opencode/mimo-v2.6-flash-free", + "name": "mimo-v2.6-flash-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "space-bunny-free", + "model_key": "opencode/space-bunny-free", + "name": "space-bunny-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.5-free", + "model_key": "opencode/mimo-v2.5-free", + "name": "mimo-v2.5-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "ling-3.0-flash-fin-free", + "model_key": "opencode/ling-3.0-flash-fin-free", + "name": "ling-3.0-flash-fin-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "nemotron-3-ultra-free", + "model_key": "opencode/nemotron-3-ultra-free", + "name": "nemotron-3-ultra-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "zen_balance", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "nemotron-3.5-lightning-free", + "model_key": "opencode/nemotron-3.5-lightning-free", + "name": "nemotron-3.5-lightning-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode", + "public_source": "https://opencode.ai/zen/v1/models", + "score": null, + "source_hash": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m3", + "model_key": "opencode-go/minimax-m3", + "name": "minimax-m3", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m2.7", + "model_key": "opencode-go/minimax-m2.7", + "name": "minimax-m2.7", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "minimax-m2.5", + "model_key": "opencode-go/minimax-m2.5", + "name": "minimax-m2.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "moonshotai/kimi-k3", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "kimi-k3", + "model_key": "opencode-go/kimi-k3", + "name": "kimi-k3", + "openrouter": { + "canonical_slug": "moonshotai/kimi-k3-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "moonshotai/kimi-k3", + "name": "MoonshotAI: Kimi K3", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "47247fcca26b3410bcca74fd3d9694f28b1c2dbc79427ccf647736d06f726dd9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.7-code", + "model_key": "opencode-go/kimi-k2.7-code", + "name": "kimi-k2.7-code", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.6", + "model_key": "opencode-go/kimi-k2.6", + "name": "kimi-k2.6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "longcat-2.0", + "model_key": "opencode-go/longcat-2.0", + "name": "longcat-2.0", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "kimi-k2.5", + "model_key": "opencode-go/kimi-k2.5", + "name": "kimi-k2.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.2", + "model_key": "opencode-go/glm-5.2", + "name": "glm-5.2", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.3-flash", + "model_key": "opencode-go/glm-5.3-flash", + "name": "glm-5.3-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "z-ai/glm-5.3", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "glm-5.3", + "model_key": "opencode-go/glm-5.3", + "name": "glm-5.3", + "openrouter": { + "canonical_slug": "z-ai/glm-5.3-20260816", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048575, + "is_moderated": false, + "max_completion_tokens": 943717 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.26000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.4000000", + "output": "4.4000000" + }, + "id": "z-ai/glm-5.3", + "name": "Z.ai: GLM 5.3", + "price_per_token_usd": { + "cache_read": "0.00000026", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000014", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "743f6a1e792d5c4a8f946ddd3e425aa51452baf43efa1d9b9ec08e8c92d01b01", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.00000026", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000014", + "output": "0.0000044" + }, + "price_conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048575, + "is_moderated": false, + "max_completion_tokens": 943717 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5.1", + "model_key": "opencode-go/glm-5.1", + "name": "glm-5.1", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "glm-5", + "model_key": "opencode-go/glm-5", + "name": "glm-5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-pro", + "model_key": "opencode-go/deepseek-v4-pro", + "name": "deepseek-v4-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-flash", + "model_key": "opencode-go/deepseek-v4-flash", + "name": "deepseek-v4-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-flash", + "model_key": "opencode-go/deepseek-flash", + "name": "deepseek-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4.1-flash", + "model_key": "opencode-go/deepseek-v4.1-flash", + "name": "deepseek-v4.1-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "deepseek-v4-flash-vision-exp", + "model_key": "opencode-go/deepseek-v4-flash-vision-exp", + "name": "deepseek-v4-flash-vision-exp", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.7-max", + "model_key": "opencode-go/qwen3.7-max", + "name": "qwen3.7-max", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.8-max", + "model_key": "opencode-go/qwen3.8-max", + "name": "qwen3.8-max", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.8-flash", + "model_key": "opencode-go/qwen3.8-flash", + "name": "qwen3.8-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.7-plus", + "model_key": "opencode-go/qwen3.7-plus", + "name": "qwen3.7-plus", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.6-plus", + "model_key": "opencode-go/qwen3.6-plus", + "name": "qwen3.6-plus", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "qwen3.5-plus", + "model_key": "opencode-go/qwen3.5-plus", + "name": "qwen3.5-plus", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2-pro", + "model_key": "opencode-go/mimo-v2-pro", + "name": "mimo-v2-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2-omni", + "model_key": "opencode-go/mimo-v2-omni", + "name": "mimo-v2-omni", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.6-pro", + "model_key": "opencode-go/mimo-v2.6-pro", + "name": "mimo-v2.6-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.6-flash", + "model_key": "opencode-go/mimo-v2.6-flash", + "name": "mimo-v2.6-flash", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "space-bunny-free", + "model_key": "opencode-go/space-bunny-free", + "name": "space-bunny-free", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.5-pro", + "model_key": "opencode-go/mimo-v2.5-pro", + "name": "mimo-v2.5-pro", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "mimo-v2.5", + "model_key": "opencode-go/mimo-v2.5", + "name": "mimo-v2.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "hy4-preview", + "model_key": "opencode-go/hy4-preview", + "name": "hy4-preview", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "hy3", + "model_key": "opencode-go/hy3", + "name": "hy3", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "hy3-preview", + "model_key": "opencode-go/hy3-preview", + "name": "hy3-preview", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "gpt-5.6-luna", + "model_key": "opencode-go/gpt-5.6-luna", + "name": "gpt-5.6-luna", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.5", + "model_key": "opencode-go/grok-4.5", + "name": "grok-4.5", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.7", + "model_key": "opencode-go/grok-4.7", + "name": "grok-4.7", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "grok-4.6", + "model_key": "opencode-go/grok-4.6", + "name": "grok-4.6", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.3-contributor", + "model_key": "opencode-go/muse-spark-1.3-contributor", + "name": "muse-spark-1.3-contributor", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "muse-spark-1.2-contributor", + "model_key": "opencode-go/muse-spark-1.2-contributor", + "name": "muse-spark-1.2-contributor", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": null, + "modalities": null, + "model_id": "omen-alpha", + "model_key": "opencode-go/omen-alpha", + "name": "omen-alpha", + "openrouter": null, + "or_price_per_token": { + "cache_read": null, + "cache_write": null, + "input": null, + "output": null + }, + "price_conditions": null, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + }, + { + "availability": { + "account_verified_at": null, + "authenticated": null, + "balance_confirmed": null, + "balance_verified_at": null, + "entitled": null, + "evidence_hash": null, + "listed": true, + "local_listed": null, + "local_verified_at": null, + "source": null, + "verified_at": null + }, + "availability_reason": "descoberta_local_falhou", + "billing_mode": "go_quota", + "captured_at": "2026-09-25T07:18:38Z", + "context_length": null, + "mapping": { + "match_method": "exact_curated", + "openrouter_id": "openai/gpt-6-luna", + "provenance": "OpenRouter cross-reference reviewed against spec sample" + }, + "modalities": null, + "model_id": "gpt-6-luna", + "model_key": "opencode-go/gpt-6-luna", + "name": "gpt-6-luna", + "openrouter": { + "canonical_slug": "openai/gpt-6-luna-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.5000000" + }, + "id": "openai/gpt-6-luna", + "name": "OpenAI: GPT-6 Luna", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "d1668d002fc09c5c6c96efd0e688d6a0c6bd9ad8ea4c5a4da2ae342aff0d659b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "or_price_per_token": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "provider": "opencode-go", + "public_source": "https://opencode.ai/zen/go/v1/models", + "score": null, + "source_hash": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "tool": "opencode", + "tool_calling": null, + "variant": null + } + ], + "openrouter": { + "aion-labs/aion-2.0": { + "canonical_slug": "aion-labs/aion-2.0-20260223", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "1.6000000" + }, + "id": "aion-labs/aion-2.0", + "name": "AionLabs: Aion-2.0", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.0000016" + }, + "price_unit": "USD/token", + "source_hash": "c75b14dd42d4d3180270e3d4719f4bba8cf2483fe3123d58234f7a83afe64847", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "aion-labs/aion-3.0": { + "canonical_slug": "aion-labs/aion-3.0-20260707", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.75000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "6.000000" + }, + "id": "aion-labs/aion-3.0", + "name": "AionLabs: Aion-3.0", + "price_per_token_usd": { + "cache_read": "0.00000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "5475d23450a1b8381e8422bcb8faff1e6051115177bcea7b58e0fd6db7d3bcad", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "aion-labs/aion-3.0-mini": { + "canonical_slug": "aion-labs/aion-3.0-mini-20260707", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.18000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.7000000", + "output": "1.4000000" + }, + "id": "aion-labs/aion-3.0-mini", + "name": "AionLabs: Aion-3.0-Mini", + "price_per_token_usd": { + "cache_read": "0.00000018", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000007", + "output": "0.0000014" + }, + "price_unit": "USD/token", + "source_hash": "ee0222c77409410c4f7792e38a77c4cfd0bb3e8ef5cea52d36afaa26162fc45a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "aion-labs/aion-3.5": { + "canonical_slug": "aion-labs/aion-3.5-20260923", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.75000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "6.000000" + }, + "id": "aion-labs/aion-3.5", + "name": "AionLabs: Aion 3.5", + "price_per_token_usd": { + "cache_read": "0.00000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "85a272ff58618e2d74db5b5a41c5789c27037d0653209fc96c2423d420c122ee", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "aion-labs/aion-3.5-mini": { + "canonical_slug": "aion-labs/aion-3.5-mini-20260923", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.18000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.7000000", + "output": "1.4000000" + }, + "id": "aion-labs/aion-3.5-mini", + "name": "AionLabs: Aion 3.5 Mini", + "price_per_token_usd": { + "cache_read": "0.00000018", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000007", + "output": "0.0000014" + }, + "price_unit": "USD/token", + "source_hash": "051ddcfa9bdaa8a8e89a0efa9cddfe0e6a5c1ac6607563304e098ce12dd02576", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "aion-labs/aion-rp-llama-3.1-8b": { + "canonical_slug": "aion-labs/aion-rp-llama-3.1-8b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 29491 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "1.6000000" + }, + "id": "aion-labs/aion-rp-llama-3.1-8b", + "name": "AionLabs: Aion-RP 1.0 (8B)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.0000016" + }, + "price_unit": "USD/token", + "source_hash": "809d4dd5c1e6dd14ac06dc2fc8108f1d2a3b3664fe31193055725f9d6b24ae4e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "amazon/nova-2-lite-v1": { + "canonical_slug": "amazon/nova-2-lite-v1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 65535 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "2.5000000" + }, + "id": "amazon/nova-2-lite-v1", + "name": "Amazon: Nova 2 Lite", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "b2d9b547f68128f1bca232c7c58f1c8548c49c780b6c524842d578b213f4aba1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "amazon/nova-lite-v1": { + "canonical_slug": "amazon/nova-lite-v1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 300000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 300000, + "is_moderated": true, + "max_completion_tokens": 5120 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.24000000" + }, + "id": "amazon/nova-lite-v1", + "name": "Amazon: Nova Lite 1.0", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.00000024" + }, + "price_unit": "USD/token", + "source_hash": "1762c79b3ccc43ff1771de4b1224663ce2e8d9938c443a94a35fa833f0f875de", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "amazon/nova-micro-v1": { + "canonical_slug": "amazon/nova-micro-v1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 5120 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.035000000", + "output": "0.14000000" + }, + "id": "amazon/nova-micro-v1", + "name": "Amazon: Nova Micro 1.0", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000035", + "output": "0.00000014" + }, + "price_unit": "USD/token", + "source_hash": "428ac6785065b403a79e5fe54cbe5779d7c1bca0abffe5ea6cf641278876c8c1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "amazon/nova-premier-v1": { + "canonical_slug": "amazon/nova-premier-v1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 32000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.625000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "amazon/nova-premier-v1", + "name": "Amazon: Nova Premier 1.0", + "price_per_token_usd": { + "cache_read": "0.000000625", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "26c68a1c74b69e15c3f9ec8122e01969d13cfdf860a018364bcac0184b260ca6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "amazon/nova-pro-v1": { + "canonical_slug": "amazon/nova-pro-v1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 300000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 300000, + "is_moderated": true, + "max_completion_tokens": 5120 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "3.2000000" + }, + "id": "amazon/nova-pro-v1", + "name": "Amazon: Nova Pro 1.0", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.0000032" + }, + "price_unit": "USD/token", + "source_hash": "b1978229fc3c52769fa482bd9d1c51c9b1601a835eb71c963fed354024022a03", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthracite-org/magnum-v4-72b": { + "canonical_slug": "anthracite-org/magnum-v4-72b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "5.000000" + }, + "id": "anthracite-org/magnum-v4-72b", + "name": "Magnum v4 72B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "027dddc1493af3aceffe80112086507339e86f26961c4f52f0bdd411b5a5ebb1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-3-haiku": { + "canonical_slug": "anthropic/claude-3-haiku", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": "0.3000000", + "cache_write_1h": "0.5000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.25000000" + }, + "id": "anthropic/claude-3-haiku", + "name": "Anthropic: Claude 3 Haiku", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": "0.0000003", + "cache_write_1h": "0.0000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "40625011929051825f883970c260f34d96493f190cf67db1b4be657b0feb649a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-fable-5": { + "canonical_slug": "anthropic/claude-5-fable-20260609", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.000000", + "cache_write": "12.5000000", + "cache_write_1h": "20.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "anthropic/claude-fable-5", + "name": "Anthropic: Claude Fable 5", + "price_per_token_usd": { + "cache_read": "0.000001", + "cache_write": "0.0000125", + "cache_write_1h": "0.00002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "3597cb4487c88390d4aef6bb240ed74290372d1491edc48a905ffa7cb80bd9b1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-fable-5.1": { + "canonical_slug": "anthropic/claude-fable-5.1-20260831", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "12.5000000", + "cache_write_1h": "20.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "anthropic/claude-fable-5.1", + "name": "Anthropic: Claude Fable 5.1", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.0000125", + "cache_write_1h": "0.00002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "3fe385e4ef8bb045984e87e9795ed6468b466f88248bced52dbb0e857fd899e4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-fable-5.1:batch": { + "canonical_slug": "anthropic/claude-fable-5.1-20260831", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-fable-5.1:batch", + "name": "Anthropic: Claude Fable 5.1 (batch)", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "24315796083698fd5df743a12f1b363d450d2655921cff065f786d7cfc4ac871", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-fable-5:batch": { + "canonical_slug": "anthropic/claude-5-fable-20260609", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-fable-5:batch", + "name": "Anthropic: Claude Fable 5 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "171861553ad25983761fef9f3f541371dcc5adf2388049327184e01f4e914b24", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-haiku-4.5": { + "canonical_slug": "anthropic/claude-4.5-haiku-20251001", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": "2.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "anthropic/claude-haiku-4.5", + "name": "Anthropic: Claude Haiku 4.5", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": "0.000002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "04d052be1e348d1eb7bb21f6085c30c9ae3f6519d641414a10b615601276fb18", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-haiku-4.5:batch": { + "canonical_slug": "anthropic/claude-4.5-haiku-20251001", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": "0.625000000", + "cache_write_1h": "1.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "2.5000000" + }, + "id": "anthropic/claude-haiku-4.5:batch", + "name": "Anthropic: Claude Haiku 4.5 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": "0.000000625", + "cache_write_1h": "0.000001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "c0377d9adf49c140b36c409260d3a1183ede0c67f83d8a6eb785e79953d02cec", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.1": { + "canonical_slug": "anthropic/claude-4.1-opus-20250805", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 32000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.5000000", + "cache_write": "18.75000000", + "cache_write_1h": "30.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "15.000000", + "output": "75.000000" + }, + "id": "anthropic/claude-opus-4.1", + "name": "Anthropic: Claude Opus 4.1", + "price_per_token_usd": { + "cache_read": "0.0000015", + "cache_write": "0.00001875", + "cache_write_1h": "0.00003", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000015", + "output": "0.000075" + }, + "price_unit": "USD/token", + "source_hash": "3d53a520b2c084edf5da7294a6325d5aa80014bef0b249bf65cc0f40f5429097", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.1:batch": { + "canonical_slug": "anthropic/claude-4.1-opus-20250805", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 32000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.75000000", + "cache_write": "9.375000000", + "cache_write_1h": "15.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "7.5000000", + "output": "37.5000000" + }, + "id": "anthropic/claude-opus-4.1:batch", + "name": "Anthropic: Claude Opus 4.1 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000075", + "cache_write": "0.000009375", + "cache_write_1h": "0.000015", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000075", + "output": "0.0000375" + }, + "price_unit": "USD/token", + "source_hash": "7a9ec337d3b58ca404dd495379f3d7267d7f2b5aa80abff77b219ba1a629bd8c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.5": { + "canonical_slug": "anthropic/claude-4.5-opus-20251124", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-opus-4.5", + "name": "Anthropic: Claude Opus 4.5", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "d3da0f578c0b2feef74879d6973579862b09f1d067b8396a5debb8688b9715cb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.5:batch": { + "canonical_slug": "anthropic/claude-4.5-opus-20251124", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "3.125000000", + "cache_write_1h": "5.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "anthropic/claude-opus-4.5:batch", + "name": "Anthropic: Claude Opus 4.5 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.000003125", + "cache_write_1h": "0.000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "6b4917b4f209946082bf0b69c2209a767a96c107c05626ba0893297eaa9c6ea8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.6": { + "canonical_slug": "anthropic/claude-4.6-opus-20260205", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-opus-4.6", + "name": "Anthropic: Claude Opus 4.6", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "370f4198127f33e8cb0704bceb2e5ddb3e63ca4bdde88f368f9b145f67098426", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.6:batch": { + "canonical_slug": "anthropic/claude-4.6-opus-20260205", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "3.125000000", + "cache_write_1h": "5.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "anthropic/claude-opus-4.6:batch", + "name": "Anthropic: Claude Opus 4.6 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.000003125", + "cache_write_1h": "0.000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "f2303c15d8fdc7d93d360ee309b8db04c1d311f19e81093e2bfc4780169c3d93", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.7": { + "canonical_slug": "anthropic/claude-4.7-opus-20260416", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-opus-4.7", + "name": "Anthropic: Claude Opus 4.7", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "f73ed185934b6cb993cc5ce9c0ee62f8d409b6751a68fefb5fb1c80ba0f08c65", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.7:batch": { + "canonical_slug": "anthropic/claude-4.7-opus-20260416", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "3.125000000", + "cache_write_1h": "5.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "anthropic/claude-opus-4.7:batch", + "name": "Anthropic: Claude Opus 4.7 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.000003125", + "cache_write_1h": "0.000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "023c8318292f1dd8a20fe1245e985eb81245a6ed9bf370479710ee5ee93e6666", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.8": { + "canonical_slug": "anthropic/claude-4.8-opus-20260528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-opus-4.8", + "name": "Anthropic: Claude Opus 4.8", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "a1bccece521e2563a41cda1e5c2991b7a0cb0cc0a9f13ff0472800241f7d9000", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-4.8:batch": { + "canonical_slug": "anthropic/claude-4.8-opus-20260528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "3.125000000", + "cache_write_1h": "5.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "anthropic/claude-opus-4.8:batch", + "name": "Anthropic: Claude Opus 4.8 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.000003125", + "cache_write_1h": "0.000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "5b56737347fc847e3a227d9ef7f3af5f7ab972c2c878a6a56a39655227ae1813", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-5": { + "canonical_slug": "anthropic/claude-opus-5-20260723", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": "10.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "anthropic/claude-opus-5", + "name": "Anthropic: Claude Opus 5", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": "0.00001", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "4c41348dbb85adc807b51836f1bddd9eaeca7cb7074c7eb9172411618a456f3e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-5.5": { + "canonical_slug": "anthropic/claude-opus-5.5-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "5.000000", + "cache_write_1h": "8.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "4.000000", + "output": "20.00000" + }, + "id": "anthropic/claude-opus-5.5", + "name": "Anthropic: Claude Opus 5.5", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000005", + "cache_write_1h": "0.000008", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000004", + "output": "0.00002" + }, + "price_unit": "USD/token", + "source_hash": "4b645dfbf41f276cee10fa5df0ccb37ea65cf6a0820aa70063f8f595152db3b0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-5.5:batch": { + "canonical_slug": "anthropic/claude-opus-5.5-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "2.5000000", + "cache_write_1h": "4.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "anthropic/claude-opus-5.5:batch", + "name": "Anthropic: Claude Opus 5.5 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.0000025", + "cache_write_1h": "0.000004", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "5931ecacd1b15eee899a6dcb1d303b1ec179e346f60f947371390e21b0e7e238", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-opus-5:batch": { + "canonical_slug": "anthropic/claude-opus-5-20260723", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "3.125000000", + "cache_write_1h": "5.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "12.5000000" + }, + "id": "anthropic/claude-opus-5:batch", + "name": "Anthropic: Claude Opus 5 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.000003125", + "cache_write_1h": "0.000005", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000125" + }, + "price_unit": "USD/token", + "source_hash": "549ca13882b67e8c582c6edf318b2e5e50c48f04065bb308740c68621e6db6c1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-4": { + "canonical_slug": "anthropic/claude-4-sonnet-20250522", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000225", + "input_cache_read": "0.0000006", + "input_cache_write": "0.0000075", + "input_cache_write_1h": "0.000012", + "min_prompt_tokens": 200000, + "prompt": "0.000006" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": "3.75000000", + "cache_write_1h": "6.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "anthropic/claude-sonnet-4", + "name": "Anthropic: Claude Sonnet 4", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": "0.00000375", + "cache_write_1h": "0.000006", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "a47d03c2a0634cd892c927a4f3cebaf57b930dfa1459dd004f09a6b526184e44", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-4.5": { + "canonical_slug": "anthropic/claude-4.5-sonnet-20250929", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000225", + "input_cache_read": "0.0000006", + "input_cache_write": "0.0000075", + "input_cache_write_1h": "0.000012", + "min_prompt_tokens": 200000, + "prompt": "0.000006" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": "3.75000000", + "cache_write_1h": "6.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "anthropic/claude-sonnet-4.5", + "name": "Anthropic: Claude Sonnet 4.5", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": "0.00000375", + "cache_write_1h": "0.000006", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "bd968cd15399fdddf35a26be967b4dfc1be9bd0fa08823f59cecbdc7b66b2968", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-4.5:batch": { + "canonical_slug": "anthropic/claude-4.5-sonnet-20250929", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00001125", + "input_cache_read": "0.0000003", + "input_cache_write": "0.00000375", + "input_cache_write_1h": "0.000006", + "min_prompt_tokens": 200000, + "prompt": "0.000003" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": "1.875000000", + "cache_write_1h": "3.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.5000000", + "output": "7.5000000" + }, + "id": "anthropic/claude-sonnet-4.5:batch", + "name": "Anthropic: Claude Sonnet 4.5 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": "0.000001875", + "cache_write_1h": "0.000003", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000015", + "output": "0.0000075" + }, + "price_unit": "USD/token", + "source_hash": "9da42c0752bcb0f18d9f6b5ac845bf2b0813af3f0ca976818762d27ee1aa738a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-4.6": { + "canonical_slug": "anthropic/claude-4.6-sonnet-20260217", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": "3.75000000", + "cache_write_1h": "6.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "anthropic/claude-sonnet-4.6", + "name": "Anthropic: Claude Sonnet 4.6", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": "0.00000375", + "cache_write_1h": "0.000006", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "adbb339f6f1e3bdeab993727b4fad6714cc89c22d74baa151e60044afa3c954e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-4.6:batch": { + "canonical_slug": "anthropic/claude-4.6-sonnet-20260217", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": "1.875000000", + "cache_write_1h": "3.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.5000000", + "output": "7.5000000" + }, + "id": "anthropic/claude-sonnet-4.6:batch", + "name": "Anthropic: Claude Sonnet 4.6 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": "0.000001875", + "cache_write_1h": "0.000003", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000015", + "output": "0.0000075" + }, + "price_unit": "USD/token", + "source_hash": "ce4715fa3099078cbd9a283a9fda24f6be0b2b40d4f7799f07c64a09adf4a882", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-5": { + "canonical_slug": "anthropic/claude-sonnet-5-20260630", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": "4.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "anthropic/claude-sonnet-5", + "name": "Anthropic: Claude Sonnet 5", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": "0.000004", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "08c69bfb355a7448d91888a1e10710cd8be660ce9647795d6ec55c7ece2df165", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "anthropic/claude-sonnet-5:batch": { + "canonical_slug": "anthropic/claude-sonnet-5-20260630", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": "2.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "anthropic/claude-sonnet-5:batch", + "name": "Anthropic: Claude Sonnet 5 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": "0.000002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "a92108b4969801dbdaec532b5a13eb5d17a712e1e9c058402fdee5e6efc164e4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "arcee-ai/trinity-large-thinking": { + "canonical_slug": "arcee-ai/trinity-large-thinking", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 80000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.06000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "0.8000000" + }, + "id": "arcee-ai/trinity-large-thinking", + "name": "Arcee AI: Trinity Large Thinking", + "price_per_token_usd": { + "cache_read": "0.00000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.0000008" + }, + "price_unit": "USD/token", + "source_hash": "0a2a1520a112dbcc1baa020b9634cfb1d5e66c1ceb174a16d2638c502b9a9d04", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "baidu/ernie-4.5-vl-424b-a47b": { + "canonical_slug": "baidu/ernie-4.5-vl-424b-a47b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 123000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 123000, + "is_moderated": false, + "max_completion_tokens": 16000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.42000000", + "output": "1.25000000" + }, + "id": "baidu/ernie-4.5-vl-424b-a47b", + "name": "Baidu: ERNIE 4.5 VL 424B A47B ", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000042", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "3461ff5a753dbcaca2dc2c5f3042bceb8e80bb02067c0979671ae079bed99fe7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-1.6": { + "canonical_slug": "bytedance-seed/seed-1.6-20250625", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000004", + "min_prompt_tokens": 128000, + "prompt": "0.0000005" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "2.000000" + }, + "id": "bytedance-seed/seed-1.6", + "name": "ByteDance Seed: Seed 1.6", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "ed888594217d4b4dbe3ad6d047dd1a71cc624ce606bfdb27b706d05b1dd77d00", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-1.6-flash": { + "canonical_slug": "bytedance-seed/seed-1.6-flash-20250625", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000008", + "min_prompt_tokens": 128000, + "prompt": "0.0000001" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.3000000" + }, + "id": "bytedance-seed/seed-1.6-flash", + "name": "ByteDance Seed: Seed 1.6 Flash", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "fa4bca8771acfaf01b38ae1754f5d68d7c01e53a832dfb5988c0851f9ab84f48", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-2-1-turbo": { + "canonical_slug": "bytedance-seed/seed-2-1-turbo-20260810", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "2.5000000" + }, + "id": "bytedance-seed/seed-2-1-turbo", + "name": "ByteDance Seed: Seed 2.1 Turbo", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "7e8931c3b090bdbfc157262d98782f053929e895613b6238e19cba14cac6e154", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-2.0-code": { + "canonical_slug": "bytedance-seed/seed-2.0-code-20260730", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000006", + "min_prompt_tokens": 128000, + "prompt": "0.000001" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "3.000000" + }, + "id": "bytedance-seed/seed-2.0-code", + "name": "ByteDance Seed: Seed-2.0-Code", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "ca6607f97654adf813595ad3fef1fdcff96d2500298f1ba68932c29a47a7487e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-2.0-lite": { + "canonical_slug": "bytedance-seed/seed-2.0-lite-20260309", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000004", + "min_prompt_tokens": 128000, + "prompt": "0.0000005" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "2.000000" + }, + "id": "bytedance-seed/seed-2.0-lite", + "name": "ByteDance Seed: Seed-2.0-Lite", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "6c338a14290d6a1c83d401d7df3c7e443aa7c11e818d7049e4de26b1d33969c8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance-seed/seed-2.0-mini": { + "canonical_slug": "bytedance-seed/seed-2.0-mini-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000008", + "min_prompt_tokens": 128000, + "prompt": "0.0000002" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.4000000" + }, + "id": "bytedance-seed/seed-2.0-mini", + "name": "ByteDance Seed: Seed-2.0-Mini", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "99e7a036c03871893c237bdf95eef69cf716b595d19dccbf1de995fcdaf235ef", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "bytedance/ui-tars-1.5-7b": { + "canonical_slug": "bytedance/ui-tars-1.5-7b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 2048 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.2000000" + }, + "id": "bytedance/ui-tars-1.5-7b", + "name": "ByteDance: UI-TARS 7B ", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "dde4fea8d6182c5320debdd2c57e4f2d208443346b4e7e7f4222033276a52939", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cognitivecomputations/dolphin-mistral-24b-venice-edition": { + "canonical_slug": "venice/uncensored", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "0.9000000" + }, + "id": "cognitivecomputations/dolphin-mistral-24b-venice-edition", + "name": "Venice: Uncensored", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000009" + }, + "price_unit": "USD/token", + "source_hash": "3086897afafe540343c7fdd5875d6fd6a2f6abe213b5a49e2059eacdc1007166", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/command-a": { + "canonical_slug": "cohere/command-a-03-2025", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": true, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "cohere/command-a", + "name": "Cohere: Command A", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "5ab8b4d91905cd7bffb31f262fb3a86bc078f10f2239bc7defda70df7171b1e5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/command-a-plus": { + "canonical_slug": "cohere/command-a-plus-05-2026", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 192000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 192000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.5000000" + }, + "id": "cohere/command-a-plus", + "name": "Cohere: Command A+", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "748fa95e8e8a09033f520ed9f76222eb0e0cb79cc31c04e15be398836aa6f961", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/command-r-08-2024": { + "canonical_slug": "cohere/command-r-08-2024", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "cohere/command-r-08-2024", + "name": "Cohere: Command R (08-2024)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "794db585d65e4ae9b79e6b9d159df5e00ae4bf310b6a73ad28194ff9b0570c3c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/command-r-plus-08-2024": { + "canonical_slug": "cohere/command-r-plus-08-2024", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "cohere/command-r-plus-08-2024", + "name": "Cohere: Command R+ (08-2024)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "cfe75513074569ef29e0db143deff1d289281151e489d3e4ca127c3acde27306", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/command-r7b-12-2024": { + "canonical_slug": "cohere/command-r7b-12-2024", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0375000000", + "output": "0.15000000" + }, + "id": "cohere/command-r7b-12-2024", + "name": "Cohere: Command R7B (12-2024)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000000375", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "01f3d71eae657d6499303241db920fea84064b5baa4e11049d74fe2ab47173d9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "cohere/north-mini-code:free": { + "canonical_slug": "cohere/north-mini-code-20260617", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": true, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "cohere/north-mini-code:free", + "name": "Cohere: North Mini Code (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "a74ea37935282bd86b78a2f364ca1f38453e3ec0ca756a20c6ba716600d6d306", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-chat": { + "canonical_slug": "deepseek/deepseek-chat-v3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.32000000", + "output": "0.89000000" + }, + "id": "deepseek/deepseek-chat", + "name": "DeepSeek: DeepSeek V3", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000032", + "output": "0.00000089" + }, + "price_unit": "USD/token", + "source_hash": "8b1c2fa65a1678cbdd10ee5fa54b05fc76265a955209da8fe92205204934bd95", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-chat-v3-0324": { + "canonical_slug": "deepseek/deepseek-chat-v3-0324", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 147456 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.000000" + }, + "id": "deepseek/deepseek-chat-v3-0324", + "name": "DeepSeek: DeepSeek V3 0324", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "3ff1a24f1b939b9023b22e1113379c404ae6feda90dcf5aabb6eb3ae5e3c6402", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-chat-v3.1": { + "canonical_slug": "deepseek/deepseek-chat-v3.1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.13000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "0.95000000" + }, + "id": "deepseek/deepseek-chat-v3.1", + "name": "DeepSeek: DeepSeek V3.1", + "price_per_token_usd": { + "cache_read": "0.00000013", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.00000095" + }, + "price_unit": "USD/token", + "source_hash": "6429a1ac3dbe234b00091f9132a45ddce737b37752300f634e0a5ad49558f343", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-r1": { + "canonical_slug": "deepseek/deepseek-r1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 64000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 64000, + "is_moderated": false, + "max_completion_tokens": 16000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.7000000", + "output": "2.5000000" + }, + "id": "deepseek/deepseek-r1", + "name": "DeepSeek: R1", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000007", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "25c1d5e9b7455aadf7a9a7a1753d620c27dc44c88ceb4b1dad85c2a4b2cb0e5b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-r1-0528": { + "canonical_slug": "deepseek/deepseek-r1-0528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.35000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "2.15000000" + }, + "id": "deepseek/deepseek-r1-0528", + "name": "DeepSeek: R1 0528", + "price_per_token_usd": { + "cache_read": "0.00000035", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.00000215" + }, + "price_unit": "USD/token", + "source_hash": "9b2dfaecdfc6a6f68a14f796bc7ecb0e17cf0c92e337f81d0d5703c895daf944", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-r1-distill-llama-70b": { + "canonical_slug": "deepseek/deepseek-r1-distill-llama-70b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 7372 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "0.8000000" + }, + "id": "deepseek/deepseek-r1-distill-llama-70b", + "name": "DeepSeek: R1 Distill Llama 70B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.0000008" + }, + "price_unit": "USD/token", + "source_hash": "a6bdfea971264dae93f8d09051b8b83f5410d0f946d800b22b12e8fb9a5d3896", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v3.1-terminus": { + "canonical_slug": "deepseek/deepseek-v3.1-terminus", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.135000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.27000000", + "output": "1.000000" + }, + "id": "deepseek/deepseek-v3.1-terminus", + "name": "DeepSeek: DeepSeek V3.1 Terminus", + "price_per_token_usd": { + "cache_read": "0.000000135", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000027", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "65c8aae1cd1c4373acbfde11b3668c674b04f588d1a9801560b572c2ed6287ca", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v3.2": { + "canonical_slug": "deepseek/deepseek-v3.2-20251201", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1345000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.269000000", + "output": "0.4000000" + }, + "id": "deepseek/deepseek-v3.2", + "name": "DeepSeek: DeepSeek V3.2", + "price_per_token_usd": { + "cache_read": "0.0000001345", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000269", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "d8f345efe99f566c2dccaa711645303ee706a53023d311f7957135463d9c33c2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v3.2-exp": { + "canonical_slug": "deepseek/deepseek-v3.2-exp", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.27000000", + "output": "0.41000000" + }, + "id": "deepseek/deepseek-v3.2-exp", + "name": "DeepSeek: DeepSeek V3.2 Exp", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000027", + "output": "0.00000041" + }, + "price_unit": "USD/token", + "source_hash": "ef7fce5a3cbd09fc6a6cec64b1b0b0a787d95802cbcfcb97db9c46761b2d49b3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4-flash": { + "canonical_slug": "deepseek/deepseek-v4-flash-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1024000, + "is_moderated": false, + "max_completion_tokens": 384000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0098000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.049000000", + "output": "0.098000000" + }, + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek: DeepSeek V4 Flash 0423", + "price_per_token_usd": { + "cache_read": "0.0000000098", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000049", + "output": "0.000000098" + }, + "price_unit": "USD/token", + "source_hash": "10143bdda92556fb4a972338f8e3c7ed650b23a85b0ef03840e2fdcc6c1e43e7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4-flash-0731": { + "canonical_slug": "deepseek/deepseek-v4-flash-20260731", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.016000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.03000000", + "output": "0.32000000" + }, + "id": "deepseek/deepseek-v4-flash-0731", + "name": "DeepSeek: DeepSeek V4 Flash 0731", + "price_per_token_usd": { + "cache_read": "0.000000016", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000003", + "output": "0.00000032" + }, + "price_unit": "USD/token", + "source_hash": "113c341ca0103d267222c48b150883fc9236d0a67e0641458197e66213aaa239", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4-flash-vision-exp": { + "canonical_slug": "deepseek/deepseek-v4-flash-vision-exp-20260821", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.007000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.22000000", + "output": "0.66000000" + }, + "id": "deepseek/deepseek-v4-flash-vision-exp", + "name": "DeepSeek: DeepSeek V4 Flash Vision Exp", + "price_per_token_usd": { + "cache_read": "0.000000007", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000022", + "output": "0.00000066" + }, + "price_unit": "USD/token", + "source_hash": "45f23a85388a76004f14f63658542d5cd3d0165d02a488d205ea2302acda92e4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4-pro": { + "canonical_slug": "deepseek/deepseek-v4-pro-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1024000, + "is_moderated": false, + "max_completion_tokens": 384000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.06525000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.783000000", + "output": "1.566000000" + }, + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek: DeepSeek V4 Pro 0423", + "price_per_token_usd": { + "cache_read": "0.00000006525", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000783", + "output": "0.000001566" + }, + "price_unit": "USD/token", + "source_hash": "28caf58dc2add1a5f37f94aac101be57fdf68364df8e88cbf00ef05d4573a6e3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4-pro-0813": { + "canonical_slug": "deepseek/deepseek-v4-pro-20260813", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1024000, + "is_moderated": false, + "max_completion_tokens": 384000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0154000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.462000000", + "output": "1.386000000" + }, + "id": "deepseek/deepseek-v4-pro-0813", + "name": "DeepSeek: DeepSeek V4 Pro 0813", + "price_per_token_usd": { + "cache_read": "0.0000000154", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000462", + "output": "0.000001386" + }, + "price_unit": "USD/token", + "source_hash": "b786e73cc675f45eafde8ff13e4e66c9eedcc98adc04c258c6239875a1f759b1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4.1-flash": { + "canonical_slug": "deepseek/deepseek-v4.1-flash-20260910", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000006", + "input_cache_read": "0.000000003", + "prompt": "0.00000015", + "utc_days": [ + "saturday", + "sunday" + ] + }, + { + "completion": "0.0000006", + "input_cache_read": "0.000000003", + "prompt": "0.00000015", + "utc_days": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday" + ], + "utc_end": 100, + "utc_start": 0 + }, + { + "completion": "0.0000012", + "input_cache_read": "0.000000006", + "prompt": "0.0000003", + "utc_days": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday" + ], + "utc_end": 400, + "utc_start": 100 + }, + { + "completion": "0.0000006", + "input_cache_read": "0.000000003", + "prompt": "0.00000015", + "utc_days": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday" + ], + "utc_end": 600, + "utc_start": 400 + }, + { + "completion": "0.0000012", + "input_cache_read": "0.000000006", + "prompt": "0.0000003", + "utc_days": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday" + ], + "utc_end": 1000, + "utc_start": 600 + }, + { + "completion": "0.0000006", + "input_cache_read": "0.000000003", + "prompt": "0.00000015", + "utc_days": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday" + ], + "utc_end": 0, + "utc_start": 1000 + } + ] + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 393216 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.006000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "deepseek/deepseek-v4.1-flash", + "name": "DeepSeek: DeepSeek V4.1 Flash", + "price_per_token_usd": { + "cache_read": "0.000000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "ea8e22640738ac4978d5db36ec458472d2d36f7cee733d112223619cf3d43962", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "deepseek/deepseek-v4.1-flash:batch": { + "canonical_slug": "deepseek/deepseek-v4.1-flash-20260910", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.00336000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.112000000", + "output": "0.336000000" + }, + "id": "deepseek/deepseek-v4.1-flash:batch", + "name": "DeepSeek: DeepSeek V4.1 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.00000000336", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000112", + "output": "0.000000336" + }, + "price_unit": "USD/token", + "source_hash": "6a20827a4673297e57d0166acc3f8544c4cb231c244301a6819fe0b183d86008", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "dots-studio/dots-3-note-preview:free": { + "canonical_slug": "dots-studio/dots-3-note-preview-20260813", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 512000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 512000, + "is_moderated": false, + "max_completion_tokens": 460800 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "dots-studio/dots-3-note-preview:free", + "name": "Dots Studio: Dots3-Note Preview (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "60800218eb0223cfb9acf79e1e44ce33f3fdd334c51e8c8729f38cc74c69f4a6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "fireworks/ember-1": { + "canonical_slug": "fireworks/ember-1-20260923", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "fireworks/ember-1", + "name": "Fireworks: Ember-1", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "394ff9a9cc8c0e66b804522ded2c66240487544755dcb7cdd9a6c9544958724f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-flash": { + "canonical_slug": "google/gemini-2.5-flash", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000001", + "image": "0.0000003", + "input_audio_cache": "0.0000001", + "internal_reasoning": "0.0000025", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65535 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "2.5000000" + }, + "id": "google/gemini-2.5-flash", + "name": "Google: Gemini 2.5 Flash", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "2dcbb4f6a390720122f6aadb57109094ccd6e0d4f23faf40112e2f55cdae2b48", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-flash-image": { + "canonical_slug": "google/gemini-2.5-flash-image", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000001", + "image": "0.0000003", + "image_output": "0.00003", + "input_audio_cache": "0.0000001", + "internal_reasoning": "0.0000025", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "2.5000000" + }, + "id": "google/gemini-2.5-flash-image", + "name": "Google: Nano Banana (Gemini 2.5 Flash Image)", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "9b4d9e08933357eead7fe2c80af821a628c6672b943a5890a4454ef562423b74", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-flash-lite": { + "canonical_slug": "google/gemini-2.5-flash-lite", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000003", + "image": "0.0000001", + "input_audio_cache": "0.00000003", + "internal_reasoning": "0.0000004", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65535 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.4000000" + }, + "id": "google/gemini-2.5-flash-lite", + "name": "Google: Gemini 2.5 Flash Lite", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "41d9cd641db374c7347ecbccd4c20e4cd02fdf869765eb90c1048f7db9984f1b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-flash-lite:batch": { + "canonical_slug": "google/gemini-2.5-flash-lite", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000015", + "image": "0.00000005", + "input_audio_cache": "0.00000003", + "internal_reasoning": "0.0000002", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65535 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.2000000" + }, + "id": "google/gemini-2.5-flash-lite:batch", + "name": "Google: Gemini 2.5 Flash Lite (batch)", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "a0db5f529e0e94de77723acfb34086c6f47be64c63cc7dac6a2f3b0f0d1392ca", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-flash:batch": { + "canonical_slug": "google/gemini-2.5-flash", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000005", + "image": "0.00000015", + "input_audio_cache": "0.0000001", + "internal_reasoning": "0.00000125", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65535 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "1.25000000" + }, + "id": "google/gemini-2.5-flash:batch", + "name": "Google: Gemini 2.5 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "e11a68e6359615454c2c1a59ad5448453ba7296451c81f72a6ea6e8bcdf2b3ea", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-pro": { + "canonical_slug": "google/gemini-2.5-pro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000125", + "image": "0.00000125", + "input_audio_cache": "0.000000125", + "internal_reasoning": "0.00001", + "overrides": [ + { + "audio": "0.0000025", + "completion": "0.000015", + "input_audio_cache": "0.00000025", + "input_cache_read": "0.00000025", + "min_prompt_tokens": 200000, + "prompt": "0.0000025" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "google/gemini-2.5-pro", + "name": "Google: Gemini 2.5 Pro", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "e1c7d5bc5bb68e50a55b77bebc2f15b013640a24ab6b27bcc7fb9629849f6718", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-pro-preview": { + "canonical_slug": "google/gemini-2.5-pro-preview-06-05", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000125", + "image": "0.00000125", + "input_audio_cache": "0.000000125", + "internal_reasoning": "0.00001", + "overrides": [ + { + "audio": "0.0000025", + "completion": "0.000015", + "input_audio_cache": "0.00000025", + "input_cache_read": "0.00000025", + "min_prompt_tokens": 200000, + "prompt": "0.0000025" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "google/gemini-2.5-pro-preview", + "name": "Google: Gemini 2.5 Pro Preview 06-05", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "b2382772763463f2e6e7379efbe34af34137c4127068b0b483099ecd95478543", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-2.5-pro:batch": { + "canonical_slug": "google/gemini-2.5-pro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000000625", + "image": "0.000000625", + "input_audio_cache": "0.000000125", + "internal_reasoning": "0.000005", + "overrides": [ + { + "audio": "0.00000125", + "completion": "0.0000075", + "input_audio_cache": "0.00000025", + "input_cache_read": "0.00000025", + "min_prompt_tokens": 200000, + "prompt": "0.00000125" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.625000000", + "output": "5.000000" + }, + "id": "google/gemini-2.5-pro:batch", + "name": "Google: Gemini 2.5 Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000625", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "86ee77c55e0b4440565b6a0c9ecffd3af0ed6702c342d8711fc91d4384ef9be7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3-flash-preview": { + "canonical_slug": "google/gemini-3-flash-preview-20251217", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000001", + "image": "0.0000005", + "input_audio_cache": "0.0000001", + "internal_reasoning": "0.000003", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "3.000000" + }, + "id": "google/gemini-3-flash-preview", + "name": "Google: Gemini 3 Flash Preview", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "8b428b44c04eef3ec9b1ea0d127cd5e2ed36e222de163649f139bb0fa32a1205", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3-flash-preview:batch": { + "canonical_slug": "google/gemini-3-flash-preview-20251217", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000005", + "image": "0.00000025", + "internal_reasoning": "0.0000015", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.5000000" + }, + "id": "google/gemini-3-flash-preview:batch", + "name": "Google: Gemini 3 Flash Preview (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "4aa88923be0e1437e28118a8646ca72b38c5138fb6e3ab0fd1e048d691afdf8f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3-pro-image": { + "canonical_slug": "google/gemini-3-pro-image-20260528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000002", + "image": "0.000002", + "image_output": "0.00012", + "input_audio_cache": "0.0000002", + "internal_reasoning": "0.000012", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "google/gemini-3-pro-image", + "name": "Google: Nano Banana Pro (Gemini 3 Pro Image)", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "b4066b11a2310704c5c10cb3bf9733c5c7f0a16cdc442e53205488e4dcfab0a9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3-pro-image-preview": { + "canonical_slug": "google/gemini-3-pro-image-preview-20251120", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000002", + "image": "0.000002", + "image_output": "0.00012", + "input_audio_cache": "0.0000002", + "internal_reasoning": "0.000012", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "google/gemini-3-pro-image-preview", + "name": "Google: Nano Banana Pro (Gemini 3 Pro Image Preview)", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "637b71a1f40c89082a24890ec6ddb845cacf0ae9cb3de9f6d9a5d53a36cd5418", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-image": { + "canonical_slug": "google/gemini-3.1-flash-image-20260528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.00006", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "3.000000" + }, + "id": "google/gemini-3.1-flash-image", + "name": "Google: Nano Banana 2 (Gemini 3.1 Flash Image)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "80c1795ec108d5eec3f66badca0000564940e36de971c1794ab3e8412374e2cf", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-image-preview": { + "canonical_slug": "google/gemini-3.1-flash-image-preview-20260226", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.00006", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 58982 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "3.000000" + }, + "id": "google/gemini-3.1-flash-image-preview", + "name": "Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "f9f931a0653fd9238a2bb9f3caab607ceddc0906d9283af3dd5ab92405d2d82b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-lite": { + "canonical_slug": "google/gemini-3.1-flash-lite-20260507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000005", + "image": "0.00000025", + "input_audio_cache": "0.00000005", + "internal_reasoning": "0.0000015", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.5000000" + }, + "id": "google/gemini-3.1-flash-lite", + "name": "Google: Gemini 3.1 Flash Lite", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "6d7f6c64501158beecde2fad239d0b28cae9d8415c8f86f58ef92c0324e1397a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-lite-image": { + "canonical_slug": "google/gemini-3.1-flash-lite-image-20260630", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.00003", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 58982 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.5000000" + }, + "id": "google/gemini-3.1-flash-lite-image", + "name": "Google: Nano Banana 2 Lite (Gemini 3.1 Flash Lite Image)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "faec80c9243fa4909f821abee79b06f0fa2546631e0580e4503792f2406c649f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-lite-preview": { + "canonical_slug": "google/gemini-3.1-flash-lite-preview-20260303", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000005", + "image": "0.00000025", + "input_audio_cache": "0.00000005", + "internal_reasoning": "0.0000015", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "1.5000000" + }, + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Google: Gemini 3.1 Flash Lite Preview", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "a973ca63e1a8de1a9bc404ad2e34b39cd565d5be61669283e472abf11950d5bc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-flash-lite:batch": { + "canonical_slug": "google/gemini-3.1-flash-lite-20260507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000025", + "image": "0.000000125", + "input_audio_cache": "0.000000025", + "internal_reasoning": "0.00000075", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.125000000", + "output": "0.75000000" + }, + "id": "google/gemini-3.1-flash-lite:batch", + "name": "Google: Gemini 3.1 Flash Lite (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000125", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "cf05bb1f5c7d42ce66ee433cd49bc377e305682e1994336c9fbc95826c16d88e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-pro-preview": { + "canonical_slug": "google/gemini-3.1-pro-preview-20260219", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000002", + "image": "0.000002", + "input_audio_cache": "0.0000002", + "internal_reasoning": "0.000012", + "overrides": [ + { + "audio": "0.000004", + "completion": "0.000018", + "input_audio_cache": "0.0000004", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.000004" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "google/gemini-3.1-pro-preview", + "name": "Google: Gemini 3.1 Pro Preview", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "da4169715706d67471ec6ef7ce9d1a4b7620cab2f3de83d2d53f381be1d2b318", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-pro-preview-customtools": { + "canonical_slug": "google/gemini-3.1-pro-preview-customtools-20260219", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000002", + "image": "0.000002", + "input_audio_cache": "0.0000002", + "internal_reasoning": "0.000012", + "overrides": [ + { + "audio": "0.000004", + "completion": "0.000018", + "input_audio_cache": "0.0000004", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.000004" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "google/gemini-3.1-pro-preview-customtools", + "name": "Google: Gemini 3.1 Pro Preview Custom Tools", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "4bfacf7b8fc229c31f5b6b184b77ad8d35133fb61dae7f113e013cc6448590ef", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.1-pro-preview:batch": { + "canonical_slug": "google/gemini-3.1-pro-preview-20260219", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000001", + "image": "0.000001", + "internal_reasoning": "0.000006", + "overrides": [ + { + "audio": "0.000002", + "completion": "0.000009", + "min_prompt_tokens": 200000, + "prompt": "0.000002" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "6.000000" + }, + "id": "google/gemini-3.1-pro-preview:batch", + "name": "Google: Gemini 3.1 Pro Preview (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "c164e620f2855a9fd44b7587b8508eff1bee6eb29fcbe65d1ad68074f0c23050", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.5-flash": { + "canonical_slug": "google/gemini-3.5-flash-20260519", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000003", + "image": "0.0000015", + "input_audio_cache": "0.0000003", + "internal_reasoning": "0.000009", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.5000000", + "output": "9.000000" + }, + "id": "google/gemini-3.5-flash", + "name": "Google: Gemini 3.5 Flash", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000015", + "output": "0.000009" + }, + "price_unit": "USD/token", + "source_hash": "5806a38996a756a2684f6c420a3818d059b4df475ddea47b6c9096f3551cc5cc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.5-flash-lite": { + "canonical_slug": "google/gemini-3.5-flash-lite-20260721", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000003", + "image": "0.0000003", + "input_audio_cache": "0.00000003", + "internal_reasoning": "0.0000025", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": "0.0833333333333333000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "2.5000000" + }, + "id": "google/gemini-3.5-flash-lite", + "name": "Google: Gemini 3.5 Flash Lite", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": "0.0000000833333333333333", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "9705654766b7ac7f42e7ea72f8e44763afde43d0b6b7e5102d3f6690be5dda3b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.5-flash-lite:batch": { + "canonical_slug": "google/gemini-3.5-flash-lite-20260721", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000015", + "image": "0.00000015", + "input_audio_cache": "0.000000015", + "internal_reasoning": "0.00000125", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "1.25000000" + }, + "id": "google/gemini-3.5-flash-lite:batch", + "name": "Google: Gemini 3.5 Flash Lite (batch)", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "26948d0d5418f225657b561a70499baac14da13704f2b6428a28671fc4514171", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.5-flash:batch": { + "canonical_slug": "google/gemini-3.5-flash-20260519", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000015", + "image": "0.00000075", + "input_audio_cache": "0.00000015", + "internal_reasoning": "0.0000045", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "4.5000000" + }, + "id": "google/gemini-3.5-flash:batch", + "name": "Google: Gemini 3.5 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.0000045" + }, + "price_unit": "USD/token", + "source_hash": "a85f7cc06dc35e6aaef0c80c23d94a383ae2fa78882560f94fa3eba660829b47", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.6-flash": { + "canonical_slug": "google/gemini-3.6-flash-20260721", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000075", + "image": "0.00000075", + "input_audio_cache": "0.000000075", + "internal_reasoning": "0.00000375", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "3.75000000" + }, + "id": "google/gemini-3.6-flash", + "name": "Google: Gemini 3.6 Flash", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.00000375" + }, + "price_unit": "USD/token", + "source_hash": "b5f76f1ccba9480763f7d544444c889c766f6258afef14517af2f7fb72029a91", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.6-flash:batch": { + "canonical_slug": "google/gemini-3.6-flash-20260721", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000000375", + "image": "0.000000375", + "input_audio_cache": "0.0000000375", + "internal_reasoning": "0.000001875", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.375000000", + "output": "1.875000000" + }, + "id": "google/gemini-3.6-flash:batch", + "name": "Google: Gemini 3.6 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000375", + "output": "0.000001875" + }, + "price_unit": "USD/token", + "source_hash": "ddddfd23720d427290734717399c5520f2e4d666fd74f8aee833a27ac6812e5c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.7-flash": { + "canonical_slug": "google/gemini-3.7-flash-20260813", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000075", + "image": "0.00000075", + "input_audio_cache": "0.000000075", + "internal_reasoning": "0.00000375", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "3.75000000" + }, + "id": "google/gemini-3.7-flash", + "name": "Google: Gemini 3.7 Flash", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.00000375" + }, + "price_unit": "USD/token", + "source_hash": "540a29048b660776ca474fba9487a3eaaf0146923b76db6328f8d3e86df58ef6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.7-flash:batch": { + "canonical_slug": "google/gemini-3.7-flash-20260813", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000000375", + "image": "0.000000375", + "input_audio_cache": "0.0000000375", + "internal_reasoning": "0.000001875", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.375000000", + "output": "1.875000000" + }, + "id": "google/gemini-3.7-flash:batch", + "name": "Google: Gemini 3.7 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000375", + "output": "0.000001875" + }, + "price_unit": "USD/token", + "source_hash": "2d43baf7c10a23fc1d17a5af39add6c4a99ab5b4b46f371b59642161a05e513c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.8-flash": { + "canonical_slug": "google/gemini-3.8-flash-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000075", + "image": "0.00000075", + "input_audio_cache": "0.000000075", + "internal_reasoning": "0.00000375", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "3.75000000" + }, + "id": "google/gemini-3.8-flash", + "name": "Google: Gemini 3.8 Flash", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.00000375" + }, + "price_unit": "USD/token", + "source_hash": "606d2b5452e68e8a68a1abc54ce3e80931ba44280cd1cc0ff7a9901abd87c94c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemini-3.8-flash:batch": { + "canonical_slug": "google/gemini-3.8-flash-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000000375", + "image": "0.000000375", + "input_audio_cache": "0.0000000375", + "internal_reasoning": "0.000001875", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.375000000", + "output": "1.875000000" + }, + "id": "google/gemini-3.8-flash:batch", + "name": "Google: Gemini 3.8 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000375", + "output": "0.000001875" + }, + "price_unit": "USD/token", + "source_hash": "3c9f428fe3cee4bcb08eacc614baf4467026233ed63306570a915e37df428537", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-2-27b-it": { + "canonical_slug": "google/gemma-2-27b-it", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 2048 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.65000000", + "output": "0.65000000" + }, + "id": "google/gemma-2-27b-it", + "name": "Google: Gemma 2 27B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000065", + "output": "0.00000065" + }, + "price_unit": "USD/token", + "source_hash": "3a3a04b0697aac9ca476e7659cb907da68cd914ad3ad7f84577ba708bd0f9164", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-3-12b-it": { + "canonical_slug": "google/gemma-3-12b-it", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.15000000" + }, + "id": "google/gemma-3-12b-it", + "name": "Google: Gemma 3 12B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "9979a85e98ddcea660faffeebae06bd57101ccb5207f9f66be7458852a6cd8f8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-3-27b-it": { + "canonical_slug": "google/gemma-3-27b-it", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.08000000", + "output": "0.45000000" + }, + "id": "google/gemma-3-27b-it", + "name": "Google: Gemma 3 27B", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000008", + "output": "0.00000045" + }, + "price_unit": "USD/token", + "source_hash": "7d837ebd3c844f9ddfe2bf2a4c1b6efad715d6abc42ef4d77cb4ce68b576f09f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-3-4b-it": { + "canonical_slug": "google/gemma-3-4b-it", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.1000000" + }, + "id": "google/gemma-3-4b-it", + "name": "Google: Gemma 3 4B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000001" + }, + "price_unit": "USD/token", + "source_hash": "9f169eeb1ef6c867c7899d0ce7f766274064f4cc851fec68c24813a1da724235", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-4-26b-a4b-it": { + "canonical_slug": "google/gemma-4-26b-a4b-it-20260403", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09000000", + "output": "0.3000000" + }, + "id": "google/gemma-4-26b-a4b-it", + "name": "Google: Gemma 4 26B A4B ", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "619bcd53649d6854a02f131e6202cf7c76a80294c91e6c05cd5b5c01334680a1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-4-26b-a4b-it:free": { + "canonical_slug": "google/gemma-4-26b-a4b-it-20260403", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "google/gemma-4-26b-a4b-it:free", + "name": "Google: Gemma 4 26B A4B (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "52c1066a0d32bdedd9131d3d68a0d35a1f3ff8411d453da9794d711e2c0b64e6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-4-31b-it": { + "canonical_slug": "google/gemma-4-31b-it-20260402", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09000000", + "output": "0.34000000" + }, + "id": "google/gemma-4-31b-it", + "name": "Google: Gemma 4 31B", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009", + "output": "0.00000034" + }, + "price_unit": "USD/token", + "source_hash": "7db35e677c760af3f44b8e78e3ba88f0f1f066884c04ed3a644df5f83314c52d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/gemma-4-31b-it:free": { + "canonical_slug": "google/gemma-4-31b-it-20260402", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "google/gemma-4-31b-it:free", + "name": "Google: Gemma 4 31B (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "df08551c1d3fc7f6392e4a0899abe4d9cb25f5d3e12f93522fbdfa10bd730bdc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/lyria-3-clip-preview": { + "canonical_slug": "google/lyria-3-clip-preview-20260330", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "google/lyria-3-clip-preview", + "name": "Google: Lyria 3 Clip Preview", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "c5e6c473b7f5370edf5415ce8fa369350bf274eb4199f3293fe2ff1354d47f0d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "google/lyria-3-pro-preview": { + "canonical_slug": "google/lyria-3-pro-preview-20260330", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "google/lyria-3-pro-preview", + "name": "Google: Lyria 3 Pro Preview", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "81e38a57a911dbdcbf1e7e77dbbd5ac4c614debc1fba4ca20be72519987024b2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "gryphe/mythomax-l2-13b": { + "canonical_slug": "gryphe/mythomax-l2-13b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 4096, + "is_moderated": false, + "max_completion_tokens": 3686 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.08000000", + "output": "0.11000000" + }, + "id": "gryphe/mythomax-l2-13b", + "name": "MythoMax 13B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000008", + "output": "0.00000011" + }, + "price_unit": "USD/token", + "source_hash": "f55c659f83f60d0d82021158361d9f6a79c2137b6767825ee55f7a917568ed1c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "ibm-granite/granite-4.0-h-micro": { + "canonical_slug": "ibm-granite/granite-4.0-h-micro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131000, + "is_moderated": false, + "max_completion_tokens": 117900 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.017000000", + "output": "0.112000000" + }, + "id": "ibm-granite/granite-4.0-h-micro", + "name": "IBM: Granite 4.0 Micro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000017", + "output": "0.000000112" + }, + "price_unit": "USD/token", + "source_hash": "59c33051dda9fd7808da2fdc733071a3517c2c519703addca738691f9768c0a0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "ibm-granite/granite-4.2-8b": { + "canonical_slug": "ibm-granite/granite-4.2-8b-20260831", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.25000000" + }, + "id": "ibm-granite/granite-4.2-8b", + "name": "IBM: Granite 4.2 8B", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.00000025" + }, + "price_unit": "USD/token", + "source_hash": "f3620c77ba40b6450abd94b4eaed27974769519b37f2edee58feeffd5344e4a4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inception/mercury-2": { + "canonical_slug": "inception/mercury-2-20260304", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 50000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "0.75000000" + }, + "id": "inception/mercury-2", + "name": "Inception: Mercury 2", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "e056cec5c4304fbc51e7a5000f9909daeffea498f90746827c6b1711a49867c2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inception/mercury-2.5": { + "canonical_slug": "inception/mercury-2.5-20260908", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 260000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 260000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.004000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.04000000", + "output": "0.15000000" + }, + "id": "inception/mercury-2.5", + "name": "Inception: Mercury 2.5", + "price_per_token_usd": { + "cache_read": "0.000000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000004", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "43bc56b05b23d79f6ed37b13a56092c07a4251fe2626fb7b5c65f26397a3cdf3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inclusionai/ling-3.0-flash": { + "canonical_slug": "inclusionai/ling-3.0-flash-20260723", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0042000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.021000000", + "output": "0.063000000" + }, + "id": "inclusionai/ling-3.0-flash", + "name": "inclusionAI: Ling 3.0 Flash", + "price_per_token_usd": { + "cache_read": "0.0000000042", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000021", + "output": "0.000000063" + }, + "price_unit": "USD/token", + "source_hash": "b435a17aa9bafb8daf83c57650b37159ae5ac6e9b180b6aed567533994227cd1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inclusionai/ling-3.0-flash-fin": { + "canonical_slug": "inclusionai/ling-3.0-flash-fin-20260827", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.012000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.18000000" + }, + "id": "inclusionai/ling-3.0-flash-fin", + "name": "inclusionAI: Ling 3.0 Flash Fin", + "price_per_token_usd": { + "cache_read": "0.000000012", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.00000018" + }, + "price_unit": "USD/token", + "source_hash": "8d33af26413c03c5d96d8ce0ef3a6a3b7701bb28976f7dcb6fc019d76f37b46b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inclusionai/ling-3.0-flash-fin:free": { + "canonical_slug": "inclusionai/ling-3.0-flash-fin-20260827", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "inclusionai/ling-3.0-flash-fin:free", + "name": "inclusionAI: Ling 3.0 Flash Fin (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "f7951c9b549c1059dacd3d5dd474da90135ecc49fdc2206c9bdebf4023de2d91", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inclusionai/ling-3.0-flash-sante:free": { + "canonical_slug": "inclusionai/ling-3.0-flash-sante-20260904", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "inclusionai/ling-3.0-flash-sante:free", + "name": "inclusionAI: Ling 3.0 Flash Sante (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "29e3cfaee756d7b1e534e55fbb65a47ca2267974ac2bb77d80606785ef331eba", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inclusionai/ling-3.0-flash-vl": { + "canonical_slug": "inclusionai/ling-3.0-flash-vl-20260910", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.012000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.18000000" + }, + "id": "inclusionai/ling-3.0-flash-vl", + "name": "inclusionAI: Ling 3.0 Flash VL", + "price_per_token_usd": { + "cache_read": "0.000000012", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.00000018" + }, + "price_unit": "USD/token", + "source_hash": "b1bf0823f56d899ff33e6331bfb2136f1cf3b7f32af7f73c8c0d8fd95114d8b3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inference-net/schematron-v2-small": { + "canonical_slug": "inference-net/schematron-v2-small-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.23000000" + }, + "id": "inference-net/schematron-v2-small", + "name": "Inference.net: Schematron V2 Small", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000023" + }, + "price_unit": "USD/token", + "source_hash": "f8dc57cbb2d3ba8c714bab937b044bb0082cceec698e01607b71932fbaf5fb8d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "inference-net/schematron-v2-turbo": { + "canonical_slug": "inference-net/schematron-v2-turbo-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.03000000", + "output": "0.15000000" + }, + "id": "inference-net/schematron-v2-turbo", + "name": "Inference.net: Schematron V2 Turbo", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000003", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "2ebeab7c31ee5edc94e2d020996b4c986c0fb0b03b33afe956df9c6a3b713a64", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "kwaipilot/kat-coder-pro-v2.5": { + "canonical_slug": "kwaipilot/kat-coder-pro-v2.5-20260710", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.74000000", + "output": "2.96000000" + }, + "id": "kwaipilot/kat-coder-pro-v2.5", + "name": "Kwaipilot: KAT-Coder-Pro V2.5", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000074", + "output": "0.00000296" + }, + "price_unit": "USD/token", + "source_hash": "dafe8e96b37491b94c7530eb0cbf42e05289df8e55b8e77f54cda464255b3f5a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "liquid/lfm-2.5-2.6b:free": { + "canonical_slug": "liquid/lfm-2.5-2.6b-20260811", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "liquid/lfm-2.5-2.6b:free", + "name": "LiquidAI: LFM2.5-2.6B (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "01feaa71e33f32f9a64374fb566664f2752fda76eadc6e9951f1dff99e54c60d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mancer/weaver": { + "canonical_slug": "mancer/weaver", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8000, + "is_moderated": false, + "max_completion_tokens": 6000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "0.75000000" + }, + "id": "mancer/weaver", + "name": "Mancer: Weaver (alpha)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "26e3db8e5505eefe98da0cb3efc782f018fada7ee5a5ee64de35b37b52fb678d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meituan/longcat-2.0": { + "canonical_slug": "meituan/longcat-2.0-20260720", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048756, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048756, + "is_moderated": false, + "max_completion_tokens": 262144 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.006000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "meituan/longcat-2.0", + "name": "Meituan: LongCat 2.0", + "price_per_token_usd": { + "cache_read": "0.000000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "1610622baac7b6f55520c201b50c08adddf547d16739e1210709f96a5f636d7b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-3.1-70b-instruct": { + "canonical_slug": "meta-llama/llama-3.1-70b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "0.4000000" + }, + "id": "meta-llama/llama-3.1-70b-instruct", + "name": "Meta: Llama 3.1 70B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "7612bdf92b83ff6d40ec86dfdd7b57e3420d4b68dc1553cbcf7ebd1cd0bab931", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-3.1-8b-instruct": { + "canonical_slug": "meta-llama/llama-3.1-8b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.08000000" + }, + "id": "meta-llama/llama-3.1-8b-instruct", + "name": "Meta: Llama 3.1 8B Instruct", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000008" + }, + "price_unit": "USD/token", + "source_hash": "fb4156b98007e2a3f6b890feca3ecc5175b3cb6ab7721ad06f0ac5aa125fe43e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-3.2-1b-instruct": { + "canonical_slug": "meta-llama/llama-3.2-1b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 60000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 60000, + "is_moderated": false, + "max_completion_tokens": 54000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.027000000", + "output": "0.201000000" + }, + "id": "meta-llama/llama-3.2-1b-instruct", + "name": "Meta: Llama 3.2 1B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000027", + "output": "0.000000201" + }, + "price_unit": "USD/token", + "source_hash": "0dc1064167d25897009467ffead1e4980c58332bb7593c0e8d5fad4ec22e5ba3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-3.2-3b-instruct": { + "canonical_slug": "meta-llama/llama-3.2-3b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.33000000" + }, + "id": "meta-llama/llama-3.2-3b-instruct", + "name": "Meta: Llama 3.2 3B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000033" + }, + "price_unit": "USD/token", + "source_hash": "3e4f13ee3edd423cac939a53543f3c4099d808c523e2b88a16bcd68d323c1d10", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-3.3-70b-instruct": { + "canonical_slug": "meta-llama/llama-3.3-70b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.32000000" + }, + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Meta: Llama 3.3 70B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.00000032" + }, + "price_unit": "USD/token", + "source_hash": "86f27ea93e5f7584375c9b09e383677a750d27864c6ef42234eefc60340f1c88", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-4-maverick": { + "canonical_slug": "meta-llama/llama-4-maverick-17b-128e-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1875000000", + "output": "0.6525000000" + }, + "id": "meta-llama/llama-4-maverick", + "name": "Meta: Llama 4 Maverick", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001875", + "output": "0.0000006525" + }, + "price_unit": "USD/token", + "source_hash": "88c025a3b8cb18b7a68eae7c629e398e43ccdb45c629d860bb803bca99f26d92", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-4-scout": { + "canonical_slug": "meta-llama/llama-4-scout-17b-16e-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 327680, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.3000000" + }, + "id": "meta-llama/llama-4-scout", + "name": "Meta: Llama 4 Scout", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "98e355804c242531264caa3178ed9f54962499d7cb06b16d63c61a41906c0658", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta-llama/llama-guard-4-12b": { + "canonical_slug": "meta-llama/llama-guard-4-12b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 163840, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 163840, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.18000000", + "output": "0.18000000" + }, + "id": "meta-llama/llama-guard-4-12b", + "name": "Meta: Llama Guard 4 12B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000018", + "output": "0.00000018" + }, + "price_unit": "USD/token", + "source_hash": "c6367e32d47758da2437808d6b680627c1b0ad4c163a69b6c603fba8325e2d86", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-glimmer-30b": { + "canonical_slug": "meta/muse-glimmer-30b-20260810", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "meta/muse-glimmer-30b", + "name": "Meta: Muse Glimmer 30B", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "441b1479d21b8ad32c830dcb601f1ddf2a400ca7102b28817391f2238a08f8dc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-spark-1.1": { + "canonical_slug": "meta/muse-spark-1.1-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.0025" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": true, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "4.25000000" + }, + "id": "meta/muse-spark-1.1", + "name": "Meta: Muse Spark 1.1", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00000425" + }, + "price_unit": "USD/token", + "source_hash": "db31c6d9c8d9fdaf869ad5639ec602c2683426ca26038e29ef4826fe4ac5cfae", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-spark-1.2": { + "canonical_slug": "meta/muse-spark-1.2-20260805", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.0025" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": true, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "4.25000000" + }, + "id": "meta/muse-spark-1.2", + "name": "Meta: Muse Spark 1.2", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00000425" + }, + "price_unit": "USD/token", + "source_hash": "9d14db46902c3c81944653c015a2f0b25a3df2ab8e330a3f465b25980b6a14b9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-spark-1.2-contributor": { + "canonical_slug": "meta/muse-spark-1.2-contributor-20260805", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.0025" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": true, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.002000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.2000000" + }, + "id": "meta/muse-spark-1.2-contributor", + "name": "Meta: Muse Spark 1.2 Contributor", + "price_per_token_usd": { + "cache_read": "0.000000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "fb0588b26be21538914b0457ecc0e29fc1dcb26dbe3f60b362c16e471f9db65f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-spark-1.3": { + "canonical_slug": "meta/muse-spark-1.3-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.0025" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": true, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "4.25000000" + }, + "id": "meta/muse-spark-1.3", + "name": "Meta: Muse Spark 1.3", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00000425" + }, + "price_unit": "USD/token", + "source_hash": "7ef9a143ba11fc05795123c71942c502b7cae82ae887386b5dea248f888a574c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "meta/muse-spark-1.3-contributor": { + "canonical_slug": "meta/muse-spark-1.3-contributor-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.0025" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": true, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.002000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.2000000" + }, + "id": "meta/muse-spark-1.3-contributor", + "name": "Meta: Muse Spark 1.3 Contributor", + "price_per_token_usd": { + "cache_read": "0.000000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "c7fc0967845c80eae3a8235989b83c7bf2c9b55f796c1f8afa395c13a261ac88", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "microsoft/phi-4": { + "canonical_slug": "microsoft/phi-4", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 16384, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 16384, + "is_moderated": false, + "max_completion_tokens": 14745 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.07000000", + "output": "0.14000000" + }, + "id": "microsoft/phi-4", + "name": "Microsoft: Phi 4", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000007", + "output": "0.00000014" + }, + "price_unit": "USD/token", + "source_hash": "3ce206bb919edb83defcea1e78b85351865540bf9c3a9ba1f176edef91db3c82", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "microsoft/wizardlm-2-8x22b": { + "canonical_slug": "microsoft/wizardlm-2-8x22b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65535, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65535, + "is_moderated": false, + "max_completion_tokens": 8000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.62000000", + "output": "0.62000000" + }, + "id": "microsoft/wizardlm-2-8x22b", + "name": "WizardLM-2 8x22B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000062", + "output": "0.00000062" + }, + "price_unit": "USD/token", + "source_hash": "6c72ea1f8ca4325da431f9a17011845ebaf5f10d0d49d70bf9f797caff918806", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-01": { + "canonical_slug": "minimax/minimax-01", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000192, + "is_moderated": false, + "max_completion_tokens": 900172 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.1000000" + }, + "id": "minimax/minimax-01", + "name": "MiniMax: MiniMax-01", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000011" + }, + "price_unit": "USD/token", + "source_hash": "7bf8f76a4f84d4e531895a7ff404350d70abf397b785582608e375b78aebfd6e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m1": { + "canonical_slug": "minimax/minimax-m1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 40000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "2.2000000" + }, + "id": "minimax/minimax-m1", + "name": "MiniMax: MiniMax M1", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.0000022" + }, + "price_unit": "USD/token", + "source_hash": "9b6b61694dec2e222bd35ba2c342f609f99194f71d34cffe0764282936790925", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m2": { + "canonical_slug": "minimax/minimax-m2", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 196608, + "is_moderated": false, + "max_completion_tokens": 176947 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "minimax/minimax-m2", + "name": "MiniMax: MiniMax M2", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "15cb2275629516af9366ab75214415feb280a5409d40e9151f58f7021ec9d156", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m2-her": { + "canonical_slug": "minimax/minimax-m2-her-20260123", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 2048 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "minimax/minimax-m2-her", + "name": "MiniMax: MiniMax M2-her", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "e6e5e97ea71ca8f00eb459b78b020034b7e070a897591dcc13b72df56a94e077", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m2.1": { + "canonical_slug": "minimax/minimax-m2.1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 204800, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "minimax/minimax-m2.1", + "name": "MiniMax: MiniMax M2.1", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "fd92921292264e48727557469950e34c2b0963e93b925e972febd70f79935394", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m2.5": { + "canonical_slug": "minimax/minimax-m2.5-20260211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 200000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.027000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.27000000", + "output": "1.08000000" + }, + "id": "minimax/minimax-m2.5", + "name": "MiniMax: MiniMax M2.5", + "price_per_token_usd": { + "cache_read": "0.000000027", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000027", + "output": "0.00000108" + }, + "price_unit": "USD/token", + "source_hash": "1f95e59909a33ccae7900b1427499a9cee1472f82030fd977391b648446d2307", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m2.7": { + "canonical_slug": "minimax/minimax-m2.7-20260318", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 204800, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.06000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "minimax/minimax-m2.7", + "name": "MiniMax: MiniMax M2.7", + "price_per_token_usd": { + "cache_read": "0.00000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "ffa79cda162c03f1e5db2514e5a727eed71985f4041c36612f6372ea1964c08b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "minimax/minimax-m3": { + "canonical_slug": "minimax/minimax-m3-20260531", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 524288, + "is_moderated": false, + "max_completion_tokens": 512000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.06000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.2000000" + }, + "id": "minimax/minimax-m3", + "name": "MiniMax: MiniMax M3", + "price_per_token_usd": { + "cache_read": "0.00000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "dd9ee4e2b6a356cc78bbb336538e233e8b924abaedff6cc4c495dd63eca349ad", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/codestral-2508": { + "canonical_slug": "mistralai/codestral-2508", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 204800 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "0.9000000" + }, + "id": "mistralai/codestral-2508", + "name": "Mistral: Codestral 2508", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000009" + }, + "price_unit": "USD/token", + "source_hash": "4cd39124920af54a520d916d163c38a9b5e5afd882a5d96878665c002d81a913", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/codestral-2508:batch": { + "canonical_slug": "mistralai/codestral-2508", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 204800 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.45000000" + }, + "id": "mistralai/codestral-2508:batch", + "name": "Mistral: Codestral 2508 (batch)", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000045" + }, + "price_unit": "USD/token", + "source_hash": "29044070837a52d725da0d1a6f29df7f9ea21b785616d17d21ed0bc7d28a9ca3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/devstral-2512": { + "canonical_slug": "mistralai/devstral-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "2.000000" + }, + "id": "mistralai/devstral-2512", + "name": "Mistral: Devstral 2 2512", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "de097c231e72245f0769f5b42b3bc1a0ceebfbff5140da4f2cfa58857003ccd2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/ministral-14b-2512": { + "canonical_slug": "mistralai/ministral-14b-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "0.2000000" + }, + "id": "mistralai/ministral-14b-2512", + "name": "Mistral: Ministral 3 14B 2512", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "ee5848b71965030e13ae6255732115518f1ba1ca659e0961de6497b26e30d239", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/ministral-3b-2512": { + "canonical_slug": "mistralai/ministral-3b-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 104857 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.1000000" + }, + "id": "mistralai/ministral-3b-2512", + "name": "Mistral: Ministral 3 3B 2512", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000001" + }, + "price_unit": "USD/token", + "source_hash": "feea73edb36df8bc0acd6d053170a52d06e0cfb86b420522d03ec203165804d3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/ministral-8b-2512": { + "canonical_slug": "mistralai/ministral-8b-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.15000000" + }, + "id": "mistralai/ministral-8b-2512", + "name": "Mistral: Ministral 3 8B 2512", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "b1de38499dea9ac055b49350f3402e46fc64f769cdc0a80bcbf68940a0177b34", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/ministral-8b-2512:batch": { + "canonical_slug": "mistralai/ministral-8b-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.075000000" + }, + "id": "mistralai/ministral-8b-2512:batch", + "name": "Mistral: Ministral 3 8B 2512 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.000000075" + }, + "price_unit": "USD/token", + "source_hash": "c77a9758bd0e663166e2e4934ebe3917f25685a0fc9b121bab2ab5ac8e8b614d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-large": { + "canonical_slug": "mistralai/mistral-large", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 102400 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "mistralai/mistral-large", + "name": "Mistral Large", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "09dd27d16977794d9dcbace0feb7f18d9a48dfd5b5024dd8111ee60ec69d58fb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-large-2407": { + "canonical_slug": "mistralai/mistral-large-2407", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 104857 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "mistralai/mistral-large-2407", + "name": "Mistral Large 2407", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "27da25cbea3916864fec1437da5bca32f7f5eedcf22e7085660a3e48b3cf4326", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-large-2512": { + "canonical_slug": "mistralai/mistral-large-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "1.5000000" + }, + "id": "mistralai/mistral-large-2512", + "name": "Mistral: Mistral Large 3 2512", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "e7a8eeb60e054f56fe64cb63490440f81d37c89fb399d669e8acab6f824ac5b2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-large-2512:batch": { + "canonical_slug": "mistralai/mistral-large-2512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "0.75000000" + }, + "id": "mistralai/mistral-large-2512:batch", + "name": "Mistral: Mistral Large 3 2512 (batch)", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "42ca084efa493b1a11dc4e8a5232b45bc1f894c6d376d2e4f381119d1c94a4bd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-medium-3": { + "canonical_slug": "mistralai/mistral-medium-3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 104857 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "2.000000" + }, + "id": "mistralai/mistral-medium-3", + "name": "Mistral: Mistral Medium 3", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "503aa749255ca8e33da2da54d4c4d8c75fadd6d2969a87463d7952131e279418", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-medium-3-5": { + "canonical_slug": "mistralai/mistral-medium-3.5-20260430", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.5000000", + "output": "7.5000000" + }, + "id": "mistralai/mistral-medium-3-5", + "name": "Mistral: Mistral Medium 3.5", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000015", + "output": "0.0000075" + }, + "price_unit": "USD/token", + "source_hash": "014555c3a5713d0519a6904facd1795b411cb9672b838699c80858bf4b3e40d8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-medium-3-5:batch": { + "canonical_slug": "mistralai/mistral-medium-3.5-20260430", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "3.75000000" + }, + "id": "mistralai/mistral-medium-3-5:batch", + "name": "Mistral: Mistral Medium 3.5 (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.00000375" + }, + "price_unit": "USD/token", + "source_hash": "5e3de03704b8d4aa8c92be2ce624f531784e35616b75c064d441e2932ce3b720", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-medium-3.1": { + "canonical_slug": "mistralai/mistral-medium-3.1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 104857 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "2.000000" + }, + "id": "mistralai/mistral-medium-3.1", + "name": "Mistral: Mistral Medium 3.1", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "a2732d36a69e68c00c74cd6033767df15e4ffed25247ddab35c73d0b0d849924", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-medium-3.1:batch": { + "canonical_slug": "mistralai/mistral-medium-3.1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 104857 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.000000" + }, + "id": "mistralai/mistral-medium-3.1:batch", + "name": "Mistral: Mistral Medium 3.1 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "dac1bcefbbcae393f8a0c466fccf1c268b572a9a943eeef10f57a45350b89edb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-nemo": { + "canonical_slug": "mistralai/mistral-nemo", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.019000000", + "output": "0.03000000" + }, + "id": "mistralai/mistral-nemo", + "name": "Mistral: Mistral Nemo", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000019", + "output": "0.00000003" + }, + "price_unit": "USD/token", + "source_hash": "d1e28d13198ee9d75c20a0a874019e9707e0a650e276bdcab629a5cb5ac732f6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-saba": { + "canonical_slug": "mistralai/mistral-saba-2502", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 26214 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "0.6000000" + }, + "id": "mistralai/mistral-saba", + "name": "Mistral: Saba", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "841d71a8178ce49c72a5ae29bee11dfd492a2e6c82c7736c3fefde6b2fab78d8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-small-24b-instruct-2501": { + "canonical_slug": "mistralai/mistral-small-24b-instruct-2501", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.08000000" + }, + "id": "mistralai/mistral-small-24b-instruct-2501", + "name": "Mistral: Mistral Small 3", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000008" + }, + "price_unit": "USD/token", + "source_hash": "b09750f6567baac5d3f498313238a4db1db4de77279fefc0a37ca90695588578", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-small-2603": { + "canonical_slug": "mistralai/mistral-small-2603", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "mistralai/mistral-small-2603", + "name": "Mistral: Mistral Small 4", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "ebfa0971bf22ed1d4f5ab01699bc7868cf0bef24173308a9b39aa912e1110d99", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-small-2603:batch": { + "canonical_slug": "mistralai/mistral-small-2603", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 209715 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.3000000" + }, + "id": "mistralai/mistral-small-2603:batch", + "name": "Mistral: Mistral Small 4 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "089bff49a2d34e9df36d81d96101aff9b9f653091c737dbce813cfed1190786d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-small-3.1-24b-instruct": { + "canonical_slug": "mistralai/mistral-small-3.1-24b-instruct-2503", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 102400 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.351000000", + "output": "0.555000000" + }, + "id": "mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral: Mistral Small 3.1 24B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000351", + "output": "0.000000555" + }, + "price_unit": "USD/token", + "source_hash": "b79bdec58fd77969fc72a01efa289f75680448f14f4cb20a7873db58be3e9eb9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mistral-small-3.2-24b-instruct": { + "canonical_slug": "mistralai/mistral-small-3.2-24b-instruct-2506", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09375000000", + "output": "0.25000000" + }, + "id": "mistralai/mistral-small-3.2-24b-instruct", + "name": "Mistral: Mistral Small 3.2 24B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009375", + "output": "0.00000025" + }, + "price_unit": "USD/token", + "source_hash": "421a2390ad389705e7b77edf996cc4ad0c42c8ddcd772512cf87a45e23e7dcad", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/mixtral-8x22b-instruct": { + "canonical_slug": "mistralai/mixtral-8x22b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 52428 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "mistralai/mixtral-8x22b-instruct", + "name": "Mistral: Mixtral 8x22B Instruct", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "bf1b47038d8804f23408b1a6946f23be39fa79253c35369689f3454f59a8182b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "mistralai/voxtral-small-24b-2507": { + "canonical_slug": "mistralai/voxtral-small-24b-2507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0001" + }, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 26214 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.3000000" + }, + "id": "mistralai/voxtral-small-24b-2507", + "name": "Mistral: Voxtral Small 24B 2507", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "d2cc513a62909d5f8d671c8b39af71375ac1ac1842b001dc4cae468d994ed830", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2": { + "canonical_slug": "moonshotai/kimi-k2", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 98304 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.57000000", + "output": "2.3000000" + }, + "id": "moonshotai/kimi-k2", + "name": "MoonshotAI: Kimi K2 0711", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000057", + "output": "0.0000023" + }, + "price_unit": "USD/token", + "source_hash": "b1fdecd81d2636341c88f146310bd880120407d58fc899797230595ea46041c2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2-0905": { + "canonical_slug": "moonshotai/kimi-k2-0905", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 98304 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.5000000" + }, + "id": "moonshotai/kimi-k2-0905", + "name": "MoonshotAI: Kimi K2 0905", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "01d74264f4a2f8ad1fd42d03a07fae10560ae88b22f9c877c51912e43df96765", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2-thinking": { + "canonical_slug": "moonshotai/kimi-k2-thinking-20251106", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 98304 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.5000000" + }, + "id": "moonshotai/kimi-k2-thinking", + "name": "MoonshotAI: Kimi K2 Thinking", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "0f26b591b81b62c9db9a394b701b43b18988e885838702bd775bb2ce51baad93", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2.5": { + "canonical_slug": "moonshotai/kimi-k2.5-0127", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.07000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.45000000", + "output": "2.25000000" + }, + "id": "moonshotai/kimi-k2.5", + "name": "MoonshotAI: Kimi K2.5", + "price_per_token_usd": { + "cache_read": "0.00000007", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000045", + "output": "0.00000225" + }, + "price_unit": "USD/token", + "source_hash": "4b15a24336a7d2fc56448e0f46c86ed2609b3f02598783b571d31e6bf6800576", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2.6": { + "canonical_slug": "moonshotai/kimi-k2.6-20260420", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.16000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.95000000", + "output": "4.000000" + }, + "id": "moonshotai/kimi-k2.6", + "name": "MoonshotAI: Kimi K2.6", + "price_per_token_usd": { + "cache_read": "0.00000016", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000095", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "c3feb1d5ec9afb670c35f0e055819c66908a6f0c37ea0447425b788be1ecfa0e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k2.7-code": { + "canonical_slug": "moonshotai/kimi-k2.7-code-20260612", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.18000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6562000000", + "output": "3.3000000" + }, + "id": "moonshotai/kimi-k2.7-code", + "name": "MoonshotAI: Kimi K2.7 Code", + "price_per_token_usd": { + "cache_read": "0.00000018", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006562", + "output": "0.0000033" + }, + "price_unit": "USD/token", + "source_hash": "4270f08540048da96439aafcd1ddc35b9a75399c964aa61441df69d7f4219a00", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k3": { + "canonical_slug": "moonshotai/kimi-k3-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "moonshotai/kimi-k3", + "name": "MoonshotAI: Kimi K3", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "47247fcca26b3410bcca74fd3d9694f28b1c2dbc79427ccf647736d06f726dd9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "moonshotai/kimi-k3:batch": { + "canonical_slug": "moonshotai/kimi-k3-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.228000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.28000000", + "output": "11.4000000" + }, + "id": "moonshotai/kimi-k3:batch", + "name": "MoonshotAI: Kimi K3 (batch)", + "price_per_token_usd": { + "cache_read": "0.000000228", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000228", + "output": "0.0000114" + }, + "price_unit": "USD/token", + "source_hash": "8f348e805c71edd87db64a8b44f5e8d4704fdc8782df9409dc9b90c1a2da82a4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "morph/morph-v3-fast": { + "canonical_slug": "morph/morph-v3-fast", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 81920, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 81920, + "is_moderated": false, + "max_completion_tokens": 38000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "1.2000000" + }, + "id": "morph/morph-v3-fast", + "name": "Morph: Morph V3 Fast", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "dc37e23e7d7f0c37d498a86023ac0857dfd01d02a181f8353bd014a8ee3cb17e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "morph/morph-v3-large": { + "canonical_slug": "morph/morph-v3-large", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.9000000", + "output": "1.9000000" + }, + "id": "morph/morph-v3-large", + "name": "Morph: Morph V3 Large", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000009", + "output": "0.0000019" + }, + "price_unit": "USD/token", + "source_hash": "d27cc28e563e7bdca0c41a1d337b7e503e22abe7a8acd8f861b94a56e91c3d40", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nex-agi/nex-n2.5-mini:free": { + "canonical_slug": "nex-agi/nex-n2.5-mini-20260908", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nex-agi/nex-n2.5-mini:free", + "name": "Nex AGI: Nex-N2.5-Mini (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "77a2756ca95f076fb24ea377edacc6123979670e14d4a3f31b98b1760d495a99", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nex-agi/nex-n2.5-pro:free": { + "canonical_slug": "nex-agi/nex-n2.5-pro-20260907", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nex-agi/nex-n2.5-pro:free", + "name": "Nex AGI: Nex-N2.5-Pro (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "261abdbcba8c3d245a96dc29390f5e77b207e8338f284bbe17654d0ec9457622", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nousresearch/hermes-3-llama-3.1-405b": { + "canonical_slug": "nousresearch/hermes-3-llama-3.1-405b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "1.000000" + }, + "id": "nousresearch/hermes-3-llama-3.1-405b", + "name": "Nous: Hermes 3 405B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "417a29842b4852f34d31fb21a27402be6155ca2f6f66e3f7b1facb062ad1abd8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nousresearch/hermes-3-llama-3.1-70b": { + "canonical_slug": "nousresearch/hermes-3-llama-3.1-70b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.7000000", + "output": "0.7000000" + }, + "id": "nousresearch/hermes-3-llama-3.1-70b", + "name": "Nous: Hermes 3 70B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000007", + "output": "0.0000007" + }, + "price_unit": "USD/token", + "source_hash": "44c6491a193fad5a2cdbbf46a5b6ce199aea4f158cf20f634d21a0490db21c90", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nousresearch/hermes-4-405b": { + "canonical_slug": "nousresearch/hermes-4-405b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "3.000000" + }, + "id": "nousresearch/hermes-4-405b", + "name": "Nous: Hermes 4 405B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "38596a30dc3fb34044a5952862549189be331826ebf8cc82d1356557d50f8121", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-nano-30b-a3b": { + "canonical_slug": "nvidia/nemotron-3-nano-30b-a3b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.2000000" + }, + "id": "nvidia/nemotron-3-nano-30b-a3b", + "name": "NVIDIA: Nemotron 3 Nano 30B A3B", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "554229670f2dc00aad2b082a00066e2dd3495af8efbb3712897acd4edcffa1de", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { + "canonical_slug": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning-20260428", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", + "name": "NVIDIA: Nemotron 3 Nano Omni (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "649d1481a4d88c9470a0b4530495947c25c419f11ba74ad0e7e90dc9c715b798", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-super-120b-a12b": { + "canonical_slug": "nvidia/nemotron-3-super-120b-a12b-20230311", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.08000000", + "output": "0.45000000" + }, + "id": "nvidia/nemotron-3-super-120b-a12b", + "name": "NVIDIA: Nemotron 3 Super", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000008", + "output": "0.00000045" + }, + "price_unit": "USD/token", + "source_hash": "9d1a87d3a67a78a2af627874a8bf268b9f19a7d63e8f5583416127e6c52695d9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-super-120b-a12b:free": { + "canonical_slug": "nvidia/nemotron-3-super-120b-a12b-20230311", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nvidia/nemotron-3-super-120b-a12b:free", + "name": "NVIDIA: Nemotron 3 Super (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "bf12afde5a2a9a094407991056db0711025ab584c58534c279798f8b45befa0e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-ultra-550b-a55b": { + "canonical_slug": "nvidia/nemotron-3-ultra-550b-a55b-20260604", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 202800, + "is_moderated": false, + "max_completion_tokens": 182520 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.12000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.4000000" + }, + "id": "nvidia/nemotron-3-ultra-550b-a55b", + "name": "NVIDIA: Nemotron 3 Ultra", + "price_per_token_usd": { + "cache_read": "0.00000012", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000024" + }, + "price_unit": "USD/token", + "source_hash": "e2e9ed2cb39ae5f70276859cd5e6cf7dfa45fe7e9a0f81172713287a607e72cc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3-ultra-550b-a55b:free": { + "canonical_slug": "nvidia/nemotron-3-ultra-550b-a55b-20260604", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nvidia/nemotron-3-ultra-550b-a55b:free", + "name": "NVIDIA: Nemotron 3 Ultra (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "84f9ccd1c080cd28152c91401779e6153d23253636ebc040e054e8d1686ad07e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3.5-content-safety": { + "canonical_slug": "nvidia/nemotron-3.5-content-safety-20260604", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "0.2000000" + }, + "id": "nvidia/nemotron-3.5-content-safety", + "name": "NVIDIA: Nemotron 3.5 Content Safety", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "a7db934956cd6fc6fb7b563fd46b9c4d8374f1ad5ef3f6d628912eb100599cbd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3.5-content-safety:free": { + "canonical_slug": "nvidia/nemotron-3.5-content-safety-20260604", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nvidia/nemotron-3.5-content-safety:free", + "name": "NVIDIA: Nemotron 3.5 Content Safety (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "5cd59d55e44a1f5d1fa4f8f175ef45ac17691493e5daaa9fb536ee23fbf51b33", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3.5-lightning": { + "canonical_slug": "nvidia/nemotron-3.5-lightning-20260807", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.08000000", + "output": "0.2000000" + }, + "id": "nvidia/nemotron-3.5-lightning", + "name": "NVIDIA: Nemotron 3.5 Lightning", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000008", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "1c1480b94321d78985e960a51517455b7c58867022984c7649fd34e2979a178c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "nvidia/nemotron-3.5-lightning:free": { + "canonical_slug": "nvidia/nemotron-3.5-lightning-20260807", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "nvidia/nemotron-3.5-lightning:free", + "name": "NVIDIA: Nemotron 3.5 Lightning (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "c33ee5b2992952d753c5ac6fea85458f55942bd78a9f877609351840e1df8597", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-3.5-turbo": { + "canonical_slug": "openai/gpt-3.5-turbo", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 16385, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 16385, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5000000", + "output": "1.5000000" + }, + "id": "openai/gpt-3.5-turbo", + "name": "OpenAI: GPT-3.5 Turbo", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "401e1842e7179f541f28d98cba7dfc432c6b6ef4f846cc1ff2f733d3b04f64e5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-3.5-turbo-0613": { + "canonical_slug": "openai/gpt-3.5-turbo-0613", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 4095, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 4095, + "is_moderated": false, + "max_completion_tokens": 3685 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "2.000000" + }, + "id": "openai/gpt-3.5-turbo-0613", + "name": "OpenAI: GPT-3.5 Turbo (older v0613)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "18e0d18af1b27bbf450e8f91f8e2a766eb653d1c8c0968996481d04f6ec9dc5b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-3.5-turbo-16k": { + "canonical_slug": "openai/gpt-3.5-turbo-16k", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 16385, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 16385, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "4.000000" + }, + "id": "openai/gpt-3.5-turbo-16k", + "name": "OpenAI: GPT-3.5 Turbo 16k", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "7c74729beec2f24407882f59f970ef892de528a243dfac2e688e073de301c225", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-3.5-turbo-instruct": { + "canonical_slug": "openai/gpt-3.5-turbo-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 4095, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 4095, + "is_moderated": true, + "max_completion_tokens": 3685 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.5000000", + "output": "2.000000" + }, + "id": "openai/gpt-3.5-turbo-instruct", + "name": "OpenAI: GPT-3.5 Turbo Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000015", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "59efdb00ef4d1e28fb15b0c4dfcb65bfedaf9fab5d6467f317ac820579b97fdb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-3.5-turbo:batch": { + "canonical_slug": "openai/gpt-3.5-turbo", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 16385, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 16385, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "0.75000000" + }, + "id": "openai/gpt-3.5-turbo:batch", + "name": "OpenAI: GPT-3.5 Turbo (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "033f4ba302c7dcf5f4f089298d71f6fdfb22429d93479e7c28dfe95467f7448d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4": { + "canonical_slug": "openai/gpt-4", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8191, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8191, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "30.00000", + "output": "60.00000" + }, + "id": "openai/gpt-4", + "name": "OpenAI: GPT-4", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00003", + "output": "0.00006" + }, + "price_unit": "USD/token", + "source_hash": "cd35f2526e866d53d00abb1c0941e070ad815b6f14af2337f37db575d1e969e2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4-turbo": { + "canonical_slug": "openai/gpt-4-turbo", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "30.00000" + }, + "id": "openai/gpt-4-turbo", + "name": "OpenAI: GPT-4 Turbo", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00003" + }, + "price_unit": "USD/token", + "source_hash": "609cebaf73b2b0e7ad65eff73211b5fdb4722a3c30ed9cecf84be4b560968cc7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4-turbo:batch": { + "canonical_slug": "openai/gpt-4-turbo", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "15.000000" + }, + "id": "openai/gpt-4-turbo:batch", + "name": "OpenAI: GPT-4 Turbo (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "6d4338672db944c83f48834c10527fcd2830655460c7db94a03edefc4f8179b3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1": { + "canonical_slug": "openai/gpt-4.1-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "8.000000" + }, + "id": "openai/gpt-4.1", + "name": "OpenAI: GPT-4.1", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000008" + }, + "price_unit": "USD/token", + "source_hash": "b95c8542e6582cc0ca0e25eb5991149a3abf23894d56ed06fe3e52f356a484e6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1-mini": { + "canonical_slug": "openai/gpt-4.1-mini-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "1.6000000" + }, + "id": "openai/gpt-4.1-mini", + "name": "OpenAI: GPT-4.1 Mini", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.0000016" + }, + "price_unit": "USD/token", + "source_hash": "0608b252ffe4f98e131f640120ce38b4f922222f47997b457bf4c2fbfc085b6b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1-mini:batch": { + "canonical_slug": "openai/gpt-4.1-mini-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "0.8000000" + }, + "id": "openai/gpt-4.1-mini:batch", + "name": "OpenAI: GPT-4.1 Mini (batch)", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000008" + }, + "price_unit": "USD/token", + "source_hash": "fe2b97b6f21edcb5fdece7bbfebfa7a79a8b0575d8ea702e8c629662315457ff", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1-nano": { + "canonical_slug": "openai/gpt-4.1-nano-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.4000000" + }, + "id": "openai/gpt-4.1-nano", + "name": "OpenAI: GPT-4.1 Nano", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "306ab892b65b31c70ad400c070a7f901ca84c921bbd8ce0e4d1190a8827e6079", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1-nano:batch": { + "canonical_slug": "openai/gpt-4.1-nano-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.2000000" + }, + "id": "openai/gpt-4.1-nano:batch", + "name": "OpenAI: GPT-4.1 Nano (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "aa3a505704287c439e17cdbead0a0131f29e9ca1794f33ed3a35cd6b14bf9e0f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4.1:batch": { + "canonical_slug": "openai/gpt-4.1-2025-04-14", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1047576, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1047576, + "is_moderated": true, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "4.000000" + }, + "id": "openai/gpt-4.1:batch", + "name": "OpenAI: GPT-4.1 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "161339bd2339af85597df49056be31c286d3710c802092ce864236fe7a5e9595", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o": { + "canonical_slug": "openai/gpt-4o", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "openai/gpt-4o", + "name": "OpenAI: GPT-4o", + "price_per_token_usd": { + "cache_read": "0.00000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "14aadab30f23b745c6bd8e28b9908ca018b8d8fa7dbafdad3e23cde85eaf1f9b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-2024-05-13": { + "canonical_slug": "openai/gpt-4o-2024-05-13", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "15.000000" + }, + "id": "openai/gpt-4o-2024-05-13", + "name": "OpenAI: GPT-4o (2024-05-13)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "ac89c7f178fc7558abcb6cfacd18a865567e5f266fb7f06a43fd51129641b707", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-2024-08-06": { + "canonical_slug": "openai/gpt-4o-2024-08-06", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "openai/gpt-4o-2024-08-06", + "name": "OpenAI: GPT-4o (2024-08-06)", + "price_per_token_usd": { + "cache_read": "0.00000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "d0f88d5a98e286879ac3df354e5a931e084afabaae22aaabe4e752e4fbaba4f8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-2024-11-20": { + "canonical_slug": "openai/gpt-4o-2024-11-20", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "openai/gpt-4o-2024-11-20", + "name": "OpenAI: GPT-4o (2024-11-20)", + "price_per_token_usd": { + "cache_read": "0.00000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "924afd0d99c438c4eee3ed54b43b31944582bed6e3c8b52bb9da275d1f754e81", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-mini": { + "canonical_slug": "openai/gpt-4o-mini", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "openai/gpt-4o-mini", + "name": "OpenAI: GPT-4o-mini", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "aa0901bbb01038cedc9e7b681294fe917c513d6a044fca2c3ff53ce7c8ae1d34", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-mini-2024-07-18": { + "canonical_slug": "openai/gpt-4o-mini-2024-07-18", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "openai/gpt-4o-mini-2024-07-18", + "name": "OpenAI: GPT-4o-mini (2024-07-18)", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "e27f2883687c715ed255d66031135264a84d22a831731819e6dc86246b156e33", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o-mini:batch": { + "canonical_slug": "openai/gpt-4o-mini", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.3000000" + }, + "id": "openai/gpt-4o-mini:batch", + "name": "OpenAI: GPT-4o-mini (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "748eec75fb3349393b8ee0bb58d0500b10990c307fdd6478804ee3c409c2d80a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-4o:batch": { + "canonical_slug": "openai/gpt-4o", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.625000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "5.000000" + }, + "id": "openai/gpt-4o:batch", + "name": "OpenAI: GPT-4o (batch)", + "price_per_token_usd": { + "cache_read": "0.000000625", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "ad144d337f03fe1cd40cd7cec18ce694506b1e62cefa74144226906565932c48", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5": { + "canonical_slug": "openai/gpt-5-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "openai/gpt-5", + "name": "OpenAI: GPT-5", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "2999036de93896d6e0980b427f94cf735fc3ac90674237d0386c9d6cffbfa00e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-image": { + "canonical_slug": "openai/gpt-5-image", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.00004", + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "10.00000" + }, + "id": "openai/gpt-5-image", + "name": "OpenAI: GPT-5 Image", + "price_per_token_usd": { + "cache_read": "0.00000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "fb687505ed294613eb6dc08aa2fd0915d245b7e5d867d8b4bc07e287968e30dd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-image-mini": { + "canonical_slug": "openai/gpt-5-image-mini", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.000008", + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "2.000000" + }, + "id": "openai/gpt-5-image-mini", + "name": "OpenAI: GPT-5 Image Mini", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "97941c0b54e7e37f57f80a1e2ae1a8ecbd0bffea537c453d7f6316cd0810f43f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-mini": { + "canonical_slug": "openai/gpt-5-mini-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "2.000000" + }, + "id": "openai/gpt-5-mini", + "name": "OpenAI: GPT-5 Mini", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "e32a89e1bf87f399b7c88c0342bd430fece9588938e6d0e0f022566d6f68dc97", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-mini:batch": { + "canonical_slug": "openai/gpt-5-mini-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.125000000", + "output": "1.000000" + }, + "id": "openai/gpt-5-mini:batch", + "name": "OpenAI: GPT-5 Mini (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000125", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "c11419e25f9b5cf3f68bcf621a1045db492aab611dd717331f22298909395c91", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-nano": { + "canonical_slug": "openai/gpt-5-nano-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.005000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.4000000" + }, + "id": "openai/gpt-5-nano", + "name": "OpenAI: GPT-5 Nano", + "price_per_token_usd": { + "cache_read": "0.000000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "9562b3ac57b1f961188c783991b184d6a0e133e5bb3f2d74473f0561071ea3d2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-nano:batch": { + "canonical_slug": "openai/gpt-5-nano-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.025000000", + "output": "0.2000000" + }, + "id": "openai/gpt-5-nano:batch", + "name": "OpenAI: GPT-5 Nano (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000025", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "f072c59ed5797a0eff7722daac61e0ad0783a9faec2b8e664cb3e3774cc5015d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-pro": { + "canonical_slug": "openai/gpt-5-pro-2025-10-06", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "15.000000", + "output": "120.00000" + }, + "id": "openai/gpt-5-pro", + "name": "OpenAI: GPT-5 Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000015", + "output": "0.00012" + }, + "price_unit": "USD/token", + "source_hash": "519ef20389e4a11ba8076a73bb87fc2c8eb434ff4cee5bc19e10c946b2513839", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5-pro:batch": { + "canonical_slug": "openai/gpt-5-pro-2025-10-06", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "7.5000000", + "output": "60.00000" + }, + "id": "openai/gpt-5-pro:batch", + "name": "OpenAI: GPT-5 Pro (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000075", + "output": "0.00006" + }, + "price_unit": "USD/token", + "source_hash": "9c091f19238a825c5423095df144530e35be2ea2923fe815a439fe399ed32959", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.1": { + "canonical_slug": "openai/gpt-5.1-20251113", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "openai/gpt-5.1", + "name": "OpenAI: GPT-5.1", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "d20abd311cfff9da984853815fef3c4049925fbc3bd55abf34b72bb55b387041", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.1-codex": { + "canonical_slug": "openai/gpt-5.1-codex-20251113", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.13000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "openai/gpt-5.1-codex", + "name": "OpenAI: GPT-5.1-Codex", + "price_per_token_usd": { + "cache_read": "0.00000013", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "01d339347461f9c763bfced83940aa55354cd7534d651516d36da4d613507d87", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.1-codex-max": { + "canonical_slug": "openai/gpt-5.1-codex-max-20251204", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "10.00000" + }, + "id": "openai/gpt-5.1-codex-max", + "name": "OpenAI: GPT-5.1-Codex-Max", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "e69000e17b31efc94a208711b163fcf90e830b772f7e7eef2bc219ad1ef0dd70", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.1-codex-mini": { + "canonical_slug": "openai/gpt-5.1-codex-mini-20251113", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.25000000", + "output": "2.000000" + }, + "id": "openai/gpt-5.1-codex-mini", + "name": "OpenAI: GPT-5.1-Codex-Mini", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000025", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "bb75ccdca879cdd4f7f15a8c58e7b0125d592ceaa8ad4e5fa555c7af02832674", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.1:batch": { + "canonical_slug": "openai/gpt-5.1-20251113", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0625000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.625000000", + "output": "5.000000" + }, + "id": "openai/gpt-5.1:batch", + "name": "OpenAI: GPT-5.1 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000625", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000625", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "dcc5f9f3885e952448c417bb2f9949a1b211569712797f665c7702e89aab190c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2": { + "canonical_slug": "openai/gpt-5.2-20251211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.175000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.75000000", + "output": "14.000000" + }, + "id": "openai/gpt-5.2", + "name": "OpenAI: GPT-5.2", + "price_per_token_usd": { + "cache_read": "0.000000175", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000175", + "output": "0.000014" + }, + "price_unit": "USD/token", + "source_hash": "fac53ee24668edecadfa342f47bca8b3c32246cbf06b1a3957fa2eaf3c4c2a6b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2-chat": { + "canonical_slug": "openai/gpt-5.2-chat-20251211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 32000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.175000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.75000000", + "output": "14.000000" + }, + "id": "openai/gpt-5.2-chat", + "name": "OpenAI: GPT-5.2 Chat", + "price_per_token_usd": { + "cache_read": "0.000000175", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000175", + "output": "0.000014" + }, + "price_unit": "USD/token", + "source_hash": "02cc7bb31f9bcc30f9d2c64ad3de3d6605aa0e6c74807564b269eb7d6cc45234", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2-codex": { + "canonical_slug": "openai/gpt-5.2-codex-20260114", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.175000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.75000000", + "output": "14.000000" + }, + "id": "openai/gpt-5.2-codex", + "name": "OpenAI: GPT-5.2-Codex", + "price_per_token_usd": { + "cache_read": "0.000000175", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000175", + "output": "0.000014" + }, + "price_unit": "USD/token", + "source_hash": "2db32ac85079aebdc6bf158a442ed5cb1437825594753ed57f77fa6d49bac3ad", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2-pro": { + "canonical_slug": "openai/gpt-5.2-pro-20251211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "21.000000", + "output": "168.000000" + }, + "id": "openai/gpt-5.2-pro", + "name": "OpenAI: GPT-5.2 Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000021", + "output": "0.000168" + }, + "price_unit": "USD/token", + "source_hash": "7bba72f1c460d8bac1341f9e275f969109c05d6cda8ba9fa54a1310824657c4e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2-pro:batch": { + "canonical_slug": "openai/gpt-5.2-pro-20251211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.5000000", + "output": "84.000000" + }, + "id": "openai/gpt-5.2-pro:batch", + "name": "OpenAI: GPT-5.2 Pro (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000105", + "output": "0.000084" + }, + "price_unit": "USD/token", + "source_hash": "9792ce64b43575663172df87da3b9a8a64b4b64f06bbff169086f3bc4e15751d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.2:batch": { + "canonical_slug": "openai/gpt-5.2-20251211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0875000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.875000000", + "output": "7.000000" + }, + "id": "openai/gpt-5.2:batch", + "name": "OpenAI: GPT-5.2 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000875", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000875", + "output": "0.000007" + }, + "price_unit": "USD/token", + "source_hash": "9661a2e7a323d18f71edf1d0838c26ddbc3eeb1736c918de6fed75efef9e1edb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.3-codex": { + "canonical_slug": "openai/gpt-5.3-codex-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.175000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.75000000", + "output": "14.000000" + }, + "id": "openai/gpt-5.3-codex", + "name": "OpenAI: GPT-5.3-Codex", + "price_per_token_usd": { + "cache_read": "0.000000175", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000175", + "output": "0.000014" + }, + "price_unit": "USD/token", + "source_hash": "94ada47fefc8099721931442c1160cee71e49dfaa7b7a3664e8e72971106e2db", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4": { + "canonical_slug": "openai/gpt-5.4-20260305", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000225", + "input_cache_read": "0.0000005", + "min_prompt_tokens": 272000, + "prompt": "0.000005" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "15.000000" + }, + "id": "openai/gpt-5.4", + "name": "OpenAI: GPT-5.4", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "5476e00be93b759b8d672f97963efeee30c88b14a6ee00d69d9e9e48cca711f7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-image-2": { + "canonical_slug": "openai/gpt-5.4-image-2-20260421", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 272000, + "per_request_limits": null, + "pricing_metadata": { + "image_output": "0.00003", + "web_search": "0.01" + }, + "top_provider": { + "context_length": 272000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "2.000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "8.000000", + "output": "15.000000" + }, + "id": "openai/gpt-5.4-image-2", + "name": "OpenAI: GPT-5.4 Image 2", + "price_per_token_usd": { + "cache_read": "0.000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000008", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "c59eeaf9b814cc13b7a04073544a29650eaf7ac4ad0ddabda914f7057a291715", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-mini": { + "canonical_slug": "openai/gpt-5.4-mini-20260317", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "4.5000000" + }, + "id": "openai/gpt-5.4-mini", + "name": "OpenAI: GPT-5.4 Mini", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.0000045" + }, + "price_unit": "USD/token", + "source_hash": "0e2e1caf3756f23270e0ce30b01ee3da2bef873f1726a834daf6d00f2113cb95", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-mini:batch": { + "canonical_slug": "openai/gpt-5.4-mini-20260317", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.375000000", + "output": "2.25000000" + }, + "id": "openai/gpt-5.4-mini:batch", + "name": "OpenAI: GPT-5.4 Mini (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000375", + "output": "0.00000225" + }, + "price_unit": "USD/token", + "source_hash": "4e06fc3bf3baf8b778209fb299640922ae61f4bd89394ffe4e8941ec07286005", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-nano": { + "canonical_slug": "openai/gpt-5.4-nano-20260317", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.25000000" + }, + "id": "openai/gpt-5.4-nano", + "name": "OpenAI: GPT-5.4 Nano", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "a41e36e6ccd0681364ae551d5d7e1c214ae12b948f35ba16fbf043d2ab3858d8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-nano:batch": { + "canonical_slug": "openai/gpt-5.4-nano-20260317", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.625000000" + }, + "id": "openai/gpt-5.4-nano:batch", + "name": "OpenAI: GPT-5.4 Nano (batch)", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.000000625" + }, + "price_unit": "USD/token", + "source_hash": "437d32dbe9e77fdbce40026e4994d0b404095190e88f78d1b71994096904d7ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-pro": { + "canonical_slug": "openai/gpt-5.4-pro-20260305", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00027", + "min_prompt_tokens": 272000, + "prompt": "0.00006" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "30.00000", + "output": "180.00000" + }, + "id": "openai/gpt-5.4-pro", + "name": "OpenAI: GPT-5.4 Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00003", + "output": "0.00018" + }, + "price_unit": "USD/token", + "source_hash": "acf9676f1c1efb021e386cf876206b7916425a81bcf805d9d6eb3738f8fbf8c1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4-pro:batch": { + "canonical_slug": "openai/gpt-5.4-pro-20260305", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000135", + "min_prompt_tokens": 272000, + "prompt": "0.00003" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "15.000000", + "output": "90.00000" + }, + "id": "openai/gpt-5.4-pro:batch", + "name": "OpenAI: GPT-5.4 Pro (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000015", + "output": "0.00009" + }, + "price_unit": "USD/token", + "source_hash": "3b8d1021c822951327e2f3257391e8d8ed25895d9a29ae5c36c8aa86fed13598", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.4:batch": { + "canonical_slug": "openai/gpt-5.4-20260305", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00001125", + "input_cache_read": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000025" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.125000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "7.5000000" + }, + "id": "openai/gpt-5.4:batch", + "name": "OpenAI: GPT-5.4 (batch)", + "price_per_token_usd": { + "cache_read": "0.000000125", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.0000075" + }, + "price_unit": "USD/token", + "source_hash": "9b44996b8c721ca41a693e792d8aea639c9fc44ca7cd65443424c0820c6ad33b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.5": { + "canonical_slug": "openai/gpt-5.5-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000045", + "input_cache_read": "0.000001", + "min_prompt_tokens": 272000, + "prompt": "0.00001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "30.00000" + }, + "id": "openai/gpt-5.5", + "name": "OpenAI: GPT-5.5", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.00003" + }, + "price_unit": "USD/token", + "source_hash": "099945633e48c3d315262a1cd467d94dfe4ca5b4a04cab0e6f58db31db09c67d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.5-pro": { + "canonical_slug": "openai/gpt-5.5-pro-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00027", + "min_prompt_tokens": 272000, + "prompt": "0.00006" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "30.00000", + "output": "180.00000" + }, + "id": "openai/gpt-5.5-pro", + "name": "OpenAI: GPT-5.5 Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00003", + "output": "0.00018" + }, + "price_unit": "USD/token", + "source_hash": "0c7e23a82099d5c01266a0d3c57cc6107be78cb95f056b8a5efa21b47eea7638", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.5-pro:batch": { + "canonical_slug": "openai/gpt-5.5-pro-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000135", + "min_prompt_tokens": 272000, + "prompt": "0.00003" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "15.000000", + "output": "90.00000" + }, + "id": "openai/gpt-5.5-pro:batch", + "name": "OpenAI: GPT-5.5 Pro (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000015", + "output": "0.00009" + }, + "price_unit": "USD/token", + "source_hash": "b4f3ed758ddd093b52c13e3a6bf8d8879f80f40bab5cd14ae878f2b25fdaa7af", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.5:batch": { + "canonical_slug": "openai/gpt-5.5-20260423", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000225", + "input_cache_read": "0.0000005", + "min_prompt_tokens": 272000, + "prompt": "0.000005" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "15.000000" + }, + "id": "openai/gpt-5.5:batch", + "name": "OpenAI: GPT-5.5 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "fcaba275091e43fcfc5a66469f78ead3f0630058cbd86fcd078cfc1666959fb7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-luna": { + "canonical_slug": "openai/gpt-5.6-luna-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000018", + "input_cache_read": "0.00000004", + "input_cache_write": "0.0000005", + "min_prompt_tokens": 272000, + "prompt": "0.0000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": "0.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.2000000" + }, + "id": "openai/gpt-5.6-luna", + "name": "OpenAI: GPT-5.6 Luna", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": "0.00000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "c359891f5447c8857aed5e8b995fe9bbb55881a98ea287b7b6679e8d40c8a4df", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-luna-pro": { + "canonical_slug": "openai/gpt-5.6-luna-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000018", + "input_cache_read": "0.00000004", + "input_cache_write": "0.0000005", + "min_prompt_tokens": 272000, + "prompt": "0.0000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.02000000", + "cache_write": "0.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.2000000" + }, + "id": "openai/gpt-5.6-luna-pro", + "name": "OpenAI: GPT-5.6 Luna Pro", + "price_per_token_usd": { + "cache_read": "0.00000002", + "cache_write": "0.00000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "924f81898c9426ab97e0b6d9951555b2bbbf99354f1818b28d20e849a58a6db8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-luna-pro:batch": { + "canonical_slug": "openai/gpt-5.6-luna-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000009", + "input_cache_read": "0.00000002", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.6000000" + }, + "id": "openai/gpt-5.6-luna-pro:batch", + "name": "OpenAI: GPT-5.6 Luna Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "4ba324e9aac610a5ac55be9827b8c261e64eaa5886bfa5d7dbd9e9e42a841096", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-luna:batch": { + "canonical_slug": "openai/gpt-5.6-luna-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000009", + "input_cache_read": "0.00000002", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.6000000" + }, + "id": "openai/gpt-5.6-luna:batch", + "name": "OpenAI: GPT-5.6 Luna (batch)", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "a7d23be619ff4bbb2dc88073268e16102261adf91db011646405d7260f14f905", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-sol": { + "canonical_slug": "openai/gpt-5.6-sol-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "openai/gpt-5.6-sol", + "name": "OpenAI: GPT-5.6 Sol", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "c65e58985387974d1b01719dc03f8a1158ac1c6c767522bc9f86643b2c259654", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-sol-pro": { + "canonical_slug": "openai/gpt-5.6-sol-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "openai/gpt-5.6-sol-pro", + "name": "OpenAI: GPT-5.6 Sol Pro", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "e9847e8eb498dcc05568a803aafac9226fa2528882c5dc76de1c0365e2212dc9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-sol-pro:batch": { + "canonical_slug": "openai/gpt-5.6-sol-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000075", + "input_cache_read": "0.0000002", + "input_cache_write": "0.0000025", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "openai/gpt-5.6-sol-pro:batch", + "name": "OpenAI: GPT-5.6 Sol Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "f8ae99ed87cc1ae1cd9b2b725f3cd556f5a5c2b4eeb572ffce7389355cab35eb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-sol:batch": { + "canonical_slug": "openai/gpt-5.6-sol-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000075", + "input_cache_read": "0.0000002", + "input_cache_write": "0.0000025", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "openai/gpt-5.6-sol:batch", + "name": "OpenAI: GPT-5.6 Sol (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "1a6d924b60e6cad84a3fe28452dbbf776f88e78b7092080322bdc64c5ee2a3a5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-terra": { + "canonical_slug": "openai/gpt-5.6-terra-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000018", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "openai/gpt-5.6-terra", + "name": "OpenAI: GPT-5.6 Terra", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "7972f20ef732ae8632288b6070042f9f185e240eb0e384e0b7a7ae8d242be0a9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-terra-pro": { + "canonical_slug": "openai/gpt-5.6-terra-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000018", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "openai/gpt-5.6-terra-pro", + "name": "OpenAI: GPT-5.6 Terra Pro", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "e146d05b27231c25996ea52068686c3f5371f85e44f04bee8d642da7a8e6efcb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-terra-pro:batch": { + "canonical_slug": "openai/gpt-5.6-terra-pro-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000009", + "input_cache_read": "0.0000002", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "6.000000" + }, + "id": "openai/gpt-5.6-terra-pro:batch", + "name": "OpenAI: GPT-5.6 Terra Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "473aa6f2a2f9286bf5610de83b3fffc3e34560a20f9b2e5784518a1352529d9f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5.6-terra:batch": { + "canonical_slug": "openai/gpt-5.6-terra-20260709", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000009", + "input_cache_read": "0.0000002", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "6.000000" + }, + "id": "openai/gpt-5.6-terra:batch", + "name": "OpenAI: GPT-5.6 Terra (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "9228c630d0cd33e616f03c0160419ea93be382544c55fbe70437445c0ac8f014", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-5:batch": { + "canonical_slug": "openai/gpt-5-2025-08-07", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0625000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.625000000", + "output": "5.000000" + }, + "id": "openai/gpt-5:batch", + "name": "OpenAI: GPT-5 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000000625", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000625", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "f82ed973d0d75ca75eab7c91bf6f0e2c4d5ddf0616339a264bf93a71bbf78efd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-astra": { + "canonical_slug": "openai/gpt-6-astra-20260903", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000075", + "input_cache_read": "0.000002", + "input_cache_write": "0.000025", + "min_prompt_tokens": 272000, + "prompt": "0.00002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.000000", + "cache_write": "12.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "openai/gpt-6-astra", + "name": "OpenAI: GPT-6 Astra", + "price_per_token_usd": { + "cache_read": "0.000001", + "cache_write": "0.0000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "4cfa2fc0da71ac6a1d52a71b94b9fc15d8179a09384c358b305ca148e4ff387f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-astra-pro": { + "canonical_slug": "openai/gpt-6-astra-pro-20260903", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000075", + "input_cache_read": "0.000002", + "input_cache_write": "0.000025", + "min_prompt_tokens": 272000, + "prompt": "0.00002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.000000", + "cache_write": "12.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "openai/gpt-6-astra-pro", + "name": "OpenAI: GPT-6 Astra Pro", + "price_per_token_usd": { + "cache_read": "0.000001", + "cache_write": "0.0000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "404df4dbbb1c1133ef040a37852b8827c79161f29d86989778339639dbac5eb5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-astra-pro:batch": { + "canonical_slug": "openai/gpt-6-astra-pro-20260903", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000375", + "input_cache_read": "0.000001", + "input_cache_write": "0.0000125", + "min_prompt_tokens": 272000, + "prompt": "0.00001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "openai/gpt-6-astra-pro:batch", + "name": "OpenAI: GPT-6 Astra Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "39bc0b0823daf77df8ccec89d82c6dfc7bbb34ee7c4241ee6335aee1030d2043", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-astra:batch": { + "canonical_slug": "openai/gpt-6-astra-20260903", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000375", + "input_cache_read": "0.000001", + "input_cache_write": "0.0000125", + "min_prompt_tokens": 272000, + "prompt": "0.00001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": "6.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "25.000000" + }, + "id": "openai/gpt-6-astra:batch", + "name": "OpenAI: GPT-6 Astra (batch)", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": "0.00000625", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.000025" + }, + "price_unit": "USD/token", + "source_hash": "9d1ce2fd80244a47fe002965ef49e4e8ffe45dc2acab19a6ce760d48387238b2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-luna": { + "canonical_slug": "openai/gpt-6-luna-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.5000000" + }, + "id": "openai/gpt-6-luna", + "name": "OpenAI: GPT-6 Luna", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "d1668d002fc09c5c6c96efd0e688d6a0c6bd9ad8ea4c5a4da2ae342aff0d659b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-luna-pro": { + "canonical_slug": "openai/gpt-6-luna-pro-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.5000000" + }, + "id": "openai/gpt-6-luna-pro", + "name": "OpenAI: GPT-6 Luna Pro", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "d01b89e65e184ee1850b3de64f07ef4470c69e8e7b392309073b1d1348d689e3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-luna-pro:batch": { + "canonical_slug": "openai/gpt-6-luna-pro-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000000375", + "input_cache_read": "0.00000001", + "input_cache_write": "0.000000125", + "min_prompt_tokens": 272000, + "prompt": "0.0000001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.005000000", + "cache_write": "0.0625000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.25000000" + }, + "id": "openai/gpt-6-luna-pro:batch", + "name": "OpenAI: GPT-6 Luna Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.000000005", + "cache_write": "0.0000000625", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000025" + }, + "price_unit": "USD/token", + "source_hash": "aa551b33a642ab5bff58fa609228a521a83c54b7dca118847b87405683e031a6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-luna:batch": { + "canonical_slug": "openai/gpt-6-luna-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000000375", + "input_cache_read": "0.00000001", + "input_cache_write": "0.000000125", + "min_prompt_tokens": 272000, + "prompt": "0.0000001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.005000000", + "cache_write": "0.0625000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.25000000" + }, + "id": "openai/gpt-6-luna:batch", + "name": "OpenAI: GPT-6 Luna (batch)", + "price_per_token_usd": { + "cache_read": "0.000000005", + "cache_write": "0.0000000625", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.00000025" + }, + "price_unit": "USD/token", + "source_hash": "d25f59298e531f430f74ed59bc3198989e1079e24922a1b876febbc597576686", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-sol": { + "canonical_slug": "openai/gpt-6-sol-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "openai/gpt-6-sol", + "name": "OpenAI: GPT-6 Sol", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "7d623fda751fe5fc2fbd585fe5148be49cc22e6a6b79b77f20249b4fb09ef5dd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-sol-pro": { + "canonical_slug": "openai/gpt-6-sol-pro-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "openai/gpt-6-sol-pro", + "name": "OpenAI: GPT-6 Sol Pro", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "365ff6705695ab1e04eb61d6547b324d8e92e2bf5a06550532818a9965584f1b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-sol-pro:batch": { + "canonical_slug": "openai/gpt-6-sol-pro-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000075", + "input_cache_read": "0.0000002", + "input_cache_write": "0.0000025", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "openai/gpt-6-sol-pro:batch", + "name": "OpenAI: GPT-6 Sol Pro (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "fdf019f830630a28c508c96a39c5a1b9cdf78dd2104ca2c7996b8f7f6bd61c69", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-6-sol:batch": { + "canonical_slug": "openai/gpt-6-sol-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000075", + "input_cache_read": "0.0000002", + "input_cache_write": "0.0000025", + "min_prompt_tokens": 272000, + "prompt": "0.000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "openai/gpt-6-sol:batch", + "name": "OpenAI: GPT-6 Sol (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "5b5a8af31bdf08260b5e5b144e45791a34443a8cb5235fd574e4839b877328ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-audio": { + "canonical_slug": "openai/gpt-audio", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000032", + "audio_output": "0.000064" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "10.00000" + }, + "id": "openai/gpt-audio", + "name": "OpenAI: GPT Audio", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "49c821d43c47ae60f3bfc1abbf8f2d9c8fe003a4c6f4ee451989d842fb39686a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-audio-mini": { + "canonical_slug": "openai/gpt-audio-mini", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.0000006", + "audio_output": "0.0000024" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": true, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.4000000" + }, + "id": "openai/gpt-audio-mini", + "name": "OpenAI: GPT Audio Mini", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000024" + }, + "price_unit": "USD/token", + "source_hash": "c7bdede553f1f15b752495ce08e64ba2ac8d6b2d85aaf2b8a190a2b894d7dfdb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-chat-latest": { + "canonical_slug": "openai/gpt-chat-latest-20260505", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "30.00000" + }, + "id": "openai/gpt-chat-latest", + "name": "OpenAI: GPT Chat Latest", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.00003" + }, + "price_unit": "USD/token", + "source_hash": "a06d9ffe2d1c99fd9e375d16fb54ffdabf318a67fbd75742d46552985a6414fe", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-oss-120b": { + "canonical_slug": "openai/gpt-oss-120b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "openai/gpt-oss-120b", + "name": "OpenAI: gpt-oss-120b", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "47877f195898d7c236caf129965a9cdbe148fe4e588d9951e5d535151d90e61c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-oss-120b:batch": { + "canonical_slug": "openai/gpt-oss-120b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0296000000", + "output": "0.136000000" + }, + "id": "openai/gpt-oss-120b:batch", + "name": "OpenAI: gpt-oss-120b (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000000296", + "output": "0.000000136" + }, + "price_unit": "USD/token", + "source_hash": "7a71ed8687eced1899bbe960a8a37489af56b6e0604a7d89badb1f75e0fe8e2d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-oss-20b": { + "canonical_slug": "openai/gpt-oss-20b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.018000000", + "output": "0.09000000" + }, + "id": "openai/gpt-oss-20b", + "name": "OpenAI: gpt-oss-20b", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000018", + "output": "0.00000009" + }, + "price_unit": "USD/token", + "source_hash": "f95047cc131cb8ee184c5dd963a97c043b9c36234dd694a11a33b319d3bb3fb3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-oss-20b:batch": { + "canonical_slug": "openai/gpt-oss-20b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.024000000", + "output": "0.112000000" + }, + "id": "openai/gpt-oss-20b:batch", + "name": "OpenAI: gpt-oss-20b (batch)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000024", + "output": "0.000000112" + }, + "price_unit": "USD/token", + "source_hash": "8b1c5004cf2ff0c06ca9757472c7ee6a2fdaf4169a5dc6e1dcd3edc1d845137c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/gpt-oss-safeguard-20b": { + "canonical_slug": "openai/gpt-oss-safeguard-20b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0375000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.3000000" + }, + "id": "openai/gpt-oss-safeguard-20b", + "name": "OpenAI: gpt-oss-safeguard-20b", + "price_per_token_usd": { + "cache_read": "0.0000000375", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "a291852a0b549a2085de94f7d9873b37a2240818e7e96bb4621021097b5c4eea", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o1": { + "canonical_slug": "openai/o1-2024-12-17", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "7.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "15.000000", + "output": "60.00000" + }, + "id": "openai/o1", + "name": "OpenAI: o1", + "price_per_token_usd": { + "cache_read": "0.0000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000015", + "output": "0.00006" + }, + "price_unit": "USD/token", + "source_hash": "85230df0f47a69aa32ee76e45a765688d81c3e3bf9c799d499c2f0040f24e16f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o1-pro": { + "canonical_slug": "openai/o1-pro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "150.00000", + "output": "600.0000" + }, + "id": "openai/o1-pro", + "name": "OpenAI: o1-pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00015", + "output": "0.0006" + }, + "price_unit": "USD/token", + "source_hash": "0f6452b9eadc83960b8e7ab7f2c46773a4fcc019bf1f091dd90a14594ab56dfe", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3": { + "canonical_slug": "openai/o3-2025-04-16", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "8.000000" + }, + "id": "openai/o3", + "name": "OpenAI: o3", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000008" + }, + "price_unit": "USD/token", + "source_hash": "086c4d0bcb2156bbbcc21e18ca3fb884e1f4b649bc2a1b657c53349b5d540ddb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3-mini": { + "canonical_slug": "openai/o3-mini-2025-01-31", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.55000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.1000000", + "output": "4.4000000" + }, + "id": "openai/o3-mini", + "name": "OpenAI: o3 Mini", + "price_per_token_usd": { + "cache_read": "0.00000055", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000011", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "7cecf6b6a4d770fa637b519692f434d8c79f7dcdb5bb4f5da27e5b324eda235f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3-mini-high": { + "canonical_slug": "openai/o3-mini-high-2025-01-31", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.55000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.1000000", + "output": "4.4000000" + }, + "id": "openai/o3-mini-high", + "name": "OpenAI: o3 Mini High", + "price_per_token_usd": { + "cache_read": "0.00000055", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000011", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "a4a5d6ef421db55a0b4af0160d90f4ab39b82f7544431ff0526268d74fa95a7b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3-mini:batch": { + "canonical_slug": "openai/o3-mini-2025-01-31", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.275000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.55000000", + "output": "2.2000000" + }, + "id": "openai/o3-mini:batch", + "name": "OpenAI: o3 Mini (batch)", + "price_per_token_usd": { + "cache_read": "0.000000275", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000055", + "output": "0.0000022" + }, + "price_unit": "USD/token", + "source_hash": "d50e1021fceec5855be3790e95b5d53a70122f19a7d52bf0a51e55ec7b879546", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3-pro": { + "canonical_slug": "openai/o3-pro-2025-06-10", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "20.00000", + "output": "80.00000" + }, + "id": "openai/o3-pro", + "name": "OpenAI: o3 Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00002", + "output": "0.00008" + }, + "price_unit": "USD/token", + "source_hash": "963d76c5e7c57989b0f214fab8bfa54d6ee0112e73b7fd7b1513765eeb27d80c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o3:batch": { + "canonical_slug": "openai/o3-2025-04-16", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "4.000000" + }, + "id": "openai/o3:batch", + "name": "OpenAI: o3 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "0b9581bda5ec47c4cdb7861e7442dac3c007de9692de1b51494e04801da9fe29", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o4-mini": { + "canonical_slug": "openai/o4-mini-2025-04-16", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.275000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.1000000", + "output": "4.4000000" + }, + "id": "openai/o4-mini", + "name": "OpenAI: o4 Mini", + "price_per_token_usd": { + "cache_read": "0.000000275", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000011", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "e5d929940b9005d0106c837f84dd89ed7ad18b1ec0dfd654c218f8d8447a6f99", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o4-mini-high": { + "canonical_slug": "openai/o4-mini-high-2025-04-16", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.275000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.1000000", + "output": "4.4000000" + }, + "id": "openai/o4-mini-high", + "name": "OpenAI: o4 Mini High", + "price_per_token_usd": { + "cache_read": "0.000000275", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000011", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "78d73dfa2cf204324533cfba7ac4de5de0a0430abfbd194a6df1ccb05cae5910", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openai/o4-mini:batch": { + "canonical_slug": "openai/o4-mini-2025-04-16", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": true, + "max_completion_tokens": 100000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1375000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.55000000", + "output": "2.2000000" + }, + "id": "openai/o4-mini:batch", + "name": "OpenAI: o4 Mini (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001375", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000055", + "output": "0.0000022" + }, + "price_unit": "USD/token", + "source_hash": "0ca9da49ab875a4b5b7944fe17ac081b576c06d9f601d7579365dc638a451705", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/auto": { + "canonical_slug": "openrouter/auto", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 2000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": { + "input": "-1", + "output": "-1" + } + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "id": "openrouter/auto", + "name": "Auto Router", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "price_unit": "USD/token", + "source_hash": "08e788d6e85a75ade3a6cebca3264daa4c09e47a9adb380edbeac58809f602dc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/auto-beta": { + "canonical_slug": "openrouter/auto-beta", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 2000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": { + "input": "-1", + "output": "-1" + } + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "id": "openrouter/auto-beta", + "name": "Auto Router (Beta)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "price_unit": "USD/token", + "source_hash": "3b5a6f075038270b242241221e267e761ec778baf9227944b4aaebb50f3e81a9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/bodybuilder": { + "canonical_slug": "openrouter/bodybuilder", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": { + "input": "-1", + "output": "-1" + } + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "id": "openrouter/bodybuilder", + "name": "Body Builder (beta)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "price_unit": "USD/token", + "source_hash": "9368d4ef04af7636d13af9f81fb044f3e5e6bdcf5de03b223fa99689d12a69d8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/free": { + "canonical_slug": "openrouter/free", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "openrouter/free", + "name": "Free Models Router", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "391e744a6a47abe9fdd9ada5f9047e85671c1c9506113f97529661fa3a8b28ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/fusion": { + "canonical_slug": "openrouter/fusion", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": { + "input": "-1", + "output": "-1" + } + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "id": "openrouter/fusion", + "name": "OpenRouter: Fusion", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "price_unit": "USD/token", + "source_hash": "4744c62f7d35955cf151834af0425617f593ef7231af5ed36a45afc505b1c17b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "openrouter/pareto-code": { + "canonical_slug": "openrouter/pareto-code", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 2000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": null, + "is_moderated": false, + "max_completion_tokens": null + }, + "unsupported_negative_prices": { + "input": "-1", + "output": "-1" + } + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "id": "openrouter/pareto-code", + "name": "Pareto Code Router", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": null, + "output": null + }, + "price_unit": "USD/token", + "source_hash": "5914cc279d82d8e7b682aabfb430fc0395b9395d0cc02fbcee9677ad190d544e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perceptron/perceptron-mk1": { + "canonical_slug": "perceptron/perceptron-mk1-20260512", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "1.5000000" + }, + "id": "perceptron/perceptron-mk1", + "name": "Perceptron: Perceptron Mk1", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000015" + }, + "price_unit": "USD/token", + "source_hash": "1e92c8e4aa9a0db68f4ac4c8bdd26572259d64e006fed711bf3459032983b069", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perplexity/sonar": { + "canonical_slug": "perplexity/sonar", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 127072, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.005" + }, + "top_provider": { + "context_length": 127072, + "is_moderated": false, + "max_completion_tokens": 114364 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "1.000000" + }, + "id": "perplexity/sonar", + "name": "Perplexity: Sonar", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "73dd28df5b737a372e4236b825aa06cdf92226f0c0cdac1f00aac12843228056", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perplexity/sonar-deep-research": { + "canonical_slug": "perplexity/sonar-deep-research", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "internal_reasoning": "0.000003", + "web_search": "0.005" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 115200 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "8.000000" + }, + "id": "perplexity/sonar-deep-research", + "name": "Perplexity: Sonar Deep Research", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000008" + }, + "price_unit": "USD/token", + "source_hash": "62ce62b356763e1d7fee489a868f7d371e5c40c6341aaf23da241d2734c26572", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perplexity/sonar-pro": { + "canonical_slug": "perplexity/sonar-pro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.005" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": false, + "max_completion_tokens": 8000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "perplexity/sonar-pro", + "name": "Perplexity: Sonar Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "e5ec2099ed53440a2796f286eb4589189d7753b1f0b67879a9f7b4ac8b2f5b00", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perplexity/sonar-pro-search": { + "canonical_slug": "perplexity/sonar-pro-search", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.018" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": false, + "max_completion_tokens": 8000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "3.000000", + "output": "15.000000" + }, + "id": "perplexity/sonar-pro-search", + "name": "Perplexity: Sonar Pro Search", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000003", + "output": "0.000015" + }, + "price_unit": "USD/token", + "source_hash": "c6ace25d200b0a7599d988c5b174b75497b726798ba326c4fcb96a8fc9442da5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "perplexity/sonar-reasoning-pro": { + "canonical_slug": "perplexity/sonar-reasoning-pro", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.005" + }, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 115200 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "8.000000" + }, + "id": "perplexity/sonar-reasoning-pro", + "name": "Perplexity: Sonar Reasoning Pro", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000008" + }, + "price_unit": "USD/token", + "source_hash": "a876316530cdb8f618846bfa63de92b1a3073d9adebcf31b1796d69d3a499f1d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "poolside/laguna-s-2.1": { + "canonical_slug": "poolside/laguna-s-2.1-20260720", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.009000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09000000", + "output": "0.18000000" + }, + "id": "poolside/laguna-s-2.1", + "name": "Poolside: Laguna S 2.1", + "price_per_token_usd": { + "cache_read": "0.000000009", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009", + "output": "0.00000018" + }, + "price_unit": "USD/token", + "source_hash": "245abe93626a63614b81928d86b0d9eeece3e030bf26c474972c9d4b382b05a9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "poolside/laguna-s-2.1:free": { + "canonical_slug": "poolside/laguna-s-2.1-20260720", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "poolside/laguna-s-2.1:free", + "name": "Poolside: Laguna S 2.1 (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "9f6f874b34550a222a98498553ec1f7b5abac3fa4eacf257b909efd16f1442c9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "poolside/laguna-xs-2.1": { + "canonical_slug": "poolside/laguna-xs-2.1-20260625", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.03000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.12000000" + }, + "id": "poolside/laguna-xs-2.1", + "name": "Poolside: Laguna XS 2.1", + "price_per_token_usd": { + "cache_read": "0.00000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.00000012" + }, + "price_unit": "USD/token", + "source_hash": "40f73257a1cd02ac0f3118f5599a36f3a881fefe66e82b6be4f575c6b7cdf947", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "poolside/laguna-xs-2.1:free": { + "canonical_slug": "poolside/laguna-xs-2.1-20260625", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "poolside/laguna-xs-2.1:free", + "name": "Poolside: Laguna XS 2.1 (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "820eca9a57a07a063c7605998bf1ef7f46c0b6e9c3306e64ec751c69a4e197df", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "prism-ml/ternary-bonsai-2-27b": { + "canonical_slug": "prism-ml/ternary-bonsai-2-27b-20260918", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.075000000", + "output": "0.5000000" + }, + "id": "prism-ml/ternary-bonsai-2-27b", + "name": "PrismML: Ternary Bonsai 2 27B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000075", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "1051621f0a178072260faa3ae9be2331ac40aa05c4736bf679a5d54dee8a30de", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen-2.5-72b-instruct": { + "canonical_slug": "qwen/qwen-2.5-72b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.36000000", + "output": "0.4000000" + }, + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen2.5 72B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000036", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "ff338b731a7f354356ee03cfc611f68265443ba1fd298e9644d24c5bf26677c4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen-2.5-7b-instruct": { + "canonical_slug": "qwen/qwen-2.5-7b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 29491 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.2000000" + }, + "id": "qwen/qwen-2.5-7b-instruct", + "name": "Qwen: Qwen2.5 7B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "5f20ec49c7772c06d936dbbf0fc897ced9b44ad60ed3264fa4864f1e223f5532", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen-2.5-coder-32b-instruct": { + "canonical_slug": "qwen/qwen-2.5-coder-32b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 29491 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.66000000", + "output": "1.000000" + }, + "id": "qwen/qwen-2.5-coder-32b-instruct", + "name": "Qwen2.5 Coder 32B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000066", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "6e49ab67ec13f14573631b281289fb3d072b4895c2dc711f46a4ac2c879e8076", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen-plus": { + "canonical_slug": "qwen/qwen-plus-2025-01-25", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000234", + "input_cache_read": "0.000000156", + "input_cache_write": "0.000000975", + "min_prompt_tokens": 256000, + "prompt": "0.00000078" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.052000000", + "cache_write": "0.325000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.26000000", + "output": "0.78000000" + }, + "id": "qwen/qwen-plus", + "name": "Qwen: Qwen-Plus", + "price_per_token_usd": { + "cache_read": "0.000000052", + "cache_write": "0.000000325", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000026", + "output": "0.00000078" + }, + "price_unit": "USD/token", + "source_hash": "bc2a22f96a8588e9b6f791a938c019c260bbe248af4889c2d3dcfea3d2a935d9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen-plus-2025-07-28": { + "canonical_slug": "qwen/qwen-plus-2025-07-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000234", + "min_prompt_tokens": 256000, + "prompt": "0.00000078" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.26000000", + "output": "0.78000000" + }, + "id": "qwen/qwen-plus-2025-07-28", + "name": "Qwen: Qwen Plus 0728", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000026", + "output": "0.00000078" + }, + "price_unit": "USD/token", + "source_hash": "7168a321833c6b3e1744e30414050f474e8071b4c0a6aa938fd69a52cf2d3e33", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen2.5-vl-72b-instruct": { + "canonical_slug": "qwen/qwen2.5-vl-72b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 128000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 128000, + "is_moderated": false, + "max_completion_tokens": 115200 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.4000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8000000", + "output": "1.000000" + }, + "id": "qwen/qwen2.5-vl-72b-instruct", + "name": "Qwen: Qwen2.5 VL 72B Instruct", + "price_per_token_usd": { + "cache_read": "0.0000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "20696e846dc7e99ac4fb80acc96b0dd5750fa8a2aaa72c541de2fd852185029f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-14b": { + "canonical_slug": "qwen/qwen3-14b-04-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 40960, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.12000000", + "output": "0.24000000" + }, + "id": "qwen/qwen3-14b", + "name": "Qwen: Qwen3 14B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000012", + "output": "0.00000024" + }, + "price_unit": "USD/token", + "source_hash": "181e0871f10bc9141f86051b86f7eea2d5478e465b1985d5ed736c4fee0820d1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-235b-a22b": { + "canonical_slug": "qwen/qwen3-235b-a22b-04-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.455000000", + "output": "1.82000000" + }, + "id": "qwen/qwen3-235b-a22b", + "name": "Qwen: Qwen3 235B A22B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000455", + "output": "0.00000182" + }, + "price_unit": "USD/token", + "source_hash": "b5e3a9ccac85ec3cbe6c5ca0ab59051071b9b8897b70f25d24cb27d9870e543f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-235b-a22b-2507": { + "canonical_slug": "qwen/qwen3-235b-a22b-07-25", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0175000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0875000000", + "output": "0.35000000" + }, + "id": "qwen/qwen3-235b-a22b-2507", + "name": "Qwen: Qwen3 235B A22B Instruct 2507", + "price_per_token_usd": { + "cache_read": "0.0000000175", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000000875", + "output": "0.00000035" + }, + "price_unit": "USD/token", + "source_hash": "cff626277f4b7c4cd2adc7a4f2b0ab7dbebe1ece66a4bf92b0584111fc0fab4c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-235b-a22b-thinking-2507": { + "canonical_slug": "qwen/qwen3-235b-a22b-thinking-2507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.23000000", + "output": "2.3000000" + }, + "id": "qwen/qwen3-235b-a22b-thinking-2507", + "name": "Qwen: Qwen3 235B A22B Thinking 2507", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000023", + "output": "0.0000023" + }, + "price_unit": "USD/token", + "source_hash": "4e95777b8825041992b7cfa3abb4a3f8e1f2e6fddca8109b09139f64be1613e9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-30b-a3b": { + "canonical_slug": "qwen/qwen3-30b-a3b-04-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 40960, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.12000000", + "output": "0.5000000" + }, + "id": "qwen/qwen3-30b-a3b", + "name": "Qwen: Qwen3 30B A3B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000012", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "79d7aa29251baff782d2d7c4135f059d5d294100bca91a0acca9bebe43f1b78e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-30b-a3b-instruct-2507": { + "canonical_slug": "qwen/qwen3-30b-a3b-instruct-2507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.3000000" + }, + "id": "qwen/qwen3-30b-a3b-instruct-2507", + "name": "Qwen: Qwen3 30B A3B Instruct 2507", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "58437ba2a253807f8793b46e90738297e30704526be8374d90c2a53cff77cf73", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-30b-a3b-thinking-2507": { + "canonical_slug": "qwen/qwen3-30b-a3b-thinking-2507", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 81920, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 81920, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "2.4000000" + }, + "id": "qwen/qwen3-30b-a3b-thinking-2507", + "name": "Qwen: Qwen3 30B A3B Thinking 2507", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000024" + }, + "price_unit": "USD/token", + "source_hash": "1ccd2234b712a991ac6c37c39c8cacb6bfbed5b6e9c60f58325ade32e132d581", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-32b": { + "canonical_slug": "qwen/qwen3-32b-04-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 40960, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.08000000", + "output": "0.28000000" + }, + "id": "qwen/qwen3-32b", + "name": "Qwen: Qwen3 32B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000008", + "output": "0.00000028" + }, + "price_unit": "USD/token", + "source_hash": "8ec6337eaef277f6388890ea6a005b519e7eb03512797f4558f7191cdb536c27", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-8b": { + "canonical_slug": "qwen/qwen3-8b-04-28", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.117000000", + "output": "0.455000000" + }, + "id": "qwen/qwen3-8b", + "name": "Qwen: Qwen3 8B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000117", + "output": "0.000000455" + }, + "price_unit": "USD/token", + "source_hash": "7206d3439c6d73dd4400e67ca3582368e9300c4ff0c936fa4a8985e2b5e99fce", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-coder": { + "canonical_slug": "qwen/qwen3-coder-480b-a35b-07-25", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.000000" + }, + "id": "qwen/qwen3-coder", + "name": "Qwen: Qwen3 Coder 480B A35B", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "3df4a47a467af4c2a11f9f31e2016fdd3b398b1453186610b2fa47d65c19a1b0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-coder-30b-a3b-instruct": { + "canonical_slug": "qwen/qwen3-coder-30b-a3b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.07000000", + "output": "0.28000000" + }, + "id": "qwen/qwen3-coder-30b-a3b-instruct", + "name": "Qwen: Qwen3 Coder 30B A3B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000007", + "output": "0.00000028" + }, + "price_unit": "USD/token", + "source_hash": "b87a0b01fe93fa7c3627ab19ea067f7b9a65153535dda05ae0fa5c5ef80227ed", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-coder-flash": { + "canonical_slug": "qwen/qwen3-coder-flash", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000001625", + "input_cache_read": "0.000000065", + "input_cache_write": "0.00000040625", + "min_prompt_tokens": 32000, + "prompt": "0.000000325" + }, + { + "completion": "0.0000026", + "input_cache_read": "0.000000104", + "input_cache_write": "0.00000065", + "min_prompt_tokens": 128000, + "prompt": "0.00000052" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.039000000", + "cache_write": "0.24375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.195000000", + "output": "0.975000000" + }, + "id": "qwen/qwen3-coder-flash", + "name": "Qwen: Qwen3 Coder Flash", + "price_per_token_usd": { + "cache_read": "0.000000039", + "cache_write": "0.00000024375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000195", + "output": "0.000000975" + }, + "price_unit": "USD/token", + "source_hash": "53d4083cb36eba5fbcfffe780311932cbe7f34069a9d7fb75f4835df510d5d0a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-coder-next": { + "canonical_slug": "qwen/qwen3-coder-next-2025-02-03", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.07000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.12000000", + "output": "0.8000000" + }, + "id": "qwen/qwen3-coder-next", + "name": "Qwen: Qwen3 Coder Next", + "price_per_token_usd": { + "cache_read": "0.00000007", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000012", + "output": "0.0000008" + }, + "price_unit": "USD/token", + "source_hash": "9a5e65cbb61b5c5f269e214317d6533628a90485874b9f45d62272a2e55ecd49", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-coder-plus": { + "canonical_slug": "qwen/qwen3-coder-plus", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000585", + "input_cache_read": "0.000000234", + "input_cache_write": "0.0000014625", + "min_prompt_tokens": 32000, + "prompt": "0.00000117" + }, + { + "completion": "0.00000975", + "input_cache_read": "0.00000039", + "input_cache_write": "0.0000024375", + "min_prompt_tokens": 128000, + "prompt": "0.00000195" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.13000000", + "cache_write": "0.8125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.65000000", + "output": "3.25000000" + }, + "id": "qwen/qwen3-coder-plus", + "name": "Qwen: Qwen3 Coder Plus", + "price_per_token_usd": { + "cache_read": "0.00000013", + "cache_write": "0.0000008125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000065", + "output": "0.00000325" + }, + "price_unit": "USD/token", + "source_hash": "e6d526e0945ad97627b0acceeed497bef1dca8113f83c102c300d21276dd2497", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-max": { + "canonical_slug": "qwen/qwen3-max", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000078", + "input_cache_read": "0.000000312", + "input_cache_write": "0.00000195", + "min_prompt_tokens": 32000, + "prompt": "0.00000156" + }, + { + "completion": "0.00000975", + "input_cache_read": "0.00000039", + "input_cache_write": "0.0000024375", + "min_prompt_tokens": 128000, + "prompt": "0.00000195" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.156000000", + "cache_write": "0.975000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.78000000", + "output": "3.9000000" + }, + "id": "qwen/qwen3-max", + "name": "Qwen: Qwen3 Max", + "price_per_token_usd": { + "cache_read": "0.000000156", + "cache_write": "0.000000975", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000078", + "output": "0.0000039" + }, + "price_unit": "USD/token", + "source_hash": "99d9b3a344b8055167f89cfac7759d982d9dbf7d47c74e9fa1f026b814d82dbe", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-max-thinking": { + "canonical_slug": "qwen/qwen3-max-thinking-20260123", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000078", + "min_prompt_tokens": 32000, + "prompt": "0.00000156" + }, + { + "completion": "0.00000975", + "min_prompt_tokens": 128000, + "prompt": "0.00000195" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.78000000", + "output": "3.9000000" + }, + "id": "qwen/qwen3-max-thinking", + "name": "Qwen: Qwen3 Max Thinking", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000078", + "output": "0.0000039" + }, + "price_unit": "USD/token", + "source_hash": "594786fa060f4c8a347469b29f902947d37dc201a76e196bbb65214f9904f025", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-next-80b-a3b-instruct": { + "canonical_slug": "qwen/qwen3-next-80b-a3b-instruct-2509", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.07000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "1.1000000" + }, + "id": "qwen/qwen3-next-80b-a3b-instruct", + "name": "Qwen: Qwen3 Next 80B A3B Instruct", + "price_per_token_usd": { + "cache_read": "0.00000007", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000011" + }, + "price_unit": "USD/token", + "source_hash": "9636779445a9d684730b16e5bc85f0142ca41932ab5bf65e12b34b95573f0d49", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-next-80b-a3b-thinking": { + "canonical_slug": "qwen/qwen3-next-80b-a3b-thinking-2509", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "1.2000000" + }, + "id": "qwen/qwen3-next-80b-a3b-thinking", + "name": "Qwen: Qwen3 Next 80B A3B Thinking", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "369c2ad51c6a67d99e61599506ce9db4888e140a0308f35fd9e34cd1c9796dec", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-235b-a22b-instruct": { + "canonical_slug": "qwen/qwen3-vl-235b-a22b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.21000000", + "output": "1.9000000" + }, + "id": "qwen/qwen3-vl-235b-a22b-instruct", + "name": "Qwen: Qwen3 VL 235B A22B Instruct", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000021", + "output": "0.0000019" + }, + "price_unit": "USD/token", + "source_hash": "2d32b7a047a9fb8cb1afa500ba2a50422d48910c87dcde9478c7df8d5ca8af6f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-235b-a22b-thinking": { + "canonical_slug": "qwen/qwen3-vl-235b-a22b-thinking", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "4.000000" + }, + "id": "qwen/qwen3-vl-235b-a22b-thinking", + "name": "Qwen: Qwen3 VL 235B A22B Thinking", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "6e77813434d5d4f4176a93290569260bf90d52d5b725b3f5cfddffc02ce3a972", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-30b-a3b-instruct": { + "canonical_slug": "qwen/qwen3-vl-30b-a3b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "qwen/qwen3-vl-30b-a3b-instruct", + "name": "Qwen: Qwen3 VL 30B A3B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "5443dd19beec8d1becb36f9e8601b653f305ec82f018b62ef8ce8ebaa995a746", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-30b-a3b-thinking": { + "canonical_slug": "qwen/qwen3-vl-30b-a3b-thinking", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "2.4000000" + }, + "id": "qwen/qwen3-vl-30b-a3b-thinking", + "name": "Qwen: Qwen3 VL 30B A3B Thinking", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.0000024" + }, + "price_unit": "USD/token", + "source_hash": "786716d8363ace68cd2744f2f46e57345d360e49df23760f1e64b10b7ea028fc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-32b-instruct": { + "canonical_slug": "qwen/qwen3-vl-32b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.104000000", + "output": "0.416000000" + }, + "id": "qwen/qwen3-vl-32b-instruct", + "name": "Qwen: Qwen3 VL 32B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000104", + "output": "0.000000416" + }, + "price_unit": "USD/token", + "source_hash": "10318c68e2e213bc97572b6acc86c3f7e752f1fc2478374ff4a1589711c8cfde", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-8b-instruct": { + "canonical_slug": "qwen/qwen3-vl-8b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.117000000", + "output": "0.455000000" + }, + "id": "qwen/qwen3-vl-8b-instruct", + "name": "Qwen: Qwen3 VL 8B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000117", + "output": "0.000000455" + }, + "price_unit": "USD/token", + "source_hash": "5fe1782777a5e8973f7b5a05d0ff80bdc7919f527fb43c3e9fe1f6fb5e0d5363", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3-vl-8b-thinking": { + "canonical_slug": "qwen/qwen3-vl-8b-thinking", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.18000000", + "output": "2.1000000" + }, + "id": "qwen/qwen3-vl-8b-thinking", + "name": "Qwen: Qwen3 VL 8B Thinking", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000018", + "output": "0.0000021" + }, + "price_unit": "USD/token", + "source_hash": "cba2979ea4fcc538aaa694bab14512152e5880c6267525c0529855abe548a803", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-122b-a10b": { + "canonical_slug": "qwen/qwen3.5-122b-a10b-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.26000000", + "output": "2.08000000" + }, + "id": "qwen/qwen3.5-122b-a10b", + "name": "Qwen: Qwen3.5-122B-A10B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000026", + "output": "0.00000208" + }, + "price_unit": "USD/token", + "source_hash": "9d30e0a786c63f8481096e03916b930b9f45ff373d18b18fe8ebe62f69b0c56f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-27b": { + "canonical_slug": "qwen/qwen3.5-27b-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.195000000", + "output": "1.56000000" + }, + "id": "qwen/qwen3.5-27b", + "name": "Qwen: Qwen3.5-27B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000195", + "output": "0.00000156" + }, + "price_unit": "USD/token", + "source_hash": "d2be2b22eb497d4ca90b69ddb5562c9f69b93ff4ee6df63111e814d3ac0c9e8b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-35b-a3b": { + "canonical_slug": "qwen/qwen3.5-35b-a3b-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15625000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3125000000", + "output": "1.25000000" + }, + "id": "qwen/qwen3.5-35b-a3b", + "name": "Qwen: Qwen3.5-35B-A3B", + "price_per_token_usd": { + "cache_read": "0.00000015625", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003125", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "bbf0554e29f853b9b9f2d8813d645022d19585a6fa9bd8eb6e13cabd1906b156", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-397b-a17b": { + "canonical_slug": "qwen/qwen3.5-397b-a17b-20260216", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.225000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.55000000", + "output": "3.5000000" + }, + "id": "qwen/qwen3.5-397b-a17b", + "name": "Qwen: Qwen3.5 397B A17B", + "price_per_token_usd": { + "cache_read": "0.000000225", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000055", + "output": "0.0000035" + }, + "price_unit": "USD/token", + "source_hash": "34e34f1491f18c96deb4b6bd723b1f7c2e92fe3245ebcb598201cb7a62da424c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-9b": { + "canonical_slug": "qwen/qwen3.5-9b-20260310", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.15000000" + }, + "id": "qwen/qwen3.5-9b", + "name": "Qwen: Qwen3.5-9B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.00000015" + }, + "price_unit": "USD/token", + "source_hash": "9a3d4f22343fe6e0307e4f4ce013a1fee76fa019c9ff7b70fb753c4bd4f980e3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-flash-02-23": { + "canonical_slug": "qwen/qwen3.5-flash-20260224", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.065000000", + "output": "0.26000000" + }, + "id": "qwen/qwen3.5-flash-02-23", + "name": "Qwen: Qwen3.5-Flash", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000065", + "output": "0.00000026" + }, + "price_unit": "USD/token", + "source_hash": "84ad27cca3ef95d1319cac41e8fe9d59206172e3957645e6ca9e2f432701df81", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-plus-02-15": { + "canonical_slug": "qwen/qwen3.5-plus-20260216", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000195", + "min_prompt_tokens": 256000, + "prompt": "0.000000325" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.26000000", + "output": "1.56000000" + }, + "id": "qwen/qwen3.5-plus-02-15", + "name": "Qwen: Qwen3.5 Plus 2026-02-15", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000026", + "output": "0.00000156" + }, + "price_unit": "USD/token", + "source_hash": "1be52c597cf858d9c8ac49df5f10208c52617da53ec6aa1307fd9ebfbc1d4240", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.5-plus-20260420": { + "canonical_slug": "qwen/qwen3.5-plus-20260420", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000225", + "input_cache_write": "0.00000046875", + "min_prompt_tokens": 256000, + "prompt": "0.000000375" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "1.8000000" + }, + "id": "qwen/qwen3.5-plus-20260420", + "name": "Qwen: Qwen3.5 Plus 2026-04-20", + "price_per_token_usd": { + "cache_read": null, + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000018" + }, + "price_unit": "USD/token", + "source_hash": "1f47aa5514e0bb0bf95d0b7f6810ebb584615a63b6a1411d102bd77d42f91d8d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.6-27b": { + "canonical_slug": "qwen/qwen3.6-27b-20260422", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 262140 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.32000000", + "output": "2.7000000" + }, + "id": "qwen/qwen3.6-27b", + "name": "Qwen: Qwen3.6 27B", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000032", + "output": "0.0000027" + }, + "price_unit": "USD/token", + "source_hash": "a21478b6878fad93ea17e3e472c143231062c98bc2ebc0ef4f7fabaea406fbd0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.6-35b-a3b": { + "canonical_slug": "qwen/qwen3.6-35b-a3b-20260415", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.05000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "1.000000" + }, + "id": "qwen/qwen3.6-35b-a3b", + "name": "Qwen: Qwen3.6 35B A3B", + "price_per_token_usd": { + "cache_read": "0.00000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.000001" + }, + "price_unit": "USD/token", + "source_hash": "5f3b32d05d9b54fd69ac8bd3c97b062bb2d18d4f7a41e11b0a9c8d99c4b050f7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.6-flash": { + "canonical_slug": "qwen/qwen3.6-flash", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000003", + "input_cache_write": "0.0000009375", + "min_prompt_tokens": 256000, + "prompt": "0.00000075" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": "0.234375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1875000000", + "output": "1.125000000" + }, + "id": "qwen/qwen3.6-flash", + "name": "Qwen: Qwen3.6 Flash", + "price_per_token_usd": { + "cache_read": null, + "cache_write": "0.000000234375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001875", + "output": "0.000001125" + }, + "price_unit": "USD/token", + "source_hash": "e860124be879b68f3b0092ae5cb841f69c761d8b9feda6e3c165b73e48ab1533", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.6-max-preview": { + "canonical_slug": "qwen/qwen3.6-max-preview-20260420", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000948", + "input_cache_write": "0.000001975", + "min_prompt_tokens": 128000, + "prompt": "0.00000158" + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": "1.28375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.027000000", + "output": "6.162000000" + }, + "id": "qwen/qwen3.6-max-preview", + "name": "Qwen: Qwen3.6 Max Preview", + "price_per_token_usd": { + "cache_read": null, + "cache_write": "0.00000128375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001027", + "output": "0.000006162" + }, + "price_unit": "USD/token", + "source_hash": "f96a30d800d68207a43e198796a93dbd1308e6b170506339eed6042aadbc107e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.6-plus": { + "canonical_slug": "qwen/qwen3.6-plus-04-02", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000039", + "input_cache_write": "0.000001625", + "min_prompt_tokens": 256000, + "prompt": "0.0000013" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": "0.40625000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.325000000", + "output": "1.95000000" + }, + "id": "qwen/qwen3.6-plus", + "name": "Qwen: Qwen3.6 Plus", + "price_per_token_usd": { + "cache_read": null, + "cache_write": "0.00000040625", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000325", + "output": "0.00000195" + }, + "price_unit": "USD/token", + "source_hash": "7cca411cdf02fbc94a589497379b4876c0f49fa1cdbbc9414cd9d4585e9728ee", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.7-flash": { + "canonical_slug": "qwen/qwen3.7-flash-20260727", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000004", + "input_cache_read": "0.00000002", + "input_cache_write": "0.000000125", + "min_prompt_tokens": 32000, + "prompt": "0.0000001" + }, + { + "completion": "0.0000008", + "input_cache_read": "0.00000004", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 256000, + "prompt": "0.0000002" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.006000000", + "cache_write": "0.038000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.03000000", + "output": "0.13000000" + }, + "id": "qwen/qwen3.7-flash", + "name": "Qwen: Qwen3.7 Flash", + "price_per_token_usd": { + "cache_read": "0.000000006", + "cache_write": "0.000000038", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000003", + "output": "0.00000013" + }, + "price_unit": "USD/token", + "source_hash": "9fefce793d2af23f6d6c385caeab1ccb2cfc2f34fdf38fdea08e0d81b254feb3", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.7-max": { + "canonical_slug": "qwen/qwen3.7-max-20260520", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.295000000", + "cache_write": "1.84375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.475000000", + "output": "4.425000000" + }, + "id": "qwen/qwen3.7-max", + "name": "Qwen: Qwen3.7 Max", + "price_per_token_usd": { + "cache_read": "0.000000295", + "cache_write": "0.00000184375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001475", + "output": "0.000004425" + }, + "price_unit": "USD/token", + "source_hash": "b64bc620e699df53d59b672d1cabc00dfb9c9615e5084fd02ae59de36d6851e7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.7-plus": { + "canonical_slug": "qwen/qwen3.7-plus-20260602", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000384", + "input_cache_read": "0.000000192", + "input_cache_write": "0.0000012", + "min_prompt_tokens": 256000, + "prompt": "0.00000096" + } + ] + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.064000000", + "cache_write": "0.4000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.32000000", + "output": "1.28000000" + }, + "id": "qwen/qwen3.7-plus", + "name": "Qwen: Qwen3.7 Plus", + "price_per_token_usd": { + "cache_read": "0.000000064", + "cache_write": "0.0000004", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000032", + "output": "0.00000128" + }, + "price_unit": "USD/token", + "source_hash": "8bf0819157c17bcac6576f7ed0484e7d74a3309d903143ff1062b42cc9e730f4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-2.4t-a95b": { + "canonical_slug": "qwen/qwen3.8-2.4t-a95b-20260812", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "qwen/qwen3.8-2.4t-a95b", + "name": "Qwen: Qwen3.8 2.4T A95B", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "36338704744303f2217642ebf851e262f7b376edee16b1e65bb52264683a8671", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-27b": { + "canonical_slug": "qwen/qwen3.8-27b-20260814", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.085000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.42000000", + "output": "3.000000" + }, + "id": "qwen/qwen3.8-27b", + "name": "Qwen: Qwen3.8 27B", + "price_per_token_usd": { + "cache_read": "0.000000085", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000042", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "81d1f9f440a3fad40dc27b64d4ca531ce772f896cd372bd95cedb4438c2f1559", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-27b:free": { + "canonical_slug": "qwen/qwen3.8-27b-20260814", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "qwen/qwen3.8-27b:free", + "name": "Qwen: Qwen3.8 27B (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "51eea05e730bfcfee580732e2268c714527866765f13d2a4fb8b06e50e1a38c9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-flash": { + "canonical_slug": "qwen/qwen3.8-flash-20260826", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.016000000", + "cache_write": "0.2000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.47000000" + }, + "id": "qwen/qwen3.8-flash", + "name": "Qwen: Qwen3.8 Flash", + "price_per_token_usd": { + "cache_read": "0.000000016", + "cache_write": "0.0000002", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000047" + }, + "price_unit": "USD/token", + "source_hash": "76743275685fda6792489a466e3fdb9a895af2c23c5951caec6c88f438890e6b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-max-0902": { + "canonical_slug": "qwen/qwen3.8-max-20260902", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "qwen/qwen3.8-max-0902", + "name": "Qwen: Qwen3.8 Max (0902)", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "5dcab64eea688677aa9a286d5da884d61fa0ee63429c5133908aa04fcb5da772", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-max-prime": { + "canonical_slug": "qwen/qwen3.8-max-prime-20260923", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "4.000000", + "output": "12.000000" + }, + "id": "qwen/qwen3.8-max-prime", + "name": "Qwen: Qwen3.8 Max Prime", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000004", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "7f38cdd913a9de89c950b251d7d5c79df4b7e5d7c967ffd447efd75e60336c32", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "qwen/qwen3.8-omni-flash": { + "canonical_slug": "qwen/qwen3.8-omni-flash-20260918", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.016000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.47000000" + }, + "id": "qwen/qwen3.8-omni-flash", + "name": "Qwen: Qwen3.8 Omni Flash", + "price_per_token_usd": { + "cache_read": "0.000000016", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.00000047" + }, + "price_unit": "USD/token", + "source_hash": "84388876b1def9f59ca840553d1e7a5969d3f0f7eb221a07b19936392822beac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "rekaai/reka-edge": { + "canonical_slug": "rekaai/reka-edge-2603", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 16384, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 16384, + "is_moderated": false, + "max_completion_tokens": 14745 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.1000000" + }, + "id": "rekaai/reka-edge", + "name": "Reka Edge", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000001" + }, + "price_unit": "USD/token", + "source_hash": "fffdec23780be884f65802ddf72ea2b5678869f18386286f9e83c7a2f02d0d59", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "rekaai/reka-flash-3": { + "canonical_slug": "rekaai/reka-flash-3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 58982 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.2000000" + }, + "id": "rekaai/reka-flash-3", + "name": "Reka Flash 3", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "a3c5760eab490a16193bf92724bd174b9176dbc4a5609401089fe5b00541e614", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "relace/relace-apply-3": { + "canonical_slug": "relace/relace-apply-3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.85000000", + "output": "1.25000000" + }, + "id": "relace/relace-apply-3", + "name": "Relace: Relace Apply 3", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000085", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "4fd6715ad48345f8ad9ae3a697f2873fe0cd2761f3282f78cae7952bc8104a03", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "relace/relace-search": { + "canonical_slug": "relace/relace-search-20251208", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "3.000000" + }, + "id": "relace/relace-search", + "name": "Relace: Relace Search", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000003" + }, + "price_unit": "USD/token", + "source_hash": "08fadd17e19d59ff96e4ca0356cb7b8fdd809cb9ceda55e07512fbbd119597d7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sakana/fugu-max": { + "canonical_slug": "sakana/fugu-max-20260911", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "sakana/fugu-max", + "name": "Sakana: Fugu Max", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "31ea5e514bdcfe447fd97ce428237861eabd32be165ea039a16fbb707e3ca35d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sakana/fugu-ultra": { + "canonical_slug": "sakana/fugu-ultra-20260615", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000045", + "input_cache_read": "0.000001", + "min_prompt_tokens": 272000, + "prompt": "0.00001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "30.00000" + }, + "id": "sakana/fugu-ultra", + "name": "Sakana: Fugu Ultra", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.00003" + }, + "price_unit": "USD/token", + "source_hash": "7619a83d9a8d01cc62da9a0d143e1afa72570667c0f5b96a412d57e2cb1335f0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sakana/fugu-ultra-v2": { + "canonical_slug": "sakana/fugu-ultra-v2-20260911", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000045", + "input_cache_read": "0.000001", + "min_prompt_tokens": 272000, + "prompt": "0.00001" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "5.000000", + "output": "30.00000" + }, + "id": "sakana/fugu-ultra-v2", + "name": "Sakana: Fugu Ultra v2", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000005", + "output": "0.00003" + }, + "price_unit": "USD/token", + "source_hash": "b4c0ac6de503abb3d9c720ba4097c1bc29864ec9f32ad984f63fb91851f400dc", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sakana/sakana-namazu": { + "canonical_slug": "sakana/namazu-20260811", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.007" + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.95000000", + "output": "4.000000" + }, + "id": "sakana/sakana-namazu", + "name": "Sakana: Sakana Namazu", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000095", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "0c64572e2dadcb35ae119a93b4bf7d03e601d1cad4a5a1c4921ca655042101ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sao10k/l3-lunaris-8b": { + "canonical_slug": "sao10k/l3-lunaris-8b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 7372 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.04000000", + "output": "0.05000000" + }, + "id": "sao10k/l3-lunaris-8b", + "name": "Sao10K: Llama 3 8B Lunaris", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000004", + "output": "0.00000005" + }, + "price_unit": "USD/token", + "source_hash": "e952323c04bfc9fa1cd6edcba040b6efc559925b72d9cf3eb22c824c817e3c18", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sao10k/l3.1-euryale-70b": { + "canonical_slug": "sao10k/l3.1-euryale-70b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.85000000", + "output": "0.85000000" + }, + "id": "sao10k/l3.1-euryale-70b", + "name": "Sao10K: Llama 3.1 Euryale 70B v2.2", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000085", + "output": "0.00000085" + }, + "price_unit": "USD/token", + "source_hash": "6168e0f90794acb01b3c5ef360c0e51078c5721f311b4564c1be4c81efe4fed1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "sao10k/l3.3-euryale-70b": { + "canonical_slug": "sao10k/l3.3-euryale-70b-v2.3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.65000000", + "output": "0.75000000" + }, + "id": "sao10k/l3.3-euryale-70b", + "name": "Sao10K: Llama 3.3 Euryale 70B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000065", + "output": "0.00000075" + }, + "price_unit": "USD/token", + "source_hash": "ee324b20a53a13fc2285c535aa749776af44506a0de216838dba8a597c8898e7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "stealth/space-bunny-alpha": { + "canonical_slug": "stealth/space-bunny-alpha", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 524288 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "stealth/space-bunny-alpha", + "name": "Space Bunny Alpha", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "e6d8445e112ca499c5cae13f1964d944303e7b0973e49037fe200cd564edd0b6", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "stepfun/step-3.5-flash": { + "canonical_slug": "stepfun/step-3.5-flash", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.3000000" + }, + "id": "stepfun/step-3.5-flash", + "name": "StepFun: Step 3.5 Flash", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000003" + }, + "price_unit": "USD/token", + "source_hash": "3a9bbb6a8b44a2b0a27da1c1289a0bd8a6481626f413478ba2f2c65bfa8f7b99", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "stepfun/step-3.7-flash": { + "canonical_slug": "stepfun/step-3.7-flash-20260528", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 230400 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.04000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.2000000", + "output": "1.15000000" + }, + "id": "stepfun/step-3.7-flash", + "name": "StepFun: Step 3.7 Flash", + "price_per_token_usd": { + "cache_read": "0.00000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000002", + "output": "0.00000115" + }, + "price_unit": "USD/token", + "source_hash": "1ccf7807a33daeef904ecfe50f1c424d666ca53d9e73129e72769b0342f3a0e2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hunyuan-a13b-instruct": { + "canonical_slug": "tencent/hunyuan-a13b-instruct", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.14000000", + "output": "0.57000000" + }, + "id": "tencent/hunyuan-a13b-instruct", + "name": "Tencent: Hunyuan A13B Instruct", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000014", + "output": "0.00000057" + }, + "price_unit": "USD/token", + "source_hash": "a826b46a8d068c5756e4116961de697bb4e3b4e7b3b5f3e748dc91c28a8a7d7f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy-mt2-1.8b": { + "canonical_slug": "tencent/hy-mt2-1.8b-20260521", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.044000000", + "output": "0.177000000" + }, + "id": "tencent/hy-mt2-1.8b", + "name": "Tencent: Hy-MT2-1.8B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000044", + "output": "0.000000177" + }, + "price_unit": "USD/token", + "source_hash": "f43a8e53fa6db43fa2f94bb01f0e20ca062c2a7dacf26f59372f6060398cc68c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy-mt2-30b-a3b": { + "canonical_slug": "tencent/hy-mt2-30b-a3b-20260521", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.074000000", + "output": "0.295000000" + }, + "id": "tencent/hy-mt2-30b-a3b", + "name": "Tencent: Hy-MT2-30B-A3B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000074", + "output": "0.000000295" + }, + "price_unit": "USD/token", + "source_hash": "57ebf5edf96593477eaff1b84b823e5e8770cf0335fa39df3de80f1fdd50e054", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy-mt2-7b": { + "canonical_slug": "tencent/hy-mt2-7b-20260521", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 8192, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 8192, + "is_moderated": false, + "max_completion_tokens": 4096 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.074000000", + "output": "0.295000000" + }, + "id": "tencent/hy-mt2-7b", + "name": "Tencent: Hy-MT2-7B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000074", + "output": "0.000000295" + }, + "price_unit": "USD/token", + "source_hash": "685905d1a67c87330a40edee7b28e75be77ed215abbbc7e3f207557cda606da8", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy3": { + "canonical_slug": "tencent/hy3-20260706", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000000528", + "input_cache_read": "0.000000033", + "prompt": "0.000000132", + "utc_end": 1600, + "utc_start": 0 + }, + { + "completion": "0.00000033", + "input_cache_read": "0.000000020625", + "prompt": "0.0000000825", + "utc_end": 0, + "utc_start": 1600 + } + ] + }, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.033000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.132000000", + "output": "0.528000000" + }, + "id": "tencent/hy3", + "name": "Tencent: Hy3", + "price_per_token_usd": { + "cache_read": "0.000000033", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000132", + "output": "0.000000528" + }, + "price_unit": "USD/token", + "source_hash": "8a35c062396a358306cae299272d11334c7ad6c824ffea8e70258b4c7f75bc50", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy3-preview": { + "canonical_slug": "tencent/hy3-preview-20260421", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 235929 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.06000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.18000000", + "output": "0.6000000" + }, + "id": "tencent/hy3-preview", + "name": "Tencent: Hy3 preview", + "price_per_token_usd": { + "cache_read": "0.00000006", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000018", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "21ac419f9827e8e2fd88c7976a9fa9ed9c5321b78e6b95f35752601ddfd351eb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "tencent/hy4-preview": { + "canonical_slug": "tencent/hy4-preview-20260827", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.042000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.834000000", + "output": "2.501000000" + }, + "id": "tencent/hy4-preview", + "name": "Tencent: Hy4 preview", + "price_per_token_usd": { + "cache_read": "0.000000042", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000834", + "output": "0.000002501" + }, + "price_unit": "USD/token", + "source_hash": "8af45acf42c86f45ebe47772c66a85f7336051bd8fc6a1f310623041390c7a95", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thedrummer/cydonia-24b-v4.1": { + "canonical_slug": "thedrummer/cydonia-24b-v4.1", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.15000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "0.5000000" + }, + "id": "thedrummer/cydonia-24b-v4.1", + "name": "TheDrummer: Cydonia 24B V4.1", + "price_per_token_usd": { + "cache_read": "0.00000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "b650f9f6b5d02ca707c4f5984ef447405735151553a52bc1c70986c6a8f0449f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thedrummer/skyfall-36b-v2": { + "canonical_slug": "thedrummer/skyfall-36b-v2", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 29491 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.55000000", + "output": "0.8000000" + }, + "id": "thedrummer/skyfall-36b-v2", + "name": "TheDrummer: Skyfall 36B V2", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000055", + "output": "0.0000008" + }, + "price_unit": "USD/token", + "source_hash": "e1480a87fc94d46e9a553b82d3da741144eaebb117c5e58a46e41e49a6fcad2c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thedrummer/unslopnemo-12b": { + "canonical_slug": "thedrummer/unslopnemo-12b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1024000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1024000, + "is_moderated": false, + "max_completion_tokens": 819200 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.4000000", + "output": "0.4000000" + }, + "id": "thedrummer/unslopnemo-12b", + "name": "TheDrummer: UnslopNemo 12B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000004", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "ccffd66e62bd647e3b89e082c98f5d53462304fc08978ed2f2df89fae2ffa18b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thinkingmachines/inkling": { + "canonical_slug": "thinkingmachines/inkling-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 524288, + "is_moderated": false, + "max_completion_tokens": 471859 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.17000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "4.05000000" + }, + "id": "thinkingmachines/inkling", + "name": "Thinking Machines: Inkling", + "price_per_token_usd": { + "cache_read": "0.00000017", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.00000405" + }, + "price_unit": "USD/token", + "source_hash": "3f6b4fbee72126e5a6bd0b4a999d3cbf1be0b30144f4a4bec5dacd097b437643", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thinkingmachines/inkling-small": { + "canonical_slug": "thinkingmachines/inkling-small-20260730", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 524288, + "is_moderated": false, + "max_completion_tokens": 262144 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.45000000", + "output": "1.2000000" + }, + "id": "thinkingmachines/inkling-small", + "name": "Thinking Machines: Inkling Small", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000045", + "output": "0.0000012" + }, + "price_unit": "USD/token", + "source_hash": "d6c9d104a21307e4ee88dd165929768ee0cf5dcca127e8f6679a0acb85e2393c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thinkingmachines/inkling-small:free": { + "canonical_slug": "thinkingmachines/inkling-small-20260730", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 262144 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "thinkingmachines/inkling-small:free", + "name": "Thinking Machines: Inkling Small (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "cb727b538d8a9682b82adbd15440869037c508b111a3e641d9bd025757d2ecaf", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "thinkingmachines/inkling:free": { + "canonical_slug": "thinkingmachines/inkling-20260715", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 262144 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "thinkingmachines/inkling:free", + "name": "Thinking Machines: Inkling (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "ef0d8c2816af63326e0db944a9f9f748ea6449caa1267a2d678eda3b0be77f2f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "unbiased/pareto": { + "canonical_slug": "unbiased/pareto-20260917", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 262144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 262144, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.5000000", + "output": "7.5000000" + }, + "id": "unbiased/pareto", + "name": "Pareto", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000025", + "output": "0.0000075" + }, + "price_unit": "USD/token", + "source_hash": "0b1dd5ed4cb628398ac78f46de6310fba0b6d03ff8c7803c48842c4de1b560de", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "undi95/remm-slerp-l2-13b": { + "canonical_slug": "undi95/remm-slerp-l2-13b", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 6144, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 6144, + "is_moderated": false, + "max_completion_tokens": 5529 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.35000000", + "output": "0.65000000" + }, + "id": "undi95/remm-slerp-l2-13b", + "name": "ReMM SLERP 13B", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000035", + "output": "0.00000065" + }, + "price_unit": "USD/token", + "source_hash": "22a5b835fcf43b6fd7fa3da343951228543ab7ea8312f456eb141dadb1a5b6be", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "upstage/solar-mini4": { + "canonical_slug": "upstage/solar-mini4-20260922", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 524288, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 524288, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.005000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.05000000", + "output": "0.2000000" + }, + "id": "upstage/solar-mini4", + "name": "Upstage: Solar Mini 4", + "price_per_token_usd": { + "cache_read": "0.000000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000005", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "54c55545c15b373c3a0267c5f8ee00468df23591cac6a0e80ddf1cd6536b85eb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "upstage/solar-pro-3": { + "canonical_slug": "upstage/solar-pro-3", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.015000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.15000000", + "output": "0.6000000" + }, + "id": "upstage/solar-pro-3", + "name": "Upstage: Solar Pro 3", + "price_per_token_usd": { + "cache_read": "0.000000015", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000015", + "output": "0.0000006" + }, + "price_unit": "USD/token", + "source_hash": "9659144e93105aa61cb514fb5c45f4789301689897bd4d00742684c5eaa6903a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "upstage/solar-pro4": { + "canonical_slug": "upstage/solar-pro4-20260810", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 524288, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 524288, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.018000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09000000", + "output": "0.36000000" + }, + "id": "upstage/solar-pro4", + "name": "Upstage: Solar Pro 4", + "price_per_token_usd": { + "cache_read": "0.000000018", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009", + "output": "0.00000036" + }, + "price_unit": "USD/token", + "source_hash": "b9f1fe97ac7e40a12a7297691963686a590c9d235631a2f66440b152f010b4e1", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "writer/palmyra-x5": { + "canonical_slug": "writer/palmyra-x5-20250428", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1040000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1040000, + "is_moderated": true, + "max_completion_tokens": 8192 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "6.000000" + }, + "id": "writer/palmyra-x5", + "name": "Writer: Palmyra X5", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "02fd94944d8a0b2c19473af84e5563f6188f96deb6647432e833f8b712de728f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.20": { + "canonical_slug": "x-ai/grok-4.20-20260309", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 2000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000005", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.0000025" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 2000000, + "is_moderated": false, + "max_completion_tokens": 1800000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "2.5000000" + }, + "id": "x-ai/grok-4.20", + "name": "SpaceXAI: Grok 4.20", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "c8ccd4ff5648a228251fd0c1f1f8091ce7eb9d984ea6238b8ceb06d474a809aa", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.20-multi-agent": { + "canonical_slug": "x-ai/grok-4.20-multi-agent-20260309", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 2000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000005", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.0000025" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 2000000, + "is_moderated": false, + "max_completion_tokens": 1800000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "2.5000000" + }, + "id": "x-ai/grok-4.20-multi-agent", + "name": "SpaceXAI: Grok 4.20 Multi-Agent", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "119abd8d4145480ae8fa9c3de540f4d428c0cd9a289e4aee21c546fa55bdafe2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.3": { + "canonical_slug": "x-ai/grok-4.3-20260430", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000005", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.0000025" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 900000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.25000000", + "output": "2.5000000" + }, + "id": "x-ai/grok-4.3", + "name": "SpaceXAI: Grok 4.3", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000125", + "output": "0.0000025" + }, + "price_unit": "USD/token", + "source_hash": "8a04854cfb355476898b117355785dab5159c03ac1b9124c9d5eefd1f144963b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.3:batch": { + "canonical_slug": "x-ai/grok-4.3-20260430", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000004", + "input_cache_read": "0.00000032", + "min_prompt_tokens": 200000, + "prompt": "0.000002" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 900000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.16000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "2.000000" + }, + "id": "x-ai/grok-4.3:batch", + "name": "SpaceXAI: Grok 4.3 (batch)", + "price_per_token_usd": { + "cache_read": "0.00000016", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "a852c9ae802b06600bf226e59a1d22678f3a239604f2bcab55421eb20701f183", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.5": { + "canonical_slug": "x-ai/grok-4.5-20260708", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 500000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000012", + "input_cache_read": "0.0000006", + "min_prompt_tokens": 200000, + "prompt": "0.000004" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 500000, + "is_moderated": false, + "max_completion_tokens": 450000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.3000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "x-ai/grok-4.5", + "name": "SpaceXAI: Grok 4.5", + "price_per_token_usd": { + "cache_read": "0.0000003", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "1f1f58db261e86560f50ae5cc947c557e8498debded9f6c2a7bb68d8d0ee960d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.6": { + "canonical_slug": "x-ai/grok-4.6-20260810", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 500000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000012", + "input_cache_read": "0.000001", + "min_prompt_tokens": 200000, + "prompt": "0.000004" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 500000, + "is_moderated": false, + "max_completion_tokens": 450000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.5000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "6.000000" + }, + "id": "x-ai/grok-4.6", + "name": "SpaceXAI: Grok 4.6", + "price_per_token_usd": { + "cache_read": "0.0000005", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000006" + }, + "price_unit": "USD/token", + "source_hash": "8914f5ddd24178f3f32f6e78afbfdc7d96485cdaadfb1fd1dbc34d3da76cdabd", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-4.7": { + "canonical_slug": "x-ai/grok-4.7-20260916", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 500000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000096", + "input_cache_read": "0.0000008", + "min_prompt_tokens": 200000, + "prompt": "0.0000032" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 500000, + "is_moderated": false, + "max_completion_tokens": 450000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.4000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.6000000", + "output": "4.8000000" + }, + "id": "x-ai/grok-4.7", + "name": "SpaceXAI: Grok 4.7", + "price_per_token_usd": { + "cache_read": "0.0000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000016", + "output": "0.0000048" + }, + "price_unit": "USD/token", + "source_hash": "0c6beb3f2b346c2ee19823e05d28ac7a08fba782dd72686ba801b34c14311c5f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "x-ai/grok-build-0.1": { + "canonical_slug": "x-ai/grok-build-0.1-20260520", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 256000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000004", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.000002" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 256000, + "is_moderated": false, + "max_completion_tokens": 230400 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "2.000000" + }, + "id": "x-ai/grok-build-0.1", + "name": "SpaceXAI: Grok Build 0.1", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "351417e446d9b6de42b99d6e04a1214634f584eb75216aee81b85af614fa9854", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "xiaomi/mimo-v2.5": { + "canonical_slug": "xiaomi/mimo-v2.5-20260422", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0028000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.14000000", + "output": "0.28000000" + }, + "id": "xiaomi/mimo-v2.5", + "name": "Xiaomi: MiMo-V2.5", + "price_per_token_usd": { + "cache_read": "0.0000000028", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000014", + "output": "0.00000028" + }, + "price_unit": "USD/token", + "source_hash": "d8207ad34d3fece7779cccc9170f2161fdb3758a90106d9258c28be93c6e58cb", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "xiaomi/mimo-v2.5-pro": { + "canonical_slug": "xiaomi/mimo-v2.5-pro-20260422", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0036000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.435000000", + "output": "0.87000000" + }, + "id": "xiaomi/mimo-v2.5-pro", + "name": "Xiaomi: MiMo-V2.5-Pro", + "price_per_token_usd": { + "cache_read": "0.0000000036", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000435", + "output": "0.00000087" + }, + "price_unit": "USD/token", + "source_hash": "9becc2dff7b73256212b099c4e8637b2b6507fa8eb0c60f8e97727f18796f815", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "xiaomi/mimo-v2.6-flash": { + "canonical_slug": "xiaomi/mimo-v2.6-flash-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0028000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.14000000", + "output": "0.28000000" + }, + "id": "xiaomi/mimo-v2.6-flash", + "name": "Xiaomi: MiMo-V2.6-Flash", + "price_per_token_usd": { + "cache_read": "0.0000000028", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000014", + "output": "0.00000028" + }, + "price_unit": "USD/token", + "source_hash": "b5011a759d43582f5597b13d837488b1d0c4bf6a72aabaf08a847f62363f98ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "xiaomi/mimo-v2.6-pro": { + "canonical_slug": "xiaomi/mimo-v2.6-pro-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.0036000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.435000000", + "output": "0.87000000" + }, + "id": "xiaomi/mimo-v2.6-pro", + "name": "Xiaomi: MiMo-V2.6-Pro", + "price_per_token_usd": { + "cache_read": "0.0000000036", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000435", + "output": "0.00000087" + }, + "price_unit": "USD/token", + "source_hash": "0a71737f672e393a604dfea03f1d86edd6c0fa45924d8337a5108d2552033cc9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "xiaomi/mimo-v2.6-pro-ultraspeed": { + "canonical_slug": "xiaomi/mimo-v2.6-pro-ultraspeed-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.036000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "4.35000000", + "output": "8.7000000" + }, + "id": "xiaomi/mimo-v2.6-pro-ultraspeed", + "name": "Xiaomi: MiMo-V2.6-Pro-UltraSpeed", + "price_per_token_usd": { + "cache_read": "0.000000036", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000435", + "output": "0.0000087" + }, + "price_unit": "USD/token", + "source_hash": "90fed539f6a909efe071987647755ea4fac05fcfd3efba1c1a4170483eb44dc0", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.5": { + "canonical_slug": "z-ai/glm-4.5", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 98304 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.11000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.2000000" + }, + "id": "z-ai/glm-4.5", + "name": "Z.ai: GLM 4.5", + "price_per_token_usd": { + "cache_read": "0.00000011", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000022" + }, + "price_unit": "USD/token", + "source_hash": "71b6e3819cb187534f2a46ed28157969031e56dca3215d34ca9cb1f15245ddc9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.5-air": { + "canonical_slug": "z-ai/glm-4.5-air", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 98304 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.025000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.13000000", + "output": "0.85000000" + }, + "id": "z-ai/glm-4.5-air", + "name": "Z.ai: GLM 4.5 Air", + "price_per_token_usd": { + "cache_read": "0.000000025", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000013", + "output": "0.00000085" + }, + "price_unit": "USD/token", + "source_hash": "17fdffe9c9462680ba0c48370a87cac926f3072bea85f4aab620f7d24b628e96", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.5v": { + "canonical_slug": "z-ai/glm-4.5v", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 65536, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 65536, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.11000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "1.8000000" + }, + "id": "z-ai/glm-4.5v", + "name": "Z.ai: GLM 4.5V", + "price_per_token_usd": { + "cache_read": "0.00000011", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000018" + }, + "price_unit": "USD/token", + "source_hash": "454c1dbdb53803ba3b2d5c0fe883e39bdaebe8796bee97cfab17cffb72e48c9e", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.6": { + "canonical_slug": "z-ai/glm-4.6", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 198000, + "is_moderated": false, + "max_completion_tokens": 16384 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.08000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.43000000", + "output": "1.75000000" + }, + "id": "z-ai/glm-4.6", + "name": "Z.ai: GLM 4.6", + "price_per_token_usd": { + "cache_read": "0.00000008", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000043", + "output": "0.00000175" + }, + "price_unit": "USD/token", + "source_hash": "62b3f36685813ee6494b7fe2e3f021426c539c4f012a0e25374fe6d2a8d8076a", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.6v": { + "canonical_slug": "z-ai/glm-4.6-20251208", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 131072, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 32768 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.055000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.3000000", + "output": "0.9000000" + }, + "id": "z-ai/glm-4.6v", + "name": "Z.ai: GLM 4.6V", + "price_per_token_usd": { + "cache_read": "0.000000055", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000003", + "output": "0.0000009" + }, + "price_unit": "USD/token", + "source_hash": "256be66236a9d89d4dcf0d291bea9c2ec468852ccab46674bb0a87bbb7cf47b5", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.7": { + "canonical_slug": "z-ai/glm-4.7-20251222", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 202752, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.11000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "2.2000000" + }, + "id": "z-ai/glm-4.7", + "name": "Z.ai: GLM 4.7", + "price_per_token_usd": { + "cache_read": "0.00000011", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.0000022" + }, + "price_unit": "USD/token", + "source_hash": "6c1eb9a58aa76e1ca552f3c72a1267ecd9f9006b27e64ace1f3fc6d478e52a8f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-4.7-flash": { + "canonical_slug": "z-ai/glm-4.7-flash-20260119", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 131072, + "is_moderated": false, + "max_completion_tokens": 117964 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0605000000", + "output": "0.4000000" + }, + "id": "z-ai/glm-4.7-flash", + "name": "Z.ai: GLM 4.7 Flash", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000000605", + "output": "0.0000004" + }, + "price_unit": "USD/token", + "source_hash": "ea6ec48d93444f45a93ca34fa9e151c2a41fff853eb216c1aad6cbde3eb84fc9", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5": { + "canonical_slug": "z-ai/glm-5-20260211", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 198000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.12000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6000000", + "output": "1.92000000" + }, + "id": "z-ai/glm-5", + "name": "Z.ai: GLM 5", + "price_per_token_usd": { + "cache_read": "0.00000012", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006", + "output": "0.00000192" + }, + "price_unit": "USD/token", + "source_hash": "73dcc63641f04b36fd6da336d43b1f5681d1dc0b335389089093c9b078d44227", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5-turbo": { + "canonical_slug": "z-ai/glm-5-turbo-20260315", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 202752, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 202752, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.24000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.2000000", + "output": "4.000000" + }, + "id": "z-ai/glm-5-turbo", + "name": "Z.ai: GLM 5 Turbo", + "price_per_token_usd": { + "cache_read": "0.00000024", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000012", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "5921573ee27396d4e00230a423f568891ec61ddeb458a4b65a7bf1d636e242f4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.1": { + "canonical_slug": "z-ai/glm-5.1-20260406", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 204800, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 202752, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.17914000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.9646000000", + "output": "3.0316000000" + }, + "id": "z-ai/glm-5.1", + "name": "Z.ai: GLM 5.1", + "price_per_token_usd": { + "cache_read": "0.00000017914", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000009646", + "output": "0.0000030316" + }, + "price_unit": "USD/token", + "source_hash": "f4031e5503ed3fc21ebacc1483080475e5dae7054ca0181583e3bc99461b1211", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.2": { + "canonical_slug": "z-ai/glm-5.2-20260616", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.12064000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.6496000000", + "output": "2.0416000000" + }, + "id": "z-ai/glm-5.2", + "name": "Z.ai: GLM 5.2", + "price_per_token_usd": { + "cache_read": "0.00000012064", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000006496", + "output": "0.0000020416" + }, + "price_unit": "USD/token", + "source_hash": "8e1213c44134fa2e1cd56c0bf0641e6ac7835a1e75d71b286948c35aa24b95c4", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.2:free": { + "canonical_slug": "z-ai/glm-5.2-20260616", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 32768, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 32768, + "is_moderated": false, + "max_completion_tokens": 29491 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "id": "z-ai/glm-5.2:free", + "name": "Z.ai: GLM 5.2 (free)", + "price_per_token_usd": { + "cache_read": null, + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0", + "output": "0" + }, + "price_unit": "USD/token", + "source_hash": "c9535c503ff8d0432a8b133f7a066d9251bc84313857d85643431cb9e38e9f3f", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3": { + "canonical_slug": "z-ai/glm-5.3-20260816", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048575, + "is_moderated": false, + "max_completion_tokens": 943717 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.26000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.4000000", + "output": "4.4000000" + }, + "id": "z-ai/glm-5.3", + "name": "Z.ai: GLM 5.3", + "price_per_token_usd": { + "cache_read": "0.00000026", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000014", + "output": "0.0000044" + }, + "price_unit": "USD/token", + "source_hash": "743f6a1e792d5c4a8f946ddd3e425aa51452baf43efa1d9b9ec08e8c92d01b01", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3-flash": { + "canonical_slug": "z-ai/glm-5.3-flash-20260826", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.045000000", + "output": "0.14000000" + }, + "id": "z-ai/glm-5.3-flash", + "name": "Z.ai: GLM 5.3 Flash", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000045", + "output": "0.00000014" + }, + "price_unit": "USD/token", + "source_hash": "3634c338ad21eb7692182092b7b7b0dfa2f53346492f59013efff3165289026d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3-flash:batch": { + "canonical_slug": "z-ai/glm-5.3-flash-20260826", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.012000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.06000000", + "output": "0.2000000" + }, + "id": "z-ai/glm-5.3-flash:batch", + "name": "Z.ai: GLM 5.3 Flash (batch)", + "price_per_token_usd": { + "cache_read": "0.000000012", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000006", + "output": "0.0000002" + }, + "price_unit": "USD/token", + "source_hash": "f81f297fdcaec14cc932eacf861b71373c7111e2a6b370922e269cf6f1370a5c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3-flashx": { + "canonical_slug": "z-ai/glm-5.3-flashx-20260918", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.09000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.37000000", + "output": "1.25000000" + }, + "id": "z-ai/glm-5.3-flashx", + "name": "Z.ai: GLM 5.3 FlashX", + "price_per_token_usd": { + "cache_read": "0.00000009", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000037", + "output": "0.00000125" + }, + "price_unit": "USD/token", + "source_hash": "bb39d2050377cd54391def9d9d7ecc4b7cc744e367c6216e5cd49c7d371bc911", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3-prime": { + "canonical_slug": "z-ai/glm-5.3-prime-20260921", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.56000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.8000000", + "output": "8.8000000" + }, + "id": "z-ai/glm-5.3-prime", + "name": "Z.ai: GLM 5.3 Prime", + "price_per_token_usd": { + "cache_read": "0.00000056", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000028", + "output": "0.0000088" + }, + "price_unit": "USD/token", + "source_hash": "caa3ea09acbdf7e174ed02166bcdcf70df7565b40ea934354bccc8f309834f95", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5.3:batch": { + "canonical_slug": "z-ai/glm-5.3-20260816", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.45000000", + "output": "2.000000" + }, + "id": "z-ai/glm-5.3:batch", + "name": "Z.ai: GLM 5.3 (batch)", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000045", + "output": "0.000002" + }, + "price_unit": "USD/token", + "source_hash": "5ceb9c39f06d2edb73b6b028a2936196d25ed35f945d01348bdc548a4a4cc5ac", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "z-ai/glm-5v-turbo": { + "canonical_slug": "z-ai/glm-5v-turbo-20260401", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 202752, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 202752, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.24000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.2000000", + "output": "4.000000" + }, + "id": "z-ai/glm-5v-turbo", + "name": "Z.ai: GLM 5V Turbo", + "price_per_token_usd": { + "cache_read": "0.00000024", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000012", + "output": "0.000004" + }, + "price_unit": "USD/token", + "source_hash": "9622e02356a0ca236513a3a95bb91efe500f4b73ae3ab1f614393c3cb361f398", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~anthropic/claude-fable-latest": { + "canonical_slug": "~anthropic/claude-fable-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.25000000", + "cache_write": "12.5000000", + "cache_write_1h": "20.00000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "~anthropic/claude-fable-latest", + "name": "Anthropic: Claude Fable Latest", + "price_per_token_usd": { + "cache_read": "0.00000025", + "cache_write": "0.0000125", + "cache_write_1h": "0.00002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "855438ba4713703f574f343406219684ff33094201f699312dee64640ef4cf3b", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~anthropic/claude-haiku-latest": { + "canonical_slug": "~anthropic/claude-haiku-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 200000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 200000, + "is_moderated": false, + "max_completion_tokens": 64000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.1000000", + "cache_write": "1.25000000", + "cache_write_1h": "2.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.000000", + "output": "5.000000" + }, + "id": "~anthropic/claude-haiku-latest", + "name": "Anthropic: Claude Haiku Latest", + "price_per_token_usd": { + "cache_read": "0.0000001", + "cache_write": "0.00000125", + "cache_write_1h": "0.000002", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000001", + "output": "0.000005" + }, + "price_unit": "USD/token", + "source_hash": "a48f822b77c91461baa7049c59f7edc7622b8c66444a2b183a91d95fc147fe34", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~anthropic/claude-opus-latest": { + "canonical_slug": "~anthropic/claude-opus-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "5.000000", + "cache_write_1h": "8.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "4.000000", + "output": "20.00000" + }, + "id": "~anthropic/claude-opus-latest", + "name": "Anthropic: Claude Opus Latest", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000005", + "cache_write_1h": "0.000008", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000004", + "output": "0.00002" + }, + "price_unit": "USD/token", + "source_hash": "7c5ff9235a40641b54c633109204696289fa8174c25c84b1fdc861d7d248bfc7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~anthropic/claude-sonnet-latest": { + "canonical_slug": "~anthropic/claude-sonnet-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1000000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1000000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": "4.000000", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "~anthropic/claude-sonnet-latest", + "name": "Anthropic: Claude Sonnet Latest", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": "0.000004", + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "4c0d3688f81a910d627c8438b255cadddeeb516aaac484e6abd20d12ebb4dff2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~deepseek/deepseek-flash-latest": { + "canonical_slug": "~deepseek/deepseek-flash-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.04000000", + "output": "0.49000000" + }, + "id": "~deepseek/deepseek-flash-latest", + "name": "DeepSeek: DeepSeek Flash Latest", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000004", + "output": "0.00000049" + }, + "price_unit": "USD/token", + "source_hash": "54b65e42f618cff3631b975c54c6fba712277bfbc1ec8d6a82d712110f108a04", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~deepseek/deepseek-pro-latest": { + "canonical_slug": "~deepseek/deepseek-pro-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.08832000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.09984000000", + "output": "2.88000000" + }, + "id": "~deepseek/deepseek-pro-latest", + "name": "DeepSeek: DeepSeek Pro Latest", + "price_per_token_usd": { + "cache_read": "0.00000008832", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000009984", + "output": "0.00000288" + }, + "price_unit": "USD/token", + "source_hash": "7e92dcf3b24893a5724775b2fea14090c0073b9c4536cf1d174f4b2fedceddf2", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~deepseek/deepseek-v4-flash-latest": { + "canonical_slug": "~deepseek/deepseek-v4-flash-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.016000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.03000000", + "output": "0.32000000" + }, + "id": "~deepseek/deepseek-v4-flash-latest", + "name": "DeepSeek: DeepSeek V4 Flash Latest", + "price_per_token_usd": { + "cache_read": "0.000000016", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000003", + "output": "0.00000032" + }, + "price_unit": "USD/token", + "source_hash": "8f5b76f05d2f31308b9edc2fb1911acbca0fb13613be1c145ab93d1f8fa8a646", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~google/gemini-flash-latest": { + "canonical_slug": "~google/gemini-flash-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.00000075", + "image": "0.00000075", + "input_audio_cache": "0.000000075", + "internal_reasoning": "0.00000375", + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": "0.0416666666666667000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "3.75000000" + }, + "id": "~google/gemini-flash-latest", + "name": "Google: Gemini Flash Latest", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": "0.0000000416666666666667", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.00000375" + }, + "price_unit": "USD/token", + "source_hash": "d46ea08ec7a673f1a064759bfdf03558b7dc7ecbb1967df75a7241bd138c6535", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~google/gemini-pro-latest": { + "canonical_slug": "~google/gemini-pro-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": { + "audio": "0.000002", + "image": "0.000002", + "input_audio_cache": "0.0000002", + "internal_reasoning": "0.000012", + "overrides": [ + { + "audio": "0.000004", + "completion": "0.000018", + "input_audio_cache": "0.0000004", + "input_cache_read": "0.0000004", + "min_prompt_tokens": 200000, + "prompt": "0.000004" + } + ], + "web_search": "0.014" + }, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 65536 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "0.375000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "~google/gemini-pro-latest", + "name": "Google: Gemini Pro Latest", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.000000375", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "d553e1a41b4d39d9d208241342e06c8d0274fd7a7dbe9b8faac84e669ff1c1a7", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~moonshotai/kimi-latest": { + "canonical_slug": "~moonshotai/kimi-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1048576, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 943718 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.33000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.8845000000", + "output": "10.5346000000" + }, + "id": "~moonshotai/kimi-latest", + "name": "MoonshotAI: Kimi Latest", + "price_per_token_usd": { + "cache_read": "0.00000033", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000008845", + "output": "0.0000105346" + }, + "price_unit": "USD/token", + "source_hash": "0fe8a700a21cd2abf5c2e3973b7881001c199f2d4ff0d3f68098634b57482039", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~openai/gpt-astra-latest": { + "canonical_slug": "~openai/gpt-astra-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000075", + "input_cache_read": "0.000002", + "input_cache_write": "0.000025", + "min_prompt_tokens": 272000, + "prompt": "0.00002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "1.000000", + "cache_write": "12.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "10.00000", + "output": "50.00000" + }, + "id": "~openai/gpt-astra-latest", + "name": "OpenAI: GPT Astra Latest", + "price_per_token_usd": { + "cache_read": "0.000001", + "cache_write": "0.0000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00001", + "output": "0.00005" + }, + "price_unit": "USD/token", + "source_hash": "4a0f6db663a38087ede02b003996d48e2756ace4a49e4df3990a53121e72bc9c", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~openai/gpt-luna-latest": { + "canonical_slug": "~openai/gpt-luna-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.00000075", + "input_cache_read": "0.00000002", + "input_cache_write": "0.00000025", + "min_prompt_tokens": 272000, + "prompt": "0.0000002" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": "0.125000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.1000000", + "output": "0.5000000" + }, + "id": "~openai/gpt-luna-latest", + "name": "OpenAI: GPT Luna Latest", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": "0.000000125", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000001", + "output": "0.0000005" + }, + "price_unit": "USD/token", + "source_hash": "fec42bf256b241cd8a3d45db9dd0174f05e12ae20c3490580da716025087be87", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~openai/gpt-mini-latest": { + "canonical_slug": "~openai/gpt-mini-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 400000, + "per_request_limits": null, + "pricing_metadata": { + "web_search": "0.01" + }, + "top_provider": { + "context_length": 400000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.075000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.75000000", + "output": "4.5000000" + }, + "id": "~openai/gpt-mini-latest", + "name": "OpenAI: GPT Mini Latest", + "price_per_token_usd": { + "cache_read": "0.000000075", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.00000075", + "output": "0.0000045" + }, + "price_unit": "USD/token", + "source_hash": "9c38867a2104aafe3e9520f0b9c4c7269515ec1e1b95c0cff0db40845e8cbb63", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~openai/gpt-sol-latest": { + "canonical_slug": "~openai/gpt-sol-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000015", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": true, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "10.00000" + }, + "id": "~openai/gpt-sol-latest", + "name": "OpenAI: GPT Sol Latest", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.00001" + }, + "price_unit": "USD/token", + "source_hash": "c3e6ec98afaa633ddb6e5d6960a8532e03ebbcf49ed97bfc0dc5232fcab2fc50", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~openai/gpt-terra-latest": { + "canonical_slug": "~openai/gpt-terra-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1050000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.000018", + "input_cache_read": "0.0000004", + "input_cache_write": "0.000005", + "min_prompt_tokens": 272000, + "prompt": "0.000004" + } + ], + "web_search": "0.01" + }, + "top_provider": { + "context_length": 1050000, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.2000000", + "cache_write": "2.5000000", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "2.000000", + "output": "12.000000" + }, + "id": "~openai/gpt-terra-latest", + "name": "OpenAI: GPT Terra Latest", + "price_per_token_usd": { + "cache_read": "0.0000002", + "cache_write": "0.0000025", + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000002", + "output": "0.000012" + }, + "price_unit": "USD/token", + "source_hash": "b7f81055149748902211b84ae61bec97a13f60b12bc82fcb3b38a51e1d72f128", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~x-ai/grok-latest": { + "canonical_slug": "~x-ai/grok-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 500000, + "per_request_limits": null, + "pricing_metadata": { + "overrides": [ + { + "completion": "0.0000096", + "input_cache_read": "0.0000008", + "min_prompt_tokens": 200000, + "prompt": "0.0000032" + } + ], + "web_search": "0.005" + }, + "top_provider": { + "context_length": 500000, + "is_moderated": false, + "max_completion_tokens": 450000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.4000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "1.6000000", + "output": "4.8000000" + }, + "id": "~x-ai/grok-latest", + "name": "xAI: Grok Latest", + "price_per_token_usd": { + "cache_read": "0.0000004", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000016", + "output": "0.0000048" + }, + "price_unit": "USD/token", + "source_hash": "57940ec1cd513f75357945a8fbcda785d9b34423aa8143b3a56888a4a5902d3d", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~z-ai/glm-flash-latest": { + "canonical_slug": "~z-ai/glm-flash-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 128000 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.01000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.045000000", + "output": "0.14000000" + }, + "id": "~z-ai/glm-flash-latest", + "name": "Z.ai: GLM Flash Latest", + "price_per_token_usd": { + "cache_read": "0.00000001", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.000000045", + "output": "0.00000014" + }, + "price_unit": "USD/token", + "source_hash": "e040430b42b3eff1cfc5ffb0b3cba4261e83a80be60f992fccbb3a6650ce5404", + "source_url": "https://openrouter.ai/api/v1/models" + }, + "~z-ai/glm-latest": { + "canonical_slug": "~z-ai/glm-latest", + "captured_at": "2026-09-25T07:18:38Z", + "conditions": { + "context_length": 1310720, + "per_request_limits": null, + "pricing_metadata": {}, + "top_provider": { + "context_length": 1048576, + "is_moderated": false, + "max_completion_tokens": 131072 + }, + "unsupported_negative_prices": {} + }, + "display_usd_per_1m": { + "cache_read": "0.10426000000", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.5614000000", + "output": "1.7644000000" + }, + "id": "~z-ai/glm-latest", + "name": "Z.ai: GLM Latest", + "price_per_token_usd": { + "cache_read": "0.00000010426", + "cache_write": null, + "cache_write_1h": null, + "cache_write_24h": null, + "cache_write_5m": null, + "input": "0.0000005614", + "output": "0.0000017644" + }, + "price_unit": "USD/token", + "source_hash": "d09ecaeceea4eee7c596aedde15eec1a65af97b9a152bf38f3d3668b2ecd871a", + "source_url": "https://openrouter.ai/api/v1/models" + } + }, + "providers": [ + "opencode", + "opencode-go" + ], + "schema_version": 1, + "snapshot_hash": "1930d91de7992963aec39d4188f36d97a849ead60f4dc91ae66dc4b38c708cd7", + "source_hashes": { + "opencode": "1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4", + "opencode-go": "4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4", + "openrouter": "0d552d4f08b7c600c0aa2d8f8b926e1356856fd81a6c9ad0c02c5a3f3a7eab3c" + }, + "tool": "opencode" +} diff --git a/docs/model-catalog-zen-go-2026-09-25.csv b/docs/model-catalog-zen-go-2026-09-25.csv new file mode 100644 index 0000000..24a756b --- /dev/null +++ b/docs/model-catalog-zen-go-2026-09-25.csv @@ -0,0 +1,123 @@ +nome,tool,model_key,openrouter_id,preco_or_entrada_usd_1m,preco_or_saida_usd_1m,preco_or_cache_leitura_usd_1m,preco_or_cache_escrita_usd_1m,preco_or_cache_escrita_1h_usd_1m,condicao_de_preco,coding_index_versao,coding_index_nota,benchmark_por_componente_se_publicado,harness_aa,reasoning_aa,grau_do_match,faixa,preco_native_ou_cota,disponivel_na_conta,motivo_da_exclusao,fonte,capturado_em,stale,stale_reasons,availability,billing_mode,source_hash,or_price_per_token,score +deepseek-flash,opencode,opencode-go/deepseek-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-flash,opencode,opencode-go/deepseek-v4-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-flash-vision-exp,opencode,opencode-go/deepseek-v4-flash-vision-exp,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-pro,opencode,opencode-go/deepseek-v4-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4.1-flash,opencode,opencode-go/deepseek-v4.1-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5,opencode,opencode-go/glm-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.1,opencode,opencode-go/glm-5.1,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.2,opencode,opencode-go/glm-5.2,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.3,opencode,opencode-go/glm-5.3,z-ai/glm-5.3,1.4000000,4.4000000,0.26000000,n/d,n/d,"{""context_length"": 1310720, ""per_request_limits"": null, ""pricing_metadata"": {}, ""top_provider"": {""context_length"": 1048575, ""is_moderated"": false, ""max_completion_tokens"": 943717}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": ""0.00000026"", ""cache_write"": null, ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.0000014"", ""output"": ""0.0000044""}",n/d +glm-5.3-flash,opencode,opencode-go/glm-5.3-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.6-luna,opencode,opencode-go/gpt-5.6-luna,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-6-luna,opencode,opencode-go/gpt-6-luna,openai/gpt-6-luna,0.1000000,0.5000000,0.01000000,0.125000000,n/d,"{""context_length"": 1050000, ""per_request_limits"": null, ""pricing_metadata"": {""overrides"": [{""completion"": ""0.00000075"", ""input_cache_read"": ""0.00000002"", ""input_cache_write"": ""0.00000025"", ""min_prompt_tokens"": 272000, ""prompt"": ""0.0000002""}], ""web_search"": ""0.01""}, ""top_provider"": {""context_length"": 1050000, ""is_moderated"": true, ""max_completion_tokens"": 128000}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": ""0.00000001"", ""cache_write"": ""0.000000125"", ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.0000001"", ""output"": ""0.0000005""}",n/d +grok-4.5,opencode,opencode-go/grok-4.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +grok-4.6,opencode,opencode-go/grok-4.6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +grok-4.7,opencode,opencode-go/grok-4.7,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +hy3,opencode,opencode-go/hy3,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +hy3-preview,opencode,opencode-go/hy3-preview,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +hy4-preview,opencode,opencode-go/hy4-preview,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.5,opencode,opencode-go/kimi-k2.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.6,opencode,opencode-go/kimi-k2.6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.7-code,opencode,opencode-go/kimi-k2.7-code,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k3,opencode,opencode-go/kimi-k3,moonshotai/kimi-k3,3.000000,15.000000,0.3000000,n/d,n/d,"{""context_length"": 1048576, ""per_request_limits"": null, ""pricing_metadata"": {}, ""top_provider"": {""context_length"": 1048576, ""is_moderated"": false, ""max_completion_tokens"": 943718}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": ""0.0000003"", ""cache_write"": null, ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.000003"", ""output"": ""0.000015""}",n/d +longcat-2.0,opencode,opencode-go/longcat-2.0,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2-omni,opencode,opencode-go/mimo-v2-omni,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2-pro,opencode,opencode-go/mimo-v2-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.5,opencode,opencode-go/mimo-v2.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.5-pro,opencode,opencode-go/mimo-v2.5-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.6-flash,opencode,opencode-go/mimo-v2.6-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.6-pro,opencode,opencode-go/mimo-v2.6-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m2.5,opencode,opencode-go/minimax-m2.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m2.7,opencode,opencode-go/minimax-m2.7,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m3,opencode,opencode-go/minimax-m3,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.2-contributor,opencode,opencode-go/muse-spark-1.2-contributor,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.3-contributor,opencode,opencode-go/muse-spark-1.3-contributor,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +omen-alpha,opencode,opencode-go/omen-alpha,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.5-plus,opencode,opencode-go/qwen3.5-plus,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.6-plus,opencode,opencode-go/qwen3.6-plus,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.7-max,opencode,opencode-go/qwen3.7-max,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.7-plus,opencode,opencode-go/qwen3.7-plus,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.8-flash,opencode,opencode-go/qwen3.8-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.8-max,opencode,opencode-go/qwen3.8-max,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +space-bunny-free,opencode,opencode-go/space-bunny-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/go/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",go_quota,4f3c2a14e77fa546f5ba833d85cca088918ab2ade7e4a0eaf8c5d9a478b48ae4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +big-pickle,opencode,opencode/big-pickle,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-fable-5,opencode,opencode/claude-fable-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-fable-5-1,opencode,opencode/claude-fable-5-1,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-haiku-4-5,opencode,opencode/claude-haiku-4-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-4-5,opencode,opencode/claude-opus-4-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-4-6,opencode,opencode/claude-opus-4-6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-4-7,opencode,opencode/claude-opus-4-7,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-4-8,opencode,opencode/claude-opus-4-8,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-5,opencode,opencode/claude-opus-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-opus-5-5,opencode,opencode/claude-opus-5-5,anthropic/claude-opus-5.5,4.000000,20.00000,0.2000000,5.000000,8.000000,"{""context_length"": 1000000, ""per_request_limits"": null, ""pricing_metadata"": {""web_search"": ""0.01""}, ""top_provider"": {""context_length"": 1000000, ""is_moderated"": true, ""max_completion_tokens"": 128000}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": ""0.0000002"", ""cache_write"": ""0.000005"", ""cache_write_1h"": ""0.000008"", ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.000004"", ""output"": ""0.00002""}",n/d +claude-sonnet-4,opencode,opencode/claude-sonnet-4,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-sonnet-4-5,opencode,opencode/claude-sonnet-4-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-sonnet-4-6,opencode,opencode/claude-sonnet-4-6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +claude-sonnet-5,opencode,opencode/claude-sonnet-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-flash,opencode,opencode/deepseek-v4-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-flash-free,opencode,opencode/deepseek-v4-flash-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-flash-vision-exp,opencode,opencode/deepseek-v4-flash-vision-exp,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4-pro,opencode,opencode/deepseek-v4-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +deepseek-v4.1-flash,opencode,opencode/deepseek-v4.1-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3-flash,opencode,opencode/gemini-3-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.1-pro,opencode,opencode/gemini-3.1-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.5-flash,opencode,opencode/gemini-3.5-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.5-flash-lite,opencode,opencode/gemini-3.5-flash-lite,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.6-flash,opencode,opencode/gemini-3.6-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.7-flash,opencode,opencode/gemini-3.7-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gemini-3.8-flash,opencode,opencode/gemini-3.8-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5,opencode,opencode/glm-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.1,opencode,opencode/glm-5.1,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.2,opencode,opencode/glm-5.2,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +glm-5.3,opencode,opencode/glm-5.3,z-ai/glm-5.3,1.4000000,4.4000000,0.26000000,n/d,n/d,"{""context_length"": 1310720, ""per_request_limits"": null, ""pricing_metadata"": {}, ""top_provider"": {""context_length"": 1048575, ""is_moderated"": false, ""max_completion_tokens"": 943717}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": ""0.00000026"", ""cache_write"": null, ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.0000014"", ""output"": ""0.0000044""}",n/d +glm-5.3-flash,opencode,opencode/glm-5.3-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5,opencode,opencode/gpt-5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5-codex,opencode,opencode/gpt-5-codex,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5-nano,opencode,opencode/gpt-5-nano,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.1,opencode,opencode/gpt-5.1,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.1-codex,opencode,opencode/gpt-5.1-codex,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.1-codex-max,opencode,opencode/gpt-5.1-codex-max,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.1-codex-mini,opencode,opencode/gpt-5.1-codex-mini,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.2,opencode,opencode/gpt-5.2,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.2-codex,opencode,opencode/gpt-5.2-codex,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.3-codex,opencode,opencode/gpt-5.3-codex,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.3-codex-spark,opencode,opencode/gpt-5.3-codex-spark,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.4,opencode,opencode/gpt-5.4,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.4-mini,opencode,opencode/gpt-5.4-mini,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.4-nano,opencode,opencode/gpt-5.4-nano,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.4-pro,opencode,opencode/gpt-5.4-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.5,opencode,opencode/gpt-5.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.5-pro,opencode,opencode/gpt-5.5-pro,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.6-luna,opencode,opencode/gpt-5.6-luna,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.6-sol,opencode,opencode/gpt-5.6-sol,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-5.6-terra,opencode,opencode/gpt-5.6-terra,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-6-astra,opencode,opencode/gpt-6-astra,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +gpt-6-luna,opencode,opencode/gpt-6-luna,openai/gpt-6-luna,0.1000000,0.5000000,0.01000000,0.125000000,n/d,"{""context_length"": 1050000, ""per_request_limits"": null, ""pricing_metadata"": {""overrides"": [{""completion"": ""0.00000075"", ""input_cache_read"": ""0.00000002"", ""input_cache_write"": ""0.00000025"", ""min_prompt_tokens"": 272000, ""prompt"": ""0.0000002""}], ""web_search"": ""0.01""}, ""top_provider"": {""context_length"": 1050000, ""is_moderated"": true, ""max_completion_tokens"": 128000}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": ""0.00000001"", ""cache_write"": ""0.000000125"", ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.0000001"", ""output"": ""0.0000005""}",n/d +gpt-6-sol,opencode,opencode/gpt-6-sol,openai/gpt-6-sol,2.000000,10.00000,0.2000000,2.5000000,n/d,"{""context_length"": 1050000, ""per_request_limits"": null, ""pricing_metadata"": {""overrides"": [{""completion"": ""0.000015"", ""input_cache_read"": ""0.0000004"", ""input_cache_write"": ""0.000005"", ""min_prompt_tokens"": 272000, ""prompt"": ""0.000004""}], ""web_search"": ""0.01""}, ""top_provider"": {""context_length"": 1050000, ""is_moderated"": true, ""max_completion_tokens"": 128000}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": ""0.0000002"", ""cache_write"": ""0.0000025"", ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.000002"", ""output"": ""0.00001""}",n/d +grok-4.5,opencode,opencode/grok-4.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +grok-4.6,opencode,opencode/grok-4.6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +grok-4.7,opencode,opencode/grok-4.7,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +grok-build-0.1,opencode,opencode/grok-build-0.1,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +jev-1.13,opencode,opencode/jev-1.13,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +jev-1.13-free,opencode,opencode/jev-1.13-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.5,opencode,opencode/kimi-k2.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.6,opencode,opencode/kimi-k2.6,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k2.7-code,opencode,opencode/kimi-k2.7-code,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +kimi-k3,opencode,opencode/kimi-k3,moonshotai/kimi-k3,3.000000,15.000000,0.3000000,n/d,n/d,"{""context_length"": 1048576, ""per_request_limits"": null, ""pricing_metadata"": {}, ""top_provider"": {""context_length"": 1048576, ""is_moderated"": false, ""max_completion_tokens"": 943718}, ""unsupported_negative_prices"": {}}",n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": ""https://openrouter.ai/api/v1/models""}",2026-09-25T07:18:38Z,False,[],"{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": ""0.0000003"", ""cache_write"": null, ""cache_write_1h"": null, ""cache_write_24h"": null, ""cache_write_5m"": null, ""input"": ""0.000003"", ""output"": ""0.000015""}",n/d +ling-3.0-flash-fin-free,opencode,opencode/ling-3.0-flash-fin-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.5-free,opencode,opencode/mimo-v2.5-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +mimo-v2.6-flash-free,opencode,opencode/mimo-v2.6-flash-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m2.5,opencode,opencode/minimax-m2.5,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m2.7,opencode,opencode/minimax-m2.7,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +minimax-m3,opencode,opencode/minimax-m3,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.2,opencode,opencode/muse-spark-1.2,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.2-contributor-free,opencode,opencode/muse-spark-1.2-contributor-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.3,opencode,opencode/muse-spark-1.3,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +muse-spark-1.3-contributor-free,opencode,opencode/muse-spark-1.3-contributor-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +nemotron-3-ultra-free,opencode,opencode/nemotron-3-ultra-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +nemotron-3.5-lightning-free,opencode,opencode/nemotron-3.5-lightning-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.5-plus,opencode,opencode/qwen3.5-plus,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.6-plus,opencode,opencode/qwen3.6-plus,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +qwen3.8-flash,opencode,opencode/qwen3.8-flash,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d +space-bunny-free,opencode,opencode/space-bunny-free,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,n/d,descoberta_local_falhou,"{""benchmark"": null, ""catalog"": ""https://opencode.ai/zen/v1/models"", ""openrouter"": null}",2026-09-25T07:18:38Z,True,"[""preco_referencial_ausente""]","{""account_verified_at"": null, ""authenticated"": null, ""balance_confirmed"": null, ""balance_verified_at"": null, ""entitled"": null, ""evidence_hash"": null, ""listed"": true, ""local_listed"": null, ""local_verified_at"": null, ""source"": null, ""verified_at"": null}",zen_balance,1b8d7a3dd18412473419eed98e32be003db5307754a1c5ab0f491ff33b4806a4,"{""cache_read"": null, ""cache_write"": null, ""input"": null, ""output"": null}",n/d diff --git a/qa/test_adapters.py b/qa/test_adapters.py new file mode 100755 index 0000000..37f700a --- /dev/null +++ b/qa/test_adapters.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python3 +"""Adapter and headless-runner behavior tests; fake CLIs never contact providers.""" +import importlib.util +import json +import os +import pathlib +import sys +import shutil +import unittest +import tempfile +from unittest import mock + +ROOT = pathlib.Path(__file__).resolve().parents[1] +REAL_WHICH = shutil.which + + +def load_module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +installer = load_module("dev_workflows_install", ROOT / "scripts" / "install.py") +harness = load_module("dev_workflows_harness", ROOT / "scripts" / "harness_runner.py") + + +class AdapterTest(unittest.TestCase): + def test_omp_install_preserves_unowned_destination_and_skips_link(self): + with tempfile.TemporaryDirectory() as temp: + base = pathlib.Path(temp) / ".omp" + dest = base / "plugins" / "dev-workflows" + dest.mkdir(parents=True) + (dest / "user-data").write_text("preserve", encoding="utf-8") + runner = mock.Mock() + with self.assertRaises(SystemExit): + installer.install_omp(base=str(base), runner=runner) + runner.assert_not_called() + self.assertEqual((dest / "user-data").read_text(encoding="utf-8"), "preserve") + + def test_omp_install_keeps_package_for_recovery_if_link_fails(self): + with tempfile.TemporaryDirectory() as temp: + base = pathlib.Path(temp) / ".omp" + runner = mock.Mock(return_value=mock.Mock(returncode=7)) + with self.assertRaisesRegex(SystemExit, "falhou com código 7"): + installer.install_omp(base=str(base), runner=runner) + self.assertTrue((base / "plugins" / "dev-workflows" / ".dev-workflows-omp-package").is_file()) + + + +class HarnessRunnerTest(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.root = pathlib.Path(self.temp.name) + self.cwd = self.root / "state" / "project" / "run" / "worktrees" / "iteration-001" + self.cwd.mkdir(parents=True) + gitdir = self.root / "project" / ".git" / "worktrees" / "iteration-001" + gitdir.mkdir(parents=True) + (self.cwd / ".git").write_text(f"gitdir: {gitdir}\n", encoding="utf-8") + self.bin = self.root / "bin" + self.bin.mkdir() + self.trace = self.root / "calls.jsonl" + self.cache = self.root / "catalog" + self.cache.mkdir() + self._fake_cli() + + def tearDown(self): + self.temp.cleanup() + + def _fake_cli(self): + executable = self.bin / "fake-cli" + executable.write_text( + "#!" + sys.executable + "\n" + "import json, os, pathlib, sys\n" + "name = pathlib.Path(sys.argv[0]).name\n" + "args = sys.argv[1:]\n" + "with open(os.environ['DW_TRACE'], 'a', encoding='utf-8') as out:\n" + " out.write(json.dumps({'name': name, 'args': args, 'cwd': os.getcwd(), 'marker': os.getenv('DW_MARKER')}) + '\\n')\n" + "if name == 'claude' and args[:3] == ['auth', 'status', '--json']:\n" + " print(os.environ.get('DW_CLAUDE_AUTH', '{\\\"loggedIn\\\": true}'))\n" + "elif name == 'opencode' and args[:1] == ['models']:\n" + " print(os.environ.get('DW_MODELS', ''))\n" + "elif name == 'omp' and args[:2] == ['models', args[1] if len(args) > 1 else '']:\n" + " print(os.environ.get('DW_MODELS_JSON', '[]'))\n" + "else:\n" + " print('fake response')\n" + " print('sk-secret-must-not-escape', file=sys.stderr)\n", + encoding="utf-8", + ) + executable.chmod(0o755) + for name in ("claude", "opencode", "omp"): + (self.bin / name).symlink_to(executable) + + def _env(self, **extra): + value = os.environ.copy() + value.update({ + "PATH": str(self.bin) + os.pathsep + value.get("PATH", ""), + "DEV_WORKFLOWS_MODEL_CACHE": str(self.cache), + "DW_TRACE": str(self.trace), + "DW_MARKER": "test-env", + }) + value.update(extra) + return value + + def _snapshot(self, tool, model_key, *, entitled=True, variant=None, provider=None, model_id=None): + row = { + "tool": tool, + "model_key": model_key, + "availability": { + "local_listed": True, + "authenticated": True, + "entitled": entitled, + "source": "manual_audited", + "verified_at": "2026-09-25T12:00:00Z", + }, + } + if variant is not None: + row.update({"variant": variant, "provider": provider, "model_id": model_id}) + (self.cache / f"catalog-{tool}.json").write_text( + json.dumps({"schema_version": 1, "tool": tool, "models": [row]}), encoding="utf-8" + ) + + def _calls(self): + if not self.trace.exists(): + return [] + return [json.loads(line) for line in self.trace.read_text(encoding="utf-8").splitlines()] + + def _fake_bwrap(self): + trace = self.root / "bwrap.jsonl" + executable = self.bin / "bwrap" + executable.write_text( + "#!" + sys.executable + "\n" + "import json, os, pathlib, sys\n" + "args = sys.argv[1:]\n" + "with open(os.environ['DW_BWRAP_TRACE'], 'a', encoding='utf-8') as out:\n" + " out.write(json.dumps(args) + '\\n')\n" + "command = args[args.index('--') + 1:]\n" + "tool = pathlib.Path(command[0]).name\n" + "if tool == 'omp' and 'models' in command:\n" + " print(os.environ.get('DW_MODELS_JSON', '[]'))\n" + "elif tool == 'opencode' and 'models' in command:\n" + " print(os.environ.get('DW_MODELS', ''))\n" + "elif tool == 'claude' and command[1:3] == ['auth', 'status']:\n" + " print(os.environ.get('DW_CLAUDE_AUTH', '{\\\"loggedIn\\\": true}'))\n" + "else:\n" + " print('fake wrapped response')\n", + encoding="utf-8", + ) + executable.chmod(0o755) + return trace + + def _invoke_with_fake_bwrap(self, *args, **kwargs): + def find_executable(name, path=None): + if name == "bwrap": + return str(self.bin / "bwrap") + return REAL_WHICH(name, path=path) + + with mock.patch.object(harness.shutil, "which", side_effect=find_executable): + return harness.invoke(*args, **kwargs) + + def test_claude_alias_and_dontask_preserve_default_permission_gate(self): + result = harness.invoke("claude", "reviewer", "Review safely", str(self.cwd), "opus", env=self._env()) + self.assertEqual(result["returncode"], 0) + calls = self._calls() + self.assertEqual(calls[0]["args"], ["auth", "status", "--json"]) + call = calls[1] + args = call["args"] + self.assertIn("--permission-mode", args) + self.assertEqual(args[args.index("--permission-mode") + 1], "dontAsk") + self.assertIn("--agent", args) + self.assertIn("reviewer", args) + self.assertEqual(args[args.index("--model") + 1], "opus") + self.assertNotIn("--dangerously-skip-permissions", args) + self.assertEqual(call["cwd"], str(self.cwd)) + self.assertEqual(call["marker"], "test-env") + self.assertIsNone(result["usage"]) + self.assertNotIn("sk-secret", result["output"]) + + def test_claude_inherit_keeps_role_alias_without_model_override(self): + result = harness.invoke("claude", "explorer", "Map the project", str(self.cwd), "inherit", env=self._env()) + self.assertEqual(result["returncode"], 0) + calls = self._calls() + self.assertEqual(calls[0]["args"], ["auth", "status", "--json"]) + args = calls[1]["args"] + self.assertIn("--agent", args) + self.assertNotIn("--model", args) + self.assertNotIn("--dangerously-skip-permissions", args) + + def test_sonnet_alias_is_passed_without_rewriting_the_plugin(self): + harness.invoke("claude", "ui-critic", "Critique only", str(self.cwd), "sonnet", env=self._env()) + calls = self._calls() + args = calls[1]["args"] + self.assertEqual(args[args.index("--model") + 1], "sonnet") + self.assertEqual(args[args.index("--agent") + 1], "ui-critic") + + def test_claude_alias_is_blocked_when_local_auth_status_is_negative(self): + with self.assertRaisesRegex(harness.HarnessError, "auth status"): + harness.invoke( + "claude", "reviewer", "Review", str(self.cwd), "opus", + env=self._env(DW_CLAUDE_AUTH='{"loggedIn": false}'), + ) + calls = self._calls() + self.assertEqual(len(calls), 1) + self.assertEqual(calls[0]["args"], ["auth", "status", "--json"]) + + def test_opencode_uses_exact_variant_and_role_agent_without_auto_approval(self): + model_key = "openai/gpt-6-luna#high" + self._snapshot("opencode", model_key) + result = harness.invoke( + "opencode", "planner", "Plan only", str(self.cwd), model_key, + env=self._env(DW_MODELS="gpt-6-luna"), + ) + self.assertEqual(result["returncode"], 0) + calls = self._calls() + self.assertEqual(calls[0]["args"], ["models", "openai"]) + args = calls[1]["args"] + self.assertEqual(args[:3], ["run", "--agent", "planner"]) + self.assertEqual(args[args.index("--model") + 1], model_key) + self.assertNotIn("--auto", args) + self.assertEqual(calls[1]["cwd"], str(self.cwd)) + self.assertIn("stderr omitido por segurança", result["output"]) + self.assertNotIn("sk-secret", result["output"]) + + def test_omp_runs_with_exact_tools_and_always_ask(self): + model_key = "openai/gpt-6-luna#high" + self._snapshot("omp", model_key, variant="high", provider="openai", model_id="gpt-6-luna") + result = harness.invoke( + "omp", "explorer", "Inspect only", str(self.cwd), model_key, + env=self._env(DW_MODELS_JSON=json.dumps([{"provider": "openai", "id": "gpt-6-luna", + "thinking": ["low", "high"]}])), + ) + self.assertEqual(result["returncode"], 0) + calls = self._calls() + self.assertEqual(calls[0]["args"], ["models", "openai", "--json"]) + args = calls[1]["args"] + self.assertEqual(args[0], "-p") + self.assertEqual(args[args.index("--model") + 1], "openai/gpt-6-luna") + self.assertEqual(args[args.index("--thinking") + 1], "high") + self.assertEqual(args[args.index("--approval-mode") + 1], "always-ask") + self.assertNotIn("--auto-approve", args) + self.assertEqual(args[args.index("--tools") + 1], "read,grep,glob") + self.assertEqual(args[args.index("--cwd") + 1], str(self.cwd)) + + def test_omp_unknown_thinking_variant_is_rejected_before_listing_or_dispatch(self): + model_key = "openai/model#unsupported" + self._snapshot("omp", model_key, variant="unsupported", provider="openai", model_id="model") + with self.assertRaisesRegex(harness.HarnessError, "variante"): + harness.invoke("omp", "explorer", "Inspect", str(self.cwd), model_key, env=self._env()) + self.assertEqual(self._calls(), []) + + def test_omp_rejects_thinking_not_supported_by_current_model_listing(self): + model_key = "openai/gpt-6-luna#high" + self._snapshot("omp", model_key, variant="high", provider="openai", model_id="gpt-6-luna") + listed = {"models": [{"provider": "openai", "id": "gpt-6-luna", "thinking": ["low"]}]} + with self.assertRaisesRegex(harness.HarnessError, "indisponível"): + harness.invoke("omp", "explorer", "Inspect", str(self.cwd), model_key, + env=self._env(DW_MODELS_JSON=json.dumps(listed))) + self.assertEqual([call["args"] for call in self._calls()], [["models", "openai", "--json"]]) + + def test_omp_slash_model_id_keeps_provider_and_qualified_selector(self): + model_key = "openrouter/anthropic/claude-sonnet-4.6" + self._snapshot("omp", model_key) + listed = {"models": [{"provider": "openrouter", "id": "anthropic/claude-sonnet-4.6", + "selector": model_key, "thinking": None}]} + result = harness.invoke("omp", "explorer", "Inspect", str(self.cwd), model_key, + env=self._env(DW_MODELS_JSON=json.dumps(listed))) + self.assertEqual(result["returncode"], 0) + calls = self._calls() + self.assertEqual(calls[0]["args"], ["models", "openrouter", "--json"]) + self.assertEqual(calls[1]["args"][calls[1]["args"].index("--model") + 1], model_key) + + + def test_autonomous_omp_uses_bwrap_and_bounded_tools_with_auto_approval(self): + model_key = "openai/gpt-6-luna#high" + self._snapshot("omp", model_key, variant="high", provider="openai", model_id="gpt-6-luna") + trace = self._fake_bwrap() + result = self._invoke_with_fake_bwrap( + "omp", "implementer", "Inspect only", str(self.cwd), model_key, + env=self._env( + DEV_WORKFLOWS_AUTONOMOUS="1", + DW_BWRAP_TRACE=str(trace), + DW_MODELS_JSON=json.dumps([{"provider": "openai", "id": "gpt-6-luna", + "thinking": ["low", "high"]}]), + ), + ) + self.assertEqual(result["returncode"], 0) + self.assertEqual(self._calls(), []) + calls = [json.loads(line) for line in trace.read_text(encoding="utf-8").splitlines()] + self.assertEqual(len(calls), 2) + for args in calls: + self.assertEqual(args[:6], ["--unshare-all", "--share-net", "--die-with-parent", "--ro-bind", "/", "/"]) + binds = [args[index + 1:index + 3] for index, value in enumerate(args) if value == "--bind"] + self.assertIn([str(self.cwd), str(self.cwd)], binds) + readonly = [args[index + 1:index + 3] for index, value in enumerate(args) if value == "--ro-bind"] + self.assertIn([str(self.cwd / ".git"), str(self.cwd / ".git")], readonly) + preflight = calls[0][calls[0].index("--") + 1:] + self.assertEqual(pathlib.Path(preflight[0]).name, "omp") + self.assertEqual(preflight[1:4], ["--no-extensions", "models", "openai"]) + command = calls[1][calls[1].index("--") + 1:] + self.assertEqual(pathlib.Path(command[0]).name, "omp") + self.assertEqual(command[1], "-p") + for flag in ("--no-extensions", "--no-lsp", "--no-session", "--auto-approve"): + self.assertIn(flag, command) + self.assertEqual(command[command.index("--model") + 1], "openai/gpt-6-luna") + self.assertEqual(command[command.index("--thinking") + 1], "high") + self.assertEqual(command[command.index("--tools") + 1], "read,grep,glob,edit,write") + self.assertNotIn("bash", command) + self.assertNotIn("web_search", command) + + def test_autonomous_opencode_uses_pure_mode_and_synthetic_deny_agent(self): + model_key = "openai/gpt-6-luna#high" + self._snapshot("opencode", model_key) + trace = self._fake_bwrap() + meta, prompt = harness._agent("implementer") + generated = harness._opencode_loop_agent(meta, prompt) + self.assertIn(' "*": deny', generated) + self.assertIn(" bash: deny", generated) + self.assertIn(" edit: allow", generated) + self.assertIn(" task: deny", generated) + result = self._invoke_with_fake_bwrap( + "opencode", "implementer", "Implement safely", str(self.cwd), model_key, + env=self._env(DEV_WORKFLOWS_AUTONOMOUS="1", DW_BWRAP_TRACE=str(trace), DW_MODELS="gpt-6-luna"), + ) + self.assertEqual(result["returncode"], 0) + self.assertEqual(self._calls(), []) + calls = [json.loads(line) for line in trace.read_text(encoding="utf-8").splitlines()] + self.assertEqual(len(calls), 2) + preflight = calls[0][calls[0].index("--") + 1:] + self.assertEqual(pathlib.Path(preflight[0]).name, "opencode") + self.assertEqual(preflight[1:3], ["--pure", "models"]) + command = calls[1][calls[1].index("--") + 1:] + self.assertEqual(pathlib.Path(command[0]).name, "opencode") + self.assertEqual(command[1:4], ["--pure", "run", "--agent"]) + agent_name = command[4] + self.assertRegex(agent_name, r"\Adev-workflows-loop-implementer-[0-9a-f]{16}\Z") + self.assertIn("--file", calls[1]) + + def test_autonomous_claude_uses_bare_mode_and_declared_safe_tools(self): + trace = self._fake_bwrap() + result = self._invoke_with_fake_bwrap( + "claude", "reviewer", "Review only", str(self.cwd), "opus", + env=self._env(DEV_WORKFLOWS_AUTONOMOUS="1", DW_BWRAP_TRACE=str(trace)), + ) + self.assertEqual(result["returncode"], 0) + self.assertEqual(self._calls(), []) + calls = [json.loads(line) for line in trace.read_text(encoding="utf-8").splitlines()] + self.assertEqual(len(calls), 2) + auth = calls[0][calls[0].index("--") + 1:] + self.assertEqual(pathlib.Path(auth[0]).name, "claude") + self.assertEqual(auth[1:], ["auth", "status", "--json"]) + command = calls[1][calls[1].index("--") + 1:] + self.assertIn("--bare", command) + self.assertIn("--no-session-persistence", command) + self.assertEqual(command[command.index("--permission-mode") + 1], "dontAsk") + agent_config = json.loads(command[command.index("--agents") + 1]) + self.assertEqual(agent_config["reviewer"]["tools"], ["Read", "Grep", "Glob"]) + self.assertEqual(command[command.index("--tools") + 1], "Read,Grep,Glob") + self.assertNotIn("Bash", command) + + def test_autonomous_mode_fails_closed_without_bwrap(self): + self._snapshot("omp", "openai/gpt-6-luna") + def find_without_bwrap(name, path=None): + return None if name == "bwrap" else REAL_WHICH(name, path=path) + with mock.patch.object(harness.shutil, "which", side_effect=find_without_bwrap): + with self.assertRaisesRegex(harness.HarnessError, "bwrap"): + harness.invoke( + "omp", "explorer", "Inspect", str(self.cwd), "openai/gpt-6-luna", + env=self._env(PATH=str(self.bin), DEV_WORKFLOWS_AUTONOMOUS="1"), + ) + self.assertEqual(self._calls(), []) + + def test_autonomous_rejects_non_worktree_cwd_before_dispatch(self): + other = self.root / "ordinary-directory" + other.mkdir() + with self.assertRaisesRegex(harness.HarnessError, "worktree"): + harness.invoke( + "omp", "explorer", "Inspect", str(other), "openai/gpt-6-luna", + env=self._env(DEV_WORKFLOWS_AUTONOMOUS="1"), + ) + self.assertEqual(self._calls(), []) + + def test_autonomous_does_not_resolve_cli_from_writable_worktree(self): + self._snapshot("opencode", "openai/gpt-6-luna") + shadow = self.cwd / "opencode" + shadow.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8") + shadow.chmod(0o755) + with self.assertRaisesRegex(harness.HarnessError, "PATH seguro"): + harness.invoke( + "opencode", "planner", "Plan", str(self.cwd), "openai/gpt-6-luna", + env=self._env(PATH=str(self.cwd), DEV_WORKFLOWS_AUTONOMOUS="1"), + ) + self.assertEqual(self._calls(), []) + + def test_unentitled_model_is_blocked_before_cli_is_started(self): + self._snapshot("opencode", "openai/gpt-6-luna", entitled=False) + with self.assertRaisesRegex(harness.HarnessError, "autorização local"): + harness.invoke( + "opencode", "planner", "Plan", str(self.cwd), "openai/gpt-6-luna", + env=self._env(DW_MODELS="gpt-6-luna"), + ) + self.assertEqual(self._calls(), []) + + def test_model_absent_from_local_cli_is_blocked_before_agent_dispatch(self): + self._snapshot("opencode", "openai/gpt-6-luna") + with self.assertRaisesRegex(harness.HarnessError, "indisponível na CLI local"): + harness.invoke( + "opencode", "planner", "Plan", str(self.cwd), "openai/gpt-6-luna", + env=self._env(DW_MODELS="openai/different-model"), + ) + calls = self._calls() + self.assertEqual(len(calls), 1) + self.assertEqual(calls[0]["args"], ["models", "openai"]) + + +if __name__ == "__main__": + unittest.main(verbosity=1) diff --git a/qa/test_goal_loop.py b/qa/test_goal_loop.py new file mode 100755 index 0000000..8b6681f --- /dev/null +++ b/qa/test_goal_loop.py @@ -0,0 +1,388 @@ +#!/usr/bin/env python3 +"""End-to-end controller tests on disposable repositories, using the real gate/evaluator.""" +import hashlib +import io +import json +import os +from pathlib import Path +import subprocess +import sys +import tempfile +import types +import unittest +from unittest.mock import patch + +SCRIPTS = Path(__file__).resolve().parent.parent / "scripts" +sys.path.insert(0, str(SCRIPTS)) +import goal_loop as loop + + +def git(repo, *args): + p = subprocess.run(["git", *args], cwd=repo, capture_output=True, text=True) + if p.returncode: + raise AssertionError(p.stderr) + return p.stdout.strip() + + +class GoalLoopTest(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + root = Path(self.tmp.name) + self.repo = root / "app" + self.repo.mkdir() + self.state = root / "state" + self.bin = root / "bin" + self.bin.mkdir() + scanner = self.bin / "gitleaks" + scanner.write_text("#!/bin/sh\nexit 0\n") + scanner.chmod(0o755) + self.env = patch.dict(os.environ, {"DW_STATE_HOME": str(self.state), + "PATH": str(self.bin) + os.pathsep + os.environ["PATH"]}) + self.env.start() + self.addCleanup(self.env.stop) + git(self.repo, "init", "-q") + git(self.repo, "config", "user.name", "test") + git(self.repo, "config", "user.email", "test@example.test") + (self.repo / "calc.py").write_text("VALUE = 0\n") + (self.repo / "verify.py").write_text("import runpy\nassert runpy.run_path('calc.py')['VALUE'] >= 0\n") + self.evaluator = root / "evaluator.py" + self.evaluator.write_text( + "import json, os, pathlib, runpy\n" + "value = runpy.run_path('calc.py')['VALUE']\n" + "folder = pathlib.Path(os.environ['DW_REPORT_DIR'])\n" + "evidence = folder / 'result.json'\n" + "evidence.write_text(json.dumps({'measured': value}))\n" + "print(json.dumps({'schema_version': 1, 'metric': 'quality', 'value': value, " + "'unit': 'points', 'direction': 'maximize', 'checks': {'regression': 'pass'}, " + "'evidence': [str(evidence)]}))\n") + self.config = self.repo / ".dev-workflows.toml" + self.write_config() + git(self.repo, "add", "-A") + git(self.repo, "commit", "-qm", "baseline") + self.original = git(self.repo, "rev-parse", "HEAD") + + def write_config(self, target=2, iterations=4, stagnant=2, tier=0, billing="claude_subscription"): + checksum = hashlib.sha256(self.evaluator.read_bytes()).hexdigest() + self.config.write_text( + f"[commands]\ntest = \"python3 verify.py\"\nlint = \"true\"\ntypecheck = \"true\"\n" + f"[loop]\nenabled = true\nharness = \"claude\"\ntier = {tier}\n" + f"max_iterations = {iterations}\nmax_minutes = 5\nmax_stagnant = {stagnant}\n" + "min_improvement = 1\nmax_paid_usd = 0\n" + f"[loop.goal]\nname = \"quality\"\nunit = \"points\"\ndirection = \"maximize\"\ntarget = {target}\n" + "[loop.evaluator]\n" + f"argv = [\"python3\", \"{self.evaluator}\"]\n" + f"trusted_sha256 = \"{checksum}\"\nrequired_checks = [\"test\", \"lint\"]\n" + "[models.roles.implementer]\n" + f"model_key = \"sonnet\"\nbilling_mode = \"{billing}\"\nmanual_unranked_approval = true\n") + if tier >= 2: + with self.config.open("a") as config: + for role in ("planner", "reviewer"): + config.write(f"[models.roles.{role}]\nmodel_key = \"opus\"\n" + "billing_mode = \"claude_subscription\"\nmanual_unranked_approval = true\n") + if tier >= 3: + config.write("[models.roles.security-auditor]\nmodel_key = \"opus\"\n" + "billing_mode = \"claude_subscription\"\nmanual_unranked_approval = true\n") + + def runner(self, behavior): + def invoke(tool, role, prompt, cwd, model_key, timeout=900, env=None): + if role in ("planner", "reviewer", "security-auditor"): + return {"returncode": 0, "output": '{"verdict":"pass","findings":[]}', "usage": {}} + value = int((Path(cwd) / "calc.py").read_text().split("=")[1].strip()) + next_value = behavior(value, cwd) + (Path(cwd) / "calc.py").write_text(f"VALUE = {next_value}\n") + return {"returncode": 0, "output": "changed one behavior", "usage": {}} + return patch.dict(sys.modules, {"harness_runner": types.SimpleNamespace(invoke=invoke)}) + + def test_plan_does_not_create_worktree_or_invoke_agent(self): + before = git(self.repo, "worktree", "list", "--porcelain") + result = loop.plan(self.config) + self.assertEqual(result["baseline"], "not_run") + self.assertEqual(result["gate_preflight"]["test"], "run") + self.assertEqual(git(self.repo, "worktree", "list", "--porcelain"), before) + self.assertFalse(self.state.exists()) + + def test_two_measured_changes_reach_target_without_touching_user_branch(self): + with self.runner(lambda value, _: value + 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "success", result) + self.assertEqual([a["result"] for a in result["attempts"]], ["accepted", "accepted"]) + self.assertEqual(result["best_score"], "2") + self.assertEqual(git(self.repo, "rev-parse", "HEAD"), self.original) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + self.assertEqual((Path(result["best_worktree"]) / "calc.py").read_text(), "VALUE = 2\n") + self.assertNotIn(".dev-workflows/gate.json", git(Path(result["best_worktree"]), "ls-files")) + self.assertEqual(result["attempts"][1]["gate"]["checks"]["test"], "pass") + + def test_limit_preserves_best_improvement_without_claiming_target(self): + self.write_config(target=3, iterations=2) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "target-three") + with self.runner(lambda value, _: value + 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["best_score"], "2") + self.assertEqual([a["result"] for a in result["attempts"]], ["accepted", "accepted"]) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + + def test_measured_improvement_can_remove_obsolete_code(self): + (self.repo / "legacy.py").write_text("OLD = True\n") + self.evaluator.write_text(self.evaluator.read_text().replace( + "value = runpy.run_path('calc.py')['VALUE']", + "value = runpy.run_path('calc.py')['VALUE'] + int(not pathlib.Path('legacy.py').exists())")) + self.write_config(target=1, iterations=1) + git(self.repo, "add", "-A") + git(self.repo, "commit", "-qm", "legacy-baseline") + def invoke(tool, role, prompt, cwd, model_key, timeout=900, env=None): + (Path(cwd) / "legacy.py").unlink() + return {"returncode": 0, "output": "removed legacy", "usage": {}} + with patch.dict(sys.modules, {"harness_runner": types.SimpleNamespace(invoke=invoke)}): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "success", result) + self.assertFalse((Path(result["best_worktree"]) / "legacy.py").exists()) + self.assertTrue((self.repo / "legacy.py").exists()) + + + def test_baseline_at_target_exits_without_editing(self): + self.write_config(target=0) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "zero-target") + with self.runner(lambda _value, _cwd: self.fail("agente não deveria ser chamado")): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "success", result) + self.assertEqual(result["iteration"], 0) + self.assertEqual(result["attempts"], []) + + def test_evaluator_cannot_modify_original_checkout(self): + self.evaluator.write_text( + self.evaluator.read_text() + + f"open({str(self.repo / 'calc.py')!r}, 'w').write('VALUE = 999\\n')\n") + self.write_config(target=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "protected-evaluator") + with self.runner(lambda value, _: value + 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "error", result) + self.assertIn("avaliador", result["error"]) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + + + def test_gate_failure_rejects_regression_without_replacing_best(self): + calls = 0 + def changes(value, _): + nonlocal calls + calls += 1 + return -1 if calls == 1 else 1 + self.write_config(target=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "target-one") + with self.runner(changes): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "success", result) + self.assertEqual([a["result"] for a in result["attempts"]], ["rejected", "accepted"]) + self.assertIn("quality gate", result["attempts"][0]["reason"]) + self.assertEqual(result["best_score"], "1") + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + + def test_incomplete_gate_never_counts_as_success(self): + self.write_config(target=1, iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "one-iteration") + # No gitleaks in PATH: a security check is unverified, not green. + with patch.dict(os.environ, {"PATH": os.environ["PATH"].replace(str(self.bin) + os.pathsep, "")}), \ + self.runner(lambda value, _: 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["best_score"], "0") + self.assertIn("quality gate", result["attempts"][0]["reason"]) + + def test_tampered_config_in_candidate_is_rejected(self): + self.write_config(target=1, iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "one-iteration") + def tamper(value, cwd): + with (Path(cwd) / ".dev-workflows.toml").open("a") as f: + f.write("\n# altered by agent\n") + return 1 + with self.runner(tamper): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["attempts"][0]["result"], "rejected") + self.assertIn("protegido", result["attempts"][0]["reason"]) + + + def test_redirected_git_pointer_cannot_stage_on_original_branch(self): + self.write_config(target=1, iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "one-iteration") + original = git(self.repo, "rev-parse", "HEAD") + + def redirect(_value, cwd): + (Path(cwd) / ".git").write_text(f"gitdir: {self.repo / '.git'}\n") + return 1 + + with self.runner(redirect): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["attempts"][0]["result"], "rejected") + self.assertIn("ponteiro .git", result["attempts"][0]["reason"]) + self.assertEqual(git(self.repo, "rev-parse", "HEAD"), original) + self.assertEqual(git(self.repo, "status", "--porcelain"), "") + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + + def test_ignored_agent_file_cannot_inflate_accepted_score(self): + (self.repo / ".gitignore").write_text("score.txt\n") + self.evaluator.write_text(self.evaluator.read_text().replace( + "value = runpy.run_path('calc.py')['VALUE']", + "value = int(pathlib.Path('score.txt').read_text()) if pathlib.Path('score.txt').exists() else 0")) + self.write_config(target=2, iterations=1) + git(self.repo, "add", "-A") + git(self.repo, "commit", "-qm", "ignore-uncommitted-score") + + def inflate(_value, cwd): + (Path(cwd) / "score.txt").write_text("2\n") + return 1 + + with self.runner(inflate): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["best_score"], "0") + self.assertEqual(result["attempts"][0]["result"], "rejected") + self.assertIn("score 0", result["attempts"][0]["reason"]) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 0\n") + + def test_missing_evidence_cannot_claim_improvement(self): + self.evaluator.write_text(self.evaluator.read_text().replace( + "'evidence': [str(evidence)]", "'evidence': [str(evidence)] if value == 0 else []")) + self.write_config(target=1, iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "evidence-required") + with self.runner(lambda _value, _cwd: 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "paused", result) + self.assertEqual(result["best_score"], "0") + self.assertEqual(result["attempts"][0]["result"], "paused") + self.assertIn("evidência", result["attempts"][0]["reason"]) + + def test_dirty_tree_is_refused_and_preserved(self): + (self.repo / "calc.py").write_text("VALUE = 99\n") + with self.assertRaisesRegex(loop.LoopError, "alterações"): + loop.new_run(self.config) + self.assertFalse(self.state.exists()) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 99\n") + + def test_status_and_stop_work_after_unrelated_user_edit(self): + self.write_config(iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "one-iteration") + with self.runner(lambda value, _: value + 1): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted") + (self.repo / "calc.py").write_text("VALUE = 99\n") + run_id = result["run_id"] + for action in ("status", "stop"): + with patch("sys.stdout", new_callable=io.StringIO) as captured: + exit_code = loop.main([action, "--config", str(self.config), "--run", run_id]) + self.assertEqual(exit_code, 0) + self.assertEqual(json.loads(captured.getvalue())["best_score"], "1") + self.assertTrue((loop.state_root(self.repo) / run_id / "stop.requested").is_file()) + self.assertEqual((self.repo / "calc.py").read_text(), "VALUE = 99\n") + + def test_independent_review_failure_rejects_measured_gain(self): + self.write_config(target=1, tier=2, iterations=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "review-required") + def invoke(tool, role, prompt, cwd, model_key, timeout=900, env=None): + if role == "implementer": + (Path(cwd) / "calc.py").write_text("VALUE = 1\n") + return {"returncode": 0, "output": "changed behavior", "usage": {}} + return {"returncode": 0, "output": '{"verdict":"fail","findings":["regression"]}' + if role == "reviewer" else "plan", "usage": {}} + actual_gate = loop.gate_result + # Keep a real passing gate; tier-2 scanners are not installed in the disposable app. + def gate_with_available_checks(repo, base, tier, required, changes, deadline=None): + return actual_gate(repo, base, 0, required, changes, deadline) + with (patch.dict(sys.modules, {"harness_runner": types.SimpleNamespace(invoke=invoke)}), + patch.object(loop, "gate_result", side_effect=gate_with_available_checks)): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "exhausted", result) + self.assertEqual(result["best_score"], "0") + self.assertEqual(result["attempts"][0]["gate"]["checks"]["test"], "pass") + self.assertIn("reviewer", result["attempts"][0]["reason"]) + + + def test_resume_after_interrupted_attempt_does_not_repeat_it(self): + self.write_config(target=1) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "target-one") + def interrupt(_, __): + raise KeyboardInterrupt + with self.runner(interrupt), self.assertRaises(KeyboardInterrupt): + loop.new_run(self.config) + home = loop.state_root(self.repo) + folder = next(p for p in home.iterdir() if p.is_dir()) + with self.runner(lambda value, _: 1): + result = loop.resume_run(self.config, folder.name) + self.assertEqual(result["status"], "success", result) + self.assertEqual([a["result"] for a in result["attempts"]], ["interrupted", "accepted"]) + self.assertEqual(result["attempts"][-1]["iteration"], 2) + + def test_fixed_zen_model_cannot_bypass_account_catalog(self): + self.write_config(target=1, billing="zen") + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "zen-config") + with self.runner(lambda value, _: 1), self.assertRaisesRegex(loop.LoopError, "OpenCode ou OMP"): + loop.new_run(self.config) + + def test_unknown_paid_usage_blocks_resume_without_reauthorizing(self): + self.write_config(target=1, iterations=1) + self.config.write_text(self.config.read_text().replace("max_paid_usd = 0", "max_paid_usd = 1")) + git(self.repo, "add", ".dev-workflows.toml") + git(self.repo, "commit", "-qm", "paid-budget") + selected = {"model_key": "opencode/test", "billing_mode": "zen", + "balance_confirmed": True, "estimated_native_usd": "0.1"} + calls = 0 + + def invoke(_tool, _role, _prompt, cwd, _model_key, timeout=900, env=None): + nonlocal calls + calls += 1 + (Path(cwd) / "calc.py").write_text("VALUE = 1\n") + return {"returncode": 0, "output": "changed behavior", "usage": None} + + with (patch.object(loop, "role_model", return_value=selected), + patch.object(loop, "authorize"), + patch.dict(sys.modules, {"harness_runner": types.SimpleNamespace(invoke=invoke)})): + result = loop.new_run(self.config) + self.assertEqual(result["status"], "paused", result) + self.assertEqual(result["spent_paid_usd"], "0") + state = json.loads((loop.state_root(self.repo) / result["run_id"] / "state.json").read_text()) + self.assertTrue(state["unreconciled_paid_call"]) + with self.assertRaisesRegex(loop.LoopError, "concilie"): + loop.resume_run(self.config, result["run_id"]) + self.assertEqual(calls, 1) + + def test_go_requires_all_three_windows_and_disables_balance_fallback(self): + config = {"loop": {"max_paid_usd": 0}} + row = {"billing_mode": "go", "quota_window_remaining": {"5h": "1", "weekly": "1", "monthly": "1"}, + "quota_window_debit": {"5h": "0.2", "weekly": "0.2", "monthly": "0.2"}, + "use_balance_fallback": True} + with self.assertRaisesRegex(loop.SafetyPause, "fallback"): + loop.authorize(config, row, loop.Decimal(0)) + row["use_balance_fallback"] = False + row["quota_window_remaining"]["weekly"] = "0" + with self.assertRaisesRegex(loop.SafetyPause, "três janelas"): + loop.authorize(config, row, loop.Decimal(0)) + row["quota_window_remaining"]["weekly"] = "1" + loop.authorize(config, row, loop.Decimal(0)) + + def test_zen_needs_live_interactive_consent_not_stdin_yes(self): + config = {"loop": {"max_paid_usd": 1}} + row = {"billing_mode": "zen", "model_key": "opencode/test", + "estimated_native_usd": "0.2", "balance_confirmed": True} + with patch("sys.stdin", io.StringIO("SIM\n")), self.assertRaisesRegex(loop.SafetyPause, "interativa"): + loop.authorize(config, row, loop.Decimal(0)) + + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/qa/test_model_catalog.py b/qa/test_model_catalog.py new file mode 100755 index 0000000..7c52135 --- /dev/null +++ b/qa/test_model_catalog.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python3 +"""Behavior tests for model catalog imports and reports (stdlib only).""" +import hashlib +import json +import os +import shutil +import subprocess +import sys +import tempfile +import unittest +from decimal import Decimal + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(ROOT, "scripts")) +import model_catalog as catalog + + +class CatalogImportTests(unittest.TestCase): + def test_openrouter_keeps_per_token_units_and_missing_cache_is_not_free(self): + payload = {"data": [{"id": "z-ai/glm-5.3", "name": "GLM", "pricing": { + "prompt": "0.0000014", "completion": "0.0000044", "input_cache_read": "0.00000026" + }}]} + prices = catalog.parse_openrouter(payload)["z-ai/glm-5.3"] + self.assertEqual(prices["price_unit"], "USD/token") + self.assertEqual(prices["price_per_token_usd"]["input"], "0.0000014") + self.assertEqual(Decimal(prices["display_usd_per_1m"]["input"]), Decimal("1.4")) + self.assertEqual(Decimal(prices["display_usd_per_1m"]["cache_read"]), Decimal("0.26")) + self.assertIsNone(prices["display_usd_per_1m"]["cache_write"]) + self.assertIsNone(catalog.reference_cost(prices["price_per_token_usd"], {"cache_write": 1})) + self.assertEqual(catalog.reference_cost(prices["price_per_token_usd"], {"input": 1_000_000, "output": 10_000}), Decimal("1.444")) + + def test_negative_public_tariff_keeps_valid_models_and_is_not_costed(self): + payload = {"data": [ + {"id": "openrouter/auto-beta", "pricing": {"prompt": "-0.000001", "completion": "0.1"}}, + {"id": "openai/valid", "pricing": {"prompt": "0.000002", "completion": "0.000003"}}, + ]} + parsed = catalog.parse_openrouter(payload) + self.assertEqual(catalog.reference_cost(parsed["openai/valid"]["price_per_token_usd"], + {"input": 1_000_000}), Decimal("2")) + invalid = parsed["openrouter/auto-beta"] + self.assertEqual(invalid["conditions"]["unsupported_negative_prices"]["input"], "-0.000001") + self.assertIsNone(invalid["price_per_token_usd"]["input"]) + self.assertIsNone(catalog.reference_cost(invalid["price_per_token_usd"], {"input": 1})) + with self.assertRaises(ValueError): + catalog.parse_openrouter(payload, {"openai/valid": {"price_per_token_usd": {"input": "-1"}, + "source_url": "https://example.test/pricing", "captured_at": "2026-09-25T00:00:00Z"}}) + + + def test_openrouter_price_overrides_preserve_conditions_and_unit(self): + payload = {"data": [{"id": "openai/gpt-6-luna", "pricing": {"prompt": "0.1", "completion": "0.5"}, "context_length": 272000}]} + overrides = {"openai/gpt-6-luna": { + "display_usd_per_1m": {"input": "2.25", "output": "7.5"}, + "context_length": 272000, "ttl": "1h", "endpoint": "https://example.test/v2", + "source_url": "https://example.test/pricing", "captured_at": "2026-09-25T00:00:00Z" + }} + record = catalog.parse_openrouter(payload, overrides)["openai/gpt-6-luna"] + self.assertEqual(record["price_per_token_usd"]["input"], "0.00000225") + self.assertEqual(Decimal(record["display_usd_per_1m"]["output"]), Decimal("7.5")) + self.assertEqual(record["conditions"]["context_length"], 272000) + self.assertEqual(record["conditions"]["ttl"], "1h") + self.assertEqual(record["conditions"]["endpoint"], "https://example.test/v2") + with self.assertRaises(ValueError): + catalog.parse_openrouter(payload, {"missing/model": {"display_usd_per_1m": {"input": "1"}}}) + + def test_context_and_cache_ttl_overrides_choose_the_matching_price_tier(self): + payload = {"data": [{"id": "openai/gpt-6-luna", "pricing": { + "prompt": "0.0000001", "completion": "0.0000005", + "input_cache_write": "0.0000009", "input_cache_write_1h": "0.0000005" + }}]} + tier = {"min_context_tokens": 272001, "price_per_token_usd": {"input": "0.0000002", "output": "0.0000008"}, + "source_url": "https://openrouter.ai/docs/pricing", "captured_at": "2026-09-25T00:00:00Z"} + record = catalog.parse_openrouter(payload, {"openai/gpt-6-luna": {"context_tiers": [tier]}})["openai/gpt-6-luna"] + below = catalog.openrouter_price_for_profile(record, {"context_length": 272000}) + above = catalog.openrouter_price_for_profile(record, {"context_length": 272001}) + self.assertEqual(below["price_per_token_usd"]["input"], "0.0000001") + self.assertEqual(above["price_per_token_usd"]["input"], "0.0000002") + self.assertEqual(above["applied_context_tier"], 272001) + self.assertEqual(catalog.reference_cost(record["price_per_token_usd"], {"cache_write": 100, "cache_write_ttl": "1h"}), Decimal("0.00005")) + + def test_provider_catalog_preserves_exact_variants_without_guessing(self): + rows = catalog.parse_provider_catalog({"data": [ + {"id": "model-x", "name": "X", "variants": ["high", "max"]}, + {"id": "model-y"} + ]}, "opencode", catalog.ZEN_URL) + self.assertEqual([r["model_key"] for r in rows], ["opencode/model-x#high", "opencode/model-x#max", "opencode/model-y"]) + self.assertTrue(all(r["availability"]["authenticated"] is None for r in rows)) + with self.assertRaises(ValueError): + catalog.parse_provider_catalog({"data": [{"id": "bad/id"}]}, "opencode", catalog.ZEN_URL) + + def test_aa_import_requires_consent_provenance_and_one_consistent_v15_record(self): + snapshot = { + "metric_id": catalog.AA_METRIC, "version": "1.5", "ingestion": "manual_audited", + "terms_accepted": True, "source_url": catalog.AA_URL, "attribution": "Artificial Analysis Coding Agent Index", + "captured_at": "2026-09-25T00:00:00Z", "records": [{ + "provider": "opencode", "model_id": "gpt-6-luna", "variant": "max", "score": "41", + "agent": "Codex", "harness": "Codex", "settings": {"effort": "max"}, + "match_grade": "proxy", "evidence_url": catalog.AA_URL + }] + } + row = catalog.validate_aa_snapshot(snapshot)[0] + self.assertEqual((row["metric_id"], row["version"], row["score"], row["match_grade"]), (catalog.AA_METRIC, "1.5", "41", "proxy")) + wrong_index = dict(snapshot, metric_id="artificial_analysis_intelligence_index") + with self.assertRaises(ValueError): + catalog.validate_aa_snapshot(wrong_index) + duplicate = dict(snapshot, records=snapshot["records"] * 2) + with self.assertRaisesRegex(ValueError, "inconsistente"): + catalog.validate_aa_snapshot(duplicate) + no_consent = dict(snapshot, terms_accepted=False) + with self.assertRaises(ValueError): + catalog.validate_aa_snapshot(no_consent) + + def test_local_discovery_never_returns_diagnostics_or_credential_text(self): + class Result: + returncode = 0 + stdout = "opencode/model-a#high\nAPI_KEY=do-not-store\n" + stderr = "secret=do-not-print" + result = catalog.discover_local_models("opencode", runner=lambda *args, **kwargs: Result()) + self.assertEqual(result["models"], ["model-a#high"]) + self.assertNotIn("do-not-store", json.dumps(result)) + self.assertNotIn("do-not-print", json.dumps(result)) + + def test_omp_json_is_local_listing_only_and_never_proves_entitlement(self): + payload = {"models": [{"provider": "openai", "id": "gpt-6-luna", "thinking": ["high"]}]} + rows = catalog.parse_omp_models(payload, "openai") + self.assertEqual(rows[0]["model_key"], "openai/gpt-6-luna") + self.assertIsNone(rows[0]["availability"]["authenticated"]) + self.assertIsNone(rows[0]["availability"]["entitled"]) + + class Result: + returncode = 0 + stdout = json.dumps(payload) + stderr = "account-private-value" + calls = [] + result = catalog.discover_omp_models("openai", runner=lambda args, **kwargs: (calls.append(args) or Result())) + self.assertEqual(calls, [["omp", "models", "openai", "--json"]]) + self.assertEqual(result["models"], ["openai/gpt-6-luna", "openai/gpt-6-luna#high"]) + self.assertNotIn("account-private-value", json.dumps(result)) + + def test_omp_keeps_slash_ids_and_only_lists_advertised_thinking(self): + payload = {"models": [ + {"provider": "openai", "id": "anthropic/claude-x", + "selector": "openai/anthropic/claude-x", "thinking": ["low", "high"]} + ]} + rows = catalog.parse_omp_models(payload, "openai") + self.assertEqual([row["model_key"] for row in rows], ["openai/anthropic/claude-x"]) + + self.assertEqual(rows[0]["model_id"], "anthropic/claude-x") + class Result: + returncode = 0 + stdout = json.dumps(payload) + stderr = "" + discovered = catalog.discover_omp_models("openai", runner=lambda *args, **kwargs: Result()) + self.assertEqual(discovered["models"], [ + "openai/anthropic/claude-x", "openai/anthropic/claude-x#high", "openai/anthropic/claude-x#low" + ]) + with self.assertRaises(ValueError): + catalog.parse_omp_models({"models": [{"provider": "openai", "id": "anthropic/claude-x", + "selector": "openai/claude-x"}]}, "openai") + + def test_openrouter_public_long_context_override_affects_reference_cost(self): + record = catalog.parse_openrouter({"data": [{"id": "anthropic/model-x", "pricing": { + "prompt": "0.000001", "completion": "0.000002", + "overrides": [{"min_prompt_tokens": 272000, "prompt": "0.000003", "completion": "0.000004"}] + }}]})["anthropic/model-x"] + selected = catalog.openrouter_price_for_profile(record, {"input": 272000}) + self.assertEqual(selected["price_per_token_usd"]["input"], "0.000003") + self.assertEqual(catalog.reference_cost(selected["price_per_token_usd"], + {"input": 272000, "output": 10}), Decimal("0.81604")) + + def test_omp_sync_requires_manual_account_and_balance_evidence(self): + with tempfile.TemporaryDirectory() as cache: + availability_path = os.path.join(cache, "availability.json") + native_path = os.path.join(cache, "overrides.json") + aa_path = os.path.join(cache, "aa.json") + timestamp = catalog.utc_now() + with open(availability_path, "w", encoding="utf-8") as stream: + json.dump({ + "tool": "omp", "ingestion": "manual_audited", "user_confirmed": True, + "captured_at": timestamp, "records": [{ + "provider": "openai", "model_id": "gpt-6-luna", "variant": "high", + "local_listed": True, "authenticated": True, "entitled": True, + "verified_at": timestamp, "source": "manual audited OMP account", + "balance_confirmed": True, "balance_verified_at": timestamp, + }], + }, stream) + with open(native_path, "w", encoding="utf-8") as stream: + json.dump({"native_tariffs": {"openai/gpt-6-luna#high": { + "billing_mode": "omp_payg", "account_confirmed": True, + "source_url": "https://provider.example/pricing", "captured_at": timestamp, + "price_per_token_usd": {"input": "0.000001"}, "available_balance_usd": "2", + }}}, stream) + with open(aa_path, "w", encoding="utf-8") as stream: + json.dump({ + "metric_id": catalog.AA_METRIC, "version": "1.5", "ingestion": "manual_audited", + "terms_accepted": True, "source_url": catalog.AA_URL, + "attribution": "Artificial Analysis Coding Agent Index", "captured_at": timestamp, + "records": [{ + "provider": "openai", "model_id": "gpt-6-luna", "variant": "high", "score": "54", + "agent": "Codex", "harness": "OMP", "settings": {"effort": "high"}, + "match_grade": "exact", "evidence_url": catalog.AA_URL, + }, { + "provider": "openai", "model_id": "gpt-6-luna", "variant": "xhigh", "score": "60", + "agent": "Codex", "harness": "OMP", "settings": {"effort": "xhigh"}, + "match_grade": "exact", "evidence_url": catalog.AA_URL, + }], + }, stream) + rows = catalog.parse_omp_models({"models": [{"provider": "openai", "id": "gpt-6-luna", + "thinking": ["high"]}]}, "openai") + discover = lambda provider: {"ok": True, "models": ["openai/gpt-6-luna", "openai/gpt-6-luna#high"], "rows": rows, + "source_hash": "a" * 64, "verified_at": timestamp, "reason": None} + fetched = [] + def fetcher(url): + fetched.append(url) + payload = {"data": []} + return payload, url, catalog.sha256(catalog.canonical_json(payload)) + result = catalog.sync("omp", ["openai"], cache, fetcher, aa_snapshot=aa_path, + availability_snapshot=availability_path, price_overrides=native_path, + omp_discoverer=discover) + snapshot = catalog.load_snapshot("omp", cache) + by_key = {row["model_key"]: row for row in snapshot["models"]} + self.assertNotIn("openai/gpt-6-luna#xhigh", by_key) + self.assertEqual(result["model_count"], 2) + self.assertEqual(fetched, [catalog.OPENROUTER_URL]) + model = by_key["openai/gpt-6-luna#high"] + self.assertEqual(model["score"]["version"], "1.5") + self.assertEqual(model["billing_mode"], "omp_payg") + self.assertTrue(model["availability"]["local_listed"]) + self.assertTrue(model["availability"]["entitled"]) + self.assertTrue(model["availability"]["balance_confirmed"]) + self.assertEqual(model["native_tariff"]["available_balance_usd"], "2") + with self.assertRaisesRegex(ValueError, "providers explicitamente"): + catalog.sync("omp", cache_dir=cache, fetcher=lambda url: ({}, url, "x")) + with self.assertRaises(ValueError): + catalog.validate_native_tariff_overrides({"openai/model": { + "billing_mode": "omp_payg", "account_confirmed": True, + "source_url": "https://provider.example/pricing", "captured_at": "2026-09-25T12:00:00Z", + "price_per_token_usd": {"input": "0.1"}, + }}) + + def test_manual_availability_and_native_tariff_are_auditable_without_secrets(self): + with tempfile.TemporaryDirectory() as cache: + availability = os.path.join(cache, "availability.json") + with open(availability, "w", encoding="utf-8") as stream: + json.dump({ + "tool": "opencode", "ingestion": "manual_audited", "user_confirmed": True, + "captured_at": "2026-09-25T00:00:00Z", + "records": [{"provider": "opencode", "model_id": "model-a", "variant": None, + "local_listed": True, "authenticated": True, "entitled": True, + "verified_at": "2026-09-25T00:00:00Z", "source": "manual confirmation token=NEVER_PERSIST"}] + }, stream) + def fetcher(url): + body = {"data": [{"id": "model-a"}]} if url == catalog.ZEN_URL else {"data": []} + return body, url, catalog.sha256(catalog.canonical_json(body)) + catalog.sync("opencode", ("opencode",), cache, fetcher, + lambda provider: {"ok": True, "models": ["model-a"], "reason": None}, + availability_snapshot=availability) + snapshot = catalog.load_snapshot(cache_dir=cache) + model = snapshot["models"][0] + self.assertEqual(model["availability"]["authenticated"], True) + self.assertEqual(model["availability"]["entitled"], True) + self.assertEqual(model["availability"]["source"], "manual_audited") + self.assertNotIn("NEVER_PERSIST", json.dumps(snapshot)) + self.assertIn("availability", snapshot["source_hashes"]) + + tariff = catalog.validate_native_tariff_overrides({"opencode/model-a": { + "billing_mode": "zen_balance", "account_confirmed": True, "source_url": "https://opencode.ai/docs/zen", + "captured_at": "2026-09-25T00:00:00Z", "price_per_token_usd": {"input": "0.000001", "output": "0.000002"}, + "available_balance_usd": "2", + }}) + self.assertEqual(tariff["opencode/model-a"]["price_per_token_usd"]["input"], "0.000001") + self.assertEqual(tariff["opencode/model-a"]["available_balance_usd"], "2") + with self.assertRaisesRegex(ValueError, "saldo disponível"): + catalog.validate_native_tariff_overrides({"opencode/model-a": { + "billing_mode": "zen_balance", "account_confirmed": True, "source_url": "https://opencode.ai/docs/zen", + "captured_at": "2026-09-25T00:00:00Z", "price_per_token_usd": {"input": "0.000001"}, + }}) + + def test_unknown_openrouter_id_override_is_rejected(self): + payload = {"data": [{"id": "known/id", "pricing": {}}]} + with self.assertRaises(ValueError): + catalog.parse_openrouter(payload, {"typo/id": {"context_length": 100}}) + + +class CatalogSnapshotTests(unittest.TestCase): + def test_missing_cache_and_complete_report_keep_unavailable_models(self): + with tempfile.TemporaryDirectory() as cache: + self.assertEqual(catalog.list_models(cache_dir=cache), []) + self.assertEqual(catalog._csv_text([]).splitlines()[0].split(","), list(catalog.LIST_FIELDS)) + source_catalogs = { + catalog.ZEN_URL: {"data": [{"id": "glm-5.3", "name": "GLM"}, {"id": "unknown-model", "name": "Unknown"}]}, + catalog.GO_URL: {"data": [{"id": "gpt-6-luna", "name": "Luna"}]}, + catalog.OPENROUTER_URL: {"data": [{"id": "z-ai/glm-5.3", "pricing": {"prompt": "0.0000014", "completion": "0.0000044"}}, + {"id": "openai/gpt-6-luna", "pricing": {"prompt": "0.0000001", "completion": "0.0000005"}}]}, + } + def fetcher(url): + body = source_catalogs[url] + return body, url, catalog.sha256(catalog.canonical_json(body)) + def local(provider): + ids = ["glm-5.3"] if provider == "opencode" else [] + return {"ok": True, "models": ids, "reason": None} + result = catalog.sync("opencode", ("opencode", "opencode-go"), cache, fetcher, local) + rows = catalog.list_models(cache_dir=cache) + self.assertEqual(result["model_count"], 3) + self.assertEqual(len(rows), 3) + by_key = {row["model_key"]: row for row in rows} + self.assertEqual(by_key["opencode/glm-5.3"]["disponivel_na_conta"], "n/d") + self.assertEqual(by_key["opencode/unknown-model"]["openrouter_id"], "n/d") + self.assertEqual(by_key["opencode/unknown-model"]["preco_or_entrada_usd_1m"], "n/d") + self.assertEqual(by_key["opencode-go/gpt-6-luna"]["coding_index_nota"], "n/d") + self.assertFalse(by_key["opencode-go/gpt-6-luna"]["disponivel_na_conta"]) + self.assertEqual(len(catalog.list_models(cache_dir=cache, show_missing=False)), 1) + self.assertEqual(Decimal(by_key["opencode/glm-5.3"]["preco_or_entrada_usd_1m"]), Decimal("1.4")) + + + def test_archived_cli_csv_reproduces_frozen_bytes_at_capture_time(self): + archived_snapshot = os.path.join(ROOT, "docs", "model-catalog-snapshot-2026-09-25", "catalog-opencode.json") + archived_csv = os.path.join(ROOT, "docs", "model-catalog-zen-go-2026-09-25.csv") + with tempfile.TemporaryDirectory() as cache: + shutil.copyfile(archived_snapshot, os.path.join(cache, "catalog-opencode.json")) + result = subprocess.run([ + sys.executable, os.path.join(ROOT, "scripts", "model_catalog.py"), "list", + "--tool", "opencode", "--format", "csv", "--cache-dir", cache, + "--as-of-utc", "2026-09-25T07:18:38Z", + ], capture_output=True, check=True) + with open(archived_csv, "rb") as stream: + expected = stream.read() + self.assertEqual(hashlib.sha256(expected).hexdigest(), + "80e2930877b20e5c47d4fd18f394c17a4683b257ca715496e91c63520d528230") + self.assertEqual(result.stdout, expected) + self.assertEqual(len(result.stdout.splitlines()) - 1, 122) + + def test_archived_openrouter_override_changes_long_context_cost(self): + cache = os.path.join(ROOT, "docs", "model-catalog-snapshot-2026-09-25") + record = catalog.load_snapshot(cache_dir=cache)["openrouter"]["openai/gpt-6-sol"] + below = catalog.openrouter_price_for_profile(record, {"input": 271999}) + above = catalog.openrouter_price_for_profile(record, {"input": 300000}) + self.assertEqual(catalog.reference_cost(below["price_per_token_usd"], {"input": 271999}), + Decimal("0.543998")) + self.assertEqual(above["applied_context_tier"], 272000) + self.assertEqual(catalog.reference_cost(above["price_per_token_usd"], {"input": 300000}), + Decimal("1.2")) + + + def test_go_report_shows_all_confirmed_quota_windows_and_fallback_policy(self): + with tempfile.TemporaryDirectory() as cache: + timestamp = catalog.utc_now() + native_path = os.path.join(cache, "quota.json") + with open(native_path, "w", encoding="utf-8") as stream: + json.dump({"native_tariffs": {"opencode-go/model-a": { + "billing_mode": "go_quota", "account_confirmed": True, + "source_url": "https://opencode.ai/docs/go", "captured_at": timestamp, + "quota_window_remaining": {"5h": "2", "weekly": "5", "monthly": "10"}, + "quota_window_debit": {"5h": "0.5", "weekly": "0.5", "monthly": "0.5"}, + "use_balance_fallback": False, + }}}, stream) + def fetcher(url): + body = {"data": [{"id": "model-a"}]} if url == catalog.GO_URL else {"data": []} + return body, url, catalog.sha256(catalog.canonical_json(body)) + catalog.sync("opencode", ("opencode-go",), cache, fetcher, + lambda _: {"ok": True, "models": ["model-a"], "reason": None}, + price_overrides=native_path) + report = catalog.list_models(cache_dir=cache)[0]["preco_native_ou_cota"] + self.assertEqual(report["quota_window_remaining"], {"5h": "2", "weekly": "5", "monthly": "10"}) + self.assertEqual(report["quota_window_debit"]["monthly"], "0.5") + self.assertFalse(report["use_balance_fallback"]) + + def test_score_bands_are_fixed_inclusive_only_at_high_upper_bound(self): + cases = {"9.99": None, "10": "leve", "19.99": "leve", "20": "media", "49.99": "media", "50": "alta", "100": "alta", "100.01": None} + for score, expected in cases.items(): + self.assertEqual(catalog.band_for_score(score), expected) + + +if __name__ == "__main__": + unittest.main(verbosity=1) diff --git a/qa/test_model_router.py b/qa/test_model_router.py new file mode 100755 index 0000000..ccabb76 --- /dev/null +++ b/qa/test_model_router.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python3 +"""Behavior tests for role routing, spending boundaries, and deterministic ties.""" +import os +import json +import sys +import tempfile +import unittest +from datetime import datetime, timezone +from decimal import Decimal + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(ROOT, "scripts")) +import model_catalog +import model_router + +NOW = datetime(2026, 9, 25, 12, 0, tzinfo=timezone.utc) +NOW_TEXT = "2026-09-25T12:00:00Z" + + +def candidate(model_key, *, provider="opencode", score="45", native_input="0.0000001", billing="zen_balance", **extra): + result = { + "tool": "opencode", "model_key": model_key, "provider": provider, + "model_id": model_key.split("/", 1)[-1], "variant": None, "billing_mode": billing, + "availability": {"local_listed": True, "authenticated": True, "entitled": True, "verified_at": NOW_TEXT, + "local_verified_at": NOW_TEXT, "account_verified_at": NOW_TEXT, + "balance_confirmed": True, "balance_verified_at": NOW_TEXT}, + "score": {"metric_id": model_catalog.AA_METRIC, "version": "1.5", "score": score, + "agent": "Codex", "harness": "OpenCode", "variant": None, "settings": {"effort": "max"}, + "match_grade": "exact", "source_url": model_catalog.AA_URL, "observed_at": NOW_TEXT}, + "openrouter": {"captured_at": NOW_TEXT, "price_per_token_usd": {"input": "0.0000001", "output": "0.0000005"}}, + "native_tariff": {"billing_mode": billing, "account_confirmed": True, "source_url": "https://opencode.ai/docs/zen", + "captured_at": NOW_TEXT, "available_balance_usd": "2", + "price_per_token_usd": {"input": native_input, "output": "0.0000002", + "cache_read": "0.00000001", "cache_write": "0.00000002"}}, + } + if billing == "go_quota": + result["quota_verified_at"] = NOW_TEXT + result["quota_source_url"] = "https://opencode.ai/docs/go" + result["use_balance_fallback"] = False + result.update(extra) + return result + + +class RoutePolicyTests(unittest.TestCase): + def test_missing_cache_is_explicit_and_no_model_is_invented(self): + with tempfile.TemporaryDirectory() as cache: + result = model_router.route_from_catalog("opencode", "implementer", ["opencode"], cache) + self.assertIsNone(result["selected"]) + self.assertIn("snapshot_de_catalogo_ausente", result["reason"]) + empty = model_router.route([], "explorer", allowed_providers=["opencode"], now=NOW) + self.assertIsNone(empty["selected"]) + self.assertEqual(empty["reason"], "no_scored_candidate") + high_only = model_router.route([candidate("opencode/high-only", score="54")], "implementer", + allowed_providers=["opencode"], budget_usd="1", now=NOW) + self.assertIsNone(high_only["selected"]) + self.assertEqual(high_only["reason"], "faixa_vazia:media") + + def test_benchmark_with_wrong_index_is_never_ranked(self): + row = candidate("opencode/model-a", score="54") + row["score"]["metric_id"] = "artificial_analysis_intelligence_index" + result = model_router.route([row], "planner", allowed_providers=["opencode"], now=NOW) + self.assertIsNone(result["selected"]) + self.assertEqual(result["ranking"][0]["eligible"], False) + self.assertIn("indice_incompativel_ou_ausente", result["ranking"][0]["exclusion_reasons"]) + + def test_role_band_precedes_cost_and_plateau_uses_native_cost_not_openrouter(self): + cheap_high = candidate("opencode/high", score="54", native_input="0.000000001") + media_best = candidate("opencode/media", score="49", native_input="0.0000001") + media_cheaper = candidate("opencode/media-cheap", score="47", native_input="0.00000005") + result = model_router.route([cheap_high, media_best, media_cheaper], "implementer", allowed_providers=["opencode"], + tokens={"input": 1_000_000}, budget_usd="0.08", now=NOW) + self.assertEqual(result["selected"]["model_key"], "opencode/media-cheap") + self.assertEqual(result["selected"]["band"], "media") + self.assertEqual(Decimal(result["selected"]["reference_cost_usd"]), Decimal("0.1")) + self.assertEqual(Decimal(result["selected"]["estimated_native_usd"]), Decimal("0.05")) + self.assertIn("platô", result["reason"]) + + def test_zen_balance_must_cover_native_estimate_and_be_confirmed(self): + row = candidate("opencode/model-a") + row["native_tariff"]["available_balance_usd"] = "0.05" + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 1_000_000}, budget_usd="1", now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("saldo_insuficiente", result["ranking"][0]["exclusion_reasons"]) + row["native_tariff"]["available_balance_usd"] = "1" + row["availability"]["balance_confirmed"] = False + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 1_000_000}, budget_usd="1", now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("saldo_nao_confirmado_ou_obsoleto", result["ranking"][0]["exclusion_reasons"]) + + def test_zen_balance_requires_explicit_budget(self): + row = candidate("opencode/model-a") + result = model_router.route([row], "implementer", allowed_providers=["opencode"], now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("orcamento_zen_nao_configurado", result["ranking"][0]["exclusion_reasons"]) + + def test_exact_benchmark_harness_must_match_tool_but_proxy_requires_approval(self): + row = candidate("opencode/model-a") + row["score"]["harness"] = "Codex" + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 100_000}, budget_usd="1", now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("harness_incompativel", result["ranking"][0]["exclusion_reasons"]) + + row["score"]["match_grade"] = "proxy" + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 100_000}, budget_usd="1", now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("match_proxy_nao_autorizado", result["ranking"][0]["exclusion_reasons"]) + approved = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 100_000}, budget_usd="1", allow_proxy=True, now=NOW) + self.assertEqual(approved["selected"]["model_key"], "opencode/model-a") + + def test_budget_is_applied_before_plateau_and_proxy_requires_explicit_permission(self): + top = candidate("opencode/top", score="49", native_input="0.000001") + lower = candidate("opencode/lower", score="46", native_input="0.00000005") + row = candidate("opencode/proxy", score="45", match="proxy") + row["score"]["match_grade"] = "proxy" + result = model_router.route([top, lower, row], "implementer", allowed_providers=["opencode"], + tokens={"input": 1_000_000}, budget_usd="0.1", now=NOW) + self.assertEqual(result["selected"]["model_key"], "opencode/lower") + exclusions = {entry["model_key"]: entry["exclusion_reasons"] for entry in result["ranking"]} + self.assertIn("match_proxy_nao_autorizado", exclusions["opencode/proxy"]) + proxy = model_router.route([row], "implementer", allowed_providers=["opencode"], tokens={"input": 1_000_000}, + budget_usd="1", allow_proxy=True, now=NOW) + self.assertEqual(proxy["selected"]["model_key"], "opencode/proxy") + + def test_unknown_entitlement_and_provider_are_not_eligible(self): + row = candidate("opencode/model-a", score="54") + row["availability"]["entitled"] = None + result = model_router.route([row], "planner", allowed_providers=["opencode"], now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("entitlement_nao_confirmado", result["ranking"][0]["exclusion_reasons"]) + unauthorized = model_router.route([candidate("opencode/model-a", score="54")], "planner", now=NOW) + self.assertIn("provider_nao_autorizado", unauthorized["reason"]) + + def test_go_quota_checks_every_window_and_never_falls_back_to_zen(self): + for window in model_router.WINDOWS: + row = candidate("opencode-go/model-a", provider="opencode-go", score="54", billing="go_quota") + row["quota_window_remaining"] = {"5h": "1", "weekly": "1", "monthly": "1"} + row["quota_window_debit"] = {"5h": "0.1", "weekly": "0.1", "monthly": "0.1"} + row["quota_window_remaining"][window] = "0.05" + result = model_router.route([row], "planner", allowed_providers=["opencode-go"], tokens={"input": 1_000_000}, now=NOW) + self.assertIsNone(result["selected"], window) + self.assertIn("quota_go_insuficiente", result["reason"]) + row = candidate("opencode-go/model-a", provider="opencode-go", score="54", billing="go_quota") + row["quota_window_remaining"] = {"5h": "1", "weekly": "1", "monthly": "1"} + row["quota_window_debit"] = {"5h": "0.1", "weekly": "0.1", "monthly": "0.1"} + row["use_balance_fallback"] = True + result = model_router.route([row], "planner", allowed_providers=["opencode-go"], tokens={"input": 1_000_000}, now=NOW) + self.assertIsNone(result["selected"]) + self.assertEqual(result["reason"], "fallback_go_para_saldo_zen_nao_autorizado") + + def test_go_success_exposes_quota_and_billing_mode_separately(self): + row = candidate("opencode-go/model-a", provider="opencode-go", score="54", billing="go_quota") + row["quota_window_remaining"] = {"5h": "1", "weekly": "2", "monthly": "3"} + row["quota_window_debit"] = {"5h": "0.1", "weekly": "0.1", "monthly": "0.2"} + result = model_router.route([row], "planner", allowed_providers=["opencode-go"], tokens={"input": 1_000_000}, now=NOW) + selected = result["selected"] + self.assertEqual(selected["billing_mode"], "go") + self.assertEqual(selected["billing_mode_detail"], "go_quota") + self.assertEqual(selected["quota_window_debit"]["monthly"], "0.2") + self.assertIsNone(selected["estimated_native_usd"]) + self.assertEqual(selected["native_cost_or_quota_debit_usd"], "0.2") + + def test_missing_cache_rate_disables_comparative_cost_not_native_selection(self): + row = candidate("opencode/model-a", score="45") + row["openrouter"]["price_per_token_usd"] = {"input": "0.0000001"} + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + tokens={"input": 1_000_000, "cache_read": 1000}, budget_usd="1", now=NOW) + self.assertEqual(result["selected"]["model_key"], "opencode/model-a") + self.assertIsNone(result["selected"]["reference_cost_usd"]) + self.assertEqual(Decimal(result["selected"]["estimated_native_usd"]), Decimal("0.10001")) + + def test_expired_paid_metadata_blocks_automatic_selection(self): + row = candidate("opencode/model-a", score="54") + row["openrouter"]["captured_at"] = "2026-09-23T00:00:00Z" + result = model_router.route([row], "planner", allowed_providers=["opencode"], budget_usd="1", now=NOW) + self.assertIsNone(result["selected"]) + self.assertIn("preco_referencial_obsoleto_ou_ausente", result["ranking"][0]["exclusion_reasons"]) + + def test_ties_are_deterministic_independent_of_input_order(self): + a = candidate("opencode/a", score="48", native_input="0.00000005") + b = candidate("opencode/b", score="48", native_input="0.00000005") + first = model_router.route([a, b], "implementer", allowed_providers=["opencode"], tokens={"input": 1_000_000}, budget_usd="1", now=NOW) + second = model_router.route([b, a], "implementer", allowed_providers=["opencode"], tokens={"input": 1_000_000}, budget_usd="1", now=NOW) + self.assertEqual(first, second) + self.assertEqual(first["selected"]["model_key"], "opencode/a") + + def test_fixed_bands_metric_and_role_override_contract(self): + self.assertEqual(model_router.validate_bands({"leve": [10, 20], "media": [20, 50], "alta": [50, 100]}), + model_router.FIXED_BANDS) + with self.assertRaises(ValueError): + model_router.validate_bands({"leve": [0, 20], "media": [20, 50], "alta": [50, 100]}) + row = candidate("opencode/model-a", score="54") + result = model_router.route([row], "implementer", allowed_providers=["opencode"], + band_override="alta", tokens={"input": 1_000_000}, budget_usd="1", now=NOW) + self.assertEqual(result["selected"]["band"], "alta") + with self.assertRaises(ValueError): + model_router.route([row], "planner", allowed_providers=["opencode"], + benchmark_metric="aa_coding_agent_index_v1.4", now=NOW) + + def test_omp_payg_uses_only_native_estimate_and_exact_dispatch_variant(self): + row = candidate("openai/model-a#high", provider="openai", score="54", billing="omp_payg") + row.update({"tool": "omp", "model_id": "model-a", "variant": "high"}) + row["score"]["harness"] = "OMP" + row["score"]["variant"] = "high" + row["openrouter"] = None + row["native_tariff"] = { + "billing_mode": "omp_payg", "account_confirmed": True, + "source_url": "https://provider.example/pricing", "captured_at": NOW_TEXT, + "price_per_token_usd": {"input": "0.000001"}, "available_balance_usd": "0.2", + } + result = model_router.route([row], "planner", allowed_providers=["openai"], + tokens={"input": 100_000}, budget_usd="0.2", now=NOW) + selected = result["selected"] + self.assertEqual(selected["model_key"], "openai/model-a#high") + self.assertEqual(selected["dispatch_model_key"], "openai/model-a:high") + self.assertEqual(selected["billing_mode"], "payg") + self.assertEqual(selected["estimated_native_usd"], "0.100000") + self.assertEqual(selected["available_balance_usd"], "0.2") + self.assertIsNone(selected["reference_cost_usd"]) + row["availability"]["balance_confirmed"] = False + blocked = model_router.route([row], "planner", allowed_providers=["openai"], + tokens={"input": 100_000}, budget_usd="0.2", now=NOW) + self.assertIsNone(blocked["selected"]) + self.assertIn("saldo_nao_confirmado_ou_obsoleto", blocked["ranking"][0]["exclusion_reasons"]) + + def test_omp_catalog_route_revalidates_local_list_and_keeps_manual_entitlement(self): + row = candidate("openai/model-a#high", provider="openai", score="54", billing="omp_payg") + row.update({"tool": "omp", "model_id": "model-a", "variant": "high"}) + row["score"]["harness"] = "OMP" + row["score"]["variant"] = "high" + row["native_tariff"] = { + "billing_mode": "omp_payg", "account_confirmed": True, + "source_url": "https://provider.example/pricing", "captured_at": NOW_TEXT, + "price_per_token_usd": {"input": "0.000001"}, "available_balance_usd": "0.2", + } + with tempfile.TemporaryDirectory() as cache: + with open(os.path.join(cache, "catalog-omp.json"), "w", encoding="utf-8") as stream: + json.dump({"tool": "omp", "models": [row]}, stream) + result = model_router.route_from_catalog( + "omp", "planner", ["openai"], cache, tokens={"input": 100_000}, budget_usd="0.2", + omp_discoverer=lambda provider: {"ok": True, "models": ["openai/model-a#high"], "verified_at": NOW_TEXT}, + now=NOW, + ) + unsupported = model_router.route_from_catalog( + "omp", "planner", ["openai"], cache, tokens={"input": 100_000}, budget_usd="0.2", + omp_discoverer=lambda provider: {"ok": True, "models": ["openai/model-a"], "verified_at": NOW_TEXT}, + now=NOW, + ) + self.assertIsNone(unsupported["selected"]) + self.assertIn("nao_listado_localmente", unsupported["ranking"][0]["exclusion_reasons"]) + self.assertEqual(result["selected"]["dispatch_model_key"], "openai/model-a:high") + + + +if __name__ == "__main__": + unittest.main(verbosity=1) diff --git a/qa/test_omp_adapter.py b/qa/test_omp_adapter.py new file mode 100644 index 0000000..746abde --- /dev/null +++ b/qa/test_omp_adapter.py @@ -0,0 +1,45 @@ +"""Ownership and safety behavior for native OMP package builds.""" +import importlib.util +import tempfile +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +SPEC = importlib.util.spec_from_file_location("omp_build", ROOT / "adapters" / "omp" / "build.py") +BUILD = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(BUILD) + + +class OmpAdapterTests(unittest.TestCase): + def setUp(self): + self.tmp = tempfile.TemporaryDirectory() + self.addCleanup(self.tmp.cleanup) + self.package = Path(self.tmp.name) / "dev-workflows" + BUILD.build_package(ROOT, self.package) + + def test_refuses_to_replace_unowned_destination(self): + with tempfile.TemporaryDirectory() as tmp: + dest = Path(tmp) / "third-party" + dest.mkdir() + sentinel = dest / "keep" + sentinel.write_text("untouched") + with self.assertRaises(FileExistsError): + BUILD.build_package(ROOT, dest) + self.assertEqual(sentinel.read_text(), "untouched") + + def test_preserves_manual_edits_in_managed_package(self): + prompt = self.package / "agents" / "planner.md" + prompt.write_text(prompt.read_text() + "\nMudança do usuário.\n") + with self.assertRaisesRegex(FileExistsError, "alterações manuais"): + BUILD.build_package(ROOT, self.package) + self.assertIn("Mudança do usuário.", prompt.read_text()) + + def test_rejects_invalid_model_selectors(self): + with tempfile.TemporaryDirectory() as tmp: + with self.assertRaises(ValueError): + BUILD.build_package(ROOT, Path(tmp) / "package", {"planner": "gpt-6-luna"}) + + +if __name__ == "__main__": + unittest.main() diff --git a/scripts/goal_loop.py b/scripts/goal_loop.py new file mode 100755 index 0000000..0ddb2c6 --- /dev/null +++ b/scripts/goal_loop.py @@ -0,0 +1,825 @@ +#!/usr/bin/env python3 +"""Opt-in, evaluator-driven experiments in detached git worktrees. + +The user's branch is never reset, staged, merged, or published. Agent output is +untrusted; only the external evaluator and current quality-gate report decide. +""" +import argparse +import contextlib +from decimal import Decimal, InvalidOperation +import fcntl +import hashlib +import json +import os +from pathlib import Path +import re +import subprocess +import sys +import time +import tomllib +import uuid + +ROOT = Path(__file__).resolve().parent.parent +GATE = ROOT / "scripts" / "quality-gate" +MODEL_CATALOG = ROOT / "scripts" / "model_catalog.py" + + +class LoopError(Exception): + pass + +class SafetyPause(LoopError): + """The next model invocation is not authorized or cannot be budgeted.""" + + + +def command(argv, cwd, timeout=60, env=None): + try: + return subprocess.run(argv, cwd=cwd, env=env, text=True, capture_output=True, timeout=timeout) + except (OSError, subprocess.TimeoutExpired) as exc: + raise LoopError(f"falha ao executar {argv[0]}: {exc}") from exc + + +def sandbox_binary(): + bwrap = next((path for path in ("/usr/bin/bwrap", "/bin/bwrap") if Path(path).is_file()), None) + if not bwrap: + raise LoopError("bubblewrap indisponível: não executar código do projeto sem isolamento") + return bwrap + + +def preflight_isolation(project): + """Prove namespace support without modifying the project or invoking a model.""" + result = command([sandbox_binary(), "--die-with-parent", "--new-session", "--unshare-net", + "--unshare-pid", "--ro-bind", "/", "/", "--dev-bind", "/dev", "/dev", + "--proc", "/proc", "--", "/usr/bin/true"], project, timeout=15) + if result.returncode: + raise LoopError(f"isolamento bubblewrap indisponível: {result.stderr.strip()[:300]}") + + +def isolated_command(argv, cwd, timeout=60, env=None, writable=()): + """Run untrusted project checks with no network or write access outside mounts.""" + bwrap = sandbox_binary() + repo = Path(cwd).resolve(strict=True) + home = repo / ".dev-workflows" / "sandbox-home" + home.mkdir(mode=0o700, parents=True, exist_ok=True) + child_env = dict(os.environ if env is None else env) + child_env.update(HOME=str(home), XDG_CACHE_HOME=str(home), TMPDIR=str(home), + PYTHONDONTWRITEBYTECODE="1") + marker = repo / ".git" + if marker.is_symlink() or not marker.is_file(): + raise LoopError("sandbox exige ponteiro .git de worktree regular") + args = [bwrap, "--die-with-parent", "--new-session", "--unshare-net", "--unshare-pid", + "--ro-bind", "/", "/", "--dev-bind", "/dev", "/dev", "--proc", "/proc", + "--bind", str(repo), str(repo), "--ro-bind", str(marker), str(marker)] + for directory in writable: + resolved = Path(directory).resolve(strict=True) + if not resolved.is_dir(): + raise LoopError(f"diretório de relatório inválido: {directory}") + args.extend(("--bind", str(resolved), str(resolved))) + args.extend(("--", *argv)) + return command(args, repo, timeout, child_env) + + + +def git(root, *args): + result = command(["git", *args], root) + if result.returncode: + raise LoopError(f"git {args[0]} falhou: {result.stderr.strip()[:300]}") + return result.stdout.strip() + + +def digest(path): + h = hashlib.sha256() + with open(path, "rb") as source: + for block in iter(lambda: source.read(1024 * 1024), b""): + h.update(block) + return h.hexdigest() + + +def number(value, name): + if isinstance(value, bool): + raise LoopError(f"{name}: número inválido") + try: + d = Decimal(str(value)) + except (InvalidOperation, ValueError) as exc: + raise LoopError(f"{name}: número inválido") from exc + if not d.is_finite(): + raise LoopError(f"{name}: número não finito") + return d + + +def bounded_timeout(limit, deadline=None): + if deadline is None: + return limit + remaining = deadline - time.time() + if remaining <= 0: + raise LoopError("limite global de tempo esgotado") + return min(limit, remaining) + + +def within(path, directory): + return path == directory or directory in path.parents + + +def config_at(config_path): + path = Path(config_path).resolve(strict=True) + with path.open("rb") as source: + config = tomllib.load(source) + top = Path(git(path.parent, "rev-parse", "--show-toplevel")).resolve() + if not within(path, top): + raise LoopError("configuração deve estar no repositório avaliado") + loop = config.get("loop", {}) + goal = loop.get("goal", {}) + evaluator = loop.get("evaluator", {}) + if not goal.get("name") or not goal.get("unit") or goal.get("direction") not in ("maximize", "minimize"): + raise LoopError("[loop.goal] requer name, unit e direction maximize|minimize") + target = number(goal.get("target"), "target") + argv = evaluator.get("argv") + if not isinstance(argv, list) or not argv or any(not isinstance(x, str) or not x for x in argv): + raise LoopError("[loop.evaluator].argv deve ser uma lista de argumentos") + # An interpreter may precede the evaluator. The executable script must not + # come from the editable checkout; a bare command in PATH is not auditable. + candidate = argv[1] if Path(argv[0]).name in ("python", "python3", "node", "bun") and len(argv) > 1 else argv[0] + script = Path(candidate) + if not script.is_absolute() or not script.is_file(): + raise LoopError("avaliador precisa ser arquivo absoluto existente fora do worktree") + script = script.resolve(strict=True) + if within(script, top): + raise LoopError("avaliador não pode residir no checkout editável") + expected = evaluator.get("trusted_sha256", "") + if not re.fullmatch(r"[0-9a-fA-F]{64}", expected) or digest(script) != expected.lower(): + raise LoopError("hash aprovado do avaliador não corresponde ao arquivo") + required = evaluator.get("required_checks", []) + if not isinstance(required, list) or not required or any(not isinstance(x, str) or not x for x in required): + raise LoopError("required_checks deve listar os checks obrigatórios do gate") + if evaluator.get("require_gate_verdict", "pass") != "pass": + raise LoopError("loop exige veredito pass no quality gate") + tier = loop.get("tier", 2) + if type(tier) is not int or tier not in range(4): + raise LoopError("[loop].tier deve estar entre 0 e 3") + loop["tier"] = tier + for key in ("max_iterations", "max_minutes", "max_stagnant"): + if type(loop.get(key)) is not int or loop[key] < 1: + raise LoopError(f"[loop].{key} deve ser inteiro positivo") + if number(loop.get("min_improvement"), "min_improvement") <= 0: + raise LoopError("min_improvement deve ser positivo") + if number(loop.get("max_paid_usd", 0), "max_paid_usd") < 0: + raise LoopError("max_paid_usd não pode ser negativo") + if loop.get("harness") not in ("claude", "opencode", "omp"): + raise LoopError("[loop].harness deve ser claude, opencode ou omp") + if not git(top, "status", "--porcelain", "--untracked-files=all") == "": + raise LoopError("working tree do usuário tem alterações; salve/snapshot antes de iniciar") + return path, top, config, script, target + + +def state_root(project): + default = Path(os.environ.get("XDG_STATE_HOME", Path.home() / ".local" / "state")) / "dev-workflows" + root = Path(os.environ.get("DW_STATE_HOME", default)).expanduser().resolve() + if within(root, project) or within(project, root): + raise LoopError("estado do controlador deve ficar fora do checkout do projeto") + return root / hashlib.sha256(os.fsencode(project)).hexdigest()[:20] + + +def prepare_home(root): + root.mkdir(mode=0o700, parents=True, exist_ok=True) + os.chmod(root, 0o700) + + +@contextlib.contextmanager +def locked(home): + prepare_home(home) + with (home / "lock").open("a+") as f: + try: + fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError as exc: + raise LoopError("já existe uma execução ativa neste projeto") from exc + try: + yield + finally: + fcntl.flock(f, fcntl.LOCK_UN) + + +def save(folder, state): + folder.mkdir(mode=0o700, parents=True, exist_ok=True) + path = folder / "state.json" + tmp = folder / f".{uuid.uuid4().hex}.json" + with tmp.open("x") as out: + os.chmod(tmp, 0o600) + json.dump(state, out, ensure_ascii=False, indent=2) + out.flush() + os.fsync(out.fileno()) + os.replace(tmp, path) + + +def load(home, run_id): + if not re.fullmatch(r"[0-9a-f]{32}", run_id): + raise LoopError("ID de execução inválido") + path = home / run_id / "state.json" + if not path.is_file(): + raise LoopError("execução não encontrada") + with path.open() as f: + state = json.load(f) + return path.parent, state + + +def evaluator_result(cfg, script, repo, folder, deadline=None): + if digest(script) != cfg["loop"]["evaluator"]["trusted_sha256"].lower(): + raise LoopError("avaliador protegido foi alterado") + folder.mkdir(mode=0o700, parents=True, exist_ok=True) + env = os.environ.copy() + env["DW_REPORT_DIR"] = str(folder) + argv = cfg["loop"]["evaluator"]["argv"] + result = isolated_command(argv, repo, bounded_timeout( + int(cfg["loop"]["evaluator"].get("timeout_seconds", 600)), deadline), env, writable=[folder]) + if result.returncode: + raise LoopError(f"avaliador retornou {result.returncode}: {result.stderr.strip()[:300]}") + if digest(script) != cfg["loop"]["evaluator"]["trusted_sha256"].lower(): + raise LoopError("avaliador protegido foi alterado durante a avaliação") + try: + data = json.loads(result.stdout, parse_constant=lambda _: (_ for _ in ()).throw(ValueError("NaN"))) + score = number(data["value"], "score") + except (ValueError, KeyError, TypeError, json.JSONDecodeError) as exc: + raise LoopError("avaliador não produziu JSON com score válido") from exc + goal = cfg["loop"]["goal"] + if (data.get("schema_version") != 1 or data.get("metric") != goal["name"] + or data.get("unit") != goal["unit"] or data.get("direction") != goal["direction"]): + raise LoopError("métrica/unidade/direção divergente da meta") + checks = data.get("checks") + if not isinstance(checks, dict) or not checks or any(x != "pass" for x in checks.values()): + raise LoopError("avaliador não aprovou todos os seus checks") + paths = data.get("evidence") + if not isinstance(paths, list) or not paths: + raise LoopError("avaliador não forneceu evidência verificável") + evidence = [] + for raw in paths: + if not isinstance(raw, str): + raise LoopError("caminho inválido de evidência") + p = Path(raw).resolve(strict=False) + if not p.is_file() or not within(p, folder.resolve()): + raise LoopError("evidência deve existir fora do worktree no diretório de relatórios") + evidence.append({"file": str(p), "sha256": digest(p)}) + return score, evidence, checks + + +def attained(score, target, direction): + return score >= target if direction == "maximize" else score <= target + + +def improved(score, best, minimum, direction): + return score - best >= minimum if direction == "maximize" else best - score >= minimum + + +def worktree(project, folder, ref): + if folder.exists(): + raise LoopError(f"worktree já existe: {folder}") + folder.parent.mkdir(mode=0o700, parents=True, exist_ok=True) + git(project, "-c", "core.hooksPath=/dev/null", "worktree", "add", "--detach", str(folder), ref) + return folder + +def assert_worktree(project, repo, expected_head, marker_sha256=None): + """Reject redirected Git pointers or a branch before controller Git writes.""" + marker = repo / ".git" + if marker.is_symlink() or not marker.is_file(): + raise LoopError("ponteiro .git do worktree foi removido ou substituído") + try: + text = marker.read_text(encoding="utf-8") + except (OSError, UnicodeError) as exc: + raise LoopError("ponteiro .git do worktree ilegível") from exc + match = re.fullmatch(r"gitdir: ([^\r\n]+)\r?\n?", text) + if not match: + raise LoopError("ponteiro .git do worktree inválido") + marker_hash = digest(marker) + if marker_sha256 is not None and marker_hash != marker_sha256: + raise LoopError("ponteiro .git do worktree mudou durante a tentativa") + admin = Path(match.group(1)) + admin = (repo / admin).resolve() if not admin.is_absolute() else admin.resolve() + common = Path(git(project, "rev-parse", "--git-common-dir")) + common = (project / common).resolve() if not common.is_absolute() else common.resolve() + if not admin.is_dir() or admin.parent != common / "worktrees": + raise LoopError("gitdir do worktree não pertence ao repositório original") + actual = command(["git", "rev-parse", "--absolute-git-dir"], repo) + if actual.returncode or Path(actual.stdout.strip()).resolve() != admin: + raise LoopError("ponteiro .git redireciona o worktree") + detached = command(["git", "symbolic-ref", "-q", "HEAD"], repo) + if detached.returncode != 1 or git(repo, "rev-parse", "HEAD") != expected_head: + raise LoopError("worktree não está no commit detached esperado") + return marker_hash + + + +def changed_paths(repo, base): + changed = set(git(repo, "diff", "--name-only", base).splitlines()) + changed.update(git(repo, "ls-files", "--others", "--exclude-standard").splitlines()) + return sorted(p for p in changed if p and not p.startswith(".dev-workflows/")) + + +def fingerprint(repo, names): + h = hashlib.sha256() + for name in names: + p = repo / name + h.update(os.fsencode(name)) + h.update(b"\0") + if p.is_symlink(): + h.update(os.fsencode(os.readlink(p))) + elif p.is_file(): + h.update(digest(p).encode()) + h.update(str(p.stat().st_mode & 0o777).encode()) + else: + h.update(b"deleted") + return h.hexdigest() + + +def gate_result(repo, base, tier, required, changes, deadline=None): + t = time.time_ns() + result = isolated_command([sys.executable, str(GATE), "--dir", str(repo), "--base", base, + "--tier", str(tier)], repo, bounded_timeout(3600, deadline)) + report_path = repo / ".dev-workflows" / "gate.json" + if not report_path.is_file() or report_path.stat().st_mtime_ns < t: + raise LoopError("quality gate não gerou relatório atual") + report = json.loads(report_path.read_text()) + if result.returncode or report.get("verdict") != "pass" or report.get("base") != base or report.get("tier") != tier: + raise LoopError(f"quality gate não aprovou o diff: {report.get('verdict', 'sem relatório')}") + checks = {c.get("name"): c.get("status") for c in report.get("checks", [])} + if any(checks.get(name) != "pass" for name in required): + raise LoopError("checks obrigatórios ausentes, não verificados ou falhos") + deleted = set(git(repo, "diff", "--name-only", "--diff-filter=D", base).splitlines()) + if not set(changes).difference(deleted).issubset(set(report.get("changed_files", []))): + raise LoopError("quality gate não cobriu todos os arquivos alterados") + return {"verdict": report["verdict"], "tier": tier, "checks": checks, + "base": base, "changed_files": report["changed_files"], "sha256": digest(report_path)} + + +def role_model(config, tool, role, cwd): + models = config.get("models", {}) + role_cfg = models.get("roles", {}).get(role, {}) + if role_cfg.get("model_key"): + if not role_cfg.get("manual_unranked_approval", False): + raise LoopError(f"{role}: modelo fixado sem aprovação explícita unranked") + if tool != "claude" or role_cfg.get("billing_mode") != "claude_subscription": + raise LoopError("modelo fixo não substitui descoberta de disponibilidade/conta em OpenCode ou OMP") + model_key = role_cfg["model_key"] + if model_key not in ("haiku", "sonnet", "opus", "inherit"): + raise LoopError("Claude por assinatura aceita apenas aliases de modelo suportados") + return {"model_key": model_key, "billing_mode": "claude_subscription", + "score": None, "reason": "unranked: fixado explicitamente pelo usuário"} + providers = models.get("allowed_providers") + if not isinstance(providers, list) or not providers or any(not isinstance(x, str) for x in providers): + raise LoopError("[models].allowed_providers deve listar os providers autorizados da conta") + argv = [sys.executable, str(MODEL_CATALOG), "route", "--tool", tool, "--role", role, + "--providers", ",".join(providers), "--format", "json", + "--budget-usd", str(number(config["loop"].get("max_paid_usd", 0), "max_paid_usd"))] + if models.get("benchmark_metric"): + argv.extend(["--benchmark-metric", models["benchmark_metric"]]) + if models.get("bands"): + argv.extend(["--bands-json", json.dumps(models["bands"])]) + for key, flag in (("max_price_age_hours", "--max-price-age-hours"), + ("max_score_age_days", "--max-score-age-days")): + if key in models: + argv.extend([flag, str(models[key])]) + if role_cfg.get("band"): + argv.extend(["--band", role_cfg["band"]]) + if "max_loss_points" in role_cfg: + argv.extend(["--max-loss-points", str(role_cfg["max_loss_points"])]) + if "tokens" in role_cfg: + argv.extend(["--tokens", json.dumps(role_cfg["tokens"])]) + if (models.get("allow_proxy_score") and role_cfg.get("allow_proxy_score", True) + and config["loop"]["tier"] < 3): + argv.append("--allow-proxy-score") + if models.get("cache_dir"): + argv.extend(["--cache-dir", models["cache_dir"]]) + p = command(argv, cwd) + if p.returncode: + raise LoopError(f"roteamento {role}: {p.stderr.strip()[:300]}") + try: + result = json.loads(p.stdout) + selected = result.get("selected") + if not selected or not selected.get("model_key"): + raise LoopError(f"{role}: sem modelo elegível: {result.get('reason', 'sem nota')}") + except (ValueError, AttributeError) as exc: + raise LoopError("roteador não devolveu JSON válido") from exc + return selected + + +def authorize(config, model, remaining): + billing = model.get("billing_mode") + if billing in ("free", "subscription", "claude_subscription"): + return + if billing == "go": + quota = model.get("quota_window_remaining") + debit = model.get("quota_window_debit") + if (not isinstance(quota, dict) or not isinstance(debit, dict) or + any(k not in quota or k not in debit or number(quota[k], k) < number(debit[k], k) + for k in ("5h", "weekly", "monthly"))): + raise SafetyPause("Go: cota não confirmada nas três janelas; sem fallback para saldo Zen") + if model.get("use_balance_fallback") is not False: + raise SafetyPause("Go: fallback para saldo Zen desconhecido ou cobrado; não autorizado") + return + if billing not in ("zen", "payg"): + raise SafetyPause("modalidade de cobrança desconhecida; despacho não autorizado") + label = "Zen" if billing == "zen" else "API paga" + if model.get("balance_confirmed") is not True: + raise SafetyPause(f"{label}: saldo ou permissão de cobrança da conta não confirmado") + cap = number(config["loop"].get("max_paid_usd", 0), "max_paid_usd") + estimate = model.get("estimated_native_usd") + if cap == 0 or estimate is None or number(estimate, "estimated_native_usd") > cap - remaining: + raise SafetyPause(f"{label}: orçamento explícito e estimativa nativa atual são obrigatórios") + if not sys.stdin.isatty(): + raise SafetyPause(f"{label}: autorização interativa exigida imediatamente antes do gasto") + question = (f"Autorizar {model['model_key']} via {label}, estimativa USD {estimate}, " + f"limite restante USD {cap - remaining}? Digite SIM: ") + if input(question) != "SIM": + raise SafetyPause(f"gasto {label} não autorizado") + +def mark_call_pending(state, folder, model): + if model.get("billing_mode") in ("zen", "payg", "go"): + state["unreconciled_paid_call"] = True + save(folder, state) + + + +def selected_roles(config, cwd): + tier = config["loop"]["tier"] + roles = ["implementer"] + if tier >= 2: + roles = ["planner", "implementer", "reviewer"] + if tier >= 3: + roles.append("security-auditor") + return {role: role_model(config, config["loop"]["harness"], role, cwd) for role in roles} + + +def same_route(previous, current): + return all(previous.get(key) == current.get(key) for key in + ("model_key", "billing_mode", "provider", "variant", "estimated_native_usd", "native_tariff")) + + +def verified_model(config, state, role): + previous = state["route_plan"][role] + if previous.get("billing_mode") == "claude_subscription": + return previous # CLI authentication is checked immediately before dispatch. + try: + current = role_model(config, config["loop"]["harness"], role, Path(state["project"])) + except LoopError as exc: + raise SafetyPause(f"{role}: disponibilidade, preço ou quota não revalidada: {exc}") from exc + if not same_route(previous, current): + raise SafetyPause(f"{role}: rota ou tarifa mudou; novo plan e aprovação necessários") + if current.get("billing_mode") == "go": + for key in ("5h", "weekly", "monthly"): + current["quota_window_remaining"][key] = str(min( + number(previous["quota_window_remaining"][key], key), + number(current["quota_window_remaining"][key], key))) + state["route_plan"][role] = current + return current + + +def report_run(state): + return {k: state.get(k) for k in + ("run_id", "status", "baseline_score", "best_score", "target", "iteration", + "best_commit", "best_worktree", "spent_paid_usd", "elapsed_seconds", + "baseline_evidence", "baseline_checks", "baseline_gate", "attempts", + "route_plan", "gate_sha256", "evaluator_sha256", "error")} + + +def plan(config_path): + path, project, cfg, script, target = config_at(config_path) + preflight_isolation(project) + routes = {} + roles = (["planner", "implementer", "reviewer", "security-auditor"] if cfg["loop"]["tier"] >= 3 + else ["planner", "implementer", "reviewer"] if cfg["loop"]["tier"] >= 2 else ["implementer"]) + preflight = command([sys.executable, str(GATE), "--dir", str(project), + "--base", git(project, "rev-parse", "HEAD"), + "--tier", str(cfg["loop"]["tier"]), "--list"], project) + if preflight.returncode: + raise LoopError(f"quality gate indisponível: {preflight.stderr.strip()[:300]}") + planned = {fields[1]: " ".join(fields[3:]) for line in preflight.stdout.splitlines() + if len(fields := line.split()) >= 4 and fields[0].startswith("T")} + gate = {name: planned.get(name, "ausente") for name in cfg["loop"]["evaluator"]["required_checks"]} + for role in roles: + try: + routes[role] = role_model(cfg, cfg["loop"]["harness"], role, project) + except LoopError as exc: + routes[role] = {"status": "unavailable", "reason": str(exc)} + return {"config": str(path), "enabled": cfg["loop"].get("enabled", False), "root": str(project), + "evaluator_sha256": digest(script), "gate_sha256": digest(GATE), + "baseline": "not_run", "target": str(target), + "tier": cfg["loop"]["tier"], "routes": routes, "gate_preflight": gate, + "risks": ["modelos e permissões devem ser revalidados antes de cada chamada", + "worktree não substitui isolamento de processo e acesso a rede", + "preço OpenRouter não equivale à cobrança da ferramenta"], + "max_paid_usd": str(number(cfg["loop"].get("max_paid_usd", 0), "max_paid_usd"))} + + +def new_run(config_path): + path, project, cfg, script, target = config_at(config_path) + if cfg["loop"].get("enabled") is not True: + raise LoopError("loop desativado: habilite [loop].enabled explicitamente") + home = state_root(project) + with locked(home): + routes = selected_roles(cfg, project) + for model in routes.values(): + if (model.get("billing_mode") in ("zen", "payg") + and number(cfg["loop"].get("max_paid_usd", 0), "max_paid_usd") == 0): + raise LoopError("modelo pago: gasto não autorizado; max_paid_usd=0") + base = git(project, "rev-parse", "HEAD") + run_id = uuid.uuid4().hex + folder = home / run_id + folder.mkdir(mode=0o700) + work = worktree(project, folder / "worktrees" / "baseline", base) + state = {"version": 1, "run_id": run_id, "project": str(project), "config": str(path), + "config_sha256": digest(path), "evaluator_sha256": digest(script), + "gate_sha256": digest(GATE), "base": base, + "best_commit": base, "best_worktree": str(work), "best_score": None, + "baseline_score": None, + "target": str(target), "iteration": 0, "spent_paid_usd": "0", "stagnant": 0, + "started_at": time.time(), "elapsed_seconds": 0, "status": "planned", "attempts": [], + "route_plan": routes} + save(folder, state) + try: + deadline = state["started_at"] + cfg["loop"]["max_minutes"] * 60 + score, evidence, checks = evaluator_result( + cfg, script, work, folder / "evidence" / "baseline", deadline) + if changed_paths(work, base): + raise LoopError("avaliador modificou baseline; medição inicial inválida") + state.update(best_score=str(score), baseline_score=str(score), baseline_evidence=evidence, + baseline_checks=checks, status="baselined") + save(folder, state) + if attained(score, target, cfg["loop"]["goal"]["direction"]): + state["baseline_gate"] = gate_result(work, base, cfg["loop"]["tier"], + cfg["loop"]["evaluator"]["required_checks"], [], deadline) + state["status"] = "success" + save(folder, state) + else: + iterate(folder, state, cfg, script) + except (LoopError, OSError, ValueError) as exc: + state.update(status="error", error=str(exc)) + save(folder, state) + return report_run(state) + + +def check_resumption(state, cfg, project, script, path): + if state["project"] != str(project) or state["config_sha256"] != digest(path): + raise LoopError("configuração/checkout mudou desde o início; não retomar automaticamente") + if (state["evaluator_sha256"] != digest(script) or state["gate_sha256"] != digest(GATE) + or git(project, "rev-parse", "HEAD") != state["base"]): + raise LoopError("avaliador, gate ou base Git mudaram; retomar exige nova avaliação") + if state["status"] not in ("exhausted", "paused", "running", "baselined"): + raise LoopError(f"execução com estado {state['status']} não pode ser retomada") + if state.get("unreconciled_paid_call"): + raise LoopError("tentativa paga com consumo/quota indeterminados; concilie antes de novo run") + routes = selected_roles(cfg, project) + if set(routes) != set(state["route_plan"]) or any( + not same_route(state["route_plan"][role], fresh) for role, fresh in routes.items()): + raise LoopError("catálogo, preço, conta ou modelos mudaram; não retomar sem novo plan") + if not Path(state["best_worktree"]).is_dir(): + raise LoopError("worktree vencedor foi removido; não retomar") + + +def resume_run(config_path, run_id): + path, project, cfg, script, target = config_at(config_path) + home = state_root(project) + with locked(home): + folder, state = load(home, run_id) + check_resumption(state, cfg, project, script, path) + if (state["status"] == "running" and len(state["attempts"]) < state["iteration"] + and any(row.get("billing_mode") in ("zen", "payg", "go") for row in state["route_plan"].values())): + raise LoopError("tentativa paga interrompida: consumo/quota indeterminados; concilie antes de novo run") + if cfg["loop"].get("enabled") is not True: + raise LoopError("loop desativado") + if state["status"] == "running" and len(state["attempts"]) < state["iteration"]: + state["attempts"].append({"iteration": state["iteration"], "result": "interrupted", "reason": "tentativa interrompida, não reutilizada"}) + state["status"] = "baselined" + save(folder, state) + try: + iterate(folder, state, cfg, script) + except (LoopError, OSError, ValueError) as exc: + state.update(status="error", error=str(exc)) + save(folder, state) + return report_run(state) + + +def iterate(folder, state, cfg, script): + from harness_runner import invoke + + minimum = number(cfg["loop"]["min_improvement"], "min_improvement") + target = number(state["target"], "target") + project = Path(state["project"]) + path = Path(state["config"]) + direction = cfg["loop"]["goal"]["direction"] + deadline = state["started_at"] + cfg["loop"]["max_minutes"] * 60 + while state["iteration"] < cfg["loop"]["max_iterations"]: + if (folder / "stop.requested").exists(): + state["status"] = "cancelled" + break + if time.time() >= deadline: + state["status"] = "exhausted" + break + if state["stagnant"] >= cfg["loop"]["max_stagnant"]: + state["status"] = "exhausted" + break + if (digest(path) != state["config_sha256"] or digest(script) != state["evaluator_sha256"] + or digest(GATE) != state["gate_sha256"]): + state["status"] = "paused" + state["error"] = "configuração, avaliador ou gate alterado durante a execução" + break + if git(project, "rev-parse", "HEAD") != state["base"] or git(project, "status", "--porcelain", "--untracked-files=all"): + state["status"] = "paused" + state["error"] = "checkout original alterado durante a execução; preservar mudanças do usuário" + break + step = state["iteration"] + 1 + base = state["best_commit"] + work = worktree(project, folder / "worktrees" / f"iteration-{step:03}", base) + marker_hash = assert_worktree(project, work, base) + state.update(status="running", iteration=step) + save(folder, state) + attempt = {"iteration": step, "worktree": str(work), "from": base} + paid = number(state["spent_paid_usd"], "spent_paid_usd") + try: + tool = cfg["loop"]["harness"] + routes = state["route_plan"] + timeout = int(cfg["loop"].get("agent_timeout_seconds", 900)) + prompt = (f"Use dev-router com tier mínimo {cfg['loop']['tier']}. Meta do aplicativo: " + f"{cfg['loop']['goal']['name']} {direction} {target} {cfg['loop']['goal']['unit']}. " + f"Score atual {state['best_score']}. Faça UMA hipótese pequena por iteração; " + "preserve testes e quality gate. Não modifique o avaliador, config, catálogos ou testes protegidos. " + "Não publique, instale dependências ou produza efeitos externos sem autorização. " + f"Feedback anterior: {state['attempts'][-1]['reason'] if state['attempts'] else 'nenhum'}. ") + if "planner" in routes: + model = verified_model(cfg, state, "planner") + authorize(cfg, model, paid) + mark_call_pending(state, folder, model) + planned = invoke(tool, "planner", prompt + "Planeje uma única hipótese; só leitura.", str(work), + model["model_key"], timeout=bounded_timeout(timeout, deadline), + env={"DEV_WORKFLOWS_AUTONOMOUS": "1"}) + assert_worktree(project, work, base, marker_hash) + paid = charged(planned, model, cfg, state, folder) + if planned["returncode"]: + raise SafetyPause("planejamento falhou; nenhuma outra chamada autorizada") + prompt += "Plano (não é autorização): " + planned["output"][:3000] + ". " + model = verified_model(cfg, state, "implementer") + authorize(cfg, model, paid) + mark_call_pending(state, folder, model) + done = invoke(tool, "implementer", prompt + "Implemente e relate nível declarado e evidências.", str(work), + model["model_key"], timeout=bounded_timeout(timeout, deadline), + env={"DEV_WORKFLOWS_AUTONOMOUS": "1"}) + paid = charged(done, model, cfg, state, folder) + if done["returncode"]: + raise SafetyPause("agente de implementação falhou; nenhuma outra chamada autorizada") + assert_worktree(project, work, base, marker_hash) + changes = changed_paths(work, base) + if not changes: + raise LoopError("agente não modificou código verificável") + if path.relative_to(project).as_posix() in changes or any(c.startswith(".dev-workflows/") for c in changes): + raise LoopError("tentativa alterou configuração ou estado protegido") + if (git(project, "rev-parse", "HEAD") != state["base"] + or git(project, "status", "--porcelain", "--untracked-files=all")): + raise LoopError("checkout original alterado durante a tentativa; preservar mudanças do usuário") + assert_worktree(project, work, base, marker_hash) + # This commit is only a candidate in a detached worktree, never a promotion. + git(work, "add", "-A", "--", ".", ":(exclude).dev-workflows/**") + git(work, "-c", "core.hooksPath=/dev/null", "-c", "commit.gpgSign=false", + "-c", "user.name=Dev Workflows", "-c", "user.email=dev-workflows@localhost", + "commit", "-m", f"dev-workflows: candidate iteration {step}") + candidate_commit = git(work, "rev-parse", "HEAD") + assert_worktree(project, work, candidate_commit, marker_hash) + if git(project, "rev-parse", "HEAD") != state["base"]: + raise LoopError("checkout original alterado durante o snapshot") + + # Gate/review the exact commit, not agent-created ignored files. + verified = worktree(project, folder / "verification" / "worktrees" / f"iteration-{step:03}", candidate_commit) + verified_marker = assert_worktree(project, verified, candidate_commit) + if changed_paths(verified, base) != changes: + raise LoopError("snapshot da tentativa diverge dos arquivos alterados") + before = fingerprint(verified, changes) + gate = gate_result(verified, base, cfg["loop"]["tier"], + cfg["loop"]["evaluator"]["required_checks"], changes, deadline) + assert_worktree(project, verified, candidate_commit, verified_marker) + if changed_paths(verified, base) != changes or before != fingerprint(verified, changes): + raise LoopError("código mudou durante o quality gate") + attempt["gate"] = gate + for role in ("reviewer", "security-auditor"): + if role in routes: + model = verified_model(cfg, state, role) + authorize(cfg, model, paid) + mark_call_pending(state, folder, model) + review = invoke(tool, role, "Revise exclusivamente o diff da tentativa. Responda JSON: " + '{"verdict":"pass|fail","findings":[]}.', str(verified), model["model_key"], + timeout=bounded_timeout(timeout, deadline), + env={"DEV_WORKFLOWS_AUTONOMOUS": "1"}) + paid = charged(review, model, cfg, state, folder) + if review["returncode"]: + raise SafetyPause(f"{role} falhou; nenhuma outra chamada autorizada") + if review_verdict(review["output"]) != "pass": + raise LoopError(f"{role} rejeitou ou não concluiu a revisão") + assert_worktree(project, verified, candidate_commit, verified_marker) + if changed_paths(verified, base) != changes or fingerprint(verified, changes) != before: + raise LoopError("código mudou depois do gate/revisão") + + # Score a second clean checkout: gate artifacts cannot bias the metric. + scored = worktree(project, folder / "scoring" / "worktrees" / f"iteration-{step:03}", candidate_commit) + scored_marker = assert_worktree(project, scored, candidate_commit) + try: + score, evidence, checks = evaluator_result( + cfg, script, scored, folder / "evidence" / f"iteration-{step:03}", deadline) + except LoopError as exc: + raise SafetyPause(f"avaliador inválido: {exc}") from exc + assert_worktree(project, scored, candidate_commit, scored_marker) + if (changed_paths(scored, candidate_commit) or digest(path) != state["config_sha256"] + or git(project, "rev-parse", "HEAD") != state["base"]): + raise LoopError("código/configuração/base mudou durante a avaliação") + attempt.update(score=str(score), evidence=evidence, evaluator_checks=checks) + best = number(state["best_score"], "best_score") + if not improved(score, best, minimum, direction): + raise LoopError(f"sem melhoria mínima sobre {best}: score {score}") + bounded_timeout(1, deadline) + state.update(best_commit=candidate_commit, best_worktree=str(scored), best_score=str(score), stagnant=0) + attempt.update(result="accepted", reason="melhoria medida em snapshot limpo e gate aprovado", + commit=candidate_commit) + if attained(score, target, direction): + state["status"] = "success" + except SafetyPause as exc: + attempt.update(result="paused", reason=str(exc)) + state["status"] = "paused" + except RuntimeError as exc: + attempt.update(result="paused", reason=f"runtime recusou ou falhou: {exc}") + state["status"] = "paused" + except (LoopError, OSError, ValueError) as exc: + attempt.update(result="rejected", reason=str(exc)) + state["stagnant"] += 1 + state["attempts"].append(attempt) + state["elapsed_seconds"] = round(time.time() - state["started_at"], 2) + save(folder, state) + if state["status"] in ("success", "paused"): + break + else: + state["status"] = "exhausted" + if state["status"] == "running": + state["status"] = "exhausted" + save(folder, state) + + +def usage_cost(result, model): + value = (result.get("usage") or {}).get("cost_usd") + if model.get("billing_mode") in ("zen", "payg") and value is None: + raise SafetyPause("modelo pago: custo real da chamada não foi informado; pausa obrigatória") + cost = number(value, "cost_usd") if value is not None else Decimal(0) + if cost < 0: + raise SafetyPause("custo negativo informado pelo provedor; pausa obrigatória") + if model.get("billing_mode") == "go": + quota = model["quota_window_remaining"] + debit = model["quota_window_debit"] + for window in ("5h", "weekly", "monthly"): + quota[window] = str(number(quota[window], window) - number(debit[window], window)) + return cost if model.get("billing_mode") in ("zen", "payg") else Decimal(0) + + +def charged(result, model, config, state, folder): + total = number(state["spent_paid_usd"], "spent_paid_usd") + usage_cost(result, model) + state["spent_paid_usd"] = str(total) + if model.get("billing_mode") in ("zen", "payg", "go"): + state["unreconciled_paid_call"] = False + save(folder, state) + if (model.get("billing_mode") in ("zen", "payg") + and total > number(config["loop"]["max_paid_usd"], "max_paid_usd")): + raise SafetyPause(f"modelo pago: custo real USD {total} excedeu limite aprovado; nenhuma outra chamada autorizada") + return total + + +def review_verdict(output): + try: + report = json.loads(output) + except ValueError: + return "invalid" + return report.get("verdict") if report.get("verdict") in ("pass", "fail") and isinstance(report.get("findings"), list) else "invalid" + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("action", choices=("plan", "run", "status", "resume", "stop")) + parser.add_argument("--config", default=".dev-workflows.toml") + parser.add_argument("--run", dest="run_id") + args = parser.parse_args(argv) + try: + if args.action == "plan": + result = plan(args.config) + elif args.action == "run": + result = new_run(args.config) + else: + if not args.run_id: + raise LoopError("--run obrigatório") + path = Path(args.config).resolve(strict=True) + project = Path(git(path.parent, "rev-parse", "--show-toplevel")).resolve() + home = state_root(project) + if args.action == "resume": + result = resume_run(args.config, args.run_id) + else: + folder, state = load(home, args.run_id) + if args.action == "stop": + (folder / "stop.requested").touch(exist_ok=True) + result = report_run(state) + print(json.dumps(result, indent=2, ensure_ascii=False)) + return 0 if args.action in ("plan", "status", "stop") or result.get("status") == "success" else 1 + except (LoopError, FileNotFoundError, tomllib.TOMLDecodeError) as exc: + print(json.dumps({"status": "error", "reason": str(exc)}, ensure_ascii=False), file=sys.stderr) + return 2 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/harness_runner.py b/scripts/harness_runner.py new file mode 100755 index 0000000..c76e3ed --- /dev/null +++ b/scripts/harness_runner.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python3 +"""Execução headless e conservadora para Claude Code, OpenCode e OMP.""" +from __future__ import annotations + +import importlib.util +import json +import os +import re +import shutil +import secrets +import subprocess +import tempfile +from pathlib import Path +from typing import Any, Mapping + +ROOT = Path(__file__).resolve().parent.parent +AGENTS = ROOT / "agents" +OMP_TOOLS = { + "Read": "read", "Edit": "edit", "Write": "write", "Bash": "bash", + "Grep": "grep", "Glob": "glob", "WebFetch": "web_search", + "WebSearch": "web_search", "NotebookEdit": "notebook", +} + +OMP_THINKING_LEVELS = {"off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"} + + + +class HarnessError(RuntimeError): + """Harness request cannot be safely or exactly dispatched.""" + + +def _load_catalog_module(): + path = ROOT / "scripts" / "model_catalog.py" + spec = importlib.util.spec_from_file_location("dev_workflows_model_catalog", path) + if spec is None or spec.loader is None: + raise HarnessError("catálogo local indisponível") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def _agent(role: str) -> tuple[dict[str, str], str]: + if not re.fullmatch(r"[a-z][a-z0-9-]*", role): + raise HarnessError(f"papel inválido: {role!r}") + path = AGENTS / f"{role}.md" + try: + text = path.read_text(encoding="utf-8") + except OSError as exc: + raise HarnessError(f"papel desconhecido: {role}") from exc + match = re.match(r"\A---\n(.*?)\n---\n(.*)\Z", text, re.S) + if not match: + raise HarnessError(f"frontmatter inválido para papel {role}") + meta = dict(re.findall(r"^(\w+):\s*(.*)$", match.group(1), re.M)) + if meta.get("name") != role: + raise HarnessError(f"identidade inválida para papel {role}") + return meta, match.group(2).replace("${CLAUDE_PLUGIN_ROOT}", str(ROOT)) + + +def _model_for_cli(tool: str, model_key: str, meta: dict[str, str]) -> tuple[str | None, str]: + """Return CLI selector and exact catalog key; never strip an unsupported variant.""" + if not isinstance(model_key, str) or not model_key: + raise HarnessError("model_key obrigatório") + if tool == "claude": + if model_key == "inherit": + inherited = meta.get("model", "") + if inherited == "inherit": + raise HarnessError("Claude `inherit` não identifica um modelo verificável para este papel") + selector = inherited + catalog_key = inherited + else: + selector = model_key + catalog_key = model_key + if selector not in {"haiku", "sonnet", "opus"} and not re.fullmatch(r"claude-[A-Za-z0-9.-]+", selector): + raise HarnessError("Claude CLI aceita aliases haiku/sonnet/opus ou IDs Claude; model_key não é exato para esta ferramenta") + return (None if model_key == "inherit" else selector), catalog_key + if model_key == "inherit": + raise HarnessError("inherit não identifica provider/model para esta ferramenta") + if not re.fullmatch(r"[A-Za-z0-9_.-]+/[A-Za-z0-9_.:+/-]+(?:#[A-Za-z0-9_.+-]+)?", model_key): + raise HarnessError(f"model_key inválido ou não exato para {tool}: {model_key!r}") + return model_key, model_key + + +def _require_catalog_entry(tool: str, model_key: str, cache_dir: str | None) -> dict[str, Any]: + catalog = _load_catalog_module() + snapshot = catalog.load_snapshot(tool, cache_dir) + if not isinstance(snapshot, dict) or snapshot.get("tool") != tool: + raise HarnessError(f"snapshot local de {tool} indisponível; despacho bloqueado") + matches = [row for row in snapshot.get("models", []) + if isinstance(row, dict) and row.get("tool") == tool and row.get("model_key") == model_key] + if len(matches) != 1: + raise HarnessError(f"model_key {model_key!r} não é um ID exato e único no catálogo local de {tool}") + availability = matches[0].get("availability") + if not isinstance(availability, dict) or any(availability.get(field) is not True + for field in ("local_listed", "authenticated", "entitled")): + raise HarnessError(f"disponibilidade/autorização local não verificada para {model_key!r}; despacho bloqueado") + return matches[0] + +def _role_tools(meta: dict[str, str]) -> list[str]: + declared = {item.strip() for item in meta.get("tools", "").split(",") if item.strip()} + return [name for name in ("Read", "Grep", "Glob", "Edit", "Write") if name in declared] + + +def _opencode_loop_agent(meta: dict[str, str], role_prompt: str) -> str: + tools = set(_role_tools(meta)) + allowed = { + "read": "Read" in tools, + "edit": bool(tools & {"Edit", "Write"}), + "glob": "Glob" in tools, + "grep": "Grep" in tools, + "list": False, + "bash": False, + "task": False, + "external_directory": False, + "todowrite": False, + "webfetch": False, + "websearch": False, + "lsp": False, + "skill": False, + "question": False, + "doom_loop": False, + } + lines = ["---", f"description: {json.dumps(meta['description'], ensure_ascii=False)}", + "mode: primary", "permission:", ' "*": deny'] + lines.extend(f" {name}: {'allow' if enabled else 'deny'}" for name, enabled in allowed.items()) + return "\n".join(lines + ["---", "", role_prompt]) + + +def _memfd(contents: bytes) -> int: + if not hasattr(os, "memfd_create"): + raise HarnessError("sandbox requer suporte a memfd para config efêmera") + fd = os.memfd_create("dev-workflows-harness") + os.write(fd, contents) + os.lseek(fd, 0, os.SEEK_SET) + return fd + + +def _within(path: Path, root: Path) -> bool: + return path == root or root in path.parents + + +def _validate_autonomous_worktree(cwd: str) -> None: + worktree = Path(cwd).resolve() + if worktree.parent.name != "worktrees" or not ( + worktree.name == "baseline" or re.fullmatch(r"iteration-[0-9]+", worktree.name) + ): + raise HarnessError("modo autônomo exige worktree isolado baseline/iteration-*") + checkout = ROOT.resolve() + if _within(worktree, checkout) or _within(checkout, worktree): + raise HarnessError("modo autônomo não pode gravar no checkout de origem") + marker = worktree / ".git" + if marker.is_symlink() or not marker.is_file(): + raise HarnessError("cwd autônomo não é um git worktree") + match = re.fullmatch(r"gitdir:\s*(.+)\s*", marker.read_text(encoding="utf-8")) + if not match: + raise HarnessError("ponteiro .git inválido no worktree autônomo") + gitdir = Path(match.group(1)) + if not gitdir.is_absolute(): + gitdir = worktree / gitdir + gitdir = gitdir.resolve() + if not gitdir.is_dir() or _within(gitdir, worktree): + raise HarnessError("gitdir do worktree autônomo ausente ou inseguro") + + +def _sandbox_path(cwd: str, env: dict[str, str]) -> str: + worktree = Path(cwd).resolve() + entries: list[str] = [] + seen: set[Path] = set() + for entry in env.get("PATH", "").split(os.pathsep): + path = Path(entry or cwd).expanduser() + if not path.is_absolute(): + path = worktree / path + try: + path = path.resolve() + except OSError: + continue + if not path.is_dir() or _within(path, worktree) or path in seen: + continue + seen.add(path) + entries.append(str(path)) + return os.pathsep.join(entries) + + +def _sandbox_command(tool: str, command: list[str], cwd: str, env: dict[str, str], + opencode_agent: str | None = None, temp_root: str | None = None + ) -> tuple[list[str], tuple[int, ...]]: + if env.get("DEV_WORKFLOWS_AUTONOMOUS") != "1": + return command, () + bwrap = shutil.which("bwrap", path="/usr/bin:/bin") + if not bwrap: + raise HarnessError("modo autônomo requer bwrap; despacho bloqueado") + if not temp_root: + raise HarnessError("sandbox sem diretório temporário privado") + temp_data = f"{temp_root}/data" + temp_config = f"{temp_root}/config" + args = [ + bwrap, "--unshare-all", "--share-net", "--die-with-parent", + "--ro-bind", "/", "/", "--proc", "/proc", "--dev", "/dev", + "--bind", temp_root, temp_root, + "--dir", f"{temp_root}/tmp", "--dir", f"{temp_root}/cache", + "--dir", f"{temp_root}/state", "--dir", temp_data, + ] + args.extend(("--setenv", "PATH", _sandbox_path(cwd, env))) + pass_fds: list[int] = [] + if tool == "opencode": + for directory in (temp_config, f"{temp_config}/opencode", f"{temp_config}/opencode/agents", + f"{temp_data}/opencode"): + args.extend(("--dir", directory)) + args.extend(("--setenv", "XDG_CONFIG_HOME", temp_config, + "--setenv", "XDG_DATA_HOME", temp_data, + "--setenv", "TMPDIR", f"{temp_root}/tmp")) + config_home = Path(env.get("XDG_CONFIG_HOME", str(Path.home() / ".config"))) + configured = env.get("OPENCODE_CONFIG") + if not configured: + for filename in ("opencode.json", "opencode.jsonc"): + candidate = config_home / "opencode" / filename + if candidate.is_file(): + configured = str(candidate) + break + if configured: + args.extend(("--setenv", "OPENCODE_CONFIG", configured)) + auth_home = Path(env.get("XDG_DATA_HOME", str(Path.home() / ".local" / "share"))) + auth_file = auth_home / "opencode" / "auth.json" + if auth_file.is_file(): + auth_target = f"{temp_data}/opencode/auth.json" + fd = _memfd(b"") + pass_fds.append(fd) + args.extend(("--file", str(fd), auth_target, "--ro-bind", str(auth_file), auth_target)) + if opencode_agent is not None: + role_name = command[command.index("--agent") + 1] + agent_target = f"{temp_config}/opencode/agents/{role_name}.md" + fd = _memfd(opencode_agent.encode("utf-8")) + pass_fds.append(fd) + args.extend(("--file", str(fd), agent_target)) + args.extend(("--setenv", "XDG_CACHE_HOME", f"{temp_root}/cache", + "--setenv", "XDG_STATE_HOME", f"{temp_root}/state")) + else: + args.extend(("--setenv", "TMPDIR", f"{temp_root}/tmp", + "--setenv", "XDG_CACHE_HOME", f"{temp_root}/cache", + "--setenv", "XDG_STATE_HOME", f"{temp_root}/state")) + if tool == "omp": + args.extend(("--dir", f"{temp_root}/omp-agent", + "--setenv", "PI_CODING_AGENT_DIR", f"{temp_root}/omp-agent")) + elif tool == "claude": + args.extend(("--setenv", "CLAUDE_CODE_SKIP_PROMPT_HISTORY", "1")) + marker = str(Path(cwd) / ".git") + args.extend(("--bind", cwd, cwd, "--ro-bind", marker, marker, "--chdir", cwd, "--", *command)) + # The network namespace is shared for provider APIs; it is not an API-only egress filter. + return args, tuple(pass_fds) + + +def _run_process(command: list[str], cwd: str, env: dict[str, str], timeout: float, tool: str, + opencode_agent: str | None = None) -> subprocess.CompletedProcess: + autonomous = env.get("DEV_WORKFLOWS_AUTONOMOUS") == "1" + temp_dir = None + pass_fds: tuple[int, ...] = () + try: + if autonomous: + safe_path = _sandbox_path(cwd, env) + if not safe_path: + raise HarnessError("PATH seguro vazio; despacho bloqueado") + executable = shutil.which(command[0], path=safe_path) + if not executable: + raise HarnessError(f"CLI {command[0]!r} não encontrado em PATH seguro") + if _within(Path(executable).resolve(), Path(cwd).resolve()): + raise HarnessError(f"CLI {command[0]!r} está dentro do worktree; despacho bloqueado") + command = [executable, *command[1:]] + temp_dir = tempfile.TemporaryDirectory(prefix="dev-workflows-harness-", dir="/tmp") + wrapped, pass_fds = _sandbox_command( + tool, command, cwd, env, opencode_agent, temp_dir.name if temp_dir else None + ) + return subprocess.run(wrapped, cwd=cwd, env=env, capture_output=True, text=True, + errors="replace", timeout=timeout, check=False, pass_fds=pass_fds) + finally: + for fd in pass_fds: + os.close(fd) + if temp_dir is not None: + temp_dir.cleanup() + + +def _claude_auth_status(cwd: str, env: dict[str, str], timeout: float) -> bool: + try: + result = _run_process(["claude", "auth", "status", "--json"], cwd, env, timeout, "claude") + except (OSError, subprocess.TimeoutExpired): + return False + if result.returncode != 0: + return False + try: + status = json.loads(result.stdout) + except json.JSONDecodeError: + return False + return isinstance(status, dict) and status.get("loggedIn") is True + + +def _omp_cli_model(row: dict[str, Any], model_key: str) -> tuple[str, str | None]: + variant = row.get("variant") + if variant is None: + if "#" in model_key: + raise HarnessError(f"model_key OMP variante sem metadado variant: {model_key!r}") + return model_key, None + if variant not in OMP_THINKING_LEVELS: + raise HarnessError(f"OMP CLI não oferece seleção exata da variante {variant!r}") + base_key, separator, key_variant = model_key.rpartition("#") + if not separator or key_variant != variant: + raise HarnessError(f"variante OMP não corresponde ao model_key canônico {model_key!r}") + provider, model_id = row.get("provider"), row.get("model_id") + if not isinstance(provider, str) or not isinstance(model_id, str) or base_key != f"{provider}/{model_id}": + raise HarnessError(f"provider/model_id do catálogo não confirma {model_key!r}") + return base_key, variant + + + + +def _local_models_command(tool: str, model_key: str, cwd: str, env: dict[str, str], + timeout: float, thinking: str | None = None) -> bool: + provider, model = model_key.split("/", 1) + base_model = model.split("#", 1)[0] + autonomous = env.get("DEV_WORKFLOWS_AUTONOMOUS") == "1" + if tool == "opencode": + command = ["opencode"] + (["--pure"] if autonomous else []) + ["models", provider] + else: + command = ["omp"] + (["--no-extensions"] if autonomous else []) + ["models", provider, "--json"] + try: + result = _run_process(command, cwd, env, timeout, tool) + except (OSError, subprocess.TimeoutExpired): + return False + if result.returncode != 0: + return False + if tool == "omp": + try: + payload = json.loads(result.stdout) + except json.JSONDecodeError: + return False + return _json_catalog_has_model(payload, provider, base_model, thinking) + for line in result.stdout.splitlines(): + candidate = line.strip().strip("`'\" ") + if candidate.startswith(provider + "/"): + candidate = candidate[len(provider) + 1:] + if candidate in {model, base_model}: + return True + return False + + +def _json_catalog_has_model(value: Any, provider: str, model_id: str, thinking: str | None = None) -> bool: + if isinstance(value, list): + return any(_json_catalog_has_model(item, provider, model_id, thinking) for item in value) + if not isinstance(value, dict): + return False + row_provider = value.get("provider") or value.get("providerID") or value.get("provider_id") + row_id = value.get("id") or value.get("modelID") or value.get("model_id") + full_id = value.get("selector") or value.get("model_key") or value.get("model") + matches = ((row_provider == provider and row_id == model_id) + or (isinstance(full_id, str) and full_id == f"{provider}/{model_id}")) + if matches and (thinking is None or + (isinstance(value.get("thinking"), list) and thinking in value["thinking"])): + return True + return any(_json_catalog_has_model(item, provider, model_id, thinking) for item in value.values() + if isinstance(item, (dict, list))) + + +def _omp_tools(meta: dict[str, str], autonomous: bool = False) -> list[str]: + if autonomous: + return [OMP_TOOLS[name] for name in _role_tools(meta)] + declared = {item.strip() for item in meta.get("tools", "").split(",") if item.strip()} + read_only = not bool(declared & {"Edit", "Write"}) + tool_order = ("Read", "Edit", "Write", "Bash", "Grep", "Glob", "WebFetch", "WebSearch", "NotebookEdit") + return list(dict.fromkeys( + OMP_TOOLS[name] for name in tool_order + if name in declared and not (read_only and name in {"Edit", "Write", "Bash"}) + )) + +def _omp_skills(meta: dict[str, str]) -> list[str]: + match = re.search(r"\[(.*?)\]", meta.get("skills", "")) + return re.findall(r"[\w-]+", match.group(1)) if match else [] + + +def _stderr_summary(stderr: str) -> str: + if not stderr: + return "" + lines = len(stderr.splitlines()) + return f"[stderr omitido por segurança: {lines} linha(s), {len(stderr)} caracteres]" + + +def _text(value: str | bytes | None) -> str: + if value is None: + return "" + if isinstance(value, bytes): + return value.decode("utf-8", errors="replace") + return value + + +def invoke(tool: str, role: str, prompt: str, cwd: str, model_key: str, + timeout: float = 600, env: Mapping[str, str] | None = None) -> dict[str, Any]: + """Invoke one role; only bounded autonomous OMP dispatch uses auto-approval. + + The local catalog must attest local listing, authentication and entitlement. + OpenCode/OMP local models are rechecked immediately before dispatch. Autonomous + calls require bwrap and a tool allowlist; no fallback or config rewrite occurs. + """ + if tool not in {"claude", "opencode", "omp"}: + raise HarnessError(f"ferramenta não suportada: {tool!r}") + if not isinstance(prompt, str) or not prompt: + raise HarnessError("prompt vazio") + if isinstance(timeout, bool) or not isinstance(timeout, (int, float)) or timeout <= 0: + raise HarnessError("timeout deve ser positivo") + workdir = str(Path(cwd).resolve()) + if not Path(workdir).is_dir(): + raise HarnessError(f"cwd não existe ou não é diretório: {cwd!r}") + child_env = os.environ.copy() + if env is not None: + if any(not isinstance(key, str) or not isinstance(value, str) for key, value in env.items()): + raise HarnessError("env deve conter somente pares string/string") + child_env.update(env) + autonomous = child_env.get("DEV_WORKFLOWS_AUTONOMOUS") == "1" + if autonomous: + _validate_autonomous_worktree(workdir) + meta, role_prompt = _agent(role) + cli_model, catalog_key = _model_for_cli(tool, model_key, meta) + cache_dir = child_env.get("DEV_WORKFLOWS_MODEL_CACHE") + if tool == "claude": + if not _claude_auth_status(workdir, child_env, float(timeout)): + raise HarnessError("claude auth status não confirmou uma sessão autenticada; despacho bloqueado") + row = None if model_key in {"haiku", "sonnet", "opus", "inherit"} else _require_catalog_entry(tool, catalog_key, cache_dir) + else: + row = _require_catalog_entry(tool, catalog_key, cache_dir) + omp_thinking = None + local_model_key = catalog_key + if tool == "omp": + cli_model, omp_thinking = _omp_cli_model(row, catalog_key) + local_model_key = cli_model + if tool in {"opencode", "omp"} and not _local_models_command( + tool, local_model_key, workdir, child_env, float(timeout), omp_thinking): + raise HarnessError(f"provider/model indisponível na CLI local de {tool}: {catalog_key!r}; despacho bloqueado") + + opencode_agent = None + if tool == "claude": + if autonomous: + safe_tools = _role_tools(meta) + agent_config = json.dumps({ + role: {"description": meta["description"], "prompt": role_prompt, "tools": safe_tools} + }, ensure_ascii=False) + command = [ + "claude", "--bare", "--no-session-persistence", "-p", "--agent", role, + "--agents", agent_config, "--tools", ",".join(safe_tools), + "--permission-mode", "dontAsk", + ] + if cli_model is not None: + command.extend(("--model", cli_model)) + if safe_tools: + command.extend(("--allowedTools", *safe_tools)) + else: + command = ["claude", "-p", "--agent", role, "--permission-mode", "dontAsk"] + if cli_model is not None: + command.extend(("--model", cli_model)) + command.append(prompt) + elif tool == "opencode": + agent_name = f"dev-workflows-loop-{role}-{secrets.token_hex(8)}" if autonomous else role + command = ["opencode"] + (["--pure"] if autonomous else []) + ["run", "--agent", agent_name] + if cli_model is not None: + command.extend(("--model", cli_model)) + command.append(prompt) + if autonomous: + opencode_agent = _opencode_loop_agent(meta, role_prompt) + else: + command = ["omp", "-p", "--cwd", workdir] + if autonomous: + command.extend(("--no-extensions", "--no-lsp", "--no-session", "--auto-approve")) + else: + command.extend(("--approval-mode", "always-ask")) + if cli_model is not None: + command.extend(("--model", cli_model)) + if omp_thinking is not None: + command.extend(("--thinking", omp_thinking)) + command.extend(("--append-system-prompt", role_prompt)) + skills = _omp_skills(meta) + if skills: + command.extend(("--skills", ",".join(skills))) + tools = _omp_tools(meta, autonomous=autonomous) + if tools: + command.extend(("--tools", ",".join(tools))) + else: + command.append("--no-tools") + command.append(prompt) + try: + result = _run_process(command, workdir, child_env, float(timeout), tool, opencode_agent) + returncode = result.returncode + stdout, stderr = result.stdout, result.stderr + except subprocess.TimeoutExpired as exc: + returncode = 124 + stdout, stderr = _text(exc.stdout), _text(exc.stderr) + except OSError: + return {"returncode": 127, "output": f"CLI {tool} indisponível", "usage": None} + output = _text(stdout).rstrip() + summary = _stderr_summary(_text(stderr)) + if summary: + output = f"{output}\n{summary}" if output else summary + return {"returncode": returncode, "output": output, "usage": None} diff --git a/scripts/install.py b/scripts/install.py index 92c20d8..0d09026 100644 --- a/scripts/install.py +++ b/scripts/install.py @@ -1,14 +1,15 @@ #!/usr/bin/env python3 -"""Install dev-workflows into Claude Code, opencode or Hermes Agent. +"""Install dev-workflows into Claude Code, OpenCode, OMP or Hermes Agent. python3 scripts/install.py claude # plugin via local marketplace (skills, agents, hooks) python3 scripts/install.py opencode # skills + agents + plugin under ~/.config/opencode + python3 scripts/install.py omp # native skills + agents under ~/.omp/plugins/dev-workflows python3 scripts/install.py hermes # skills under ~/.hermes/skills (no agents/hooks there) -opencode and Hermes do not substitute ${CLAUDE_PLUGIN_ROOT}, so the copies point at this checkout: +OpenCode and Hermes do not substitute ${CLAUDE_PLUGIN_ROOT}, so their copies point at this checkout: keep it where it is, or re-run the install after moving it. """ -import argparse, os, re, shutil, subprocess, sys +import argparse, importlib.util, os, re, shutil, subprocess, sys ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MARKER = ".dev-workflows-install" @@ -40,23 +41,74 @@ def install_skills(target_dir, force): def opencode_agent(path): - """Claude Code agent frontmatter -> opencode subagent frontmatter.""" - text = open(path, encoding="utf-8").read() + """Claude Code agent frontmatter -> OpenCode subagent with explicit permissions.""" + with open(path, encoding="utf-8") as source: + text = source.read() m = re.match(r"---\n(.*?)\n---\n(.*)", text, re.S) + if not m: + raise ValueError(f"frontmatter inválido em {path}") meta = dict(re.findall(r"^(\w+):\s*(.*)$", m.group(1), re.M)) tools = {t.strip() for t in meta.get("tools", "").split(",")} skills = re.findall(r"[\w-]+", meta.get("skills", "")) - perm = {"edit": "allow" if tools & {"Edit", "Write"} else "deny", - "bash": "allow" if "Bash" in tools else "deny", - "webfetch": "allow" if "WebFetch" in tools else "deny"} + read_only = not bool(tools & {"Edit", "Write"}) + allowed = { + "read": "Read" in tools, + "edit": not read_only and bool(tools & {"Edit", "Write"}), + "bash": not read_only and "Bash" in tools, + "glob": "Glob" in tools, + "grep": "Grep" in tools, + "list": False, + "task": False, + "external_directory": False, + "todowrite": False, + "webfetch": "WebFetch" in tools, + "websearch": "WebSearch" in tools, + "lsp": False, + "skill": "Skill" in tools, + "question": False, + "doom_loop": False, + } body = m.group(2).replace("${CLAUDE_PLUGIN_ROOT}", ROOT) if skills: body = f"Antes de começar, carregue a(s) skill(s): {', '.join(skills)}.\n\n" + body - head = ["# dev-workflows", f"description: {meta['description']}", "mode: subagent", "permission:"] - head += [f" {k}: {v}" for k, v in perm.items()] + head = ["# dev-workflows", f"description: {meta['description']}", "mode: subagent", "permission:", ' "*": deny'] + head += [f" {key}: {'allow' if value else 'deny'}" for key, value in allowed.items()] return "---\n" + "\n".join(head) + "\n---\n\n" + body +def _omp_builder(path=None): + path = path or os.path.join(ROOT, "adapters", "omp", "build.py") + spec = importlib.util.spec_from_file_location("dev_workflows_omp_build", path) + if spec is None or spec.loader is None: + raise ImportError(f"não foi possível carregar o adapter OMP: {path}") + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module.build_package + + +def install_omp(base=None, runner=None, build_package=None): + """Build and link the OMP package without replacing a foreign installation.""" + omp_root = os.path.realpath(base or os.path.expanduser("~/.omp")) + dest = os.path.join(omp_root, "plugins", "dev-workflows") + if os.path.lexists(dest) and (os.path.islink(dest) or not os.path.isdir(dest)): + sys.exit(f"{dest} existe e não é um pacote OMP deste checkout.") + build = build_package or _omp_builder() + try: + build(ROOT, dest) + except FileExistsError as exc: + sys.exit(str(exc)) + run = runner or subprocess.run + command = ["omp", "plugin", "link", dest] + try: + result = run(command, check=False) + except OSError: + sys.exit("OMP não encontrado; pacote gerado, mas `omp plugin link` não foi executado.") + if result.returncode != 0: + sys.exit(f"`omp plugin link {dest}` falhou com código {result.returncode}.") + print(f"plugin OMP instalado em {dest}") + + def install_opencode(force): base = os.path.expanduser("~/.config/opencode") install_skills(os.path.join(base, "skills"), force) @@ -83,13 +135,15 @@ def install_claude(): def main(): ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) - ap.add_argument("target", choices=["claude", "opencode", "hermes"]) - ap.add_argument("--force", action="store_true", help="sobrescreve pastas com o mesmo nome que não vieram deste script") + ap.add_argument("target", choices=["claude", "opencode", "hermes", "omp"]) + ap.add_argument("--force", action="store_true", help="sobrescreve skills/agentes externos; OMP nunca sobrescreve pacote não pertencente") a = ap.parse_args() if a.target == "claude": install_claude() elif a.target == "opencode": install_opencode(a.force) + elif a.target == "omp": + install_omp() else: install_skills(os.path.expanduser("~/.hermes/skills"), a.force) print("Hermes: agentes e hooks não se aplicam; rode o gate manualmente.") diff --git a/scripts/model_catalog.py b/scripts/model_catalog.py new file mode 100755 index 0000000..a3ceee5 --- /dev/null +++ b/scripts/model_catalog.py @@ -0,0 +1,1013 @@ +#!/usr/bin/env python3 +"""Catálogos auditáveis e preços de referência para o roteador de modelos. + +A lista pública não comprova autenticação, entitlement ou tarifa da conta. Este +módulo nunca invoca modelos nem lê/imprime credenciais. Artificial Analysis é +aceita somente por snapshot manual v1.5 validado; não há scraping nem API +presumida. +""" +from __future__ import annotations + +import argparse +import csv +import datetime as dt +import hashlib +import io +import json +import os +import re +import subprocess +import sys +import tempfile +import urllib.error +import urllib.request +from urllib.parse import urlsplit +from decimal import Decimal, InvalidOperation +from pathlib import Path +from typing import Any, Callable, Iterable + +ZEN_URL = "https://opencode.ai/zen/v1/models" +GO_URL = "https://opencode.ai/zen/go/v1/models" +OPENROUTER_URL = "https://openrouter.ai/api/v1/models" +AA_URL = "https://artificialanalysis.ai/agents/coding-agents" +AA_METRIC = "aa_coding_agent_index" +AA_VERSION = "1.5" +OMP_THINKING_VARIANTS = frozenset({"off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"}) +CACHE_DIR = Path(os.environ.get("DEV_WORKFLOWS_MODEL_CACHE", "~/.cache/dev-workflows/model-catalog")).expanduser() + +# Exact reviewed links only. A family/name resemblance is never a join key. +_CURATED: dict[tuple[str, str, str | None], tuple[str, str]] = { + ("opencode", "glm-5.3", None): ("z-ai/glm-5.3", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode-go", "glm-5.3", None): ("z-ai/glm-5.3", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode", "gpt-6-luna", None): ("openai/gpt-6-luna", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode-go", "gpt-6-luna", None): ("openai/gpt-6-luna", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode", "gpt-6-sol", None): ("openai/gpt-6-sol", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode", "claude-opus-5-5", None): ("anthropic/claude-opus-5.5", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode", "kimi-k3", None): ("moonshotai/kimi-k3", "OpenRouter cross-reference reviewed against spec sample"), + ("opencode-go", "kimi-k3", None): ("moonshotai/kimi-k3", "OpenRouter cross-reference reviewed against spec sample"), +} + + +def utc_now() -> str: + return dt.datetime.now(dt.timezone.utc).replace(microsecond=0).isoformat().replace("+00:00", "Z") + + +def canonical_json(value: Any) -> bytes: + return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode("utf-8") + + +def sha256(value: bytes | str) -> str: + if isinstance(value, str): + value = value.encode("utf-8") + return hashlib.sha256(value).hexdigest() + + +def _secure_url(value: Any, hostname: str | None = None) -> bool: + if not isinstance(value, str): + return False + parsed = urlsplit(value) + return parsed.scheme == "https" and (hostname is None or parsed.hostname in (hostname, "www." + hostname)) and not parsed.username and not parsed.password and not parsed.query and not parsed.fragment + + +def decimal_value(value: Any) -> Decimal | None: + if value is None or value == "": + return None + if isinstance(value, bool) or isinstance(value, float): + raise ValueError("Valores monetários devem ser strings decimais ou inteiros, não float/bool") + try: + result = Decimal(str(value)) + except (InvalidOperation, ValueError) as exc: + raise ValueError(f"decimal inválido: {value!r}") from exc + if not result.is_finite(): + raise ValueError("decimal deve ser finito") + return result + + +def decimal_text(value: Decimal | None) -> str | None: + return None if value is None else format(value, "f") + + +def _json_request(url: str, timeout: float = 20) -> tuple[Any, str, str]: + request = urllib.request.Request(url, headers={"Accept": "application/json", "User-Agent": "dev-workflows-model-catalog/1"}) + with urllib.request.urlopen(request, timeout=timeout) as response: + body = response.read() + final_url = response.geturl() + return json.loads(body), final_url, sha256(body) + + +def _unwrap_catalog(payload: Any) -> list[dict[str, Any]]: + if isinstance(payload, list): + models = payload + elif isinstance(payload, dict): + models = next((payload[k] for k in ("data", "models", "items") if isinstance(payload.get(k), list)), None) + if models is None: + raise ValueError("formato de catálogo não reconhecido") + else: + raise ValueError("catálogo não é JSON de objetos") + if any(not isinstance(item, dict) for item in models): + raise ValueError("catálogo contém item não-objeto") + return models + + +def parse_provider_catalog(payload: Any, provider: str, source_url: str, captured_at: str | None = None) -> list[dict[str, Any]]: + """Converte catálogos Zen/Go sem sintetizar IDs ou variantes.""" + captured_at = captured_at or utc_now() + result: list[dict[str, Any]] = [] + seen: set[tuple[str, str | None]] = set() + for item in _unwrap_catalog(payload): + raw_id = item.get("id") or item.get("model_id") + if not isinstance(raw_id, str) or not raw_id.strip() or "/" in raw_id or "#" in raw_id: + raise ValueError(f"ID inválido no catálogo {provider}") + model_id = raw_id.strip() + variants = item.get("variants") + if variants is None: + variants = [None] + elif isinstance(variants, dict): + variants = list(variants) + if not isinstance(variants, list) or any(v is not None and (not isinstance(v, str) or not v) for v in variants): + raise ValueError(f"variantes inválidas para {provider}/{model_id}") + for variant in variants: + key = (model_id, variant) + if key in seen: + continue + seen.add(key) + model_key = f"{provider}/{model_id}" + (f"#{variant}" if variant else "") + result.append({ + "name": str(item.get("name") or model_id), "tool": "opencode", "provider": provider, + "model_id": model_id, "variant": variant, "model_key": model_key, + "context_length": item.get("context_length") or item.get("context_window"), + "modalities": item.get("modalities"), "tool_calling": item.get("tool_calling"), + "billing_mode": "zen_balance" if provider == "opencode" else "go_quota", + "availability": {"listed": True, "authenticated": None, "entitled": None, "verified_at": None}, + "public_source": source_url, "captured_at": captured_at, + }) + return result + + +_OR_PRICE_FIELDS = { + "input": "prompt", "output": "completion", "cache_read": "input_cache_read", + "cache_write": "input_cache_write", "cache_write_5m": "input_cache_write_5m", + "cache_write_1h": "input_cache_write_1h", "cache_write_24h": "input_cache_write_24h", +} + + +def _public_context_tiers(overrides: Any, prices: dict[str, Any], source_url: str, + captured_at: str) -> list[dict[str, Any]]: + if not isinstance(overrides, list): + return [] + tiers = [] + for override in overrides: + if not isinstance(override, dict): + continue + threshold = override.get("min_prompt_tokens") + if isinstance(threshold, bool) or not isinstance(threshold, int) or threshold < 0: + continue + tier_prices = dict(prices) + for target, source in _OR_PRICE_FIELDS.items(): + if source in override: + parsed = decimal_value(override[source]) + tier_prices[target] = decimal_text(parsed) if parsed is not None and parsed >= 0 else None + tiers.append({"min_context_tokens": threshold, "price_per_token_usd": tier_prices, + "source_url": source_url, "captured_at": captured_at}) + return sorted(tiers, key=lambda tier: tier["min_context_tokens"]) + + +def parse_openrouter(payload: Any, overrides: dict[str, Any] | None = None, source_url: str = OPENROUTER_URL, + captured_at: str | None = None) -> dict[str, dict[str, Any]]: + """Preserva tarifas USD/token, variantes de cache e condições de preço.""" + captured_at = captured_at or utc_now() + overrides = overrides or {} + output = {} + fields = _OR_PRICE_FIELDS + for item in _unwrap_catalog(payload): + model_id = item.get("id") + if not isinstance(model_id, str) or not model_id or any(char.isspace() for char in model_id): + raise ValueError("OpenRouter contém ID inválido") + if model_id in output: + raise ValueError(f"ID OpenRouter duplicado: {model_id}") + pricing = item.get("pricing") or {} + if not isinstance(pricing, dict): + raise ValueError(f"pricing inválido para {model_id}") + prices = {} + unsupported_prices = {} + for target, source in fields.items(): + raw = pricing.get(source) + price = decimal_value(raw) if raw is not None else None + if price is not None and price < 0: + unsupported_prices[target] = str(raw) + price = None # Credit/rebate is not a usable nonnegative cost estimate. + prices[target] = decimal_text(price) + base = { + "id": model_id, "name": item.get("name"), "canonical_slug": item.get("canonical_slug"), + "price_per_token_usd": prices, "price_unit": "USD/token", + "display_usd_per_1m": {k: decimal_text(decimal_value(v) * Decimal(1_000_000)) if v is not None else None for k, v in prices.items()}, + "conditions": { + "context_length": item.get("context_length"), "top_provider": item.get("top_provider"), + "per_request_limits": item.get("per_request_limits"), + "pricing_metadata": {k: v for k, v in pricing.items() if k not in fields.values()}, + "unsupported_negative_prices": unsupported_prices, + }, + "source_url": source_url, "captured_at": captured_at, "source_hash": sha256(canonical_json(item)), + } + public_tiers = _public_context_tiers(pricing.get("overrides"), prices, source_url, captured_at) + if public_tiers: + base["conditions"]["context_tiers"] = public_tiers + override = overrides.get(model_id) + if override is not None: + if not isinstance(override, dict): + raise ValueError(f"override deve ser objeto: {model_id}") + allowed = {"price_per_token_usd", "display_usd_per_1m", "context_length", "ttl", "endpoint", + "price_conditions", "context_tiers", "source_url", "captured_at"} + if set(override) - allowed: + raise ValueError(f"override contém campo não permitido: {model_id}") + has_base_prices = "price_per_token_usd" in override or "display_usd_per_1m" in override + if has_base_prices: + if not _secure_url(override.get("source_url")) or _parse_utc(override.get("captured_at")) is None: + raise ValueError(f"override de preço exige source_url https e captured_at: {model_id}") + base["source_url"], base["captured_at"] = override["source_url"], override["captured_at"] + for unit_field, divisor in (("price_per_token_usd", Decimal(1)), ("display_usd_per_1m", Decimal(1_000_000))): + if unit_field not in override: + continue + override_prices = override[unit_field] + if not isinstance(override_prices, dict): + raise ValueError(f"{unit_field} deve ser objeto: {model_id}") + for key, value in override_prices.items(): + if key not in prices: + raise ValueError(f"campo de tarifa desconhecido: {key}") + parsed = decimal_value(value) + if parsed is not None and parsed < 0: + raise ValueError(f"preço override negativo: {model_id}") + prices[key] = decimal_text(parsed / divisor) if parsed is not None else None + for field in ("context_length", "ttl", "endpoint", "price_conditions"): + if field in override: + base["conditions"][field] = override[field] + if "endpoint" in override and not _secure_url(override["endpoint"]): + raise ValueError(f"endpoint override deve ser HTTPS sem credenciais/query: {model_id}") + if "context_tiers" in override: + raw_tiers = override["context_tiers"] + if not isinstance(raw_tiers, list): + raise ValueError(f"context_tiers deve ser lista: {model_id}") + tiers = [] + thresholds = set() + for tier in raw_tiers: + tier_fields = {"min_context_tokens", "price_per_token_usd", "source_url", "captured_at"} + if not isinstance(tier, dict) or set(tier) != tier_fields: + raise ValueError(f"context tier inválido: {model_id}") + threshold = tier["min_context_tokens"] + if isinstance(threshold, bool) or not isinstance(threshold, int) or threshold < 0 or threshold in thresholds: + raise ValueError(f"limite de contexto inválido/duplicado: {model_id}") + thresholds.add(threshold) + if not _secure_url(tier["source_url"]) or _parse_utc(tier["captured_at"]) is None: + raise ValueError(f"context tier requer origem e data auditáveis: {model_id}") + tier_prices = tier["price_per_token_usd"] + if not isinstance(tier_prices, dict) or not tier_prices or set(tier_prices) - set(prices): + raise ValueError(f"tarifas do context tier inválidas: {model_id}") + normalized = dict(prices) + for key, value in tier_prices.items(): + parsed = decimal_value(value) + if parsed is None or parsed < 0: + raise ValueError(f"tarifa de contexto inválida: {model_id}") + normalized[key] = decimal_text(parsed) + tiers.append({"min_context_tokens": threshold, "price_per_token_usd": normalized, + "source_url": tier["source_url"], "captured_at": tier["captured_at"]}) + base["conditions"]["context_tiers"] = sorted( + tiers + base["conditions"].get("context_tiers", []), + key=lambda x: x["min_context_tokens"]) + base["override"] = {k: v for k, v in override.items() if k in allowed} + base["price_per_token_usd"] = {k: decimal_text(decimal_value(v)) if v is not None else None for k, v in prices.items()} + base["display_usd_per_1m"] = { + k: decimal_text(decimal_value(v) * Decimal(1_000_000)) if v is not None else None + for k, v in base["price_per_token_usd"].items() + } + base["source_hash"] = sha256(canonical_json({"api_model": item, "override": override})) + output[model_id] = base + if set(overrides) - set(output): + raise ValueError("override refere ID OpenRouter ausente") + return output + + +def openrouter_price_for_profile(record: dict[str, Any], tokens: dict[str, Any]) -> dict[str, Any]: + selected = dict(record) + conditions = record.get("conditions") or {} + tiers = conditions.get("context_tiers") or [] + context_raw = tokens.get("context_length", tokens.get("input")) + context = decimal_value(context_raw) if context_raw is not None else None + if context is not None and not tiers: + metadata = conditions.get("pricing_metadata") + if isinstance(metadata, dict): + tiers = _public_context_tiers(metadata.get("overrides"), record["price_per_token_usd"], + record["source_url"], record["captured_at"]) + if context is not None: + matching = [tier for tier in tiers if Decimal(tier["min_context_tokens"]) <= context] + if matching: + tier = max(matching, key=lambda item: item["min_context_tokens"]) + selected["price_per_token_usd"] = tier["price_per_token_usd"] + selected["source_url"] = tier["source_url"] + selected["captured_at"] = tier["captured_at"] + selected["applied_context_tier"] = tier["min_context_tokens"] + return selected + + +def reference_cost(price_per_token_usd: dict[str, Any], tokens: dict[str, Any]) -> Decimal | None: + """C_OR em USD; None se qualquer tarifa necessária ao perfil estiver ausente.""" + aliases = {"input": ("input", "prompt"), "output": ("output", "completion"), + "cache_read": ("cache_read", "input_cache_read"), "cache_write": ("cache_write", "input_cache_write")} + total = Decimal(0) + for kind, names in aliases.items(): + raw_count = tokens.get(kind, 0) + if isinstance(raw_count, bool) or isinstance(raw_count, float): + raise ValueError("contagem de tokens deve ser inteiro ou decimal exato") + count = Decimal(str(raw_count)) + if not count.is_finite() or count < 0: + raise ValueError(f"contagem de tokens inválida: {kind}") + if count == 0: + continue + names_for_cost = names + if kind == "cache_write" and tokens.get("cache_write_ttl"): + ttl = tokens["cache_write_ttl"] + if ttl not in ("5m", "1h", "24h"): + raise ValueError("cache_write_ttl precisa ser 5m, 1h ou 24h") + names_for_cost = (f"cache_write_{ttl}", f"input_cache_write_{ttl}") + raw_price = next((price_per_token_usd[name] for name in names_for_cost if name in price_per_token_usd), None) + price = decimal_value(raw_price) if raw_price is not None else None + if price is None: + return None + if price < 0: + raise ValueError("preço por token não pode ser negativo") + total += count * price + return total + + +def validate_aa_snapshot(payload: Any) -> list[dict[str, Any]]: + """Aceita exclusivamente export manual auditável do Coding Agent Index v1.5.""" + if not isinstance(payload, dict): + raise ValueError("snapshot AA deve ser objeto") + allowed_root = {"metric_id", "version", "ingestion", "terms_accepted", "source_url", "attribution", "captured_at", "records"} + if set(payload) - allowed_root: + raise ValueError("snapshot AA contém campo não permitido") + if payload.get("metric_id") != AA_METRIC or str(payload.get("version")) != AA_VERSION: + raise ValueError("somente aa_coding_agent_index v1.5 é aceito; índices não são intercambiáveis") + if payload.get("ingestion") != "manual_audited" or payload.get("terms_accepted") is not True: + raise ValueError("snapshot precisa ser importação manual consentida (terms_accepted=true)") + source_url = payload.get("source_url") + if not _secure_url(source_url, "artificialanalysis.ai"): + raise ValueError("source_url oficial da Artificial Analysis é obrigatório") + if not isinstance(payload.get("attribution"), str) or not payload["attribution"]: + raise ValueError("atribuição AA obrigatória") + captured_at = payload.get("captured_at") + captured_time = _parse_utc(captured_at) + if captured_time is None or captured_time > dt.datetime.now(dt.timezone.utc): + raise ValueError("captured_at obrigatório, UTC/offset-aware e não futuro") + records = payload.get("records") + if not isinstance(records, list): + raise ValueError("records deve ser lista") + validated = [] + seen_keys: set[tuple[str, str, str | None]] = set() + allowed_record = {"metric_id", "version", "provider", "model_id", "variant", "score", "agent", "harness", + "settings", "match_grade", "evidence_url", "components", "fallback", "effort", "reasoning", "configuration"} + for record in records: + if not isinstance(record, dict) or set(record) - allowed_record: + raise ValueError("registro AA inválido ou contém campo não permitido") + if record.get("metric_id", AA_METRIC) != AA_METRIC or str(record.get("version", AA_VERSION)) != AA_VERSION: + raise ValueError("índice/versão diferente não pode ser misturado") + provider, model_id = record.get("provider"), record.get("model_id") + if not isinstance(provider, str) or not isinstance(model_id, str) or not model_id or "/" in model_id or "#" in model_id: + raise ValueError("mapeamento provider/model_id exato obrigatório") + variant = record.get("variant") + if variant is not None and (not isinstance(variant, str) or not variant): + raise ValueError("variante AA inválida") + key = (provider, model_id, variant) + if key in seen_keys: + raise ValueError("benchmark inconsistente: modelo/variante duplicado no snapshot") + seen_keys.add(key) + score = decimal_value(record.get("score")) + if score is None or score < 0 or score > 100: + raise ValueError("score AA precisa estar no intervalo 0..100") + grade = record.get("match_grade") + if grade not in ("exact", "proxy"): + raise ValueError("match_grade deve ser exact ou proxy, sem fuzzy match") + for key in ("agent", "harness", "settings", "evidence_url"): + if key not in record or record[key] in (None, ""): + raise ValueError(f"campo de proveniência AA obrigatório: {key}") + if not _secure_url(record["evidence_url"], "artificialanalysis.ai"): + raise ValueError("evidence_url AA inválida") + validated.append({ + **record, "metric_id": AA_METRIC, "version": AA_VERSION, "score": decimal_text(score), + "source_url": source_url, "attribution": payload["attribution"], "observed_at": captured_at, + "snapshot_hash": sha256(canonical_json(payload)), + }) + return validated + + +def validate_availability_snapshot(payload: Any) -> dict[tuple[str, str, str | None], dict[str, Any]]: + """Validates explicit account evidence without accepting or retaining secrets.""" + if not isinstance(payload, dict) or payload.get("tool") not in ("opencode", "omp") or payload.get("ingestion") != "manual_audited": + raise ValueError("availability precisa ser snapshot manual auditado de opencode ou omp") + tool = payload["tool"] + if payload.get("user_confirmed") is not True: + raise ValueError("snapshot de disponibilidade exige user_confirmed=true") + captured_at = payload.get("captured_at") + if not isinstance(captured_at, str): + raise ValueError("captured_at de disponibilidade obrigatório") + try: + captured_dt = dt.datetime.fromisoformat(captured_at.replace("Z", "+00:00")) + except ValueError as exc: + raise ValueError("captured_at de disponibilidade inválido") from exc + if captured_dt.tzinfo is None or captured_dt > dt.datetime.now(dt.timezone.utc): + raise ValueError("captured_at precisa ser UTC/offset-aware e não futuro") + records = payload.get("records") + if not isinstance(records, list): + raise ValueError("records de disponibilidade deve ser lista") + result = {} + source_hash = sha256(canonical_json(payload)) + allowed_fields = {"provider", "model_id", "variant", "local_listed", "authenticated", "entitled", + "verified_at", "source", "balance_confirmed", "balance_verified_at"} + for record in records: + if not isinstance(record, dict) or set(record) - allowed_fields: + raise ValueError("snapshot de disponibilidade contém campos não permitidos") + provider, model_id, variant = record.get("provider"), record.get("model_id"), record.get("variant") + if not isinstance(provider, str) or not isinstance(model_id, str) or not model_id or "/" in model_id or "#" in model_id or (variant is not None and not isinstance(variant, str)): + raise ValueError("provider/model_id/variant exatos são obrigatórios") + if any(field not in record for field in ("local_listed", "authenticated", "entitled", "verified_at", "source")): + raise ValueError("snapshot deve declarar todos os campos de disponibilidade") + key = (provider, model_id, variant) + if key in result: + raise ValueError("snapshot de disponibilidade contém ID/variante duplicado") + for field in ("local_listed", "authenticated", "entitled"): + if record[field] is not None and not isinstance(record[field], bool): + raise ValueError(f"{field} deve ser bool ou null") + balance_confirmed = record.get("balance_confirmed") + if balance_confirmed is not None and not isinstance(balance_confirmed, bool): + raise ValueError("balance_confirmed deve ser bool ou null") + balance_verified_at = record.get("balance_verified_at") + balance_time = _parse_utc(balance_verified_at) if balance_verified_at else None + if balance_time is not None and (balance_time > dt.datetime.now(dt.timezone.utc) or balance_confirmed is not True): + raise ValueError("balance_verified_at requer confirmação explícita e não pode ser futuro") + if balance_confirmed is True and balance_time is None: + raise ValueError("saldo confirmado exige balance_verified_at UTC válido") + verified_at = _parse_utc(record["verified_at"]) + if verified_at is None or verified_at > dt.datetime.now(dt.timezone.utc) or not isinstance(record["source"], str) or not record["source"]: + raise ValueError("source e verified_at UTC válido são necessários para auditar a disponibilidade") + result[key] = { + "local_listed": record["local_listed"], "authenticated": record["authenticated"], + "entitled": record["entitled"], "verified_at": record["verified_at"], + "source": "manual_audited", "source_hash": source_hash, + "balance_confirmed": balance_confirmed, "balance_verified_at": balance_verified_at, + } + return result + + + +def validate_native_tariff_overrides(payload: Any) -> dict[str, dict[str, Any]]: + """Valida cobrança nativa/quotas manuais; preços OpenRouter nunca são tarifa.""" + if not isinstance(payload, dict): + raise ValueError("native_tariffs deve ser objeto JSON") + result = {} + allowed = {"billing_mode", "price_per_token_usd", "quota_window_remaining", "quota_window_debit", + "use_balance_fallback", "source_url", "captured_at", "account_confirmed", "available_balance_usd"} + for model_key, value in payload.items(): + if not isinstance(model_key, str) or not isinstance(value, dict) or set(value) - allowed: + raise ValueError("override native contém estrutura/campo inválido") + if value.get("account_confirmed") is not True: + raise ValueError("tarifa/cota native exige confirmação explícita da conta") + mode = value.get("billing_mode") + if mode not in ("zen_balance", "go_quota", "omp_payg"): + raise ValueError("billing_mode native inválido") + if not _secure_url(value.get("source_url")): + raise ValueError("source_url HTTPS de tarifa/cota native obrigatório") + captured_at = value.get("captured_at") + try: + captured = dt.datetime.fromisoformat(captured_at.replace("Z", "+00:00")) + except (AttributeError, ValueError) as exc: + raise ValueError("captured_at de tarifa/cota native inválido") from exc + if captured.tzinfo is None or captured > dt.datetime.now(dt.timezone.utc): + raise ValueError("captured_at de tarifa/cota native precisa ser aware e não futuro") + record = {k: value[k] for k in ("billing_mode", "source_url", "captured_at", "account_confirmed")} + if mode in ("zen_balance", "omp_payg"): + rates = value.get("price_per_token_usd") + if not isinstance(rates, dict) or not rates: + raise ValueError("tarifa nativa precisa de price_per_token_usd") + record["price_per_token_usd"] = { + k: decimal_text(decimal_value(v)) for k, v in rates.items() + if k in ("input", "output", "cache_read", "cache_write", "cache_write_5m", "cache_write_1h", "cache_write_24h") + } + if len(record["price_per_token_usd"]) != len(rates) or any(v is None or Decimal(v) < 0 for v in record["price_per_token_usd"].values()): + raise ValueError("componentes de tarifa nativa inválidos") + balance = decimal_value(value.get("available_balance_usd")) + if balance is None or balance < 0: + raise ValueError("Zen/OMP payg exige saldo disponível confirmado") + record["available_balance_usd"] = decimal_text(balance) + else: + remaining, debit = value.get("quota_window_remaining"), value.get("quota_window_debit") + if not isinstance(remaining, dict) or not isinstance(debit, dict) or any(k not in remaining or k not in debit for k in ("5h", "weekly", "monthly")): + raise ValueError("cota Go exige valores por modelo em 5h/weekly/monthly") + record["quota_window_remaining"] = {k: decimal_text(decimal_value(remaining[k])) for k in ("5h", "weekly", "monthly")} + record["quota_window_debit"] = {k: decimal_text(decimal_value(debit[k])) for k in ("5h", "weekly", "monthly")} + if any(record[key][window] is None or Decimal(record[key][window]) < 0 for key in ("quota_window_remaining", "quota_window_debit") for window in ("5h", "weekly", "monthly")): + raise ValueError("quota Go precisa ter todos os valores decimais não negativos") + fallback = value.get("use_balance_fallback", False) + if not isinstance(fallback, bool): + raise ValueError("use_balance_fallback precisa ser bool") + record["use_balance_fallback"] = fallback + result[model_key] = record + return result + +def discover_local_models(provider: str, executable: str = "opencode", runner: Callable[..., Any] = subprocess.run) -> dict[str, Any]: + """Lista IDs pela CLI sem persistir stdout bruto, stderr, environment ou credenciais.""" + try: + result = runner([executable, "models", provider, "--refresh"], capture_output=True, text=True, timeout=30, check=False) + except (OSError, subprocess.TimeoutExpired): + return {"ok": False, "models": [], "reason": "cli_local_indisponivel"} + if result.returncode != 0: + return {"ok": False, "models": [], "reason": "descoberta_local_falhou"} + found: set[str] = set() + # Apenas linhas integralmente compostas por um ID de modelo permitido. + for line in result.stdout.splitlines(): + candidate = line.strip().strip("`'\" ") + if candidate.startswith(provider + "/"): + candidate = candidate[len(provider) + 1:] + if re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:+/-]*(?:#[A-Za-z0-9._+-]+)?", candidate): + if " " not in candidate and not candidate.startswith("-"): + found.add(candidate) + return {"ok": True, "models": sorted(found), "reason": None} + + +def parse_omp_models(payload: Any, provider: str, captured_at: str | None = None) -> list[dict[str, Any]]: + """Converte a listagem JSON local do OMP; ela prova listagem, nunca entitlement.""" + captured_at = captured_at or utc_now() + if isinstance(payload, list): + models = payload + elif isinstance(payload, dict): + models = next((payload[key] for key in ("models", "data", "items") if isinstance(payload.get(key), list)), None) + if models is None: + raise ValueError("formato de listagem OMP não reconhecido") + else: + raise ValueError("listagem OMP não é JSON de modelos") + if any(not isinstance(item, dict) for item in models): + raise ValueError("listagem OMP contém modelo não-objeto") + rows = [] + seen: set[tuple[str, str | None]] = set() + for item in models: + item_provider = item.get("provider", provider) + raw_id = item.get("id") or item.get("model_id") or item.get("model") + if not isinstance(item_provider, str) or item_provider != provider or not isinstance(raw_id, str): + raise ValueError("provider e ID exatos são obrigatórios na listagem OMP") + model_id = raw_id + selector = item.get("selector") + if selector is not None: + if not isinstance(selector, str) or not selector.startswith(provider + "/") or selector[len(provider) + 1:] != model_id: + raise ValueError("selector OMP qualificado diverge do provider/ID") + if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:+/-]*", model_id): + raise ValueError("ID inválido na listagem OMP") + thinking = item.get("thinking") + if thinking is not None and (not isinstance(thinking, list) or any( + not isinstance(level, str) or level not in OMP_THINKING_VARIANTS for level in thinking)): + raise ValueError("níveis de thinking inválidos na listagem OMP") + key = (model_id, None) + if key in seen: + continue + seen.add(key) + model_key = f"{provider}/{model_id}" + rows.append({ + "name": model_id, "tool": "omp", "provider": provider, "model_id": model_id, + "variant": None, "thinking": thinking, "model_key": model_key, "context_length": None, + "modalities": None, "tool_calling": None, "billing_mode": "unknown", + "availability": {"listed": True, "authenticated": None, "entitled": None, "verified_at": None}, + "public_source": "omp models --json (listagem local)", "captured_at": captured_at, + }) + return rows + + +def discover_omp_models(provider: str, executable: str = "omp", + runner: Callable[..., Any] = subprocess.run) -> dict[str, Any]: + """Lê IDs OMP localmente e descarta stdout/stderr brutos e dados de conta.""" + if not re.fullmatch(r"[A-Za-z0-9_.-]+", provider): + return {"ok": False, "models": [], "reason": "provider_omp_invalido"} + try: + result = runner([executable, "models", provider, "--json"], capture_output=True, text=True, timeout=30, check=False) + except (OSError, subprocess.TimeoutExpired): + return {"ok": False, "models": [], "reason": "cli_omp_indisponivel"} + if result.returncode != 0 or not isinstance(result.stdout, str): + return {"ok": False, "models": [], "reason": "listagem_omp_indisponivel"} + try: + payload = json.loads(result.stdout) + rows = parse_omp_models(payload, provider) + except (json.JSONDecodeError, ValueError): + return {"ok": False, "models": [], "reason": "listagem_omp_invalida"} + selectors = {row["model_key"] for row in rows} + for row in rows: + if row.get("variant") is None and isinstance(row.get("thinking"), list): + selectors.update(f'{row["provider"]}/{row["model_id"]}#{level}' for level in row["thinking"]) + return { + "ok": True, "models": sorted(selectors), "rows": rows, + "source_hash": sha256(result.stdout.encode("utf-8")), "verified_at": utc_now(), "reason": None, + } + + +def curated_mapping(provider: str, model_id: str, variant: str | None = None) -> dict[str, str] | None: + match = _CURATED.get((provider, model_id, variant)) + if match is None: + return None + return {"openrouter_id": match[0], "provenance": match[1], "match_method": "exact_curated"} + + +def _atomic_json(path: Path, payload: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + fd, temporary = tempfile.mkstemp(prefix=path.name + ".", dir=path.parent) + try: + with os.fdopen(fd, "w", encoding="utf-8") as stream: + json.dump(payload, stream, ensure_ascii=False, sort_keys=True, indent=2) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + finally: + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def _read_json(path: Path, default: Any) -> Any: + try: + with path.open(encoding="utf-8") as stream: + return json.load(stream) + except FileNotFoundError: + return default + + +def _http_fetch(url: str) -> tuple[Any, str, str]: + return _json_request(url) + + +def sync(tool: str = "opencode", providers: Iterable[str] | None = None, + cache_dir: str | Path | None = None, fetcher: Callable[[str], tuple[Any, str, str]] = _http_fetch, + local_discoverer: Callable[[str], dict[str, Any]] = discover_local_models, + aa_snapshot: str | Path | None = None, price_overrides: str | Path | None = None, + availability_snapshot: str | Path | None = None, + omp_discoverer: Callable[[str], dict[str, Any]] = discover_omp_models) -> dict[str, Any]: + """Atualiza catálogos; listas OMP são locais e nunca provam entitlement.""" + if tool not in ("opencode", "omp"): + raise ValueError("sync público/local suportado apenas para opencode ou omp") + cache = Path(cache_dir) if cache_dir is not None else CACHE_DIR + requested = tuple(dict.fromkeys(providers if providers is not None else + (() if tool == "omp" else ("opencode", "opencode-go")))) + if tool == "omp": + if not requested: + raise ValueError("OMP exige providers explicitamente autorizados") + if any(not isinstance(provider, str) or not re.fullmatch(r"[A-Za-z0-9_.-]+", provider) for provider in requested): + raise ValueError("provider OMP inválido") + provider_urls = {} + else: + provider_urls = {"opencode": ZEN_URL, "opencode-go": GO_URL} + if not requested or any(provider not in provider_urls for provider in requested): + raise ValueError("provider desconhecido; use opencode,opencode-go") + source_hashes: dict[str, str] = {} + override_bytes = Path(price_overrides).read_bytes() if price_overrides else b"" + override_data = json.loads(override_bytes) if override_bytes else {} + if not isinstance(override_data, dict): + raise ValueError("arquivo de overrides deve ser objeto JSON") + reserved = {"openrouter", "native_tariffs"} + or_overrides = override_data.get("openrouter", {k: v for k, v in override_data.items() if k not in reserved}) + native_overrides = validate_native_tariff_overrides(override_data.get("native_tariffs", {})) + if override_bytes: + source_hashes["overrides"] = sha256(override_bytes) + if not isinstance(or_overrides, dict): + raise ValueError("overrides OpenRouter deve ser objeto") + availability_map: dict[tuple[str, str, str | None], dict[str, Any]] = {} + if availability_snapshot: + availability_bytes = Path(availability_snapshot).read_bytes() + availability_payload = json.loads(availability_bytes) + if not isinstance(availability_payload, dict) or availability_payload.get("tool") != tool: + raise ValueError("tool do snapshot de disponibilidade diverge do catálogo") + availability_map = validate_availability_snapshot(availability_payload) + source_hashes["availability"] = sha256(availability_bytes) + + catalog_rows = [] + captured = utc_now() + if aa_snapshot: + snapshot_bytes = Path(aa_snapshot).read_bytes() + aa_payload = json.loads(snapshot_bytes) + aa_records = validate_aa_snapshot(aa_payload) + _atomic_json(cache / f"aa-{AA_METRIC}-v{AA_VERSION}.json", { + "metric_id": AA_METRIC, "version": AA_VERSION, "captured_at": aa_payload["captured_at"], + "source_hash": sha256(snapshot_bytes), "records": aa_records, + }) + source_hashes["aa"] = sha256(snapshot_bytes) + aa_stored = _read_json(cache / f"aa-{AA_METRIC}-v{AA_VERSION}.json", {"records": []}) + scores = aa_stored.get("records", []) if isinstance(aa_stored, dict) else [] + scores_by_key = {(r.get("provider"), r.get("model_id"), r.get("variant")): r for r in scores} + + if tool == "opencode": + for provider in requested: + payload, source_url, digest = fetcher(provider_urls[provider]) + catalog_rows.extend(parse_provider_catalog(payload, provider, source_url, captured)) + source_hashes[provider] = digest + local_result = {p: local_discoverer(p) for p in requested} + else: + local_result = {p: omp_discoverer(p) for p in requested} + for provider, result in local_result.items(): + if result.get("ok"): + catalog_rows.extend(result.get("rows", [])) + source_hashes[provider] = result["source_hash"] + + if tool == "omp": + base_rows = {(row["provider"], row["model_id"]): row for row in catalog_rows if row.get("variant") is None} + present = {row["model_key"] for row in catalog_rows} + for (provider, model_id, variant), _score in scores_by_key.items(): + base_key = f"{provider}/{model_id}" + model_key = base_key + (f"#{variant}" if variant else "") + supported = base_rows.get((provider, model_id), {}).get("thinking") + if (variant not in OMP_THINKING_VARIANTS or model_key in present or + not isinstance(supported, list) or variant not in supported or + base_key not in local_result.get(provider, {}).get("models", [])): + continue + base = base_rows.get((provider, model_id)) + if base is None: + continue + variant_row = dict(base) + variant_row["variant"] = variant + variant_row["model_key"] = model_key + variant_row["availability"] = dict(base.get("availability") or {}) + catalog_rows.append(variant_row) + present.add(model_key) + + applied_availability = set() + for row in catalog_rows: + provider = row["provider"] + local = local_result.get(provider, {"ok": False, "models": []}) + local_ids = set(local.get("models", [])) if local.get("ok") else set() + catalog_key = (provider, row["model_id"], row.get("variant")) + manual = availability_map.get(catalog_key) + if manual: + applied_availability.add(catalog_key) + if tool == "omp": + local_listed = row["model_key"] in local_ids if local.get("ok") else None + else: + local_key = row["model_id"] + (f"#{row['variant']}" if row.get("variant") else "") + local_listed = local_key in local_ids if local.get("ok") else None + if manual and local.get("ok"): + local_listed = local_listed is True and manual["local_listed"] is True + row["availability"].update({ + "local_listed": local_listed, + "authenticated": manual["authenticated"] if manual else None, + "entitled": manual["entitled"] if manual else None, + "verified_at": manual["verified_at"] if manual else (captured if local.get("ok") else None), + "local_verified_at": local.get("verified_at", captured) if local.get("ok") else None, + "account_verified_at": manual["verified_at"] if manual else None, + "balance_confirmed": manual.get("balance_confirmed") if manual else None, + "balance_verified_at": manual.get("balance_verified_at") if manual else None, + "source": "manual_audited" if manual else ("omp_models_cli" if tool == "omp" and local.get("ok") else "opencode_models_cli" if local.get("ok") else None), + "evidence_hash": manual["source_hash"] if manual else None, + }) + if local_listed is not True: + row["availability_reason"] = "nao_listado_localmente" if local.get("ok") else local.get("reason", "verificacao_local_indisponivel") + elif manual is None: + row["availability_reason"] = "conta_nao_verificada" + elif manual["authenticated"] is not True: + row["availability_reason"] = "autenticacao_nao_confirmada" + elif manual["entitled"] is not True: + row["availability_reason"] = "entitlement_nao_confirmado" + else: + row["availability_reason"] = None + row["source_hash"] = source_hashes.get(provider) + row["mapping"] = curated_mapping(provider, row["model_id"], row.get("variant")) + native = native_overrides.get(row["model_key"]) + if native: + if tool == "opencode" and native["billing_mode"] != row["billing_mode"]: + raise ValueError("billing_mode do override diverge do provider publicado") + if tool != "omp" and native["billing_mode"] == "omp_payg": + raise ValueError("OMP payg não pode ser roteado por outra ferramenta") + row["billing_mode"] = native["billing_mode"] + tariff_fields = ("billing_mode", "source_url", "captured_at", "account_confirmed", + "price_per_token_usd", "available_balance_usd") + row["native_tariff"] = {k: native[k] for k in tariff_fields if k in native} + if native["billing_mode"] == "go_quota": + row["quota_window_remaining"] = native["quota_window_remaining"] + row["quota_window_debit"] = native["quota_window_debit"] + row["quota_verified_at"] = native["captured_at"] + row["quota_source_url"] = native["source_url"] + row["use_balance_fallback"] = native["use_balance_fallback"] + invalid_availability = {key for key in set(availability_map) - applied_availability if key[0] in requested} + if invalid_availability: + raise ValueError("snapshot de disponibilidade referencia modelo/variante fora da listagem local") + invalid_native = {key for key in native_overrides if key not in {r["model_key"] for r in catalog_rows}} + if invalid_native: + raise ValueError("tarifa native referencia modelo/variante fora do catálogo") + + prices_payload, price_url, price_hash = fetcher(OPENROUTER_URL) + prices = parse_openrouter(prices_payload, or_overrides, price_url, captured) + source_hashes["openrouter"] = price_hash + for row in catalog_rows: + row["score"] = scores_by_key.get((row["provider"], row["model_id"], row.get("variant"))) + mapping = row.get("mapping") + price_id = mapping["openrouter_id"] if mapping else None + row["openrouter"] = prices.get(price_id) if price_id else None + row["or_price_per_token"] = row["openrouter"]["price_per_token_usd"] if row["openrouter"] else {"input": None, "output": None, "cache_read": None, "cache_write": None} + row["price_conditions"] = row["openrouter"]["conditions"] if row["openrouter"] else None + snapshot = {"schema_version": 1, "tool": tool, "captured_at": captured, "source_hashes": source_hashes, + "providers": list(requested), "models": catalog_rows, "openrouter": prices, + "benchmark": {"metric_id": AA_METRIC, "version": AA_VERSION, "records": scores}} + snapshot["snapshot_hash"] = sha256(canonical_json({k: v for k, v in snapshot.items() if k != "snapshot_hash"})) + _atomic_json(cache / f"catalog-{tool}.json", snapshot) + return { + "tool": tool, "model_count": len(catalog_rows), "provider_count": len(requested), + "local_discovery": {p: {"ok": v["ok"], "count": len(v["models"]), "reason": v.get("reason")} + for p, v in local_result.items()}, + "snapshot_hash": snapshot["snapshot_hash"], "captured_at": captured, "source_hashes": source_hashes, + } + + +def load_snapshot(tool: str = "opencode", cache_dir: str | Path | None = None) -> dict[str, Any] | None: + cache = Path(cache_dir) if cache_dir is not None else CACHE_DIR + snapshot = _read_json(cache / f"catalog-{tool}.json", None) + return snapshot if isinstance(snapshot, dict) else None + + +def band_for_score(score: Any) -> str | None: + value = decimal_value(score) + if value is None: + return None + if Decimal(10) <= value < Decimal(20): + return "leve" + if Decimal(20) <= value < Decimal(50): + return "media" + if Decimal(50) <= value <= Decimal(100): + return "alta" + return None + + +def list_models(tool: str = "opencode", cache_dir: str | Path | None = None, show_missing: bool = True, + as_of_utc: str | None = None) -> list[dict[str, Any]]: + snapshot = load_snapshot(tool, cache_dir) + if snapshot is None: + return [] + now = _parse_utc(as_of_utc) if as_of_utc is not None else dt.datetime.now(dt.timezone.utc) + if now is None: + raise ValueError("as_of_utc deve ser data/hora UTC ISO 8601") + result = [] + for model in snapshot.get("models", []): + score = model.get("score") or {} + price = model.get("or_price_per_token") or {} + availability = model.get("availability") or {} + local_listed = availability.get("local_listed") + if not show_missing and local_listed is not True: + continue + display = model.get("openrouter", {}).get("display_usd_per_1m", {}) if model.get("openrouter") else {} + stale_reasons = [] + or_snapshot = model.get("openrouter") or {} + price_time = _parse_utc(or_snapshot.get("captured_at")) if or_snapshot else None + if price_time is None: + stale_reasons.append("preco_referencial_ausente") + elif now - price_time > dt.timedelta(hours=24): + stale_reasons.append("preco_referencial_obsoleto") + if score: + score_time = _parse_utc(score.get("observed_at")) + if score_time is None or now - score_time > dt.timedelta(days=30): + stale_reasons.append("benchmark_obsoleto") + local_time = _parse_utc(availability.get("verified_at")) + if local_listed is True and (local_time is None or now - local_time > dt.timedelta(hours=24)): + stale_reasons.append("descoberta_local_precisa_revalidacao") + account_available = True if all(availability.get(k) is True for k in ("local_listed", "authenticated", "entitled")) else (False if any(availability.get(k) is False for k in ("local_listed", "authenticated", "entitled")) else "n/d") + native_or_quota = model.get("native_tariff") or "n/d" + if model.get("billing_mode") == "go_quota" and isinstance(native_or_quota, dict): + native_or_quota = { + **native_or_quota, + "quota_window_remaining": model.get("quota_window_remaining"), + "quota_window_debit": model.get("quota_window_debit"), + "use_balance_fallback": model.get("use_balance_fallback"), + } + result.append({ + "nome": model.get("name") or "n/d", "tool": model.get("tool") or "n/d", "model_key": model.get("model_key") or "n/d", + "openrouter_id": model.get("mapping", {}).get("openrouter_id") if model.get("mapping") else "n/d", + "preco_or_entrada_usd_1m": display.get("input") if display.get("input") is not None else "n/d", + "preco_or_saida_usd_1m": display.get("output") if display.get("output") is not None else "n/d", + "preco_or_cache_leitura_usd_1m": display.get("cache_read") if display.get("cache_read") is not None else "n/d", + "preco_or_cache_escrita_usd_1m": display.get("cache_write") if display.get("cache_write") is not None else "n/d", + "preco_or_cache_escrita_1h_usd_1m": display.get("cache_write_1h") if display.get("cache_write_1h") is not None else "n/d", + "condicao_de_preco": model.get("price_conditions") or "n/d", "coding_index_versao": score.get("version") or "n/d", + "coding_index_nota": score.get("score") or "n/d", "benchmark_por_componente_se_publicado": score.get("components") or "n/d", + "harness_aa": score.get("harness") or "n/d", "reasoning_aa": score.get("settings") or "n/d", + "grau_do_match": score.get("match_grade") or "n/d", "faixa": band_for_score(score.get("score")) or "n/d", + "preco_native_ou_cota": native_or_quota, + "disponivel_na_conta": account_available, + "motivo_da_exclusao": model.get("availability_reason") or ("sem_score_compatível" if not score else "n/d"), + "fonte": {"catalog": model.get("public_source"), "benchmark": score.get("source_url"), "openrouter": or_snapshot.get("source_url")}, + "capturado_em": model.get("captured_at") or "n/d", "stale": bool(stale_reasons), "stale_reasons": stale_reasons, + "availability": availability, "billing_mode": model.get("billing_mode") or "n/d", + "source_hash": model.get("source_hash") or "n/d", "or_price_per_token": price, "score": score or "n/d", + }) + return sorted(result, key=lambda r: (r.get("tool") or "", r.get("model_key") or "")) + + +def _parse_utc(value: Any) -> dt.datetime | None: + if not isinstance(value, str) or not value: + return None + try: + result = dt.datetime.fromisoformat(value.replace("Z", "+00:00")) + except ValueError: + return None + if result.tzinfo is None: + return None + return result.astimezone(dt.timezone.utc) + + +def coverage(rows: list[dict[str, Any]]) -> dict[str, dict[str, int]]: + counts: dict[str, dict[str, int]] = {} + for row in rows: + provider = row.get("model_key", "n/d").split("/", 1)[0] + band = row.get("faixa", "n/d") + group = counts.setdefault(f"{provider}/{band}", {"scored": 0, "total": 0}) + group["total"] += 1 + group["scored"] += row.get("coding_index_nota") != "n/d" + return counts + + +LIST_FIELDS = ( + "nome", "tool", "model_key", "openrouter_id", "preco_or_entrada_usd_1m", "preco_or_saida_usd_1m", + "preco_or_cache_leitura_usd_1m", "preco_or_cache_escrita_usd_1m", "preco_or_cache_escrita_1h_usd_1m", "condicao_de_preco", + "coding_index_versao", "coding_index_nota", "benchmark_por_componente_se_publicado", "harness_aa", + "reasoning_aa", "grau_do_match", "faixa", "preco_native_ou_cota", "disponivel_na_conta", + "motivo_da_exclusao", "fonte", "capturado_em", "stale", "stale_reasons", "availability", + "billing_mode", "source_hash", "or_price_per_token", "score", +) + + +def _csv_text(rows: list[dict[str, Any]]) -> str: + output = io.StringIO(newline="") + writer = csv.DictWriter(output, fieldnames=LIST_FIELDS, extrasaction="ignore", lineterminator="\n") + writer.writeheader() + for row in rows: + writer.writerow({k: json.dumps(v, ensure_ascii=False, sort_keys=True) if isinstance(v, (dict, list)) else ("n/d" if v is None else v) for k, v in row.items()}) + return output.getvalue() + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + sub = parser.add_subparsers(dest="command", required=True) + p_sync = sub.add_parser("sync") + p_sync.add_argument("--tool", choices=("opencode", "omp"), default="opencode") + p_sync.add_argument("--providers") + p_sync.add_argument("--aa-snapshot") + p_sync.add_argument("--price-overrides") + p_sync.add_argument("--availability-snapshot") + p_sync.add_argument("--cache-dir") + p_list = sub.add_parser("list") + p_list.add_argument("--tool", choices=("opencode", "claude", "omp"), default="opencode") + p_list.add_argument("--show-missing", action="store_true", default=True) + p_list.add_argument("--format", choices=("json", "csv"), default="json") + p_list.add_argument("--as-of-utc", help="instante UTC ISO 8601 para reproduzir staleness arquivado") + p_list.add_argument("--cache-dir") + p_route = sub.add_parser("route") + p_route.add_argument("--tool", choices=("opencode", "claude", "omp"), default="opencode") + p_route.add_argument("--role", required=True) + p_route.add_argument("--providers", help="providers explicitamente autorizados, separados por vírgula") + p_route.add_argument("--format", choices=("json",), default="json") + p_route.add_argument("--tokens", default="{}", help="perfil JSON de tokens por tarefa") + p_route.add_argument("--budget-usd") + p_route.add_argument("--allow-proxy-score", "--allow-proxy", dest="allow_proxy", action="store_true") + p_route.add_argument("--max-loss-points", "--delta-points", dest="delta_points") + p_route.add_argument("--max-price-age-hours", default="24") + p_route.add_argument("--max-score-age-days", default="30") + p_route.add_argument("--benchmark-metric", default="aa_coding_agent_index_v1.5") + p_route.add_argument("--band", choices=("leve", "media", "alta")) + p_route.add_argument("--bands-json") + p_route.add_argument("--explain", action="store_true") + p_route.add_argument("--cache-dir") + args = parser.parse_args(argv) + try: + if args.command == "sync": + providers = tuple(x for x in args.providers.split(",") if x) if args.providers else None + data = sync(args.tool, providers, args.cache_dir, aa_snapshot=args.aa_snapshot, + price_overrides=args.price_overrides, availability_snapshot=args.availability_snapshot) + print(json.dumps({"ok": True, "command": "sync", "data": data}, ensure_ascii=False)) + elif args.command == "list": + rows = list_models(args.tool, args.cache_dir, show_missing=args.show_missing, as_of_utc=args.as_of_utc) + if args.format == "csv": + print(_csv_text(rows), end="") + else: + print(json.dumps({"ok": True, "command": "list", "snapshot_available": load_snapshot(args.tool, args.cache_dir) is not None, + "coverage": coverage(rows), "models": rows}, ensure_ascii=False)) + else: + from model_router import route_from_catalog + token_profile = json.loads(args.tokens) + if not isinstance(token_profile, dict): + raise ValueError("--tokens deve ser objeto JSON") + bands = json.loads(args.bands_json) if args.bands_json else None + if bands is not None and not isinstance(bands, dict): + raise ValueError("--bands-json deve ser objeto JSON") + result = route_from_catalog(args.tool, args.role, args.providers.split(",") if args.providers else [], + args.cache_dir, explain=args.explain, tokens=token_profile, + budget_usd=args.budget_usd, allow_proxy=args.allow_proxy, + delta_points=args.delta_points, max_price_age_hours=args.max_price_age_hours, + max_score_age_days=args.max_score_age_days, band_override=args.band, bands=bands, + benchmark_metric=args.benchmark_metric) + print(json.dumps({"ok": result["selected"] is not None, **result}, ensure_ascii=False)) + except (ValueError, OSError, urllib.error.URLError, json.JSONDecodeError) as exc: + print(json.dumps({"ok": False, "command": args.command, "error": {"code": type(exc).__name__, "message": "operação indisponível; consulte o snapshot local e a origem configurada"}}, ensure_ascii=False)) + return 2 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/model_router.py b/scripts/model_router.py new file mode 100755 index 0000000..c848c15 --- /dev/null +++ b/scripts/model_router.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python3 +"""Seleção conservadora por papel; custos OpenRouter nunca são tarifa de cobrança.""" +from __future__ import annotations + +import datetime as dt +import json +from decimal import Decimal, InvalidOperation +from pathlib import Path +from typing import Any, Iterable + +from model_catalog import (AA_METRIC, AA_VERSION, CACHE_DIR, decimal_text, decimal_value, discover_local_models, + load_snapshot, openrouter_price_for_profile, reference_cost) + +ROLE_BANDS = { + "explorer": "leve", "verifier": "leve", "summarizer": "leve", + "implementer": "media", "ui-critic": "media", + "planner": "alta", "reviewer": "alta", "security-auditor": "alta", +} +DEFAULT_DELTA = {"leve": Decimal(3), "media": Decimal(3), "alta": Decimal(2)} +EXPECTED_HARNESSES = {"opencode": "OpenCode", "omp": "OMP", "claude": "Claude Code"} +WINDOWS = ("5h", "weekly", "monthly") +FIXED_BANDS = { + "leve": (Decimal(10), Decimal(20)), + "media": (Decimal(20), Decimal(50)), + "alta": (Decimal(50), Decimal(100)), +} + + +def validate_bands(bands: dict[str, Any] | None) -> dict[str, tuple[Decimal, Decimal]]: + """Aceita a configuração declarativa apenas se preservar as faixas normativas.""" + if bands is None: + return FIXED_BANDS.copy() + if not isinstance(bands, dict) or set(bands) != set(FIXED_BANDS): + raise ValueError("bands deve conter exatamente leve/media/alta") + normalized = {} + for name, limits in bands.items(): + if not isinstance(limits, (list, tuple)) or len(limits) != 2: + raise ValueError(f"faixa {name} deve declarar dois limites") + low, high = (_decimal(value) for value in limits) + if low is None or high is None: + raise ValueError(f"limites da faixa {name} devem ser decimais") + normalized[name] = (low, high) + if normalized != FIXED_BANDS: + raise ValueError("bands customizadas são recusadas; use 10..20, 20..50 e 50..100") + return normalized + + +def _score_band(score: Decimal | None, bands: dict[str, tuple[Decimal, Decimal]]) -> str | None: + if score is None: + return None + for name in ("leve", "media"): + low, high = bands[name] + if low <= score < high: + return name + low, high = bands["alta"] + return "alta" if low <= score <= high else None + + +def _time(value: Any) -> dt.datetime | None: + if not isinstance(value, str) or not value: + return None + try: + result = dt.datetime.fromisoformat(value.replace("Z", "+00:00")) + except ValueError: + return None + if result.tzinfo is None: + return None + return result.astimezone(dt.timezone.utc) + + +def _decimal(value: Any) -> Decimal | None: + try: + return decimal_value(value) + except ValueError: + return None + + +def _has_token_profile(tokens: dict[str, Any]) -> bool: + return any((_decimal(tokens.get(key)) or Decimal(0)) > 0 for key in ("input", "output", "cache_read", "cache_write")) + + +def _staleness(row: dict[str, Any], now: dt.datetime, max_price_age_hours: Decimal, max_score_age_days: Decimal, + tokens: dict[str, Any]) -> list[str]: + reasons: list[str] = [] + mode = row.get("billing_mode") + paid = mode in ("zen_balance", "go_quota", "omp_payg", "claude_subscription") + price_record = row.get("openrouter") or {"price_per_token_usd": row.get("or_price_per_token") or {}} + price = openrouter_price_for_profile(price_record, tokens) + native = row.get("native_tariff") or {} + has_reference_price = any(price.get("price_per_token_usd", {}).get(k) is not None + for k in ("input", "output", "cache_read", "cache_write")) + if paid: + if has_reference_price: + price_time = _time(price.get("captured_at")) + if price_time is None or price_time > now or (now - price_time).total_seconds() > float(max_price_age_hours * Decimal(3600)): + reasons.append("preco_referencial_obsoleto_ou_ausente") + score = row.get("score") or {} + score_time = _time(score.get("observed_at")) + if score_time is None or score_time > now or (now - score_time).total_seconds() > float(max_score_age_days * Decimal(86400)): + reasons.append("benchmark_obsoleto_ou_ausente") + if mode in ("zen_balance", "omp_payg"): + native_time = _time(native.get("captured_at")) + if native.get("account_confirmed") is not True or not str(native.get("source_url", "")).startswith("https://") or native_time is None or native_time > now or now - native_time > dt.timedelta(hours=float(max_price_age_hours)): + reasons.append("tarifa_nativa_obsoleta_ou_nao_confirmada") + if mode == "go_quota": + quota_time = _time(row.get("quota_verified_at")) + if quota_time is None or quota_time > now or now - quota_time > dt.timedelta(seconds=60) or not str(row.get("quota_source_url", "")).startswith("https://"): + reasons.append("quota_go_obsoleta_ou_nao_confirmada") + availability = row.get("availability") or {} + local_time = _time(availability.get("local_verified_at") or availability.get("verified_at")) + if local_time is None or local_time > now or now - local_time > dt.timedelta(hours=24): + reasons.append("disponibilidade_local_precisa_revalidacao") + account_time = _time(availability.get("account_verified_at")) + if availability.get("authenticated") is True and availability.get("entitled") is True: + if account_time is None or account_time > now or now - account_time > dt.timedelta(hours=24): + reasons.append("entitlement_precisa_revalidacao") + if mode in ("zen_balance", "omp_payg"): + balance_time = _time(availability.get("balance_verified_at")) + if availability.get("balance_confirmed") is not True or balance_time is None or balance_time > now or now - balance_time > dt.timedelta(seconds=60): + reasons.append("saldo_nao_confirmado_ou_obsoleto") + return reasons + + +def _profile_cost(row: dict[str, Any], tokens: dict[str, Any]) -> Decimal | None: + record = row.get("openrouter") or {"price_per_token_usd": row.get("or_price_per_token") or {}} + profile = openrouter_price_for_profile(record, tokens) + return reference_cost(profile.get("price_per_token_usd") or {}, tokens) + + +def _native_cost_and_headroom(row: dict[str, Any], tokens: dict[str, Any]) -> tuple[Decimal | None, Decimal | None, str | None]: + mode = row.get("billing_mode") + native = row.get("native_tariff") + if mode in ("zen_balance", "omp_payg"): + if not _has_token_profile(tokens): + return None, None, "perfil_tokens_native_nao_configurado" + if not isinstance(native, dict) or not isinstance(native.get("price_per_token_usd"), dict) or native.get("account_confirmed") is not True: + return None, None, "tarifa_native_nao_confirmada" + amount = reference_cost(native["price_per_token_usd"], tokens) + if amount is None: + return None, None, "tarifa_native_incompleta_para_perfil" + balance = _decimal(native.get("available_balance_usd")) + availability = row.get("availability") or {} + if availability.get("balance_confirmed") is not True: + return None, None, "saldo_nao_confirmado" + if balance is None or balance < 0: + return None, None, "saldo_desconhecido" + if balance < amount: + return None, balance, "saldo_insuficiente" + return amount, balance - amount, None + if mode == "go_quota": + if not _has_token_profile(tokens): + return None, None, "perfil_tokens_go_nao_configurado" + remaining = row.get("quota_window_remaining") + debit = row.get("quota_window_debit") + if row.get("use_balance_fallback"): + return None, None, "fallback_go_para_saldo_zen_nao_autorizado" + if not isinstance(remaining, dict) or debit is None: + return None, None, "quota_go_nao_confirmada" + debit_map = debit if isinstance(debit, dict) else {window: debit for window in WINDOWS} + headrooms: list[Decimal] = [] + for window in WINDOWS: + available = _decimal(remaining.get(window)) + used = _decimal(debit_map.get(window)) + if available is None or used is None or available < 0 or used < 0: + return None, None, f"janela_go_{window}_desconhecida" + if used > available: + return None, None, f"quota_go_{window}_insuficiente" + headrooms.append(available - used) + representative = _decimal(debit_map.get("monthly")) + if representative is None: + return None, min(headrooms), "debito_go_nao_confirmado" + return representative, min(headrooms), None + if mode == "claude_subscription": + amount = _decimal(row.get("subscription_consumption_usd")) + if amount is None: + return None, None, "consumo_assinatura_nao_mensuravel" + return amount, None, None + return None, None, "modo_de_cobranca_desconhecido" + + +def route(candidates: Iterable[dict[str, Any]], role: str, *, allowed_providers: Iterable[str] = (), + tokens: dict[str, Any] | None = None, budget_usd: Any = None, allow_proxy: bool = False, + delta_points: Any = None, max_price_age_hours: Any = 24, max_score_age_days: Any = 30, + now: dt.datetime | None = None, band_override: str | None = None, + bands: dict[str, Any] | None = None, + benchmark_metric: str = "aa_coding_agent_index_v1.5") -> dict[str, Any]: + """Returns the stable API: selected, ranking, reason. Never dispatches a model.""" + default_band = ROLE_BANDS.get(role) + if default_band is None: + return {"selected": None, "ranking": [], "reason": f"papel_desconhecido:{role}"} + normalized_bands = validate_bands(bands) + band = band_override or default_band + if band not in normalized_bands: + raise ValueError("band deve ser uma faixa fixa: leve, media ou alta") + if benchmark_metric != "aa_coding_agent_index_v1.5": + raise ValueError("benchmark_metric incompatível; somente aa_coding_agent_index_v1.5 é aceito") + if now is None: + now = dt.datetime.now(dt.timezone.utc) + if now.tzinfo is None: + raise ValueError("now precisa de timezone") + now = now.astimezone(dt.timezone.utc) + tokens = tokens or {} + providers = set(allowed_providers) + if not providers: + return {"selected": None, "ranking": [], "reason": "provider_nao_autorizado; informe --providers explicitamente"} + if budget_usd is None: + budget = None + else: + budget = _decimal(budget_usd) + if budget is None or budget < 0: + raise ValueError("budget_usd precisa ser decimal não negativo") + max_price_age = _decimal(max_price_age_hours) + max_score_age = _decimal(max_score_age_days) + if max_price_age is None or max_score_age is None: + raise ValueError("TTL precisa ser decimal não negativo") + delta = _decimal(delta_points) if delta_points is not None else DEFAULT_DELTA[band] + if delta is None or delta < 0 or max_price_age < 0 or max_score_age < 0: + raise ValueError("delta e TTL devem ser decimais não negativos") + + ranking = [] + eligible = [] + reasons_seen: list[str] = [] + for row in candidates: + if not isinstance(row, dict): + continue + provider = row.get("provider") + score = row.get("score") or {} + parsed_score = _decimal(score.get("score")) + row_band = _score_band(parsed_score, normalized_bands) + reference = _profile_cost(row, tokens) + native_cost, headroom, native_error = _native_cost_and_headroom(row, tokens) + excluded: list[str] = [] + availability = row.get("availability") or {} + if provider not in providers: + excluded.append("provider_nao_autorizado") + if availability.get("local_listed") is not True: + excluded.append("nao_listado_localmente") + if availability.get("authenticated") is not True: + excluded.append("autenticacao_nao_confirmada") + if availability.get("entitled") is not True: + excluded.append("entitlement_nao_confirmado") + required_provenance = all(score.get(field) not in (None, "", {}) for field in ("agent", "harness", "settings", "source_url", "observed_at")) + if not required_provenance or not str(score.get("source_url", "")).startswith("https://artificialanalysis.ai/"): + excluded.append("proveniencia_do_benchmark_incompleta") + if score.get("variant") != row.get("variant"): + excluded.append("mapeamento_de_variante_incompativel") + expected_harness = EXPECTED_HARNESSES.get(row.get("tool")) + if score.get("match_grade") == "exact" and score.get("harness") != expected_harness: + excluded.append("harness_incompativel") + if score.get("metric_id") != AA_METRIC or str(score.get("version")) != AA_VERSION: + excluded.append("indice_incompativel_ou_ausente") + if parsed_score is None: + excluded.append("no_scored_candidate") + if score.get("match_grade") not in (("exact", "proxy") if allow_proxy else ("exact",)): + excluded.append("match_proxy_nao_autorizado" if score.get("match_grade") == "proxy" else "mapeamento_de_variante_incompativel") + if row_band != band: + excluded.append("fora_da_faixa" if row_band else "sem_faixa_de_nota") + excluded.extend(_staleness(row, now, max_price_age, max_score_age, tokens)) + if native_error: + excluded.append(native_error) + if row.get("billing_mode") in ("zen_balance", "omp_payg") and budget is None: + excluded.append("orcamento_zen_nao_configurado" if row.get("billing_mode") == "zen_balance" else "orcamento_payg_omp_nao_configurado") + if native_cost is not None and budget is not None and native_cost > budget: + excluded.append("orcamento_excedido") + if row.get("billing_mode") == "claude_subscription" and native_cost is None: + excluded.append("consumo_assinatura_nao_mensuravel") + if row.get("billing_mode") == "go_quota" and headroom is None and native_error is None: + excluded.append("cota_go_nao_confirmada") + key = row.get("model_key") or f"{provider}/{row.get('model_id', '')}" + entry = { + "model_key": key, "provider": provider, "billing_mode": row.get("billing_mode"), + "score": decimal_text(parsed_score), "band": row_band, "match_grade": score.get("match_grade"), + "eligible": not excluded, "exclusion_reasons": excluded, + "reference_cost_usd": decimal_text(reference), "native_cost_or_quota_debit_usd": decimal_text(native_cost), + "quota_headroom_usd": decimal_text(headroom), + } + ranking.append(entry) + if not excluded: + eligible.append((row, entry, parsed_score, native_cost, headroom)) + else: + reasons_seen.extend(excluded) + ranking.sort(key=lambda entry: ( + not entry["eligible"], + _decimal(entry.get("native_cost_or_quota_debit_usd")) if _decimal(entry.get("native_cost_or_quota_debit_usd")) is not None else Decimal("Infinity"), + -(_decimal(entry.get("score")) or Decimal(0)), + -(_decimal(entry.get("quota_headroom_usd")) or Decimal(0)), + entry["model_key"], + )) + if not ranking: + return {"selected": None, "ranking": [], "reason": "no_scored_candidate"} + + if not eligible: + if "no_scored_candidate" in reasons_seen or "indice_incompativel_ou_ausente" in reasons_seen: + reason = "no_scored_candidate_or_compatible_index" + elif "fora_da_faixa" in reasons_seen or "sem_faixa_de_nota" in reasons_seen: + reason = f"faixa_vazia:{band}" + elif "quota_go_5h_insuficiente" in reasons_seen or "quota_go_weekly_insuficiente" in reasons_seen or "quota_go_monthly_insuficiente" in reasons_seen: + reason = "quota_go_insuficiente; execução pausada antes da chamada" + elif "fallback_go_para_saldo_zen_nao_autorizado" in reasons_seen: + reason = "fallback_go_para_saldo_zen_nao_autorizado" + else: + reason = "nenhum_candidato_elegivel:" + ",".join(sorted(set(reasons_seen))) + return {"selected": None, "ranking": ranking, "reason": reason} + + top_score = max(item[2] for item in eligible) + plateau = [item for item in eligible if item[2] >= top_score - delta] + # custo real da ferramenta; desempate: score, folga de quota, ID lexical. + plateau.sort(key=lambda item: (item[3], -item[2], -(item[4] if item[4] is not None else Decimal(0)), item[1]["model_key"])) + chosen = plateau[0] + row, entry, score_value, native_cost, headroom = chosen + selected = { + "model_key": entry["model_key"], + "billing_mode": {"zen_balance": "zen", "go_quota": "go", "omp_payg": "payg", "claude_subscription": "subscription"}.get(row.get("billing_mode"), row.get("billing_mode")), + "billing_mode_detail": row.get("billing_mode"), "score": entry["score"], + "band": band, "match_grade": entry["match_grade"], + "reference_cost_usd": entry["reference_cost_usd"], + "native_cost_or_quota_debit_usd": decimal_text(native_cost), + "estimated_native_usd": decimal_text(native_cost) if row.get("billing_mode") in ("zen_balance", "omp_payg") else None, + "native_tariff": row.get("native_tariff"), + "available_balance_usd": (row.get("native_tariff") or {}).get("available_balance_usd"), + "balance_confirmed": (row.get("availability") or {}).get("balance_confirmed") is True, + "balance_verified_at": (row.get("availability") or {}).get("balance_verified_at"), + "quota_window_remaining": row.get("quota_window_remaining"), + "quota_window_debit": row.get("quota_window_debit"), + "use_balance_fallback": row.get("use_balance_fallback") if row.get("billing_mode") == "go_quota" else False, + "quota_headroom_usd": decimal_text(headroom), + "score_top": decimal_text(top_score), "plateau_delta_points": decimal_text(delta), + } + if row.get("tool") == "omp": + variant = row.get("variant") + selected["dispatch_model_key"] = f"{row['provider']}/{row['model_id']}" + (f":{variant}" if variant else "") + reason = f"menor consumo relevante dentro do platô {band} (score >= {decimal_text(top_score - delta)}); custo OpenRouter é apenas referência" + if len(plateau) > 1: + reason += "; desempate determinístico por consumo, score, folga de cota e model_key" + return {"selected": selected, "ranking": ranking, "reason": reason} + + +def route_from_catalog(tool: str, role: str, allowed_providers: Iterable[str], cache_dir: str | Path | None = None, + *, explain: bool = False, tokens: dict[str, Any] | None = None, budget_usd: Any = None, + allow_proxy: bool = False, delta_points: Any = None, max_price_age_hours: Any = 24, + max_score_age_days: Any = 30, band_override: str | None = None, + bands: dict[str, Any] | None = None, + benchmark_metric: str = "aa_coding_agent_index_v1.5", + now: dt.datetime | None = None, + local_discoverer=discover_local_models, omp_discoverer=None) -> dict[str, Any]: + from model_catalog import discover_omp_models + clock = now or dt.datetime.now(dt.timezone.utc) + snapshot = load_snapshot(tool, cache_dir) + if snapshot is None: + return {"selected": None, "ranking": [], "reason": "snapshot_de_catalogo_ausente; execute models sync"} + if tool not in ("opencode", "omp"): + return {"selected": None, "ranking": [], "reason": f"catalogo_local_nao_disponivel_para_{tool}"} + providers = tuple(allowed_providers) + if not providers: + return route(snapshot.get("models", []), role, allowed_providers=providers, tokens=tokens, budget_usd=budget_usd, + allow_proxy=allow_proxy, delta_points=delta_points, max_price_age_hours=max_price_age_hours, + max_score_age_days=max_score_age_days, band_override=band_override, bands=bands, + benchmark_metric=benchmark_metric, now=clock) + discoverer = local_discoverer if tool == "opencode" else (omp_discoverer or discover_omp_models) + discoveries = {provider: discoverer(provider) for provider in sorted(set(providers))} + verified_at = clock.astimezone(dt.timezone.utc).isoformat().replace("+00:00", "Z") + candidates = [] + for original in snapshot.get("models", []): + row = dict(original) + availability = dict(row.get("availability") or {}) + provider = row.get("provider") + result = discoveries.get(provider) + if result is not None and result.get("ok"): + local_ids = set(result.get("models", [])) + local_model_key = row["model_key"] if tool == "omp" else row["model_id"] + (f"#{row['variant']}" if row.get("variant") else "") + availability["local_listed"] = local_model_key in local_ids + availability["local_verified_at"] = result.get("verified_at", verified_at) + elif provider in discoveries: + availability["local_listed"] = None + availability["local_verified_at"] = None + row["availability"] = availability + candidates.append(row) + return route(candidates, role, allowed_providers=providers, tokens=tokens, budget_usd=budget_usd, + allow_proxy=allow_proxy, delta_points=delta_points, max_price_age_hours=max_price_age_hours, + max_score_age_days=max_score_age_days, band_override=band_override, bands=bands, + benchmark_metric=benchmark_metric, now=clock) + + +def main(argv: list[str] | None = None) -> int: + import argparse + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("--tool", choices=("opencode", "omp", "claude"), default="opencode") + parser.add_argument("--role", required=True) + parser.add_argument("--providers", default="") + parser.add_argument("--format", choices=("json",), default="json") + parser.add_argument("--cache-dir") + args = parser.parse_args(argv) + result = route_from_catalog(args.tool, args.role, [p for p in args.providers.split(",") if p], args.cache_dir, explain=True) + print(json.dumps(result, ensure_ascii=False)) + return 0 if result["selected"] is not None else 2 + + +if __name__ == "__main__": + raise SystemExit(main())