diff --git a/extensions/meteringAndBilling/eventListeners/subscriptionEvents.js b/extensions/meteringAndBilling/eventListeners/subscriptionEvents.js index 3b18ea1e..e48d598a 100644 --- a/extensions/meteringAndBilling/eventListeners/subscriptionEvents.js +++ b/extensions/meteringAndBilling/eventListeners/subscriptionEvents.js @@ -19,6 +19,6 @@ extension.on('metering:registerAvailablePolicies', async ( } }); -extension.on('metering:getUserSubscription', async (/** @type {{actor: import('@heyputer/backend/src/services/auth/Actor').Actor, userSubscription: string}} */event) => { - event.userSubscriptionId = event.actor.type.user.subscription.tier; +extension.on('metering:getUserSubscription', async (/** @type {{actor: import('@heyputer/backend/src/services/auth/Actor').Actor, userSubscriptionId: string}} */event) => { + event.userSubscriptionId = event.actor.type.user.subscription.active ? event.actor.type.user.subscription.tier : undefined; }); diff --git a/src/backend/src/modules/puterai/OpenRouterService.js b/src/backend/src/modules/puterai/OpenRouterService.js index 17d91879..39432cf4 100644 --- a/src/backend/src/modules/puterai/OpenRouterService.js +++ b/src/backend/src/modules/puterai/OpenRouterService.js @@ -140,6 +140,7 @@ class OpenRouterService extends BaseService { }); const modelDetails = (await this.models_()).find(m => m.id === 'openrouter:' + model); + const rawPriceModelDetails = (await this.models_(true)).find(m => m.id === 'openrouter:' + model); return OpenAIUtil.handle_completion_output({ usage_calculator: ({ usage }) => { // custom open router logic because they're pricing are weird @@ -148,7 +149,10 @@ class OpenRouterService extends BaseService { completion: usage.completion_tokens ?? 0, input_cache_read: usage.prompt_tokens_details.cached_tokens ?? 0, }; - this.meteringAndBillingService.utilRecordUsageObject(trackedUsage, actor, modelDetails.id); + const costOverwrites = Object.fromEntries(Object.keys(trackedUsage).map((k) => { + return [k, rawPriceModelDetails.cost[k] * trackedUsage[k]]; + })); + this.meteringAndBillingService.utilRecordUsageObject(trackedUsage, actor, modelDetails.id, costOverwrites); const legacyCostCalculator = OpenAIUtil.create_usage_calculator({ model_details: modelDetails, }); @@ -163,27 +167,31 @@ class OpenRouterService extends BaseService { /** * Retrieves available AI models and their specifications - * @returns {Promise} Array of model objects containing: + * @returns Array of model objects containing: * - id: Model identifier string * - name: Human readable model name * - context: Maximum context window size * - cost: Pricing information object with currency and rates * @private */ - async models_() { + async models_(rawPriceKeys = false) { const axios = this.require('axios'); - const cached_models = this.modules.kv.get(`${this.kvkey}:models`); - if ( cached_models ) { - return cached_models; + let models = this.modules.kv.get(`${this.kvkey}:models`); + if ( !models ) { + const resp = await axios.request({ + method: 'GET', + url: this.api_base_url + '/models', + }); + models = resp.data.data; + this.modules.kv.set(`${this.kvkey}:models`, models); } - const resp = await axios.request({ - method: 'GET', - url: this.api_base_url + '/models', - }); - const resp_models = resp.data.data; const coerced_models = []; - for ( const model of resp_models ) { + for ( const model of models ) { + const microcentCosts = rawPriceKeys ? Object.fromEntries(Object.entries(model.pricing).map(([k, v]) => [k, Math.round(v * 1_000_000 * 100)])) : { + input: Math.round(model.pricing.prompt * 1_000_000 * 100), + output: Math.round(model.pricing.completion * 1_000_000 * 100), + }; coerced_models.push({ id: 'openrouter:' + model.id, name: model.name + ' (OpenRouter)', @@ -191,12 +199,10 @@ class OpenRouterService extends BaseService { cost: { currency: 'usd-cents', tokens: 1_000_000, - input: model.pricing.prompt * 1000000 * 100, - output: model.pricing.completion * 1000000 * 100, + ...microcentCosts, }, }); } - this.modules.kv.set(`${this.kvkey}:models`, coerced_models); return coerced_models; } } diff --git a/src/backend/src/services/MeteringService/MeteringService.ts b/src/backend/src/services/MeteringService/MeteringService.ts index a0977cc7..c9f40f75 100644 --- a/src/backend/src/services/MeteringService/MeteringService.ts +++ b/src/backend/src/services/MeteringService/MeteringService.ts @@ -41,9 +41,9 @@ export class MeteringAndBillingService { this.#eventService = eventService; } - utilRecordUsageObject(trackedUsageObject: Record, actor: Actor, modelPrefix: string) { + utilRecordUsageObject>(trackedUsageObject: T, actor: Actor, modelPrefix: string, costsOverrides?: Record) { Object.entries(trackedUsageObject).forEach(([usageKind, amount]) => { - this.incrementUsage(actor, `${modelPrefix}:${usageKind}`, amount); + this.incrementUsage(actor, `${modelPrefix}:${usageKind}`, amount, costsOverrides?.[usageKind as keyof T]); }); } @@ -57,7 +57,6 @@ export class MeteringAndBillingService { try { if ( !usageAmount || !usageType || !actor ) { // silent fail for now; - console.warn('Invalid usage increment parameters', { actor, usageType, usageAmount, costOverride }); return { total: 0 } as UsageByType; } @@ -70,6 +69,17 @@ export class MeteringAndBillingService { return this.#superUserService.sudo(async () => { const totalCost = (costOverride ?? (COST_MAPS[usageType as keyof typeof COST_MAPS] || 0) * usageAmount) || 0; // TODO DS: apply our policy discounts here eventually + + if ( totalCost === 0 && costOverride === undefined ) { + // could be something is off, there are some models that cost nothing from openrouter, but then our overrides should not be undefined, so will flag + this.#alarmService.create('metering-service-warning', "potential abuse vector", { + actor, + usageType, + usageAmount, + costOverride, + }); + } + usageType = usageType.replace(/\./g, PERIOD_ESCAPE) as keyof typeof COST_MAPS; // replace dots with underscores for kvstore paths, TODO DS: map this back when reading const appId = actor.type?.app?.uid || GLOBAL_APP_KEY; const actorId = actor.type?.user.uuid; @@ -220,8 +230,8 @@ export class MeteringAndBillingService { const [userSubscription, userPolicyAddons, currentMonthUsage] = await Promise.all([userSubscriptionPromise, userPolicyAddonsPromise, currentUsagePromise]); return { - remaining: Math.max(0, userSubscription.monthUsageAllowance + (userPolicyAddons?.purchasedCredits || 0) - currentMonthUsage.usage.total), - monthUsageAllowance: userSubscription?.monthUsageAllowance, + remaining: Math.max(0, (userSubscription.monthUsageAllowance || 0) + (userPolicyAddons?.purchasedCredits || 0) - (currentMonthUsage.usage.total || 0)), + monthUsageAllowance: userSubscription.monthUsageAllowance, userPolicyAddons, }; } @@ -262,7 +272,7 @@ export class MeteringAndBillingService { const availablePolicies = [ ...availablePoliciesEvent.availablePolicies, ...SUB_POLICIES ]; const userSubscriptionId = userSubscriptionEvent.userSubscriptionId as unknown as typeof SUB_POLICIES[number]['id'] || defaultSubscriptionId; - return availablePolicies.find(({ id }) => id === userSubscriptionId || id === defaultSubscriptionId)!; + return availablePolicies.find(({ id }) => id === userSubscriptionId) || availablePolicies.find(({ id }) => id === defaultSubscriptionId)!; } async getActorPolicyAddons(actor: Actor) { diff --git a/src/backend/src/services/MeteringService/costMaps/index.ts b/src/backend/src/services/MeteringService/costMaps/index.ts index 3d54216a..7e93b393 100644 --- a/src/backend/src/services/MeteringService/costMaps/index.ts +++ b/src/backend/src/services/MeteringService/costMaps/index.ts @@ -25,5 +25,5 @@ export const COST_MAPS = { ...OPENAI_IMAGE_COST_MAP, ...OPENROUTER_COST_MAP, ...TOGETHER_COST_MAP, - ...XAI_COST_MAP -} \ No newline at end of file + ...XAI_COST_MAP, +}; \ No newline at end of file diff --git a/src/backend/src/services/MeteringService/costMaps/openrouterCostMap.ts b/src/backend/src/services/MeteringService/costMaps/openrouterCostMap.ts index bc64a126..81b6f4b6 100644 --- a/src/backend/src/services/MeteringService/costMaps/openrouterCostMap.ts +++ b/src/backend/src/services/MeteringService/costMaps/openrouterCostMap.ts @@ -1,37 +1,116 @@ export const OPENROUTER_COST_MAP = { - "openrouter:meituan/longcat-flash-chat:prompt": 15, - "openrouter:meituan/longcat-flash-chat:completion": 75, - "openrouter:nvidia/nemotron-nano-9b-v2:prompt": 4, - "openrouter:nvidia/nemotron-nano-9b-v2:completion": 16, + + "openrouter:anthropic/claude-haiku-4.5:prompt": 100, + "openrouter:anthropic/claude-haiku-4.5:completion": 500, + "openrouter:anthropic/claude-haiku-4.5:input_cache_read": 10, + "openrouter:anthropic/claude-haiku-4.5:input_cache_write": 125, + "openrouter:qwen/qwen3-vl-8b-thinking:prompt": 18, + "openrouter:qwen/qwen3-vl-8b-thinking:completion": 210, + "openrouter:qwen/qwen3-vl-8b-instruct:prompt": 18, + "openrouter:qwen/qwen3-vl-8b-instruct:completion": 69, + "openrouter:inclusionai/ling-1t:prompt": 100, + "openrouter:inclusionai/ling-1t:completion": 300, + "openrouter:openai/o3-deep-research:prompt": 1000, + "openrouter:openai/o3-deep-research:completion": 4000, + "openrouter:openai/o3-deep-research:image": 765000, + "openrouter:openai/o3-deep-research:web_search": 1000000, + "openrouter:openai/o3-deep-research:input_cache_read": 250, + "openrouter:openai/o4-mini-deep-research:prompt": 200, + "openrouter:openai/o4-mini-deep-research:completion": 800, + "openrouter:openai/o4-mini-deep-research:image": 153000, + "openrouter:openai/o4-mini-deep-research:web_search": 1000000, + "openrouter:openai/o4-mini-deep-research:input_cache_read": 50, + "openrouter:nvidia/llama-3.3-nemotron-super-49b-v1.5:prompt": 10, + "openrouter:nvidia/llama-3.3-nemotron-super-49b-v1.5:completion": 40, + "openrouter:baidu/ernie-4.5-21b-a3b-thinking:prompt": 7, + "openrouter:baidu/ernie-4.5-21b-a3b-thinking:completion": 28, + "openrouter:google/gemini-2.5-flash-image:prompt": 30, + "openrouter:google/gemini-2.5-flash-image:completion": 250, + "openrouter:google/gemini-2.5-flash-image:image": 123800, + "openrouter:qwen/qwen3-vl-30b-a3b-thinking:prompt": 29, + "openrouter:qwen/qwen3-vl-30b-a3b-thinking:completion": 100, + "openrouter:qwen/qwen3-vl-30b-a3b-instruct:prompt": 29, + "openrouter:qwen/qwen3-vl-30b-a3b-instruct:completion": 99, + "openrouter:openai/gpt-5-pro:prompt": 1500, + "openrouter:openai/gpt-5-pro:completion": 12000, + "openrouter:z-ai/glm-4.6:prompt": 50, + "openrouter:z-ai/glm-4.6:completion": 175, + "openrouter:anthropic/claude-sonnet-4.5:prompt": 300, + "openrouter:anthropic/claude-sonnet-4.5:completion": 1500, + "openrouter:deepseek/deepseek-v3.2-exp:prompt": 27, + "openrouter:deepseek/deepseek-v3.2-exp:completion": 40, + "openrouter:thedrummer/cydonia-24b-v4.1:prompt": 30, + "openrouter:thedrummer/cydonia-24b-v4.1:completion": 50, + "openrouter:relace/relace-apply-3:prompt": 85, + "openrouter:relace/relace-apply-3:completion": 125, + "openrouter:google/gemini-2.5-flash-preview-09-2025:prompt": 30, + "openrouter:google/gemini-2.5-flash-preview-09-2025:completion": 250, + "openrouter:google/gemini-2.5-flash-preview-09-2025:image": 123800, + "openrouter:google/gemini-2.5-flash-preview-09-2025:input_cache_read": 7, + "openrouter:google/gemini-2.5-flash-preview-09-2025:input_cache_write": 38, + "openrouter:google/gemini-2.5-flash-lite-preview-09-2025:prompt": 10, + "openrouter:google/gemini-2.5-flash-lite-preview-09-2025:completion": 40, + "openrouter:qwen/qwen3-vl-235b-a22b-thinking:prompt": 45, + "openrouter:qwen/qwen3-vl-235b-a22b-thinking:completion": 350, + "openrouter:qwen/qwen3-vl-235b-a22b-instruct:prompt": 30, + "openrouter:qwen/qwen3-vl-235b-a22b-instruct:completion": 120, "openrouter:qwen/qwen3-max:prompt": 120, "openrouter:qwen/qwen3-max:completion": 600, "openrouter:qwen/qwen3-max:input_cache_read": 24, - "openrouter:moonshotai/kimi-k2-0905:prompt": 38, - "openrouter:moonshotai/kimi-k2-0905:completion": 152, - "openrouter:bytedance/seed-oss-36b-instruct:prompt": 10, - "openrouter:bytedance/seed-oss-36b-instruct:completion": 41, + "openrouter:qwen/qwen3-coder-plus:prompt": 100, + "openrouter:qwen/qwen3-coder-plus:completion": 500, + "openrouter:qwen/qwen3-coder-plus:input_cache_read": 10, + "openrouter:openai/gpt-5-codex:prompt": 125, + "openrouter:openai/gpt-5-codex:completion": 1000, + "openrouter:openai/gpt-5-codex:input_cache_read": 12, + "openrouter:deepseek/deepseek-v3.1-terminus:prompt": 23, + "openrouter:deepseek/deepseek-v3.1-terminus:completion": 90, + "openrouter:x-ai/grok-4-fast:prompt": 20, + "openrouter:x-ai/grok-4-fast:completion": 50, + "openrouter:x-ai/grok-4-fast:input_cache_read": 5, + "openrouter:alibaba/tongyi-deepresearch-30b-a3b:prompt": 9, + "openrouter:alibaba/tongyi-deepresearch-30b-a3b:completion": 40, + "openrouter:qwen/qwen3-coder-flash:prompt": 30, + "openrouter:qwen/qwen3-coder-flash:completion": 150, + "openrouter:qwen/qwen3-coder-flash:input_cache_read": 8, + "openrouter:arcee-ai/afm-4.5b:prompt": 5, + "openrouter:arcee-ai/afm-4.5b:completion": 15, + "openrouter:opengvlab/internvl3-78b:prompt": 7, + "openrouter:opengvlab/internvl3-78b:completion": 26, + "openrouter:qwen/qwen3-next-80b-a3b-thinking:prompt": 14, + "openrouter:qwen/qwen3-next-80b-a3b-thinking:completion": 120, + "openrouter:qwen/qwen3-next-80b-a3b-instruct:prompt": 10, + "openrouter:qwen/qwen3-next-80b-a3b-instruct:completion": 80, + "openrouter:meituan/longcat-flash-chat:prompt": 15, + "openrouter:meituan/longcat-flash-chat:completion": 75, + "openrouter:qwen/qwen-plus-2025-07-28:prompt": 40, + "openrouter:qwen/qwen-plus-2025-07-28:completion": 120, + "openrouter:qwen/qwen-plus-2025-07-28:thinking:prompt": 40, + "openrouter:qwen/qwen-plus-2025-07-28:thinking:completion": 400, + "openrouter:nvidia/nemotron-nano-9b-v2:prompt": 4, + "openrouter:nvidia/nemotron-nano-9b-v2:completion": 16, + "openrouter:moonshotai/kimi-k2-0905:prompt": 39, + "openrouter:moonshotai/kimi-k2-0905:completion": 190, "openrouter:deepcogito/cogito-v2-preview-llama-109b-moe:prompt": 18, "openrouter:deepcogito/cogito-v2-preview-llama-109b-moe:completion": 59, "openrouter:deepcogito/cogito-v2-preview-deepseek-671b:prompt": 125, "openrouter:deepcogito/cogito-v2-preview-deepseek-671b:completion": 125, "openrouter:stepfun-ai/step3:prompt": 57, "openrouter:stepfun-ai/step3:completion": 142, - "openrouter:qwen/qwen3-30b-a3b-thinking-2507:prompt": 9, - "openrouter:qwen/qwen3-30b-a3b-thinking-2507:completion": 36, + "openrouter:qwen/qwen3-30b-a3b-thinking-2507:prompt": 8, + "openrouter:qwen/qwen3-30b-a3b-thinking-2507:completion": 29, "openrouter:x-ai/grok-code-fast-1:prompt": 20, "openrouter:x-ai/grok-code-fast-1:completion": 150, "openrouter:x-ai/grok-code-fast-1:input_cache_read": 2, - "openrouter:nousresearch/hermes-4-70b:prompt": 13, - "openrouter:nousresearch/hermes-4-70b:completion": 51, - "openrouter:nousresearch/hermes-4-405b:prompt": 25, - "openrouter:nousresearch/hermes-4-405b:completion": 100, + "openrouter:nousresearch/hermes-4-70b:prompt": 11, + "openrouter:nousresearch/hermes-4-70b:completion": 38, + "openrouter:nousresearch/hermes-4-405b:prompt": 30, + "openrouter:nousresearch/hermes-4-405b:completion": 120, "openrouter:google/gemini-2.5-flash-image-preview:prompt": 30, "openrouter:google/gemini-2.5-flash-image-preview:completion": 250, "openrouter:google/gemini-2.5-flash-image-preview:image": 123800, - "openrouter:deepseek/deepseek-chat-v3.1:prompt": 25, - "openrouter:deepseek/deepseek-chat-v3.1:completion": 100, - "openrouter:deepseek/deepseek-v3.1-base:prompt": 25, - "openrouter:deepseek/deepseek-v3.1-base:completion": 100, + "openrouter:deepseek/deepseek-chat-v3.1:prompt": 20, + "openrouter:deepseek/deepseek-chat-v3.1:completion": 80, "openrouter:openai/gpt-4o-audio-preview:prompt": 250, "openrouter:openai/gpt-4o-audio-preview:completion": 1000, "openrouter:openai/gpt-4o-audio-preview:audio": 4000, @@ -41,8 +120,9 @@ export const OPENROUTER_COST_MAP = { "openrouter:baidu/ernie-4.5-21b-a3b:completion": 28, "openrouter:baidu/ernie-4.5-vl-28b-a3b:prompt": 14, "openrouter:baidu/ernie-4.5-vl-28b-a3b:completion": 56, - "openrouter:z-ai/glm-4.5v:prompt": 50, + "openrouter:z-ai/glm-4.5v:prompt": 60, "openrouter:z-ai/glm-4.5v:completion": 180, + "openrouter:z-ai/glm-4.5v:input_cache_read": 11, "openrouter:ai21/jamba-mini-1.7:prompt": 20, "openrouter:ai21/jamba-mini-1.7:completion": 40, "openrouter:ai21/jamba-large-1.7:prompt": 200, @@ -52,48 +132,49 @@ export const OPENROUTER_COST_MAP = { "openrouter:openai/gpt-5-chat:input_cache_read": 12, "openrouter:openai/gpt-5:prompt": 125, "openrouter:openai/gpt-5:completion": 1000, + "openrouter:openai/gpt-5:web_search": 1000000, "openrouter:openai/gpt-5:input_cache_read": 12, "openrouter:openai/gpt-5-mini:prompt": 25, "openrouter:openai/gpt-5-mini:completion": 200, + "openrouter:openai/gpt-5-mini:web_search": 1000000, "openrouter:openai/gpt-5-mini:input_cache_read": 3, "openrouter:openai/gpt-5-nano:prompt": 5, "openrouter:openai/gpt-5-nano:completion": 40, "openrouter:openai/gpt-5-nano:web_search": 1000000, "openrouter:openai/gpt-5-nano:input_cache_read": 1, - "openrouter:openai/gpt-oss-120b:prompt": 7, - "openrouter:openai/gpt-oss-120b:completion": 28, - "openrouter:openai/gpt-oss-20b:prompt": 4, - "openrouter:openai/gpt-oss-20b:completion": 15, + "openrouter:openai/gpt-oss-120b:prompt": 4, + "openrouter:openai/gpt-oss-120b:completion": 40, + "openrouter:openai/gpt-oss-20b:prompt": 3, + "openrouter:openai/gpt-oss-20b:completion": 14, "openrouter:anthropic/claude-opus-4.1:prompt": 1500, "openrouter:anthropic/claude-opus-4.1:completion": 7500, "openrouter:anthropic/claude-opus-4.1:image": 2400000, - "openrouter:anthropic/claude-opus-4.1:web_search": 1000000, "openrouter:anthropic/claude-opus-4.1:input_cache_read": 150, "openrouter:anthropic/claude-opus-4.1:input_cache_write": 1875, "openrouter:mistralai/codestral-2508:prompt": 30, "openrouter:mistralai/codestral-2508:completion": 90, - "openrouter:qwen/qwen3-coder-30b-a3b-instruct:prompt": 7, - "openrouter:qwen/qwen3-coder-30b-a3b-instruct:completion": 28, - "openrouter:qwen/qwen3-30b-a3b-instruct-2507:prompt": 7, - "openrouter:qwen/qwen3-30b-a3b-instruct-2507:completion": 28, - "openrouter:z-ai/glm-4.5:prompt": 41, - "openrouter:z-ai/glm-4.5:completion": 165, + "openrouter:qwen/qwen3-coder-30b-a3b-instruct:prompt": 6, + "openrouter:qwen/qwen3-coder-30b-a3b-instruct:completion": 25, + "openrouter:qwen/qwen3-30b-a3b-instruct-2507:prompt": 8, + "openrouter:qwen/qwen3-30b-a3b-instruct-2507:completion": 33, + "openrouter:z-ai/glm-4.5:prompt": 35, + "openrouter:z-ai/glm-4.5:completion": 155, "openrouter:z-ai/glm-4.5-air:prompt": 14, "openrouter:z-ai/glm-4.5-air:completion": 86, - "openrouter:qwen/qwen3-235b-a22b-thinking-2507:prompt": 10, - "openrouter:qwen/qwen3-235b-a22b-thinking-2507:completion": 39, + "openrouter:qwen/qwen3-235b-a22b-thinking-2507:prompt": 11, + "openrouter:qwen/qwen3-235b-a22b-thinking-2507:completion": 60, "openrouter:z-ai/glm-4-32b:prompt": 10, "openrouter:z-ai/glm-4-32b:completion": 10, - "openrouter:qwen/qwen3-coder:prompt": 25, - "openrouter:qwen/qwen3-coder:completion": 100, + "openrouter:qwen/qwen3-coder:prompt": 22, + "openrouter:qwen/qwen3-coder:completion": 95, "openrouter:bytedance/ui-tars-1.5-7b:prompt": 10, "openrouter:bytedance/ui-tars-1.5-7b:completion": 20, "openrouter:google/gemini-2.5-flash-lite:prompt": 10, "openrouter:google/gemini-2.5-flash-lite:completion": 40, - "openrouter:google/gemini-2.5-flash-lite:input_cache_read": 3, + "openrouter:google/gemini-2.5-flash-lite:input_cache_read": 1, "openrouter:google/gemini-2.5-flash-lite:input_cache_write": 18, - "openrouter:qwen/qwen3-235b-a22b-2507:prompt": 10, - "openrouter:qwen/qwen3-235b-a22b-2507:completion": 39, + "openrouter:qwen/qwen3-235b-a22b-2507:prompt": 8, + "openrouter:qwen/qwen3-235b-a22b-2507:completion": 55, "openrouter:switchpoint/router:prompt": 85, "openrouter:switchpoint/router:completion": 340, "openrouter:moonshotai/kimi-k2:prompt": 14, @@ -109,41 +190,45 @@ export const OPENROUTER_COST_MAP = { "openrouter:x-ai/grok-4:input_cache_read": 75, "openrouter:tencent/hunyuan-a13b-instruct:prompt": 3, "openrouter:tencent/hunyuan-a13b-instruct:completion": 3, + "openrouter:tngtech/deepseek-r1t2-chimera:prompt": 30, + "openrouter:tngtech/deepseek-r1t2-chimera:completion": 120, "openrouter:morph/morph-v3-large:prompt": 90, "openrouter:morph/morph-v3-large:completion": 190, - "openrouter:morph/morph-v3-fast:prompt": 90, - "openrouter:morph/morph-v3-fast:completion": 190, + "openrouter:morph/morph-v3-fast:prompt": 80, + "openrouter:morph/morph-v3-fast:completion": 120, "openrouter:baidu/ernie-4.5-vl-424b-a47b:prompt": 42, "openrouter:baidu/ernie-4.5-vl-424b-a47b:completion": 125, "openrouter:baidu/ernie-4.5-300b-a47b:prompt": 28, "openrouter:baidu/ernie-4.5-300b-a47b:completion": 110, - "openrouter:thedrummer/anubis-70b-v1.1:prompt": 40, - "openrouter:thedrummer/anubis-70b-v1.1:completion": 70, + "openrouter:thedrummer/anubis-70b-v1.1:prompt": 65, + "openrouter:thedrummer/anubis-70b-v1.1:completion": 100, "openrouter:inception/mercury:prompt": 25, "openrouter:inception/mercury:completion": 100, - "openrouter:mistralai/mistral-small-3.2-24b-instruct:prompt": 5, - "openrouter:mistralai/mistral-small-3.2-24b-instruct:completion": 10, - "openrouter:minimax/minimax-m1:prompt": 30, - "openrouter:minimax/minimax-m1:completion": 165, + "openrouter:mistralai/mistral-small-3.2-24b-instruct:prompt": 6, + "openrouter:mistralai/mistral-small-3.2-24b-instruct:completion": 18, + "openrouter:minimax/minimax-m1:prompt": 40, + "openrouter:minimax/minimax-m1:completion": 220, "openrouter:google/gemini-2.5-flash-lite-preview-06-17:prompt": 10, "openrouter:google/gemini-2.5-flash-lite-preview-06-17:completion": 40, + "openrouter:google/gemini-2.5-flash-lite-preview-06-17:audio": 30, "openrouter:google/gemini-2.5-flash-lite-preview-06-17:input_cache_read": 3, "openrouter:google/gemini-2.5-flash-lite-preview-06-17:input_cache_write": 18, "openrouter:google/gemini-2.5-flash:prompt": 30, "openrouter:google/gemini-2.5-flash:completion": 250, "openrouter:google/gemini-2.5-flash:image": 123800, - "openrouter:google/gemini-2.5-flash:input_cache_read": 7, + "openrouter:google/gemini-2.5-flash:input_cache_read": 3, "openrouter:google/gemini-2.5-flash:input_cache_write": 38, "openrouter:google/gemini-2.5-pro:prompt": 125, "openrouter:google/gemini-2.5-pro:completion": 1000, "openrouter:google/gemini-2.5-pro:image": 516000, - "openrouter:google/gemini-2.5-pro:input_cache_read": 31, + "openrouter:google/gemini-2.5-pro:input_cache_read": 12, "openrouter:google/gemini-2.5-pro:input_cache_write": 163, "openrouter:moonshotai/kimi-dev-72b:prompt": 29, "openrouter:moonshotai/kimi-dev-72b:completion": 115, "openrouter:openai/o3-pro:prompt": 2000, "openrouter:openai/o3-pro:completion": 8000, "openrouter:openai/o3-pro:image": 1530000, + "openrouter:openai/o3-pro:web_search": 1000000, "openrouter:x-ai/grok-3-mini:prompt": 30, "openrouter:x-ai/grok-3-mini:completion": 50, "openrouter:x-ai/grok-3-mini:input_cache_read": 7, @@ -161,14 +246,13 @@ export const OPENROUTER_COST_MAP = { "openrouter:google/gemini-2.5-pro-preview:image": 516000, "openrouter:google/gemini-2.5-pro-preview:input_cache_read": 31, "openrouter:google/gemini-2.5-pro-preview:input_cache_write": 163, - "openrouter:deepseek/deepseek-r1-0528-qwen3-8b:prompt": 1, - "openrouter:deepseek/deepseek-r1-0528-qwen3-8b:completion": 5, - "openrouter:deepseek/deepseek-r1-0528:prompt": 25, - "openrouter:deepseek/deepseek-r1-0528:completion": 100, + "openrouter:deepseek/deepseek-r1-0528-qwen3-8b:prompt": 3, + "openrouter:deepseek/deepseek-r1-0528-qwen3-8b:completion": 11, + "openrouter:deepseek/deepseek-r1-0528:prompt": 40, + "openrouter:deepseek/deepseek-r1-0528:completion": 175, "openrouter:anthropic/claude-opus-4:prompt": 1500, "openrouter:anthropic/claude-opus-4:completion": 7500, "openrouter:anthropic/claude-opus-4:image": 2400000, - "openrouter:anthropic/claude-opus-4:web_search": 1000000, "openrouter:anthropic/claude-opus-4:input_cache_read": 150, "openrouter:anthropic/claude-opus-4:input_cache_write": 1875, "openrouter:anthropic/claude-sonnet-4:prompt": 300, @@ -176,15 +260,15 @@ export const OPENROUTER_COST_MAP = { "openrouter:anthropic/claude-sonnet-4:image": 480000, "openrouter:anthropic/claude-sonnet-4:input_cache_read": 30, "openrouter:anthropic/claude-sonnet-4:input_cache_write": 375, - "openrouter:mistralai/devstral-small-2505:prompt": 4, - "openrouter:mistralai/devstral-small-2505:completion": 14, + "openrouter:mistralai/devstral-small-2505:prompt": 5, + "openrouter:mistralai/devstral-small-2505:completion": 22, "openrouter:google/gemma-3n-e4b-it:prompt": 2, "openrouter:google/gemma-3n-e4b-it:completion": 4, "openrouter:openai/codex-mini:prompt": 150, "openrouter:openai/codex-mini:completion": 600, "openrouter:openai/codex-mini:input_cache_read": 38, - "openrouter:nousresearch/deephermes-3-mistral-24b-preview:prompt": 13, - "openrouter:nousresearch/deephermes-3-mistral-24b-preview:completion": 51, + "openrouter:nousresearch/deephermes-3-mistral-24b-preview:prompt": 15, + "openrouter:nousresearch/deephermes-3-mistral-24b-preview:completion": 59, "openrouter:mistralai/mistral-medium-3:prompt": 40, "openrouter:mistralai/mistral-medium-3:completion": 200, "openrouter:google/gemini-2.5-pro-preview-05-06:prompt": 125, @@ -208,57 +292,61 @@ export const OPENROUTER_COST_MAP = { "openrouter:deepseek/deepseek-prover-v2:completion": 218, "openrouter:meta-llama/llama-guard-4-12b:prompt": 18, "openrouter:meta-llama/llama-guard-4-12b:completion": 18, - "openrouter:qwen/qwen3-30b-a3b:prompt": 4, - "openrouter:qwen/qwen3-30b-a3b:completion": 14, + "openrouter:qwen/qwen3-30b-a3b:prompt": 6, + "openrouter:qwen/qwen3-30b-a3b:completion": 22, "openrouter:qwen/qwen3-8b:prompt": 4, "openrouter:qwen/qwen3-8b:completion": 14, - "openrouter:qwen/qwen3-14b:prompt": 6, - "openrouter:qwen/qwen3-14b:completion": 24, - "openrouter:qwen/qwen3-32b:prompt": 3, - "openrouter:qwen/qwen3-32b:completion": 13, - "openrouter:qwen/qwen3-235b-a22b:prompt": 13, - "openrouter:qwen/qwen3-235b-a22b:completion": 60, - "openrouter:tngtech/deepseek-r1t-chimera:prompt": 25, - "openrouter:tngtech/deepseek-r1t-chimera:completion": 100, - "openrouter:microsoft/mai-ds-r1:prompt": 25, - "openrouter:microsoft/mai-ds-r1:completion": 100, - "openrouter:thudm/glm-z1-32b:prompt": 4, - "openrouter:thudm/glm-z1-32b:completion": 14, - "openrouter:thudm/glm-4-32b:prompt": 55, - "openrouter:thudm/glm-4-32b:completion": 166, + "openrouter:qwen/qwen3-14b:prompt": 5, + "openrouter:qwen/qwen3-14b:completion": 22, + "openrouter:qwen/qwen3-32b:prompt": 5, + "openrouter:qwen/qwen3-32b:completion": 20, + "openrouter:qwen/qwen3-235b-a22b:prompt": 18, + "openrouter:qwen/qwen3-235b-a22b:completion": 54, + "openrouter:tngtech/deepseek-r1t-chimera:prompt": 30, + "openrouter:tngtech/deepseek-r1t-chimera:completion": 120, + "openrouter:microsoft/mai-ds-r1:prompt": 30, + "openrouter:microsoft/mai-ds-r1:completion": 120, + "openrouter:thudm/glm-z1-32b:prompt": 5, + "openrouter:thudm/glm-z1-32b:completion": 22, "openrouter:openai/o4-mini-high:prompt": 110, "openrouter:openai/o4-mini-high:completion": 440, "openrouter:openai/o4-mini-high:image": 84150, + "openrouter:openai/o4-mini-high:web_search": 1000000, "openrouter:openai/o4-mini-high:input_cache_read": 28, "openrouter:openai/o3:prompt": 200, "openrouter:openai/o3:completion": 800, "openrouter:openai/o3:image": 153000, + "openrouter:openai/o3:web_search": 1000000, "openrouter:openai/o3:input_cache_read": 50, "openrouter:openai/o4-mini:prompt": 110, "openrouter:openai/o4-mini:completion": 440, "openrouter:openai/o4-mini:image": 84150, + "openrouter:openai/o4-mini:web_search": 1000000, "openrouter:openai/o4-mini:input_cache_read": 28, - "openrouter:shisa-ai/shisa-v2-llama3.3-70b:prompt": 4, - "openrouter:shisa-ai/shisa-v2-llama3.3-70b:completion": 14, + "openrouter:shisa-ai/shisa-v2-llama3.3-70b:prompt": 5, + "openrouter:shisa-ai/shisa-v2-llama3.3-70b:completion": 22, + "openrouter:qwen/qwen2.5-coder-7b-instruct:prompt": 3, + "openrouter:qwen/qwen2.5-coder-7b-instruct:completion": 9, "openrouter:openai/gpt-4.1:prompt": 200, "openrouter:openai/gpt-4.1:completion": 800, + "openrouter:openai/gpt-4.1:web_search": 1000000, "openrouter:openai/gpt-4.1:input_cache_read": 50, "openrouter:openai/gpt-4.1-mini:prompt": 40, "openrouter:openai/gpt-4.1-mini:completion": 160, + "openrouter:openai/gpt-4.1-mini:web_search": 1000000, "openrouter:openai/gpt-4.1-mini:input_cache_read": 10, "openrouter:openai/gpt-4.1-nano:prompt": 10, "openrouter:openai/gpt-4.1-nano:completion": 40, + "openrouter:openai/gpt-4.1-nano:web_search": 1000000, "openrouter:openai/gpt-4.1-nano:input_cache_read": 3, "openrouter:eleutherai/llemma_7b:prompt": 80, "openrouter:eleutherai/llemma_7b:completion": 120, "openrouter:alfredpros/codellama-7b-instruct-solidity:prompt": 80, "openrouter:alfredpros/codellama-7b-instruct-solidity:completion": 120, - "openrouter:arliai/qwq-32b-arliai-rpr-v1:prompt": 2, - "openrouter:arliai/qwq-32b-arliai-rpr-v1:completion": 7, + "openrouter:arliai/qwq-32b-arliai-rpr-v1:prompt": 3, + "openrouter:arliai/qwq-32b-arliai-rpr-v1:completion": 11, "openrouter:agentica-org/deepcoder-14b-preview:prompt": 1, "openrouter:agentica-org/deepcoder-14b-preview:completion": 1, - "openrouter:moonshotai/kimi-vl-a3b-thinking:prompt": 6, - "openrouter:moonshotai/kimi-vl-a3b-thinking:completion": 25, "openrouter:x-ai/grok-3-mini-beta:prompt": 30, "openrouter:x-ai/grok-3-mini-beta:completion": 50, "openrouter:x-ai/grok-3-mini-beta:input_cache_read": 7, @@ -272,23 +360,24 @@ export const OPENROUTER_COST_MAP = { "openrouter:meta-llama/llama-4-maverick:image": 66840, "openrouter:meta-llama/llama-4-scout:prompt": 8, "openrouter:meta-llama/llama-4-scout:completion": 30, + "openrouter:meta-llama/llama-4-scout:image": 33420, "openrouter:allenai/molmo-7b-d:prompt": 10, "openrouter:allenai/molmo-7b-d:completion": 20, - "openrouter:qwen/qwen2.5-vl-32b-instruct:prompt": 4, - "openrouter:qwen/qwen2.5-vl-32b-instruct:completion": 14, - "openrouter:deepseek/deepseek-chat-v3-0324:prompt": 25, - "openrouter:deepseek/deepseek-chat-v3-0324:completion": 100, + "openrouter:qwen/qwen2.5-vl-32b-instruct:prompt": 5, + "openrouter:qwen/qwen2.5-vl-32b-instruct:completion": 22, + "openrouter:deepseek/deepseek-chat-v3-0324:prompt": 24, + "openrouter:deepseek/deepseek-chat-v3-0324:completion": 84, "openrouter:openai/o1-pro:prompt": 15000, "openrouter:openai/o1-pro:completion": 60000, "openrouter:openai/o1-pro:image": 21675000, - "openrouter:mistralai/mistral-small-3.1-24b-instruct:prompt": 4, - "openrouter:mistralai/mistral-small-3.1-24b-instruct:completion": 15, - "openrouter:allenai/olmo-2-0325-32b-instruct:prompt": 100, - "openrouter:allenai/olmo-2-0325-32b-instruct:completion": 150, - "openrouter:google/gemma-3-4b-it:prompt": 4, - "openrouter:google/gemma-3-4b-it:completion": 8, - "openrouter:google/gemma-3-12b-it:prompt": 4, - "openrouter:google/gemma-3-12b-it:completion": 14, + "openrouter:mistralai/mistral-small-3.1-24b-instruct:prompt": 5, + "openrouter:mistralai/mistral-small-3.1-24b-instruct:completion": 10, + "openrouter:allenai/olmo-2-0325-32b-instruct:prompt": 20, + "openrouter:allenai/olmo-2-0325-32b-instruct:completion": 35, + "openrouter:google/gemma-3-4b-it:prompt": 2, + "openrouter:google/gemma-3-4b-it:completion": 7, + "openrouter:google/gemma-3-12b-it:prompt": 3, + "openrouter:google/gemma-3-12b-it:completion": 10, "openrouter:cohere/command-a:prompt": 250, "openrouter:cohere/command-a:completion": 1000, "openrouter:openai/gpt-4o-mini-search-preview:prompt": 15, @@ -299,12 +388,11 @@ export const OPENROUTER_COST_MAP = { "openrouter:openai/gpt-4o-search-preview:completion": 1000, "openrouter:openai/gpt-4o-search-preview:request": 3500000, "openrouter:openai/gpt-4o-search-preview:image": 361300, - "openrouter:google/gemma-3-27b-it:prompt": 7, - "openrouter:google/gemma-3-27b-it:completion": 26, - "openrouter:thedrummer/anubis-pro-105b-v1:prompt": 50, - "openrouter:thedrummer/anubis-pro-105b-v1:completion": 100, - "openrouter:thedrummer/skyfall-36b-v2:prompt": 4, - "openrouter:thedrummer/skyfall-36b-v2:completion": 16, + "openrouter:google/gemma-3-27b-it:prompt": 9, + "openrouter:google/gemma-3-27b-it:completion": 16, + "openrouter:google/gemma-3-27b-it:image": 2560, + "openrouter:thedrummer/skyfall-36b-v2:prompt": 8, + "openrouter:thedrummer/skyfall-36b-v2:completion": 33, "openrouter:microsoft/phi-4-multimodal-instruct:prompt": 5, "openrouter:microsoft/phi-4-multimodal-instruct:completion": 10, "openrouter:microsoft/phi-4-multimodal-instruct:image": 17685, @@ -320,6 +408,8 @@ export const OPENROUTER_COST_MAP = { "openrouter:perplexity/sonar-deep-research:internal_reasoning": 300, "openrouter:qwen/qwq-32b:prompt": 15, "openrouter:qwen/qwq-32b:completion": 40, + "openrouter:nousresearch/deephermes-3-llama-3-8b-preview:prompt": 3, + "openrouter:nousresearch/deephermes-3-llama-3-8b-preview:completion": 11, "openrouter:google/gemini-2.0-flash-lite-001:prompt": 7, "openrouter:google/gemini-2.0-flash-lite-001:completion": 30, "openrouter:anthropic/claude-3.7-sonnet:prompt": 300, @@ -332,21 +422,15 @@ export const OPENROUTER_COST_MAP = { "openrouter:anthropic/claude-3.7-sonnet:thinking:image": 480000, "openrouter:anthropic/claude-3.7-sonnet:thinking:input_cache_read": 30, "openrouter:anthropic/claude-3.7-sonnet:thinking:input_cache_write": 375, - "openrouter:perplexity/r1-1776:prompt": 200, - "openrouter:perplexity/r1-1776:completion": 800, "openrouter:mistralai/mistral-saba:prompt": 20, "openrouter:mistralai/mistral-saba:completion": 60, - "openrouter:cognitivecomputations/dolphin3.0-r1-mistral-24b:prompt": 1, - "openrouter:cognitivecomputations/dolphin3.0-r1-mistral-24b:completion": 3, - "openrouter:cognitivecomputations/dolphin3.0-mistral-24b:prompt": 3, - "openrouter:cognitivecomputations/dolphin3.0-mistral-24b:completion": 11, + "openrouter:cognitivecomputations/dolphin3.0-mistral-24b:prompt": 4, + "openrouter:cognitivecomputations/dolphin3.0-mistral-24b:completion": 17, "openrouter:meta-llama/llama-guard-3-8b:prompt": 2, "openrouter:meta-llama/llama-guard-3-8b:completion": 6, "openrouter:openai/o3-mini-high:prompt": 110, "openrouter:openai/o3-mini-high:completion": 440, "openrouter:openai/o3-mini-high:input_cache_read": 55, - "openrouter:deepseek/deepseek-r1-distill-llama-8b:prompt": 4, - "openrouter:deepseek/deepseek-r1-distill-llama-8b:completion": 4, "openrouter:google/gemini-2.0-flash-001:prompt": 10, "openrouter:google/gemini-2.0-flash-001:completion": 40, "openrouter:google/gemini-2.0-flash-001:image": 2580, @@ -368,8 +452,8 @@ export const OPENROUTER_COST_MAP = { "openrouter:qwen/qwen-turbo:prompt": 5, "openrouter:qwen/qwen-turbo:completion": 20, "openrouter:qwen/qwen-turbo:input_cache_read": 2, - "openrouter:qwen/qwen2.5-vl-72b-instruct:prompt": 25, - "openrouter:qwen/qwen2.5-vl-72b-instruct:completion": 100, + "openrouter:qwen/qwen2.5-vl-72b-instruct:prompt": 8, + "openrouter:qwen/qwen2.5-vl-72b-instruct:completion": 33, "openrouter:qwen/qwen-plus:prompt": 40, "openrouter:qwen/qwen-plus:completion": 120, "openrouter:qwen/qwen-plus:input_cache_read": 16, @@ -379,10 +463,10 @@ export const OPENROUTER_COST_MAP = { "openrouter:openai/o3-mini:prompt": 110, "openrouter:openai/o3-mini:completion": 440, "openrouter:openai/o3-mini:input_cache_read": 55, - "openrouter:mistralai/mistral-small-24b-instruct-2501:prompt": 4, - "openrouter:mistralai/mistral-small-24b-instruct-2501:completion": 15, - "openrouter:deepseek/deepseek-r1-distill-qwen-32b:prompt": 7, - "openrouter:deepseek/deepseek-r1-distill-qwen-32b:completion": 15, + "openrouter:mistralai/mistral-small-24b-instruct-2501:prompt": 5, + "openrouter:mistralai/mistral-small-24b-instruct-2501:completion": 8, + "openrouter:deepseek/deepseek-r1-distill-qwen-32b:prompt": 27, + "openrouter:deepseek/deepseek-r1-distill-qwen-32b:completion": 27, "openrouter:deepseek/deepseek-r1-distill-qwen-14b:prompt": 15, "openrouter:deepseek/deepseek-r1-distill-qwen-14b:completion": 15, "openrouter:perplexity/sonar-reasoning:prompt": 100, @@ -405,23 +489,20 @@ export const OPENROUTER_COST_MAP = { "openrouter:mistralai/codestral-2501:completion": 90, "openrouter:microsoft/phi-4:prompt": 6, "openrouter:microsoft/phi-4:completion": 14, - "openrouter:deepseek/deepseek-chat:prompt": 25, - "openrouter:deepseek/deepseek-chat:completion": 100, + "openrouter:sao10k/l3.1-70b-hanami-x1:prompt": 300, + "openrouter:sao10k/l3.1-70b-hanami-x1:completion": 300, + "openrouter:deepseek/deepseek-chat:prompt": 30, + "openrouter:deepseek/deepseek-chat:completion": 85, "openrouter:sao10k/l3.3-euryale-70b:prompt": 65, "openrouter:sao10k/l3.3-euryale-70b:completion": 75, "openrouter:openai/o1:prompt": 1500, "openrouter:openai/o1:completion": 6000, "openrouter:openai/o1:image": 2167500, "openrouter:openai/o1:input_cache_read": 750, - "openrouter:x-ai/grok-2-vision-1212:prompt": 200, - "openrouter:x-ai/grok-2-vision-1212:completion": 1000, - "openrouter:x-ai/grok-2-vision-1212:image": 360000, - "openrouter:x-ai/grok-2-1212:prompt": 200, - "openrouter:x-ai/grok-2-1212:completion": 1000, "openrouter:cohere/command-r7b-12-2024:prompt": 4, "openrouter:cohere/command-r7b-12-2024:completion": 15, - "openrouter:meta-llama/llama-3.3-70b-instruct:prompt": 4, - "openrouter:meta-llama/llama-3.3-70b-instruct:completion": 12, + "openrouter:meta-llama/llama-3.3-70b-instruct:prompt": 13, + "openrouter:meta-llama/llama-3.3-70b-instruct:completion": 39, "openrouter:amazon/nova-lite-v1:prompt": 6, "openrouter:amazon/nova-lite-v1:completion": 24, "openrouter:amazon/nova-lite-v1:image": 9000, @@ -430,8 +511,6 @@ export const OPENROUTER_COST_MAP = { "openrouter:amazon/nova-pro-v1:prompt": 80, "openrouter:amazon/nova-pro-v1:completion": 320, "openrouter:amazon/nova-pro-v1:image": 120000, - "openrouter:qwen/qwq-32b-preview:prompt": 20, - "openrouter:qwen/qwq-32b-preview:completion": 20, "openrouter:openai/gpt-4o-2024-11-20:prompt": 250, "openrouter:openai/gpt-4o-2024-11-20:completion": 1000, "openrouter:openai/gpt-4o-2024-11-20:image": 361300, @@ -443,8 +522,8 @@ export const OPENROUTER_COST_MAP = { "openrouter:mistralai/pixtral-large-2411:prompt": 200, "openrouter:mistralai/pixtral-large-2411:completion": 600, "openrouter:mistralai/pixtral-large-2411:image": 288800, - "openrouter:qwen/qwen-2.5-coder-32b-instruct:prompt": 6, - "openrouter:qwen/qwen-2.5-coder-32b-instruct:completion": 15, + "openrouter:qwen/qwen-2.5-coder-32b-instruct:prompt": 4, + "openrouter:qwen/qwen-2.5-coder-32b-instruct:completion": 16, "openrouter:raifle/sorcererlm-8x22b:prompt": 450, "openrouter:raifle/sorcererlm-8x22b:completion": 450, "openrouter:thedrummer/unslopnemo-12b:prompt": 40, @@ -458,102 +537,98 @@ export const OPENROUTER_COST_MAP = { "openrouter:anthropic/claude-3.5-haiku-20241022:completion": 400, "openrouter:anthropic/claude-3.5-haiku-20241022:input_cache_read": 8, "openrouter:anthropic/claude-3.5-haiku-20241022:input_cache_write": 100, - "openrouter:anthracite-org/magnum-v4-72b:prompt": 200, + "openrouter:anthracite-org/magnum-v4-72b:prompt": 250, "openrouter:anthracite-org/magnum-v4-72b:completion": 500, "openrouter:anthropic/claude-3.5-sonnet:prompt": 300, "openrouter:anthropic/claude-3.5-sonnet:completion": 1500, "openrouter:anthropic/claude-3.5-sonnet:image": 480000, "openrouter:anthropic/claude-3.5-sonnet:input_cache_read": 30, "openrouter:anthropic/claude-3.5-sonnet:input_cache_write": 375, - "openrouter:mistralai/ministral-8b:prompt": 10, - "openrouter:mistralai/ministral-8b:completion": 10, "openrouter:mistralai/ministral-3b:prompt": 4, "openrouter:mistralai/ministral-3b:completion": 4, + "openrouter:mistralai/ministral-8b:prompt": 10, + "openrouter:mistralai/ministral-8b:completion": 10, "openrouter:qwen/qwen-2.5-7b-instruct:prompt": 4, "openrouter:qwen/qwen-2.5-7b-instruct:completion": 10, - "openrouter:nvidia/llama-3.1-nemotron-70b-instruct:prompt": 12, - "openrouter:nvidia/llama-3.1-nemotron-70b-instruct:completion": 30, + "openrouter:nvidia/llama-3.1-nemotron-70b-instruct:prompt": 60, + "openrouter:nvidia/llama-3.1-nemotron-70b-instruct:completion": 60, "openrouter:inflection/inflection-3-productivity:prompt": 250, "openrouter:inflection/inflection-3-productivity:completion": 1000, "openrouter:inflection/inflection-3-pi:prompt": 250, "openrouter:inflection/inflection-3-pi:completion": 1000, - "openrouter:google/gemini-flash-1.5-8b:prompt": 4, - "openrouter:google/gemini-flash-1.5-8b:completion": 15, - "openrouter:google/gemini-flash-1.5-8b:input_cache_read": 1, - "openrouter:google/gemini-flash-1.5-8b:input_cache_write": 6, "openrouter:thedrummer/rocinante-12b:prompt": 17, "openrouter:thedrummer/rocinante-12b:completion": 43, "openrouter:anthracite-org/magnum-v2-72b:prompt": 300, "openrouter:anthracite-org/magnum-v2-72b:completion": 300, - "openrouter:meta-llama/llama-3.2-3b-instruct:prompt": 1, + "openrouter:meta-llama/llama-3.2-3b-instruct:prompt": 2, "openrouter:meta-llama/llama-3.2-3b-instruct:completion": 2, "openrouter:meta-llama/llama-3.2-1b-instruct:prompt": 1, "openrouter:meta-llama/llama-3.2-1b-instruct:completion": 1, - "openrouter:meta-llama/llama-3.2-90b-vision-instruct:prompt": 35, - "openrouter:meta-llama/llama-3.2-90b-vision-instruct:completion": 40, - "openrouter:meta-llama/llama-3.2-90b-vision-instruct:image": 50580, "openrouter:meta-llama/llama-3.2-11b-vision-instruct:prompt": 5, "openrouter:meta-llama/llama-3.2-11b-vision-instruct:completion": 5, "openrouter:meta-llama/llama-3.2-11b-vision-instruct:image": 7948, + "openrouter:meta-llama/llama-3.2-90b-vision-instruct:prompt": 35, + "openrouter:meta-llama/llama-3.2-90b-vision-instruct:completion": 40, + "openrouter:meta-llama/llama-3.2-90b-vision-instruct:image": 50580, "openrouter:qwen/qwen-2.5-72b-instruct:prompt": 7, "openrouter:qwen/qwen-2.5-72b-instruct:completion": 26, "openrouter:neversleep/llama-3.1-lumimaid-8b:prompt": 9, "openrouter:neversleep/llama-3.1-lumimaid-8b:completion": 60, - "openrouter:openai/o1-mini:prompt": 110, - "openrouter:openai/o1-mini:completion": 440, - "openrouter:openai/o1-mini:input_cache_read": 55, "openrouter:openai/o1-mini-2024-09-12:prompt": 110, "openrouter:openai/o1-mini-2024-09-12:completion": 440, "openrouter:openai/o1-mini-2024-09-12:input_cache_read": 55, + "openrouter:openai/o1-mini:prompt": 110, + "openrouter:openai/o1-mini:completion": 440, + "openrouter:openai/o1-mini:input_cache_read": 55, "openrouter:mistralai/pixtral-12b:prompt": 10, "openrouter:mistralai/pixtral-12b:completion": 10, "openrouter:mistralai/pixtral-12b:image": 14450, - "openrouter:cohere/command-r-plus-08-2024:prompt": 250, - "openrouter:cohere/command-r-plus-08-2024:completion": 1000, "openrouter:cohere/command-r-08-2024:prompt": 15, "openrouter:cohere/command-r-08-2024:completion": 60, + "openrouter:cohere/command-r-plus-08-2024:prompt": 250, + "openrouter:cohere/command-r-plus-08-2024:completion": 1000, + "openrouter:sao10k/l3.1-euryale-70b:prompt": 65, + "openrouter:sao10k/l3.1-euryale-70b:completion": 75, "openrouter:qwen/qwen-2.5-vl-7b-instruct:prompt": 20, "openrouter:qwen/qwen-2.5-vl-7b-instruct:completion": 20, "openrouter:qwen/qwen-2.5-vl-7b-instruct:image": 14450, - "openrouter:sao10k/l3.1-euryale-70b:prompt": 65, - "openrouter:sao10k/l3.1-euryale-70b:completion": 75, "openrouter:microsoft/phi-3.5-mini-128k-instruct:prompt": 10, "openrouter:microsoft/phi-3.5-mini-128k-instruct:completion": 10, - "openrouter:nousresearch/hermes-3-llama-3.1-70b:prompt": 10, - "openrouter:nousresearch/hermes-3-llama-3.1-70b:completion": 28, - "openrouter:nousresearch/hermes-3-llama-3.1-405b:prompt": 70, - "openrouter:nousresearch/hermes-3-llama-3.1-405b:completion": 80, + "openrouter:nousresearch/hermes-3-llama-3.1-70b:prompt": 30, + "openrouter:nousresearch/hermes-3-llama-3.1-70b:completion": 30, + "openrouter:nousresearch/hermes-3-llama-3.1-405b:prompt": 100, + "openrouter:nousresearch/hermes-3-llama-3.1-405b:completion": 100, "openrouter:openai/chatgpt-4o-latest:prompt": 500, "openrouter:openai/chatgpt-4o-latest:completion": 1500, "openrouter:openai/chatgpt-4o-latest:image": 722500, - "openrouter:sao10k/l3-lunaris-8b:prompt": 2, + "openrouter:sao10k/l3-lunaris-8b:prompt": 4, "openrouter:sao10k/l3-lunaris-8b:completion": 5, "openrouter:openai/gpt-4o-2024-08-06:prompt": 250, "openrouter:openai/gpt-4o-2024-08-06:completion": 1000, "openrouter:openai/gpt-4o-2024-08-06:image": 361300, "openrouter:openai/gpt-4o-2024-08-06:input_cache_read": 125, - "openrouter:meta-llama/llama-3.1-405b:prompt": 200, - "openrouter:meta-llama/llama-3.1-405b:completion": 200, - "openrouter:meta-llama/llama-3.1-8b-instruct:prompt": 1, - "openrouter:meta-llama/llama-3.1-8b-instruct:completion": 2, + "openrouter:meta-llama/llama-3.1-405b:prompt": 400, + "openrouter:meta-llama/llama-3.1-405b:completion": 400, + "openrouter:meta-llama/llama-3.1-8b-instruct:prompt": 2, + "openrouter:meta-llama/llama-3.1-8b-instruct:completion": 3, + "openrouter:meta-llama/llama-3.1-70b-instruct:prompt": 40, + "openrouter:meta-llama/llama-3.1-70b-instruct:completion": 40, "openrouter:meta-llama/llama-3.1-405b-instruct:prompt": 80, "openrouter:meta-llama/llama-3.1-405b-instruct:completion": 80, - "openrouter:meta-llama/llama-3.1-70b-instruct:prompt": 10, - "openrouter:meta-llama/llama-3.1-70b-instruct:completion": 28, "openrouter:mistralai/mistral-nemo:prompt": 2, - "openrouter:mistralai/mistral-nemo:completion": 7, - "openrouter:openai/gpt-4o-mini:prompt": 15, - "openrouter:openai/gpt-4o-mini:completion": 60, - "openrouter:openai/gpt-4o-mini:image": 21700, - "openrouter:openai/gpt-4o-mini:input_cache_read": 7, + "openrouter:mistralai/mistral-nemo:completion": 4, "openrouter:openai/gpt-4o-mini-2024-07-18:prompt": 15, "openrouter:openai/gpt-4o-mini-2024-07-18:completion": 60, "openrouter:openai/gpt-4o-mini-2024-07-18:image": 722500, "openrouter:openai/gpt-4o-mini-2024-07-18:input_cache_read": 7, + "openrouter:openai/gpt-4o-mini:prompt": 15, + "openrouter:openai/gpt-4o-mini:completion": 60, + "openrouter:openai/gpt-4o-mini:image": 21700, + "openrouter:openai/gpt-4o-mini:input_cache_read": 7, "openrouter:google/gemma-2-27b-it:prompt": 65, "openrouter:google/gemma-2-27b-it:completion": 65, - "openrouter:google/gemma-2-9b-it:prompt": 2, - "openrouter:google/gemma-2-9b-it:completion": 4, + "openrouter:google/gemma-2-9b-it:prompt": 1, + "openrouter:google/gemma-2-9b-it:completion": 3, "openrouter:anthropic/claude-3.5-sonnet-20240620:prompt": 300, "openrouter:anthropic/claude-3.5-sonnet-20240620:completion": 1500, "openrouter:anthropic/claude-3.5-sonnet-20240620:image": 480000, @@ -561,25 +636,19 @@ export const OPENROUTER_COST_MAP = { "openrouter:anthropic/claude-3.5-sonnet-20240620:input_cache_write": 375, "openrouter:sao10k/l3-euryale-70b:prompt": 148, "openrouter:sao10k/l3-euryale-70b:completion": 148, - "openrouter:cognitivecomputations/dolphin-mixtral-8x22b:prompt": 90, - "openrouter:cognitivecomputations/dolphin-mixtral-8x22b:completion": 90, + "openrouter:mistralai/mistral-7b-instruct-v0.3:prompt": 3, + "openrouter:mistralai/mistral-7b-instruct-v0.3:completion": 5, "openrouter:mistralai/mistral-7b-instruct:prompt": 3, "openrouter:mistralai/mistral-7b-instruct:completion": 5, "openrouter:nousresearch/hermes-2-pro-llama-3-8b:prompt": 3, - "openrouter:nousresearch/hermes-2-pro-llama-3-8b:completion": 4, - "openrouter:mistralai/mistral-7b-instruct-v0.3:prompt": 3, - "openrouter:mistralai/mistral-7b-instruct-v0.3:completion": 5, + "openrouter:nousresearch/hermes-2-pro-llama-3-8b:completion": 8, "openrouter:microsoft/phi-3-mini-128k-instruct:prompt": 10, "openrouter:microsoft/phi-3-mini-128k-instruct:completion": 10, "openrouter:microsoft/phi-3-medium-128k-instruct:prompt": 100, "openrouter:microsoft/phi-3-medium-128k-instruct:completion": 100, - "openrouter:neversleep/llama-3-lumimaid-70b:prompt": 400, - "openrouter:neversleep/llama-3-lumimaid-70b:completion": 600, - "openrouter:google/gemini-flash-1.5:prompt": 7, - "openrouter:google/gemini-flash-1.5:completion": 30, - "openrouter:google/gemini-flash-1.5:image": 4000, - "openrouter:google/gemini-flash-1.5:input_cache_read": 2, - "openrouter:google/gemini-flash-1.5:input_cache_write": 16, + "openrouter:openai/gpt-4o-2024-05-13:prompt": 500, + "openrouter:openai/gpt-4o-2024-05-13:completion": 1500, + "openrouter:openai/gpt-4o-2024-05-13:image": 722500, "openrouter:openai/gpt-4o:prompt": 250, "openrouter:openai/gpt-4o:completion": 1000, "openrouter:openai/gpt-4o:image": 361300, @@ -589,9 +658,6 @@ export const OPENROUTER_COST_MAP = { "openrouter:openai/gpt-4o:extended:image": 722500, "openrouter:meta-llama/llama-guard-2-8b:prompt": 20, "openrouter:meta-llama/llama-guard-2-8b:completion": 20, - "openrouter:openai/gpt-4o-2024-05-13:prompt": 500, - "openrouter:openai/gpt-4o-2024-05-13:completion": 1500, - "openrouter:openai/gpt-4o-2024-05-13:image": 722500, "openrouter:meta-llama/llama-3-8b-instruct:prompt": 3, "openrouter:meta-llama/llama-3-8b-instruct:completion": 6, "openrouter:meta-llama/llama-3-70b-instruct:prompt": 30, @@ -600,22 +666,9 @@ export const OPENROUTER_COST_MAP = { "openrouter:mistralai/mixtral-8x22b-instruct:completion": 90, "openrouter:microsoft/wizardlm-2-8x22b:prompt": 48, "openrouter:microsoft/wizardlm-2-8x22b:completion": 48, - "openrouter:google/gemini-pro-1.5:prompt": 125, - "openrouter:google/gemini-pro-1.5:completion": 500, - "openrouter:google/gemini-pro-1.5:image": 65750, "openrouter:openai/gpt-4-turbo:prompt": 1000, "openrouter:openai/gpt-4-turbo:completion": 3000, "openrouter:openai/gpt-4-turbo:image": 1445000, - "openrouter:cohere/command-r-plus:prompt": 300, - "openrouter:cohere/command-r-plus:completion": 1500, - "openrouter:cohere/command-r-plus-04-2024:prompt": 300, - "openrouter:cohere/command-r-plus-04-2024:completion": 1500, - "openrouter:sophosympatheia/midnight-rose-70b:prompt": 80, - "openrouter:sophosympatheia/midnight-rose-70b:completion": 80, - "openrouter:cohere/command:prompt": 100, - "openrouter:cohere/command:completion": 200, - "openrouter:cohere/command-r:prompt": 50, - "openrouter:cohere/command-r:completion": 150, "openrouter:anthropic/claude-3-haiku:prompt": 25, "openrouter:anthropic/claude-3-haiku:completion": 125, "openrouter:anthropic/claude-3-haiku:image": 40000, @@ -626,20 +679,20 @@ export const OPENROUTER_COST_MAP = { "openrouter:anthropic/claude-3-opus:image": 2400000, "openrouter:anthropic/claude-3-opus:input_cache_read": 150, "openrouter:anthropic/claude-3-opus:input_cache_write": 1875, - "openrouter:cohere/command-r-03-2024:prompt": 50, - "openrouter:cohere/command-r-03-2024:completion": 150, "openrouter:mistralai/mistral-large:prompt": 200, "openrouter:mistralai/mistral-large:completion": 600, - "openrouter:openai/gpt-3.5-turbo-0613:prompt": 100, - "openrouter:openai/gpt-3.5-turbo-0613:completion": 200, "openrouter:openai/gpt-4-turbo-preview:prompt": 1000, "openrouter:openai/gpt-4-turbo-preview:completion": 3000, + "openrouter:openai/gpt-3.5-turbo-0613:prompt": 100, + "openrouter:openai/gpt-3.5-turbo-0613:completion": 200, "openrouter:mistralai/mistral-small:prompt": 20, "openrouter:mistralai/mistral-small:completion": 60, "openrouter:mistralai/mistral-tiny:prompt": 25, "openrouter:mistralai/mistral-tiny:completion": 25, - "openrouter:mistralai/mixtral-8x7b-instruct:prompt": 8, - "openrouter:mistralai/mixtral-8x7b-instruct:completion": 24, + "openrouter:mistralai/mistral-7b-instruct-v0.2:prompt": 20, + "openrouter:mistralai/mistral-7b-instruct-v0.2:completion": 20, + "openrouter:mistralai/mixtral-8x7b-instruct:prompt": 54, + "openrouter:mistralai/mixtral-8x7b-instruct:completion": 54, "openrouter:neversleep/noromaid-20b:prompt": 100, "openrouter:neversleep/noromaid-20b:completion": 175, "openrouter:alpindale/goliath-120b:prompt": 400, @@ -648,22 +701,22 @@ export const OPENROUTER_COST_MAP = { "openrouter:openrouter/auto:completion": -100000000, "openrouter:openai/gpt-4-1106-preview:prompt": 1000, "openrouter:openai/gpt-4-1106-preview:completion": 3000, - "openrouter:openai/gpt-3.5-turbo-instruct:prompt": 150, - "openrouter:openai/gpt-3.5-turbo-instruct:completion": 200, "openrouter:mistralai/mistral-7b-instruct-v0.1:prompt": 11, "openrouter:mistralai/mistral-7b-instruct-v0.1:completion": 19, + "openrouter:openai/gpt-3.5-turbo-instruct:prompt": 150, + "openrouter:openai/gpt-3.5-turbo-instruct:completion": 200, "openrouter:openai/gpt-3.5-turbo-16k:prompt": 300, "openrouter:openai/gpt-3.5-turbo-16k:completion": 400, "openrouter:mancer/weaver:prompt": 113, "openrouter:mancer/weaver:completion": 113, "openrouter:undi95/remm-slerp-l2-13b:prompt": 45, "openrouter:undi95/remm-slerp-l2-13b:completion": 65, - "openrouter:gryphe/mythomax-l2-13b:prompt": 6, - "openrouter:gryphe/mythomax-l2-13b:completion": 6, - "openrouter:openai/gpt-3.5-turbo:prompt": 50, - "openrouter:openai/gpt-3.5-turbo:completion": 150, + "openrouter:gryphe/mythomax-l2-13b:prompt": 5, + "openrouter:gryphe/mythomax-l2-13b:completion": 9, "openrouter:openai/gpt-4:prompt": 3000, "openrouter:openai/gpt-4:completion": 6000, + "openrouter:openai/gpt-3.5-turbo:prompt": 50, + "openrouter:openai/gpt-3.5-turbo:completion": 150, "openrouter:openai/gpt-4-0314:prompt": 3000, - "openrouter:openai/gpt-4-0314:completion": 6000 -} + "openrouter:openai/gpt-4-0314:completion": 6000, +};