From bb4d978684a54368583b5899a10468abba6ab4e4 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Tue, 3 Feb 2026 15:48:40 -0600 Subject: [PATCH] feat: update tui model dialog to utilize model family to reduce noise in list --- .../cli/cmd/tui/component/dialog-model.tsx | 41 +++++++++++++++++-- packages/opencode/src/config/config.ts | 1 + packages/sdk/js/src/v2/gen/types.gen.ts | 4 ++ 3 files changed, 42 insertions(+), 4 deletions(-) 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 4ad92eeb83..c5c932ad46 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -7,6 +7,27 @@ import { useDialog } from "@tui/ui/dialog" import { createDialogProviderOptions, DialogProvider } from "./dialog-provider" import { useKeybind } from "../context/keybind" import * as fuzzysort from "fuzzysort" +import type { Provider } from "@opencode-ai/sdk/v2" + +function pickLatest(models: [string, Provider["models"][string]][]) { + const picks: Record = {} + for (const item of models) { + const model = item[0] + const info = item[1] + const key = info.family ?? model + const prev = picks[key] + if (!prev) { + picks[key] = item + continue + } + if (info.release_date !== prev[1].release_date) { + if (info.release_date > prev[1].release_date) picks[key] = item + continue + } + if (model > prev[0]) picks[key] = item + } + return Object.values(picks) +} export function useConnected() { const sync = useSync() @@ -22,6 +43,7 @@ export function DialogModel(props: { providerID?: string }) { const keybind = useKeybind() const [ref, setRef] = createSignal>() const [query, setQuery] = createSignal("") + const [all, setAll] = createSignal(false) const connected = useConnected() const providers = createDialogProviderOptions() @@ -117,12 +139,16 @@ export function DialogModel(props: { providerID?: string }) { (provider) => provider.id !== "opencode", (provider) => provider.name, ), - flatMap((provider) => - pipe( + flatMap((provider) => { + const items = pipe( provider.models, entries(), filter(([_, info]) => info.status !== "deprecated"), filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)), + ) + const list = all() ? items : pickLatest(items) + return pipe( + list, map(([model, info]) => { const value = { providerID: provider.id, @@ -168,8 +194,8 @@ export function DialogModel(props: { providerID?: string }) { (x) => x.footer !== "Free", (x) => x.title, ), - ), - ), + ) + }), ) const popularProviders = !connected() @@ -222,6 +248,13 @@ export function DialogModel(props: { providerID?: string }) { local.model.toggleFavorite(option.value as { providerID: string; modelID: string }) }, }, + { + keybind: keybind.all.model_show_all_toggle?.[0], + title: all() ? "Show latest only" : "Show all models", + onTrigger: () => { + setAll((value) => !value) + }, + }, ]} ref={setRef} onFilter={setQuery} diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index dae6db6f96..201cdd1ca0 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -732,6 +732,7 @@ export namespace Config { stash_delete: z.string().optional().default("ctrl+d").describe("Delete stash entry"), model_provider_list: z.string().optional().default("ctrl+a").describe("Open provider list from model dialog"), model_favorite_toggle: z.string().optional().default("ctrl+f").describe("Toggle model favorite status"), + model_show_all_toggle: z.string().optional().default("ctrl+o").describe("Toggle showing all models"), session_share: z.string().optional().default("none").describe("Share current session"), session_unshare: z.string().optional().default("none").describe("Unshare current session"), session_interrupt: z.string().optional().default("escape").describe("Interrupt current session"), diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 0cf70241ef..9fe76c8495 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1009,6 +1009,10 @@ export type KeybindsConfig = { * Toggle model favorite status */ model_favorite_toggle?: string + /** + * Toggle showing all models + */ + model_show_all_toggle?: string /** * Share current session */