Model Selector

A searchable dialog for picking an AI model — grouped by chef, with provider logos and a compact trigger.

Default

Searchable dialog of models grouped by provider, with chef and host logos.

Loading…

Installation

CLI
npx @sonojs/ui@latest add model-selector
Also needsnpx @sonojs/ui@latest add command dialog && npm i lucide-react

Usage

model-selector.tsx
import { useState } from "react"
import { Button } from "@/components/ui/button"
import {
  ModelSelector,
  ModelSelectorContent,
  ModelSelectorInput,
  ModelSelectorList,
  ModelSelectorEmpty,
  ModelSelectorGroup,
  ModelSelectorItem,
  ModelSelectorLogo,
  ModelSelectorName,
  ModelSelectorTrigger,
} from "@/components/sonojs/model-selector"

export function Example() {
  const [open, setOpen] = useState(false)
  const [selected, setSelected] = useState("gpt-4o")

  return (
    <ModelSelector open={open} onOpenChange={setOpen}>
      <ModelSelectorTrigger asChild>
        <Button variant="outline" className="w-[200px] justify-between">
          <ModelSelectorLogo provider="openai" />
          <ModelSelectorName>GPT-4o</ModelSelectorName>
        </Button>
      </ModelSelectorTrigger>
      <ModelSelectorContent>
        <ModelSelectorInput placeholder="Search models..." />
        <ModelSelectorList>
          <ModelSelectorEmpty>No models found.</ModelSelectorEmpty>
          <ModelSelectorGroup heading="OpenAI">
            <ModelSelectorItem
              value="gpt-4o"
              onSelect={() => {
                setSelected("gpt-4o")
                setOpen(false)
              }}
            >
              <ModelSelectorLogo provider="openai" />
              <ModelSelectorName>GPT-4o</ModelSelectorName>
            </ModelSelectorItem>
          </ModelSelectorGroup>
        </ModelSelectorList>
      </ModelSelectorContent>
    </ModelSelector>
  )
}

Props

PropTypeDefaultDescription
ModelSelectorDialog props—`open` / `onOpenChange` and other Dialog root props.
ModelSelectorTriggerDialogTrigger props—Usually `asChild` wrapping a Button.
ModelSelectorContentDialogContent + title?title="Model Selector"Dialog shell with Command inside. `title` is screen-reader only.
ModelSelectorInputCommandInput props—Search field for filtering models.
ModelSelectorList / Group / Item / EmptyCommand* props—List chrome — same API as Command.
ModelSelectorLogo{ provider: string }—12×12 logo from `models.dev/logos/{provider}.svg`.
ModelSelectorLogoGroupdiv props—Overlapping host provider logos.
ModelSelectorNamespan props—Truncated model label.