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,337 @@
1
+ /**
2
+ * Proxy Engine
3
+ *
4
+ * Creates a recursive Proxy that intercepts method calls and creates OTel spans.
5
+ * Calculates costs and adds them to spans before export.
6
+ */
7
+ import { trace, context, propagation, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
8
+ import { extractUsage } from "./strategies/index.js";
9
+ import { getModelPricing, calculateCost, getCachedManifest, loadManifest, } from "../pricing/manifest.js";
10
+ import { TM_ATTRIBUTES, GEN_AI_ATTRIBUTES } from "../types.js";
11
+ import { logger } from "../logger.js";
12
+ // The tracer instance
13
+ let tracer = null;
14
+ // Pricing manifest (loaded once)
15
+ let pricingManifest = null;
16
+ let manifestLoadPromise = null;
17
+ /**
18
+ * Ensure pricing manifest is loaded
19
+ */
20
+ async function ensureManifestLoaded() {
21
+ if (pricingManifest)
22
+ return;
23
+ if (manifestLoadPromise) {
24
+ await manifestLoadPromise;
25
+ return;
26
+ }
27
+ manifestLoadPromise = loadManifest()
28
+ .then((manifest) => {
29
+ pricingManifest = manifest;
30
+ })
31
+ .catch((err) => {
32
+ logger.warn("Failed to load pricing manifest:", err);
33
+ });
34
+ await manifestLoadPromise;
35
+ }
36
+ // Start loading manifest immediately
37
+ ensureManifestLoaded();
38
+ /**
39
+ * Get or create the TokenMeter tracer
40
+ */
41
+ function getTracer() {
42
+ if (!tracer) {
43
+ tracer = trace.getTracer("tokenmeter", "5.0.0");
44
+ }
45
+ return tracer;
46
+ }
47
+ /**
48
+ * Get baggage attributes from current context
49
+ */
50
+ function getBaggageAttributes() {
51
+ const currentContext = context.active();
52
+ const baggage = propagation.getBaggage(currentContext);
53
+ if (!baggage) {
54
+ return {};
55
+ }
56
+ const attributes = {};
57
+ baggage.getAllEntries().forEach(([key, entry]) => {
58
+ attributes[key] = entry.value;
59
+ });
60
+ return attributes;
61
+ }
62
+ /**
63
+ * Detect the provider from the client instance
64
+ */
65
+ function detectProvider(client) {
66
+ if (!client || typeof client !== "object")
67
+ return "unknown";
68
+ const c = client;
69
+ // OpenAI: has chat.completions
70
+ if ("chat" in c &&
71
+ typeof c.chat === "object" &&
72
+ c.chat &&
73
+ "completions" in c.chat) {
74
+ return "openai";
75
+ }
76
+ // Anthropic: has messages.create
77
+ if ("messages" in c && typeof c.messages === "object") {
78
+ return "anthropic";
79
+ }
80
+ // fal.ai: has subscribe method
81
+ if ("subscribe" in c && typeof c.subscribe === "function") {
82
+ return "fal";
83
+ }
84
+ // ElevenLabs: has textToSpeech
85
+ if ("textToSpeech" in c && typeof c.textToSpeech === "object") {
86
+ return "elevenlabs";
87
+ }
88
+ return "unknown";
89
+ }
90
+ /**
91
+ * Check if a value is a Promise
92
+ */
93
+ function isPromise(value) {
94
+ return (value !== null &&
95
+ typeof value === "object" &&
96
+ "then" in value &&
97
+ typeof value.then === "function");
98
+ }
99
+ /**
100
+ * Check if a value is an async iterator (stream)
101
+ */
102
+ function isAsyncIterable(value) {
103
+ return (value !== null && typeof value === "object" && Symbol.asyncIterator in value);
104
+ }
105
+ /**
106
+ * Calculate cost for usage data
107
+ */
108
+ function calculateUsageCost(usage) {
109
+ const manifest = pricingManifest || getCachedManifest();
110
+ if (!manifest) {
111
+ logger.warn("Pricing manifest not loaded, cost will be 0");
112
+ return 0;
113
+ }
114
+ const pricing = getModelPricing(usage.provider, usage.model, manifest);
115
+ if (!pricing) {
116
+ logger.warn(`Missing pricing for ${usage.provider}/${usage.model}`);
117
+ return 0;
118
+ }
119
+ return calculateCost({
120
+ inputUnits: usage.inputUnits,
121
+ outputUnits: usage.outputUnits,
122
+ cachedInputUnits: usage.cachedInputUnits,
123
+ }, pricing);
124
+ }
125
+ /**
126
+ * Add usage data and calculated cost to a span
127
+ */
128
+ function addUsageToSpan(span, usage) {
129
+ const attributes = {
130
+ [TM_ATTRIBUTES.PROVIDER]: usage.provider,
131
+ [TM_ATTRIBUTES.MODEL]: usage.model,
132
+ };
133
+ if (usage.inputUnits !== undefined) {
134
+ attributes[TM_ATTRIBUTES.INPUT_UNITS] = usage.inputUnits;
135
+ attributes[GEN_AI_ATTRIBUTES.INPUT_TOKENS] = usage.inputUnits;
136
+ }
137
+ if (usage.outputUnits !== undefined) {
138
+ attributes[TM_ATTRIBUTES.OUTPUT_UNITS] = usage.outputUnits;
139
+ attributes[GEN_AI_ATTRIBUTES.OUTPUT_TOKENS] = usage.outputUnits;
140
+ }
141
+ attributes[GEN_AI_ATTRIBUTES.MODEL] = usage.model;
142
+ attributes[GEN_AI_ATTRIBUTES.SYSTEM] = usage.provider;
143
+ // Calculate and add cost BEFORE span.end()
144
+ const costUsd = calculateUsageCost(usage);
145
+ attributes[TM_ATTRIBUTES.COST_USD] = costUsd;
146
+ span.setAttributes(attributes);
147
+ }
148
+ /**
149
+ * Wrap an async iterator to track usage from streamed responses
150
+ */
151
+ function wrapAsyncIterator(iterator, span, provider, methodPath, args) {
152
+ const originalIterator = iterator[Symbol.asyncIterator]();
153
+ let accumulatedUsage = null;
154
+ const wrappedIterator = {
155
+ async next() {
156
+ try {
157
+ const result = await originalIterator.next();
158
+ if (result.done) {
159
+ // Stream completed - extract final usage if available
160
+ if (accumulatedUsage) {
161
+ addUsageToSpan(span, accumulatedUsage);
162
+ }
163
+ span.setStatus({ code: SpanStatusCode.OK });
164
+ span.end();
165
+ }
166
+ else {
167
+ // Accumulate usage from chunks (OpenAI streams include usage in final chunk)
168
+ const chunk = result.value;
169
+ if (chunk && typeof chunk === "object" && "usage" in chunk) {
170
+ const usage = extractUsage(methodPath, chunk, args, provider);
171
+ if (usage) {
172
+ accumulatedUsage = usage;
173
+ }
174
+ }
175
+ }
176
+ return result;
177
+ }
178
+ catch (error) {
179
+ span.recordException(error);
180
+ span.setStatus({
181
+ code: SpanStatusCode.ERROR,
182
+ message: error instanceof Error ? error.message : String(error),
183
+ });
184
+ span.end();
185
+ throw error;
186
+ }
187
+ },
188
+ async return(value) {
189
+ // Stream was cancelled - still calculate cost for what we consumed
190
+ if (accumulatedUsage) {
191
+ addUsageToSpan(span, accumulatedUsage);
192
+ }
193
+ span.setStatus({ code: SpanStatusCode.OK });
194
+ span.end();
195
+ if (originalIterator.return) {
196
+ return originalIterator.return(value);
197
+ }
198
+ return { done: true, value: undefined };
199
+ },
200
+ async throw(error) {
201
+ // Stream errored - still calculate cost for what we consumed
202
+ if (accumulatedUsage) {
203
+ addUsageToSpan(span, accumulatedUsage);
204
+ }
205
+ span.recordException(error);
206
+ span.setStatus({
207
+ code: SpanStatusCode.ERROR,
208
+ message: error instanceof Error ? error.message : String(error),
209
+ });
210
+ span.end();
211
+ if (originalIterator.throw) {
212
+ return originalIterator.throw(error);
213
+ }
214
+ throw error;
215
+ },
216
+ };
217
+ return {
218
+ [Symbol.asyncIterator]: () => wrappedIterator,
219
+ };
220
+ }
221
+ /**
222
+ * Create a monitored proxy for a client instance
223
+ *
224
+ * @param client - The SDK client instance to wrap
225
+ * @param options - Configuration options
226
+ * @returns A proxied version of the client that creates spans for method calls
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * import OpenAI from 'openai';
231
+ * import { monitor } from 'tokenmeter';
232
+ *
233
+ * const openai = monitor(new OpenAI({ apiKey: '...' }));
234
+ * await openai.chat.completions.create({ model: 'gpt-4o', messages: [...] });
235
+ * ```
236
+ */
237
+ export function monitor(client, options = {}) {
238
+ const provider = options.provider || detectProvider(client);
239
+ const clientName = options.name || provider;
240
+ const baseAttributes = options.attributes || {};
241
+ /**
242
+ * Create a recursive proxy handler
243
+ */
244
+ function createProxyHandler(path = []) {
245
+ return {
246
+ get(target, prop, receiver) {
247
+ const value = Reflect.get(target, prop, receiver);
248
+ // Skip symbols and internal properties
249
+ if (typeof prop === "symbol" || prop.startsWith("_")) {
250
+ return value;
251
+ }
252
+ // If it's a function, wrap it
253
+ if (typeof value === "function") {
254
+ return function (...args) {
255
+ const methodPath = [...path, prop];
256
+ const spanName = `${clientName}.${methodPath.join(".")}`;
257
+ // Get baggage attributes from context (set by withAttributes)
258
+ const baggageAttrs = getBaggageAttributes();
259
+ // Start span with base + baggage attributes
260
+ const currentTracer = getTracer();
261
+ const span = currentTracer.startSpan(spanName, {
262
+ kind: SpanKind.CLIENT,
263
+ attributes: {
264
+ ...baseAttributes,
265
+ ...baggageAttrs, // Include baggage attributes (org.id, user.id, etc.)
266
+ [TM_ATTRIBUTES.PROVIDER]: provider,
267
+ "rpc.service": clientName,
268
+ "rpc.method": methodPath.join("."),
269
+ },
270
+ });
271
+ // Execute within span context
272
+ return context.with(trace.setSpan(context.active(), span), () => {
273
+ try {
274
+ const result = value.apply(this === receiver ? target : this, args);
275
+ // Handle async results
276
+ if (isPromise(result)) {
277
+ return result.then((resolved) => {
278
+ // Check if result is a stream
279
+ if (isAsyncIterable(resolved)) {
280
+ return wrapAsyncIterator(resolved, span, provider, methodPath, args);
281
+ }
282
+ // Extract usage from result
283
+ const usage = extractUsage(methodPath, resolved, args, provider);
284
+ if (usage) {
285
+ addUsageToSpan(span, usage);
286
+ }
287
+ span.setStatus({ code: SpanStatusCode.OK });
288
+ span.end();
289
+ return resolved;
290
+ }, (error) => {
291
+ span.recordException(error);
292
+ span.setStatus({
293
+ code: SpanStatusCode.ERROR,
294
+ message: error instanceof Error
295
+ ? error.message
296
+ : String(error),
297
+ });
298
+ span.end();
299
+ throw error;
300
+ });
301
+ }
302
+ // Handle sync results (rare for API calls)
303
+ if (isAsyncIterable(result)) {
304
+ return wrapAsyncIterator(result, span, provider, methodPath, args);
305
+ }
306
+ const usage = extractUsage(methodPath, result, args, provider);
307
+ if (usage) {
308
+ addUsageToSpan(span, usage);
309
+ }
310
+ span.setStatus({ code: SpanStatusCode.OK });
311
+ span.end();
312
+ return result;
313
+ }
314
+ catch (error) {
315
+ span.recordException(error);
316
+ span.setStatus({
317
+ code: SpanStatusCode.ERROR,
318
+ message: error instanceof Error ? error.message : String(error),
319
+ });
320
+ span.end();
321
+ throw error;
322
+ }
323
+ });
324
+ };
325
+ }
326
+ // If it's an object, recursively proxy it
327
+ if (value !== null && typeof value === "object") {
328
+ return new Proxy(value, createProxyHandler([...path, prop]));
329
+ }
330
+ return value;
331
+ },
332
+ };
333
+ }
334
+ return new Proxy(client, createProxyHandler());
335
+ }
336
+ export default monitor;
337
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/instrumentation/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Extraction Strategies
3
+ *
4
+ * Each strategy knows how to extract usage data from a specific provider's API responses.
5
+ */
6
+ import type { ExtractionStrategy, UsageData } from "../../types.js";
7
+ /**
8
+ * OpenAI extraction strategy
9
+ */
10
+ export declare const openaiStrategy: ExtractionStrategy;
11
+ /**
12
+ * Anthropic extraction strategy
13
+ */
14
+ export declare const anthropicStrategy: ExtractionStrategy;
15
+ /**
16
+ * fal.ai extraction strategy
17
+ */
18
+ export declare const falStrategy: ExtractionStrategy;
19
+ /**
20
+ * ElevenLabs extraction strategy
21
+ */
22
+ export declare const elevenlabsStrategy: ExtractionStrategy;
23
+ /**
24
+ * AWS Bedrock extraction strategy
25
+ */
26
+ export declare const bedrockStrategy: ExtractionStrategy;
27
+ /**
28
+ * Google Vertex AI / Gemini extraction strategy
29
+ */
30
+ export declare const vertexAIStrategy: ExtractionStrategy;
31
+ /**
32
+ * BFL (Black Forest Labs) extraction strategy
33
+ *
34
+ * Note: BFL responses are similar to fal.ai but use "id" (not "requestId")
35
+ * and have "sample" field for images. fal.ai uses "requestId" (camelCase).
36
+ */
37
+ export declare const bflStrategy: ExtractionStrategy;
38
+ /**
39
+ * Vercel AI SDK extraction strategy
40
+ * Handles generateText, streamText, generateObject, streamObject results
41
+ */
42
+ export declare const vercelAIStrategy: ExtractionStrategy;
43
+ /**
44
+ * All registered strategies
45
+ */
46
+ export declare const strategies: ExtractionStrategy[];
47
+ /**
48
+ * Find the appropriate strategy for a given result
49
+ */
50
+ export declare function findStrategy(methodPath: string[], result: unknown): ExtractionStrategy | null;
51
+ /**
52
+ * Extract usage data using the appropriate strategy
53
+ */
54
+ export declare function extractUsage(methodPath: string[], result: unknown, args: unknown[], providerHint?: string): UsageData | null;
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/instrumentation/strategies/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,kBAwD5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAqD/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,kBA4DzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBAyDhC,CAAC;AAsBF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,kBA8D7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAwD9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,kBAgEzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBA0E9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,kBAAkB,EAS1C,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,OAAO,GACd,kBAAkB,GAAG,IAAI,CAO3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,OAAO,EAAE,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,SAAS,GAAG,IAAI,CAgBlB"}