Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/redirect-planes.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ A **plane** is one gateway base URL with its own catalog and its own credential.
| Plane | Route id | Base URL | Credential | Models |
| :-- | :-- | :-- | :-- | --: |
| Zen (pay-as-you-go, free tier) | `opencode` | the `endpoint` family's | `OPENCODE_API_KEY` | 82 served / 132 listed |
| Go (subscription) | `opencode-go` | the `endpoint` family's | `OPENCODE_GO_API_KEY` | 30 served / 37 listed |
| Go (subscription) | `opencode-go` | the `endpoint` family's | `OPENCODE_GO_API_KEY` | 31 served / 38 listed |

Counts as of 2026-11-03 (the shipped shim, regenerated in #132 and refreshed for `pulse-alpha-free`); the document's 2026-10-09 stamp is for its measurements.

Expand All @@ -27,13 +27,13 @@ A **shape** is one wire protocol, named by the SDK a model declares in the catal

| SDK in the catalog | Protocol | Zen | Go |
| :------------------ | :---------------------- | --: | ----: |
| _(none)_ | `openai-completions` | 25 | 19 |
| _(none)_ | `openai-completions` | 25 | 20 |
| `@ai-sdk/openai` | `openai-responses` | 31 | **5** |
| `@ai-sdk/anthropic` | `anthropic-messages` | 17 | **5** |
| `@ai-sdk/mistral` | `mistral-conversations` | 1 | — |
| `@ai-sdk/google` | `google-generative-ai` | 8 | **1** |

**Absence is the signal, and it is a real one.** Both planes set a provider-level `npm` of `@ai-sdk/openai-compatible` in `models.dev`, and **no model declares it explicitly**: 0 of 82 on Zen, 0 of 30 on Go. A model that speaks the completions shape simply omits `provider.npm` and inherits it. So "no SDK" does not mean "unknown"; it means _the provider default_, which is the protocol the route was itself registered with.
**Absence is the signal, and it is a real one.** Both planes set a provider-level `npm` of `@ai-sdk/openai-compatible` in `models.dev`, and **no model declares it explicitly**: 0 of 82 on Zen, 0 of 31 on Go. A model that speaks the completions shape simply omits `provider.npm` and inherits it. So "no SDK" does not mean "unknown"; it means _the provider default_, which is the protocol the route was itself registered with.

That is why the servability check treats `undefined` as servable, and why `@ai-sdk/openai-compatible` is deliberately **not** in `PROTOCOL_FOR_SDK`: listing it would record the default as though it were an override. The coverage guard still covers the case where a model declares it explicitly. None do today, and if one did, the test would name it rather than drop the model.

Expand Down
14 changes: 14 additions & 0 deletions src/catalog-data.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/**
* Static OpenCode Go & Zen model catalog data.
*
Expand Down Expand Up @@ -309,6 +309,20 @@
reasoning: true,
reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }],
},
{
context_window: 1_048_576,
cost: {
cache_read: 0.042,
input: 0.834,
output: 2.501,
},
id: "hy4",
input_modalities: ["text", "image"],
max_output_tokens: 65_536,
name: "Hy4",
reasoning: true,
reasoning_options: [{ type: "effort", values: ["none", "high"] }],
},
{
context_window: 1_024_000,
cost: {
Expand Down
2 changes: 1 addition & 1 deletion test/catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ describe("OpenCode Model Catalog & Enrichment", () => {
});

it("ships only active, priced models in the bundled Go shim", () => {
expect(OPENCODE_GO_CATALOG.length).toBe(30);
expect(OPENCODE_GO_CATALOG.length).toBe(31);
for (const model of OPENCODE_GO_CATALOG) {
expect(model.id.length).toBeGreaterThan(0);
expect(model.name.length).toBeGreaterThan(0);
Expand Down
Loading