import { useState } from "react"; import { PROVIDERS, PROVIDERS_CONN_ARGS_MAP } from "@/lib/config/types"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; import { AlertCircle, CheckCircle2, ChevronDown } from "lucide-react"; import { useUpdateConfig, useDebounceCallback } from "../hooks"; import { ProvidersProps } from "../types"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Button } from "@/components/ui/button"; import { toast } from "sonner"; export const Providers = ({ config }: ProvidersProps) => { const updateConfig = useUpdateConfig(); const [localValues, setLocalValues] = useState>({}); const [openCollapsible, setOpenCollapsible] = useState(false); const debouncedUpdateConfig = useDebounceCallback((updates: Record) => { updateConfig.mutate(updates); }, 500); if (!config) return null; const handleHuggingFaceOAuth = () => { const clientId = import.meta.env.VITE_HF_CLIENT_ID; const redirectUri = import.meta.env.VITE_HF_REDIRECT_URI; if (!clientId || !redirectUri) { toast.error("HuggingFace OAuth configuration is missing"); return; } const state = Math.random().toString(36).substring(2); const authUrl = `https://huggingface.co/oauth/authorize?client_id=${clientId}&redirect_uri=${redirectUri}&response_type=code&scope=openid%20inference-api&prompt=consent&state=${state}`; window.location.href = authUrl; }; return ( Providers Configure your AI provider credentials {Object.values(PROVIDERS).map((provider) => (

{provider}

{provider === PROVIDERS.ollama && (
{!config.ollama_base_url || config.ollama_base_url.trim() === '' ? ( Not Configured ) : config.ollama_available ? ( Connected ) : ( Not Connected )}
)} {provider === PROVIDERS.huggingface && config?.hf_token && ( Connected )}
{provider === PROVIDERS.openai ? ( <> {/* Required OpenAI fields */} {PROVIDERS_CONN_ARGS_MAP[provider] .filter(arg => arg === 'openai_api_key') .map((arg) => { const value = localValues[arg] ?? config[arg as keyof typeof config] ?? ''; return (
{ const newValue = e.target.value; setLocalValues(prev => ({ ...prev, [arg]: newValue })); debouncedUpdateConfig({ [arg]: newValue }); }} disabled={updateConfig.isPending} className="font-mono" />
); })} {/* Optional OpenAI fields in Collapsible */}

Advanced Options

{PROVIDERS_CONN_ARGS_MAP[provider] .filter(arg => arg === 'openai_base_url' || arg === 'openai_model') .map((arg) => { const value = localValues[arg] ?? config[arg as keyof typeof config] ?? ''; return (
{ const newValue = e.target.value; setLocalValues(prev => ({ ...prev, [arg]: newValue })); debouncedUpdateConfig({ [arg]: newValue }); }} disabled={updateConfig.isPending} className="font-mono" /> {arg === 'openai_model' && (

Enter comma-separated model names to add multiple custom models (e.g. "gpt-4-turbo,gpt-4-vision")

)}
); })}
) : provider === PROVIDERS.huggingface ? ( <>
{ const newValue = e.target.value; setLocalValues(prev => ({ ...prev, hf_token: newValue })); debouncedUpdateConfig({ hf_token: newValue }); }} disabled={updateConfig.isPending} className="font-mono" />
{ const newValue = e.target.value; setLocalValues(prev => ({ ...prev, hf_custom_models: newValue })); debouncedUpdateConfig({ hf_custom_models: newValue }); }} disabled={updateConfig.isPending} className="font-mono" />

Add custom models in the format: owner/model-name

) : ( // Non-OpenAI providers PROVIDERS_CONN_ARGS_MAP[provider].map((arg) => { const value = localValues[arg] ?? config[arg as keyof typeof config] ?? ''; return (
{ const newValue = e.target.value; setLocalValues(prev => ({ ...prev, [arg]: newValue })); debouncedUpdateConfig({ [arg]: newValue }); }} disabled={updateConfig.isPending} className="font-mono" />
); }) )}
{provider === PROVIDERS.ollama && ( <> {!config.ollama_base_url || config.ollama_base_url.trim() === '' ? ( Ollama Not Configured Please enter a valid Ollama server URL to enable Ollama models. ) : !config.ollama_available && ( Connection Error Could not connect to Ollama server at {config.ollama_base_url}. Please check that Ollama is running and the URL is correct. )} )}
))}
); }