From 1e0dd1189cb7dbc28cd90fbe346455803a6fa0b1 Mon Sep 17 00:00:00 2001 From: Omar Iqbal Naru Date: Fri, 21 Aug 2026 19:41:54 +0500 Subject: [PATCH 1/4] fix(core): register custom api under non-reserved name for omp 17.4.0 omp 17.4.0's host registry rejects registerCustomApi calls under built-in api names ("Cannot register custom API '': built-in API names are reserved"). The provider and its models registered under "openai-completions", so the extension failed to load. Register under "commandcode-custom" instead (matches the published npm build) and restore the real wire api via apiForModelId before dispatching to the native compat stream inside the transport router. The host's model registry also stores provider-supplied compat under model.compatConfig internally, only copying it back to model.compat inside its own dispatch-time patches. Since the transport router calls the native compat stream directly, it must read compatConfig itself or requests crash with 'baseCompat is undefined' before any network call. Verified against a local mock Provider API server with the extension linked into omp 17.4.0: model discovery lists all Command Code models, and a streamed chat completion sends the resolved x-cmd-zdr header and Authorization header end to end. --- index.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/index.ts b/index.ts index 72ae558..79349bd 100644 --- a/index.ts +++ b/index.ts @@ -19,6 +19,7 @@ import { getConfiguredApiKey } from "./src/api-key.ts" import { createStreamCommandCode } from "./src/core.ts" import { calculateCommandCodeCost } from "./src/cost.ts" import { + apiForModelId, baseUrlForModel, DEFAULT_MODELS_URL, DEFAULT_PROVIDER_API_BASE, @@ -51,7 +52,7 @@ function createProviderConfig( name: "Command Code", baseUrl: apiBase, apiKey: getConfiguredApiKey() ?? "$COMMANDCODE_API_KEY", - api: "openai-completions", + api: "commandcode-custom", streamSimple: streamCommandCode, headers, oauth: { @@ -63,7 +64,7 @@ function createProviderConfig( models: models.map((model) => ({ id: model.id, name: model.name, - api: model.api, + api: "commandcode-custom", baseUrl: baseUrlForModel(apiBase, model.api), reasoning: model.reasoning, ...(thinkingMetadataForModel(model.id) ?? {}), @@ -108,7 +109,12 @@ export default async function (pi: ExtensionAPI) { }) const transport = createCommandCodeTransportRouter({ createStream: () => new AssistantMessageEventStream(), - streamProvider: streamNativeProvider, + streamProvider: (model, context, options) => + streamNativeProvider( + { ...model, api: apiForModelId(model.id), compat: model.compatConfig ?? model.compat }, + context, + options, + ), streamGenerate, }) From 0d6202aec7fac14912d9baa3de5deaf716207292 Mon Sep 17 00:00:00 2001 From: Omar Iqbal Naru Date: Fri, 21 Aug 2026 19:42:14 +0500 Subject: [PATCH 2/4] docs(release): note omp custom api registration fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3cd9b..d01c553 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Add optional zero-data-retention headers through `COMMANDCODE_ZDR=1`. - Refresh GPT-5.6 Terra and Luna display prices after their temporary 50% promotion ended, and display the current DeepSeek V4 off-peak rates for its time-dependent pricing. - Add isolated live E2E profiles for separate Go-plan and Provider-API credentials, including an explicit selected-transport assertion and packed-package validation. +- Fix extension load failure on newer pi hosts that reject registering a custom API under a built-in name (`openai-completions`); register under `commandcode-custom` instead and restore the real wire API before native compat dispatch. ## 0.5.1 - 2026-08-11 From 45565a883fa4fc26b5dec85f555e62aca635f10d Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Sat, 22 Aug 2026 23:24:49 +0200 Subject: [PATCH 3/4] feat(models): add GLM-5.3 pricing and reasoning levels --- CHANGELOG.md | 1 + src/core.ts | 2 +- src/models.ts | 5 +++-- src/pricing.ts | 3 ++- tests/fixtures/commandcode-model-ids.json | 3 ++- tests/fixtures/commandcode-pricing.json | 3 ++- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3cd9b..c6d7f95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Add `zai-org/GLM-5.3` with its verified reasoning efforts and display pricing. - Prefer Command Code's Provider API (`/provider/v1/chat/completions` and `/provider/v1/messages`) and automatically fall back to the existing `/alpha/generate` transport only when the Provider API returns `403 upgrade_required` for a Go-plan account. - Remember the detected transport for the running process, re-detect it when credentials change, prevent stale in-flight requests from overwriting the new credential's transport, and never fall back for unrelated authentication, permission, rate-limit, network, or server failures. - Use Pi's native OpenAI- and Anthropic-compatible providers for Provider API streaming, including adaptive thinking for current reasoning-capable Claude models, while preserving the existing hardened generate transport, dynamic model discovery, offline cache, refresh/status commands, pricing, and OAuth credentials. diff --git a/src/core.ts b/src/core.ts index f1898dd..2eb92f8 100644 --- a/src/core.ts +++ b/src/core.ts @@ -43,7 +43,7 @@ export * from "./overflow.ts" export * from "./types.ts" export const DEFAULT_API_BASE = "https://api.commandcode.ai" -export const COMMAND_CODE_CLI_VERSION = "1.15.1" +export const COMMAND_CODE_CLI_VERSION = "1.32.1" const DEFAULT_GENERATE_MAX_TOKENS = 64_000 const DEFAULT_MAX_RETRIES = 0 diff --git a/src/models.ts b/src/models.ts index 3f8c7e9..e102c00 100644 --- a/src/models.ts +++ b/src/models.ts @@ -12,7 +12,7 @@ export type CommandCodeApi = "openai-completions" | "anthropic-messages" export type CommandCodeInputType = "text" | "image" /** - * Model input modalities from the command-code@1.15.1 bundled catalog. + * Model input modalities from the command-code@1.32.1 bundled catalog. * Models omitted here remain text-only so newly discovered IDs never claim * image support without upstream evidence. */ @@ -74,7 +74,7 @@ type CommandCodeReasoningEffort = Exclude * Per-model reasoning efforts supported by Command Code's generate endpoint. * * The Provider API does not expose reasoning metadata. This is an exact - * snapshot of `reasoningEfforts` from the command-code@1.15.1 model catalog + * snapshot of `reasoningEfforts` from the command-code@1.32.1 model catalog * (`packages/shared/src/model-catalog.ts`, also published in the generated * `dist/bundled/command-code-knowledge/reference/models.md`). Models omitted * here let Command Code choose their reasoning depth, matching the CLI. @@ -103,6 +103,7 @@ export const MODEL_EFFORTS: Readonly> = { }, "moonshotai/Kimi-K2.6": { input: 0.95, output: 4, cacheRead: 0.16, cacheWrite: 0 }, "moonshotai/Kimi-K2.5": { input: 0.6, output: 3, cacheRead: 0.1, cacheWrite: 0 }, + "zai-org/GLM-5.3": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, "zai-org/GLM-5.2": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, "zai-org/GLM-5.2-Fast": { input: 3, output: 10.25, cacheRead: 0.5, cacheWrite: 0 }, "zai-org/GLM-5.1": { input: 1.4, output: 4.4, cacheRead: 0.26, cacheWrite: 0 }, diff --git a/tests/fixtures/commandcode-model-ids.json b/tests/fixtures/commandcode-model-ids.json index f0974cd..1b9898a 100644 --- a/tests/fixtures/commandcode-model-ids.json +++ b/tests/fixtures/commandcode-model-ids.json @@ -1,5 +1,5 @@ { - "fetchedAt": "2026-08-04T10:12:57.953Z", + "fetchedAt": "2026-08-22T21:19:37.782Z", "source": "https://api.commandcode.ai/provider/v1/models", "modelIds": [ "claude-sonnet-5", @@ -23,6 +23,7 @@ "moonshotai/Kimi-K2.7-Code-Highspeed", "moonshotai/Kimi-K2.6", "moonshotai/Kimi-K2.5", + "zai-org/GLM-5.3", "zai-org/GLM-5.2", "zai-org/GLM-5.2-Fast", "zai-org/GLM-5.1", diff --git a/tests/fixtures/commandcode-pricing.json b/tests/fixtures/commandcode-pricing.json index 6a508fd..5b2070c 100644 --- a/tests/fixtures/commandcode-pricing.json +++ b/tests/fixtures/commandcode-pricing.json @@ -1,5 +1,5 @@ { - "verifiedAt": "2026-08-20", + "verifiedAt": "2026-08-22", "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": { @@ -18,6 +18,7 @@ "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], + "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], From d637a73e06384c5bb9e93aeccb0812b0048e37c5 Mon Sep 17 00:00:00 2001 From: Thomas Byr Date: Sat, 22 Aug 2026 23:25:06 +0200 Subject: [PATCH 4/4] fix(docs): update Command Code version to 1.32.1 --- README.md | 2 +- tests/test-models.ts | 5 +++-- tests/test-pricing.ts | 4 ++-- tests/test-stream.ts | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4b32189..a4de126 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,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.15.1`; unknown models default to text-only until their upstream metadata is reviewed. +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.1`; unknown models default to text-only until their upstream metadata is reviewed. 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/tests/test-models.ts b/tests/test-models.ts index 3c7e33c..f10dd7e 100644 --- a/tests/test-models.ts +++ b/tests/test-models.ts @@ -100,7 +100,7 @@ describe("commandCodeModelsFromApiResponse()", () => { ) }) - it("matches command-code@1.15.1 image input capabilities", () => { + it("matches command-code@1.32.1 image input capabilities", () => { assert.deepEqual(inputModalitiesForModel("gpt-5.6-luna"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("meta/muse-spark-1.2"), ["text", "image"]) assert.deepEqual(inputModalitiesForModel("deepseek/deepseek-v4-pro"), ["text"]) @@ -123,7 +123,7 @@ describe("commandCodeModelsFromApiResponse()", () => { assert.equal(models[1]?.reasoning, false) }) - it("matches the exact command-code@1.15.1 reasoning effort catalog", () => { + it("matches the exact command-code@1.32.1 reasoning effort catalog", () => { assert.deepEqual(MODEL_EFFORTS, { "Qwen/Qwen3.8-Max": ["low", "medium", "xhigh"], "claude-fable-5": ["low", "medium", "high", "xhigh", "max"], @@ -147,6 +147,7 @@ describe("commandCodeModelsFromApiResponse()", () => { "google/gemini-3.6-flash": ["low", "medium", "high"], "sakana/fugu-ultra": ["high", "xhigh"], "xai/grok-4.5": ["low", "medium", "high"], + "zai-org/GLM-5.3": ["low", "high", "max"], "zai-org/GLM-5.2": ["high", "max"], }) }) diff --git a/tests/test-pricing.ts b/tests/test-pricing.ts index 6e17400..202d8aa 100644 --- a/tests/test-pricing.ts +++ b/tests/test-pricing.ts @@ -50,7 +50,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-08-04T/) + assert.match(fixture.fetchedAt, /^2026-08-22T/) const catalogIds = [...fixture.modelIds].sort() const pricedIds = Object.keys(MODEL_COSTS).sort() @@ -169,7 +169,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-08-20") + assert.equal(PRICING_LAST_VERIFIED, "2026-08-22") }) it("fails once temporary pricing needs review", () => { diff --git a/tests/test-stream.ts b/tests/test-stream.ts index e30ac49..a429798 100644 --- a/tests/test-stream.ts +++ b/tests/test-stream.ts @@ -488,7 +488,7 @@ describe("streamCommandCode — request serialization", () => { const headers = server.lastRequestHeaders() assert.equal(headers.authorization, "Bearer mock-key") - assert.equal(headers["x-command-code-version"], "1.15.1") + assert.equal(headers["x-command-code-version"], "1.32.1") assert.equal(headers["x-project-slug"], "repo") assert.equal(headers["x-taste-learning"], "true") assert.equal(headers["x-co-flag"], "false")