vibezcheck 0.4.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +249 -273
- package/bin/vibezcheck.js +4 -4
- package/dist/ai-sdk/index.d.mts +28 -59
- package/dist/ai-sdk/index.d.ts +28 -59
- package/dist/ai-sdk/index.js +307 -69
- package/dist/ai-sdk/index.js.map +1 -1
- package/dist/ai-sdk/index.mjs +307 -69
- package/dist/ai-sdk/index.mjs.map +1 -1
- package/dist/ai-sdk/middleware.d.mts +15 -0
- package/dist/ai-sdk/middleware.d.ts +15 -0
- package/dist/ai-sdk/middleware.js +1433 -0
- package/dist/ai-sdk/middleware.js.map +1 -0
- package/dist/ai-sdk/middleware.mjs +1396 -0
- package/dist/ai-sdk/middleware.mjs.map +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs.map +1 -1
- package/dist/billing/index.d.mts +90 -1
- package/dist/billing/index.d.ts +90 -1
- package/dist/billing/index.js +1542 -2
- package/dist/billing/index.js.map +1 -1
- package/dist/billing/index.mjs +1537 -1
- package/dist/billing/index.mjs.map +1 -1
- package/dist/cli/index.js +59 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +59 -7
- package/dist/cli/index.mjs.map +1 -1
- package/dist/{client-ynfWcHX6.d.ts → client-BORmJy8s.d.ts} +1 -1
- package/dist/{client-w_hWhQ6g.d.mts → client-CbuXmoXz.d.mts} +1 -1
- package/dist/compat/stripe-meter.d.mts +21 -0
- package/dist/compat/stripe-meter.d.ts +21 -0
- package/dist/compat/stripe-meter.js +1451 -0
- package/dist/compat/stripe-meter.js.map +1 -0
- package/dist/compat/stripe-meter.mjs +1414 -0
- package/dist/compat/stripe-meter.mjs.map +1 -0
- package/dist/compat/stripe-provider.d.mts +34 -0
- package/dist/compat/stripe-provider.d.ts +34 -0
- package/dist/compat/stripe-provider.js +1620 -0
- package/dist/compat/stripe-provider.js.map +1 -0
- package/dist/compat/stripe-provider.mjs +1587 -0
- package/dist/compat/stripe-provider.mjs.map +1 -0
- package/dist/compat/token-meter.d.mts +28 -0
- package/dist/compat/token-meter.d.ts +28 -0
- package/dist/compat/token-meter.js +1320 -0
- package/dist/compat/token-meter.js.map +1 -0
- package/dist/compat/token-meter.mjs +1283 -0
- package/dist/compat/token-meter.mjs.map +1 -0
- package/dist/customers/index.d.mts +1 -1
- package/dist/customers/index.d.ts +1 -1
- package/dist/customers/index.js.map +1 -1
- package/dist/customers/index.mjs.map +1 -1
- package/dist/index.d.mts +25 -11
- package/dist/index.d.ts +25 -11
- package/dist/index.js +810 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +798 -72
- package/dist/index.mjs.map +1 -1
- package/dist/meter/index.d.mts +2 -2
- package/dist/meter/index.d.ts +2 -2
- package/dist/meter/index.js +176 -42
- package/dist/meter/index.js.map +1 -1
- package/dist/meter/index.mjs +176 -42
- package/dist/meter/index.mjs.map +1 -1
- package/dist/pricing/index.d.mts +15 -4
- package/dist/pricing/index.d.ts +15 -4
- package/dist/pricing/index.js +165 -29
- package/dist/pricing/index.js.map +1 -1
- package/dist/pricing/index.mjs +164 -29
- package/dist/pricing/index.mjs.map +1 -1
- package/dist/react/index.d.mts +46 -2
- package/dist/react/index.d.ts +46 -2
- package/dist/react/index.js +471 -29
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +469 -29
- package/dist/react/index.mjs.map +1 -1
- package/dist/{types-Mozk4-Mr.d.mts → types-6P71CXAD.d.mts} +16 -6
- package/dist/{types-Mozk4-Mr.d.ts → types-6P71CXAD.d.ts} +16 -6
- package/dist/with-billing-Bj6Ya_Iy.d.ts +49 -0
- package/dist/with-billing-DndWGxL8.d.mts +49 -0
- package/package.json +35 -10
package/dist/pricing/index.js
CHANGED
|
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/pricing/index.ts
|
|
21
21
|
var pricing_exports = {};
|
|
22
22
|
__export(pricing_exports, {
|
|
23
|
+
MODEL_ALIASES: () => MODEL_ALIASES,
|
|
23
24
|
MODEL_PRICING_TABLE: () => MODEL_PRICING_TABLE,
|
|
24
25
|
calculateCost: () => calculateCost,
|
|
25
26
|
calculateUsageCost: () => calculateUsageCost,
|
|
@@ -31,7 +32,7 @@ module.exports = __toCommonJS(pricing_exports);
|
|
|
31
32
|
|
|
32
33
|
// src/pricing/table.ts
|
|
33
34
|
var MODEL_PRICING_TABLE = {
|
|
34
|
-
// --- OpenAI ---
|
|
35
|
+
// --- OpenAI (Modern & Reasoning) ---
|
|
35
36
|
"gpt-5.6-sol": { inputPer1M: 4, outputPer1M: 20, cachedInputPer1M: 0.4 },
|
|
36
37
|
"gpt-5.6-terra": { inputPer1M: 2, outputPer1M: 12, cachedInputPer1M: 0.2 },
|
|
37
38
|
"gpt-5.6-luna": { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },
|
|
@@ -43,11 +44,22 @@ var MODEL_PRICING_TABLE = {
|
|
|
43
44
|
"o3-mini": { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },
|
|
44
45
|
"gpt-4o": { inputPer1M: 2.5, outputPer1M: 10, cachedInputPer1M: 1.25 },
|
|
45
46
|
"gpt-4o-mini": { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },
|
|
47
|
+
"gpt-4.5": { inputPer1M: 75, outputPer1M: 150, cachedInputPer1M: 37.5 },
|
|
48
|
+
"gpt-4.5-preview": { inputPer1M: 75, outputPer1M: 150, cachedInputPer1M: 37.5 },
|
|
49
|
+
"chatgpt-4o-latest": { inputPer1M: 5, outputPer1M: 15 },
|
|
46
50
|
"gpt-4.1": { inputPer1M: 2, outputPer1M: 8, cachedInputPer1M: 1 },
|
|
47
51
|
"gpt-4.1-nano": { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },
|
|
52
|
+
// --- OpenAI (Legacy & Backward Compatibility) ---
|
|
53
|
+
"gpt-4-turbo": { inputPer1M: 10, outputPer1M: 30, cachedInputPer1M: 5 },
|
|
54
|
+
"gpt-4-turbo-preview": { inputPer1M: 10, outputPer1M: 30, cachedInputPer1M: 5 },
|
|
55
|
+
"gpt-4": { inputPer1M: 30, outputPer1M: 60 },
|
|
56
|
+
"gpt-4-32k": { inputPer1M: 60, outputPer1M: 120 },
|
|
57
|
+
"gpt-3.5-turbo": { inputPer1M: 0.5, outputPer1M: 1.5 },
|
|
58
|
+
"gpt-3.5-turbo-16k": { inputPer1M: 3, outputPer1M: 4 },
|
|
48
59
|
"text-embedding-3-small": { inputPer1M: 0.02, outputPer1M: 0 },
|
|
49
60
|
"text-embedding-3-large": { inputPer1M: 0.13, outputPer1M: 0 },
|
|
50
|
-
|
|
61
|
+
"text-embedding-ada-002": { inputPer1M: 0.1, outputPer1M: 0 },
|
|
62
|
+
// --- Anthropic (Modern & Extended Thinking) ---
|
|
51
63
|
"claude-3-7-sonnet": { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },
|
|
52
64
|
"claude-sonnet-5": { inputPer1M: 2, outputPer1M: 10, cachedInputPer1M: 0.3 },
|
|
53
65
|
"claude-3-5-sonnet": { inputPer1M: 3, outputPer1M: 15, cachedInputPer1M: 0.3 },
|
|
@@ -55,48 +67,145 @@ var MODEL_PRICING_TABLE = {
|
|
|
55
67
|
"haiku-4.5": { inputPer1M: 1, outputPer1M: 5, cachedInputPer1M: 0.1 },
|
|
56
68
|
"claude-opus-5": { inputPer1M: 5, outputPer1M: 25, cachedInputPer1M: 1.5 },
|
|
57
69
|
"claude-3-opus": { inputPer1M: 15, outputPer1M: 75, cachedInputPer1M: 1.5 },
|
|
58
|
-
// ---
|
|
70
|
+
// --- Anthropic (Legacy & Backward Compatibility) ---
|
|
71
|
+
"claude-3-sonnet": { inputPer1M: 3, outputPer1M: 15, cachedInputPer1M: 0.3 },
|
|
72
|
+
"claude-3-haiku": { inputPer1M: 0.25, outputPer1M: 1.25, cachedInputPer1M: 0.025 },
|
|
73
|
+
"claude-2.1": { inputPer1M: 8, outputPer1M: 24 },
|
|
74
|
+
"claude-2.0": { inputPer1M: 8, outputPer1M: 24 },
|
|
75
|
+
"claude-instant-1.2": { inputPer1M: 1.63, outputPer1M: 5.51 },
|
|
76
|
+
// --- Google Gemini (Modern & Thoughts) ---
|
|
59
77
|
"gemini-3.7-flash": { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },
|
|
60
78
|
"gemini-3.1-pro": { inputPer1M: 2, outputPer1M: 12, cachedInputPer1M: 0.5 },
|
|
61
79
|
"gemini-3.5-flash": { inputPer1M: 1.5, outputPer1M: 9, cachedInputPer1M: 0.38 },
|
|
62
80
|
"gemini-3.1-flash-lite": { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },
|
|
81
|
+
"gemini-2.5-pro": { inputPer1M: 1.25, outputPer1M: 5, cachedInputPer1M: 0.3125 },
|
|
82
|
+
"gemini-2.5-flash": { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.0375 },
|
|
63
83
|
"gemini-2.0-flash": { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },
|
|
84
|
+
"gemini-2.0-flash-lite": { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },
|
|
85
|
+
"gemini-2.0-pro": { inputPer1M: 1.25, outputPer1M: 5, cachedInputPer1M: 0.3125 },
|
|
86
|
+
// --- Google Gemini (Legacy & Backward Compatibility) ---
|
|
64
87
|
"gemini-1.5-pro": { inputPer1M: 1.25, outputPer1M: 5, cachedInputPer1M: 0.3125 },
|
|
65
88
|
"gemini-1.5-flash": { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },
|
|
89
|
+
"gemini-1.5-flash-8b": { inputPer1M: 0.0375, outputPer1M: 0.15, cachedInputPer1M: 9375e-6 },
|
|
90
|
+
"gemini-1.0-pro": { inputPer1M: 0.5, outputPer1M: 1.5 },
|
|
66
91
|
// --- xAI Grok ---
|
|
67
92
|
"grok-4.6": { inputPer1M: 3, outputPer1M: 15 },
|
|
93
|
+
"grok-3": { inputPer1M: 3, outputPer1M: 15 },
|
|
94
|
+
"grok-3-mini": { inputPer1M: 0.3, outputPer1M: 1.5 },
|
|
68
95
|
"grok-2": { inputPer1M: 2, outputPer1M: 10 },
|
|
69
96
|
"grok-2-vision": { inputPer1M: 2, outputPer1M: 10 },
|
|
70
97
|
"grok-beta": { inputPer1M: 5, outputPer1M: 15 },
|
|
71
98
|
// --- Mistral ---
|
|
72
99
|
"mistral-large-3": { inputPer1M: 2, outputPer1M: 6 },
|
|
73
100
|
"mistral-large-latest": { inputPer1M: 2, outputPer1M: 6 },
|
|
101
|
+
"mistral-large-2411": { inputPer1M: 2, outputPer1M: 6 },
|
|
74
102
|
"codestral-latest": { inputPer1M: 0.3, outputPer1M: 0.9 },
|
|
103
|
+
"mistral-medium-latest": { inputPer1M: 2.7, outputPer1M: 8.1 },
|
|
75
104
|
"mistral-small-latest": { inputPer1M: 0.2, outputPer1M: 0.6 },
|
|
76
105
|
"ministral-8b-latest": { inputPer1M: 0.1, outputPer1M: 0.1 },
|
|
77
|
-
|
|
106
|
+
"ministral-3b-latest": { inputPer1M: 0.04, outputPer1M: 0.04 },
|
|
107
|
+
"open-mistral-7b": { inputPer1M: 0.2, outputPer1M: 0.2 },
|
|
108
|
+
"open-mixtral-8x7b": { inputPer1M: 0.7, outputPer1M: 0.7 },
|
|
109
|
+
"open-mixtral-8x22b": { inputPer1M: 2, outputPer1M: 6 },
|
|
110
|
+
// --- Groq & Meta Llama LPUs ---
|
|
78
111
|
"llama-3.3-70b-versatile": { inputPer1M: 0.59, outputPer1M: 0.79 },
|
|
112
|
+
"llama-3.1-405b": { inputPer1M: 3, outputPer1M: 3 },
|
|
113
|
+
"llama-3.1-70b-versatile": { inputPer1M: 0.59, outputPer1M: 0.79 },
|
|
79
114
|
"llama-3.1-8b-instant": { inputPer1M: 0.05, outputPer1M: 0.08 },
|
|
115
|
+
"llama-3.2-1b-preview": { inputPer1M: 0.04, outputPer1M: 0.04 },
|
|
116
|
+
"llama-3.2-3b-preview": { inputPer1M: 0.06, outputPer1M: 0.06 },
|
|
117
|
+
"llama-3.2-11b-vision": { inputPer1M: 0.18, outputPer1M: 0.18 },
|
|
118
|
+
"llama-3.2-90b-vision": { inputPer1M: 0.9, outputPer1M: 0.9 },
|
|
80
119
|
"deepseek-r1-distill-llama-70b": { inputPer1M: 0.75, outputPer1M: 0.99 },
|
|
120
|
+
"deepseek-r1-distill-qwen-32b": { inputPer1M: 0.49, outputPer1M: 0.49 },
|
|
81
121
|
"qwen-2.5-32b": { inputPer1M: 0.29, outputPer1M: 0.39 },
|
|
122
|
+
"qwen-2.5-72b": { inputPer1M: 0.35, outputPer1M: 0.4 },
|
|
123
|
+
"mixtral-8x7b-32768": { inputPer1M: 0.24, outputPer1M: 0.24 },
|
|
124
|
+
"gemma2-9b-it": { inputPer1M: 0.2, outputPer1M: 0.2 },
|
|
82
125
|
// --- DeepSeek ---
|
|
83
126
|
"deepseek-v4-pro": { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },
|
|
84
127
|
"deepseek-v4-flash": { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },
|
|
85
|
-
"deepseek-
|
|
86
|
-
"deepseek-
|
|
128
|
+
"deepseek-v3": { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },
|
|
129
|
+
"deepseek-chat": { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },
|
|
130
|
+
"deepseek-r1": { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },
|
|
131
|
+
"deepseek-reasoner": { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },
|
|
87
132
|
// --- Cohere ---
|
|
88
133
|
"command-r-plus": { inputPer1M: 2.5, outputPer1M: 10 },
|
|
89
|
-
"command-r": { inputPer1M: 0.15, outputPer1M: 0.6 }
|
|
134
|
+
"command-r": { inputPer1M: 0.15, outputPer1M: 0.6 },
|
|
135
|
+
"command": { inputPer1M: 1, outputPer1M: 2 },
|
|
136
|
+
"command-light": { inputPer1M: 0.3, outputPer1M: 0.6 },
|
|
137
|
+
"embed-english-v3.0": { inputPer1M: 0.1, outputPer1M: 0 },
|
|
138
|
+
// --- Perplexity ---
|
|
139
|
+
"sonar": { inputPer1M: 1, outputPer1M: 1 },
|
|
140
|
+
"sonar-pro": { inputPer1M: 3, outputPer1M: 15 },
|
|
141
|
+
"sonar-reasoning": { inputPer1M: 1, outputPer1M: 5 },
|
|
142
|
+
"sonar-reasoning-pro": { inputPer1M: 2, outputPer1M: 8 }
|
|
143
|
+
};
|
|
144
|
+
var MODEL_ALIASES = {
|
|
145
|
+
// OpenAI Shorthands & Aliases
|
|
146
|
+
"gpt4": "gpt-4",
|
|
147
|
+
"gpt4o": "gpt-4o",
|
|
148
|
+
"gpt-4-preview": "gpt-4-turbo",
|
|
149
|
+
"gpt-4-0125-preview": "gpt-4-turbo",
|
|
150
|
+
"gpt-4-1106-preview": "gpt-4-turbo",
|
|
151
|
+
"gpt-3.5": "gpt-3.5-turbo",
|
|
152
|
+
"gpt-3.5-turbo-0125": "gpt-3.5-turbo",
|
|
153
|
+
"gpt-3.5-turbo-1106": "gpt-3.5-turbo",
|
|
154
|
+
"gpt-3.5-turbo-16k-0613": "gpt-3.5-turbo-16k",
|
|
155
|
+
// Anthropic Shorthands
|
|
156
|
+
"sonnet": "claude-3-5-sonnet",
|
|
157
|
+
"sonnet-3.7": "claude-3-7-sonnet",
|
|
158
|
+
"sonnet-3.5": "claude-3-5-sonnet",
|
|
159
|
+
"haiku": "claude-3-5-haiku",
|
|
160
|
+
"haiku-3.5": "claude-3-5-haiku",
|
|
161
|
+
"opus": "claude-3-opus",
|
|
162
|
+
"claude-2": "claude-2.0",
|
|
163
|
+
"claude-instant": "claude-instant-1.2",
|
|
164
|
+
// DeepSeek Shorthands
|
|
165
|
+
"r1": "deepseek-r1",
|
|
166
|
+
"v3": "deepseek-v3",
|
|
167
|
+
// Gemini Shorthands
|
|
168
|
+
"flash": "gemini-2.0-flash",
|
|
169
|
+
"pro": "gemini-1.5-pro",
|
|
170
|
+
// Meta / Groq Shorthands
|
|
171
|
+
"llama-3.3-70b": "llama-3.3-70b-versatile",
|
|
172
|
+
"llama-3.1-70b": "llama-3.1-70b-versatile",
|
|
173
|
+
"llama-3.1-8b": "llama-3.1-8b-instant",
|
|
174
|
+
"llama-3-70b": "llama-3.1-70b-versatile",
|
|
175
|
+
"llama-3-8b": "llama-3.1-8b-instant",
|
|
176
|
+
// Mistral Shorthands
|
|
177
|
+
"codestral": "codestral-latest",
|
|
178
|
+
"mistral-large": "mistral-large-latest",
|
|
179
|
+
"mistral-small": "mistral-small-latest"
|
|
90
180
|
};
|
|
91
181
|
var customPricingRegistry = {};
|
|
92
182
|
function normalizeModelKey(rawModel) {
|
|
93
183
|
if (!rawModel) return "unknown";
|
|
94
184
|
let model = rawModel.toLowerCase().trim();
|
|
185
|
+
model = model.replace(/^[a-z0-9_-]+\.(anthropic|meta|amazon|cohere|mistral|ai21)\./i, "");
|
|
186
|
+
model = model.replace(/^(anthropic|meta|amazon|cohere|mistral|ai21)\./i, "");
|
|
187
|
+
model = model.replace(/-v\d+(:\d+)?$/, "");
|
|
188
|
+
model = model.replace(/:\d+$/, "");
|
|
95
189
|
if (model.includes("/")) {
|
|
96
|
-
model = model.split("/")
|
|
190
|
+
model = model.split("/").slice(1).join("/");
|
|
97
191
|
}
|
|
192
|
+
model = model.replace(/:(latest|free|beta)$/, "");
|
|
98
193
|
model = model.replace(/-\d{8}$/, "");
|
|
99
194
|
model = model.replace(/-\d{4}-\d{2}-\d{2}$/, "");
|
|
195
|
+
model = model.replace(/llama(\d+)-(\d+)-/g, "llama-$1.$2-");
|
|
196
|
+
model = model.replace(/llama(\d+)\.(\d+)-/g, "llama-$1.$2-");
|
|
197
|
+
if (MODEL_ALIASES[model]) {
|
|
198
|
+
return MODEL_ALIASES[model];
|
|
199
|
+
}
|
|
200
|
+
if (!MODEL_PRICING_TABLE[model]) {
|
|
201
|
+
const withoutInstruct = model.replace(/-(instruct|chat|preview)$/, "");
|
|
202
|
+
if (MODEL_PRICING_TABLE[withoutInstruct]) {
|
|
203
|
+
return withoutInstruct;
|
|
204
|
+
}
|
|
205
|
+
if (MODEL_ALIASES[withoutInstruct]) {
|
|
206
|
+
return MODEL_ALIASES[withoutInstruct];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
100
209
|
return model;
|
|
101
210
|
}
|
|
102
211
|
function getModelPricing(modelName) {
|
|
@@ -113,6 +222,10 @@ function getModelPricing(modelName) {
|
|
|
113
222
|
if (MODEL_PRICING_TABLE[modelName]) {
|
|
114
223
|
return MODEL_PRICING_TABLE[modelName];
|
|
115
224
|
}
|
|
225
|
+
const alias = MODEL_ALIASES[modelName.toLowerCase().trim()];
|
|
226
|
+
if (alias && MODEL_PRICING_TABLE[alias]) {
|
|
227
|
+
return MODEL_PRICING_TABLE[alias];
|
|
228
|
+
}
|
|
116
229
|
return {
|
|
117
230
|
inputPer1M: 1,
|
|
118
231
|
outputPer1M: 3,
|
|
@@ -140,35 +253,57 @@ function calculateCost(params) {
|
|
|
140
253
|
} else {
|
|
141
254
|
rates = getModelPricing(params.model);
|
|
142
255
|
}
|
|
143
|
-
const inputTokens = params.inputTokens ?? 0;
|
|
144
|
-
const outputTokens = params.outputTokens ?? 0;
|
|
145
|
-
const reasoningTokens = params.reasoningTokens ?? 0;
|
|
146
|
-
const cachedTokens = params.cachedTokens ?? 0;
|
|
147
|
-
const regularInputTokens =
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
const
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
|
|
256
|
+
const inputTokens = BigInt(Math.max(0, params.inputTokens ?? 0));
|
|
257
|
+
const outputTokens = BigInt(Math.max(0, params.outputTokens ?? 0));
|
|
258
|
+
const reasoningTokens = BigInt(Math.max(0, params.reasoningTokens ?? 0));
|
|
259
|
+
const cachedTokens = BigInt(Math.max(0, params.cachedTokens ?? 0));
|
|
260
|
+
const regularInputTokens = inputTokens > cachedTokens ? inputTokens - cachedTokens : 0n;
|
|
261
|
+
const rateInputNano = BigInt(Math.round(rates.inputPer1M * 1e3));
|
|
262
|
+
const cachedPer1M = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15;
|
|
263
|
+
const rateCachedNano = BigInt(Math.round(cachedPer1M * 1e3));
|
|
264
|
+
const rateOutputNano = BigInt(Math.round(rates.outputPer1M * 1e3));
|
|
265
|
+
const reasoningPer1M = rates.reasoningPer1M ?? rates.outputPer1M;
|
|
266
|
+
const rateReasoningNano = BigInt(Math.round(reasoningPer1M * 1e3));
|
|
267
|
+
const regularInputCostNano = regularInputTokens * rateInputNano;
|
|
268
|
+
const cachedInputCostNano = cachedTokens * rateCachedNano;
|
|
269
|
+
const inputCostNano = regularInputCostNano + cachedInputCostNano;
|
|
270
|
+
const outputCostNano = outputTokens * rateOutputNano;
|
|
271
|
+
const reasoningCostNano = reasoningTokens * rateReasoningNano;
|
|
272
|
+
const standardCacheCostNano = cachedTokens * rateInputNano;
|
|
273
|
+
const cachedDiscountNano = standardCacheCostNano > cachedInputCostNano ? standardCacheCostNano - cachedInputCostNano : 0n;
|
|
274
|
+
const wholesaleNano = inputCostNano + outputCostNano;
|
|
158
275
|
const markup = params.markupMultiplier ?? 1;
|
|
159
|
-
let
|
|
276
|
+
let billedNano = wholesaleNano;
|
|
277
|
+
let hasRetail = false;
|
|
160
278
|
if (markup !== 1 || params.minimumChargeUSD !== void 0) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
279
|
+
hasRetail = true;
|
|
280
|
+
const markupMultiplierNano = BigInt(Math.round(markup * 1e3));
|
|
281
|
+
billedNano = wholesaleNano * markupMultiplierNano / 1000n;
|
|
282
|
+
if (params.minimumChargeUSD !== void 0 && params.minimumChargeUSD > 0) {
|
|
283
|
+
const minChargeNano = BigInt(Math.round(params.minimumChargeUSD * 1e9));
|
|
284
|
+
if (billedNano < minChargeNano) {
|
|
285
|
+
billedNano = minChargeNano;
|
|
286
|
+
}
|
|
164
287
|
}
|
|
165
288
|
}
|
|
289
|
+
const inputCostUSD = Number(inputCostNano) / 1e9;
|
|
290
|
+
const outputCostUSD = Number(outputCostNano) / 1e9;
|
|
291
|
+
const reasoningCostUSD = Number(reasoningCostNano) / 1e9;
|
|
292
|
+
const cachedDiscountUSD = Number(cachedDiscountNano) / 1e9;
|
|
293
|
+
const totalUSD = Number(wholesaleNano) / 1e9;
|
|
294
|
+
const wholesaleTotalUSD = totalUSD;
|
|
295
|
+
const billedUSD = Number(billedNano) / 1e9;
|
|
296
|
+
const profitUSD = Math.max(0, billedUSD - wholesaleTotalUSD);
|
|
297
|
+
const retailUSD = hasRetail ? billedUSD : void 0;
|
|
166
298
|
return {
|
|
167
299
|
inputCostUSD: Number(inputCostUSD.toFixed(8)),
|
|
168
300
|
outputCostUSD: Number(outputCostUSD.toFixed(8)),
|
|
169
|
-
reasoningCostUSD: reasoningTokens >
|
|
170
|
-
cachedDiscountUSD: cachedTokens >
|
|
301
|
+
reasoningCostUSD: reasoningTokens > 0n ? Number(reasoningCostUSD.toFixed(8)) : void 0,
|
|
302
|
+
cachedDiscountUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : void 0,
|
|
171
303
|
totalUSD: Number(totalUSD.toFixed(8)),
|
|
304
|
+
wholesaleTotalUSD: Number(wholesaleTotalUSD.toFixed(8)),
|
|
305
|
+
billedUSD: Number(billedUSD.toFixed(8)),
|
|
306
|
+
profitUSD: Number(profitUSD.toFixed(8)),
|
|
172
307
|
retailUSD: retailUSD !== void 0 ? Number(retailUSD.toFixed(8)) : void 0,
|
|
173
308
|
currency: rates.currency || "USD"
|
|
174
309
|
};
|
|
@@ -189,6 +324,7 @@ function calculateUsageCost(model, usage, optionsOrMarkup) {
|
|
|
189
324
|
}
|
|
190
325
|
// Annotate the CommonJS export names for ESM import in node:
|
|
191
326
|
0 && (module.exports = {
|
|
327
|
+
MODEL_ALIASES,
|
|
192
328
|
MODEL_PRICING_TABLE,
|
|
193
329
|
calculateCost,
|
|
194
330
|
calculateUsageCost,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pricing/index.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["export * from './table';\nexport * from './calculator';\n","import type { ModelPricingRates } from '../types';\n\n/**\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\n * Sourced from official 2026 provider pricing tables.\n */\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\n // --- OpenAI ---\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\n\n // --- Anthropic ---\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\n\n // --- Google Gemini ---\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\n\n // --- xAI Grok ---\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\n\n // --- Mistral ---\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\n\n // --- Groq LPUs ---\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\n\n // --- DeepSeek ---\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-chat': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\n 'deepseek-reasoner': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\n\n // --- Cohere ---\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\n};\n\n/**\n * Dynamic in-memory registry allowing runtime custom price registration\n */\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\n\n/**\n * Normalize model identifier to match pricing table keys\n */\nexport function normalizeModelKey(rawModel: string): string {\n if (!rawModel) return 'unknown';\n\n let model = rawModel.toLowerCase().trim();\n\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o')\n if (model.includes('/')) {\n model = model.split('/')[1] || model;\n }\n\n // Remove date suffixes like -20240307 or -20250219\n model = model.replace(/-\\d{8}$/, '');\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\n\n return model;\n}\n\n/**\n * Retrieve pricing rates for a given model\n */\nexport function getModelPricing(modelName: string): ModelPricingRates {\n const normalized = normalizeModelKey(modelName);\n\n // Check custom registry first\n if (customPricingRegistry[normalized]) {\n return customPricingRegistry[normalized];\n }\n if (customPricingRegistry[modelName]) {\n return customPricingRegistry[modelName];\n }\n\n // Check built-in table\n if (MODEL_PRICING_TABLE[normalized]) {\n return MODEL_PRICING_TABLE[normalized];\n }\n if (MODEL_PRICING_TABLE[modelName]) {\n return MODEL_PRICING_TABLE[modelName];\n }\n\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\n return {\n inputPer1M: 1.0,\n outputPer1M: 3.0,\n cachedInputPer1M: 0.5,\n };\n}\n\n/**\n * Register or override pricing rates for a custom model\n */\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\n const normalized = normalizeModelKey(modelName);\n customPricingRegistry[normalized] = rates;\n customPricingRegistry[modelName] = rates;\n}\n","import type { InferenceCost, TokenUsage, InlineRateConfig, ModelPricingRates } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\n/**\n * Calculates exact inference cost for an LLM call or usage breakdown in USD.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\n\n const inputTokens = params.inputTokens ?? 0;\n const outputTokens = params.outputTokens ?? 0;\n const reasoningTokens = params.reasoningTokens ?? 0;\n const cachedTokens = params.cachedTokens ?? 0;\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = Math.max(0, inputTokens - cachedTokens);\n\n // Input costs\n const regularInputCost = (regularInputTokens / 1_000_000) * rates.inputPer1M;\n const cachedRate = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15; // 85% discount default for cached\n const cachedInputCost = (cachedTokens / 1_000_000) * cachedRate;\n const inputCostUSD = regularInputCost + cachedInputCost;\n\n // Output costs (reasoning tokens are billed as output tokens in standard APIs)\n const outputCostUSD = (outputTokens / 1_000_000) * rates.outputPer1M;\n\n // Reasoning breakdown cost\n const reasoningRate = rates.reasoningPer1M ?? rates.outputPer1M;\n const reasoningCostUSD = (reasoningTokens / 1_000_000) * reasoningRate;\n\n // Cache savings discount\n const standardCacheCost = (cachedTokens / 1_000_000) * rates.inputPer1M;\n const cachedDiscountUSD = Math.max(0, standardCacheCost - cachedInputCost);\n\n // Total base cost\n let totalUSD = inputCostUSD + outputCostUSD;\n\n // Retail price calculation (if markup multiplier provided)\n const markup = params.markupMultiplier ?? 1.0;\n let retailUSD: number | undefined = undefined;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n retailUSD = totalUSD * markup;\n if (params.minimumChargeUSD !== undefined && retailUSD < params.minimumChargeUSD) {\n retailUSD = params.minimumChargeUSD;\n }\n }\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0 ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0 ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n retailUSD: retailUSD !== undefined ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/pricing/index.ts","../../src/pricing/table.ts","../../src/pricing/calculator.ts"],"sourcesContent":["export * from './table';\r\nexport * from './calculator';\r\n","import type { ModelPricingRates } from '../types';\r\n\r\n/**\r\n * Built-in Registry of Model Pricing (USD per 1 Million Tokens)\r\n * Sourced from official 2026 provider pricing tables.\r\n */\r\nexport const MODEL_PRICING_TABLE: Record<string, ModelPricingRates> = {\r\n // --- OpenAI (Modern & Reasoning) ---\r\n 'gpt-5.6-sol': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5.6-terra': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.2 },\r\n 'gpt-5.6-luna': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'gpt-5': { inputPer1M: 4.0, outputPer1M: 20.0, cachedInputPer1M: 0.4 },\r\n 'gpt-5-mini': { inputPer1M: 0.2, outputPer1M: 1.2, cachedInputPer1M: 0.02 },\r\n 'o1': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o1-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'o3': { inputPer1M: 15.0, outputPer1M: 60.0, cachedInputPer1M: 7.5 },\r\n 'o3-mini': { inputPer1M: 1.1, outputPer1M: 4.4, cachedInputPer1M: 0.55 },\r\n 'gpt-4o': { inputPer1M: 2.5, outputPer1M: 10.0, cachedInputPer1M: 1.25 },\r\n 'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.075 },\r\n 'gpt-4.5': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'gpt-4.5-preview': { inputPer1M: 75.0, outputPer1M: 150.0, cachedInputPer1M: 37.5 },\r\n 'chatgpt-4o-latest': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n 'gpt-4.1': { inputPer1M: 2.0, outputPer1M: 8.0, cachedInputPer1M: 1.0 },\r\n 'gpt-4.1-nano': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.05 },\r\n\r\n // --- OpenAI (Legacy & Backward Compatibility) ---\r\n 'gpt-4-turbo': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4-turbo-preview': { inputPer1M: 10.0, outputPer1M: 30.0, cachedInputPer1M: 5.0 },\r\n 'gpt-4': { inputPer1M: 30.0, outputPer1M: 60.0 },\r\n 'gpt-4-32k': { inputPer1M: 60.0, outputPer1M: 120.0 },\r\n 'gpt-3.5-turbo': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n 'gpt-3.5-turbo-16k': { inputPer1M: 3.0, outputPer1M: 4.0 },\r\n 'text-embedding-3-small': { inputPer1M: 0.02, outputPer1M: 0.0 },\r\n 'text-embedding-3-large': { inputPer1M: 0.13, outputPer1M: 0.0 },\r\n 'text-embedding-ada-002': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Anthropic (Modern & Extended Thinking) ---\r\n 'claude-3-7-sonnet': { inputPer1M: 0.59, outputPer1M: 2.93, cachedInputPer1M: 0.3 },\r\n 'claude-sonnet-5': { inputPer1M: 2.0, outputPer1M: 10.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-5-haiku': { inputPer1M: 0.8, outputPer1M: 4.0, cachedInputPer1M: 0.08 },\r\n 'haiku-4.5': { inputPer1M: 1.0, outputPer1M: 5.0, cachedInputPer1M: 0.1 },\r\n 'claude-opus-5': { inputPer1M: 5.0, outputPer1M: 25.0, cachedInputPer1M: 1.5 },\r\n 'claude-3-opus': { inputPer1M: 15.0, outputPer1M: 75.0, cachedInputPer1M: 1.5 },\r\n\r\n // --- Anthropic (Legacy & Backward Compatibility) ---\r\n 'claude-3-sonnet': { inputPer1M: 3.0, outputPer1M: 15.0, cachedInputPer1M: 0.3 },\r\n 'claude-3-haiku': { inputPer1M: 0.25, outputPer1M: 1.25, cachedInputPer1M: 0.025 },\r\n 'claude-2.1': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-2.0': { inputPer1M: 8.0, outputPer1M: 24.0 },\r\n 'claude-instant-1.2': { inputPer1M: 1.63, outputPer1M: 5.51 },\r\n\r\n // --- Google Gemini (Modern & Thoughts) ---\r\n 'gemini-3.7-flash': { inputPer1M: 0.75, outputPer1M: 3.75, cachedInputPer1M: 0.18 },\r\n 'gemini-3.1-pro': { inputPer1M: 2.0, outputPer1M: 12.0, cachedInputPer1M: 0.5 },\r\n 'gemini-3.5-flash': { inputPer1M: 1.5, outputPer1M: 9.0, cachedInputPer1M: 0.38 },\r\n 'gemini-3.1-flash-lite': { inputPer1M: 0.25, outputPer1M: 1.5, cachedInputPer1M: 0.06 },\r\n 'gemini-2.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-2.5-flash': { inputPer1M: 0.15, outputPer1M: 0.6, cachedInputPer1M: 0.0375 },\r\n 'gemini-2.0-flash': { inputPer1M: 0.1, outputPer1M: 0.4, cachedInputPer1M: 0.025 },\r\n 'gemini-2.0-flash-lite': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-2.0-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n\r\n // --- Google Gemini (Legacy & Backward Compatibility) ---\r\n 'gemini-1.5-pro': { inputPer1M: 1.25, outputPer1M: 5.0, cachedInputPer1M: 0.3125 },\r\n 'gemini-1.5-flash': { inputPer1M: 0.075, outputPer1M: 0.3, cachedInputPer1M: 0.01875 },\r\n 'gemini-1.5-flash-8b': { inputPer1M: 0.0375, outputPer1M: 0.15, cachedInputPer1M: 0.009375 },\r\n 'gemini-1.0-pro': { inputPer1M: 0.5, outputPer1M: 1.5 },\r\n\r\n // --- xAI Grok ---\r\n 'grok-4.6': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'grok-3-mini': { inputPer1M: 0.3, outputPer1M: 1.5 },\r\n 'grok-2': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-2-vision': { inputPer1M: 2.0, outputPer1M: 10.0 },\r\n 'grok-beta': { inputPer1M: 5.0, outputPer1M: 15.0 },\r\n\r\n // --- Mistral ---\r\n 'mistral-large-3': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-latest': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'mistral-large-2411': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n 'codestral-latest': { inputPer1M: 0.3, outputPer1M: 0.9 },\r\n 'mistral-medium-latest': { inputPer1M: 2.7, outputPer1M: 8.1 },\r\n 'mistral-small-latest': { inputPer1M: 0.2, outputPer1M: 0.6 },\r\n 'ministral-8b-latest': { inputPer1M: 0.1, outputPer1M: 0.1 },\r\n 'ministral-3b-latest': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'open-mistral-7b': { inputPer1M: 0.2, outputPer1M: 0.2 },\r\n 'open-mixtral-8x7b': { inputPer1M: 0.7, outputPer1M: 0.7 },\r\n 'open-mixtral-8x22b': { inputPer1M: 2.0, outputPer1M: 6.0 },\r\n\r\n // --- Groq & Meta Llama LPUs ---\r\n 'llama-3.3-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-405b': { inputPer1M: 3.0, outputPer1M: 3.0 },\r\n 'llama-3.1-70b-versatile': { inputPer1M: 0.59, outputPer1M: 0.79 },\r\n 'llama-3.1-8b-instant': { inputPer1M: 0.05, outputPer1M: 0.08 },\r\n 'llama-3.2-1b-preview': { inputPer1M: 0.04, outputPer1M: 0.04 },\r\n 'llama-3.2-3b-preview': { inputPer1M: 0.06, outputPer1M: 0.06 },\r\n 'llama-3.2-11b-vision': { inputPer1M: 0.18, outputPer1M: 0.18 },\r\n 'llama-3.2-90b-vision': { inputPer1M: 0.90, outputPer1M: 0.90 },\r\n 'deepseek-r1-distill-llama-70b': { inputPer1M: 0.75, outputPer1M: 0.99 },\r\n 'deepseek-r1-distill-qwen-32b': { inputPer1M: 0.49, outputPer1M: 0.49 },\r\n 'qwen-2.5-32b': { inputPer1M: 0.29, outputPer1M: 0.39 },\r\n 'qwen-2.5-72b': { inputPer1M: 0.35, outputPer1M: 0.40 },\r\n 'mixtral-8x7b-32768': { inputPer1M: 0.24, outputPer1M: 0.24 },\r\n 'gemma2-9b-it': { inputPer1M: 0.20, outputPer1M: 0.20 },\r\n\r\n // --- DeepSeek ---\r\n 'deepseek-v4-pro': { inputPer1M: 0.66, outputPer1M: 1.98, cachedInputPer1M: 0.15 },\r\n 'deepseek-v4-flash': { inputPer1M: 0.22, outputPer1M: 0.66, cachedInputPer1M: 0.05 },\r\n 'deepseek-v3': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-chat': { inputPer1M: 0.14, outputPer1M: 0.28, cachedInputPer1M: 0.014 },\r\n 'deepseek-r1': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n 'deepseek-reasoner': { inputPer1M: 0.55, outputPer1M: 2.19, cachedInputPer1M: 0.14 },\r\n\r\n // --- Cohere ---\r\n 'command-r-plus': { inputPer1M: 2.5, outputPer1M: 10.0 },\r\n 'command-r': { inputPer1M: 0.15, outputPer1M: 0.6 },\r\n 'command': { inputPer1M: 1.0, outputPer1M: 2.0 },\r\n 'command-light': { inputPer1M: 0.3, outputPer1M: 0.6 },\r\n 'embed-english-v3.0': { inputPer1M: 0.10, outputPer1M: 0.0 },\r\n\r\n // --- Perplexity ---\r\n 'sonar': { inputPer1M: 1.0, outputPer1M: 1.0 },\r\n 'sonar-pro': { inputPer1M: 3.0, outputPer1M: 15.0 },\r\n 'sonar-reasoning': { inputPer1M: 1.0, outputPer1M: 5.0 },\r\n 'sonar-reasoning-pro': { inputPer1M: 2.0, outputPer1M: 8.0 },\r\n};\r\n\r\n/**\r\n * Common model alias map to normalize nicknames, shorthands, and legacy IDs\r\n */\r\nexport const MODEL_ALIASES: Record<string, string> = {\r\n // OpenAI Shorthands & Aliases\r\n 'gpt4': 'gpt-4',\r\n 'gpt4o': 'gpt-4o',\r\n 'gpt-4-preview': 'gpt-4-turbo',\r\n 'gpt-4-0125-preview': 'gpt-4-turbo',\r\n 'gpt-4-1106-preview': 'gpt-4-turbo',\r\n 'gpt-3.5': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-0125': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-1106': 'gpt-3.5-turbo',\r\n 'gpt-3.5-turbo-16k-0613': 'gpt-3.5-turbo-16k',\r\n\r\n // Anthropic Shorthands\r\n 'sonnet': 'claude-3-5-sonnet',\r\n 'sonnet-3.7': 'claude-3-7-sonnet',\r\n 'sonnet-3.5': 'claude-3-5-sonnet',\r\n 'haiku': 'claude-3-5-haiku',\r\n 'haiku-3.5': 'claude-3-5-haiku',\r\n 'opus': 'claude-3-opus',\r\n 'claude-2': 'claude-2.0',\r\n 'claude-instant': 'claude-instant-1.2',\r\n\r\n // DeepSeek Shorthands\r\n 'r1': 'deepseek-r1',\r\n 'v3': 'deepseek-v3',\r\n\r\n // Gemini Shorthands\r\n 'flash': 'gemini-2.0-flash',\r\n 'pro': 'gemini-1.5-pro',\r\n\r\n // Meta / Groq Shorthands\r\n 'llama-3.3-70b': 'llama-3.3-70b-versatile',\r\n 'llama-3.1-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3.1-8b': 'llama-3.1-8b-instant',\r\n 'llama-3-70b': 'llama-3.1-70b-versatile',\r\n 'llama-3-8b': 'llama-3.1-8b-instant',\r\n\r\n // Mistral Shorthands\r\n 'codestral': 'codestral-latest',\r\n 'mistral-large': 'mistral-large-latest',\r\n 'mistral-small': 'mistral-small-latest',\r\n};\r\n\r\n/**\r\n * Dynamic in-memory registry allowing runtime custom price registration\r\n */\r\nconst customPricingRegistry: Record<string, ModelPricingRates> = {};\r\n\r\n/**\r\n * Normalize model identifier to match pricing table keys:\r\n * - Strips AWS Bedrock prefixes (e.g. 'anthropic.claude-3-5-sonnet-20241022-v2:0' -> 'claude-3-5-sonnet')\r\n * - Strips provider prefixes (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'deepseek/deepseek-r1' -> 'deepseek-r1')\r\n * - Strips date suffixes (e.g. '-20240307', '-20250219')\r\n * - Resolves shorthands and aliases\r\n */\r\nexport function normalizeModelKey(rawModel: string): string {\r\n if (!rawModel) return 'unknown';\r\n\r\n let model = rawModel.toLowerCase().trim();\r\n\r\n // Strip AWS Bedrock model prefix (e.g. 'us.anthropic.claude-3-5-sonnet...', 'meta.llama3-...')\r\n model = model.replace(/^[a-z0-9_-]+\\.(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n model = model.replace(/^(anthropic|meta|amazon|cohere|mistral|ai21)\\./i, '');\r\n\r\n // Strip AWS Bedrock version suffix (e.g. '-v1:0', '-v2:0', ':0')\r\n model = model.replace(/-v\\d+(:\\d+)?$/, '');\r\n model = model.replace(/:\\d+$/, '');\r\n\r\n // Strip provider prefix if present (e.g. 'openai/gpt-4o' -> 'gpt-4o', 'meta-llama/llama-3.3-70b-instruct' -> 'llama-3.3-70b-instruct')\r\n if (model.includes('/')) {\r\n model = model.split('/').slice(1).join('/');\r\n }\r\n\r\n // Remove trailing version/mode tags (e.g. ':latest', ':free', ':beta')\r\n model = model.replace(/:(latest|free|beta)$/, '');\r\n\r\n // Remove date suffixes like -20240307 or -20250219 or -2024-08-06\r\n model = model.replace(/-\\d{8}$/, '');\r\n model = model.replace(/-\\d{4}-\\d{2}-\\d{2}$/, '');\r\n\r\n // Normalize Bedrock Meta format (e.g. llama3-1-70b -> llama-3.1-70b)\r\n model = model.replace(/llama(\\d+)-(\\d+)-/g, 'llama-$1.$2-');\r\n model = model.replace(/llama(\\d+)\\.(\\d+)-/g, 'llama-$1.$2-');\r\n\r\n // Check aliases before fine-tuning\r\n if (MODEL_ALIASES[model]) {\r\n return MODEL_ALIASES[model];\r\n }\r\n\r\n // Remove common modifier suffixes if not directly matching table\r\n if (!MODEL_PRICING_TABLE[model]) {\r\n const withoutInstruct = model.replace(/-(instruct|chat|preview)$/, '');\r\n if (MODEL_PRICING_TABLE[withoutInstruct]) {\r\n return withoutInstruct;\r\n }\r\n if (MODEL_ALIASES[withoutInstruct]) {\r\n return MODEL_ALIASES[withoutInstruct];\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\n/**\r\n * Retrieve pricing rates for a given model\r\n */\r\nexport function getModelPricing(modelName: string): ModelPricingRates {\r\n const normalized = normalizeModelKey(modelName);\r\n\r\n // Check custom registry first\r\n if (customPricingRegistry[normalized]) {\r\n return customPricingRegistry[normalized];\r\n }\r\n if (customPricingRegistry[modelName]) {\r\n return customPricingRegistry[modelName];\r\n }\r\n\r\n // Check built-in table with normalized key\r\n if (MODEL_PRICING_TABLE[normalized]) {\r\n return MODEL_PRICING_TABLE[normalized];\r\n }\r\n // Check built-in table with direct key\r\n if (MODEL_PRICING_TABLE[modelName]) {\r\n return MODEL_PRICING_TABLE[modelName];\r\n }\r\n\r\n // Check alias table fallback\r\n const alias = MODEL_ALIASES[modelName.toLowerCase().trim()];\r\n if (alias && MODEL_PRICING_TABLE[alias]) {\r\n return MODEL_PRICING_TABLE[alias];\r\n }\r\n\r\n // Fallback defaults for unknown models (conservative estimates: $1.00 in, $3.00 out)\r\n return {\r\n inputPer1M: 1.0,\r\n outputPer1M: 3.0,\r\n cachedInputPer1M: 0.5,\r\n };\r\n}\r\n\r\n/**\r\n * Register or override pricing rates for a custom model\r\n */\r\nexport function registerModelPricing(modelName: string, rates: ModelPricingRates): void {\r\n const normalized = normalizeModelKey(modelName);\r\n customPricingRegistry[normalized] = rates;\r\n customPricingRegistry[modelName] = rates;\r\n}\r\n","import type { InferenceCost, TokenUsage, InlineRateConfig, ModelPricingRates } from '../types';\nimport { getModelPricing } from './table';\n\nexport interface CalculateCostParams {\n model: string;\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cachedTokens?: number;\n cacheWriteTokens?: number;\n markupMultiplier?: number;\n minimumChargeUSD?: number;\n customRate?: InlineRateConfig;\n}\n\n/**\n * BigInt Nano-Precision Financial Math Engine\n * 1 USD = 1,000,000,000 Nano-USD (10^9)\n * 1 token at $1.00 / 1M = $0.000001 = 1,000 Nano-USD\n * Prevents IEEE 754 floating point precision drift on micro-transactions.\n */\nexport function calculateCost(params: CalculateCostParams): InferenceCost {\n let rates: ModelPricingRates;\n\n if (params.customRate) {\n const outRate = params.customRate.out ?? params.customRate.output ?? 0;\n rates = {\n inputPer1M: params.customRate.in,\n outputPer1M: outRate,\n reasoningPer1M: params.customRate.reasoning ?? outRate,\n cachedInputPer1M: params.customRate.cached ?? params.customRate.in * 0.15,\n currency: 'USD',\n };\n } else {\n rates = getModelPricing(params.model);\n }\n\n const inputTokens = BigInt(Math.max(0, params.inputTokens ?? 0));\n const outputTokens = BigInt(Math.max(0, params.outputTokens ?? 0));\n const reasoningTokens = BigInt(Math.max(0, params.reasoningTokens ?? 0));\n const cachedTokens = BigInt(Math.max(0, params.cachedTokens ?? 0));\n\n // Regular input tokens (minus any cached tokens)\n const regularInputTokens = inputTokens > cachedTokens ? inputTokens - cachedTokens : 0n;\n\n // Convert rate per 1M tokens to integer nano-dollars per single token (rate * 1,000)\n // Using 10^9 nano-precision\n const rateInputNano = BigInt(Math.round(rates.inputPer1M * 1_000));\n const cachedPer1M = rates.cachedInputPer1M ?? rates.inputPer1M * 0.15;\n const rateCachedNano = BigInt(Math.round(cachedPer1M * 1_000));\n const rateOutputNano = BigInt(Math.round(rates.outputPer1M * 1_000));\n const reasoningPer1M = rates.reasoningPer1M ?? rates.outputPer1M;\n const rateReasoningNano = BigInt(Math.round(reasoningPer1M * 1_000));\n\n // Compute component nano costs\n const regularInputCostNano = regularInputTokens * rateInputNano;\n const cachedInputCostNano = cachedTokens * rateCachedNano;\n const inputCostNano = regularInputCostNano + cachedInputCostNano;\n const outputCostNano = outputTokens * rateOutputNano;\n const reasoningCostNano = reasoningTokens * rateReasoningNano;\n\n // Prompt cache savings discount\n const standardCacheCostNano = cachedTokens * rateInputNano;\n const cachedDiscountNano =\n standardCacheCostNano > cachedInputCostNano ? standardCacheCostNano - cachedInputCostNano : 0n;\n\n // Total wholesale cost\n const wholesaleNano = inputCostNano + outputCostNano;\n\n // Retail calculation\n const markup = params.markupMultiplier ?? 1.0;\n let billedNano = wholesaleNano;\n let hasRetail = false;\n\n if (markup !== 1.0 || params.minimumChargeUSD !== undefined) {\n hasRetail = true;\n const markupMultiplierNano = BigInt(Math.round(markup * 1_000));\n billedNano = (wholesaleNano * markupMultiplierNano) / 1_000n;\n\n if (params.minimumChargeUSD !== undefined && params.minimumChargeUSD > 0) {\n const minChargeNano = BigInt(Math.round(params.minimumChargeUSD * 1_000_000_000));\n if (billedNano < minChargeNano) {\n billedNano = minChargeNano;\n }\n }\n }\n\n const inputCostUSD = Number(inputCostNano) / 1_000_000_000;\n const outputCostUSD = Number(outputCostNano) / 1_000_000_000;\n const reasoningCostUSD = Number(reasoningCostNano) / 1_000_000_000;\n const cachedDiscountUSD = Number(cachedDiscountNano) / 1_000_000_000;\n const totalUSD = Number(wholesaleNano) / 1_000_000_000;\n const wholesaleTotalUSD = totalUSD;\n const billedUSD = Number(billedNano) / 1_000_000_000;\n const profitUSD = Math.max(0, billedUSD - wholesaleTotalUSD);\n const retailUSD = hasRetail ? billedUSD : undefined;\n\n return {\n inputCostUSD: Number(inputCostUSD.toFixed(8)),\n outputCostUSD: Number(outputCostUSD.toFixed(8)),\n reasoningCostUSD: reasoningTokens > 0n ? Number(reasoningCostUSD.toFixed(8)) : undefined,\n cachedDiscountUSD: cachedTokens > 0n ? Number(cachedDiscountUSD.toFixed(8)) : undefined,\n totalUSD: Number(totalUSD.toFixed(8)),\n wholesaleTotalUSD: Number(wholesaleTotalUSD.toFixed(8)),\n billedUSD: Number(billedUSD.toFixed(8)),\n profitUSD: Number(profitUSD.toFixed(8)),\n retailUSD: retailUSD !== undefined ? Number(retailUSD.toFixed(8)) : undefined,\n currency: rates.currency || 'USD',\n };\n}\n\n/**\n * Calculates cost directly from a TokenUsage object\n */\nexport function calculateUsageCost(\n model: string,\n usage: TokenUsage,\n optionsOrMarkup?: number | { markupMultiplier?: number; minimumChargeUSD?: number; customRate?: InlineRateConfig }\n): InferenceCost {\n const options =\n typeof optionsOrMarkup === 'number'\n ? { markupMultiplier: optionsOrMarkup }\n : optionsOrMarkup || {};\n\n return calculateCost({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n reasoningTokens: usage.reasoningTokens,\n cachedTokens: usage.cachedTokens,\n cacheWriteTokens: usage.cacheWriteTokens,\n markupMultiplier: options.markupMultiplier,\n minimumChargeUSD: options.minimumChargeUSD,\n customRate: options.customRate,\n });\n}\n"],"mappings":"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","names":[]}
|