diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx index c30b8d12a933..fb7bfe9076ce 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -59,10 +59,14 @@ export function DialogModel(props: { providerID?: string }) { } const favoriteOptions = toOptions(favorites, "Favorites") + + const limit = sync.data.config.tui?.recent_models_count ?? 10 const recentOptions = toOptions( - recents.filter( - (item) => !favorites.some((fav) => fav.providerID === item.providerID && fav.modelID === item.modelID), - ), + recents + .filter( + (item) => !favorites.some((fav) => fav.providerID === item.providerID && fav.modelID === item.modelID), + ) + .slice(0, limit), "Recent", ) diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index d93079f12a42..3cf451449c17 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -268,7 +268,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ if (!next) return setModelStore("model", agent.current().name, { ...next }) const uniq = uniqueBy([next, ...modelStore.recent], (x) => `${x.providerID}/${x.modelID}`) - if (uniq.length > 10) uniq.pop() + const limit = sync.data.config.tui?.recent_models_count ?? 10 + if (uniq.length > limit) uniq.pop() setModelStore( "recent", uniq.map((x) => ({ providerID: x.providerID, modelID: x.modelID })), @@ -288,7 +289,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ setModelStore("model", agent.current().name, model) if (options?.recent) { const uniq = uniqueBy([model, ...modelStore.recent], (x) => `${x.providerID}/${x.modelID}`) - if (uniq.length > 10) uniq.pop() + const limit = sync.data.config.tui?.recent_models_count ?? 10 + if (uniq.length > limit) uniq.pop() setModelStore( "recent", uniq.map((x) => ({ providerID: x.providerID, modelID: x.modelID })), diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index aad0fd76c4be..5c1c5bda2a14 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -941,7 +941,16 @@ export namespace Config { .enum(["auto", "stacked"]) .optional() .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), + recent_models_count: z + .number() + .int() + .min(1) + .max(50) + .optional() + .default(10) + .describe("Number of recent models to store and display in model selection"), }) + export type TUI = z.infer export const Server = z .object({ diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 4050ef15738c..85d0bbe7b96f 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1699,6 +1699,10 @@ export type Config = { * Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column */ diff_style?: "auto" | "stacked" + /** + * Number of recent models to store and display in model selection + */ + recent_models_count?: number } server?: ServerConfig /**