diff --git a/CHANGELOG.md b/CHANGELOG.md index f611534..651cade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Add display pricing for DeepSeek V4.1 Flash, Qwen 3.8 Max 0902, Gemini 3.8 Flash, Muse Spark 1.3 variants, LongCat 2.0 free, and Ling 3.0 Flash Sante free. Verify against the September 15 pricing page and live 69-model catalog; correct DeepSeek V4 Flash and Vision Exp off-peak prices to $0.15/$0.60 with $0.003 cache reads per million tokens. + - Refresh model capabilities to `command-code@1.54.0`: add DeepSeek V4.1 Flash image input and `low`/`high`/`max` efforts, GPT-6 Astra capability metadata, Grok 4.6 image input, and MiniMax M3 efforts. Ling 3.0 Flash Sante is reasoning-capable with a 32K output limit but has no published selectable effort levels. Catalog metadata does not make models absent from the Provider API selectable. - Replace manual Muse Spark efforts with upstream levels: remove `minimal` for all five models and add `max` for Muse Spark 1.3. - Rebind a host's preselected built-in Command Code model to the extension's registered transport at session start, preserving configured endpoints and generate fallback on Oh My Pi. diff --git a/src/pricing.ts b/src/pricing.ts index 583e294..d593437 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-09-01" +export const PRICING_LAST_VERIFIED = "2026-09-15" export const ZERO_MODEL_COST: CommandCodeModelCost = { input: 0, @@ -39,6 +39,8 @@ 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 }, + "meituan/LongCat-2.0:free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, "poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, // Open and open-weight models @@ -72,15 +74,15 @@ export const MODEL_COSTS: Readonly> = { cacheWrite: 0, }, "deepseek/deepseek-v4-flash": { - input: 0.22, - output: 0.66, - cacheRead: 0.007, + input: 0.15, + output: 0.6, + cacheRead: 0.003, cacheWrite: 0, }, "deepseek/deepseek-v4-flash-vision-exp": { - input: 0.22, - output: 0.66, - cacheRead: 0.007, + input: 0.15, + output: 0.6, + cacheRead: 0.003, cacheWrite: 0, }, "deepseek/deepseek-v4-flash-fast": { @@ -89,7 +91,14 @@ export const MODEL_COSTS: Readonly> = { cacheRead: 0.07, cacheWrite: 0, }, + "deepseek/deepseek-v4.1-flash": { + input: 0.15, + output: 0.6, + cacheRead: 0.003, + cacheWrite: 0, + }, "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 }, "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 }, @@ -158,12 +167,19 @@ 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-1.2-contributor": { input: 0.1, output: 0.2, cacheRead: 0.002, cacheWrite: 0, }, + "meta/muse-spark-1.3-contributor": { + input: 0.1, + output: 0.2, + cacheRead: 0.002, + cacheWrite: 0, + }, // Anthropic "claude-sonnet-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 }, @@ -196,6 +212,12 @@ export const MODEL_COSTS: Readonly> = { cacheRead: 0.15, cacheWrite: 0.08334, }, + "google/gemini-3.8-flash": { + input: 1.5, + output: 7.5, + cacheRead: 0.15, + cacheWrite: 0, + }, "google/gemini-3.6-flash": { input: 1.5, output: 7.5, cacheRead: 0.15, cacheWrite: 0 }, "google/gemini-3.5-flash": { input: 1.5, output: 9, cacheRead: 0.15, cacheWrite: 0 }, "google/gemini-3.5-flash-lite": { diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index a6f9aa7..4281615 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,5 +1,5 @@ { - "fetchedAt": "2026-09-01T21:28:23.974Z", + "fetchedAt": "2026-09-15T00:04:32.535Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ "claude-sonnet-5", @@ -21,6 +21,7 @@ "deepseek/deepseek-v4-flash", "deepseek/deepseek-v4-flash-vision-exp", "deepseek/deepseek-v4-flash-fast", + "deepseek/deepseek-v4.1-flash", "moonshotai/Kimi-K3", "moonshotai/Kimi-K2.7-Code", "moonshotai/Kimi-K2.7-Code-Highspeed", @@ -37,6 +38,7 @@ "MiniMaxAI/MiniMax-M2.5", "xiaomi/mimo-v2.5-pro", "xiaomi/mimo-v2.5", + "Qwen/Qwen3.8-Max-0902", "Qwen/Qwen3.8-Max", "Qwen/Qwen3.8-27B", "Qwen/Qwen3.8-Flash", @@ -45,10 +47,12 @@ "Qwen/Qwen3.7-Flash", "Qwen/Qwen3.6-Max-Preview", "Qwen/Qwen3.6-Plus", + "meituan/LongCat-2.0:free", "stepfun/Step-3.7-Flash", "stepfun/Step-3.5-Flash", "tencent/hy3-paid", "tencent/hy4-preview", + "google/gemini-3.8-flash", "google/gemini-3.7-flash", "google/gemini-3.6-flash", "google/gemini-3.5-flash", @@ -59,9 +63,12 @@ "thinkingmachines/inkling", "thinkingmachines/inkling-small", "poolside/laguna-s-2.1-free", + "inclusionai/ling-3.0-flash-sante:free", "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", "xai/grok-4.5", "xai/grok-4.6" ] diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index 0fe4534..09827d7 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,5 +1,5 @@ { - "verifiedAt": "2026-09-01", + "verifiedAt": "2026-09-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": { @@ -11,6 +11,8 @@ "xai/grok-4.6": [[200000, 4, 12, 1, 0]] }, "costs": { + "inclusionai/ling-3.0-flash-sante:free": [0, 0, 0, 0], + "meituan/LongCat-2.0:free": [0, 0, 0, 0], "poolside/laguna-s-2.1-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], @@ -29,10 +31,12 @@ "MiniMaxAI/MiniMax-M2.7": [0.3, 1.2, 0.06, 0], "MiniMaxAI/MiniMax-M2.5": [0.3, 1.2, 0.03, 0], "deepseek/deepseek-v4-pro": [0.66, 1.98, 0.022, 0], - "deepseek/deepseek-v4-flash": [0.22, 0.66, 0.007, 0], - "deepseek/deepseek-v4-flash-vision-exp": [0.22, 0.66, 0.007, 0], + "deepseek/deepseek-v4-flash": [0.15, 0.6, 0.003, 0], + "deepseek/deepseek-v4-flash-vision-exp": [0.15, 0.6, 0.003, 0], "deepseek/deepseek-v4-flash-fast": [0.28, 0.56, 0.07, 0], + "deepseek/deepseek-v4.1-flash": [0.15, 0.6, 0.003, 0], "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], "Qwen/Qwen3.8-Flash": [0.16, 0.47, 0.016, 0], "Qwen/Qwen3.7-Max": [2.5, 7.5, 0.5, 3.13], @@ -50,7 +54,9 @@ "thinkingmachines/inkling-small": [0.5, 1.2, 0.1, 0], "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-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": [2, 10, 0.2, 2.5], "claude-sonnet-4-6": [3, 15, 0.3, 3.75], "claude-fable-5-1": [10, 50, 0.25, 12.5], @@ -67,6 +73,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-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], "google/gemini-3.5-flash-lite": [0.3, 2.5, 0.03, 0], diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index 73b8b75..ca7a915 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"]) +const freeModels = new Set([ + "poolside/laguna-s-2.1-free", + "meituan/LongCat-2.0:free", + "inclusionai/ling-3.0-flash-sante: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-09-01T/) + assert.match(fixture.fetchedAt, /^2026-09-15T/) const catalogIds = [...fixture.modelIds].sort() const pricedIds = Object.keys(MODEL_COSTS).sort() @@ -115,9 +119,15 @@ describe("MODEL_COSTS pricing overlay", () => { cacheWrite: 0, }) assertCost("deepseek/deepseek-v4-flash", { - input: 0.22, - output: 0.66, - cacheRead: 0.007, + input: 0.15, + output: 0.6, + cacheRead: 0.003, + cacheWrite: 0, + }) + assertCost("deepseek/deepseek-v4.1-flash", { + input: 0.15, + output: 0.6, + cacheRead: 0.003, cacheWrite: 0, }) assertCost("Qwen/Qwen3.7-Max", { @@ -224,9 +234,32 @@ describe("MODEL_COSTS pricing overlay", () => { ]) }) + it("uses reviewed rates for the September catalog additions", () => { + assertCost("Qwen/Qwen3.8-Max-0902", { input: 2, output: 6, cacheRead: 0.25, cacheWrite: 0 }) + assertCost("google/gemini-3.8-flash", { + input: 1.5, + output: 7.5, + cacheRead: 0.15, + cacheWrite: 0, + }) + assertCost("meta/muse-spark-1.3", { input: 1.25, output: 4.25, cacheRead: 0.15, cacheWrite: 0 }) + assertCost("meta/muse-spark-1.3-contributor", { + input: 0.1, + output: 0.2, + cacheRead: 0.002, + cacheWrite: 0, + }) + assertCost("deepseek/deepseek-v4-flash-vision-exp", { + input: 0.15, + output: 0.6, + cacheRead: 0.003, + cacheWrite: 0, + }) + }) + it("tracks pricing provenance", () => { assert.equal(PRICING_SOURCE_URL, "https://commandcode.ai/docs/resources/pricing-limits") - assert.equal(PRICING_LAST_VERIFIED, "2026-09-01") + assert.equal(PRICING_LAST_VERIFIED, "2026-09-15") }) it("fails once temporary pricing needs review", () => {