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
4 changes: 2 additions & 2 deletions .github/scripts/check-commandcode-model-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ 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(["minimal", "low", "medium", "high", "xhigh", "max"])
const VALID_EFFORTS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"])

function quoteWindowsArgument(argument: string): string {
if (argument.length === 0) return '""'
Expand Down Expand Up @@ -368,7 +368,7 @@ export function renderCommandCodeCatalog(
)
.join("\n")

return `export const COMMAND_CODE_CLI_VERSION = ${quoted(packageVersion)}\n\nexport type CommandCodeInputType = "text" | "image"\nexport type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max"\n\n/**\n * Generated from command-code@${packageVersion} by \`npm run sync:commandcode-catalog\`.\n * Do not edit manually.\n */\nexport const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCodeInputType[]>> = {\n${imageEntries}\n}\n\nexport const MODEL_REASONING: Readonly<Record<string, true>> = {\n${reasoningEntries}\n}\n\nexport const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasoningEffort[]>> = {\n${effortEntries}\n}\n\nexport const MODEL_MAX_OUTPUT_TOKENS: Readonly<Record<string, number>> = {\n${maxOutputEntries}\n}\n`
return `export const COMMAND_CODE_CLI_VERSION = ${quoted(packageVersion)}\n\nexport type CommandCodeInputType = "text" | "image"\nexport type CommandCodeReasoningEffort = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max"\n\n/**\n * Generated from command-code@${packageVersion} by \`npm run sync:commandcode-catalog\`.\n * Do not edit manually.\n */\nexport const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCodeInputType[]>> = {\n${imageEntries}\n}\n\nexport const MODEL_REASONING: Readonly<Record<string, true>> = {\n${reasoningEntries}\n}\n\nexport const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasoningEffort[]>> = {\n${effortEntries}\n}\n\nexport const MODEL_MAX_OUTPUT_TOKENS: Readonly<Record<string, number>> = {\n${maxOutputEntries}\n}\n`
}

