import { customModelProvider } from "lib/ai/models"; let lastFetch = 0; const CACHE_TTL = 1000 * 60 * 60; // 1 hour async function fetchProviderModels( url: string, providerKey: string, headers: Record = {}, transform: (data: any) => any[] = (data) => data.data || [] ) { try { const res = await fetch(url, { headers }); if (!res.ok) return; const data = await res.json(); const modelsList = transform(data); const providerEntry = customModelProvider.modelsInfo.find((p) => p.provider === providerKey); if (providerEntry) { const existingNames = new Set(providerEntry.models.map((m) => m.name)); for (const m of modelsList) { const id = m.id || m.name; if (id && !existingNames.has(id)) { providerEntry.models.push({ name: id, isToolCallUnsupported: false, isImageInputUnsupported: false, supportedFileMimeTypes: [], }); existingNames.add(id); } } } } catch (error) { console.error(`Failed to fetch models for ${providerKey}:`, error); } } export const GET = async () => { if (Date.now() - lastFetch > CACHE_TTL) { lastFetch = Date.now(); await Promise.allSettled([ fetchProviderModels("https://openrouter.ai/api/v1/models", "openRouter"), fetchProviderModels( "https://api.groq.com/openai/v1/models", "groq", process.env.GROQ_API_KEY ? { Authorization: `Bearer ${process.env.GROQ_API_KEY}` } : {} ), fetchProviderModels( "https://integrate.api.nvidia.com/v1/models", "nvidiaNim", process.env.NVIDIA_API_KEY ? { Authorization: `Bearer ${process.env.NVIDIA_API_KEY}` } : {} ), ]); } return Response.json( customModelProvider.modelsInfo.sort((a, b) => { if (a.hasAPIKey && !b.hasAPIKey) return -1; if (!a.hasAPIKey && b.hasAPIKey) return 1; return 0; }), ); };