|
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<string, string>; |
|
}; |
|
}; |
|
}): Promise<Response> { |
|
const llmManager = LLMManager.getInstance(context.cloudflare?.env); |
|
|
|
|
|
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) { |
|
|
|
const provider = llmManager.getProvider(params.provider); |
|
|
|
if (provider) { |
|
modelList = await llmManager.getModelListFromProvider(provider, { |
|
apiKeys, |
|
providerSettings, |
|
serverEnv: context.cloudflare?.env, |
|
}); |
|
} |
|
} else { |
|
|
|
modelList = await llmManager.updateModelList({ |
|
apiKeys, |
|
providerSettings, |
|
serverEnv: context.cloudflare?.env, |
|
}); |
|
} |
|
|
|
return json<ModelsResponse>({ |
|
modelList, |
|
providers, |
|
defaultProvider, |
|
}); |
|
} |
|
|