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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +346 -0
  3. package/dist/__tests__/context.test.d.ts +2 -0
  4. package/dist/__tests__/context.test.d.ts.map +1 -0
  5. package/dist/__tests__/context.test.js +94 -0
  6. package/dist/__tests__/context.test.js.map +1 -0
  7. package/dist/__tests__/elevenlabs.test.d.ts +2 -0
  8. package/dist/__tests__/elevenlabs.test.d.ts.map +1 -0
  9. package/dist/__tests__/elevenlabs.test.js +108 -0
  10. package/dist/__tests__/elevenlabs.test.js.map +1 -0
  11. package/dist/__tests__/fal.test.d.ts +2 -0
  12. package/dist/__tests__/fal.test.d.ts.map +1 -0
  13. package/dist/__tests__/fal.test.js +153 -0
  14. package/dist/__tests__/fal.test.js.map +1 -0
  15. package/dist/__tests__/pricing.test.d.ts +2 -0
  16. package/dist/__tests__/pricing.test.d.ts.map +1 -0
  17. package/dist/__tests__/pricing.test.js +76 -0
  18. package/dist/__tests__/pricing.test.js.map +1 -0
  19. package/dist/__tests__/recorder.test.d.ts +2 -0
  20. package/dist/__tests__/recorder.test.d.ts.map +1 -0
  21. package/dist/__tests__/recorder.test.js +133 -0
  22. package/dist/__tests__/recorder.test.js.map +1 -0
  23. package/dist/__tests__/storage.test.d.ts +2 -0
  24. package/dist/__tests__/storage.test.d.ts.map +1 -0
  25. package/dist/__tests__/storage.test.js +106 -0
  26. package/dist/__tests__/storage.test.js.map +1 -0
  27. package/dist/client/index.d.ts +8 -0
  28. package/dist/client/index.d.ts.map +1 -0
  29. package/dist/client/index.js +7 -0
  30. package/dist/client/index.js.map +1 -0
  31. package/dist/config.d.ts +92 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +166 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/context.d.ts +80 -0
  36. package/dist/context.d.ts.map +1 -0
  37. package/dist/context.js +131 -0
  38. package/dist/context.js.map +1 -0
  39. package/dist/exporter/PostgresExporter.d.ts +82 -0
  40. package/dist/exporter/PostgresExporter.d.ts.map +1 -0
  41. package/dist/exporter/PostgresExporter.js +237 -0
  42. package/dist/exporter/PostgresExporter.js.map +1 -0
  43. package/dist/exporter/index.d.ts +8 -0
  44. package/dist/exporter/index.d.ts.map +1 -0
  45. package/dist/exporter/index.js +7 -0
  46. package/dist/exporter/index.js.map +1 -0
  47. package/dist/index.d.ts +31 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +37 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/instrumentation/proxy.d.ts +26 -0
  52. package/dist/instrumentation/proxy.d.ts.map +1 -0
  53. package/dist/instrumentation/proxy.js +337 -0
  54. package/dist/instrumentation/proxy.js.map +1 -0
  55. package/dist/instrumentation/strategies/index.d.ts +55 -0
  56. package/dist/instrumentation/strategies/index.d.ts.map +1 -0
  57. package/dist/instrumentation/strategies/index.js +429 -0
  58. package/dist/instrumentation/strategies/index.js.map +1 -0
  59. package/dist/integrations/express/index.d.ts +137 -0
  60. package/dist/integrations/express/index.d.ts.map +1 -0
  61. package/dist/integrations/express/index.js +186 -0
  62. package/dist/integrations/express/index.js.map +1 -0
  63. package/dist/integrations/inngest/index.d.ts +222 -0
  64. package/dist/integrations/inngest/index.d.ts.map +1 -0
  65. package/dist/integrations/inngest/index.js +223 -0
  66. package/dist/integrations/inngest/index.js.map +1 -0
  67. package/dist/integrations/langfuse/index.d.ts +170 -0
  68. package/dist/integrations/langfuse/index.d.ts.map +1 -0
  69. package/dist/integrations/langfuse/index.js +225 -0
  70. package/dist/integrations/langfuse/index.js.map +1 -0
  71. package/dist/integrations/next/index.d.ts +138 -0
  72. package/dist/integrations/next/index.d.ts.map +1 -0
  73. package/dist/integrations/next/index.js +170 -0
  74. package/dist/integrations/next/index.js.map +1 -0
  75. package/dist/integrations/nextjs/index.d.ts +198 -0
  76. package/dist/integrations/nextjs/index.d.ts.map +1 -0
  77. package/dist/integrations/nextjs/index.js +181 -0
  78. package/dist/integrations/nextjs/index.js.map +1 -0
  79. package/dist/integrations/vercel-ai/index.d.ts +288 -0
  80. package/dist/integrations/vercel-ai/index.d.ts.map +1 -0
  81. package/dist/integrations/vercel-ai/index.js +260 -0
  82. package/dist/integrations/vercel-ai/index.js.map +1 -0
  83. package/dist/logger.d.ts +58 -0
  84. package/dist/logger.d.ts.map +1 -0
  85. package/dist/logger.js +89 -0
  86. package/dist/logger.js.map +1 -0
  87. package/dist/pricing/catalog.d.ts +10 -0
  88. package/dist/pricing/catalog.d.ts.map +1 -0
  89. package/dist/pricing/catalog.js +297 -0
  90. package/dist/pricing/catalog.js.map +1 -0
  91. package/dist/pricing/index.d.ts +77 -0
  92. package/dist/pricing/index.d.ts.map +1 -0
  93. package/dist/pricing/index.js +251 -0
  94. package/dist/pricing/index.js.map +1 -0
  95. package/dist/pricing/manifest.d.ts +156 -0
  96. package/dist/pricing/manifest.d.ts.map +1 -0
  97. package/dist/pricing/manifest.js +381 -0
  98. package/dist/pricing/manifest.js.map +1 -0
  99. package/dist/pricing/manifest.json +12786 -0
  100. package/dist/pricing/providers/anthropic.json +253 -0
  101. package/dist/pricing/providers/bedrock.json +341 -0
  102. package/dist/pricing/providers/bfl.json +220 -0
  103. package/dist/pricing/providers/elevenlabs.json +142 -0
  104. package/dist/pricing/providers/fal.json +15866 -0
  105. package/dist/pricing/providers/google.json +346 -0
  106. package/dist/pricing/providers/openai.json +1035 -0
  107. package/dist/pricing/schema.d.ts +102 -0
  108. package/dist/pricing/schema.d.ts.map +1 -0
  109. package/dist/pricing/schema.js +56 -0
  110. package/dist/pricing/schema.js.map +1 -0
  111. package/dist/processor/TokenMeterProcessor.d.ts +55 -0
  112. package/dist/processor/TokenMeterProcessor.d.ts.map +1 -0
  113. package/dist/processor/TokenMeterProcessor.js +132 -0
  114. package/dist/processor/TokenMeterProcessor.js.map +1 -0
  115. package/dist/query/client.d.ts +61 -0
  116. package/dist/query/client.d.ts.map +1 -0
  117. package/dist/query/client.js +206 -0
  118. package/dist/query/client.js.map +1 -0
  119. package/dist/query/index.d.ts +8 -0
  120. package/dist/query/index.d.ts.map +1 -0
  121. package/dist/query/index.js +7 -0
  122. package/dist/query/index.js.map +1 -0
  123. package/dist/recorder.d.ts +74 -0
  124. package/dist/recorder.d.ts.map +1 -0
  125. package/dist/recorder.js +227 -0
  126. package/dist/recorder.js.map +1 -0
  127. package/dist/sdks/anthropic.d.ts +21 -0
  128. package/dist/sdks/anthropic.d.ts.map +1 -0
  129. package/dist/sdks/anthropic.js +258 -0
  130. package/dist/sdks/anthropic.js.map +1 -0
  131. package/dist/sdks/elevenlabs.d.ts +59 -0
  132. package/dist/sdks/elevenlabs.d.ts.map +1 -0
  133. package/dist/sdks/elevenlabs.js +192 -0
  134. package/dist/sdks/elevenlabs.js.map +1 -0
  135. package/dist/sdks/fal.d.ts +102 -0
  136. package/dist/sdks/fal.d.ts.map +1 -0
  137. package/dist/sdks/fal.js +306 -0
  138. package/dist/sdks/fal.js.map +1 -0
  139. package/dist/sdks/openai.d.ts +17 -0
  140. package/dist/sdks/openai.d.ts.map +1 -0
  141. package/dist/sdks/openai.js +191 -0
  142. package/dist/sdks/openai.js.map +1 -0
  143. package/dist/storage/interface.d.ts +15 -0
  144. package/dist/storage/interface.d.ts.map +1 -0
  145. package/dist/storage/interface.js +53 -0
  146. package/dist/storage/interface.js.map +1 -0
  147. package/dist/storage/prisma.d.ts +15 -0
  148. package/dist/storage/prisma.d.ts.map +1 -0
  149. package/dist/storage/prisma.js +135 -0
  150. package/dist/storage/prisma.js.map +1 -0
  151. package/dist/types.d.ts +206 -0
  152. package/dist/types.d.ts.map +1 -0
  153. package/dist/types.js +45 -0
  154. package/dist/types.js.map +1 -0
  155. package/dist/vercel-ai/index.d.ts +89 -0
  156. package/dist/vercel-ai/index.d.ts.map +1 -0
  157. package/dist/vercel-ai/index.js +298 -0
  158. package/dist/vercel-ai/index.js.map +1 -0
  159. 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":"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"}
@@ -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"}