From 7402cf930f9710d20f8682d693dc5d4a87861a6a Mon Sep 17 00:00:00 2001 From: Aleksandr Zverev Date: Wed, 14 Oct 2026 09:50:46 +0300 Subject: [PATCH 1/3] feat(models): refresh Command Code catalog to 1.82.1 Synchronize the static capability snapshot with command-code@1.82.1. Two image-capable reasoning models are new: google/gemini-4-argon (low/medium/high) and meta/muse-wonder-1.0 (low/medium/high/xhigh). No models were retired and no existing efforts, output limits, or image flags changed. Add reviewed display pricing for both, verified against the official pricing page on 2026-10-14: gemini-4-argon at $2 input / $10 output with a $0.10 cache read, and muse-wonder-1.0 at $4 input / $20 output with a $0.20 cache read. Neither publishes a cache-write rate. --- CHANGELOG.md | 5 +++++ README.md | 2 +- src/commandcode-catalog.ts | 10 ++++++++-- src/pricing.ts | 4 +++- tests/fixtures/commandcode-model-ids.json | 4 +++- tests/fixtures/commandcode-pricing.json | 4 +++- tests/test-pricing.ts | 14 ++++++++++++-- 7 files changed, 35 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ebcaee..cd3553e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +- Refresh the static capability snapshot to `command-code@1.82.1` by adding `google/gemini-4-argon` (image input, reasoning, `low`/`medium`/`high` efforts) and `meta/muse-wonder-1.0` (image input, reasoning, `low`/`medium`/`high`/`xhigh` efforts). +- Add reviewed display pricing for both new models, verified against the official pricing page on 2026-10-14: `google/gemini-4-argon` at $2 input / $10 output / $0.10 cache read per million tokens, and `meta/muse-wonder-1.0` at $4 input / $20 output / $0.20 cache read. Neither publishes a cache-write rate. The snapshot now covers all 89 advertised models. + ## 0.7.7 - 2026-10-11 - Recognize the `off` reasoning effort now published for the DeepSeek V4 and V4.1 models, so the catalog parser no longer rejects it and the generate transport never forwards `off` as `reasoning_effort`. The Provider API and Oh My Pi adapters translate the level from the model's thinking metadata on their own wire. diff --git a/README.md b/README.md index 3000228..cc5f368 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,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.79.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, also dropping manual effort overrides that upstream has published itself, 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.82.1`; 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, also dropping manual effort overrides that upstream has published itself, 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 9f51328..40beae8 100644 --- a/src/commandcode-catalog.ts +++ b/src/commandcode-catalog.ts @@ -1,4 +1,4 @@ -export const COMMAND_CODE_CLI_VERSION = "1.79.2" +export const COMMAND_CODE_CLI_VERSION = "1.82.1" export type CommandCodeInputType = "text" | "image" export type CommandCodeReasoningEffort = @@ -11,7 +11,7 @@ export type CommandCodeReasoningEffort = | "max" /** - * Generated from command-code@1.79.2 by `npm run sync:commandcode-catalog`. + * Generated from command-code@1.82.1 by `npm run sync:commandcode-catalog`. * Do not edit manually. */ export const MODEL_INPUT_MODALITIES: Readonly> = { @@ -35,6 +35,7 @@ export const MODEL_INPUT_MODALITIES: Readonly> = { "google/gemini-3.6-flash": true, "google/gemini-3.7-flash": true, "google/gemini-3.8-flash": true, + "google/gemini-4-argon": true, "gpt-5.3-codex": true, "gpt-5.4": true, "gpt-5.4-mini": true, @@ -124,6 +127,7 @@ export const MODEL_REASONING: Readonly> = { "meta/muse-spark-1.2-contributor": true, "meta/muse-spark-1.3": true, "meta/muse-spark-1.3-contributor": true, + "meta/muse-wonder-1.0": true, "MiniMaxAI/MiniMax-M3": true, "mistral/mistral-large-4": true, "moonshotai/Kimi-K2.7-Code": true, @@ -182,6 +186,7 @@ export const MODEL_EFFORTS: Readonly> = { "meta/muse-spark-1.1": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, "meta/muse-spark-1.2": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, "meta/muse-spark-1.3": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, + "meta/muse-wonder-1.0": { input: 4, output: 20, cacheRead: 0.2, cacheWrite: 0 }, "meta/muse-spark-1.2-contributor": { input: 0.1, output: 0.2, @@ -305,6 +306,7 @@ export const MODEL_COSTS: Readonly> = { cacheRead: 0.15, cacheWrite: 0.08334, }, + "google/gemini-4-argon": { input: 2, output: 10, cacheRead: 0.1, cacheWrite: 0 }, "google/gemini-3.8-flash": { input: 1.5, output: 7.5, diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index f48d54a..9f2a5e5 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,5 +1,5 @@ { - "fetchedAt": "2026-10-09T06:21:21.675Z", + "fetchedAt": "2026-10-14T06:43:23.341Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ "claude-sonnet-5-5", @@ -66,6 +66,7 @@ "stepfun/Step-3.5-Flash", "tencent/hy3-paid", "tencent/hy4-preview", + "google/gemini-4-argon", "google/gemini-3.8-flash", "google/gemini-3.7-flash", "google/gemini-3.6-flash", @@ -85,6 +86,7 @@ "meta/muse-spark-1.2-contributor", "meta/muse-spark-1.3", "meta/muse-spark-1.3-contributor", + "meta/muse-wonder-1.0", "xai/grok-4.5", "xai/grok-4.6", "xai/grok-4.7", diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index 03b0ef0..74223cc 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,5 +1,5 @@ { - "verifiedAt": "2026-10-09", + "verifiedAt": "2026-10-14", "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": { @@ -75,6 +75,7 @@ "meta/muse-spark-1.1": [1.25, 4.25, 0.15, 0], "meta/muse-spark-1.2": [1.25, 4.25, 0.15, 0], "meta/muse-spark-1.3": [1.25, 4.25, 0.15, 0], + "meta/muse-wonder-1.0": [4, 20, 0.2, 0], "meta/muse-spark-1.2-contributor": [0.1, 0.2, 0.002, 0], "meta/muse-spark-1.3-contributor": [0.1, 0.2, 0.002, 0], "claude-sonnet-5-5": [2, 10, 0.1, 2.5], @@ -100,6 +101,7 @@ "gpt-5.3-codex": [2, 8, 0.5, 0], "gpt-5.4-mini": [0.75, 4.5, 0.075, 0], "google/gemini-3.7-flash": [1.5, 7.5, 0.15, 0.08334], + "google/gemini-4-argon": [2, 10, 0.1, 0], "google/gemini-3.8-flash": [1.5, 7.5, 0.15, 0], "google/gemini-3.6-flash": [1.5, 7.5, 0.15, 0], "google/gemini-3.5-flash": [1.5, 9, 0.15, 0], diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index 8e657d6..f471e15 100644 --- a/tests/test-pricing.ts +++ b/tests/test-pricing.ts @@ -55,7 +55,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-10-09T/) + assert.match(fixture.fetchedAt, /^2026-10-14T/) const catalogIds = [...fixture.modelIds].sort() const pricedIds = Object.keys(MODEL_COSTS).sort() @@ -347,9 +347,19 @@ describe("MODEL_COSTS pricing overlay", () => { }) }) + it("uses reviewed rates for the mid-October catalog additions", () => { + assertCost("google/gemini-4-argon", { + input: 2, + output: 10, + cacheRead: 0.1, + cacheWrite: 0, + }) + assertCost("meta/muse-wonder-1.0", { input: 4, output: 20, cacheRead: 0.2, cacheWrite: 0 }) + }) + it("tracks pricing provenance", () => { assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits") - assert.equal(PRICING_LAST_VERIFIED, "2026-10-09") + assert.equal(PRICING_LAST_VERIFIED, "2026-10-14") }) it("fails once temporary pricing needs review", () => { From 0fedb7aa5d918647f1535780132b2c8f6d9add69 Mon Sep 17 00:00:00 2001 From: Patrick Wozniak Date: Thu, 15 Oct 2026 23:00:43 +0200 Subject: [PATCH 2/3] fix(models): parse explicit CLI input modalities --- .../check-commandcode-model-metadata.ts | 41 +++++++++---------- tests/test-model-metadata-check.ts | 41 +++++++++++++++++-- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/.github/scripts/check-commandcode-model-metadata.ts b/.github/scripts/check-commandcode-model-metadata.ts index d63fb00..e35ea8e 100644 --- a/.github/scripts/check-commandcode-model-metadata.ts +++ b/.github/scripts/check-commandcode-model-metadata.ts @@ -17,7 +17,6 @@ import { const execFileAsync = promisify(execFile) const MODELS_REFERENCE_PATH = "dist/bundled/command-code-knowledge/reference/models.md" const CLI_BUNDLE_PATH = "dist/cli.mjs" -const TEXT_ONLY_MARKER = ',__name(isKnownTextOnlyModel,"isKnownTextOnlyModel")' const VALID_EFFORTS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]) function quoteWindowsArgument(argument: string): string { @@ -136,26 +135,8 @@ export function parseModelsReference(markdown: string): { } } -export function parseKnownTextOnlyModelIds(bundle: string): readonly string[] { - const markerIndex = bundle.indexOf(TEXT_ONLY_MARKER) - if (markerIndex < 0) { - throw new Error("Could not find Command Code's isKnownTextOnlyModel catalog") - } - - const setStart = bundle.lastIndexOf("new Set([", markerIndex) - if (setStart < 0) throw new Error("Could not find the text-only model set") - - const arrayStart = setStart + "new Set(".length - const arrayEnd = markerIndex - 1 - const literal = bundle.slice(arrayStart, arrayEnd) - const parsed: unknown = JSON.parse(literal) - if (!isStringArray(parsed)) throw new Error("Expected the text-only model catalog to be strings") - - return sorted(new Set(parsed)) -} - function modelObject(bundle: string, modelId: string): string { - const start = bundle.indexOf(`{id:${JSON.stringify(modelId)},inputModalities:`) + const start = bundle.indexOf(`{id:${JSON.stringify(modelId)},`) if (start < 0) throw new Error(`Could not find model metadata for ${modelId}`) let depth = 0 @@ -184,14 +165,30 @@ export function parseBundleModelCapabilities( bundle: string, modelIds: readonly string[], ): { + imageModelIds: readonly string[] reasoningModelIds: readonly string[] maxOutputTokens: Readonly> } { + const imageModelIds: string[] = [] const reasoningModelIds: string[] = [] const maxOutputTokens: Record = {} for (const modelId of modelIds) { const entry = modelObject(bundle, modelId) + const modalitiesLiteral = /\binputModalities:(\[[^\]]*\])/.exec(entry)?.[1] + if (!modalitiesLiteral) throw new Error(`Missing input modalities for ${modelId}`) + const modalities: unknown = JSON.parse(modalitiesLiteral) + if ( + !isStringArray(modalities) || + !modalities.includes("text") || + modalities.some( + (modality) => modality !== "text" && modality !== "image" && modality !== "file", + ) + ) { + throw new Error(`Unexpected input modalities for ${modelId}`) + } + // The host supports text/image inputs; the CLI's file modality is not advertised. + if (modalities.includes("image")) imageModelIds.push(modelId) if (entry.includes("reasoning:!0") || entry.includes("reasoningEfforts:[")) { reasoningModelIds.push(modelId) } @@ -206,6 +203,7 @@ export function parseBundleModelCapabilities( } return { + imageModelIds: sorted(imageModelIds), reasoningModelIds: sorted(reasoningModelIds), maxOutputTokens: Object.fromEntries( Object.entries(maxOutputTokens).sort(([left], [right]) => left.localeCompare(right)), @@ -218,11 +216,10 @@ export function commandCodeModelMetadataFromContents( cliBundle: string, ): CommandCodeModelMetadata { const reference = parseModelsReference(modelsReference) - const textOnlyModelIds = new Set(parseKnownTextOnlyModelIds(cliBundle)) const capabilities = parseBundleModelCapabilities(cliBundle, reference.modelIds) return { - imageModelIds: reference.modelIds.filter((modelId) => !textOnlyModelIds.has(modelId)), + imageModelIds: capabilities.imageModelIds, reasoningModelIds: capabilities.reasoningModelIds, reasoningEfforts: reference.reasoningEfforts, maxOutputTokens: capabilities.maxOutputTokens, diff --git a/tests/test-model-metadata-check.ts b/tests/test-model-metadata-check.ts index 3c07513..043b299 100644 --- a/tests/test-model-metadata-check.ts +++ b/tests/test-model-metadata-check.ts @@ -6,7 +6,6 @@ import { diffModelMetadata, hasModelMetadataDiff, parseBundleModelCapabilities, - parseKnownTextOnlyModelIds, parseModelsReference, parsePackageVersion, pruneObsoleteEffortOverrides, @@ -48,8 +47,38 @@ describe("Command Code model metadata checker", () => { }) }) - it("extracts the text-only set from the bundled CLI catalog", () => { - assert.deepEqual(parseKnownTextOnlyModelIds(CLI_BUNDLE), ["text-model"]) + it("reads explicit input modalities without relying on a global text-only set", () => { + // command-code@1.82.4 adds behaviorProfile before inputModalities and + // resolves text-only status from the model, not a neighboring Set literal. + const bundle = + 'const V={id:"vision-model",behaviorProfile:"standard-v1",inputModalities:["text","image"],reasoning:!0,reasoningEfforts:["low","high"],maxOutputTokens:32768},T={id:"text-model",behaviorProfile:"standard-v1",inputModalities:["text"]},providers=new Set(["anthropic","openai"]),profile="anthropic-interleaved-v1",__name(isKnownTextOnlyModel,"isKnownTextOnlyModel")' + + assert.deepEqual(commandCodeModelMetadataFromContents(MODELS_REFERENCE, bundle), { + imageModelIds: ["vision-model"], + reasoningModelIds: ["vision-model"], + reasoningEfforts: { "vision-model": ["low", "high"] }, + maxOutputTokens: { "vision-model": 32_768 }, + }) + }) + + it("projects the CLI file modality onto supported text/image inputs", () => { + const bundle = CLI_BUNDLE.replace( + 'inputModalities:["text","image"]', + 'inputModalities:["text","image","file"]', + ).replace('inputModalities:["text"]', 'inputModalities:["text","file"]') + assert.deepEqual(commandCodeModelMetadataFromContents(MODELS_REFERENCE, bundle).imageModelIds, [ + "vision-model", + ]) + }) + + it("rejects missing or unsupported input modalities instead of inferring image support", () => { + for (const replacement of ["", "inputModalities:[],", 'inputModalities:["audio"],']) { + const bundle = CLI_BUNDLE.replace('inputModalities:["text","image"],', replacement) + assert.throws( + () => commandCodeModelMetadataFromContents(MODELS_REFERENCE, bundle), + /input modalities for vision-model/, + ) + } }) it("accepts one exact npm registry version and rejects stale-looking output shapes", () => { @@ -61,6 +90,7 @@ describe("Command Code model metadata checker", () => { it("derives image, reasoning, effort, and output-limit metadata", () => { assert.deepEqual(parseBundleModelCapabilities(CLI_BUNDLE, ["text-model", "vision-model"]), { + imageModelIds: ["vision-model"], reasoningModelIds: ["vision-model"], maxOutputTokens: { "vision-model": 32_768 }, }) @@ -181,7 +211,10 @@ export const MODEL_MAX_OUTPUT_TOKENS: Readonly> = { () => parseModelsReference(MODELS_REFERENCE.replace("low, high", "low, turbo")), /Unexpected reasoning efforts/, ) - assert.throws(() => parseKnownTextOnlyModelIds("const unrelated = true"), /Could not find/) + assert.throws( + () => parseBundleModelCapabilities("const unrelated = true", ["missing-model"]), + /Could not find model metadata/, + ) }) it("prunes only the overrides that upstream now publishes", () => { From 859a0fd381fdb817679aa97a46bf86de2ba950e1 Mon Sep 17 00:00:00 2001 From: Patrick Wozniak Date: Thu, 15 Oct 2026 23:00:43 +0200 Subject: [PATCH 3/3] feat(models): refresh catalog and pricing for CLI 1.82.4 --- CHANGELOG.md | 5 ++-- README.md | 2 +- src/commandcode-catalog.ts | 14 +++++++---- src/pricing.ts | 9 +++++-- tests/fixtures/commandcode-model-ids.json | 8 +++++-- tests/fixtures/commandcode-pricing.json | 8 +++++-- tests/test-models.ts | 27 +++++++++++++++++++++ tests/test-pricing.ts | 29 +++++++++++++++++------ 8 files changed, 81 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3553e..bd4468d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,9 @@ ## Unreleased -- Refresh the static capability snapshot to `command-code@1.82.1` by adding `google/gemini-4-argon` (image input, reasoning, `low`/`medium`/`high` efforts) and `meta/muse-wonder-1.0` (image input, reasoning, `low`/`medium`/`high`/`xhigh` efforts). -- Add reviewed display pricing for both new models, verified against the official pricing page on 2026-10-14: `google/gemini-4-argon` at $2 input / $10 output / $0.10 cache read per million tokens, and `meta/muse-wonder-1.0` at $4 input / $20 output / $0.20 cache read. Neither publishes a cache-write rate. The snapshot now covers all 89 advertised models. +- Refresh the static capability snapshot to `command-code@1.82.4`: add image input and reasoning efforts for `google/gemini-4-argon`, `meta/muse-wonder-1.0`, and `Qwen/Qwen3.8-Max-Prime`; replace the retired free Ling 3.1 Flash with `inclusionai/ling-3.1-flash`, preserving its reasoning efforts and 32,768-token output limit. Max Prime has a 131,072-token output limit (#153). +- Fix catalog synchronization with the CLI's new model-object layout. Read explicit input modalities instead of the removed global text-only set, and project the CLI's additional `file` modality onto the host's supported text/image inputs (#153). +- Add reviewed display pricing for Gemini 4 Argon, Muse Wonder, Qwen 3.8 Max Prime, paid Ling 3.1 Flash, Nemotron 3.5 Super VL, Muse Spark Open, and the free Cat Jam preview. Remove the retired free Ling entry. Prices and context tiers were verified against the official pricing page on 2026-10-15; the snapshot covers all 93 advertised models. Cat Jam is free only while its stealth preview lasts, with no published expiry. Models not yet present in CLI 1.82.4 keep conservative capability defaults until upstream metadata is available (#153). ## 0.7.7 - 2026-10-11 diff --git a/README.md b/README.md index cc5f368..fb383e4 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,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.82.1`; 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, also dropping manual effort overrides that upstream has published itself, 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.82.4`; 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, also dropping manual effort overrides that upstream has published itself, 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 40beae8..c2ce71b 100644 --- a/src/commandcode-catalog.ts +++ b/src/commandcode-catalog.ts @@ -1,4 +1,4 @@ -export const COMMAND_CODE_CLI_VERSION = "1.82.1" +export const COMMAND_CODE_CLI_VERSION = "1.82.4" export type CommandCodeInputType = "text" | "image" export type CommandCodeReasoningEffort = @@ -11,7 +11,7 @@ export type CommandCodeReasoningEffort = | "max" /** - * Generated from command-code@1.82.1 by `npm run sync:commandcode-catalog`. + * Generated from command-code@1.82.4 by `npm run sync:commandcode-catalog`. * Do not edit manually. */ export const MODEL_INPUT_MODALITIES: Readonly> = { @@ -67,6 +67,7 @@ export const MODEL_INPUT_MODALITIES: Readonly> = { "gpt-6-sol": true, "gpt-6.1-sol": true, "inclusionai/ling-3.0-flash-sante:free": true, - "inclusionai/ling-3.1-flash:free": true, + "inclusionai/ling-3.1-flash": true, "meituan/LongCat-2.0": true, "meta/muse-spark-1.1": true, "meta/muse-spark-1.2": true, @@ -144,6 +145,7 @@ export const MODEL_REASONING: Readonly> = { "Qwen/Qwen3.8-Flash": true, "Qwen/Qwen3.8-Max": true, "Qwen/Qwen3.8-Max-0902": true, + "Qwen/Qwen3.8-Max-Prime": true, "Qwen/Qwen3.8-Omni-Flash": true, "sakana/fugu-ultra": true, "stealth/glyph-cluster:free": true, @@ -198,7 +200,7 @@ export const MODEL_EFFORTS: Readonly> = { "inclusionai/ling-3.0-flash-sante:free": 32_768, - "inclusionai/ling-3.1-flash:free": 32_768, + "inclusionai/ling-3.1-flash": 32_768, "mistral/mistral-large-4": 262_144, "poolside/laguna-s-2.1-free": 32_768, "Qwen/Qwen3.8-27B": 32_768, + "Qwen/Qwen3.8-Max-Prime": 131_072, "Qwen/Qwen3.8-Omni-Flash": 131_072, "stealth/glyph-cluster:free": 256_000, "z-ai/glm-5.3-flash": 131_072, diff --git a/src/pricing.ts b/src/pricing.ts index bd8c219..0dbeae5 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-10-14" +export const PRICING_LAST_VERIFIED = "2026-10-15" export const ZERO_MODEL_COST: CommandCodeModelCost = { input: 0, @@ -40,11 +40,13 @@ export const ZERO_MODEL_COST: CommandCodeModelCost = { export const MODEL_COSTS: Readonly> = { // Free models "inclusionai/ling-3.0-flash-sante:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - "inclusionai/ling-3.1-flash:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + // Free while the stealth preview lasts; no fixed expiry is published. + "stealth/cat-jam:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "stealth/glyph-cluster:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, // Open and open-weight models + "inclusionai/ling-3.1-flash": { input: 0.3, output: 0.9, cacheRead: 0.06, cacheWrite: 0 }, "mistral/mistral-large-4": { input: 1.36, output: 4.18, cacheRead: 0.14, cacheWrite: 0 }, "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 }, @@ -106,6 +108,7 @@ export const MODEL_COSTS: Readonly> = { cacheRead: 0.016, cacheWrite: 0, }, + "Qwen/Qwen3.8-Max-Prime": { input: 4, output: 12, cacheRead: 0.5, cacheWrite: 5 }, "Qwen/Qwen3.8-Max": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 2.5 }, "Qwen/Qwen3.8-Max-0902": { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 0 }, "Qwen/Qwen3.8-27B": { input: 0.4, output: 3, cacheRead: 0.04, cacheWrite: 0 }, @@ -177,6 +180,7 @@ export const MODEL_COSTS: Readonly> = { cacheWrite: 0, }, "xiaomi/mimo-v2.6-flash": { input: 0.14, output: 0.28, cacheRead: 0.0028, cacheWrite: 0 }, + "nvidia/nemotron-3.5-super-vl": { input: 0.2, output: 0.5, cacheRead: 0.04, cacheWrite: 0 }, "nvidia/nemotron-3-ultra-550b-a55b": { input: 0.6, output: 2.4, @@ -194,6 +198,7 @@ export const MODEL_COSTS: Readonly> = { "meta/muse-spark-1.1": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, "meta/muse-spark-1.2": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, "meta/muse-spark-1.3": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, + "meta/muse-spark-open": { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }, "meta/muse-wonder-1.0": { input: 4, output: 20, cacheRead: 0.2, cacheWrite: 0 }, "meta/muse-spark-1.2-contributor": { input: 0.1, diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index 9f2a5e5..7ad6931 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,5 +1,5 @@ { - "fetchedAt": "2026-10-14T06:43:23.341Z", + "fetchedAt": "2026-10-15T20:58:52.909Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ "claude-sonnet-5-5", @@ -51,6 +51,7 @@ "xiaomi/mimo-v2.5-pro", "xiaomi/mimo-v2.5", "Qwen/Qwen3.8-Omni-Flash", + "Qwen/Qwen3.8-Max-Prime", "Qwen/Qwen3.8-Max-0902", "Qwen/Qwen3.8-Max", "Qwen/Qwen3.8-27B", @@ -75,17 +76,20 @@ "google/gemini-3.1-flash-lite", "sakana/fugu-ultra", "nvidia/nemotron-3-ultra-550b-a55b", + "nvidia/nemotron-3.5-super-vl", "thinkingmachines/inkling", "thinkingmachines/inkling-small", "stealth/glyph-cluster:free", + "stealth/cat-jam:free", "poolside/laguna-s-2.1-free", "inclusionai/ling-3.0-flash-sante:free", - "inclusionai/ling-3.1-flash:free", + "inclusionai/ling-3.1-flash", "meta/muse-spark-1.1", "meta/muse-spark-1.2", "meta/muse-spark-1.2-contributor", "meta/muse-spark-1.3", "meta/muse-spark-1.3-contributor", + "meta/muse-spark-open", "meta/muse-wonder-1.0", "xai/grok-4.5", "xai/grok-4.6", diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index 74223cc..033e8ab 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,5 +1,5 @@ { - "verifiedAt": "2026-10-14", + "verifiedAt": "2026-10-15", "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": { @@ -22,9 +22,10 @@ }, "costs": { "inclusionai/ling-3.0-flash-sante:free": [0, 0, 0, 0], - "inclusionai/ling-3.1-flash:free": [0, 0, 0, 0], + "stealth/cat-jam:free": [0, 0, 0, 0], "poolside/laguna-s-2.1-free": [0, 0, 0, 0], "stealth/glyph-cluster:free": [0, 0, 0, 0], + "inclusionai/ling-3.1-flash": [0.3, 0.9, 0.06, 0], "mistral/mistral-large-4": [1.36, 4.18, 0.14, 0], "tencent/hy3-paid": [0.14, 0.58, 0.035, 0], "tencent/hy4-preview": [0.834, 2.501, 0.042, 0], @@ -49,6 +50,7 @@ "deepseek/deepseek-v4-flash-fast": [0.28, 0.56, 0.07, 0], "deepseek/deepseek-v4.1-flash": [0.15, 0.6, 0.003, 0], "deepseek/deepseek-v4.1-flash-fast": [0.16, 0.58, 0.016, 0], + "Qwen/Qwen3.8-Max-Prime": [4, 12, 0.5, 5], "Qwen/Qwen3.8-Max": [2, 6, 0.25, 2.5], "Qwen/Qwen3.8-Max-0902": [2, 6, 0.25, 0], "Qwen/Qwen3.8-27B": [0.4, 3, 0.04, 0], @@ -68,6 +70,7 @@ "xiaomi/mimo-v2.6-pro": [0.435, 0.87, 0.0036, 0], "xiaomi/mimo-v2.6-pro-ultraspeed": [4.35, 8.7, 0.036, 0], "xiaomi/mimo-v2.6-flash": [0.14, 0.28, 0.0028, 0], + "nvidia/nemotron-3.5-super-vl": [0.2, 0.5, 0.04, 0], "nvidia/nemotron-3-ultra-550b-a55b": [0.6, 2.4, 0.12, 0], "sakana/fugu-ultra": [5, 30, 0.5, 0], "thinkingmachines/inkling": [1, 4.05, 0.17, 0], @@ -75,6 +78,7 @@ "meta/muse-spark-1.1": [1.25, 4.25, 0.15, 0], "meta/muse-spark-1.2": [1.25, 4.25, 0.15, 0], "meta/muse-spark-1.3": [1.25, 4.25, 0.15, 0], + "meta/muse-spark-open": [1.25, 4.25, 0.15, 0], "meta/muse-wonder-1.0": [4, 20, 0.2, 0], "meta/muse-spark-1.2-contributor": [0.1, 0.2, 0.002, 0], "meta/muse-spark-1.3-contributor": [0.1, 0.2, 0.002, 0], diff --git a/tests/test-models.ts b/tests/test-models.ts index e66a492..b1e1390 100644 --- a/tests/test-models.ts +++ b/tests/test-models.ts @@ -183,6 +183,33 @@ describe("commandCodeModelsFromApiResponse()", () => { assert.equal(models[0]?.maxTokens, 131_072) }) + it("advertises the refreshed Max Prime and paid Ling capabilities", () => { + const qwen = "Qwen/Qwen3.8-Max-Prime" + const ling = "inclusionai/ling-3.1-flash" + assert.deepEqual(inputModalitiesForModel(qwen), ["text", "image"]) + assert.deepEqual(inputModalitiesForModel(ling), ["text"]) + assert.deepEqual(thinkingMetadataForModel(qwen)?.thinking?.efforts, ["low", "medium", "xhigh"]) + assert.deepEqual(thinkingMetadataForModel(ling)?.thinking?.efforts, ["low", "medium", "high"]) + const models = commandCodeModelsFromApiResponse({ + object: "list", + data: [ + { ...API_RESPONSE.data[0], id: qwen }, + { ...API_RESPONSE.data[0], id: ling, context_length: 262_144 }, + ], + }) + assert.deepEqual( + models.map(({ reasoning, maxTokens }) => ({ reasoning, maxTokens })), + [ + { reasoning: true, maxTokens: 131_072 }, + { reasoning: true, maxTokens: 32_768 }, + ], + ) + const retired = "inclusionai/ling-3.1-flash:free" + assert.equal(MODEL_REASONING[retired], undefined) + assert.equal(MODEL_EFFORTS[retired], undefined) + assert.equal(MODEL_MAX_OUTPUT_TOKENS[retired], undefined) + }) + it("prefers host-resolved input modalities over the catalog snapshot", () => { // A model published upstream after the pinned CLI release is absent from the // generated catalog, so the host's resolved modalities must win. diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index f471e15..7b4c39e 100644 --- a/tests/test-pricing.ts +++ b/tests/test-pricing.ts @@ -31,7 +31,7 @@ const freeModels = new Set([ "poolside/laguna-s-2.1-free", "stealth/glyph-cluster:free", "inclusionai/ling-3.0-flash-sante:free", - "inclusionai/ling-3.1-flash:free", + "stealth/cat-jam:free", ]) function assertCost( @@ -55,7 +55,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-10-14T/) + assert.match(fixture.fetchedAt, /^2026-10-15T/) const catalogIds = [...fixture.modelIds].sort() const pricedIds = Object.keys(MODEL_COSTS).sort() @@ -339,12 +339,13 @@ describe("MODEL_COSTS pricing overlay", () => { cacheRead: 0.016, cacheWrite: 0, }) - assertCost("inclusionai/ling-3.1-flash:free", { - input: 0, - output: 0, - cacheRead: 0, + assertCost("inclusionai/ling-3.1-flash", { + input: 0.3, + output: 0.9, + cacheRead: 0.06, cacheWrite: 0, }) + assert.equal(MODEL_COSTS["inclusionai/ling-3.1-flash:free"], undefined) }) it("uses reviewed rates for the mid-October catalog additions", () => { @@ -355,11 +356,25 @@ describe("MODEL_COSTS pricing overlay", () => { cacheWrite: 0, }) assertCost("meta/muse-wonder-1.0", { input: 4, output: 20, cacheRead: 0.2, cacheWrite: 0 }) + assertCost("Qwen/Qwen3.8-Max-Prime", { input: 4, output: 12, cacheRead: 0.5, cacheWrite: 5 }) + assertCost("nvidia/nemotron-3.5-super-vl", { + input: 0.2, + output: 0.5, + cacheRead: 0.04, + cacheWrite: 0, + }) + assertCost("meta/muse-spark-open", { + input: 1.25, + output: 4.25, + cacheRead: 0.15, + cacheWrite: 0, + }) + assertCost("stealth/cat-jam:free", { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }) }) it("tracks pricing provenance", () => { assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits") - assert.equal(PRICING_LAST_VERIFIED, "2026-10-14") + assert.equal(PRICING_LAST_VERIFIED, "2026-10-15") }) it("fails once temporary pricing needs review", () => {