| const z = require('zod'); |
| const { EModelEndpoint } = require('librechat-data-provider'); |
|
|
| const models = [ |
| 'text-davinci-003', |
| 'text-davinci-002', |
| 'text-davinci-001', |
| 'text-curie-001', |
| 'text-babbage-001', |
| 'text-ada-001', |
| 'davinci', |
| 'curie', |
| 'babbage', |
| 'ada', |
| 'code-davinci-002', |
| 'code-davinci-001', |
| 'code-cushman-002', |
| 'code-cushman-001', |
| 'davinci-codex', |
| 'cushman-codex', |
| 'text-davinci-edit-001', |
| 'code-davinci-edit-001', |
| 'text-embedding-ada-002', |
| 'text-similarity-davinci-001', |
| 'text-similarity-curie-001', |
| 'text-similarity-babbage-001', |
| 'text-similarity-ada-001', |
| 'text-search-davinci-doc-001', |
| 'text-search-curie-doc-001', |
| 'text-search-babbage-doc-001', |
| 'text-search-ada-doc-001', |
| 'code-search-babbage-code-001', |
| 'code-search-ada-code-001', |
| 'gpt2', |
| 'gpt-4', |
| 'gpt-4-0314', |
| 'gpt-4-32k', |
| 'gpt-4-32k-0314', |
| 'gpt-3.5-turbo', |
| 'gpt-3.5-turbo-0301', |
| ]; |
|
|
| const openAIModels = { |
| 'gpt-4': 8187, |
| 'gpt-4-0613': 8187, |
| 'gpt-4-32k': 32758, |
| 'gpt-4-32k-0314': 32758, |
| 'gpt-4-32k-0613': 32758, |
| 'gpt-4-1106': 127990, |
| 'gpt-4-0125': 127990, |
| 'gpt-4o': 127990, |
| 'gpt-4-turbo': 127990, |
| 'gpt-4-vision': 127990, |
| 'gpt-3.5-turbo': 16375, |
| 'gpt-3.5-turbo-0613': 4092, |
| 'gpt-3.5-turbo-0301': 4092, |
| 'gpt-3.5-turbo-16k': 16375, |
| 'gpt-3.5-turbo-16k-0613': 16375, |
| 'gpt-3.5-turbo-1106': 16375, |
| 'gpt-3.5-turbo-0125': 16375, |
| 'mistral-': 31990, |
| llama3: 8187, |
| 'llama-3': 8187, |
| }; |
|
|
| const cohereModels = { |
| 'command-light': 4086, |
| 'command-light-nightly': 8182, |
| command: 4086, |
| 'command-nightly': 8182, |
| 'command-r': 127500, |
| 'command-r-plus': 127500, |
| }; |
|
|
| const googleModels = { |
| |
| gemini: 30720, |
| 'gemini-pro-vision': 12288, |
| 'gemini-1.5': 1048576, |
| 'text-bison-32k': 32758, |
| 'chat-bison-32k': 32758, |
| 'code-bison-32k': 32758, |
| 'codechat-bison-32k': 32758, |
| |
| 'code-': 6139, |
| 'codechat-': 6139, |
| |
| 'text-': 8187, |
| 'chat-': 8187, |
| }; |
|
|
| const anthropicModels = { |
| 'claude-': 100000, |
| 'claude-2': 100000, |
| 'claude-2.1': 200000, |
| 'claude-3-haiku': 200000, |
| 'claude-3-sonnet': 200000, |
| 'claude-3-opus': 200000, |
| 'claude-3-5-sonnet': 200000, |
| }; |
|
|
| const aggregateModels = { ...openAIModels, ...googleModels, ...anthropicModels, ...cohereModels }; |
|
|
| |
| const maxTokensMap = { |
| [EModelEndpoint.azureOpenAI]: openAIModels, |
| [EModelEndpoint.openAI]: aggregateModels, |
| [EModelEndpoint.custom]: aggregateModels, |
| [EModelEndpoint.google]: googleModels, |
| [EModelEndpoint.anthropic]: anthropicModels, |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function getModelMaxTokens(modelName, endpoint = EModelEndpoint.openAI, endpointTokenConfig) { |
| if (typeof modelName !== 'string') { |
| return undefined; |
| } |
|
|
| |
| const tokensMap = endpointTokenConfig ?? maxTokensMap[endpoint]; |
| if (!tokensMap) { |
| return undefined; |
| } |
|
|
| if (tokensMap[modelName]?.context) { |
| return tokensMap[modelName].context; |
| } |
|
|
| if (tokensMap[modelName]) { |
| return tokensMap[modelName]; |
| } |
|
|
| const keys = Object.keys(tokensMap); |
| for (let i = keys.length - 1; i >= 0; i--) { |
| if (modelName.includes(keys[i])) { |
| const result = tokensMap[keys[i]]; |
| return result?.context ?? result; |
| } |
| } |
|
|
| return undefined; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function matchModelName(modelName, endpoint = EModelEndpoint.openAI) { |
| if (typeof modelName !== 'string') { |
| return undefined; |
| } |
|
|
| const tokensMap = maxTokensMap[endpoint]; |
| if (!tokensMap) { |
| return modelName; |
| } |
|
|
| if (tokensMap[modelName]) { |
| return modelName; |
| } |
|
|
| const keys = Object.keys(tokensMap); |
| for (let i = keys.length - 1; i >= 0; i--) { |
| const modelKey = keys[i]; |
| if (modelName.includes(modelKey)) { |
| return modelKey; |
| } |
| } |
|
|
| return modelName; |
| } |
|
|
| const modelSchema = z.object({ |
| id: z.string(), |
| pricing: z.object({ |
| prompt: z.string(), |
| completion: z.string(), |
| }), |
| context_length: z.number(), |
| }); |
|
|
| const inputSchema = z.object({ |
| data: z.array(modelSchema), |
| }); |
|
|
| |
| |
| |
| |
| |
| function processModelData(input) { |
| const validationResult = inputSchema.safeParse(input); |
| if (!validationResult.success) { |
| throw new Error('Invalid input data'); |
| } |
| const { data } = validationResult.data; |
|
|
| |
| const tokenConfig = {}; |
|
|
| for (const model of data) { |
| const modelKey = model.id; |
| if (modelKey === 'openrouter/auto') { |
| model.pricing = { |
| prompt: '0.00001', |
| completion: '0.00003', |
| }; |
| } |
| const prompt = parseFloat(model.pricing.prompt) * 1000000; |
| const completion = parseFloat(model.pricing.completion) * 1000000; |
|
|
| tokenConfig[modelKey] = { |
| prompt, |
| completion, |
| context: model.context_length, |
| }; |
| } |
|
|
| return tokenConfig; |
| } |
|
|
| module.exports = { |
| tiktokenModels: new Set(models), |
| maxTokensMap, |
| inputSchema, |
| modelSchema, |
| getModelMaxTokens, |
| matchModelName, |
| processModelData, |
| }; |
|
|