"use client"; import Link from "next/link"; import { useEffect, useState } from "react"; import { getLighthouseProviders, getTenantConfig, } from "@/actions/lighthouse-v1/lighthouse"; import { Button, Card, CardContent, CardHeader } from "@/components/shadcn"; import type { IconComponent } from "@/types/components"; import { getAllProviders } from "./llm-provider-registry"; interface LighthouseProviderResource { id: string; attributes: { provider_type: string; is_active: boolean; }; } type LLMProvider = { id: string; provider: string; description: string; defaultModel: string; icon: IconComponent; isConnected: boolean; isActive: boolean; isDefaultProvider: boolean; }; export const LLMProvidersTable = () => { const [providers, setProviders] = useState([]); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const fetchProviders = async () => { setIsLoading(true); try { // Fetch connected providers from API const result = await getLighthouseProviders(); const connectedProviders = new Map< string, LighthouseProviderResource >(); if (result.data && !result.errors) { result.data.forEach((provider: LighthouseProviderResource) => { connectedProviders.set(provider.attributes.provider_type, provider); }); } // Fetch tenant config for default models and default provider const configResult = await getTenantConfig(); const defaultModels = configResult.data?.attributes?.default_models || {}; const defaultProvider = configResult.data?.attributes?.default_provider || ""; // Build provider list from registry const allProviders: LLMProvider[] = getAllProviders().map((config) => { const connected = connectedProviders.get(config.id); const defaultModel = defaultModels[config.id] || ""; return { id: config.id, provider: config.name, description: config.description, icon: config.icon, defaultModel, isConnected: !!connected, isActive: connected?.attributes?.is_active || false, isDefaultProvider: config.id === defaultProvider, }; }); setProviders(allProviders); } catch (error) { console.error("Failed to fetch providers:", error); // Fallback to showing all providers from registry as not connected const allProviders: LLMProvider[] = getAllProviders().map((config) => ({ id: config.id, provider: config.name, description: config.description, icon: config.icon, defaultModel: "", isConnected: false, isActive: false, isDefaultProvider: false, })); setProviders(allProviders); } finally { setIsLoading(false); } }; fetchProviders(); }, []); if (isLoading) { return (

LLM Providers

{[1, 2, 3].map((i) => (
))}
); } return (

LLM Providers

{providers.map((provider) => { // Show Connect button if not connected, Configure if connected const showConnect = !provider.isConnected; const showConfigure = provider.isConnected; return ( {/* Header */}
{/* Status and Model Info */}

Status

{provider.isConnected ? provider.isActive ? "Connected" : "Connection Failed" : "Not configured"}

{provider.defaultModel && (

Default Model

{provider.defaultModel}

)}
{/* Action Button */} {showConnect && ( )} {showConfigure && ( )}
); })}
); };