From fd25c42ae6e56a82be7219950a746572b1c4d0e9 Mon Sep 17 00:00:00 2001 From: Bilal Bakr <62337003+Bil0000@users.noreply.github.com> Date: Thu, 8 Oct 2026 22:26:35 +0300 Subject: [PATCH] fix(server): keep newly discovered models out of legacy groups (#14314) Co-authored-by: PR Batch Tester Co-authored-by: Claude Opus 5.5 (1M context) --- .../Drivers/AntigravityDriver.test.ts | 4 +-- .../src/provider/Drivers/AntigravityDriver.ts | 3 -- .../server/src/provider/ModelManifest.test.ts | 30 ++++++++++++++++++- apps/server/src/provider/ModelManifest.ts | 5 +--- apps/server/src/provider/model-manifest.json | 30 +++++++++++++++++-- 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/apps/server/src/provider/Drivers/AntigravityDriver.test.ts b/apps/server/src/provider/Drivers/AntigravityDriver.test.ts index 5e0581f5bdd3ecbc566338654475aa43886eabb1..e0c52801bc81abaea6e51ce4c3fb7273a24ecf82 100644 --- a/apps/server/src/provider/Drivers/AntigravityDriver.test.ts +++ b/apps/server/src/provider/Drivers/AntigravityDriver.test.ts @@ -325,9 +325,7 @@ it.layer(layerTest)("AntigravityDriver", (it) => { "gemini-test-high", ]); expect(snapshot.models[0]?.aliases).toContain(ANTIGRAVITY_DEFAULT_MODEL); - // The mock catalog is not in the manifest's current list, so it folds - // under the legacy section like an old Codex model would. - expect(snapshot.models.every((model) => model.isLegacy === true)).toBe(true); + expect(snapshot.models.every((model) => model.isLegacy !== true)).toBe(true); expect(snapshot.slashCommands.map((command) => command.name)).toEqual(["plan", "logout"]); expect(snapshot.supportsTextGeneration).toBe(true); h.controls.selected = h.second; diff --git a/apps/server/src/provider/Drivers/AntigravityDriver.ts b/apps/server/src/provider/Drivers/AntigravityDriver.ts index 7a10b4a725cdd55142fa06000719443a32805746..29e103c453b68c53c754b0305e8f8798f0dee146 100644 --- a/apps/server/src/provider/Drivers/AntigravityDriver.ts +++ b/apps/server/src/provider/Drivers/AntigravityDriver.ts @@ -150,9 +150,6 @@ export const AntigravityDriver: ProviderDriver modelManifest.current.pipe( Effect.map((manifest) => diff --git a/apps/server/src/provider/ModelManifest.test.ts b/apps/server/src/provider/ModelManifest.test.ts index e11e1bb1b38204d7bbecaa2d1ef2d0ef8ce48d34..8b8164387f267ae49fc445bc1952949aa55b2e83 100644 --- a/apps/server/src/provider/ModelManifest.test.ts +++ b/apps/server/src/provider/ModelManifest.test.ts @@ -34,6 +34,12 @@ describe("classifyModels", () => { const manifest: ModelManifest.ModelManifestData = { version: 1, currentModels: { codex: ["gpt-test"] }, + providers: { + codex: { + profiles: {}, + models: [{ slug: "gpt-old", name: "Old", status: "legacy" }], + }, + }, }; const models = [ model({ slug: "openai.gpt-test", isLegacy: true }), @@ -50,16 +56,23 @@ describe("classifyModels", () => { ], ); }); - it("flags non-current models, clears stale flags, and skips custom models", () => { + it("flags only known legacy models, clears stale flags, and skips custom models", () => { const manifest: ModelManifest.ModelManifestData = { version: 1, currentModels: { codex: ["current-a", "current-b"] }, + providers: { + codex: { + profiles: {}, + models: [{ slug: "old-model", name: "Old", status: "legacy" }], + }, + }, }; const models = [ model({ slug: "current-a" }), // Stale flag from a previous classification pass must be cleared. model({ slug: "current-b", isLegacy: true }), model({ slug: "old-model" }), + model({ slug: "new-release", isLegacy: true }), // Custom models are user-defined and never reclassified. model({ slug: "my-own-model", isCustom: true }), ]; @@ -72,10 +85,25 @@ describe("classifyModels", () => { ["current-a", false], ["current-b", false], ["old-model", true], + ["new-release", false], ["my-own-model", false], ], ); }); + it.each(["codex", "antigravity"])( + "keeps newly discovered %s models current when the manifest has no catalog", + (driverKind) => { + const models = [model({ slug: "new-release", isLegacy: true })]; + assert.deepStrictEqual( + ModelManifest.classifyModels( + models, + { version: 1, currentModels: { [driverKind]: ["known-current"] } }, + ProviderDriverKind.make(driverKind), + ), + [model({ slug: "new-release" })], + ); + }, + ); }); describe("applyManifestDefault", () => { diff --git a/apps/server/src/provider/ModelManifest.ts b/apps/server/src/provider/ModelManifest.ts index fd0fa1042a29543cc65d1740c14aef5a9bbdca10..c22efb8a094de3ab177eb2fae1ba1a7bd0f0fdca 100644 --- a/apps/server/src/provider/ModelManifest.ts +++ b/apps/server/src/provider/ModelManifest.ts @@ -221,10 +221,7 @@ function isLegacyModel( const catalogModel = catalog?.find((model) => model.slug === slug) ?? catalog?.find((model) => model.slug === family); - if (catalogModel) return catalogModel.status === "legacy"; - const currentModels = manifest.currentModels[driverKind]; - if (!currentModels) return false; - return !currentModels.includes(slug) && !currentModels.includes(family); + return catalogModel?.status === "legacy"; } /** diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index 5af2454fe6f5a4a9ca89926b739032bc0fab0733..36b7727d8ecbe2d9d8d7972003b7efb67b7893ca 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-10-07T19:00:00Z", + "updatedAt": "2026-10-08T14:44:57Z", "compatibility": [ { "driver": "codex", @@ -109,6 +109,16 @@ "antigravity": ["gemini-3.8-flash-high", "gemini-3.8-flash-medium", "gemini-3.8-flash-low"] }, "providers": { + "codex": { + "profiles": {}, + "models": [ + { "slug": "gpt-6-sol", "name": "GPT-6 Sol", "status": "legacy" }, + { "slug": "gpt-5.6-sol", "name": "GPT-5.6 Sol", "status": "legacy" }, + { "slug": "gpt-5.6-terra", "name": "GPT-5.6 Terra", "status": "legacy" }, + { "slug": "gpt-5.6-luna", "name": "GPT-5.6 Luna", "status": "legacy" }, + { "slug": "gpt-5.5", "name": "GPT-5.5", "status": "legacy" } + ] + }, "claudeAgent": { "defaults": { "chat": "claude-fable-5-1" @@ -777,7 +787,23 @@ "slug": "gemini-3.8-flash-low", "name": "Gemini 3.8 Flash (Low)", "status": "current" - } + }, + { "slug": "gemini-3.7-flash-high", "name": "Gemini 3.7 Flash (High)", "status": "legacy" }, + { + "slug": "gemini-3.7-flash-medium", + "name": "Gemini 3.7 Flash (Medium)", + "status": "legacy" + }, + { "slug": "gemini-3.7-flash-low", "name": "Gemini 3.7 Flash (Low)", "status": "legacy" }, + { "slug": "gemini-3.6-flash-high", "name": "Gemini 3.6 Flash (High)", "status": "legacy" }, + { + "slug": "gemini-3.6-flash-medium", + "name": "Gemini 3.6 Flash (Medium)", + "status": "legacy" + }, + { "slug": "gemini-3.6-flash-low", "name": "Gemini 3.6 Flash (Low)", "status": "legacy" }, + { "slug": "gemini-pro-agent", "name": "Gemini 3.1 Pro (High)", "status": "legacy" }, + { "slug": "gemini-3.1-pro-low", "name": "Gemini 3.1 Pro (Low)", "status": "legacy" } ] } } -- 2.54.0