| import React from "react"; | |
| import { Button } from "@/components/ui/button"; | |
| import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; | |
| import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; | |
| import { Badge } from "@/components/ui/badge"; | |
| import { Check, Info } from "lucide-react"; | |
| import { CHAT_MODELS } from "@/lib/config/types"; | |
| interface ModelSelectorProps { | |
| selectedModel: string; | |
| selectedModelName: string; | |
| enabledChatModels: string[] | undefined; | |
| onModelChange: (model: string) => void; | |
| } | |
| export const ModelSelector = React.memo(({ | |
| selectedModel, | |
| selectedModelName, | |
| enabledChatModels, | |
| onModelChange | |
| }: ModelSelectorProps) => ( | |
| <DropdownMenu> | |
| <DropdownMenuTrigger asChild> | |
| <Button | |
| variant="ghost" | |
| className="w-[200px] h-8 p-1 justify-start font-normal truncate" | |
| > | |
| <span className="truncate">{selectedModelName}</span> | |
| </Button> | |
| </DropdownMenuTrigger> | |
| <DropdownMenuContent className="w-[400px]"> | |
| {CHAT_MODELS | |
| .filter((model) => enabledChatModels?.includes(model.model)) | |
| .map((model) => ( | |
| <TooltipProvider key={model.model}> | |
| <Tooltip> | |
| <TooltipTrigger asChild> | |
| <DropdownMenuItem | |
| className="p-4" | |
| onSelect={() => onModelChange(model.model)} | |
| > | |
| <div className="flex items-center gap-2 w-full"> | |
| {model.model === selectedModel && ( | |
| <Check className="h-4 w-4 shrink-0" /> | |
| )} | |
| <span className="flex-grow">{model.name}</span> | |
| <Info className="h-4 w-4 text-muted-foreground shrink-0" /> | |
| </div> | |
| </DropdownMenuItem> | |
| </TooltipTrigger> | |
| <TooltipContent side="right" align="start" className="max-w-[300px]"> | |
| <p>{model.description}</p> | |
| {model.modalities && model.modalities.length > 0 && ( | |
| <div className="flex gap-1 flex-wrap mt-1"> | |
| {model.modalities.map((modality) => ( | |
| <Badge key={modality} variant="secondary" className="capitalize text-xs"> | |
| {modality.toLowerCase()} | |
| </Badge> | |
| ))} | |
| </div> | |
| )} | |
| </TooltipContent> | |
| </Tooltip> | |
| </TooltipProvider> | |
| ))} | |
| </DropdownMenuContent> | |
| </DropdownMenu> | |
| )); | |
| ModelSelector.displayName = "ModelSelector"; |