From fdf4088605e604c9ae7d8886bb69b7b6a3dee402 Mon Sep 17 00:00:00 2001 From: myohei Date: Thu, 10 Sep 2026 23:06:04 +0900 Subject: [PATCH 1/2] chore(models): sync Command Code catalog to 1.53.0 Adds DeepSeek V4.1 Flash (reasoning, efforts low/high/max, vision, 1M context), GPT-6 Astra, xAI Grok 4.6, and inclusionai Ling 3.0 Flash Sante (free). Upstream 1.53.0 now publishes selectable efforts for every Muse Spark model, so the manual overrides are dropped. --- README.md | 4 ++-- src/commandcode-catalog-overrides.ts | 13 ++++--------- src/commandcode-catalog.ts | 19 +++++++++++++++++-- tests/test-models.ts | 1 - 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 909fdbc..a02ac6b 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Other extensions that stream with the active Command Code model, such as backgro ### Reasoning support -Reasoning capability and selectable effort levels follow the official CLI catalog independently. Models can therefore be marked as reasoning-capable even when Command Code chooses their depth automatically. Models with explicit effort support register a model-specific `thinkingLevelMap`, so pi and OMP expose only valid levels. For a few reasoning models the CLI catalog ships no effort levels although the endpoint accepts `reasoning_effort`; `src/commandcode-catalog-overrides.ts` adds a manual level set for those (currently `meta/muse-spark-1.1`, `meta/muse-spark-1.2`, and `meta/muse-spark-1.2-contributor`) on top of the generated catalog, and the tests fail once upstream publishes its own levels so the override gets removed. Pi's native OpenAI- and Anthropic-compatible providers translate the selected level for Provider API accounts; the existing Command Code generate transport sends the matching `reasoning_effort` for Go accounts. +Reasoning capability and selectable effort levels follow the official CLI catalog independently. Models can therefore be marked as reasoning-capable even when Command Code chooses their depth automatically. Models with explicit effort support register a model-specific `thinkingLevelMap`, so pi and OMP expose only valid levels. For a few reasoning models the CLI catalog ships no effort levels although the endpoint accepts `reasoning_effort`; `src/commandcode-catalog-overrides.ts` adds a manual level set for those on top of the generated catalog, and the tests fail once upstream publishes its own levels so the override gets removed (the override table is currently empty because `command-code@1.53.0` publishes selectable efforts for every reasoning model). Pi's native OpenAI- and Anthropic-compatible providers translate the selected level for Provider API accounts; the existing Command Code generate transport sends the matching `reasoning_effort` for Go accounts. List Command Code models from the terminal: @@ -139,7 +139,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.44.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. +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.53.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-overrides.ts b/src/commandcode-catalog-overrides.ts index cb4accd..eab8ddb 100644 --- a/src/commandcode-catalog-overrides.ts +++ b/src/commandcode-catalog-overrides.ts @@ -11,15 +11,10 @@ import type { CommandCodeReasoningEffort } from "./commandcode-catalog.ts" * * Add a model only when the effort parameter is known to be accepted by the * Command Code endpoint; remove it once the CLI catalog ships its own efforts. + * + * Currently empty: command-code@1.53.0 publishes selectable efforts for every + * reasoning model we track, so no manual levels are needed. */ export const MODEL_EFFORT_OVERRIDES: Readonly< Record -> = { - // Meta Muse Spark: the CLI ships no effort levels, but the endpoint accepts - // `reasoning_effort` for these models and other hosts expose the same set. - "meta/muse-spark-1.1": ["minimal", "low", "medium", "high", "xhigh"], - "meta/muse-spark-1.2": ["minimal", "low", "medium", "high", "xhigh"], - "meta/muse-spark-1.2-contributor": ["minimal", "low", "medium", "high", "xhigh"], - "meta/muse-spark-1.3": ["minimal", "low", "medium", "high", "xhigh"], - "meta/muse-spark-1.3-contributor": ["minimal", "low", "medium", "high", "xhigh"], -} +> = {} \ No newline at end of file diff --git a/src/commandcode-catalog.ts b/src/commandcode-catalog.ts index 608f465..857a30f 100644 --- a/src/commandcode-catalog.ts +++ b/src/commandcode-catalog.ts @@ -1,10 +1,10 @@ -export const COMMAND_CODE_CLI_VERSION = "1.44.0" +export const COMMAND_CODE_CLI_VERSION = "1.53.0" export type CommandCodeInputType = "text" | "image" export type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max" /** - * Generated from command-code@1.44.0 by `npm run sync:commandcode-catalog`. + * Generated from command-code@1.53.0 by `npm run sync:commandcode-catalog`. * Do not edit manually. */ export const MODEL_INPUT_MODALITIES: Readonly> = { @@ -17,6 +17,7 @@ export const MODEL_INPUT_MODALITIES: Readonly> = { "deepseek/deepseek-v4-flash-fast": true, "deepseek/deepseek-v4-flash-vision-exp": true, "deepseek/deepseek-v4-pro": true, + "deepseek/deepseek-v4.1-flash": true, "google/gemini-3.1-flash-lite": true, "google/gemini-3.5-flash": true, "google/gemini-3.5-flash-lite": true, @@ -82,6 +86,8 @@ export const MODEL_REASONING: Readonly> = { "gpt-5.6-luna": true, "gpt-5.6-sol": true, "gpt-5.6-terra": true, + "gpt-6-astra": true, + "inclusionai/ling-3.0-flash-sante:free": true, "meituan/LongCat-2.0:free": true, "meta/muse-spark-1.1": true, "meta/muse-spark-1.2": true, @@ -129,6 +135,7 @@ export const MODEL_EFFORTS: Readonly> = { + "inclusionai/ling-3.0-flash-sante:free": 32_768, "poolside/laguna-s-2.1-free": 32_768, "Qwen/Qwen3.8-27B": 32_768, "z-ai/glm-5.3-flash": 131_072, diff --git a/tests/test-models.ts b/tests/test-models.ts index 821a2e6..1eab234 100644 --- a/tests/test-models.ts +++ b/tests/test-models.ts @@ -198,7 +198,6 @@ describe("commandCodeModelsFromApiResponse()", () => { it("merges manual effort overrides over the generated catalog", () => { const validEfforts = new Set(["minimal", "low", "medium", "high", "xhigh", "max"]) - assert.ok(Object.keys(MODEL_EFFORT_OVERRIDES).length > 0) for (const [modelId, efforts] of Object.entries(MODEL_EFFORT_OVERRIDES)) { assert.equal(MODEL_REASONING[modelId], true, `${modelId} override needs a reasoning flag`) assert.equal( From bee8a5b8959224228c16c5a117ac4585458b7cd7 Mon Sep 17 00:00:00 2001 From: myohei Date: Thu, 10 Sep 2026 23:06:04 +0900 Subject: [PATCH 2/2] feat(pricing): add DeepSeek V4.1 Flash and refresh snapshot to 2026-09-10 Adds deepseek/deepseek-v4.1-flash and the other six models present in the 2026-09-10 catalog snapshot (Qwen 3.8 Max 0902, Gemini 3.8 Flash, Muse Spark 1.3 / 1.3 Contributor, LongCat 2.0 free, Ling 3.0 Flash Sante free). Corrects the DeepSeek V4 Flash rate to the documented off-peak rate (/bin/bash.15//bin/bash.60, cache $0.003). --- src/pricing.ts | 30 +- tests/fixtures/commandcode-model-ids.json | 109 ++--- tests/fixtures/commandcode-pricing.json | 514 +++++++++++++++++++--- tests/test-pricing.ts | 22 +- 4 files changed, 547 insertions(+), 128 deletions(-) diff --git a/src/pricing.ts b/src/pricing.ts index 583e294..91689b8 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-10" 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,9 +74,9 @@ 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": { @@ -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..e4dde3c 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,68 +1,75 @@ { - "fetchedAt": "2026-09-01T21:28:23.974Z", + "fetchedAt": "2026-09-10T13:55:02.709Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ - "claude-sonnet-5", - "claude-sonnet-4-6", - "claude-fable-5-1", + "MiniMaxAI/MiniMax-M2.5", + "MiniMaxAI/MiniMax-M2.7", + "MiniMaxAI/MiniMax-M3", + "Qwen/Qwen3.6-Max-Preview", + "Qwen/Qwen3.6-Plus", + "Qwen/Qwen3.7-Flash", + "Qwen/Qwen3.7-Max", + "Qwen/Qwen3.7-Plus", + "Qwen/Qwen3.8-27B", + "Qwen/Qwen3.8-Flash", + "Qwen/Qwen3.8-Max", + "Qwen/Qwen3.8-Max-0902", "claude-fable-5", - "claude-opus-5", - "claude-opus-4-8", - "claude-opus-4-7", + "claude-fable-5-1", "claude-haiku-4-5-20251001", - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna", - "gpt-5.5", - "gpt-5.4", - "gpt-5.3-codex", - "gpt-5.4-mini", - "deepseek/deepseek-v4-pro", + "claude-opus-4-7", + "claude-opus-4-8", + "claude-opus-5", + "claude-sonnet-4-6", + "claude-sonnet-5", "deepseek/deepseek-v4-flash", - "deepseek/deepseek-v4-flash-vision-exp", "deepseek/deepseek-v4-flash-fast", - "moonshotai/Kimi-K3", + "deepseek/deepseek-v4-flash-vision-exp", + "deepseek/deepseek-v4-pro", + "deepseek/deepseek-v4.1-flash", + "google/gemini-3.1-flash-lite", + "google/gemini-3.5-flash", + "google/gemini-3.5-flash-lite", + "google/gemini-3.6-flash", + "google/gemini-3.7-flash", + "google/gemini-3.8-flash", + "gpt-5.3-codex", + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.5", + "gpt-5.6-luna", + "gpt-5.6-sol", + "gpt-5.6-terra", + "inclusionai/ling-3.0-flash-sante:free", + "meituan/LongCat-2.0: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", + "moonshotai/Kimi-K2.5", + "moonshotai/Kimi-K2.6", "moonshotai/Kimi-K2.7-Code", "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", - "zai-org/GLM-5.1", - "zai-org/GLM-5", - "MiniMaxAI/MiniMax-M3", - "MiniMaxAI/MiniMax-M2.7", - "MiniMaxAI/MiniMax-M2.5", - "xiaomi/mimo-v2.5-pro", - "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", - "Qwen/Qwen3.6-Max-Preview", - "Qwen/Qwen3.6-Plus", - "stepfun/Step-3.7-Flash", + "moonshotai/Kimi-K3", + "nvidia/nemotron-3-ultra-550b-a55b", + "poolside/laguna-s-2.1-free", + "sakana/fugu-ultra", "stepfun/Step-3.5-Flash", + "stepfun/Step-3.7-Flash", "tencent/hy3-paid", "tencent/hy4-preview", - "google/gemini-3.7-flash", - "google/gemini-3.6-flash", - "google/gemini-3.5-flash", - "google/gemini-3.5-flash-lite", - "google/gemini-3.1-flash-lite", - "sakana/fugu-ultra", - "nvidia/nemotron-3-ultra-550b-a55b", "thinkingmachines/inkling", "thinkingmachines/inkling-small", - "poolside/laguna-s-2.1-free", - "meta/muse-spark-1.1", - "meta/muse-spark-1.2", - "meta/muse-spark-1.2-contributor", "xai/grok-4.5", - "xai/grok-4.6" + "xai/grok-4.6", + "xiaomi/mimo-v2.5", + "xiaomi/mimo-v2.5-pro", + "z-ai/glm-5.3-flash", + "zai-org/GLM-5", + "zai-org/GLM-5.1", + "zai-org/GLM-5.2", + "zai-org/GLM-5.2-Fast", + "zai-org/GLM-5.3" ] } diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index 0fe4534..19737d6 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,77 +1,457 @@ { - "verifiedAt": "2026-09-01", + "verifiedAt": "2026-09-10", "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": { - "Qwen/Qwen3.7-Plus": [[256000, 1.2, 4.8, 0.24, 1.5]], + "Qwen/Qwen3.7-Plus": [ + [ + 256000, + 1.2, + 4.8, + 0.24, + 1.5 + ] + ], "Qwen/Qwen3.7-Flash": [ - [32000, 0.1, 0.4, 0.02, 0.125], - [256000, 0.2, 0.8, 0.04, 0.25] + [ + 32000, + 0.1, + 0.4, + 0.02, + 0.125 + ], + [ + 256000, + 0.2, + 0.8, + 0.04, + 0.25 + ] ], - "xai/grok-4.6": [[200000, 4, 12, 1, 0]] + "xai/grok-4.6": [ + [ + 200000, + 4, + 12, + 1, + 0 + ] + ] }, "costs": { - "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], - "moonshotai/Kimi-K3": [3, 15, 0.3, 0], - "moonshotai/Kimi-K2.7-Code": [0.95, 4, 0.19, 0], - "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], - "zai-org/GLM-5.1": [1.4, 4.4, 0.26, 0], - "zai-org/GLM-5": [1, 3.2, 0.2, 0], - "MiniMaxAI/MiniMax-M3": [0.3, 1.2, 0.06, 0], - "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-fast": [0.28, 0.56, 0.07, 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], - "Qwen/Qwen3.6-Max-Preview": [1.3, 7.8, 0.26, 1.63], - "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], - "xiaomi/mimo-v2.5-pro": [0.435, 0.87, 0.0036, 0], - "xiaomi/mimo-v2.5": [0.14, 0.28, 0.0028, 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], - "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.2-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], - "claude-fable-5": [10, 50, 1, 12.5], - "claude-opus-5": [5, 25, 0.5, 6.25], - "claude-opus-4-8": [5, 25, 0.5, 6.25], - "claude-opus-4-7": [5, 25, 0.5, 6.25], - "claude-haiku-4-5-20251001": [1, 5, 0.1, 1.25], - "gpt-5.6-sol": [5, 30, 0.5, 6.25], - "gpt-5.6-terra": [2, 12, 0.2, 2.5], - "gpt-5.6-luna": [0.2, 1.2, 0.02, 0.25], - "gpt-5.5": [5, 30, 0.5, 0], - "gpt-5.4": [2.5, 15, 0.25, 0], - "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.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], - "google/gemini-3.1-flash-lite": [0.25, 1.5, 0.03, 0], - "xai/grok-4.5": [2, 6, 0.5, 0], - "xai/grok-4.6": [2, 6, 0.5, 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 + ], + "moonshotai/Kimi-K3": [ + 3, + 15, + 0.3, + 0 + ], + "moonshotai/Kimi-K2.7-Code": [ + 0.95, + 4, + 0.19, + 0 + ], + "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 + ], + "zai-org/GLM-5.1": [ + 1.4, + 4.4, + 0.26, + 0 + ], + "zai-org/GLM-5": [ + 1, + 3.2, + 0.2, + 0 + ], + "MiniMaxAI/MiniMax-M3": [ + 0.3, + 1.2, + 0.06, + 0 + ], + "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.15, + 0.6, + 0.003, + 0 + ], + "deepseek/deepseek-v4-flash-vision-exp": [ + 0.22, + 0.66, + 0.007, + 0 + ], + "deepseek/deepseek-v4-flash-fast": [ + 0.28, + 0.56, + 0.07, + 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 + ], + "Qwen/Qwen3.6-Max-Preview": [ + 1.3, + 7.8, + 0.26, + 1.63 + ], + "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 + ], + "xiaomi/mimo-v2.5-pro": [ + 0.435, + 0.87, + 0.0036, + 0 + ], + "xiaomi/mimo-v2.5": [ + 0.14, + 0.28, + 0.0028, + 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 + ], + "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.2-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 + ], + "claude-fable-5": [ + 10, + 50, + 1, + 12.5 + ], + "claude-opus-5": [ + 5, + 25, + 0.5, + 6.25 + ], + "claude-opus-4-8": [ + 5, + 25, + 0.5, + 6.25 + ], + "claude-opus-4-7": [ + 5, + 25, + 0.5, + 6.25 + ], + "claude-haiku-4-5-20251001": [ + 1, + 5, + 0.1, + 1.25 + ], + "gpt-5.6-sol": [ + 5, + 30, + 0.5, + 6.25 + ], + "gpt-5.6-terra": [ + 2, + 12, + 0.2, + 2.5 + ], + "gpt-5.6-luna": [ + 0.2, + 1.2, + 0.02, + 0.25 + ], + "gpt-5.5": [ + 5, + 30, + 0.5, + 0 + ], + "gpt-5.4": [ + 2.5, + 15, + 0.25, + 0 + ], + "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.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 + ], + "google/gemini-3.1-flash-lite": [ + 0.25, + 1.5, + 0.03, + 0 + ], + "xai/grok-4.5": [ + 2, + 6, + 0.5, + 0 + ], + "xai/grok-4.6": [ + 2, + 6, + 0.5, + 0 + ], + "deepseek/deepseek-v4.1-flash": [ + 0.15, + 0.6, + 0.003, + 0 + ], + "Qwen/Qwen3.8-Max-0902": [ + 2, + 6, + 0.25, + 0 + ], + "google/gemini-3.8-flash": [ + 1.5, + 7.5, + 0.15, + 0 + ], + "inclusionai/ling-3.0-flash-sante:free": [ + 0, + 0, + 0, + 0 + ], + "meituan/LongCat-2.0:free": [ + 0, + 0, + 0, + 0 + ], + "meta/muse-spark-1.3": [ + 1.25, + 4.25, + 0.15, + 0 + ], + "meta/muse-spark-1.3-contributor": [ + 0.1, + 0.2, + 0.002, + 0 + ] } } diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index 73b8b75..358beeb 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-10T/) 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", { @@ -226,7 +236,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-09-01") + assert.equal(PRICING_LAST_VERIFIED, "2026-09-10") }) it("fails once temporary pricing needs review", () => {