From f835a92db54a03a1e61a1cf11d8543daa2b4f9d5 Mon Sep 17 00:00:00 2001 From: Hillary Mutisya <150286414+hillary-mutisya@users.noreply.github.com> Date: Tue, 29 Sep 2026 15:58:19 -0700 Subject: [PATCH 1/2] Update models used when in copilot mode --- ts/config.sample.yaml | 4 +-- .../aiclient/src/copilotModelDefaults.ts | 2 +- ts/packages/aiclient/src/copilotModels.ts | 6 ++++ ts/packages/aiclient/src/providerMode.ts | 14 ++++---- .../aiclient/test/copilotTransport.spec.ts | 34 +++++++++++++++++-- .../aiclient/test/providerMode.spec.ts | 18 +++++----- 6 files changed, 56 insertions(+), 22 deletions(-) diff --git a/ts/config.sample.yaml b/ts/config.sample.yaml index 47fc03166c..5f509eaa43 100644 --- a/ts/config.sample.yaml +++ b/ts/config.sample.yaml @@ -160,8 +160,8 @@ openAI: # --- Copilot (Copilot SDK chat + Copilot embeddings) ----------------------- # modelProvider: copilot # copilot: -# defaultModel: gpt-5.6-luna # requires an authenticated `copilot` CLI -# fallbackModels: # first available concrete model is used +# defaultModel: gpt-6-luna # requires an authenticated `copilot` CLI +# fallbackModels: # after the matching GPT-5.6 tier, use the first available model # - gpt-5.4-mini # - gpt-5-mini # - gpt-5.4 diff --git a/ts/packages/aiclient/src/copilotModelDefaults.ts b/ts/packages/aiclient/src/copilotModelDefaults.ts index b6127dcfe4..23e8ca0710 100644 --- a/ts/packages/aiclient/src/copilotModelDefaults.ts +++ b/ts/packages/aiclient/src/copilotModelDefaults.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -export const DEFAULT_COPILOT_MODEL = "gpt-5.6-luna"; +export const DEFAULT_COPILOT_MODEL = "gpt-6-luna"; export const DEFAULT_COPILOT_FALLBACK_MODELS: readonly string[] = [ "gpt-5.4-mini", diff --git a/ts/packages/aiclient/src/copilotModels.ts b/ts/packages/aiclient/src/copilotModels.ts index 72e8ca173b..3e5bb7ec71 100644 --- a/ts/packages/aiclient/src/copilotModels.ts +++ b/ts/packages/aiclient/src/copilotModels.ts @@ -535,6 +535,12 @@ export function selectCopilotModel( const requestedModel = byId.get(requested); if (requestedModel !== undefined) return requestedModel; + const previousTier = /^gpt-6-(luna|sol)$/.exec(requested)?.[1]; + if (previousTier !== undefined) { + const previousModel = byId.get(`gpt-5.6-${previousTier}`); + if (previousModel !== undefined) return previousModel; + } + for (const fallback of fallbackModels) { const fallbackModel = byId.get(fallback); if (fallbackModel !== undefined) return fallbackModel; diff --git a/ts/packages/aiclient/src/providerMode.ts b/ts/packages/aiclient/src/providerMode.ts index eebacc7a2d..5f6fa7d885 100644 --- a/ts/packages/aiclient/src/providerMode.ts +++ b/ts/packages/aiclient/src/providerMode.ts @@ -81,13 +81,13 @@ export function usesProviderDefault(canonical: string): boolean { */ const COPILOT_MAP: Record = { DEFAULT: DEFAULT_COPILOT_MODEL, - GPT_35_TURBO: "gpt-5.6-luna", - GPT_4_O: "gpt-5.6-sol", - GPT_5: "gpt-5.6-sol", - GPT_5_MINI: "gpt-5.6-terra", - GPT_5_NANO: "gpt-5.6-luna", - GPT_5_6_LUNA: "gpt-5.6-luna", - GPT_V: "gpt-5.6-sol", + GPT_35_TURBO: "gpt-6-luna", + GPT_4_O: "gpt-6-sol", + GPT_5: "gpt-6-sol", + GPT_5_MINI: "gpt-6-luna", + GPT_5_NANO: "gpt-6-luna", + GPT_5_6_LUNA: "gpt-6-luna", + GPT_V: "gpt-6-sol", }; const OLLAMA_MAP: Record = { diff --git a/ts/packages/aiclient/test/copilotTransport.spec.ts b/ts/packages/aiclient/test/copilotTransport.spec.ts index 43dcb0c951..7b0a1d8c62 100644 --- a/ts/packages/aiclient/test/copilotTransport.spec.ts +++ b/ts/packages/aiclient/test/copilotTransport.spec.ts @@ -275,11 +275,39 @@ describe("Copilot session fallback", () => { describe("selectCopilotModel", () => { test("uses the requested model when it is available", () => { const selected = selectCopilotModel( - "gpt-5.6-luna", + "gpt-6-luna", + ["gpt-5.4-mini"], + [ + makeModel("gpt-5.4-mini"), + makeModel("gpt-5.6-luna"), + makeModel("gpt-6-luna"), + ], + ); + expect(selected?.id).toBe("gpt-6-luna"); + }); + + test.each(["luna", "sol"])( + "uses GPT-5.6 %s before generic fallbacks when GPT-6 is unavailable", + (tier) => { + const selected = selectCopilotModel( + `gpt-6-${tier}`, + ["gpt-5.4-mini"], + [makeModel("gpt-5.4-mini"), makeModel(`gpt-5.6-${tier}`)], + ); + expect(selected?.id).toBe(`gpt-5.6-${tier}`); + }, + ); + + test("skips a disabled GPT-5.6 tier fallback", () => { + const selected = selectCopilotModel( + "gpt-6-luna", ["gpt-5.4-mini"], - [makeModel("gpt-5.4-mini"), makeModel("gpt-5.6-luna")], + [ + makeModel("gpt-5.6-luna", { policy: "disabled" }), + makeModel("gpt-5.4-mini"), + ], ); - expect(selected?.id).toBe("gpt-5.6-luna"); + expect(selected?.id).toBe("gpt-5.4-mini"); }); test("uses the first configured concrete fallback", () => { diff --git a/ts/packages/aiclient/test/providerMode.spec.ts b/ts/packages/aiclient/test/providerMode.spec.ts index 9bc0058430..c3104d3405 100644 --- a/ts/packages/aiclient/test/providerMode.spec.ts +++ b/ts/packages/aiclient/test/providerMode.spec.ts @@ -39,15 +39,15 @@ describe("Copilot provider mode", () => { }); test.each([ - ["DEFAULT", "gpt-5.6-luna"], - ["GPT_35_TURBO", "gpt-5.6-luna"], - ["GPT_4_O", "gpt-5.6-sol"], - ["GPT_5", "gpt-5.6-sol"], - ["GPT_5_MINI", "gpt-5.6-terra"], - ["GPT_5_NANO", "gpt-5.6-luna"], - ["GPT_5_6_LUNA", "gpt-5.6-luna"], - ["gpt_5_6_luna", "gpt-5.6-luna"], - ["GPT_V", "gpt-5.6-sol"], + ["DEFAULT", "gpt-6-luna"], + ["GPT_35_TURBO", "gpt-6-luna"], + ["GPT_4_O", "gpt-6-sol"], + ["GPT_5", "gpt-6-sol"], + ["GPT_5_MINI", "gpt-6-luna"], + ["GPT_5_NANO", "gpt-6-luna"], + ["GPT_5_6_LUNA", "gpt-6-luna"], + ["gpt_5_6_luna", "gpt-6-luna"], + ["GPT_V", "gpt-6-sol"], ])("maps %s to %s", (canonical, expected) => { expect(resolveTarget("copilot", canonical)).toBe(expected); }); From 0592eec8182192be7b3e46d885e5e659b2c9ed06 Mon Sep 17 00:00:00 2001 From: Hillary Mutisya <150286414+hillary-mutisya@users.noreply.github.com> Date: Tue, 29 Sep 2026 18:21:38 -0700 Subject: [PATCH 2/2] Fix stale test expectation --- .../dispatcher/test/sessionModelDefaults.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ts/packages/dispatcher/dispatcher/test/sessionModelDefaults.spec.ts b/ts/packages/dispatcher/dispatcher/test/sessionModelDefaults.spec.ts index c22dce0ac5..1fb5745780 100644 --- a/ts/packages/dispatcher/dispatcher/test/sessionModelDefaults.spec.ts +++ b/ts/packages/dispatcher/dispatcher/test/sessionModelDefaults.spec.ts @@ -5,11 +5,11 @@ import { openai, resolveTarget } from "@typeagent/aiclient"; import { Session } from "../src/context/session.js"; describe("session translation model", () => { - test("defaults to GPT_5_6_LUNA and resolves to Luna in Copilot mode", async () => { + test("defaults to GPT_5_6_LUNA and resolves to GPT-6 Luna in Copilot mode", async () => { const session = await Session.create(); const model = session.getConfig().translation.model; expect(model).toBe(openai.GPT_5_6_LUNA); - expect(resolveTarget("copilot", model)).toBe("gpt-5.6-luna"); + expect(resolveTarget("copilot", model)).toBe("gpt-6-luna"); }); test("preserves an explicit model and restores Luna on reset", async () => { @@ -17,9 +17,12 @@ describe("session translation model", () => { translation: { model: "GPT_4_O" }, }); expect(session.getConfig().translation.model).toBe("GPT_4_O"); - expect(resolveTarget("copilot", "GPT_4_O")).toBe("gpt-5.6-sol"); + expect(resolveTarget("copilot", "GPT_4_O")).toBe("gpt-6-sol"); session.updateSettings({ translation: { model: null } }); expect(session.getConfig().translation.model).toBe(openai.GPT_5_6_LUNA); + expect( + resolveTarget("copilot", session.getConfig().translation.model), + ).toBe("gpt-6-luna"); }); });