diff --git a/app/utils/constants.ts b/app/utils/constants.ts index ecf476b8..32bc816e 100644 --- a/app/utils/constants.ts +++ b/app/utils/constants.ts @@ -60,7 +60,9 @@ const PROVIDER_LIST: ProviderInfo[] = [ { name: 'qwen/qwen-110b-chat', label: 'OpenRouter Qwen 110b Chat (OpenRouter)', provider: 'OpenRouter' }, { name: 'cohere/command', label: 'Cohere Command (OpenRouter)', provider: 'OpenRouter' } ], - getApiKeyLink: 'https://openrouter.ai/settings/keys' + getDynamicModels: getOpenRouterModels, + getApiKeyLink: 'https://openrouter.ai/settings/keys', + }, { name: 'Google', staticModels: [ @@ -183,7 +185,34 @@ async function getOpenAILikeModels(): Promise { } catch (e) { return []; } +} +type OpenRouterModelsResponse = { + data: { + name: string; + id: string; + context_length: number; + pricing: { + prompt: number; + completion: number; + } + }[] +}; + +async function getOpenRouterModels(): Promise { + const data: OpenRouterModelsResponse = await (await fetch('https://openrouter.ai/api/v1/models', { + headers: { + 'Content-Type': 'application/json' + } + })).json(); + + return data.data.sort((a, b) => a.name.localeCompare(b.name)).map(m => ({ + name: m.id, + label: `${m.name} - in:$${(m.pricing.prompt * 1_000_000).toFixed( + 2)} out:$${(m.pricing.completion * 1_000_000).toFixed(2)} - context ${Math.floor( + m.context_length / 1000)}k`, + provider: 'OpenRouter' + })); } async function getLMStudioModels(): Promise { @@ -202,10 +231,11 @@ async function getLMStudioModels(): Promise { } -async function initializeModelList(): Promise { + +async function initializeModelList(): Promise { MODEL_LIST = [...(await Promise.all( PROVIDER_LIST.filter(p => !!p.getDynamicModels).map(p => p.getDynamicModels()))).flat(), ...staticModels]; + return MODEL_LIST; } -initializeModelList().then(); -export { getOllamaModels, getOpenAILikeModels, getLMStudioModels, initializeModelList, PROVIDER_LIST }; +export { getOllamaModels, getOpenAILikeModels, getLMStudioModels, initializeModelList, getOpenRouterModels, PROVIDER_LIST };