import { useFilteredList } from "@opencode-ai/ui/hooks" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { Switch } from "@opencode-ai/ui/switch" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { TextField } from "@opencode-ai/ui/text-field" import type { IconName } from "@opencode-ai/ui/icons/provider" import { type Component, For, Show } from "solid-js" import { useLanguage } from "@/context/language" import { type ModelKey, useLocal } from "@/context/local" import { popularProviders } from "@/hooks/use-providers" type ModelItem = ReturnType["model"]["list"]>[number] export const SettingsModels: Component = () => { const local = useLocal() const language = useLanguage() const list = useFilteredList({ items: (_filter) => 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 aIndex = popularProviders.indexOf(a.category) const bIndex = popularProviders.indexOf(b.category) const aPopular = aIndex >= 0 const bPopular = bIndex >= 0 if (aPopular && !bPopular) return -1 if (!aPopular && bPopular) return 1 if (aPopular && bPopular) return aIndex - bIndex const aName = a.items[0].provider.name const bName = b.items[0].provider.name return aName.localeCompare(bName) }, }) return (

{language.t("settings.models.title")}

{language.t("common.loading")} {language.t("common.loading.ellipsis")}
} > 0} fallback={
{language.t("dialog.model.empty")} "{list.filter()}"
} > {(group) => (
{group.items[0].provider.name}
{(item) => { const key: ModelKey = { providerID: item.provider.id, modelID: item.id } return (
{item.name}
{ local.model.setVisibility(key, checked) }} hideLabel > {item.name}
) }}
)}
) }