import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { Switch } from "@opencode-ai/ui/switch" import { Tooltip } from "@opencode-ai/ui/tooltip" import { Button } from "@opencode-ai/ui/button" import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2" import { Dialog as DialogV2, DialogBody, DialogHeader, DialogTitleGroup } from "@opencode-ai/ui/v2/dialog-v2" import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon" import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2" import { TextInputV2 } from "@opencode-ai/ui/v2/text-input-v2" import { Switch as SwitchV2 } from "@opencode-ai/ui/v2/switch-v2" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { useFilteredList } from "@opencode-ai/ui/hooks" import { For, Show, type Component } from "solid-js" import { useLocal } from "@/context/local" import { popularProviders } from "@/hooks/use-providers" import { useLanguage } from "@/context/language" import { useDialog } from "@opencode-ai/ui/context/dialog" import { DialogConnectProvider } from "./dialog-connect-provider" import { decode64 } from "@/utils/base64" import { SettingsListV2 } from "./settings-v2/parts/list" import { SettingsRowV2 } from "./settings-v2/parts/row" import "./settings-v2/settings-v2.css" type ModelItem = ReturnType["model"]["list"]>[number] export const DialogManageModels: Component = () => { const local = useLocal() const language = useLanguage() const dialog = useDialog() const directory = () => decode64(local.slug()) const handleConnectProvider = () => { void dialog.show(() => ) } const providerRank = (id: string) => popularProviders.indexOf(id) const providerList = (providerID: string) => local.model.list().filter((x) => x.provider.id === providerID) const providerVisible = (providerID: string) => providerList(providerID).every((x) => local.model.visible({ modelID: x.id, providerID: x.provider.id })) const setProviderVisibility = (providerID: string, checked: boolean) => { providerList(providerID).forEach((x) => { local.model.setVisibility({ modelID: x.id, providerID: x.provider.id }, checked) }) } return ( {language.t("command.provider.connect")} } > `${x?.provider?.id}:${x?.id}`} items={local.model.list()} filterKeys={["provider.name", "name", "id"]} sortBy={(a, b) => a.name.localeCompare(b.name)} groupBy={(x) => x.provider.id} groupHeader={(group) => { const provider = group.items[0].provider return ( <> {provider.name} setProviderVisibility(provider.id, checked)} hideLabel > {provider.name} ) }} sortGroupsBy={(a, b) => { const aRank = providerRank(a.items[0].provider.id) const bRank = providerRank(b.items[0].provider.id) const aPopular = aRank >= 0 const bPopular = bRank >= 0 if (aPopular && !bPopular) return -1 if (!aPopular && bPopular) return 1 return aRank - bRank }} onSelect={(x) => { if (!x) return const key = { modelID: x.id, providerID: x.provider.id } local.model.setVisibility(key, !local.model.visible(key)) }} > {(i) => (
{i.name}
e.stopPropagation()}> { local.model.setVisibility({ modelID: i.id, providerID: i.provider.id }, checked) }} />
)}
) } export const DialogManageModelsV2: Component = () => { const local = useLocal() const language = useLanguage() const dialog = useDialog() const directory = () => decode64(local.slug()) const handleConnectProvider = () => { void dialog.show(() => ) } const providerList = (providerID: string) => local.model.list().filter((x) => x.provider.id === providerID) const providerVisible = (providerID: string) => providerList(providerID).every((x) => local.model.visible({ modelID: x.id, providerID: x.provider.id })) const setProviderVisibility = (providerID: string, checked: boolean) => { providerList(providerID).forEach((x) => { local.model.setVisibility({ modelID: x.id, providerID: x.provider.id }, checked) }) } const setModelVisibility = (item: ModelItem, checked: boolean) => { local.model.setVisibility({ modelID: item.id, providerID: item.provider.id }, checked) } const list = useFilteredList({ items: () => local.model.list(), key: (x) => `${x.provider.id}:${x.id}`, filterKeys: ["provider.name", "name", "id"], sortBy: (a, b) => a.name.localeCompare(b.name), groupBy: (x) => x.provider.id, sortGroupsBy: (a, b) => { const aRank = popularProviders.indexOf(a.category) const bRank = popularProviders.indexOf(b.category) const aPopular = aRank >= 0 const bPopular = bRank >= 0 if (aPopular && !bPopular) return -1 if (!aPopular && bPopular) return 1 return aRank - bRank }, }) return ( {language.t("command.provider.connect")}
list.onInput(event.currentTarget.value)} placeholder={language.t("dialog.model.search.placeholder")} spellcheck={false} autocorrect="off" autocomplete="off" autocapitalize="off" autofocus aria-label={language.t("dialog.model.search.placeholder")} /> } onClick={() => list.clear()} aria-label={language.t("common.clear")} />
{language.t("common.loading")} {language.t("common.loading.ellipsis")}
} > 0} fallback={
{language.t("dialog.model.empty")} "{list.filter()}"
} > {(group) => (

{group.items[0].provider.name}

setProviderVisibility(group.category, checked)} hideLabel > {group.items[0].provider.name}
{(item) => (
setModelVisibility(item, checked)} hideLabel > {item.name}
)}
)}
) }