diff --git a/apps/web/src/composerDraftStore.test.ts b/apps/web/src/composerDraftStore.test.ts index d92417ba96d88..e79eb5c75e00d 100644 --- a/apps/web/src/composerDraftStore.test.ts +++ b/apps/web/src/composerDraftStore.test.ts @@ -1754,6 +1754,7 @@ describe("composerDraftStore modelSelection", () => { ).toEqual( expect.objectContaining({ instanceId: CODEX_SECONDARY_INSTANCE, + model: "gpt-5-codex", options: [{ id: "reasoningEffort", value: "low" }], }), ); @@ -1770,6 +1771,19 @@ describe("composerDraftStore modelSelection", () => { options: [{ id: "reasoningEffort", value: "low" }], }), ); + expect( + useComposerDraftStore.getState().stickyOptionsByModelByProvider[CODEX_SECONDARY_INSTANCE], + ).toEqual({ "gpt-5-codex": [{ id: "reasoningEffort", value: "low" }] }); + + // A custom slug that matches a Codex alias stays exact; the picker already resolved it. + store.setModelSelection(threadRef, createModelSelection(CODEX_SECONDARY_INSTANCE, "gpt-5.3"), { + explicit: true, + replaceOptions: true, + }); + expect( + draftFor(threadId, TEST_ENVIRONMENT_ID)?.modelSelectionByProvider[CODEX_SECONDARY_INSTANCE] + ?.model, + ).toBe("gpt-5.3"); }); }); diff --git a/apps/web/src/composerDraftStore.ts b/apps/web/src/composerDraftStore.ts index 4e6dfe04a7ebb..29a589cae66ff 100644 --- a/apps/web/src/composerDraftStore.ts +++ b/apps/web/src/composerDraftStore.ts @@ -42,6 +42,7 @@ import { DeepMutable } from "effect/Types"; import { createModelSelection, draftModelPickMatchesThread, + normalizeCustomModelSlug, normalizeModelSlug, } from "@t3tools/shared/model"; import { AsyncResult, Atom, type AtomRegistry } from "effect/reactivity"; @@ -990,7 +991,11 @@ function normalizeModelSelection( const driverKindHint = normalizeProviderDriverKind(candidate?.provider ?? legacy?.provider) ?? ProviderDriverKind.make("codex"); - const model = normalizeModelSlug(rawModel, driverKindHint); + // Instance-scoped picks are already resolved slugs; a custom slug can match a static alias. + const model = + candidate?.instanceId === undefined + ? normalizeModelSlug(rawModel, driverKindHint) + : normalizeCustomModelSlug(rawModel); if (!model) { return null; } @@ -3051,7 +3056,7 @@ const composerDraftStore = create()( } const instanceKey = options?.instanceId ?? defaultInstanceIdForDriver(normalizedProvider); const fallbackModel = - normalizeModelSlug(options?.model, normalizedProvider) ?? + normalizeCustomModelSlug(options?.model) ?? DEFAULT_MODEL_BY_PROVIDER[normalizedProvider] ?? DEFAULT_MODEL; const providerOpts = @@ -3083,8 +3088,7 @@ const composerDraftStore = create()( nextStickyMap[instanceKey] ?? base.modelSelectionByProvider[instanceKey] ?? createModelSelection(instanceKey, fallbackModel); - const rememberedModel = - normalizeModelSlug(options?.model, normalizedProvider) ?? stickyBase.model; + const rememberedModel = normalizeCustomModelSlug(options?.model) ?? stickyBase.model; if (providerOpts) { nextStickyMap[instanceKey] = createModelSelection( instanceKey,