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 bc90dbb5c6e..3c2c6913f52 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -36,10 +36,13 @@ export function DialogModel(props: { providerID?: string }) { const favorites = showExtra() ? local.model.favorite() : [] const recents = local.model.recent() + const limit = sync.data.config.tui?.recent_models_count ?? 10 const recentList = showExtra() - ? 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 = favorites.flatMap((item) => { diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index 55c04621ef3..005c58f8f5a 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -266,7 +266,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) save() }, @@ -283,7 +284,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) save() } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 0132bb91daf..c48c00eb1af 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -597,7 +597,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 5c4cc69423d..d2a5121bf4f 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1433,6 +1433,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 /**