import { PiGearSixFill } from "react-icons/pi"; import { useState, useEffect } from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { PROVIDERS, MODELS } from "@/lib/providers"; import { Button } from "@/components/ui/button"; import { useMemo } from "react"; import { useUpdateEffect } from "react-use"; import { Input } from "@/components/ui/input"; import { toast } from "sonner"; export function Settings({ open, onClose, provider, model, error, onChange, }: { open: boolean; provider: string; model: string; error?: string; isFollowUp?: boolean; onClose: React.Dispatch>; onChange: (provider: string) => void; onModelChange: (model: string) => void; }) { const [apiKey, setApiKey] = useState(""); const [baseUrl, setBaseUrl] = useState(""); const [customModel, setCustomModel] = useState(""); useEffect(() => { setApiKey(localStorage.getItem("openai_api_key") || ""); setBaseUrl(localStorage.getItem("openai_base_url") || ""); setCustomModel(localStorage.getItem("openai_model") || ""); }, [open]); 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" && !modelAvailableProviders.includes(provider)) { onChange("auto"); } }, [model, provider]); const handleSaveSettings = () => { localStorage.setItem("openai_api_key", apiKey); localStorage.setItem("openai_base_url", baseUrl); localStorage.setItem("openai_model", customModel); toast.success("Settings saved!"); onClose(false); }; return (
Customize Settings
{error !== "" && (

{error}

)}
Accepts any OpenAI-compatible provider. Enter the corresponding API key and base URL (e.g., OpenRouter, DeepSeek, etc.).
); }