"use client"; import { MODELS, modelDetails, type modelID, defaultModel } from "@/ai/providers"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "./ui/select"; import { cn } from "@/lib/utils"; import { Sparkles, Zap, Info, Bolt, Code, Brain, Lightbulb, Image, Gauge, Rocket, Bot } from "lucide-react"; import { useState, useEffect } from "react"; import { TextMorph } from "./ui/text-morph"; interface ModelPickerProps { selectedModel: modelID; setSelectedModel: (model: modelID) => void; } export const ModelPicker = ({ selectedModel, setSelectedModel }: ModelPickerProps) => { const [hoveredModel, setHoveredModel] = useState(null); // Ensure we always have a valid model ID const validModelId = MODELS.includes(selectedModel) ? selectedModel : defaultModel; // If the selected model is invalid, update it to the default useEffect(() => { if (selectedModel !== validModelId) { setSelectedModel(validModelId as modelID); } }, [selectedModel, validModelId, setSelectedModel]); // Function to get the appropriate icon for each provider const getProviderIcon = (provider: string) => { switch (provider.toLowerCase()) { case 'xai': return ; case 'openai': return ; default: return ; } }; // Function to get capability icon const getCapabilityIcon = (capability: string) => { switch (capability.toLowerCase()) { case 'code': return ; case 'reasoning': return ; case 'research': return ; case 'vision': return ; case 'fast': case 'rapid': return ; case 'efficient': case 'compact': return ; case 'creative': case 'balance': return ; case 'agentic': return ; default: return ; } }; // Get capability badge color const getCapabilityColor = (capability: string) => { switch (capability.toLowerCase()) { case 'code': return "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"; case 'reasoning': case 'research': return "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300"; case 'vision': return "bg-indigo-100 text-indigo-800 dark:bg-indigo-900/30 dark:text-indigo-300"; case 'fast': case 'rapid': return "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300"; case 'efficient': case 'compact': return "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-300"; case 'creative': case 'balance': return "bg-rose-100 text-rose-800 dark:bg-rose-900/30 dark:text-rose-300"; case 'agentic': return "bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-300"; default: return "bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300"; } }; // Get current model details to display const displayModelId = hoveredModel || validModelId; const currentModelDetails = modelDetails[displayModelId]; // Handle model change const handleModelChange = (modelId: string) => { if (MODELS.includes(modelId)) { const typedModelId = modelId as modelID; setSelectedModel(typedModelId); } }; return (
); };