"use client"; import classNames from "classnames"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { PROVIDERS, MODELS } from "@/lib/providers"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useMemo, useState, useEffect } from "react"; import { useUpdateEffect } from "react-use"; import Image from "next/image"; import { Brain, BrainIcon, CheckCheck, ChevronDown } from "lucide-react"; import { useAi } from "@/hooks/useAi"; import { getProviders } from "@/lib/get-providers"; import Loading from "@/components/loading"; export function Settings({ open, onClose, error, isFollowUp = false, }: { open: boolean; error?: string; isFollowUp?: boolean; onClose: React.Dispatch>; }) { const { model, provider, setProvider, setModel, selectedModel, globalAiLoading, } = useAi(); const [isMounted, setIsMounted] = useState(false); const [loadingProviders, setLoadingProviders] = useState(false); useEffect(() => { setIsMounted(true); }, []); // const modelAvailableProviders = useMemo(() => { // const availableProviders = MODELS.find( // (m: { value: string }) => m.value === model // )?.providers; // if (!availableProviders) return Object.keys(PROVIDERS); // return Object.keys(PROVIDERS).filter((id) => // availableProviders.includes(id) // ); // }, [model]); useUpdateEffect(() => { if (provider !== "auto" && !providers.includes(provider as string)) { setProvider("auto"); } }, [model, provider]); 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; }, [MODELS]); const [providers, setProviders] = useState([]); const [failedImages, setFailedImages] = useState>(new Set()); useEffect(() => { const loadProviders = async () => { setLoadingProviders(true); if (!model) { setProviders([]); return; } try { const result = await getProviders(model); setProviders(result); } catch (error) { console.error("Failed to load providers:", error); setProviders([]); } finally { setLoadingProviders(false); } }; loadProviders(); }, [model]); const handleImageError = (providerId: string) => { setFailedImages((prev) => new Set([...prev, providerId])); }; return (
Customize Settings
{error !== "" && (

{error}

)} {/* {isFollowUp && (
Note: You can't use a Thinker model for follow-up requests. We automatically switch to the default model for you.
)} */}

Use auto-provider

We'll automatically select the best provider for you based on your prompt.

{ const foundModel = MODELS.find( (m: { value: string }) => m.value === model ); if (provider === "auto" && foundModel?.autoProvider) { setProvider(foundModel.autoProvider); } else { setProvider("auto"); } }} >
); }