import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { useModelProvider } from '@/hooks/useModelProvider' import { cn, getProviderLogo, getProviderTitle } from '@/lib/utils' import { useEffect, useState } from 'react' import Capabilities from './Capabilities' import { IconSettings } from '@tabler/icons-react' import { useNavigate } from '@tanstack/react-router' import { route } from '@/constants/routes' import { useThreads } from '@/hooks/useThreads' type DropdownModelProviderProps = { model?: ThreadModel } const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => { const { providers, selectModelProvider, selectedProvider, selectedModel } = useModelProvider() const [displayModel, setDisplayModel] = useState('') const { updateCurrentThreadModel } = useThreads() const navigate = useNavigate() // Initialize model provider only once useEffect(() => { // Auto select model when existing thread is passed if (model) { selectModelProvider(model?.provider as string, model?.id as string) } else { // default model, we should add from setting selectModelProvider('llama.cpp', 'llama3.2:3b') } }, [model, selectModelProvider, updateCurrentThreadModel]) // Only run when threadData changes // Update display model when selection changes useEffect(() => { if (selectedProvider && selectedModel) { setDisplayModel(selectedModel.id) } else { setDisplayModel('Select a model') } }, [selectedProvider, selectedModel]) if (!providers.length) return null return ( {providers.map((provider, index) => { // Only show active providers if (!provider.active) return null return (
{`${provider.provider} {getProviderTitle(provider.provider)}
navigate({ to: route.settings.providers, params: { providerName: provider.provider }, }) } >
{provider.models.map((model, modelIndex) => { const capabilities = model.capabilities || [] return ( { selectModelProvider(provider.provider, model.id) updateCurrentThreadModel({ id: model.id, provider: provider.provider, }) }} >
{model.id}
) })}
) })}
) } export default DropdownModelProvider