GET https://opencode.ai/zen/go/v1/models returns 37 model ids with object, created, owned_by — and nothing you need to pick one. No price, no context window, no output limit, no vision flag. The docs page has a pricing table, but tables don’t answer “cheapest 1M-context model right now” at 11pm.

opencode-go-models is a single Go binary that layers the missing columns on:

$ opencode-go-models --latest --sort output-price -n 10

OpenCode Go · 16 latest paid models · fetched 2026-10-21 15:31 UTC

  MODEL                       NAME                        CTX   OUT     IN/OUT $       CACHE $       VISION  FIRST SEEN
  muse-spark-1.3-contributor  Muse Spark 1.3 Contributor  1.0M  131.1K  $0.1/$0.2      $0.002/$0     👁       2026-10-21
  claude-haiku-5-5            Claude Haiku 5.5            100K  128K    $0.1/$0.5      $0.01/$0.125  👁       2026-10-21
  glm-5.3-flash               GLM-5.3-Flash               1M    131.1K  $0.15/$0.5     $0.03/$0      👁       2026-10-21
  gpt-6-luna                  GPT-6 Luna                  1.1M  128K    $0.1/$0.5      $0.01/$0.125  👁       2026-10-21

No key needed for the catalog. Usage windows need one:

$ opencode-go-models --usage
  rolling    3%  (ok)
  weekly    82%  (ok)
  monthly   41%  (ok)

Where the columns come from

Three sources, strict precedence:

Layer Source Needs
id list GET /zen/go/v1/models nothing
context, limits, pricing, vision models.dev snapshot (opencode-go rows, sibling opencode rows for the 6 ids missing there, one hand patch) nothing
usage windows GET /inference/go/v1/usage --key / $OPENCODE_GO_API_KEY

The middle layer fetches straight from models.dev — no agent harness needed, no key, no local state beyond the cache. The same snapshot OMP hydrates its own opencode-go rows from, minus the middleman. A failed fetch just means fewer columns, never an error.

The only honest “added on” date

Every row’s created field is 1792595733 — identical across all 37 ids. Placeholder, not history. So the tool keeps its own: first_seen, set on first observation into ~/Notes/opencode-go-models.db, never rewritten by later refreshes. After a few --refresh runs, --sort seen shows genuinely new arrivals. A fresh --db path resets history — expected, not a bug.

Cache TTL is 6h: a stale cache auto-refreshes with a stderr note, --cached never fetches, --refresh forces. The docs carry no release feed, so the cache is the change detector.

–latest is a grouping problem

37 ids collapse to 16 families. The rule: group by vendor word (gpt, grok, qwen3, mimo), keep the highest version per group, stable beats preview. Two exceptions earned their tests: kimi-k2 vs kimi-k3 are distinct lines, and qwen3.7-max vs qwen3.8-flash are one family (qwen3). Numeric comparison alone picks wrong — hy3 (3 > 0.4 on raw runs) would beat hy4-preview, so preview rows lose to same-family stable ids.

Filters compose: --1m (1M+ context), --family qwen, --free / --all (default hides zero-price rows), --sort name|ctx|output|input-price|output-price|seen, -n, --json, --save, --sql for read-only queries against the cache.

The footer counts exactly what it hid, because a lying footer cost a commit five minutes after the first demo:

10 shown · 27 hidden (4 free/preview, 17 filtered by --latest/--family/--1m, 6 cut by -n)

Source