function updateDocumentedCatalogVersion(
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/model-metadata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:
- "src/cost.ts"
- "src/models.ts"
- "src/pricing.ts"
- "tests/fixtures/commandcode-pricing-page-haiku-5-5.html"
- "tests/fixtures/commandcode-pricing-page.html"
- "tests/test-model-metadata-check.ts"
- "tests/test-models.ts"
Expand Down Expand Up @@ -43,6 +44,7 @@ jobs:
registry-url: https://registry.npmjs.org
- run: npm ci
- name: Compare with the latest Command Code CLI
shell: bash
run: npm run check:commandcode-catalog | tee commandcode-catalog-report.md
- name: Publish catalog report
if: always()
Expand Down Expand Up @@ -72,6 +74,7 @@ jobs:
registry-url: https://registry.npmjs.org
- run: npm ci
- name: Synchronize with the latest Command Code CLI
shell: bash
run: npm run sync:commandcode-catalog | tee commandcode-catalog-report.md
- name: Format and verify synchronized files
run: |
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

- 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.
- Refresh the static capability snapshot to `command-code@1.79.2`: add `claude-haiku-5-5`, `mistral/mistral-large-4` (image input, 262K output limit), and the free `stealth/glyph-cluster:free`; retire `stealth/pixel-canary` and `stealth/space-bunny-alpha`.
- Add reviewed display pricing for the refreshed catalog — `claude-haiku-5-5` with its 100K long-context tier, `mistral/mistral-large-4`, and the free `stealth/glyph-cluster:free` — drop the retired `stealth/space-bunny-alpha`, and correct the `claude-sonnet-5-5` cache-read rate to $0.10 per million tokens, verified against the official pricing page on 2026-10-09. The snapshot now covers all 87 advertised models.

## 0.7.6 - 2026-10-06

- Correct the display input price for `stepfun/Step-3.5-Flash` to $0.09 per million tokens and add the `Qwen/Qwen3.6-Plus` long-context tier above 256K tokens, verified against the official pricing page on 2026-10-06. Mark the unchanged, expired `qwen-3.7-max-2x-usage` badge as reviewed in the pricing checker while keeping it visible in reports; changed deal terms and price drift still require review.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ A model whose catalog entry omits `supported_endpoints` keeps Chat Completions,

### 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. The catalog sync removes an override as soon as upstream publishes its own levels. 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 (currently empty because upstream publishes every level). The catalog sync removes an override as soon as upstream publishes its own levels. 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:

Expand Down Expand Up @@ -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.72.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.
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.

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.

Expand Down
41 changes: 25 additions & 16 deletions src/commandcode-catalog.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
export const COMMAND_CODE_CLI_VERSION = "1.72.4"
export const COMMAND_CODE_CLI_VERSION = "1.79.2"

export type CommandCodeInputType = "text" | "image"
export type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max"
export type CommandCodeReasoningEffort =
| "off"
| "minimal"
| "low"
| "medium"
| "high"
| "xhigh"
| "max"

/**
* Generated from command-code@1.72.4 by `npm run sync:commandcode-catalog`.
* Generated from command-code@1.79.2 by `npm run sync:commandcode-catalog`.
* Do not edit manually.
*/
export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCodeInputType[]>> = {
"claude-fable-5": ["text", "image"],
"claude-fable-5-1": ["text", "image"],
"claude-haiku-4-5-20251001": ["text", "image"],
"claude-haiku-5-5": ["text", "image"],
"claude-opus-4-7": ["text", "image"],
"claude-opus-4-8": ["text", "image"],
"claude-opus-5": ["text", "image"],
Expand Down Expand Up @@ -44,6 +52,7 @@ export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCod
"meta/muse-spark-1.3": ["text", "image"],
"meta/muse-spark-1.3-contributor": ["text", "image"],
"MiniMaxAI/MiniMax-M3": ["text", "image"],
"mistral/mistral-large-4": ["text", "image"],
"moonshotai/Kimi-K2.5": ["text", "image"],
"moonshotai/Kimi-K2.6": ["text", "image"],
"moonshotai/Kimi-K2.7-Code": ["text", "image"],
Expand All @@ -58,8 +67,6 @@ export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCod
"Qwen/Qwen3.8-Max-0902": ["text", "image"],
"Qwen/Qwen3.8-Omni-Flash": ["text", "image"],
"sakana/fugu-ultra": ["text", "image"],
"stealth/pixel-canary": ["text", "image"],
"stealth/space-bunny-alpha": ["text", "image"],
"stepfun/Step-3.7-Flash": ["text", "image"],
"stepfun/Step-5-Preview": ["text", "image"],
"thinkingmachines/inkling": ["text", "image"],
Expand All @@ -78,6 +85,7 @@ export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCod
export const MODEL_REASONING: Readonly<Record<string, true>> = {
"claude-fable-5": true,
"claude-fable-5-1": true,
"claude-haiku-5-5": true,
"claude-opus-4-7": true,
"claude-opus-4-8": true,
"claude-opus-5": true,
Expand Down Expand Up @@ -117,6 +125,7 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
"meta/muse-spark-1.3": true,
"meta/muse-spark-1.3-contributor": true,
"MiniMaxAI/MiniMax-M3": true,
"mistral/mistral-large-4": true,
"moonshotai/Kimi-K2.7-Code": true,
"moonshotai/Kimi-K2.7-Code-Highspeed": true,
"moonshotai/Kimi-K3": true,
Expand All @@ -133,8 +142,7 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
"Qwen/Qwen3.8-Max-0902": true,
"Qwen/Qwen3.8-Omni-Flash": true,
"sakana/fugu-ultra": true,
"stealth/pixel-canary": true,
"stealth/space-bunny-alpha": true,
"stealth/glyph-cluster:free": true,
"stepfun/Step-3.5-Flash": true,
"stepfun/Step-3.7-Flash": true,
"stepfun/Step-5-Preview": true,
Expand All @@ -154,19 +162,20 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
export const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasoningEffort[]>> = {
"claude-fable-5": ["low", "medium", "high", "xhigh", "max"],
"claude-fable-5-1": ["low", "medium", "high", "xhigh", "max"],
"claude-haiku-5-5": ["low", "medium", "high", "xhigh", "max"],
"claude-opus-4-7": ["low", "medium", "high", "xhigh", "max"],
"claude-opus-4-8": ["low", "medium", "high", "xhigh", "max"],
"claude-opus-5": ["low", "medium", "high", "xhigh", "max"],
"claude-opus-5-5": ["low", "medium", "high", "xhigh", "max"],
"claude-sonnet-4-6": ["low", "medium", "high", "xhigh", "max"],
"claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"],
"claude-sonnet-5-5": ["low", "medium", "high", "xhigh", "max"],
"deepseek/deepseek-v4-flash": ["high", "max"],
"deepseek/deepseek-v4-flash": ["off", "high", "max"],
"deepseek/deepseek-v4-flash-fast": ["low", "high", "max"],
"deepseek/deepseek-v4-flash-vision-exp": ["high", "max"],
"deepseek/deepseek-v4-pro": ["high", "max"],
"deepseek/deepseek-v4.1-flash": ["low", "high", "max"],
"deepseek/deepseek-v4.1-flash-fast": ["low", "high", "max"],
"deepseek/deepseek-v4-flash-vision-exp": ["off", "high", "max"],
"deepseek/deepseek-v4-pro": ["off", "high", "max"],
"deepseek/deepseek-v4.1-flash": ["off", "low", "high", "max"],
"deepseek/deepseek-v4.1-flash-fast": ["off", "low", "high", "max"],
"google/gemini-3.1-flash-lite": ["low", "medium", "high"],
"google/gemini-3.5-flash": ["low", "medium", "high"],
"google/gemini-3.5-flash-lite": ["low", "medium", "high"],
Expand All @@ -191,15 +200,15 @@ export const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasonin
"meta/muse-spark-1.3": ["low", "medium", "high", "xhigh", "max"],
"meta/muse-spark-1.3-contributor": ["low", "medium", "high", "xhigh"],
"MiniMaxAI/MiniMax-M3": ["low", "medium", "high"],
"mistral/mistral-large-4": ["low", "medium", "high"],
"moonshotai/Kimi-K3": ["low", "high", "max"],
"Qwen/Qwen3.8-27B": ["low", "medium", "xhigh"],
"Qwen/Qwen3.8-Flash": ["low", "medium", "xhigh"],
"Qwen/Qwen3.8-Max": ["low", "medium", "xhigh"],
"Qwen/Qwen3.8-Max-0902": ["low", "medium", "xhigh"],
"Qwen/Qwen3.8-Omni-Flash": ["low", "medium", "xhigh"],
"sakana/fugu-ultra": ["high", "xhigh"],
"stealth/pixel-canary": ["low", "medium", "xhigh"],
"stealth/space-bunny-alpha": ["low", "medium", "high"],
"stealth/glyph-cluster:free": ["low", "medium", "high", "xhigh"],
"stepfun/Step-5-Preview": ["low", "medium", "high"],
"tencent/hy4-preview": ["low", "medium", "high"],
"xai/grok-4.5": ["low", "medium", "high"],
Expand All @@ -214,11 +223,11 @@ export const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasonin
export const MODEL_MAX_OUTPUT_TOKENS: Readonly<Record<string, number>> = {
"inclusionai/ling-3.0-flash-sante:free": 32_768,
"inclusionai/ling-3.1-flash:free": 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-Omni-Flash": 131_072,
"stealth/pixel-canary": 131_072,
"stealth/space-bunny-alpha": 524_288,
"stealth/glyph-cluster:free": 256_000,
"z-ai/glm-5.3-flash": 131_072,
"z-ai/glm-5.3-flashx": 131_072,
}
22 changes: 19 additions & 3 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-10-06"
export const PRICING_LAST_VERIFIED = "2026-10-09"

export const ZERO_MODEL_COST: CommandCodeModelCost = {
input: 0,
Expand All @@ -42,9 +42,10 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
"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 },
"poolside/laguna-s-2.1-free": { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
"stealth/space-bunny-alpha": { 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
"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 },
"moonshotai/Kimi-K3": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 0 },
Expand Down Expand Up @@ -207,7 +208,7 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
},

// Anthropic
"claude-sonnet-5-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
"claude-sonnet-5-5": { input: 2, output: 10, cacheRead: 0.1, cacheWrite: 2.5 },
"claude-sonnet-5": { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
"claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
"claude-fable-5-1": { input: 10, output: 50, cacheRead: 0.25, cacheWrite: 12.5 },
Expand All @@ -216,6 +217,21 @@ export const MODEL_COSTS: Readonly<Record<string, CommandCodeModelCost>> = {
"claude-opus-5": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
"claude-opus-4-8": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
"claude-opus-4-7": { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
"claude-haiku-5-5": {
input: 0.1,
output: 0.5,
cacheRead: 0.01,
cacheWrite: 0.125,
tiers: [
{
inputTokensAbove: 100_000,
input: 0.5,
output: 2.5,
cacheRead: 0.05,
cacheWrite: 0.625,
},
],
},
"claude-haiku-4-5-20251001": {
input: 1,
output: 5,
Expand Down
8 changes: 5 additions & 3 deletions tests/fixtures/commandcode-model-ids.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"fetchedAt": "2026-10-05T19:58:38.015Z",
"fetchedAt": "2026-10-09T06:21:21.675Z",
"source": "https://api.commandcode.ai/provider/v1/models",
"modelIds": [
"claude-sonnet-5-5",
Expand All @@ -11,6 +11,7 @@
"claude-opus-5",
"claude-opus-4-8",
"claude-opus-4-7",
"claude-haiku-5-5",
"claude-haiku-4-5-20251001",
"gpt-6-astra",
"gpt-6.1-sol",
Expand Down Expand Up @@ -75,7 +76,7 @@
"nvidia/nemotron-3-ultra-550b-a55b",
"thinkingmachines/inkling",
"thinkingmachines/inkling-small",
"stealth/space-bunny-alpha",
"stealth/glyph-cluster:free",
"poolside/laguna-s-2.1-free",
"inclusionai/ling-3.0-flash-sante:free",
"inclusionai/ling-3.1-flash:free",
Expand All @@ -86,6 +87,7 @@
"meta/muse-spark-1.3-contributor",
"xai/grok-4.5",
"xai/grok-4.6",
"xai/grok-4.7"
"xai/grok-4.7",
"mistral/mistral-large-4"
]
}
8 changes: 8 additions & 0 deletions tests/fixtures/commandcode-pricing-page-haiku-5-5.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<!--
Minimal Command Code pricing page snapshot for claude-haiku-5-5.
source: https://commandcode.ai/docs/resources/pricing-limits
fetchedAt: 2026-10-09T00:00:00.000Z
Contains only the Next.js Flight push script that carries the props.rows pricing table.
The single row mirrors the live props.rows entry for claude-haiku-5-5 verbatim.
-->
<script>self.__next_f.push([1,"34:[\"$\",\"$L53\",null,{\"rows\":[{\"id\":\"claude-haiku-5-5\",\"name\":\"Claude Haiku 5.5\",\"category\":\"premium\",\"availability\":{\"individual-go\":false,\"individual-go-v1\":false,\"individual-goat\":true,\"individual-pro\":true,\"individual-pro-v1\":true,\"individual-provider\":true,\"individual-max\":true,\"individual-ultra\":true,\"teams-pro\":true,\"all\":true},\"contextWindow\":1000000,\"caps\":{\"text\":true,\"vision\":true,\"reasoning\":true},\"tip\":\"Rates shown are the ≤ 100K tokens band; > 100K tokens bills $0.50 input / $2.50 output / $0.05 cache read / $0.625 cache write (per 1M tokens).\",\"tiers\":[{\"label\":\"Standard\",\"context\":\"≤ 100K\",\"rates\":{\"input\":0.1,\"output\":0.5,\"cacheRead\":0.01,\"cacheWrite\":0.125}},{\"label\":\"Long context\",\"context\":\"> 100K\",\"rates\":{\"input\":0.5,\"output\":2.5,\"cacheRead\":0.05,\"cacheWrite\":0.625}}]}]}]\n"])</script>
Loading
Loading