feat: add alarms to meteringService if cost for service is unexpectedly 0 (#1755)

* feat: add alarms to meteringService if cost for service is unexpectedly 0

* fix: better sub checks
This commit is contained in:
Daniel Salazar
2025-10-15 12:05:15 -07:00
committed by GitHub
parent 24a51c59ae
commit 7e8842e35d
5 changed files with 297 additions and 228 deletions
@@ -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;
});
@@ -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>} 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;
}
}
@@ -41,9 +41,9 @@ export class MeteringAndBillingService {
this.#eventService = eventService;
}
utilRecordUsageObject(trackedUsageObject: Record<string, number>, actor: Actor, modelPrefix: string) {
utilRecordUsageObject<T extends Record<string, number>>(trackedUsageObject: T, actor: Actor, modelPrefix: string, costsOverrides?: Record<keyof T, number>) {
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) {
@@ -25,5 +25,5 @@ export const COST_MAPS = {
...OPENAI_IMAGE_COST_MAP,
...OPENROUTER_COST_MAP,
...TOGETHER_COST_MAP,
...XAI_COST_MAP
}
...XAI_COST_MAP,
};
@@ -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,
};