| const { matchModelName, findMatchingPattern } = require('@librechat/api'); |
| const defaultRate = 6; |
|
|
| |
| |
| |
| |
| const bedrockValues = { |
| |
| llama2: { prompt: 0.75, completion: 1.0 }, |
| 'llama-2': { prompt: 0.75, completion: 1.0 }, |
| 'llama2-13b': { prompt: 0.75, completion: 1.0 }, |
| 'llama2:70b': { prompt: 1.95, completion: 2.56 }, |
| 'llama2-70b': { prompt: 1.95, completion: 2.56 }, |
|
|
| |
| llama3: { prompt: 0.3, completion: 0.6 }, |
| 'llama-3': { prompt: 0.3, completion: 0.6 }, |
| 'llama3-8b': { prompt: 0.3, completion: 0.6 }, |
| 'llama3:8b': { prompt: 0.3, completion: 0.6 }, |
| 'llama3-70b': { prompt: 2.65, completion: 3.5 }, |
| 'llama3:70b': { prompt: 2.65, completion: 3.5 }, |
|
|
| |
| 'llama3-1': { prompt: 0.22, completion: 0.22 }, |
| 'llama3-1-8b': { prompt: 0.22, completion: 0.22 }, |
| 'llama3-1-70b': { prompt: 0.72, completion: 0.72 }, |
| 'llama3-1-405b': { prompt: 2.4, completion: 2.4 }, |
| 'llama3-2': { prompt: 0.1, completion: 0.1 }, |
| 'llama3-2-1b': { prompt: 0.1, completion: 0.1 }, |
| 'llama3-2-3b': { prompt: 0.15, completion: 0.15 }, |
| 'llama3-2-11b': { prompt: 0.16, completion: 0.16 }, |
| 'llama3-2-90b': { prompt: 0.72, completion: 0.72 }, |
| 'llama3-3': { prompt: 2.65, completion: 3.5 }, |
| 'llama3-3-70b': { prompt: 2.65, completion: 3.5 }, |
|
|
| |
| 'llama3.1': { prompt: 0.22, completion: 0.22 }, |
| 'llama3.1:8b': { prompt: 0.22, completion: 0.22 }, |
| 'llama3.1:70b': { prompt: 0.72, completion: 0.72 }, |
| 'llama3.1:405b': { prompt: 2.4, completion: 2.4 }, |
| 'llama3.2': { prompt: 0.1, completion: 0.1 }, |
| 'llama3.2:1b': { prompt: 0.1, completion: 0.1 }, |
| 'llama3.2:3b': { prompt: 0.15, completion: 0.15 }, |
| 'llama3.2:11b': { prompt: 0.16, completion: 0.16 }, |
| 'llama3.2:90b': { prompt: 0.72, completion: 0.72 }, |
| 'llama3.3': { prompt: 2.65, completion: 3.5 }, |
| 'llama3.3:70b': { prompt: 2.65, completion: 3.5 }, |
|
|
| |
| 'llama-3.1': { prompt: 0.22, completion: 0.22 }, |
| 'llama-3.1-8b': { prompt: 0.22, completion: 0.22 }, |
| 'llama-3.1-70b': { prompt: 0.72, completion: 0.72 }, |
| 'llama-3.1-405b': { prompt: 2.4, completion: 2.4 }, |
| 'llama-3.2': { prompt: 0.1, completion: 0.1 }, |
| 'llama-3.2-1b': { prompt: 0.1, completion: 0.1 }, |
| 'llama-3.2-3b': { prompt: 0.15, completion: 0.15 }, |
| 'llama-3.2-11b': { prompt: 0.16, completion: 0.16 }, |
| 'llama-3.2-90b': { prompt: 0.72, completion: 0.72 }, |
| 'llama-3.3': { prompt: 2.65, completion: 3.5 }, |
| 'llama-3.3-70b': { prompt: 2.65, completion: 3.5 }, |
| 'mistral-7b': { prompt: 0.15, completion: 0.2 }, |
| 'mistral-small': { prompt: 0.15, completion: 0.2 }, |
| 'mixtral-8x7b': { prompt: 0.45, completion: 0.7 }, |
| 'mistral-large-2402': { prompt: 4.0, completion: 12.0 }, |
| 'mistral-large-2407': { prompt: 3.0, completion: 9.0 }, |
| 'command-text': { prompt: 1.5, completion: 2.0 }, |
| 'command-light': { prompt: 0.3, completion: 0.6 }, |
| |
| 'j2-mid': { prompt: 12.5, completion: 12.5 }, |
| 'j2-ultra': { prompt: 18.8, completion: 18.8 }, |
| 'jamba-instruct': { prompt: 0.5, completion: 0.7 }, |
| |
| 'titan-text-lite': { prompt: 0.15, completion: 0.2 }, |
| 'titan-text-express': { prompt: 0.2, completion: 0.6 }, |
| 'titan-text-premier': { prompt: 0.5, completion: 1.5 }, |
| |
| 'nova-micro': { prompt: 0.035, completion: 0.14 }, |
| 'nova-lite': { prompt: 0.06, completion: 0.24 }, |
| 'nova-pro': { prompt: 0.8, completion: 3.2 }, |
| 'nova-premier': { prompt: 2.5, completion: 12.5 }, |
| 'deepseek.r1': { prompt: 1.35, completion: 5.4 }, |
| }; |
|
|
| |
| |
| |
| |
| |
| const tokenValues = Object.assign( |
| { |
| |
| '8k': { prompt: 30, completion: 60 }, |
| '32k': { prompt: 60, completion: 120 }, |
| '4k': { prompt: 1.5, completion: 2 }, |
| '16k': { prompt: 3, completion: 4 }, |
| |
| 'claude-': { prompt: 0.8, completion: 2.4 }, |
| deepseek: { prompt: 0.28, completion: 0.42 }, |
| command: { prompt: 0.38, completion: 0.38 }, |
| gemma: { prompt: 0.02, completion: 0.04 }, |
| gemini: { prompt: 0.5, completion: 1.5 }, |
| 'gpt-oss': { prompt: 0.05, completion: 0.2 }, |
| |
| 'gpt-3.5-turbo-1106': { prompt: 1, completion: 2 }, |
| 'gpt-3.5-turbo-0125': { prompt: 0.5, completion: 1.5 }, |
| 'gpt-4-1106': { prompt: 10, completion: 30 }, |
| 'gpt-4.1': { prompt: 2, completion: 8 }, |
| 'gpt-4.1-nano': { prompt: 0.1, completion: 0.4 }, |
| 'gpt-4.1-mini': { prompt: 0.4, completion: 1.6 }, |
| 'gpt-4.5': { prompt: 75, completion: 150 }, |
| 'gpt-4o': { prompt: 2.5, completion: 10 }, |
| 'gpt-4o-2024-05-13': { prompt: 5, completion: 15 }, |
| 'gpt-4o-mini': { prompt: 0.15, completion: 0.6 }, |
| 'gpt-5': { prompt: 1.25, completion: 10 }, |
| 'gpt-5-nano': { prompt: 0.05, completion: 0.4 }, |
| 'gpt-5-mini': { prompt: 0.25, completion: 2 }, |
| 'gpt-5-pro': { prompt: 15, completion: 120 }, |
| o1: { prompt: 15, completion: 60 }, |
| 'o1-mini': { prompt: 1.1, completion: 4.4 }, |
| 'o1-preview': { prompt: 15, completion: 60 }, |
| o3: { prompt: 2, completion: 8 }, |
| 'o3-mini': { prompt: 1.1, completion: 4.4 }, |
| 'o4-mini': { prompt: 1.1, completion: 4.4 }, |
| 'claude-instant': { prompt: 0.8, completion: 2.4 }, |
| 'claude-2': { prompt: 8, completion: 24 }, |
| 'claude-2.1': { prompt: 8, completion: 24 }, |
| 'claude-3-haiku': { prompt: 0.25, completion: 1.25 }, |
| 'claude-3-sonnet': { prompt: 3, completion: 15 }, |
| 'claude-3-opus': { prompt: 15, completion: 75 }, |
| 'claude-3-5-haiku': { prompt: 0.8, completion: 4 }, |
| 'claude-3.5-haiku': { prompt: 0.8, completion: 4 }, |
| 'claude-3-5-sonnet': { prompt: 3, completion: 15 }, |
| 'claude-3.5-sonnet': { prompt: 3, completion: 15 }, |
| 'claude-3-7-sonnet': { prompt: 3, completion: 15 }, |
| 'claude-3.7-sonnet': { prompt: 3, completion: 15 }, |
| 'claude-haiku-4-5': { prompt: 1, completion: 5 }, |
| 'claude-opus-4': { prompt: 15, completion: 75 }, |
| 'claude-opus-4-5': { prompt: 5, completion: 25 }, |
| 'claude-sonnet-4': { prompt: 3, completion: 15 }, |
| 'command-r': { prompt: 0.5, completion: 1.5 }, |
| 'command-r-plus': { prompt: 3, completion: 15 }, |
| 'command-text': { prompt: 1.5, completion: 2.0 }, |
| 'deepseek-chat': { prompt: 0.28, completion: 0.42 }, |
| 'deepseek-reasoner': { prompt: 0.28, completion: 0.42 }, |
| 'deepseek-r1': { prompt: 0.4, completion: 2.0 }, |
| 'deepseek-v3': { prompt: 0.2, completion: 0.8 }, |
| 'gemma-2': { prompt: 0.01, completion: 0.03 }, |
| 'gemma-3': { prompt: 0.02, completion: 0.04 }, |
| 'gemma-3-27b': { prompt: 0.09, completion: 0.16 }, |
| 'gemini-1.5': { prompt: 2.5, completion: 10 }, |
| 'gemini-1.5-flash': { prompt: 0.15, completion: 0.6 }, |
| 'gemini-1.5-flash-8b': { prompt: 0.075, completion: 0.3 }, |
| 'gemini-2.0': { prompt: 0.1, completion: 0.4 }, |
| 'gemini-2.0-flash': { prompt: 0.1, completion: 0.4 }, |
| 'gemini-2.0-flash-lite': { prompt: 0.075, completion: 0.3 }, |
| 'gemini-2.5': { prompt: 0.3, completion: 2.5 }, |
| 'gemini-2.5-flash': { prompt: 0.3, completion: 2.5 }, |
| 'gemini-2.5-flash-lite': { prompt: 0.1, completion: 0.4 }, |
| 'gemini-2.5-pro': { prompt: 1.25, completion: 10 }, |
| 'gemini-3': { prompt: 2, completion: 12 }, |
| 'gemini-pro-vision': { prompt: 0.5, completion: 1.5 }, |
| grok: { prompt: 2.0, completion: 10.0 }, |
| 'grok-beta': { prompt: 5.0, completion: 15.0 }, |
| 'grok-vision-beta': { prompt: 5.0, completion: 15.0 }, |
| 'grok-2': { prompt: 2.0, completion: 10.0 }, |
| 'grok-2-1212': { prompt: 2.0, completion: 10.0 }, |
| 'grok-2-latest': { prompt: 2.0, completion: 10.0 }, |
| 'grok-2-vision': { prompt: 2.0, completion: 10.0 }, |
| 'grok-2-vision-1212': { prompt: 2.0, completion: 10.0 }, |
| 'grok-2-vision-latest': { prompt: 2.0, completion: 10.0 }, |
| 'grok-3': { prompt: 3.0, completion: 15.0 }, |
| 'grok-3-fast': { prompt: 5.0, completion: 25.0 }, |
| 'grok-3-mini': { prompt: 0.3, completion: 0.5 }, |
| 'grok-3-mini-fast': { prompt: 0.6, completion: 4 }, |
| 'grok-4': { prompt: 3.0, completion: 15.0 }, |
| 'grok-4-fast': { prompt: 0.2, completion: 0.5 }, |
| 'grok-4-1-fast': { prompt: 0.2, completion: 0.5 }, |
| 'grok-code-fast': { prompt: 0.2, completion: 1.5 }, |
| codestral: { prompt: 0.3, completion: 0.9 }, |
| 'ministral-3b': { prompt: 0.04, completion: 0.04 }, |
| 'ministral-8b': { prompt: 0.1, completion: 0.1 }, |
| 'mistral-nemo': { prompt: 0.15, completion: 0.15 }, |
| 'mistral-saba': { prompt: 0.2, completion: 0.6 }, |
| 'pixtral-large': { prompt: 2.0, completion: 6.0 }, |
| 'mistral-large': { prompt: 2.0, completion: 6.0 }, |
| 'mixtral-8x22b': { prompt: 0.65, completion: 0.65 }, |
| kimi: { prompt: 0.14, completion: 2.49 }, |
| |
| 'gpt-oss:20b': { prompt: 0.05, completion: 0.2 }, |
| 'gpt-oss-20b': { prompt: 0.05, completion: 0.2 }, |
| 'gpt-oss:120b': { prompt: 0.15, completion: 0.6 }, |
| 'gpt-oss-120b': { prompt: 0.15, completion: 0.6 }, |
| |
| glm4: { prompt: 0.1, completion: 0.1 }, |
| 'glm-4': { prompt: 0.1, completion: 0.1 }, |
| 'glm-4-32b': { prompt: 0.1, completion: 0.1 }, |
| 'glm-4.5': { prompt: 0.35, completion: 1.55 }, |
| 'glm-4.5-air': { prompt: 0.14, completion: 0.86 }, |
| 'glm-4.5v': { prompt: 0.6, completion: 1.8 }, |
| 'glm-4.6': { prompt: 0.5, completion: 1.75 }, |
| |
| qwen: { prompt: 0.08, completion: 0.33 }, |
| 'qwen2.5': { prompt: 0.08, completion: 0.33 }, |
| 'qwen-turbo': { prompt: 0.05, completion: 0.2 }, |
| 'qwen-plus': { prompt: 0.4, completion: 1.2 }, |
| 'qwen-max': { prompt: 1.6, completion: 6.4 }, |
| 'qwq-32b': { prompt: 0.15, completion: 0.4 }, |
| |
| qwen3: { prompt: 0.035, completion: 0.138 }, |
| 'qwen3-8b': { prompt: 0.035, completion: 0.138 }, |
| 'qwen3-14b': { prompt: 0.05, completion: 0.22 }, |
| 'qwen3-30b-a3b': { prompt: 0.06, completion: 0.22 }, |
| 'qwen3-32b': { prompt: 0.05, completion: 0.2 }, |
| 'qwen3-235b-a22b': { prompt: 0.08, completion: 0.55 }, |
| |
| 'qwen3-vl-8b-thinking': { prompt: 0.18, completion: 2.1 }, |
| 'qwen3-vl-8b-instruct': { prompt: 0.18, completion: 0.69 }, |
| 'qwen3-vl-30b-a3b': { prompt: 0.29, completion: 1.0 }, |
| 'qwen3-vl-235b-a22b': { prompt: 0.3, completion: 1.2 }, |
| |
| 'qwen3-max': { prompt: 1.2, completion: 6 }, |
| 'qwen3-coder': { prompt: 0.22, completion: 0.95 }, |
| 'qwen3-coder-30b-a3b': { prompt: 0.06, completion: 0.25 }, |
| 'qwen3-coder-plus': { prompt: 1, completion: 5 }, |
| 'qwen3-coder-flash': { prompt: 0.3, completion: 1.5 }, |
| 'qwen3-next-80b-a3b': { prompt: 0.1, completion: 0.8 }, |
| }, |
| bedrockValues, |
| ); |
|
|
| |
| |
| |
| |
| |
| |
| const cacheTokenValues = { |
| 'claude-3.7-sonnet': { write: 3.75, read: 0.3 }, |
| 'claude-3-7-sonnet': { write: 3.75, read: 0.3 }, |
| 'claude-3.5-sonnet': { write: 3.75, read: 0.3 }, |
| 'claude-3-5-sonnet': { write: 3.75, read: 0.3 }, |
| 'claude-3.5-haiku': { write: 1, read: 0.08 }, |
| 'claude-3-5-haiku': { write: 1, read: 0.08 }, |
| 'claude-3-haiku': { write: 0.3, read: 0.03 }, |
| 'claude-haiku-4-5': { write: 1.25, read: 0.1 }, |
| 'claude-sonnet-4': { write: 3.75, read: 0.3 }, |
| 'claude-opus-4': { write: 18.75, read: 1.5 }, |
| 'claude-opus-4-5': { write: 6.25, read: 0.5 }, |
| |
| deepseek: { write: 0.28, read: 0.028 }, |
| 'deepseek-chat': { write: 0.28, read: 0.028 }, |
| 'deepseek-reasoner': { write: 0.28, read: 0.028 }, |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const getValueKey = (model, endpoint) => { |
| if (!model || typeof model !== 'string') { |
| return undefined; |
| } |
|
|
| |
| if (!endpoint || (typeof endpoint === 'string' && !tokenValues[endpoint])) { |
| const matchedKey = findMatchingPattern(model, tokenValues); |
| if (matchedKey) { |
| return matchedKey; |
| } |
| } |
|
|
| |
| const modelName = matchModelName(model, endpoint); |
| if (!modelName) { |
| return undefined; |
| } |
|
|
| |
| if (modelName.includes('gpt-3.5-turbo-16k')) { |
| return '16k'; |
| } else if (modelName.includes('gpt-3.5')) { |
| return '4k'; |
| } else if (modelName.includes('gpt-4-vision')) { |
| return 'gpt-4-1106'; |
| } else if (modelName.includes('gpt-4-0125')) { |
| return 'gpt-4-1106'; |
| } else if (modelName.includes('gpt-4-turbo')) { |
| return 'gpt-4-1106'; |
| } else if (modelName.includes('gpt-4-32k')) { |
| return '32k'; |
| } else if (modelName.includes('gpt-4')) { |
| return '8k'; |
| } |
|
|
| return undefined; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const getMultiplier = ({ valueKey, tokenType, model, endpoint, endpointTokenConfig }) => { |
| if (endpointTokenConfig) { |
| return endpointTokenConfig?.[model]?.[tokenType] ?? defaultRate; |
| } |
|
|
| if (valueKey && tokenType) { |
| return tokenValues[valueKey][tokenType] ?? defaultRate; |
| } |
|
|
| if (!tokenType || !model) { |
| return 1; |
| } |
|
|
| valueKey = getValueKey(model, endpoint); |
| if (!valueKey) { |
| return defaultRate; |
| } |
|
|
| |
| return tokenValues[valueKey]?.[tokenType] ?? defaultRate; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const getCacheMultiplier = ({ valueKey, cacheType, model, endpoint, endpointTokenConfig }) => { |
| if (endpointTokenConfig) { |
| return endpointTokenConfig?.[model]?.[cacheType] ?? null; |
| } |
|
|
| if (valueKey && cacheType) { |
| return cacheTokenValues[valueKey]?.[cacheType] ?? null; |
| } |
|
|
| if (!cacheType || !model) { |
| return null; |
| } |
|
|
| valueKey = getValueKey(model, endpoint); |
| if (!valueKey) { |
| return null; |
| } |
|
|
| |
| return cacheTokenValues[valueKey]?.[cacheType] ?? null; |
| }; |
|
|
| module.exports = { |
| tokenValues, |
| getValueKey, |
| getMultiplier, |
| getCacheMultiplier, |
| defaultRate, |
| cacheTokenValues, |
| }; |
|
|