import { json } from '@remix-run/cloudflare'; import { LLMManager } from '~/lib/modules/llm/manager'; import type { ModelInfo } from '~/lib/modules/llm/types'; import type { ProviderInfo } from '~/types/model'; import { getApiKeysFromCookie, getProviderSettingsFromCookie } from '~/lib/api/cookies'; interface ModelsResponse { modelList: ModelInfo[]; providers: ProviderInfo[]; defaultProvider: ProviderInfo; } let cachedProviders: ProviderInfo[] | null = null; let cachedDefaultProvider: ProviderInfo | null = null; function getProviderInfo(llmManager: LLMManager) { if (!cachedProviders) { cachedProviders = llmManager.getAllProviders().map((provider) => ({ name: provider.name, staticModels: provider.staticModels, getApiKeyLink: provider.getApiKeyLink, labelForGetApiKey: provider.labelForGetApiKey, icon: provider.icon, })); } if (!cachedDefaultProvider) { const defaultProvider = llmManager.getDefaultProvider(); cachedDefaultProvider = { name: defaultProvider.name, staticModels: defaultProvider.staticModels, getApiKeyLink: defaultProvider.getApiKeyLink, labelForGetApiKey: defaultProvider.labelForGetApiKey, icon: defaultProvider.icon, }; } return { providers: cachedProviders, defaultProvider: cachedDefaultProvider }; } export async function loader({ request, params, context, }: { request: Request; params: { provider?: string }; context: { cloudflare?: { env: Record; }; }; }): Promise { const llmManager = LLMManager.getInstance(context.cloudflare?.env); // Get client side maintained API keys and provider settings from cookies const cookieHeader = request.headers.get('Cookie'); const apiKeys = getApiKeysFromCookie(cookieHeader); const providerSettings = getProviderSettingsFromCookie(cookieHeader); const { providers, defaultProvider } = getProviderInfo(llmManager); let modelList: ModelInfo[] = []; if (params.provider) { // Only update models for the specific provider const provider = llmManager.getProvider(params.provider); if (provider) { modelList = await llmManager.getModelListFromProvider(provider, { apiKeys, providerSettings, serverEnv: context.cloudflare?.env, }); } } else { // Update all models modelList = await llmManager.updateModelList({ apiKeys, providerSettings, serverEnv: context.cloudflare?.env, }); } return json({ modelList, providers, defaultProvider, }); }