tokenmeter 0.9.0
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 -0
- package/README.md +346 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +94 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/elevenlabs.test.d.ts +2 -0
- package/dist/__tests__/elevenlabs.test.d.ts.map +1 -0
- package/dist/__tests__/elevenlabs.test.js +108 -0
- package/dist/__tests__/elevenlabs.test.js.map +1 -0
- package/dist/__tests__/fal.test.d.ts +2 -0
- package/dist/__tests__/fal.test.d.ts.map +1 -0
- package/dist/__tests__/fal.test.js +153 -0
- package/dist/__tests__/fal.test.js.map +1 -0
- package/dist/__tests__/pricing.test.d.ts +2 -0
- package/dist/__tests__/pricing.test.d.ts.map +1 -0
- package/dist/__tests__/pricing.test.js +76 -0
- package/dist/__tests__/pricing.test.js.map +1 -0
- package/dist/__tests__/recorder.test.d.ts +2 -0
- package/dist/__tests__/recorder.test.d.ts.map +1 -0
- package/dist/__tests__/recorder.test.js +133 -0
- package/dist/__tests__/recorder.test.js.map +1 -0
- package/dist/__tests__/storage.test.d.ts +2 -0
- package/dist/__tests__/storage.test.d.ts.map +1 -0
- package/dist/__tests__/storage.test.js +106 -0
- package/dist/__tests__/storage.test.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +166 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +80 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +131 -0
- package/dist/context.js.map +1 -0
- package/dist/exporter/PostgresExporter.d.ts +82 -0
- package/dist/exporter/PostgresExporter.d.ts.map +1 -0
- package/dist/exporter/PostgresExporter.js +237 -0
- package/dist/exporter/PostgresExporter.js.map +1 -0
- package/dist/exporter/index.d.ts +8 -0
- package/dist/exporter/index.d.ts.map +1 -0
- package/dist/exporter/index.js +7 -0
- package/dist/exporter/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/proxy.d.ts +26 -0
- package/dist/instrumentation/proxy.d.ts.map +1 -0
- package/dist/instrumentation/proxy.js +337 -0
- package/dist/instrumentation/proxy.js.map +1 -0
- package/dist/instrumentation/strategies/index.d.ts +55 -0
- package/dist/instrumentation/strategies/index.d.ts.map +1 -0
- package/dist/instrumentation/strategies/index.js +429 -0
- package/dist/instrumentation/strategies/index.js.map +1 -0
- package/dist/integrations/express/index.d.ts +137 -0
- package/dist/integrations/express/index.d.ts.map +1 -0
- package/dist/integrations/express/index.js +186 -0
- package/dist/integrations/express/index.js.map +1 -0
- package/dist/integrations/inngest/index.d.ts +222 -0
- package/dist/integrations/inngest/index.d.ts.map +1 -0
- package/dist/integrations/inngest/index.js +223 -0
- package/dist/integrations/inngest/index.js.map +1 -0
- package/dist/integrations/langfuse/index.d.ts +170 -0
- package/dist/integrations/langfuse/index.d.ts.map +1 -0
- package/dist/integrations/langfuse/index.js +225 -0
- package/dist/integrations/langfuse/index.js.map +1 -0
- package/dist/integrations/next/index.d.ts +138 -0
- package/dist/integrations/next/index.d.ts.map +1 -0
- package/dist/integrations/next/index.js +170 -0
- package/dist/integrations/next/index.js.map +1 -0
- package/dist/integrations/nextjs/index.d.ts +198 -0
- package/dist/integrations/nextjs/index.d.ts.map +1 -0
- package/dist/integrations/nextjs/index.js +181 -0
- package/dist/integrations/nextjs/index.js.map +1 -0
- package/dist/integrations/vercel-ai/index.d.ts +288 -0
- package/dist/integrations/vercel-ai/index.d.ts.map +1 -0
- package/dist/integrations/vercel-ai/index.js +260 -0
- package/dist/integrations/vercel-ai/index.js.map +1 -0
- package/dist/logger.d.ts +58 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +89 -0
- package/dist/logger.js.map +1 -0
- package/dist/pricing/catalog.d.ts +10 -0
- package/dist/pricing/catalog.d.ts.map +1 -0
- package/dist/pricing/catalog.js +297 -0
- package/dist/pricing/catalog.js.map +1 -0
- package/dist/pricing/index.d.ts +77 -0
- package/dist/pricing/index.d.ts.map +1 -0
- package/dist/pricing/index.js +251 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/manifest.d.ts +156 -0
- package/dist/pricing/manifest.d.ts.map +1 -0
- package/dist/pricing/manifest.js +381 -0
- package/dist/pricing/manifest.js.map +1 -0
- package/dist/pricing/manifest.json +12786 -0
- package/dist/pricing/providers/anthropic.json +253 -0
- package/dist/pricing/providers/bedrock.json +341 -0
- package/dist/pricing/providers/bfl.json +220 -0
- package/dist/pricing/providers/elevenlabs.json +142 -0
- package/dist/pricing/providers/fal.json +15866 -0
- package/dist/pricing/providers/google.json +346 -0
- package/dist/pricing/providers/openai.json +1035 -0
- package/dist/pricing/schema.d.ts +102 -0
- package/dist/pricing/schema.d.ts.map +1 -0
- package/dist/pricing/schema.js +56 -0
- package/dist/pricing/schema.js.map +1 -0
- package/dist/processor/TokenMeterProcessor.d.ts +55 -0
- package/dist/processor/TokenMeterProcessor.d.ts.map +1 -0
- package/dist/processor/TokenMeterProcessor.js +132 -0
- package/dist/processor/TokenMeterProcessor.js.map +1 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/client.d.ts.map +1 -0
- package/dist/query/client.js +206 -0
- package/dist/query/client.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +7 -0
- package/dist/query/index.js.map +1 -0
- package/dist/recorder.d.ts +74 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +227 -0
- package/dist/recorder.js.map +1 -0
- package/dist/sdks/anthropic.d.ts +21 -0
- package/dist/sdks/anthropic.d.ts.map +1 -0
- package/dist/sdks/anthropic.js +258 -0
- package/dist/sdks/anthropic.js.map +1 -0
- package/dist/sdks/elevenlabs.d.ts +59 -0
- package/dist/sdks/elevenlabs.d.ts.map +1 -0
- package/dist/sdks/elevenlabs.js +192 -0
- package/dist/sdks/elevenlabs.js.map +1 -0
- package/dist/sdks/fal.d.ts +102 -0
- package/dist/sdks/fal.d.ts.map +1 -0
- package/dist/sdks/fal.js +306 -0
- package/dist/sdks/fal.js.map +1 -0
- package/dist/sdks/openai.d.ts +17 -0
- package/dist/sdks/openai.d.ts.map +1 -0
- package/dist/sdks/openai.js +191 -0
- package/dist/sdks/openai.js.map +1 -0
- package/dist/storage/interface.d.ts +15 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +53 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/prisma.d.ts +15 -0
- package/dist/storage/prisma.d.ts.map +1 -0
- package/dist/storage/prisma.js +135 -0
- package/dist/storage/prisma.js.map +1 -0
- package/dist/types.d.ts +206 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/vercel-ai/index.d.ts +89 -0
- package/dist/vercel-ai/index.d.ts.map +1 -0
- package/dist/vercel-ai/index.js +298 -0
- package/dist/vercel-ai/index.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing Manifest Fetcher
|
|
3
|
+
*
|
|
4
|
+
* Remote-first pricing with local fallback for reliability.
|
|
5
|
+
* Fetches latest pricing from CDN, falls back to bundled data if unavailable.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "../logger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Default Pricing API URL.
|
|
10
|
+
* Primary source for pricing data with automatic updates.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_API_URL = "https://pricing.tokenmeter.dev/api/v1";
|
|
13
|
+
/**
|
|
14
|
+
* Fallback CDN URL for the pricing manifest.
|
|
15
|
+
* Used when the API is unavailable.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_CDN_URL = "https://cdn.jsdelivr.net/npm/tokenmeter@latest/dist/pricing/manifest.json";
|
|
18
|
+
// Global configuration
|
|
19
|
+
let globalConfig = {};
|
|
20
|
+
// Model alias storage for fast lookup
|
|
21
|
+
let modelAliases = {};
|
|
22
|
+
// Cache for the loaded manifest
|
|
23
|
+
let cachedManifest = null;
|
|
24
|
+
let manifestLoadPromise = null;
|
|
25
|
+
let cacheTimestamp = null;
|
|
26
|
+
/**
|
|
27
|
+
* Configure global pricing settings.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { configurePricing } from 'tokenmeter';
|
|
32
|
+
*
|
|
33
|
+
* // Use custom CDN
|
|
34
|
+
* configurePricing({ manifestUrl: 'https://your-cdn.com/manifest.json' });
|
|
35
|
+
*
|
|
36
|
+
* // Offline mode (bundled pricing only)
|
|
37
|
+
* configurePricing({ offlineMode: true });
|
|
38
|
+
*
|
|
39
|
+
* // Custom model aliases
|
|
40
|
+
* configurePricing({
|
|
41
|
+
* modelAliases: {
|
|
42
|
+
* "bedrock-claude-4-5-sonnet": { provider: "bedrock", model: "anthropic.claude-sonnet-4-5" },
|
|
43
|
+
* }
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function configurePricing(config) {
|
|
48
|
+
globalConfig = { ...globalConfig, ...config };
|
|
49
|
+
// Update model aliases if provided
|
|
50
|
+
if (config.modelAliases) {
|
|
51
|
+
modelAliases = { ...modelAliases, ...config.modelAliases };
|
|
52
|
+
}
|
|
53
|
+
// Clear cache when config changes
|
|
54
|
+
clearManifestCache();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the current pricing configuration.
|
|
58
|
+
*/
|
|
59
|
+
export function getPricingConfig() {
|
|
60
|
+
return { ...globalConfig };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a manifest from the bundled provider JSON files (local fallback)
|
|
64
|
+
*/
|
|
65
|
+
async function buildLocalManifest() {
|
|
66
|
+
// Import existing provider pricing files
|
|
67
|
+
const [openaiPricing, anthropicPricing, googlePricing, elevenlabsPricing, falPricing, bedrockPricing, bflPricing,] = await Promise.all([
|
|
68
|
+
import("./providers/openai.json", { with: { type: "json" } }),
|
|
69
|
+
import("./providers/anthropic.json", { with: { type: "json" } }),
|
|
70
|
+
import("./providers/google.json", { with: { type: "json" } }),
|
|
71
|
+
import("./providers/elevenlabs.json", { with: { type: "json" } }),
|
|
72
|
+
import("./providers/fal.json", { with: { type: "json" } }),
|
|
73
|
+
import("./providers/bedrock.json", { with: { type: "json" } }),
|
|
74
|
+
import("./providers/bfl.json", { with: { type: "json" } }),
|
|
75
|
+
]);
|
|
76
|
+
// Convert to manifest format
|
|
77
|
+
const manifest = {
|
|
78
|
+
version: "1.0.0",
|
|
79
|
+
updatedAt: new Date().toISOString(),
|
|
80
|
+
providers: {},
|
|
81
|
+
};
|
|
82
|
+
// Helper to convert old format to new format
|
|
83
|
+
const convertProvider = (providerData, defaultUnit) => {
|
|
84
|
+
const pricing = {};
|
|
85
|
+
for (const [modelId, model] of Object.entries(providerData.models)) {
|
|
86
|
+
const m = model;
|
|
87
|
+
if (!m.pricing || m.pricing.length === 0)
|
|
88
|
+
continue;
|
|
89
|
+
const currentPricing = m.pricing[m.pricing.length - 1];
|
|
90
|
+
if (!currentPricing)
|
|
91
|
+
continue;
|
|
92
|
+
// Map old units to new units
|
|
93
|
+
let unit = defaultUnit;
|
|
94
|
+
if (m.unit === "tokens")
|
|
95
|
+
unit = "1m_tokens";
|
|
96
|
+
else if (m.unit === "characters")
|
|
97
|
+
unit = "1k_characters";
|
|
98
|
+
else if (m.unit === "images")
|
|
99
|
+
unit = "image";
|
|
100
|
+
else if (m.unit === "seconds")
|
|
101
|
+
unit = "second";
|
|
102
|
+
else if (m.unit === "minutes")
|
|
103
|
+
unit = "minute";
|
|
104
|
+
else if (m.unit === "megapixels")
|
|
105
|
+
unit = "megapixel";
|
|
106
|
+
else if (m.unit === "requests")
|
|
107
|
+
unit = "request";
|
|
108
|
+
const modelPricing = {
|
|
109
|
+
input: currentPricing.input,
|
|
110
|
+
output: currentPricing.output,
|
|
111
|
+
cachedInput: currentPricing.cachedInput,
|
|
112
|
+
cost: currentPricing.cost,
|
|
113
|
+
unit,
|
|
114
|
+
};
|
|
115
|
+
pricing[modelId] = modelPricing;
|
|
116
|
+
// Also add aliases
|
|
117
|
+
if (m.aliases) {
|
|
118
|
+
for (const alias of m.aliases) {
|
|
119
|
+
pricing[alias] = modelPricing;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return pricing;
|
|
124
|
+
};
|
|
125
|
+
manifest.providers.openai = convertProvider(openaiPricing.default, "1m_tokens");
|
|
126
|
+
manifest.providers.anthropic = convertProvider(anthropicPricing.default, "1m_tokens");
|
|
127
|
+
manifest.providers.google = convertProvider(googlePricing.default, "1m_tokens");
|
|
128
|
+
manifest.providers.elevenlabs = convertProvider(elevenlabsPricing.default, "1k_characters");
|
|
129
|
+
manifest.providers.fal = convertProvider(falPricing.default, "request");
|
|
130
|
+
manifest.providers.bedrock = convertProvider(bedrockPricing.default, "1m_tokens");
|
|
131
|
+
manifest.providers.bfl = convertProvider(bflPricing.default, "image");
|
|
132
|
+
return manifest;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch manifest from remote URL with timeout
|
|
136
|
+
*/
|
|
137
|
+
async function fetchRemoteManifest(url, timeoutMs) {
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
140
|
+
try {
|
|
141
|
+
const response = await fetch(url, {
|
|
142
|
+
headers: {
|
|
143
|
+
Accept: "application/json",
|
|
144
|
+
"User-Agent": "tokenmeter/5.0",
|
|
145
|
+
},
|
|
146
|
+
signal: controller.signal,
|
|
147
|
+
});
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
throw new Error(`Failed to fetch manifest: ${response.status} ${response.statusText}`);
|
|
150
|
+
}
|
|
151
|
+
return response.json();
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
clearTimeout(timeoutId);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fetch manifest from Pricing API and convert to internal format
|
|
159
|
+
*/
|
|
160
|
+
async function fetchFromAPI(apiUrl, timeoutMs) {
|
|
161
|
+
const controller = new AbortController();
|
|
162
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
163
|
+
try {
|
|
164
|
+
const response = await fetch(`${apiUrl}/manifest`, {
|
|
165
|
+
headers: {
|
|
166
|
+
Accept: "application/json",
|
|
167
|
+
"User-Agent": "tokenmeter/5.0",
|
|
168
|
+
},
|
|
169
|
+
signal: controller.signal,
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
throw new Error(`Failed to fetch from API: ${response.status} ${response.statusText}`);
|
|
173
|
+
}
|
|
174
|
+
const apiManifest = (await response.json());
|
|
175
|
+
// Convert API format to internal format
|
|
176
|
+
const manifest = {
|
|
177
|
+
version: apiManifest.version || "1.0.0",
|
|
178
|
+
updatedAt: apiManifest.updated_at || new Date().toISOString(),
|
|
179
|
+
providers: {},
|
|
180
|
+
};
|
|
181
|
+
// Group models by provider
|
|
182
|
+
for (const [modelId, model] of Object.entries(apiManifest.models || {})) {
|
|
183
|
+
if (!manifest.providers[model.provider]) {
|
|
184
|
+
manifest.providers[model.provider] = {};
|
|
185
|
+
}
|
|
186
|
+
manifest.providers[model.provider][modelId] = {
|
|
187
|
+
input: model.input,
|
|
188
|
+
output: model.output,
|
|
189
|
+
cachedInput: model.cached_input,
|
|
190
|
+
cachedOutput: model.cached_output,
|
|
191
|
+
cacheWrite: model.cache_write,
|
|
192
|
+
cacheRead: model.cache_read,
|
|
193
|
+
unit: model.unit || "1m_tokens",
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
return manifest;
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
clearTimeout(timeoutId);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Load the pricing manifest.
|
|
204
|
+
*
|
|
205
|
+
* Fetches from Pricing API first, then CDN, with automatic fallback
|
|
206
|
+
* to bundled local data if all remote sources are unavailable.
|
|
207
|
+
*
|
|
208
|
+
* @param options.apiUrl - Override the API URL
|
|
209
|
+
* @param options.cdnUrl - Override the CDN URL
|
|
210
|
+
* @param options.manifestUrl - Legacy: Override the manifest URL (deprecated)
|
|
211
|
+
* @param options.forceRefresh - Force reload even if cached
|
|
212
|
+
* @param options.offlineMode - Skip remote fetch, use local only
|
|
213
|
+
*/
|
|
214
|
+
export async function loadManifest(options = {}) {
|
|
215
|
+
// Merge with global config
|
|
216
|
+
const config = { ...globalConfig, ...options };
|
|
217
|
+
const cacheTimeout = config.cacheTimeout ?? 5 * 60 * 1000; // 5 minutes default
|
|
218
|
+
// Check if cache is still valid
|
|
219
|
+
const isCacheValid = cachedManifest &&
|
|
220
|
+
cacheTimestamp &&
|
|
221
|
+
Date.now() - cacheTimestamp < cacheTimeout;
|
|
222
|
+
// Return cached if available, valid, and not forcing refresh
|
|
223
|
+
if (isCacheValid && !config.forceRefresh) {
|
|
224
|
+
return cachedManifest;
|
|
225
|
+
}
|
|
226
|
+
// If already loading, wait for that
|
|
227
|
+
if (manifestLoadPromise && !config.forceRefresh) {
|
|
228
|
+
return manifestLoadPromise;
|
|
229
|
+
}
|
|
230
|
+
manifestLoadPromise = (async () => {
|
|
231
|
+
// If offline mode, skip remote fetch
|
|
232
|
+
if (config.offlineMode) {
|
|
233
|
+
logger.debug("Offline mode enabled, using bundled pricing");
|
|
234
|
+
cachedManifest = await buildLocalManifest();
|
|
235
|
+
cacheTimestamp = Date.now();
|
|
236
|
+
return cachedManifest;
|
|
237
|
+
}
|
|
238
|
+
const timeout = config.fetchTimeout ?? 5000;
|
|
239
|
+
// Try Pricing API first
|
|
240
|
+
const apiUrl = config.apiUrl || DEFAULT_API_URL;
|
|
241
|
+
try {
|
|
242
|
+
cachedManifest = await fetchFromAPI(apiUrl, timeout);
|
|
243
|
+
cacheTimestamp = Date.now();
|
|
244
|
+
logger.info("Loaded pricing manifest from API");
|
|
245
|
+
return cachedManifest;
|
|
246
|
+
}
|
|
247
|
+
catch (apiError) {
|
|
248
|
+
logger.debug("API unavailable, trying CDN:", apiError);
|
|
249
|
+
}
|
|
250
|
+
// Try CDN as fallback
|
|
251
|
+
const cdnUrl = config.cdnUrl || config.manifestUrl || DEFAULT_CDN_URL;
|
|
252
|
+
try {
|
|
253
|
+
cachedManifest = await fetchRemoteManifest(cdnUrl, timeout);
|
|
254
|
+
cacheTimestamp = Date.now();
|
|
255
|
+
logger.info("Loaded pricing manifest from CDN");
|
|
256
|
+
return cachedManifest;
|
|
257
|
+
}
|
|
258
|
+
catch (cdnError) {
|
|
259
|
+
logger.debug("CDN unavailable, using bundled pricing:", cdnError);
|
|
260
|
+
}
|
|
261
|
+
// Fallback to local bundled pricing
|
|
262
|
+
logger.warn("All remote sources unavailable, using bundled pricing");
|
|
263
|
+
cachedManifest = await buildLocalManifest();
|
|
264
|
+
cacheTimestamp = Date.now();
|
|
265
|
+
return cachedManifest;
|
|
266
|
+
})();
|
|
267
|
+
return manifestLoadPromise;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get pricing for a specific model
|
|
271
|
+
*/
|
|
272
|
+
export function getModelPricing(provider, model, manifest) {
|
|
273
|
+
// 1. Check custom model aliases first
|
|
274
|
+
const alias = modelAliases[model];
|
|
275
|
+
if (alias) {
|
|
276
|
+
const aliasProviderPricing = manifest.providers[alias.provider];
|
|
277
|
+
if (aliasProviderPricing?.[alias.model]) {
|
|
278
|
+
return aliasProviderPricing[alias.model];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const providerPricing = manifest.providers[provider];
|
|
282
|
+
if (!providerPricing) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
// 2. Try exact match
|
|
286
|
+
if (providerPricing[model]) {
|
|
287
|
+
return providerPricing[model];
|
|
288
|
+
}
|
|
289
|
+
// 3. Try without version suffix (e.g., "gpt-4o-2024-05-13" -> "gpt-4o")
|
|
290
|
+
const baseModel = model.replace(/-\d{4}-\d{2}-\d{2}$/, "");
|
|
291
|
+
if (baseModel !== model && providerPricing[baseModel]) {
|
|
292
|
+
return providerPricing[baseModel];
|
|
293
|
+
}
|
|
294
|
+
// 4. Try with provider prefix stripped (some APIs return just the model name)
|
|
295
|
+
const withoutPrefix = model.replace(/^[^/]+\//, "");
|
|
296
|
+
if (withoutPrefix !== model && providerPricing[withoutPrefix]) {
|
|
297
|
+
return providerPricing[withoutPrefix];
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Calculate cost based on usage and pricing
|
|
303
|
+
*/
|
|
304
|
+
export function calculateCost(usage, pricing) {
|
|
305
|
+
let cost = 0;
|
|
306
|
+
// Get the divisor based on unit
|
|
307
|
+
const getDivisor = (unit) => {
|
|
308
|
+
switch (unit) {
|
|
309
|
+
case "1m_tokens":
|
|
310
|
+
return 1_000_000;
|
|
311
|
+
case "1k_tokens":
|
|
312
|
+
case "1k_characters":
|
|
313
|
+
return 1_000;
|
|
314
|
+
default:
|
|
315
|
+
return 1;
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
const divisor = getDivisor(pricing.unit);
|
|
319
|
+
// Flat cost (request-based pricing)
|
|
320
|
+
if (pricing.cost !== undefined) {
|
|
321
|
+
cost += pricing.cost;
|
|
322
|
+
}
|
|
323
|
+
// Input cost
|
|
324
|
+
if (usage.inputUnits !== undefined && pricing.input !== undefined) {
|
|
325
|
+
cost += (usage.inputUnits / divisor) * pricing.input;
|
|
326
|
+
}
|
|
327
|
+
// Output cost
|
|
328
|
+
if (usage.outputUnits !== undefined && pricing.output !== undefined) {
|
|
329
|
+
cost += (usage.outputUnits / divisor) * pricing.output;
|
|
330
|
+
}
|
|
331
|
+
// Cached input cost
|
|
332
|
+
if (usage.cachedInputUnits !== undefined &&
|
|
333
|
+
pricing.cachedInput !== undefined) {
|
|
334
|
+
cost += (usage.cachedInputUnits / divisor) * pricing.cachedInput;
|
|
335
|
+
}
|
|
336
|
+
return cost;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get the cached manifest (or null if not loaded)
|
|
340
|
+
*/
|
|
341
|
+
export function getCachedManifest() {
|
|
342
|
+
return cachedManifest;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Clear the manifest cache
|
|
346
|
+
*/
|
|
347
|
+
export function clearManifestCache() {
|
|
348
|
+
cachedManifest = null;
|
|
349
|
+
manifestLoadPromise = null;
|
|
350
|
+
cacheTimestamp = null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Set model aliases for pricing lookup.
|
|
354
|
+
* Merges with existing aliases.
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```typescript
|
|
358
|
+
* import { setModelAliases } from 'tokenmeter';
|
|
359
|
+
*
|
|
360
|
+
* setModelAliases({
|
|
361
|
+
* "bedrock-claude-4-5-sonnet": { provider: "bedrock", model: "anthropic.claude-sonnet-4-5" },
|
|
362
|
+
* "my-custom-gpt": { provider: "openai", model: "gpt-4o" },
|
|
363
|
+
* });
|
|
364
|
+
* ```
|
|
365
|
+
*/
|
|
366
|
+
export function setModelAliases(aliases) {
|
|
367
|
+
modelAliases = { ...modelAliases, ...aliases };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Clear all model aliases
|
|
371
|
+
*/
|
|
372
|
+
export function clearModelAliases() {
|
|
373
|
+
modelAliases = {};
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Get current model aliases
|
|
377
|
+
*/
|
|
378
|
+
export function getModelAliases() {
|
|
379
|
+
return { ...modelAliases };
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/pricing/manifest.ts"],"names":[],"mappings":"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"}
|