diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index 75d1334a5a5..14468d3587a 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -6,6 +6,7 @@ import { useSync } from "./sync" import { base64Encode } from "@opencode-ai/util/encode" import { useProviders } from "@/hooks/use-providers" import { useModels } from "@/context/models" +import { Persist, persisted } from "@/utils/persist" import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant" export type ModelKey = { providerID: string; modelID: string } @@ -93,11 +94,14 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const model = (() => { const models = useModels() - const [ephemeral, setEphemeral] = createStore<{ - model: Record - }>({ - model: {}, - }) + const [store, setStore] = persisted( + Persist.workspace(sdk.directory, "local-model"), + createStore<{ + model: Record + }>({ + model: {}, + }), + ) const resolveConfigured = () => { if (!sync.data.config.model) return @@ -136,7 +140,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ const a = agent.current() if (!a) return undefined const key = getFirstValidModel( - () => ephemeral.model[a.name], + () => store.model[a.name], () => a.model, fallbackModel, ) @@ -173,7 +177,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ batch(() => { const currentAgent = agent.current() const next = model ?? fallbackModel() - if (currentAgent) setEphemeral("model", currentAgent.name, next) + if (currentAgent) setStore("model", currentAgent.name, next) if (model) models.setVisibility(model, true) if (options?.recent && model) models.recent.push(model) }) diff --git a/packages/app/src/pages/session/session-model-helpers.test.ts b/packages/app/src/pages/session/session-model-helpers.test.ts index 5f554dcd36a..3bffda74f9a 100644 --- a/packages/app/src/pages/session/session-model-helpers.test.ts +++ b/packages/app/src/pages/session/session-model-helpers.test.ts @@ -89,6 +89,37 @@ describe("syncSessionModel", () => { }) describe("resetSessionModel", () => { + test("keeps the current model selection for new sessions", () => { + const calls: unknown[] = [] + + resetSessionModel({ + agent: { + current() { + return { + model: { providerID: "anthropic", modelID: "claude-sonnet-4" }, + variant: "high", + } + }, + set() {}, + }, + model: { + set(value) { + calls.push(["model", value]) + }, + current() { + return { id: "gpt-5", provider: { id: "openai" } } + }, + variant: { + set(value) { + calls.push(["variant", value]) + }, + }, + }, + }) + + expect(calls).toEqual([]) + }) + test("restores the current agent defaults", () => { const calls: unknown[] = [] diff --git a/packages/app/src/pages/session/session-model-helpers.ts b/packages/app/src/pages/session/session-model-helpers.ts index 7600f16d5c7..e7ee3d525d3 100644 --- a/packages/app/src/pages/session/session-model-helpers.ts +++ b/packages/app/src/pages/session/session-model-helpers.ts @@ -26,6 +26,7 @@ type Local = { } export const resetSessionModel = (local: Local) => { + if (local.model.current()) return const agent = local.agent.current() if (!agent) return batch(() => {