import { BrainIcon, ChevronDown, DollarSign, StarsIcon, Zap, } from "lucide-react"; import { useMemo, useState } from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { ProviderType } from "@/lib/type"; import { MODELS } from "@/lib/providers"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; export function Models({ model, setModel, provider, setProvider, }: { model: string; setModel: (model: string) => void; provider: ProviderType; setProvider: (provider: ProviderType) => void; }) { const [open, setOpen] = useState(false); const formattedModels = useMemo(() => { const lists: ((typeof MODELS)[0] | { isCategory: true; name: string })[] = []; const keys = new Set(); MODELS.forEach((model) => { if (!keys.has(model.companyName)) { lists.push({ isCategory: true, name: model.companyName, logo: model.logo, }); keys.add(model.companyName); } lists.push(model); }); return lists; }, []); return (
💬
🧠
🤖

Choose your AI model

Select the AI model that best fits your needs.

Provider mode:

{( [ { value: "cheapest", icon: DollarSign, color: "emerald" }, { value: "auto", icon: BrainIcon, color: "indigo", name: "Smartest", }, { value: "fastest", icon: Zap, color: "amber" }, ] as const ).map( ({ value, icon: Icon, color, name, }: { value: string; icon: React.ElementType; color: string; name?: string; }) => (
setProvider(value)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setProvider(value); } }} className={cn( "inline-flex items-center gap-1.5 h-7 px-2.5 text-xs font-medium border border-border rounded-md cursor-pointer transition-colors select-none", "hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", provider === value && [ "bg-transparent", color === "emerald" && "[&_svg]:fill-emerald-500 [&_svg]:stroke-emerald-500 bg-emerald-500/10! border-emerald-500/10! text-emerald-500!", color === "indigo" && "[&_svg]:fill-indigo-500 [&_svg]:stroke-indigo-500 bg-indigo-500/10! border-indigo-500/10! text-indigo-500!", color === "amber" && "[&_svg]:fill-amber-500 [&_svg]:stroke-amber-500 bg-amber-500/10! border-amber-500/10! text-amber-500!", ] )} > {name ?? value.charAt(0).toUpperCase() + value.slice(1)}
) )}
); }