diff --git a/src/providers/model-rename-migration.ts b/src/providers/model-rename-migration.ts index 3895386b5..7f0d17952 100644 --- a/src/providers/model-rename-migration.ts +++ b/src/providers/model-rename-migration.ts @@ -42,6 +42,11 @@ export interface ModelRename { * but lose the reasoning picker entirely. */ dropReasoningEffortMap?: boolean; + /** + * Keep a saved default whose legacy id carries request semantics that the + * replacement id cannot encode. Other catalog fields are still renamed. + */ + preserveDefaultModel?: boolean; } /** @@ -77,6 +82,9 @@ export const MODEL_RENAMES: readonly ModelRename[] = [ // The retired Flash tiers were wire ids, so any saved per-model record keyed by one // may also hold one as a value. 3.7 expresses tiers as thinkingLevel names instead. dropReasoningEffortMap: true, + // Tier-specific retired ids remain valid routing aliases. Replacing one when it is + // the saved default would discard its encoded tier and make 3.7 default to medium. + preserveDefaultModel: from !== "gemini-3.6-flash", })), ]; @@ -237,7 +245,7 @@ export function projectModelRenames( row[field] = next; touched = true; } - if (prov.defaultModel === rename.from) { + if (prov.defaultModel === rename.from && !rename.preserveDefaultModel) { prov.defaultModel = rename.to; touched = true; } diff --git a/tests/gemini-37-flash-migration.test.ts b/tests/gemini-37-flash-migration.test.ts index cb65846a1..cc97ae83c 100644 --- a/tests/gemini-37-flash-migration.test.ts +++ b/tests/gemini-37-flash-migration.test.ts @@ -156,7 +156,13 @@ describe("a saved config survives the retirement", () => { test("migrating a tier id does not duplicate an already-present 3.7 entry", () => { const { config } = projectModelRenames(configWith(["gemini-3.6-flash-high", "gemini-3.7-flash"])); - expect(config.providers["google-antigravity"]!.selectedModels).toEqual(["gemini-3.7-flash"]); + const prov = config.providers["google-antigravity"]!; + expect(prov.selectedModels).toEqual(["gemini-3.7-flash"]); + expect(prov.defaultModel).toBe("gemini-3.6-flash-high"); + expect(resolveAntigravityEffortWireModel(prov.defaultModel!)).toEqual({ + wireModelId: "gemini-3.7-flash", + thinkingLevel: "high", + }); }); test("an unrelated selection is left alone", () => {