feat: update tui model dialog to utilize model family to reduce noise in list
This commit is contained in:
parent
185858749b
commit
bb4d978684
3 changed files with 42 additions and 4 deletions
|
|
@ -7,6 +7,27 @@ import { useDialog } from "@tui/ui/dialog"
|
||||||
import { createDialogProviderOptions, DialogProvider } from "./dialog-provider"
|
import { createDialogProviderOptions, DialogProvider } from "./dialog-provider"
|
||||||
import { useKeybind } from "../context/keybind"
|
import { useKeybind } from "../context/keybind"
|
||||||
import * as fuzzysort from "fuzzysort"
|
import * as fuzzysort from "fuzzysort"
|
||||||
|
import type { Provider } from "@opencode-ai/sdk/v2"
|
||||||
|
|
||||||
|
function pickLatest(models: [string, Provider["models"][string]][]) {
|
||||||
|
const picks: Record<string, [string, Provider["models"][string]]> = {}
|
||||||
|
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() {
|
export function useConnected() {
|
||||||
const sync = useSync()
|
const sync = useSync()
|
||||||
|
|
@ -22,6 +43,7 @@ export function DialogModel(props: { providerID?: string }) {
|
||||||
const keybind = useKeybind()
|
const keybind = useKeybind()
|
||||||
const [ref, setRef] = createSignal<DialogSelectRef<unknown>>()
|
const [ref, setRef] = createSignal<DialogSelectRef<unknown>>()
|
||||||
const [query, setQuery] = createSignal("")
|
const [query, setQuery] = createSignal("")
|
||||||
|
const [all, setAll] = createSignal(false)
|
||||||
|
|
||||||
const connected = useConnected()
|
const connected = useConnected()
|
||||||
const providers = createDialogProviderOptions()
|
const providers = createDialogProviderOptions()
|
||||||
|
|
@ -117,12 +139,16 @@ export function DialogModel(props: { providerID?: string }) {
|
||||||
(provider) => provider.id !== "opencode",
|
(provider) => provider.id !== "opencode",
|
||||||
(provider) => provider.name,
|
(provider) => provider.name,
|
||||||
),
|
),
|
||||||
flatMap((provider) =>
|
flatMap((provider) => {
|
||||||
pipe(
|
const items = pipe(
|
||||||
provider.models,
|
provider.models,
|
||||||
entries(),
|
entries(),
|
||||||
filter(([_, info]) => info.status !== "deprecated"),
|
filter(([_, info]) => info.status !== "deprecated"),
|
||||||
filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)),
|
filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)),
|
||||||
|
)
|
||||||
|
const list = all() ? items : pickLatest(items)
|
||||||
|
return pipe(
|
||||||
|
list,
|
||||||
map(([model, info]) => {
|
map(([model, info]) => {
|
||||||
const value = {
|
const value = {
|
||||||
providerID: provider.id,
|
providerID: provider.id,
|
||||||
|
|
@ -168,8 +194,8 @@ export function DialogModel(props: { providerID?: string }) {
|
||||||
(x) => x.footer !== "Free",
|
(x) => x.footer !== "Free",
|
||||||
(x) => x.title,
|
(x) => x.title,
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
const popularProviders = !connected()
|
const popularProviders = !connected()
|
||||||
|
|
@ -222,6 +248,13 @@ export function DialogModel(props: { providerID?: string }) {
|
||||||
local.model.toggleFavorite(option.value as { providerID: string; modelID: 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}
|
ref={setRef}
|
||||||
onFilter={setQuery}
|
onFilter={setQuery}
|
||||||
|
|
|
||||||
|
|
@ -732,6 +732,7 @@ export namespace Config {
|
||||||
stash_delete: z.string().optional().default("ctrl+d").describe("Delete stash entry"),
|
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_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_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_share: z.string().optional().default("none").describe("Share current session"),
|
||||||
session_unshare: z.string().optional().default("none").describe("Unshare current session"),
|
session_unshare: z.string().optional().default("none").describe("Unshare current session"),
|
||||||
session_interrupt: z.string().optional().default("escape").describe("Interrupt current session"),
|
session_interrupt: z.string().optional().default("escape").describe("Interrupt current session"),
|
||||||
|
|
|
||||||
|
|
@ -1009,6 +1009,10 @@ export type KeybindsConfig = {
|
||||||
* Toggle model favorite status
|
* Toggle model favorite status
|
||||||
*/
|
*/
|
||||||
model_favorite_toggle?: string
|
model_favorite_toggle?: string
|
||||||
|
/**
|
||||||
|
* Toggle showing all models
|
||||||
|
*/
|
||||||
|
model_show_all_toggle?: string
|
||||||
/**
|
/**
|
||||||
* Share current session
|
* Share current session
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue