feat(models): add Qwen 3.8 Flash and GLM 5.3 Flash

Synchronize the static model catalog with command-code@1.36.0, which adds
Qwen/Qwen3.8-Flash (reasoning efforts low, medium, xhigh) and
z-ai/glm-5.3-flash (low, high, max), the free minimax/minimax-m3-free
model, and the glm-5.3-flash output limit, and drops the retired
stealth/ox-alpha.
This commit is contained in:
Thomas Byr
2026-08-28 16:38:25 +02:00
parent 6f367515d8
commit 5ac0dbeedd
3 changed files with 35 additions and 12 deletions
+1 -1
View File
@@ -135,7 +135,7 @@ The following environment variables are intended for tests, local mocks, and com
## Image input ## 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.32.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 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.36.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. 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.
+11 -6
View File
@@ -1,10 +1,10 @@
export const COMMAND_CODE_CLI_VERSION = "1.32.2" export const COMMAND_CODE_CLI_VERSION = "1.36.0"
export type CommandCodeInputType = "text" | "image" export type CommandCodeInputType = "text" | "image"
export type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max" export type CommandCodeReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max"
/** /**
* Generated from command-code@1.32.2 by `npm run sync:commandcode-catalog`. * Generated from command-code@1.36.0 by `npm run sync:commandcode-catalog`.
* Do not edit manually. * Do not edit manually.
*/ */
export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCodeInputType[]>> = { export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCodeInputType[]>> = {
@@ -31,6 +31,7 @@ export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCod
"meta/muse-spark-1.1": ["text", "image"], "meta/muse-spark-1.1": ["text", "image"],
"meta/muse-spark-1.2": ["text", "image"], "meta/muse-spark-1.2": ["text", "image"],
"meta/muse-spark-1.2-contributor": ["text", "image"], "meta/muse-spark-1.2-contributor": ["text", "image"],
"minimax/minimax-m3-free": ["text", "image"],
"MiniMaxAI/MiniMax-M3": ["text", "image"], "MiniMaxAI/MiniMax-M3": ["text", "image"],
"moonshotai/Kimi-K2.5": ["text", "image"], "moonshotai/Kimi-K2.5": ["text", "image"],
"moonshotai/Kimi-K2.6": ["text", "image"], "moonshotai/Kimi-K2.6": ["text", "image"],
@@ -41,14 +42,15 @@ export const MODEL_INPUT_MODALITIES: Readonly<Record<string, readonly CommandCod
"Qwen/Qwen3.7-Flash": ["text", "image"], "Qwen/Qwen3.7-Flash": ["text", "image"],
"Qwen/Qwen3.7-Plus": ["text", "image"], "Qwen/Qwen3.7-Plus": ["text", "image"],
"Qwen/Qwen3.8-27B": ["text", "image"], "Qwen/Qwen3.8-27B": ["text", "image"],
"Qwen/Qwen3.8-Flash": ["text", "image"],
"Qwen/Qwen3.8-Max": ["text", "image"], "Qwen/Qwen3.8-Max": ["text", "image"],
"sakana/fugu-ultra": ["text", "image"], "sakana/fugu-ultra": ["text", "image"],
"stealth/ox-alpha": ["text", "image"],
"stepfun/Step-3.7-Flash": ["text", "image"], "stepfun/Step-3.7-Flash": ["text", "image"],
"thinkingmachines/inkling": ["text", "image"], "thinkingmachines/inkling": ["text", "image"],
"thinkingmachines/inkling-small": ["text", "image"], "thinkingmachines/inkling-small": ["text", "image"],
"xai/grok-4.5": ["text", "image"], "xai/grok-4.5": ["text", "image"],
"xiaomi/mimo-v2.5": ["text", "image"], "xiaomi/mimo-v2.5": ["text", "image"],
"z-ai/glm-5.3-flash": ["text", "image"],
} }
export const MODEL_REASONING: Readonly<Record<string, true>> = { export const MODEL_REASONING: Readonly<Record<string, true>> = {
@@ -76,6 +78,7 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
"meta/muse-spark-1.1": true, "meta/muse-spark-1.1": true,
"meta/muse-spark-1.2": true, "meta/muse-spark-1.2": true,
"meta/muse-spark-1.2-contributor": true, "meta/muse-spark-1.2-contributor": true,
"minimax/minimax-m3-free": true,
"MiniMaxAI/MiniMax-M3": true, "MiniMaxAI/MiniMax-M3": true,
"moonshotai/Kimi-K2.7-Code": true, "moonshotai/Kimi-K2.7-Code": true,
"moonshotai/Kimi-K2.7-Code-Highspeed": true, "moonshotai/Kimi-K2.7-Code-Highspeed": true,
@@ -88,9 +91,9 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
"Qwen/Qwen3.7-Max": true, "Qwen/Qwen3.7-Max": true,
"Qwen/Qwen3.7-Plus": true, "Qwen/Qwen3.7-Plus": true,
"Qwen/Qwen3.8-27B": true, "Qwen/Qwen3.8-27B": true,
"Qwen/Qwen3.8-Flash": true,
"Qwen/Qwen3.8-Max": true, "Qwen/Qwen3.8-Max": true,
"sakana/fugu-ultra": true, "sakana/fugu-ultra": true,
"stealth/ox-alpha": true,
"stepfun/Step-3.5-Flash": true, "stepfun/Step-3.5-Flash": true,
"stepfun/Step-3.7-Flash": true, "stepfun/Step-3.7-Flash": true,
"tencent/hy3-paid": true, "tencent/hy3-paid": true,
@@ -98,6 +101,7 @@ export const MODEL_REASONING: Readonly<Record<string, true>> = {
"thinkingmachines/inkling-small": true, "thinkingmachines/inkling-small": true,
"xai/grok-4.5": true, "xai/grok-4.5": true,
"xai/grok-4.6": true, "xai/grok-4.6": true,
"z-ai/glm-5.3-flash": true,
"zai-org/GLM-5.2": true, "zai-org/GLM-5.2": true,
"zai-org/GLM-5.3": true, "zai-org/GLM-5.3": true,
} }
@@ -125,11 +129,12 @@ export const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasonin
"gpt-5.6-sol": ["low", "medium", "high", "xhigh", "max"], "gpt-5.6-sol": ["low", "medium", "high", "xhigh", "max"],
"gpt-5.6-terra": ["low", "medium", "high", "xhigh", "max"], "gpt-5.6-terra": ["low", "medium", "high", "xhigh", "max"],
"Qwen/Qwen3.8-27B": ["low", "medium", "xhigh"], "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": ["low", "medium", "xhigh"],
"sakana/fugu-ultra": ["high", "xhigh"], "sakana/fugu-ultra": ["high", "xhigh"],
"stealth/ox-alpha": ["low", "high", "max"],
"xai/grok-4.5": ["low", "medium", "high"], "xai/grok-4.5": ["low", "medium", "high"],
"xai/grok-4.6": ["low", "medium", "high", "xhigh"], "xai/grok-4.6": ["low", "medium", "high", "xhigh"],
"z-ai/glm-5.3-flash": ["low", "high", "max"],
"zai-org/GLM-5.2": ["high", "max"], "zai-org/GLM-5.2": ["high", "max"],
"zai-org/GLM-5.3": ["low", "high", "max"], "zai-org/GLM-5.3": ["low", "high", "max"],
} }
@@ -137,5 +142,5 @@ export const MODEL_EFFORTS: Readonly<Record<string, readonly CommandCodeReasonin
export const MODEL_MAX_OUTPUT_TOKENS: Readonly<Record<string, number>> = { export const MODEL_MAX_OUTPUT_TOKENS: Readonly<Record<string, number>> = {
"poolside/laguna-s-2.1-free": 32_768, "poolside/laguna-s-2.1-free": 32_768,
"Qwen/Qwen3.8-27B": 32_768, "Qwen/Qwen3.8-27B": 32_768,
"stealth/ox-alpha": 131_072, "z-ai/glm-5.3-flash": 131_072,
} }
+23 -5
View File
@@ -112,13 +112,15 @@ describe("commandCodeModelsFromApiResponse()", () => {
]) ])
assert.deepEqual(inputModalitiesForModel("Qwen/Qwen3.8-27B"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("Qwen/Qwen3.8-27B"), ["text", "image"])
assert.deepEqual(inputModalitiesForModel("google/gemini-3.7-flash"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("google/gemini-3.7-flash"), ["text", "image"])
assert.deepEqual(inputModalitiesForModel("stealth/ox-alpha"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("Qwen/Qwen3.8-Flash"), ["text", "image"])
assert.deepEqual(inputModalitiesForModel("z-ai/glm-5.3-flash"), ["text", "image"])
assert.deepEqual(inputModalitiesForModel("minimax/minimax-m3-free"), ["text", "image"])
assert.deepEqual(inputModalitiesForModel("deepseek/deepseek-v4-pro"), ["text"]) assert.deepEqual(inputModalitiesForModel("deepseek/deepseek-v4-pro"), ["text"])
assert.deepEqual(inputModalitiesForModel("zai-org/GLM-5.3"), ["text"]) assert.deepEqual(inputModalitiesForModel("zai-org/GLM-5.3"), ["text"])
assert.deepEqual(inputModalitiesForModel("unknown-new-model"), ["text"]) assert.deepEqual(inputModalitiesForModel("unknown-new-model"), ["text"])
assert.equal(modelSupportsImageInput("gpt-5.6-luna"), true) assert.equal(modelSupportsImageInput("gpt-5.6-luna"), true)
assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-flash-vision-exp"), true) assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-flash-vision-exp"), true)
assert.equal(modelSupportsImageInput("stealth/ox-alpha"), true) assert.equal(modelSupportsImageInput("z-ai/glm-5.3-flash"), true)
assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-pro"), false) assert.equal(modelSupportsImageInput("deepseek/deepseek-v4-pro"), false)
assert.ok(Object.keys(MODEL_INPUT_MODALITIES).length > 0) assert.ok(Object.keys(MODEL_INPUT_MODALITIES).length > 0)
for (const modalities of Object.values(MODEL_INPUT_MODALITIES)) { for (const modalities of Object.values(MODEL_INPUT_MODALITIES)) {
@@ -149,7 +151,7 @@ describe("commandCodeModelsFromApiResponse()", () => {
}, },
}) })
assert.equal(models[2]?.reasoning, false) assert.equal(models[2]?.reasoning, false)
assert.equal(Object.keys(MODEL_REASONING).length, 48) assert.equal(Object.keys(MODEL_REASONING).length, 50)
}) })
it("uses model-specific output limits from the CLI catalog", () => { it("uses model-specific output limits from the CLI catalog", () => {
@@ -157,7 +159,7 @@ describe("commandCodeModelsFromApiResponse()", () => {
object: "list", object: "list",
data: [ data: [
{ ...API_RESPONSE.data[0], id: "Qwen/Qwen3.8-27B", context_length: 262_144 }, { ...API_RESPONSE.data[0], id: "Qwen/Qwen3.8-27B", context_length: 262_144 },
{ ...API_RESPONSE.data[0], id: "stealth/ox-alpha", context_length: 1_048_576 }, { ...API_RESPONSE.data[0], id: "z-ai/glm-5.3-flash", context_length: 1_048_576 },
{ {
...API_RESPONSE.data[0], ...API_RESPONSE.data[0],
id: "poolside/laguna-s-2.1-free", id: "poolside/laguna-s-2.1-free",
@@ -170,7 +172,7 @@ describe("commandCodeModelsFromApiResponse()", () => {
models.map(({ id, maxTokens }) => ({ id, maxTokens })), models.map(({ id, maxTokens }) => ({ id, maxTokens })),
[ [
{ id: "Qwen/Qwen3.8-27B", maxTokens: 32_768 }, { id: "Qwen/Qwen3.8-27B", maxTokens: 32_768 },
{ id: "stealth/ox-alpha", maxTokens: 131_072 }, { id: "z-ai/glm-5.3-flash", maxTokens: 131_072 },
{ id: "poolside/laguna-s-2.1-free", maxTokens: 32_768 }, { id: "poolside/laguna-s-2.1-free", maxTokens: 32_768 },
], ],
) )
@@ -217,6 +219,22 @@ describe("commandCodeModelsFromApiResponse()", () => {
xhigh: null, xhigh: null,
max: "max", max: "max",
}) })
assert.deepEqual(thinkingLevelMapForEfforts(MODEL_EFFORTS["Qwen/Qwen3.8-Flash"]), {
minimal: null,
low: "low",
medium: "medium",
high: null,
xhigh: "xhigh",
max: null,
})
assert.deepEqual(thinkingLevelMapForEfforts(MODEL_EFFORTS["z-ai/glm-5.3-flash"]), {
minimal: null,
low: "low",
medium: null,
high: "high",
xhigh: null,
max: "max",
})
assert.deepEqual(thinkingMetadataForModel("new-model-without-metadata"), undefined) assert.deepEqual(thinkingMetadataForModel("new-model-without-metadata"), undefined)
}) })