detached f66b947

Add Grok 4.5 and Kimi K3 to OpenCode Go catalog

The OpenCode Go provider's current model lineup
(https://opencode.ai/docs/go) lists Grok 4.5 and Kimi K3, and both are
served by the live https://opencode.ai/zen/go/v1/models endpoint, but
neither had a baked-in catalog entry. Users could not select them by ID
without a models.json override.

Add the two missing entries to the opencode-go block in
catalog_builtin.go, sorted by ID alongside the existing entries:

- grok-4.5: 500K context / 500K output, reasoning, $2/$6/$0.30
  (matches the opencode Zen and Go pricing pages and models.dev limits)
- kimi-k3: 262144 context / 131072 output, reasoning, $3/$15/$0.30
  (matches zot's existing moonshotai/openrouter/vercel kimi-k3 entries
  and the opencode Go pricing page)

Pins both with a regression test (TestOpenCodeGoCatalog).
commit
f66b94714c6e0eb22c767b333ae788161fd18d06
author
mi-skam · · 2026-07-21 13:38 UTC
parent
e9bc0c6
signature
SSH UnverifiedSHA256:Yu1uEv3+xppM2hvm7BsWney9tUWafRiTe/kq8zX8X0w The key is unknown
2 files · +35 -0
M packages/provider/catalog_builtin.go +2 -0
@@ -305,9 +305,11 @@ var builtinCatalog = []Model{
305305 {Provider: "opencode-go", ID: "glm-5", DisplayName: "GLM-5", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1, PriceOutput: 3.2, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},
306306 {Provider: "opencode-go", ID: "glm-5.1", DisplayName: "GLM-5.1", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1.4, PriceOutput: 4.4, PriceCacheRead: 0.26, BaseURL: "https://opencode.ai/zen/go/v1"},
307307 {Provider: "opencode-go", ID: "glm-5.2", DisplayName: "GLM-5.2", ContextWindow: 1024000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.91, PriceOutput: 2.86, PriceCacheRead: 0.169, BaseURL: "https://opencode.ai/zen/go/v1"},
308+ {Provider: "opencode-go", ID: "grok-4.5", DisplayName: "Grok 4.5", ContextWindow: 500000, MaxOutput: 500000, Reasoning: true, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.3, BaseURL: "https://opencode.ai/zen/go/v1"},
308309 {Provider: "opencode-go", ID: "kimi-k2.5", DisplayName: "Kimi K2.5", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.6, PriceOutput: 3, PriceCacheRead: 0.1, BaseURL: "https://opencode.ai/zen/go/v1"},
309310 {Provider: "opencode-go", ID: "kimi-k2.6", DisplayName: "Kimi K2.6", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.95, PriceOutput: 4, PriceCacheRead: 0.16, BaseURL: "https://opencode.ai/zen/go/v1"},
310311 {Provider: "opencode-go", ID: "kimi-k2.7-code", DisplayName: "Kimi K2.7 Code", ContextWindow: 262144, MaxOutput: 16384, Reasoning: true, PriceInput: 0.74, PriceOutput: 3.5, PriceCacheRead: 0.15, BaseURL: "https://opencode.ai/zen/go/v1"},
312+ {Provider: "opencode-go", ID: "kimi-k3", DisplayName: "Kimi K3", ContextWindow: 262144, MaxOutput: 131072, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, BaseURL: "https://opencode.ai/zen/go/v1"},
311313 {Provider: "opencode-go", ID: "mimo-v2.5", DisplayName: "MiMo V2.5", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.08, BaseURL: "https://opencode.ai/zen/go/v1"},
312314 {Provider: "opencode-go", ID: "mimo-v2.5-pro", DisplayName: "MiMo V2.5 Pro", ContextWindow: 1048576, MaxOutput: 128000, Reasoning: true, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},
313315 {Provider: "opencode-go", ID: "minimax-m2.5", DisplayName: "MiniMax M2.5", ContextWindow: 204800, MaxOutput: 65536, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.03, BaseURL: "https://opencode.ai/zen/go"},
@@ -305,9 +305,11 @@ var builtinCatalog = []Model{
305 {Provider: "opencode-go", ID: "glm-5", DisplayName: "GLM-5", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1, PriceOutput: 3.2, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},305 {Provider: "opencode-go", ID: "glm-5", DisplayName: "GLM-5", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1, PriceOutput: 3.2, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},
306 {Provider: "opencode-go", ID: "glm-5.1", DisplayName: "GLM-5.1", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1.4, PriceOutput: 4.4, PriceCacheRead: 0.26, BaseURL: "https://opencode.ai/zen/go/v1"},306 {Provider: "opencode-go", ID: "glm-5.1", DisplayName: "GLM-5.1", ContextWindow: 202752, MaxOutput: 32768, Reasoning: true, PriceInput: 1.4, PriceOutput: 4.4, PriceCacheRead: 0.26, BaseURL: "https://opencode.ai/zen/go/v1"},
307 {Provider: "opencode-go", ID: "glm-5.2", DisplayName: "GLM-5.2", ContextWindow: 1024000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.91, PriceOutput: 2.86, PriceCacheRead: 0.169, BaseURL: "https://opencode.ai/zen/go/v1"},307 {Provider: "opencode-go", ID: "glm-5.2", DisplayName: "GLM-5.2", ContextWindow: 1024000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.91, PriceOutput: 2.86, PriceCacheRead: 0.169, BaseURL: "https://opencode.ai/zen/go/v1"},
308+ {Provider: "opencode-go", ID: "grok-4.5", DisplayName: "Grok 4.5", ContextWindow: 500000, MaxOutput: 500000, Reasoning: true, PriceInput: 2, PriceOutput: 6, PriceCacheRead: 0.3, BaseURL: "https://opencode.ai/zen/go/v1"},
308 {Provider: "opencode-go", ID: "kimi-k2.5", DisplayName: "Kimi K2.5", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.6, PriceOutput: 3, PriceCacheRead: 0.1, BaseURL: "https://opencode.ai/zen/go/v1"},309 {Provider: "opencode-go", ID: "kimi-k2.5", DisplayName: "Kimi K2.5", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.6, PriceOutput: 3, PriceCacheRead: 0.1, BaseURL: "https://opencode.ai/zen/go/v1"},
309 {Provider: "opencode-go", ID: "kimi-k2.6", DisplayName: "Kimi K2.6", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.95, PriceOutput: 4, PriceCacheRead: 0.16, BaseURL: "https://opencode.ai/zen/go/v1"},310 {Provider: "opencode-go", ID: "kimi-k2.6", DisplayName: "Kimi K2.6", ContextWindow: 262144, MaxOutput: 65536, Reasoning: true, PriceInput: 0.95, PriceOutput: 4, PriceCacheRead: 0.16, BaseURL: "https://opencode.ai/zen/go/v1"},
310 {Provider: "opencode-go", ID: "kimi-k2.7-code", DisplayName: "Kimi K2.7 Code", ContextWindow: 262144, MaxOutput: 16384, Reasoning: true, PriceInput: 0.74, PriceOutput: 3.5, PriceCacheRead: 0.15, BaseURL: "https://opencode.ai/zen/go/v1"},311 {Provider: "opencode-go", ID: "kimi-k2.7-code", DisplayName: "Kimi K2.7 Code", ContextWindow: 262144, MaxOutput: 16384, Reasoning: true, PriceInput: 0.74, PriceOutput: 3.5, PriceCacheRead: 0.15, BaseURL: "https://opencode.ai/zen/go/v1"},
312+ {Provider: "opencode-go", ID: "kimi-k3", DisplayName: "Kimi K3", ContextWindow: 262144, MaxOutput: 131072, Reasoning: true, PriceInput: 3, PriceOutput: 15, PriceCacheRead: 0.3, BaseURL: "https://opencode.ai/zen/go/v1"},
311 {Provider: "opencode-go", ID: "mimo-v2.5", DisplayName: "MiMo V2.5", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.08, BaseURL: "https://opencode.ai/zen/go/v1"},313 {Provider: "opencode-go", ID: "mimo-v2.5", DisplayName: "MiMo V2.5", ContextWindow: 1000000, MaxOutput: 128000, Reasoning: true, PriceInput: 0.4, PriceOutput: 2, PriceCacheRead: 0.08, BaseURL: "https://opencode.ai/zen/go/v1"},
312 {Provider: "opencode-go", ID: "mimo-v2.5-pro", DisplayName: "MiMo V2.5 Pro", ContextWindow: 1048576, MaxOutput: 128000, Reasoning: true, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},314 {Provider: "opencode-go", ID: "mimo-v2.5-pro", DisplayName: "MiMo V2.5 Pro", ContextWindow: 1048576, MaxOutput: 128000, Reasoning: true, PriceInput: 1, PriceOutput: 3, PriceCacheRead: 0.2, BaseURL: "https://opencode.ai/zen/go/v1"},
313 {Provider: "opencode-go", ID: "minimax-m2.5", DisplayName: "MiniMax M2.5", ContextWindow: 204800, MaxOutput: 65536, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.03, BaseURL: "https://opencode.ai/zen/go"},315 {Provider: "opencode-go", ID: "minimax-m2.5", DisplayName: "MiniMax M2.5", ContextWindow: 204800, MaxOutput: 65536, Reasoning: true, PriceInput: 0.3, PriceOutput: 1.2, PriceCacheRead: 0.03, BaseURL: "https://opencode.ai/zen/go"},
M packages/provider/provider_test.go +33 -0
@@ -447,6 +447,39 @@ func TestGPT56CatalogEntries(t *testing.T) {
447447 }
448448 }
449449
450+// TestOpenCodeGoCatalog pins the Grok 4.5 and Kimi K3 entries added to
451+// the OpenCode Go provider. Both are listed in the vendor's current Go
452+// model lineup (https://opencode.ai/docs/go) and were missing from the
453+// baked-in catalog.
454+func TestOpenCodeGoCatalog(t *testing.T) {
455+ cases := []struct {
456+ id string
457+ context int
458+ maxOut int
459+ priceIn float64
460+ priceOut float64
461+ cacheRead float64
462+ }{
463+ {"grok-4.5", 500000, 500000, 2, 6, 0.3},
464+ {"kimi-k3", 262144, 131072, 3, 15, 0.3},
465+ }
466+ for _, tc := range cases {
467+ m, err := FindModel("opencode-go", tc.id)
468+ if err != nil {
469+ t.Fatal(err)
470+ }
471+ if m.ContextWindow != tc.context || m.MaxOutput != tc.maxOut || !m.Reasoning {
472+ t.Fatalf("opencode-go/%s limits: %+v", tc.id, m)
473+ }
474+ if m.PriceInput != tc.priceIn || m.PriceOutput != tc.priceOut || m.PriceCacheRead != tc.cacheRead {
475+ t.Fatalf("opencode-go/%s prices: %+v", tc.id, m)
476+ }
477+ if m.BaseURL != "https://opencode.ai/zen/go/v1" {
478+ t.Fatalf("opencode-go/%s baseURL: %s", tc.id, m.BaseURL)
479+ }
480+ }
481+}
482+
450483 // TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for
451484 // discovered models that don't advertise an output cap (MaxOutput == 0).
452485 func TestOpenAIOmitsZeroMaxTokens(t *testing.T) {
@@ -447,6 +447,39 @@ func TestGPT56CatalogEntries(t *testing.T) {
447 }447 }
448 }448 }
449 449
450+// TestOpenCodeGoCatalog pins the Grok 4.5 and Kimi K3 entries added to
451+// the OpenCode Go provider. Both are listed in the vendor's current Go
452+// model lineup (https://opencode.ai/docs/go) and were missing from the
453+// baked-in catalog.
454+func TestOpenCodeGoCatalog(t *testing.T) {
455+ cases := []struct {
456+ id string
457+ context int
458+ maxOut int
459+ priceIn float64
460+ priceOut float64
461+ cacheRead float64
462+ }{
463+ {"grok-4.5", 500000, 500000, 2, 6, 0.3},
464+ {"kimi-k3", 262144, 131072, 3, 15, 0.3},
465+ }
466+ for _, tc := range cases {
467+ m, err := FindModel("opencode-go", tc.id)
468+ if err != nil {
469+ t.Fatal(err)
470+ }
471+ if m.ContextWindow != tc.context || m.MaxOutput != tc.maxOut || !m.Reasoning {
472+ t.Fatalf("opencode-go/%s limits: %+v", tc.id, m)
473+ }
474+ if m.PriceInput != tc.priceIn || m.PriceOutput != tc.priceOut || m.PriceCacheRead != tc.cacheRead {
475+ t.Fatalf("opencode-go/%s prices: %+v", tc.id, m)
476+ }
477+ if m.BaseURL != "https://opencode.ai/zen/go/v1" {
478+ t.Fatalf("opencode-go/%s baseURL: %s", tc.id, m.BaseURL)
479+ }
480+ }
481+}
482+
450 // TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for483 // TestOpenAIOmitsZeroMaxTokens guards against sending max_tokens: 0 for
451 // discovered models that don't advertise an output cap (MaxOutput == 0).484 // discovered models that don't advertise an output cap (MaxOutput == 0).
452 func TestOpenAIOmitsZeroMaxTokens(t *testing.T) {485 func TestOpenAIOmitsZeroMaxTokens(t *testing.T) {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close