diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx
index 535bd72064e2..4c94e8aa674f 100644
--- a/packages/app/src/components/settings-general.tsx
+++ b/packages/app/src/components/settings-general.tsx
@@ -386,6 +386,30 @@ export const SettingsGeneral: Component = () => {
/>
+
+
+
+ settings.general.setPersistModelPerAgent(checked)}
+ />
+
+
+
+
+
+ settings.general.setPersistModelAcrossSessions(checked)}
+ />
+
+
)
@@ -729,7 +753,6 @@ export const SettingsGeneral: Component = () => {
)
- console.log(import.meta.env)
return (
diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx
index 4465a0261dd0..8056973f4a5c 100644
--- a/packages/app/src/context/local.tsx
+++ b/packages/app/src/context/local.tsx
@@ -9,6 +9,7 @@ import { Persist, persisted } from "@/utils/persist"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
import { useSDK } from "./sdk"
import { useSync } from "./sync"
+import { useSettings } from "@/context/settings"
export type ModelKey = { providerID: string; modelID: string; variant?: string }
@@ -20,6 +21,7 @@ type State = {
type Saved = {
session: Record
+ agent: Record
}
const WORKSPACE_KEY = "__workspace__"
@@ -59,6 +61,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const sync = useSync()
const providers = useProviders()
const models = useModels()
+ const settings = useSettings()
const id = createMemo(() => params.id || undefined)
const list = createMemo(() => sync.data.agent.filter((item) => item.mode !== "subagent" && !item.hidden))
@@ -71,6 +74,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
},
createStore({
session: {},
+ agent: {},
}),
)
@@ -192,6 +196,11 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
variant: item.variant ?? null,
})
const prev = scope()
+ if (settings.general.persistModelPerAgent()) {
+ if (prev?.agent) {
+ setSaved("agent", prev.agent, clone(prev))
+ }
+ }
const next = {
agent: item.name,
model: item.model ?? prev?.model,
@@ -222,9 +231,11 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
}
const current = () => {
+ const a = agent.current()
const item = firstModel(
+ () => settings.general.persistModelPerAgent() && a ? saved.agent[a.name]?.model : undefined,
() => scope()?.model,
- () => agent.current()?.model,
+ () => a?.model,
fallback,
)
if (!item) return
@@ -241,7 +252,15 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})
}
- const selected = () => scope()?.variant
+ const selected = () => {
+ if (settings.general.persistModelPerAgent()) {
+ const a = agent.current()
+ if (a?.name && saved.agent[a.name]) {
+ return saved.agent[a.name]!.variant
+ }
+ }
+ return scope()?.variant
+ }
const snapshot = () => {
const model = current()
@@ -258,9 +277,19 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
...next,
} satisfies State
+ if (settings.general.persistModelPerAgent() && state.agent) {
+ setSaved("agent", state.agent, {
+ agent: state.agent,
+ model: state.model,
+ variant: state.variant ?? null,
+ })
+ }
+
const session = id()
if (session) {
- setSaved("session", session, state)
+ if (settings.general.persistModelAcrossSessions()) {
+ setSaved("session", session, state)
+ }
return
}
setStore("draft", state)
@@ -371,6 +400,10 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const next = clone(snapshot())
if (!next) return
+ if (settings.general.persistModelPerAgent() && next.agent) {
+ setSaved("agent", next.agent, next)
+ }
+
if (dir === sdk.directory) {
setSaved("session", session, next)
setStore("draft", undefined)
@@ -387,11 +420,15 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
if (saved.session[session] !== undefined) return
if (handoff.has(handoffKey(sdk.directory, session))) return
- setSaved("session", session, {
+ const state = {
agent: msg.agent,
model: msg.model,
variant: msg.model?.variant ?? null,
- })
+ }
+ if (settings.general.persistModelPerAgent() && msg.agent) {
+ setSaved("agent", msg.agent, state)
+ }
+ setSaved("session", session, state)
},
},
}
diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx
index be2fb49d7e0c..972927ea95e0 100644
--- a/packages/app/src/context/settings.tsx
+++ b/packages/app/src/context/settings.tsx
@@ -32,6 +32,8 @@ export interface Settings {
shellToolPartsExpanded: boolean
editToolPartsExpanded: boolean
showSessionProgressBar: boolean
+ persistModelPerAgent: boolean
+ persistModelAcrossSessions: boolean
}
updates: {
startup: boolean
@@ -117,6 +119,8 @@ const defaultSettings: Settings = {
shellToolPartsExpanded: false,
editToolPartsExpanded: false,
showSessionProgressBar: true,
+ persistModelPerAgent: false,
+ persistModelAcrossSessions: true,
},
updates: {
startup: true,
@@ -236,6 +240,20 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
setShowSessionProgressBar(value: boolean) {
setStore("general", "showSessionProgressBar", value)
},
+ persistModelPerAgent: withFallback(
+ () => store.general?.persistModelPerAgent,
+ defaultSettings.general.persistModelPerAgent,
+ ),
+ setPersistModelPerAgent(value: boolean) {
+ setStore("general", "persistModelPerAgent", value)
+ },
+ persistModelAcrossSessions: withFallback(
+ () => store.general?.persistModelAcrossSessions,
+ defaultSettings.general.persistModelAcrossSessions,
+ ),
+ setPersistModelAcrossSessions(value: boolean) {
+ setStore("general", "persistModelAcrossSessions", value)
+ },
},
updates: {
startup: withFallback(() => store.updates?.startup, defaultSettings.updates.startup),
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 6bb9d3fc447d..c082b0d09062 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -775,6 +775,13 @@ export const dict = {
"settings.general.row.showSessionProgressBar.description":
"Display the animated progress bar at the top of the session when the agent is working",
+ "settings.general.row.persistModelPerAgent.title": "Persist model per agent",
+ "settings.general.row.persistModelPerAgent.description":
+ "Remember the selected model for each agent when switching between them",
+ "settings.general.row.persistModelAcrossSessions.title": "Persist model across sessions",
+ "settings.general.row.persistModelAcrossSessions.description":
+ "Keep the selected model when moving between sessions",
+
"settings.general.row.wayland.title": "Use native Wayland",
"settings.general.row.wayland.description": "Disable X11 fallback on Wayland. Requires restart.",
"settings.general.row.wayland.tooltip":