From 5ac0dbeedda836f598190939a96ade5381b88e91 Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Fri, 28 Aug 2026 16:38:25 +0200 Subject: [PATCH 1/4] feat(models): add Qwen 3.8 Flash and GLM 5.3 Flash Synchronize the static model catalog with command-code@1.36.0, which adds Qwen/Qwen3.8-Flash (reasoning efforts low, medium, xhigh) and z-ai/glm-5.3-flash (low, high, max), the free minimax/minimax-m3-free model, and the glm-5.3-flash output limit, and drops the retired stealth/ox-alpha. --- README.md | 2 +- src/commandcode-catalog.ts | 17 +++++++++++------ tests/test-models.ts | 28 +++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7256c32..a39510c 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ The following environment variables are intended for tests, local mocks, and com ## Image input -The provider advertises image input only for models marked with the `image` input modality in the official Command Code CLI model catalog. The capability snapshot currently follows `command-code@1.32.2`; unknown models default to text-only until their upstream metadata is reviewed. A daily GitHub Actions job synchronizes the CLI version, image capabilities, reasoning flags, reasoning efforts, and model-specific output limits with the latest published CLI package and opens or updates a reviewable pull request when they change. Pricing remains manually reviewed because temporary promotions and long-context tiers require explicit review. +The provider advertises image input only for models marked with the `image` input modality in the official Command Code CLI model catalog. The capability snapshot currently follows `command-code@1.36.0`; unknown models default to text-only until their upstream metadata is reviewed. A daily GitHub Actions job synchronizes the CLI version, image capabilities, reasoning flags, reasoning efforts, and model-specific output limits with the latest published CLI package and opens or updates a reviewable pull request when they change. Pricing remains manually reviewed because temporary promotions and long-context tiers require explicit review. For vision-capable models, Pi's native provider adapters forward image blocks from user messages and tool results using the documented OpenAI or Anthropic message schema. Unknown and text-only models remain marked text-only in Pi. diff --git a/src/commandcode-catalog.ts b/src/commandcode-catalog.ts index 6840f5f..a136a8b 100644 --- a/src/commandcode-catalog.ts +++ b/src/commandcode-catalog.ts @@ -1,10 +1,10 @@ -export const COMMAND_CODE_CLI_VERSION = "1.32.2" +export const COMMAND_CODE_CLI_VERSION = "1.36.0" export type CommandCodeInputType = "text" | "image" export type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max" /** - * Generated from command-code@1.32.2 by `npm run sync:commandcode-catalog`. + * Generated from command-code@1.36.0 by `npm run sync:commandcode-catalog`. * Do not edit manually. */ export const MODEL_INPUT_MODALITIES: Readonly> = { @@ -31,6 +31,7 @@ export const MODEL_INPUT_MODALITIES: Readonly> = { @@ -76,6 +78,7 @@ export const MODEL_REASONING: Readonly> = { "meta/muse-spark-1.1": true, "meta/muse-spark-1.2": true, "meta/muse-spark-1.2-contributor": true, + "minimax/minimax-m3-free": true, "MiniMaxAI/MiniMax-M3": true, "moonshotai/Kimi-K2.7-Code": true, "moonshotai/Kimi-K2.7-Code-Highspeed": true, @@ -88,9 +91,9 @@ export const MODEL_REASONING: Readonly> = { "Qwen/Qwen3.7-Max": true, "Qwen/Qwen3.7-Plus": true, "Qwen/Qwen3.8-27B": true, + "Qwen/Qwen3.8-Flash": true, "Qwen/Qwen3.8-Max": true, "sakana/fugu-ultra": true, - "stealth/ox-alpha": true, "stepfun/Step-3.5-Flash": true, "stepfun/Step-3.7-Flash": true, "tencent/hy3-paid": true, @@ -98,6 +101,7 @@ export const MODEL_REASONING: Readonly> = { "thinkingmachines/inkling-small": true, "xai/grok-4.5": true, "xai/grok-4.6": true, + "z-ai/glm-5.3-flash": true, "zai-org/GLM-5.2": true, "zai-org/GLM-5.3": true, } @@ -125,11 +129,12 @@ export const MODEL_EFFORTS: Readonly> = { "poolside/laguna-s-2.1-free": 32_768, "Qwen/Qwen3.8-27B": 32_768, - "stealth/ox-alpha": 131_072, + "z-ai/glm-5.3-flash": 131_072, } diff --git a/tests/test-models.ts b/tests/test-models.ts index c40d321..5773221 100644 --- a/tests/test-models.ts +++ b/tests/test-models.ts @@ -112,13 +112,15 @@ describe("commandCodeModelsFromApiResponse()", () => { ]) assert.deepEqual(inputModalitiesForModel("Qwen/Qwen3.8-27B"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("google/gemini-3.7-flash"), ["text", "image"]) - assert.deepEqual(inputModalitiesForModel("stealth/ox-alpha"), ["text", "image"]) + assert.deepEqual(inputModalitiesForModel("Qwen/Qwen3.8-Flash"), ["text", "image"]) + assert.deepEqual(inputModalitiesForModel("z-ai/glm-5.3-flash"), ["text", "image"]) + assert.deepEqual(inputModalitiesForModel("minimax/minimax-m3-free"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("deepseek/deepseek-v4-pro"), ["text"]) assert.deepEqual(inputModalitiesForModel("zai-org/GLM-5.3"), ["text"]) assert.deepEqual(inputModalitiesForModel("unknown-new-model"), ["text"]) assert.equal(modelSupportsImageInput("gpt-5.6-luna"), true) assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-flash-vision-exp"), true) - assert.equal(modelSupportsImageInput("stealth/ox-alpha"), true) + assert.equal(modelSupportsImageInput("z-ai/glm-5.3-flash"), true) assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-pro"), false) assert.ok(Object.keys(MODEL_INPUT_MODALITIES).length > 0) for (const modalities of Object.values(MODEL_INPUT_MODALITIES)) { @@ -149,7 +151,7 @@ describe("commandCodeModelsFromApiResponse()", () => { }, }) assert.equal(models[2]?.reasoning, false) - assert.equal(Object.keys(MODEL_REASONING).length, 48) + assert.equal(Object.keys(MODEL_REASONING).length, 50) }) it("uses model-specific output limits from the CLI catalog", () => { @@ -157,7 +159,7 @@ describe("commandCodeModelsFromApiResponse()", () => { object: "list", data: [ { ...API_RESPONSE.data[0], id: "Qwen/Qwen3.8-27B", context_length: 262_144 }, - { ...API_RESPONSE.data[0], id: "stealth/ox-alpha", context_length: 1_048_576 }, + { ...API_RESPONSE.data[0], id: "z-ai/glm-5.3-flash", context_length: 1_048_576 }, { ...API_RESPONSE.data[0], id: "poolside/laguna-s-2.1-free", @@ -170,7 +172,7 @@ describe("commandCodeModelsFromApiResponse()", () => { models.map(({ id, maxTokens }) => ({ id, maxTokens })), [ { id: "Qwen/Qwen3.8-27B", maxTokens: 32_768 }, - { id: "stealth/ox-alpha", maxTokens: 131_072 }, + { id: "z-ai/glm-5.3-flash", maxTokens: 131_072 }, { id: "poolside/laguna-s-2.1-free", maxTokens: 32_768 }, ], ) @@ -217,6 +219,22 @@ describe("commandCodeModelsFromApiResponse()", () => { xhigh: null, max: "max", }) + assert.deepEqual(thinkingLevelMapForEfforts(MODEL_EFFORTS["Qwen/Qwen3.8-Flash"]), { + minimal: null, + low: "low", + medium: "medium", + high: null, + xhigh: "xhigh", + max: null, + }) + assert.deepEqual(thinkingLevelMapForEfforts(MODEL_EFFORTS["z-ai/glm-5.3-flash"]), { + minimal: null, + low: "low", + medium: null, + high: "high", + xhigh: null, + max: "max", + }) assert.deepEqual(thinkingMetadataForModel("new-model-without-metadata"), undefined) }) From b267241e33b6b31431dce5ec7b2da4e83da96bad Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Fri, 28 Aug 2026 16:40:49 +0200 Subject: [PATCH 2/4] feat(pricing): add display pricing for Qwen 3.8 Flash and GLM 5.3 Flash Qwen/Qwen3.8-Flash lists $0.16 input, $0.47 output, and $0.016 cache read per million tokens, and z-ai/glm-5.3-flash lists $0.15, $0.50, and $0.03; the official pricing page documents no cache-write rate for either model. --- src/pricing.ts | 2 ++ tests/fixtures/commandcode-model-ids.json | 2 ++ tests/fixtures/commandcode-pricing.json | 2 ++ tests/test-pricing.ts | 12 ++++++++++++ 4 files changed, 18 insertions(+) diff --git a/src/pricing.ts b/src/pricing.ts index fddd2a3..71ba138 100644 --- a/src/pricing.ts +++ b/src/pricing.ts @@ -54,6 +54,7 @@ export const MODEL_COSTS: Readonly> = { }, "moonshotai/Kimi-K2.6": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 }, "moonshotai/Kimi-K2.5": { input: 0.6, output: 3, cacheRead: 0.1, cacheWrite: 0 }, + "z-ai/glm-5.3-flash": { input: 0.15, output: 0.5, cacheRead: 0.03, cacheWrite: 0 }, "zai-org/GLM-5.3": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, "zai-org/GLM-5.2": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, "zai-org/GLM-5.2-Fast": { input: 3, output: 10.25, cacheRead: 0.5, cacheWrite: 0 }, @@ -84,6 +85,7 @@ export const MODEL_COSTS: Readonly> = { }, "Qwen/Qwen3.8-Max": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 2.5 }, "Qwen/Qwen3.8-27B": { input: 0.4, output: 3, cacheRead: 0.04, cacheWrite: 0 }, + "Qwen/Qwen3.8-Flash": { input: 0.16, output: 0.47, cacheRead: 0.016, cacheWrite: 0 }, "Qwen/Qwen3.7-Max": { input: 2.5, output: 7.5, cacheRead: 0.5, cacheWrite: 3.13 }, "Qwen/Qwen3.7-Plus": { input: 0.4, diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index 2a69168..15c677c 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -24,6 +24,7 @@ "moonshotai/Kimi-K2.7-Code-Highspeed", "moonshotai/Kimi-K2.6", "moonshotai/Kimi-K2.5", + "z-ai/glm-5.3-flash", "zai-org/GLM-5.3", "zai-org/GLM-5.2", "zai-org/GLM-5.2-Fast", @@ -36,6 +37,7 @@ "xiaomi/mimo-v2.5", "Qwen/Qwen3.8-Max", "Qwen/Qwen3.8-27B", + "Qwen/Qwen3.8-Flash", "Qwen/Qwen3.7-Max", "Qwen/Qwen3.7-Plus", "Qwen/Qwen3.7-Flash", diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index c65ae0c..e8a45bb 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -19,6 +19,7 @@ "moonshotai/Kimi-K2.7-Code-Highspeed": [1.9, 8, 0.38, 0], "moonshotai/Kimi-K2.6": [0.95, 4, 0.16, 0], "moonshotai/Kimi-K2.5": [0.6, 3, 0.1, 0], + "z-ai/glm-5.3-flash": [0.15, 0.5, 0.03, 0], "zai-org/GLM-5.3": [1.4, 4.4, 0.26, 0], "zai-org/GLM-5.2": [1.4, 4.4, 0.26, 0], "zai-org/GLM-5.2-Fast": [3, 10.25, 0.5, 0], @@ -31,6 +32,7 @@ "xiaomi/mimo-v2.5": [0.14, 0.28, 0.0028, 0], "Qwen/Qwen3.8-Max": [2, 6, 0.25, 2.5], "Qwen/Qwen3.8-27B": [0.4, 3, 0.04, 0], + "Qwen/Qwen3.8-Flash": [0.16, 0.47, 0.016, 0], "Qwen/Qwen3.7-Max": [2.5, 7.5, 0.5, 3.13], "Qwen/Qwen3.7-Plus": [0.4, 1.6, 0.08, 0.5], "Qwen/Qwen3.7-Flash": [0.03, 0.13, 0.006, 0.038], diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index d7141a5..1cdc3c8 100644 --- a/tests/test-pricing.ts +++ b/tests/test-pricing.ts @@ -144,6 +144,18 @@ describe("MODEL_COSTS pricing overlay", () => { cacheRead: 0.04, cacheWrite: 0, }) + assertCost("Qwen/Qwen3.8-Flash", { + input: 0.16, + output: 0.47, + cacheRead: 0.016, + cacheWrite: 0, + }) + assertCost("z-ai/glm-5.3-flash", { + input: 0.15, + output: 0.5, + cacheRead: 0.03, + cacheWrite: 0, + }) assertCost("google/gemini-3.7-flash", { input: 0.75, output: 3.75, From 21a2c0518525b2c42ded0c3527e6f6aabc7d4429 Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Fri, 28 Aug 2026 16:41:15 +0200 Subject: [PATCH 3/4] feat(pricing): refresh catalog pricing snapshot Add the free minimax/minimax-m3-free and minimax/minimax-m2.7-free promotional variants (free through September 5, 2026) and tencent/hy4-preview, drop the retired stealth/ox-alpha, and refresh the model-id and pricing snapshots to the current 62-model catalog verified on 2026-08-28. --- src/pricing.ts | 11 +++++++++-- tests/fixtures/commandcode-model-ids.json | 6 ++++-- tests/fixtures/commandcode-pricing.json | 6 ++++-- tests/test-pricing.ts | 16 +++++++++++++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/pricing.ts b/src/pricing.ts index 71ba138..e62fbe3 100644 --- a/src/pricing.ts +++ b/src/pricing.ts @@ -20,7 +20,7 @@ export interface TemporaryPricing { } export const PRICING_SOURCE_URL = "https://commandcode.ai/docs/resources/pricing-limits" -export const PRICING_LAST_VERIFIED = "2026-08-25" +export const PRICING_LAST_VERIFIED = "2026-08-28" export const ZERO_MODEL_COST: CommandCodeModelCost = { input: 0, @@ -40,10 +40,12 @@ export const ZERO_MODEL_COST: CommandCodeModelCost = { export const MODEL_COSTS: Readonly> = { // Free models "poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - "stealth/ox-alpha": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + "minimax/minimax-m3-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + "minimax/minimax-m2.7-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, // Open and open-weight models "tencent/hy3-paid": { input: 0.14, output: 0.58, cacheRead: 0.035, cacheWrite: 0 }, + "tencent/hy4-preview": { input: 0.834, output: 2.501, cacheRead: 0.042, cacheWrite: 0 }, "moonshotai/Kimi-K3": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 0 }, "moonshotai/Kimi-K2.7-Code": { input: 0.95, output: 4, cacheRead: 0.19, cacheWrite: 0 }, "moonshotai/Kimi-K2.7-Code-Highspeed": { @@ -233,4 +235,9 @@ export const TEMPORARY_PRICING: readonly TemporaryPricing[] = [ expiresOn: "2026-12-31", description: "50% promotional pricing", }, + { + models: ["minimax/minimax-m3-free", "minimax/minimax-m2.7-free"], + expiresOn: "2026-09-05", + description: "free promotional pricing", + }, ] diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index 15c677c..bced74b 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,5 +1,5 @@ { - "fetchedAt": "2026-08-25T13:32:11.631Z", + "fetchedAt": "2026-08-28T09:27:52.554Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ "claude-sonnet-5", @@ -32,6 +32,8 @@ "zai-org/GLM-5", "MiniMaxAI/MiniMax-M3", "MiniMaxAI/MiniMax-M2.7", + "minimax/minimax-m3-free", + "minimax/minimax-m2.7-free", "MiniMaxAI/MiniMax-M2.5", "xiaomi/mimo-v2.5-pro", "xiaomi/mimo-v2.5", @@ -46,6 +48,7 @@ "stepfun/Step-3.7-Flash", "stepfun/Step-3.5-Flash", "tencent/hy3-paid", + "tencent/hy4-preview", "google/gemini-3.7-flash", "google/gemini-3.6-flash", "google/gemini-3.5-flash", @@ -55,7 +58,6 @@ "nvidia/nemotron-3-ultra-550b-a55b", "thinkingmachines/inkling", "thinkingmachines/inkling-small", - "stealth/ox-alpha", "poolside/laguna-s-2.1-free", "meta/muse-spark-1.1", "meta/muse-spark-1.2", diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index e8a45bb..0d2d453 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,5 +1,5 @@ { - "verifiedAt": "2026-08-25", + "verifiedAt": "2026-08-28", "source": "https://commandcode.ai/docs/resources/pricing-limits", "tierPolicy": "Use request-wide input tiers; the highest threshold exceeded by input plus cache tokens applies to the full request.", "tiers": { @@ -40,12 +40,14 @@ "Qwen/Qwen3.6-Plus": [0.5, 3, 0.1, 0], "stepfun/Step-3.7-Flash": [0.2, 1.15, 0.04, 0], "stepfun/Step-3.5-Flash": [0.1, 0.3, 0.02, 0], + "minimax/minimax-m3-free": [0, 0, 0, 0], + "minimax/minimax-m2.7-free": [0, 0, 0, 0], "tencent/hy3-paid": [0.14, 0.58, 0.035, 0], + "tencent/hy4-preview": [0.834, 2.501, 0.042, 0], "nvidia/nemotron-3-ultra-550b-a55b": [0.6, 2.4, 0.12, 0], "thinkingmachines/inkling": [1, 4.05, 0.17, 0], "thinkingmachines/inkling-small": [0.5, 1.2, 0.1, 0], "poolside/laguna-s-2.1-free": [0, 0, 0, 0], - "stealth/ox-alpha": [0, 0, 0, 0], "claude-sonnet-5": [2, 10, 0.2, 2.5], "claude-sonnet-4-6": [3, 15, 0.3, 3.75], "claude-fable-5": [10, 50, 1, 12.5], diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index 1cdc3c8..0ec3341 100644 --- a/tests/test-pricing.ts +++ b/tests/test-pricing.ts @@ -27,7 +27,11 @@ const fixtureUrl = new URL("./fixtures/commandcode-model-ids.json", import.meta. const fixture = JSON.parse(await readFile(fixtureUrl, "utf-8")) as ModelCatalogSnapshot const pricingFixtureUrl = new URL("./fixtures/commandcode-pricing.json", import.meta.url) const pricingFixture = JSON.parse(await readFile(pricingFixtureUrl, "utf-8")) as PricingSnapshot -const freeModels = new Set(["poolside/laguna-s-2.1-free", "stealth/ox-alpha"]) +const freeModels = new Set([ + "poolside/laguna-s-2.1-free", + "minimax/minimax-m3-free", + "minimax/minimax-m2.7-free", +]) function assertCost( modelId: string, @@ -50,7 +54,7 @@ function assertCost( describe("MODEL_COSTS pricing overlay", () => { it("covers the current Command Code model catalog snapshot", () => { assert.equal(fixture.source, "https://api.commandcode.ai/provider/v1/models") - assert.match(fixture.fetchedAt, /^2026-08-25T/) + assert.match(fixture.fetchedAt, /^2026-08-28T/) const catalogIds = [...fixture.modelIds].sort() const pricedIds = Object.keys(MODEL_COSTS).sort() @@ -156,6 +160,12 @@ describe("MODEL_COSTS pricing overlay", () => { cacheRead: 0.03, cacheWrite: 0, }) + assertCost("tencent/hy4-preview", { + input: 0.834, + output: 2.501, + cacheRead: 0.042, + cacheWrite: 0, + }) assertCost("google/gemini-3.7-flash", { input: 0.75, output: 3.75, @@ -208,7 +218,7 @@ describe("MODEL_COSTS pricing overlay", () => { it("tracks pricing provenance", () => { assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits") - assert.equal(PRICING_LAST_VERIFIED, "2026-08-25") + assert.equal(PRICING_LAST_VERIFIED, "2026-08-28") }) it("fails once temporary pricing needs review", () => { From 9945a67bae40741f22b39829550e1025d7fe3e70 Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Fri, 28 Aug 2026 16:41:32 +0200 Subject: [PATCH 4/4] docs(changelog): document new models and pricing refresh --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db107f2..1f0a357 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Add `Qwen/Qwen3.8-Flash` and `z-ai/glm-5.3-flash` with their verified reasoning efforts (`low, medium, xhigh` and `low, high, max`) and display pricing. +- Refresh static model capabilities from `command-code@1.36.0`, adding the free `minimax/minimax-m3-free` model and the `z-ai/glm-5.3-flash` output limit while dropping the retired `stealth/ox-alpha`. +- Refresh display pricing for the current 62-model catalog, adding the free `minimax/minimax-m3-free` and `minimax/minimax-m2.7-free` promotional variants (free through September 5, 2026) and `tencent/hy4-preview`, and removing the retired `stealth/ox-alpha`. + ## 0.6.0 - 2026-08-25 - Allow switching from a vision-capable model to a text-only model by omitting historical image tool results while preserving their text output; direct image prompts still fail clearly.