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,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing Module
|
|
3
|
+
*
|
|
4
|
+
* Loads and provides access to standardized pricing data for all providers.
|
|
5
|
+
* Pricing files are JSON and can be contributed via PRs.
|
|
6
|
+
*/
|
|
7
|
+
import { getCurrentPricing, getPricingAtDate, getDefaultUnitSize, } from "./schema.js";
|
|
8
|
+
// Import provider pricing files
|
|
9
|
+
import openaiPricing from "./providers/openai.json" with { type: "json" };
|
|
10
|
+
import anthropicPricing from "./providers/anthropic.json" with { type: "json" };
|
|
11
|
+
import elevenlabsPricing from "./providers/elevenlabs.json" with { type: "json" };
|
|
12
|
+
import falPricing from "./providers/fal.json" with { type: "json" };
|
|
13
|
+
export { getCurrentPricing, getPricingAtDate, getDefaultUnitSize };
|
|
14
|
+
/**
|
|
15
|
+
* All provider pricing data
|
|
16
|
+
*/
|
|
17
|
+
export const providers = {
|
|
18
|
+
openai: openaiPricing,
|
|
19
|
+
anthropic: anthropicPricing,
|
|
20
|
+
elevenlabs: elevenlabsPricing,
|
|
21
|
+
fal: falPricing,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Build a flat PricingConfig from the JSON provider files
|
|
25
|
+
* This provides backward compatibility with the old pricing format
|
|
26
|
+
*/
|
|
27
|
+
function buildDefaultPricing() {
|
|
28
|
+
const pricing = {};
|
|
29
|
+
for (const [providerId, providerData] of Object.entries(providers)) {
|
|
30
|
+
for (const [modelId, model] of Object.entries(providerData.models)) {
|
|
31
|
+
const currentPricing = getCurrentPricing(model);
|
|
32
|
+
if (!currentPricing)
|
|
33
|
+
continue;
|
|
34
|
+
const unitSize = model.unitSize ?? getDefaultUnitSize(model.unit);
|
|
35
|
+
// For token/character-based pricing, convert to per-1K
|
|
36
|
+
// For image/video/request-based pricing, keep as-is (unitSize is 1)
|
|
37
|
+
// JSON files store prices per unitSize, old format uses per 1K for tokens
|
|
38
|
+
let inputPrice = currentPricing.input ?? 0;
|
|
39
|
+
let outputPrice = currentPricing.output ?? 0;
|
|
40
|
+
let cachedInputPrice = currentPricing.cachedInput;
|
|
41
|
+
// Only apply conversion for token/character based models
|
|
42
|
+
if (model.unit === "tokens" || model.unit === "characters") {
|
|
43
|
+
const multiplier = unitSize / 1000;
|
|
44
|
+
inputPrice = inputPrice / multiplier;
|
|
45
|
+
outputPrice = outputPrice / multiplier;
|
|
46
|
+
if (cachedInputPrice !== undefined) {
|
|
47
|
+
cachedInputPrice = cachedInputPrice / multiplier;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const modelPricing = {
|
|
51
|
+
input: inputPrice,
|
|
52
|
+
output: outputPrice,
|
|
53
|
+
};
|
|
54
|
+
if (cachedInputPrice !== undefined) {
|
|
55
|
+
modelPricing.cachedInput = cachedInputPrice;
|
|
56
|
+
}
|
|
57
|
+
// Add with provider prefix
|
|
58
|
+
pricing[`${providerId}/${modelId}`] = modelPricing;
|
|
59
|
+
// Add without prefix
|
|
60
|
+
pricing[modelId] = modelPricing;
|
|
61
|
+
// Add aliases
|
|
62
|
+
if (model.aliases) {
|
|
63
|
+
for (const alias of model.aliases) {
|
|
64
|
+
pricing[alias] = modelPricing;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return pricing;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Default pricing in flat format (backward compatible)
|
|
73
|
+
*/
|
|
74
|
+
export const defaultPricing = buildDefaultPricing();
|
|
75
|
+
/**
|
|
76
|
+
* Merge custom pricing with defaults
|
|
77
|
+
*/
|
|
78
|
+
export function mergePricing(base, overrides) {
|
|
79
|
+
return { ...base, ...overrides };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Calculate cost for a model (backward compatible API)
|
|
83
|
+
*
|
|
84
|
+
* @param model - Model identifier
|
|
85
|
+
* @param inputTokens - Number of input tokens
|
|
86
|
+
* @param outputTokens - Number of output tokens
|
|
87
|
+
* @param pricing - Pricing configuration
|
|
88
|
+
* @param cachedInputTokens - Optional number of cached input tokens
|
|
89
|
+
* @returns Cost in USD
|
|
90
|
+
*/
|
|
91
|
+
export function calculateCost(model, inputTokens, outputTokens, pricing, cachedInputTokens) {
|
|
92
|
+
const modelPricing = pricing[model];
|
|
93
|
+
if (!modelPricing) {
|
|
94
|
+
console.warn(`[tokenmeter] No pricing found for model: ${model}`);
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
let cost = 0;
|
|
98
|
+
// Calculate input cost (per 1K tokens)
|
|
99
|
+
cost += (inputTokens / 1000) * modelPricing.input;
|
|
100
|
+
// Calculate output cost (per 1K tokens)
|
|
101
|
+
cost += (outputTokens / 1000) * modelPricing.output;
|
|
102
|
+
// Calculate cached input cost if applicable
|
|
103
|
+
if (cachedInputTokens && modelPricing.cachedInput) {
|
|
104
|
+
cost += (cachedInputTokens / 1000) * modelPricing.cachedInput;
|
|
105
|
+
}
|
|
106
|
+
return cost;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build a flat lookup map from model ID to pricing info
|
|
110
|
+
* Includes aliases and provider-prefixed versions
|
|
111
|
+
*/
|
|
112
|
+
function buildPricingLookup() {
|
|
113
|
+
const lookup = new Map();
|
|
114
|
+
for (const [providerId, providerData] of Object.entries(providers)) {
|
|
115
|
+
for (const [modelId, model] of Object.entries(providerData.models)) {
|
|
116
|
+
const entry = { provider: providerId, modelId, model };
|
|
117
|
+
// Add base model ID
|
|
118
|
+
lookup.set(modelId, entry);
|
|
119
|
+
// Add provider-prefixed version
|
|
120
|
+
lookup.set(`${providerId}/${modelId}`, entry);
|
|
121
|
+
// Add aliases
|
|
122
|
+
if (model.aliases) {
|
|
123
|
+
for (const alias of model.aliases) {
|
|
124
|
+
lookup.set(alias, entry);
|
|
125
|
+
// Also add without provider prefix if it has one
|
|
126
|
+
if (alias.includes("/")) {
|
|
127
|
+
const withoutPrefix = alias.split("/").slice(1).join("/");
|
|
128
|
+
if (withoutPrefix && !lookup.has(withoutPrefix)) {
|
|
129
|
+
lookup.set(withoutPrefix, entry);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return lookup;
|
|
137
|
+
}
|
|
138
|
+
// Cached lookup map
|
|
139
|
+
let pricingLookup = null;
|
|
140
|
+
/**
|
|
141
|
+
* Get the pricing lookup map (lazily built and cached)
|
|
142
|
+
*/
|
|
143
|
+
function getLookup() {
|
|
144
|
+
if (!pricingLookup) {
|
|
145
|
+
pricingLookup = buildPricingLookup();
|
|
146
|
+
}
|
|
147
|
+
return pricingLookup;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Clear the pricing lookup cache (useful for testing or dynamic updates)
|
|
151
|
+
*/
|
|
152
|
+
export function clearPricingCache() {
|
|
153
|
+
pricingLookup = null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get pricing for a specific model (new API)
|
|
157
|
+
*
|
|
158
|
+
* @param modelId - Model identifier (e.g., "gpt-4o", "openai/gpt-4o", "claude-3.5-sonnet")
|
|
159
|
+
* @param date - Optional date to get historical pricing (defaults to current)
|
|
160
|
+
* @returns Resolved pricing or null if not found
|
|
161
|
+
*/
|
|
162
|
+
export function getModelPricing(modelId, date) {
|
|
163
|
+
const lookup = getLookup();
|
|
164
|
+
const entry = lookup.get(modelId);
|
|
165
|
+
if (!entry) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const pricingEntry = date
|
|
169
|
+
? getPricingAtDate(entry.model, date)
|
|
170
|
+
: getCurrentPricing(entry.model);
|
|
171
|
+
if (!pricingEntry) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const unitSize = entry.model.unitSize ?? getDefaultUnitSize(entry.model.unit);
|
|
175
|
+
return {
|
|
176
|
+
provider: entry.provider,
|
|
177
|
+
model: entry.modelId,
|
|
178
|
+
unit: entry.model.unit,
|
|
179
|
+
unitSize,
|
|
180
|
+
input: pricingEntry.input ?? 0,
|
|
181
|
+
output: pricingEntry.output ?? 0,
|
|
182
|
+
cachedInput: pricingEntry.cachedInput,
|
|
183
|
+
cacheWrite: pricingEntry.cacheWrite,
|
|
184
|
+
effectiveDate: pricingEntry.effectiveDate,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Calculate cost based on usage (new API with usage object)
|
|
189
|
+
*
|
|
190
|
+
* @param modelId - Model identifier
|
|
191
|
+
* @param usage - Usage data (tokens, characters, images, etc.)
|
|
192
|
+
* @param date - Optional date for historical pricing
|
|
193
|
+
* @returns Cost in USD or null if pricing not found
|
|
194
|
+
*/
|
|
195
|
+
export function calculateCostFromUsage(modelId, usage, date) {
|
|
196
|
+
const pricing = getModelPricing(modelId, date);
|
|
197
|
+
if (!pricing) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
let cost = 0;
|
|
201
|
+
// Calculate input cost
|
|
202
|
+
if (usage.inputUnits && pricing.input) {
|
|
203
|
+
cost += (usage.inputUnits / pricing.unitSize) * pricing.input;
|
|
204
|
+
}
|
|
205
|
+
// Calculate output cost
|
|
206
|
+
if (usage.outputUnits && pricing.output) {
|
|
207
|
+
cost += (usage.outputUnits / pricing.unitSize) * pricing.output;
|
|
208
|
+
}
|
|
209
|
+
// Calculate cached input cost
|
|
210
|
+
if (usage.cachedInputUnits && pricing.cachedInput) {
|
|
211
|
+
cost += (usage.cachedInputUnits / pricing.unitSize) * pricing.cachedInput;
|
|
212
|
+
}
|
|
213
|
+
// Calculate cache write cost
|
|
214
|
+
if (usage.cacheWriteUnits && pricing.cacheWrite) {
|
|
215
|
+
cost += (usage.cacheWriteUnits / pricing.unitSize) * pricing.cacheWrite;
|
|
216
|
+
}
|
|
217
|
+
return cost;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get all models for a provider
|
|
221
|
+
*/
|
|
222
|
+
export function getProviderModels(providerId) {
|
|
223
|
+
const provider = providers[providerId];
|
|
224
|
+
if (!provider) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
return Object.keys(provider.models);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get all supported providers
|
|
231
|
+
*/
|
|
232
|
+
export function getSupportedProviders() {
|
|
233
|
+
return Object.keys(providers);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Check if a model is deprecated
|
|
237
|
+
*/
|
|
238
|
+
export function isModelDeprecated(modelId) {
|
|
239
|
+
const lookup = getLookup();
|
|
240
|
+
const entry = lookup.get(modelId);
|
|
241
|
+
return entry?.model.deprecated ?? false;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get replacement model for a deprecated model
|
|
245
|
+
*/
|
|
246
|
+
export function getReplacementModel(modelId) {
|
|
247
|
+
const lookup = getLookup();
|
|
248
|
+
const entry = lookup.get(modelId);
|
|
249
|
+
return entry?.model.replacedBy ?? null;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,gCAAgC;AAChC,OAAO,aAAa,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1E,OAAO,gBAAgB,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChF,OAAO,iBAAiB,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAClF,OAAO,UAAU,MAAM,sBAAsB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAUpE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAoC;IACxD,MAAM,EAAE,aAAgC;IACxC,SAAS,EAAE,gBAAmC;IAC9C,UAAU,EAAE,iBAAoC;IAChD,GAAG,EAAE,UAA6B;CACnC,CAAC;AAEF;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE9B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElE,uDAAuD;YACvD,oEAAoE;YACpE,0EAA0E;YAC1E,IAAI,UAAU,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC;YAC3C,IAAI,WAAW,GAAG,cAAc,CAAC,MAAM,IAAI,CAAC,CAAC;YAC7C,IAAI,gBAAgB,GAAG,cAAc,CAAC,WAAW,CAAC;YAElD,yDAAyD;YACzD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC3D,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC;gBACnC,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrC,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;gBACvC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBACnC,gBAAgB,GAAG,gBAAgB,GAAG,UAAU,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAiB;gBACjC,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,WAAW;aACpB,CAAC;YAEF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,YAAY,CAAC,WAAW,GAAG,gBAAgB,CAAC;YAC9C,CAAC;YAED,2BAA2B;YAC3B,OAAO,CAAC,GAAG,UAAU,IAAI,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC;YAEnD,qBAAqB;YACrB,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;YAEhC,cAAc;YACd,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkB,mBAAmB,EAAE,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAmB,EACnB,SAAwB;IAExB,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,WAAmB,EACnB,YAAoB,EACpB,OAAsB,EACtB,iBAA0B;IAE1B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,uCAAuC;IACvC,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;IAElD,wCAAwC;IACxC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IAEpD,4CAA4C;IAC5C,IAAI,iBAAiB,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC;IAChE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB;IAIzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAGnB,CAAC;IAEJ,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAEvD,oBAAoB;YACpB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE3B,gCAAgC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAE9C,cAAc;YACd,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBACzB,iDAAiD;oBACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAC1D,IAAI,aAAa,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;4BAChD,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;wBACnC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oBAAoB;AACpB,IAAI,aAAa,GAGN,IAAI,CAAC;AAEhB;;GAEG;AACH,SAAS,SAAS;IAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,kBAAkB,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,IAAW;IAEX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,IAAI;QACvB,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9E,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;QACtB,QAAQ;QACR,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;QAC9B,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC;QAChC,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,aAAa,EAAE,YAAY,CAAC,aAAa;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,KAKC,EACD,IAAW;IAEX,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,uBAAuB;IACvB,IAAI,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAChE,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAClE,CAAC;IAED,8BAA8B;IAC9B,IAAI,KAAK,CAAC,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAC5E,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,CAAC,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
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 type { PricingManifest, ModelPricing } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Model alias mapping for custom model names
|
|
10
|
+
*/
|
|
11
|
+
export interface ModelAlias {
|
|
12
|
+
/** Target provider for pricing lookup */
|
|
13
|
+
provider: string;
|
|
14
|
+
/** Target model ID for pricing lookup */
|
|
15
|
+
model: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for pricing manifest loading
|
|
19
|
+
*/
|
|
20
|
+
export interface PricingConfig {
|
|
21
|
+
/**
|
|
22
|
+
* URL to fetch the pricing manifest from the API.
|
|
23
|
+
* @default https://pricing.tokenmeter.dev/api/v1
|
|
24
|
+
*/
|
|
25
|
+
apiUrl?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Fallback CDN URL if API is unavailable.
|
|
28
|
+
* @default jsdelivr CDN URL
|
|
29
|
+
*/
|
|
30
|
+
cdnUrl?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Legacy: URL to fetch the pricing manifest from.
|
|
33
|
+
* @deprecated Use apiUrl instead
|
|
34
|
+
*/
|
|
35
|
+
manifestUrl?: string;
|
|
36
|
+
/**
|
|
37
|
+
* If true, skip remote fetching and only use bundled local pricing.
|
|
38
|
+
* Useful for offline environments or when you want predictable pricing.
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
offlineMode?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Timeout for remote manifest fetch in milliseconds.
|
|
44
|
+
* @default 5000
|
|
45
|
+
*/
|
|
46
|
+
fetchTimeout?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Cache timeout in milliseconds. Manifest will be refetched after this duration.
|
|
49
|
+
* @default 300000 (5 minutes)
|
|
50
|
+
*/
|
|
51
|
+
cacheTimeout?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Custom model aliases for pricing lookup.
|
|
54
|
+
* Maps custom model names to their canonical provider/model for pricing.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* configurePricing({
|
|
59
|
+
* modelAliases: {
|
|
60
|
+
* "bedrock-claude-4-5-sonnet": { provider: "bedrock", model: "anthropic.claude-sonnet-4-5" },
|
|
61
|
+
* "my-gpt": { provider: "openai", model: "gpt-4o" },
|
|
62
|
+
* }
|
|
63
|
+
* });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
modelAliases?: Record<string, ModelAlias>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Configure global pricing settings.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* import { configurePricing } from 'tokenmeter';
|
|
74
|
+
*
|
|
75
|
+
* // Use custom CDN
|
|
76
|
+
* configurePricing({ manifestUrl: 'https://your-cdn.com/manifest.json' });
|
|
77
|
+
*
|
|
78
|
+
* // Offline mode (bundled pricing only)
|
|
79
|
+
* configurePricing({ offlineMode: true });
|
|
80
|
+
*
|
|
81
|
+
* // Custom model aliases
|
|
82
|
+
* configurePricing({
|
|
83
|
+
* modelAliases: {
|
|
84
|
+
* "bedrock-claude-4-5-sonnet": { provider: "bedrock", model: "anthropic.claude-sonnet-4-5" },
|
|
85
|
+
* }
|
|
86
|
+
* });
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export declare function configurePricing(config: PricingConfig): void;
|
|
90
|
+
/**
|
|
91
|
+
* Get the current pricing configuration.
|
|
92
|
+
*/
|
|
93
|
+
export declare function getPricingConfig(): PricingConfig;
|
|
94
|
+
/**
|
|
95
|
+
* Load the pricing manifest.
|
|
96
|
+
*
|
|
97
|
+
* Fetches from Pricing API first, then CDN, with automatic fallback
|
|
98
|
+
* to bundled local data if all remote sources are unavailable.
|
|
99
|
+
*
|
|
100
|
+
* @param options.apiUrl - Override the API URL
|
|
101
|
+
* @param options.cdnUrl - Override the CDN URL
|
|
102
|
+
* @param options.manifestUrl - Legacy: Override the manifest URL (deprecated)
|
|
103
|
+
* @param options.forceRefresh - Force reload even if cached
|
|
104
|
+
* @param options.offlineMode - Skip remote fetch, use local only
|
|
105
|
+
*/
|
|
106
|
+
export declare function loadManifest(options?: {
|
|
107
|
+
apiUrl?: string;
|
|
108
|
+
cdnUrl?: string;
|
|
109
|
+
manifestUrl?: string;
|
|
110
|
+
forceRefresh?: boolean;
|
|
111
|
+
offlineMode?: boolean;
|
|
112
|
+
}): Promise<PricingManifest>;
|
|
113
|
+
/**
|
|
114
|
+
* Get pricing for a specific model
|
|
115
|
+
*/
|
|
116
|
+
export declare function getModelPricing(provider: string, model: string, manifest: PricingManifest): ModelPricing | null;
|
|
117
|
+
/**
|
|
118
|
+
* Calculate cost based on usage and pricing
|
|
119
|
+
*/
|
|
120
|
+
export declare function calculateCost(usage: {
|
|
121
|
+
inputUnits?: number;
|
|
122
|
+
outputUnits?: number;
|
|
123
|
+
cachedInputUnits?: number;
|
|
124
|
+
}, pricing: ModelPricing): number;
|
|
125
|
+
/**
|
|
126
|
+
* Get the cached manifest (or null if not loaded)
|
|
127
|
+
*/
|
|
128
|
+
export declare function getCachedManifest(): PricingManifest | null;
|
|
129
|
+
/**
|
|
130
|
+
* Clear the manifest cache
|
|
131
|
+
*/
|
|
132
|
+
export declare function clearManifestCache(): void;
|
|
133
|
+
/**
|
|
134
|
+
* Set model aliases for pricing lookup.
|
|
135
|
+
* Merges with existing aliases.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* import { setModelAliases } from 'tokenmeter';
|
|
140
|
+
*
|
|
141
|
+
* setModelAliases({
|
|
142
|
+
* "bedrock-claude-4-5-sonnet": { provider: "bedrock", model: "anthropic.claude-sonnet-4-5" },
|
|
143
|
+
* "my-custom-gpt": { provider: "openai", model: "gpt-4o" },
|
|
144
|
+
* });
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
export declare function setModelAliases(aliases: Record<string, ModelAlias>): void;
|
|
148
|
+
/**
|
|
149
|
+
* Clear all model aliases
|
|
150
|
+
*/
|
|
151
|
+
export declare function clearModelAliases(): void;
|
|
152
|
+
/**
|
|
153
|
+
* Get current model aliases
|
|
154
|
+
*/
|
|
155
|
+
export declare function getModelAliases(): Record<string, ModelAlias>;
|
|
156
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/pricing/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAGb,MAAM,aAAa,CAAC;AAgBrB;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC3C;AAaD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AA8ND;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CAClB,GACL,OAAO,CAAC,eAAe,CAAC,CA8D1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,eAAe,GACxB,YAAY,GAAG,IAAI,CAiCrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE;IACL,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,EACD,OAAO,EAAE,YAAY,GACpB,MAAM,CA0CR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAClC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAE5D"}
|