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 71a7d22b8f2..e92d6adeb89 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -38,10 +38,13 @@ export function DialogModel(props: { providerID?: string }) { const favorites = connected() ? local.model.favorite() : [] const recents = local.model.recent() + const limit = sync.data.config.tui?.recent_models_count ?? 10 const recentList = showSections - ? 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) : [] const favoriteOptions = showSections diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index 63f1d9743bf..2f1604f1b12 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -255,7 +255,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 })), @@ -275,7 +276,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 ead3a0149b4..786482dc2d3 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -770,7 +770,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 e423fecea42..6eff7a8485a 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1563,6 +1563,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 /**