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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
36 changes: 29 additions & 7 deletions src/pricing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -39,6 +39,8 @@ export const ZERO_MODEL_COST: CommandCodeModelCost = {
*/
export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
// 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
Expand Down Expand Up @@ -72,15 +74,15 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
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": {
Expand All @@ -89,7 +91,14 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
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 },
Expand Down Expand Up @@ -158,12 +167,19 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
},
"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 },
Expand Down Expand Up @@ -196,6 +212,12 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
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": {
Expand Down
9 changes: 8 additions & 1 deletion tests/fixtures/commandcode-model-ids.json
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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"
]
Expand Down
13 changes: 10 additions & 3 deletions tests/fixtures/commandcode-pricing.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand All @@ -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],
Expand All @@ -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],
Expand All @@ -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],
Expand All @@ -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],
Expand Down
45 changes: 39 additions & 6 deletions tests/test-pricing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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()
Expand Down Expand Up @@ -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", {
Expand Down Expand Up @@ -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", () => {
Expand Down
Loading