"use client"; import { appStore } from "@/app/store"; import { useChatModels } from "@/hooks/queries/use-chat-models"; import { ChatModel } from "app-types/chat"; import { cn } from "lib/utils"; import { CheckIcon, ChevronDown } from "lucide-react"; import { Fragment, memo, PropsWithChildren, useEffect, useState } from "react"; import { Button } from "ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from "ui/command"; import { ModelProviderIcon } from "ui/model-provider-icon"; import { Popover, PopoverContent, PopoverTrigger } from "ui/popover"; interface SelectModelProps { onSelect: (model: ChatModel) => void; align?: "start" | "end"; currentModel?: ChatModel; showProvider?: boolean; } export const SelectModel = (props: PropsWithChildren) => { const [open, setOpen] = useState(false); const { data: providers } = useChatModels(); const [model, setModel] = useState(props.currentModel); useEffect(() => { const modelToUse = props.currentModel ?? appStore.getState().chatModel; if (modelToUse) { setModel(modelToUse); } }, [props.currentModel]); return ( {props.children || ( )} e.stopPropagation()} > No results found. {providers?.map((provider, i) => ( } className={cn( "pb-4 group", !provider.hasAPIKey && "opacity-50", )} onWheel={(e) => { e.stopPropagation(); }} data-testid={`model-provider-${provider.provider}`} > {provider.models.map((item) => ( { setModel({ provider: provider.provider, model: item.name, }); props.onSelect({ provider: provider.provider, model: item.name, }); setOpen(false); }} value={item.name} data-testid={`model-option-${provider.provider}-${item.name}`} > {model?.provider === provider.provider && model?.model === item.name ? ( ) : (
)} {item.name} {item.isToolCallUnsupported && (
No tools
)} ))} {i < providers?.length - 1 && } ))} ); }; const ProviderHeader = memo(function ProviderHeader({ provider, hasAPIKey, }: { provider: string; hasAPIKey: boolean }) { return (
{provider === "openai" ? ( ) : ( )} {provider} {!hasAPIKey && ( <> No API Key )}
); });