From 811dfd76509431a760f89d3a312865ed7c339eba Mon Sep 17 00:00:00 2001 From: hawkff <109485367+hawkff@users.noreply.github.com> Date: Wed, 11 Nov 2026 10:56:20 -0500 Subject: [PATCH 1/3] Register Antigravity Gemini 4 Carbon and 3.8 Flash high IDs Map gemini-4-carbon-high and gemini-3.8-flash-high to their canonical Google metadata, as gemini-4-argon-high already is. Target CLIProxyAPI 8.0.67 and set the version to 0.3.9. --- CHANGELOG.md | 5 +++++ package.json | 2 +- src/catalog.ts | 2 ++ src/claude-quota.ts | 2 +- test/provider.test.ts | 10 +++++++++- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3581be7..48a48d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ For releases before 0.3.6, see the [GitHub releases](https://github.com/hawkff/pi-cliproxyapi-native/releases). +## [0.3.9] - 2026-11-11 + +- Antigravity's `gemini-4-carbon-high` and `gemini-3.8-flash-high` register with `google/gemini-4-carbon` and `google/gemini-3.8-flash` metadata, as `gemini-4-argon-high` does with `google/gemini-4-argon`. Before, discovery skipped both IDs. Pi 1.5.2 doesn't bundle Gemini 4 Carbon metadata, so `gemini-4-carbon-high` registers once the catalog that Pi refreshes during a session includes it. +- The extension targets Pi 1.5.2 and CLIProxyAPI 8.0.67. + ## [0.3.8] - 2026-11-10 - Model discovery skips an ID it cannot use and keeps the rest of the catalog. CLIProxyAPI accepts any text as a model alias, and one ID with a space, a non-ASCII character, or more than 256 characters made discovery fail. A catalog with no usable ID still fails, so it cannot replace a working model list. diff --git a/package.json b/package.json index 9662ed3..3e1b529 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pi-cliproxyapi-native", - "version": "0.3.8", + "version": "0.3.9", "description": "CLIProxyAPI chat discovery, image generation and editing, and video generation with Pi's native adapters", "publishConfig": { "access": "public" diff --git a/src/catalog.ts b/src/catalog.ts index f11346b..bb72464 100644 --- a/src/catalog.ts +++ b/src/catalog.ts @@ -312,6 +312,8 @@ const metadataFallbacks = new Map([ ["claude-opus-5-5-high", "anthropic/claude-opus-5-5"], ["claude-sonnet-5-5-high", "anthropic/claude-sonnet-5-5"], ["gemini-4-argon-high", "google/gemini-4-argon"], + ["gemini-4-carbon-high", "google/gemini-4-carbon"], + ["gemini-3.8-flash-high", "google/gemini-3.8-flash"], ]); export function mapCatalog(value: unknown, config: Config, known: readonly Model[]) { diff --git a/src/claude-quota.ts b/src/claude-quota.ts index 564f513..fc05c07 100644 --- a/src/claude-quota.ts +++ b/src/claude-quota.ts @@ -168,7 +168,7 @@ export async function fetchClaudeQuota( Authorization: "Bearer $TOKEN$", "Content-Type": "application/json", "anthropic-beta": "oauth-2025-04-20", - // CLIProxyAPI 8.0.64 presents this Claude Code version for OAuth accounts. + // CLIProxyAPI 8.0.67 presents this Claude Code version for OAuth accounts. "User-Agent": "claude-cli/2.1.321 (external, cli)", }, }); diff --git a/test/provider.test.ts b/test/provider.test.ts index d26e298..17349fb 100644 --- a/test/provider.test.ts +++ b/test/provider.test.ts @@ -226,11 +226,19 @@ test("auth prefixes keep separate entries and reuse metadata without guessing cu }); test("Antigravity high IDs use exact metadata fallbacks without changing advertised IDs", () => { - const sources = builtinCatalog(); + const bundled = builtinCatalog(); + const argon = bundled.find((model) => model.provider === "google" && model.id === "gemini-4-argon"); + assert.ok(argon); + // Pi 1.5.2 has Gemini 4 Carbon metadata only in its refreshed catalog. + const sources = metadataCatalog((provider) => + provider === "google" ? [{ ...argon, id: "gemini-4-carbon", name: "Gemini 4 Carbon" }] : undefined, + ); for (const [provider, canonical] of [ ["anthropic", "claude-opus-5-5"], ["anthropic", "claude-sonnet-5-5"], ["google", "gemini-4-argon"], + ["google", "gemini-4-carbon"], + ["google", "gemini-3.8-flash"], ]) { const reference = sources.find((model) => model.provider === provider && model.id === canonical); assert.ok(reference); From 5daa728b662fa0538c47208c2c021ed67b63d564 Mon Sep 17 00:00:00 2001 From: hawkff <109485367+hawkff@users.noreply.github.com> Date: Wed, 11 Nov 2026 11:27:38 -0500 Subject: [PATCH 2/3] State when Gemini 4 Carbon metadata reaches Pi Pi 1.5.2 loads it from pi.dev only for a Google provider with credentials. --- CHANGELOG.md | 2 +- test/provider.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48a48d5..def201b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ For releases before 0.3.6, see the [GitHub releases](https://github.com/hawkff/p ## [0.3.9] - 2026-11-11 -- Antigravity's `gemini-4-carbon-high` and `gemini-3.8-flash-high` register with `google/gemini-4-carbon` and `google/gemini-3.8-flash` metadata, as `gemini-4-argon-high` does with `google/gemini-4-argon`. Before, discovery skipped both IDs. Pi 1.5.2 doesn't bundle Gemini 4 Carbon metadata, so `gemini-4-carbon-high` registers once the catalog that Pi refreshes during a session includes it. +- Antigravity's `gemini-4-carbon-high` and `gemini-3.8-flash-high` register with `google/gemini-4-carbon` and `google/gemini-3.8-flash` metadata, as `gemini-4-argon-high` does with `google/gemini-4-argon`. Before, discovery skipped both IDs. Pi 1.5.2 doesn't bundle Gemini 4 Carbon metadata. Until a Pi release does, `gemini-4-carbon-high` registers only when Google has credentials in Pi, such as a stored login or `GEMINI_API_KEY`, because Pi loads the metadata from pi.dev only then. - The extension targets Pi 1.5.2 and CLIProxyAPI 8.0.67. ## [0.3.8] - 2026-11-10 diff --git a/test/provider.test.ts b/test/provider.test.ts index 17349fb..36c7f0d 100644 --- a/test/provider.test.ts +++ b/test/provider.test.ts @@ -229,7 +229,7 @@ test("Antigravity high IDs use exact metadata fallbacks without changing adverti const bundled = builtinCatalog(); const argon = bundled.find((model) => model.provider === "google" && model.id === "gemini-4-argon"); assert.ok(argon); - // Pi 1.5.2 has Gemini 4 Carbon metadata only in its refreshed catalog. + // Pi 1.5.2 loads Gemini 4 Carbon metadata only from pi.dev, for a Google provider with credentials. const sources = metadataCatalog((provider) => provider === "google" ? [{ ...argon, id: "gemini-4-carbon", name: "Gemini 4 Carbon" }] : undefined, ); From 4721361152b3ade4c61038eaf2dc39e80738d503 Mon Sep 17 00:00:00 2001 From: hawkff <109485367+hawkff@users.noreply.github.com> Date: Wed, 11 Nov 2026 11:29:58 -0500 Subject: [PATCH 3/3] Describe the Gemini 4 Carbon catalog download Google credentials gate the pi.dev download; Pi still restores a cached catalog. --- CHANGELOG.md | 2 +- test/provider.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index def201b..170dbeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ For releases before 0.3.6, see the [GitHub releases](https://github.com/hawkff/p ## [0.3.9] - 2026-11-11 -- Antigravity's `gemini-4-carbon-high` and `gemini-3.8-flash-high` register with `google/gemini-4-carbon` and `google/gemini-3.8-flash` metadata, as `gemini-4-argon-high` does with `google/gemini-4-argon`. Before, discovery skipped both IDs. Pi 1.5.2 doesn't bundle Gemini 4 Carbon metadata. Until a Pi release does, `gemini-4-carbon-high` registers only when Google has credentials in Pi, such as a stored login or `GEMINI_API_KEY`, because Pi loads the metadata from pi.dev only then. +- Antigravity's `gemini-4-carbon-high` and `gemini-3.8-flash-high` register with `google/gemini-4-carbon` and `google/gemini-3.8-flash` metadata, as `gemini-4-argon-high` does with `google/gemini-4-argon`. Before, discovery skipped both IDs. Pi 1.5.2 doesn't bundle Gemini 4 Carbon metadata. Until a Pi release does, `gemini-4-carbon-high` needs the metadata from Pi's pi.dev catalog, which Pi downloads only while Google has credentials in Pi, such as a stored login or `GEMINI_API_KEY`. - The extension targets Pi 1.5.2 and CLIProxyAPI 8.0.67. ## [0.3.8] - 2026-11-10 diff --git a/test/provider.test.ts b/test/provider.test.ts index 36c7f0d..0652286 100644 --- a/test/provider.test.ts +++ b/test/provider.test.ts @@ -229,7 +229,7 @@ test("Antigravity high IDs use exact metadata fallbacks without changing adverti const bundled = builtinCatalog(); const argon = bundled.find((model) => model.provider === "google" && model.id === "gemini-4-argon"); assert.ok(argon); - // Pi 1.5.2 loads Gemini 4 Carbon metadata only from pi.dev, for a Google provider with credentials. + // Pi 1.5.2 gets Gemini 4 Carbon metadata only from its pi.dev catalog. const sources = metadataCatalog((provider) => provider === "google" ? [{ ...argon, id: "gemini-4-carbon", name: "Gemini 4 Carbon" }] : undefined, );