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
package/dist/types.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * TokenMeter v5 - Core Types
3
+ *
4
+ * OpenTelemetry-native cost tracking for AI workflows.
5
+ */
6
+ // ============================================================================
7
+ // Semantic Conventions (OTel Attributes)
8
+ // ============================================================================
9
+ /**
10
+ * TokenMeter-specific span attributes
11
+ */
12
+ export const TM_ATTRIBUTES = {
13
+ /** Calculated cost in USD */
14
+ COST_USD: "tokenmeter.cost_usd",
15
+ /** Provider name */
16
+ PROVIDER: "tokenmeter.provider",
17
+ /** Model name */
18
+ MODEL: "tokenmeter.model",
19
+ /** Pricing unit used */
20
+ UNIT: "tokenmeter.unit",
21
+ /** Input units consumed */
22
+ INPUT_UNITS: "tokenmeter.input_units",
23
+ /** Output units consumed */
24
+ OUTPUT_UNITS: "tokenmeter.output_units",
25
+ /** Organization ID (from withAttributes) */
26
+ ORG_ID: "org.id",
27
+ /** User ID (from withAttributes) */
28
+ USER_ID: "user.id",
29
+ /** Workflow ID (from withAttributes) */
30
+ WORKFLOW_ID: "workflow.id",
31
+ };
32
+ /**
33
+ * Standard GenAI semantic conventions
34
+ */
35
+ export const GEN_AI_ATTRIBUTES = {
36
+ /** Input tokens */
37
+ INPUT_TOKENS: "gen_ai.usage.input_tokens",
38
+ /** Output tokens */
39
+ OUTPUT_TOKENS: "gen_ai.usage.output_tokens",
40
+ /** Model name */
41
+ MODEL: "gen_ai.request.model",
42
+ /** System/provider */
43
+ SYSTEM: "gen_ai.system",
44
+ };
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwNH,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,6BAA6B;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,oBAAoB;IACpB,QAAQ,EAAE,qBAAqB;IAC/B,iBAAiB;IACjB,KAAK,EAAE,kBAAkB;IACzB,wBAAwB;IACxB,IAAI,EAAE,iBAAiB;IACvB,2BAA2B;IAC3B,WAAW,EAAE,wBAAwB;IACrC,4BAA4B;IAC5B,YAAY,EAAE,yBAAyB;IACvC,4CAA4C;IAC5C,MAAM,EAAE,QAAQ;IAChB,oCAAoC;IACpC,OAAO,EAAE,SAAS;IAClB,wCAAwC;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB;IACnB,YAAY,EAAE,2BAA2B;IACzC,oBAAoB;IACpB,aAAa,EAAE,4BAA4B;IAC3C,iBAAiB;IACjB,KAAK,EAAE,sBAAsB;IAC7B,sBAAsB;IACtB,MAAM,EAAE,eAAe;CACf,CAAC"}
@@ -0,0 +1,89 @@
1
+ interface LanguageModelUsage {
2
+ promptTokens: number;
3
+ completionTokens: number;
4
+ }
5
+ interface GenerateTextResult<T = unknown> {
6
+ text: string;
7
+ usage: LanguageModelUsage;
8
+ finishReason: string;
9
+ response?: {
10
+ id?: string;
11
+ modelId?: string;
12
+ };
13
+ [key: string]: unknown;
14
+ }
15
+ interface StreamTextResult<T = unknown> {
16
+ textStream: AsyncIterable<string>;
17
+ usage: Promise<LanguageModelUsage>;
18
+ finishReason: Promise<string>;
19
+ response?: Promise<{
20
+ id?: string;
21
+ modelId?: string;
22
+ }>;
23
+ [key: string]: unknown;
24
+ }
25
+ interface GenerateObjectResult<T = unknown> {
26
+ object: T;
27
+ usage: LanguageModelUsage;
28
+ finishReason: string;
29
+ response?: {
30
+ id?: string;
31
+ modelId?: string;
32
+ };
33
+ [key: string]: unknown;
34
+ }
35
+ interface StreamObjectResult<T = unknown> {
36
+ partialObjectStream: AsyncIterable<T>;
37
+ object: Promise<T>;
38
+ usage: Promise<LanguageModelUsage>;
39
+ finishReason?: Promise<string>;
40
+ response?: Promise<{
41
+ id?: string;
42
+ modelId?: string;
43
+ }>;
44
+ [key: string]: unknown;
45
+ }
46
+ interface GenerateTextParams {
47
+ model: {
48
+ modelId?: string;
49
+ provider?: string;
50
+ [key: string]: unknown;
51
+ };
52
+ prompt?: string;
53
+ messages?: unknown[];
54
+ [key: string]: unknown;
55
+ }
56
+ interface GenerateObjectParams extends GenerateTextParams {
57
+ schema?: unknown;
58
+ schemaName?: string;
59
+ schemaDescription?: string;
60
+ mode?: "auto" | "json" | "tool";
61
+ output?: "object" | "array" | "no-schema";
62
+ }
63
+ type GenerateTextFn = (params: GenerateTextParams) => Promise<GenerateTextResult>;
64
+ type StreamTextFn = (params: GenerateTextParams) => Promise<StreamTextResult>;
65
+ type GenerateObjectFn = <T = unknown>(params: GenerateObjectParams) => Promise<GenerateObjectResult<T>>;
66
+ type StreamObjectFn = <T = unknown>(params: GenerateObjectParams) => Promise<StreamObjectResult<T>>;
67
+ /**
68
+ * Wrap Vercel AI SDK functions with cost tracking
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * import { generateText, streamText, generateObject, streamObject } from 'ai';
73
+ * import { trackVercelAI } from 'tokenmeter/vercel-ai';
74
+ *
75
+ * const tracked = trackVercelAI({ generateText, streamText, generateObject, streamObject });
76
+ *
77
+ * // All functions are now tracked
78
+ * const { text } = await tracked.generateText({ model: openai('gpt-4o'), prompt: 'Hello!' });
79
+ * const { object } = await tracked.generateObject({ model: openai('gpt-4o'), schema: z.object({ name: z.string() }) });
80
+ * ```
81
+ */
82
+ export declare function trackVercelAI<T extends {
83
+ generateText?: GenerateTextFn;
84
+ streamText?: StreamTextFn;
85
+ generateObject?: GenerateObjectFn;
86
+ streamObject?: StreamObjectFn;
87
+ }>(fns: T): T;
88
+ export default trackVercelAI;
89
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vercel-ai/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,298 @@
1
+ import { recordEvent } from "../recorder.js";
2
+ import { getPricing, resolveModel } from "../config.js";
3
+ import { calculateCost } from "../pricing/index.js";
4
+ /**
5
+ * Extract model name from Vercel AI SDK model object
6
+ */
7
+ function extractModelName(model) {
8
+ if (model.modelId) {
9
+ return model.modelId;
10
+ }
11
+ // Fallback: try to extract from toString or other properties
12
+ if (typeof model === "object" && "modelId" in model) {
13
+ return String(model.modelId);
14
+ }
15
+ return "unknown";
16
+ }
17
+ /**
18
+ * Extract provider from Vercel AI SDK model object
19
+ */
20
+ function extractProvider(model) {
21
+ if (model.provider) {
22
+ return model.provider;
23
+ }
24
+ // Try to infer from model ID
25
+ const modelId = extractModelName(model);
26
+ if (modelId.startsWith("gpt-") ||
27
+ modelId.startsWith("o1") ||
28
+ modelId.startsWith("o3"))
29
+ return "openai";
30
+ if (modelId.startsWith("claude-"))
31
+ return "anthropic";
32
+ if (modelId.startsWith("gemini-"))
33
+ return "google";
34
+ if (modelId.startsWith("mistral-") || modelId.startsWith("codestral"))
35
+ return "mistral";
36
+ if (modelId.startsWith("llama-"))
37
+ return "meta";
38
+ return "unknown";
39
+ }
40
+ /**
41
+ * Wrap Vercel AI SDK functions with cost tracking
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { generateText, streamText, generateObject, streamObject } from 'ai';
46
+ * import { trackVercelAI } from 'tokenmeter/vercel-ai';
47
+ *
48
+ * const tracked = trackVercelAI({ generateText, streamText, generateObject, streamObject });
49
+ *
50
+ * // All functions are now tracked
51
+ * const { text } = await tracked.generateText({ model: openai('gpt-4o'), prompt: 'Hello!' });
52
+ * const { object } = await tracked.generateObject({ model: openai('gpt-4o'), schema: z.object({ name: z.string() }) });
53
+ * ```
54
+ */
55
+ export function trackVercelAI(fns) {
56
+ const wrapped = {};
57
+ if (fns.generateText) {
58
+ wrapped.generateText = wrapGenerateText(fns.generateText);
59
+ }
60
+ if (fns.streamText) {
61
+ wrapped.streamText = wrapStreamText(fns.streamText);
62
+ }
63
+ if (fns.generateObject) {
64
+ wrapped.generateObject = wrapGenerateObject(fns.generateObject);
65
+ }
66
+ if (fns.streamObject) {
67
+ wrapped.streamObject = wrapStreamObject(fns.streamObject);
68
+ }
69
+ return { ...fns, ...wrapped };
70
+ }
71
+ /**
72
+ * Wrap generateText function
73
+ */
74
+ function wrapGenerateText(originalFn) {
75
+ return async (params) => {
76
+ const startTime = Date.now();
77
+ const modelName = resolveModel(extractModelName(params.model));
78
+ const provider = extractProvider(params.model);
79
+ try {
80
+ const result = await originalFn(params);
81
+ const usage = result.usage;
82
+ const pricing = getPricing();
83
+ const cost = calculateCost(modelName, usage.promptTokens, usage.completionTokens, pricing);
84
+ recordEvent({
85
+ provider,
86
+ model: modelName,
87
+ operation: "generateText",
88
+ inputTokens: usage.promptTokens,
89
+ outputTokens: usage.completionTokens,
90
+ costUsd: cost,
91
+ status: "success",
92
+ metadata: {
93
+ durationMs: Date.now() - startTime,
94
+ finishReason: result.finishReason,
95
+ },
96
+ });
97
+ return result;
98
+ }
99
+ catch (error) {
100
+ recordEvent({
101
+ provider,
102
+ model: modelName,
103
+ operation: "generateText",
104
+ status: "failed",
105
+ billable: false,
106
+ errorMessage: error instanceof Error ? error.message : String(error),
107
+ costUsd: 0,
108
+ metadata: {
109
+ durationMs: Date.now() - startTime,
110
+ },
111
+ });
112
+ throw error;
113
+ }
114
+ };
115
+ }
116
+ /**
117
+ * Wrap streamText function
118
+ */
119
+ function wrapStreamText(originalFn) {
120
+ return async (params) => {
121
+ const startTime = Date.now();
122
+ const modelName = resolveModel(extractModelName(params.model));
123
+ const provider = extractProvider(params.model);
124
+ try {
125
+ const result = await originalFn(params);
126
+ // Track cost when usage promise resolves
127
+ result.usage
128
+ .then((usage) => {
129
+ const pricing = getPricing();
130
+ const cost = calculateCost(modelName, usage.promptTokens, usage.completionTokens, pricing);
131
+ recordEvent({
132
+ provider,
133
+ model: modelName,
134
+ operation: "streamText",
135
+ inputTokens: usage.promptTokens,
136
+ outputTokens: usage.completionTokens,
137
+ costUsd: cost,
138
+ status: "success",
139
+ metadata: {
140
+ durationMs: Date.now() - startTime,
141
+ streamed: true,
142
+ },
143
+ });
144
+ })
145
+ .catch((error) => {
146
+ recordEvent({
147
+ provider,
148
+ model: modelName,
149
+ operation: "streamText",
150
+ status: "failed",
151
+ billable: false,
152
+ errorMessage: error instanceof Error ? error.message : String(error),
153
+ costUsd: 0,
154
+ metadata: {
155
+ durationMs: Date.now() - startTime,
156
+ streamed: true,
157
+ },
158
+ });
159
+ });
160
+ return result;
161
+ }
162
+ catch (error) {
163
+ recordEvent({
164
+ provider,
165
+ model: modelName,
166
+ operation: "streamText",
167
+ status: "failed",
168
+ billable: false,
169
+ errorMessage: error instanceof Error ? error.message : String(error),
170
+ costUsd: 0,
171
+ metadata: {
172
+ durationMs: Date.now() - startTime,
173
+ },
174
+ });
175
+ throw error;
176
+ }
177
+ };
178
+ }
179
+ /**
180
+ * Wrap generateObject function
181
+ */
182
+ function wrapGenerateObject(originalFn) {
183
+ return async (params) => {
184
+ const startTime = Date.now();
185
+ const modelName = resolveModel(extractModelName(params.model));
186
+ const provider = extractProvider(params.model);
187
+ try {
188
+ const result = await originalFn(params);
189
+ const usage = result.usage;
190
+ const pricing = getPricing();
191
+ const cost = calculateCost(modelName, usage.promptTokens, usage.completionTokens, pricing);
192
+ recordEvent({
193
+ provider,
194
+ model: modelName,
195
+ operation: "generateObject",
196
+ inputTokens: usage.promptTokens,
197
+ outputTokens: usage.completionTokens,
198
+ costUsd: cost,
199
+ status: "success",
200
+ metadata: {
201
+ durationMs: Date.now() - startTime,
202
+ finishReason: result.finishReason,
203
+ schemaName: params.schemaName,
204
+ mode: params.mode,
205
+ },
206
+ });
207
+ return result;
208
+ }
209
+ catch (error) {
210
+ recordEvent({
211
+ provider,
212
+ model: modelName,
213
+ operation: "generateObject",
214
+ status: "failed",
215
+ billable: false,
216
+ errorMessage: error instanceof Error ? error.message : String(error),
217
+ costUsd: 0,
218
+ metadata: {
219
+ durationMs: Date.now() - startTime,
220
+ schemaName: params.schemaName,
221
+ mode: params.mode,
222
+ },
223
+ });
224
+ throw error;
225
+ }
226
+ };
227
+ }
228
+ /**
229
+ * Wrap streamObject function
230
+ */
231
+ function wrapStreamObject(originalFn) {
232
+ return async (params) => {
233
+ const startTime = Date.now();
234
+ const modelName = resolveModel(extractModelName(params.model));
235
+ const provider = extractProvider(params.model);
236
+ try {
237
+ const result = await originalFn(params);
238
+ // Track cost when usage promise resolves
239
+ result.usage
240
+ .then((usage) => {
241
+ const pricing = getPricing();
242
+ const cost = calculateCost(modelName, usage.promptTokens, usage.completionTokens, pricing);
243
+ recordEvent({
244
+ provider,
245
+ model: modelName,
246
+ operation: "streamObject",
247
+ inputTokens: usage.promptTokens,
248
+ outputTokens: usage.completionTokens,
249
+ costUsd: cost,
250
+ status: "success",
251
+ metadata: {
252
+ durationMs: Date.now() - startTime,
253
+ streamed: true,
254
+ schemaName: params.schemaName,
255
+ mode: params.mode,
256
+ },
257
+ });
258
+ })
259
+ .catch((error) => {
260
+ recordEvent({
261
+ provider,
262
+ model: modelName,
263
+ operation: "streamObject",
264
+ status: "failed",
265
+ billable: false,
266
+ errorMessage: error instanceof Error ? error.message : String(error),
267
+ costUsd: 0,
268
+ metadata: {
269
+ durationMs: Date.now() - startTime,
270
+ streamed: true,
271
+ schemaName: params.schemaName,
272
+ mode: params.mode,
273
+ },
274
+ });
275
+ });
276
+ return result;
277
+ }
278
+ catch (error) {
279
+ recordEvent({
280
+ provider,
281
+ model: modelName,
282
+ operation: "streamObject",
283
+ status: "failed",
284
+ billable: false,
285
+ errorMessage: error instanceof Error ? error.message : String(error),
286
+ costUsd: 0,
287
+ metadata: {
288
+ durationMs: Date.now() - startTime,
289
+ schemaName: params.schemaName,
290
+ mode: params.mode,
291
+ },
292
+ });
293
+ throw error;
294
+ }
295
+ };
296
+ }
297
+ export default trackVercelAI;
298
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vercel-ai/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "tokenmeter",
3
+ "version": "0.9.0",
4
+ "description": "OpenTelemetry-native cost tracking for AI workflows",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "./processor": {
18
+ "types": "./dist/processor/TokenMeterProcessor.d.ts",
19
+ "import": "./dist/processor/TokenMeterProcessor.js"
20
+ },
21
+ "./exporter": {
22
+ "types": "./dist/exporter/index.d.ts",
23
+ "import": "./dist/exporter/index.js"
24
+ },
25
+ "./query": {
26
+ "types": "./dist/query/index.d.ts",
27
+ "import": "./dist/query/index.js"
28
+ },
29
+ "./inngest": {
30
+ "types": "./dist/integrations/inngest/index.d.ts",
31
+ "import": "./dist/integrations/inngest/index.js"
32
+ },
33
+ "./next": {
34
+ "types": "./dist/integrations/next/index.d.ts",
35
+ "import": "./dist/integrations/next/index.js"
36
+ },
37
+ "./client": {
38
+ "types": "./dist/client/index.d.ts",
39
+ "import": "./dist/client/index.js"
40
+ },
41
+ "./vercel-ai": {
42
+ "types": "./dist/integrations/vercel-ai/index.d.ts",
43
+ "import": "./dist/integrations/vercel-ai/index.js"
44
+ }
45
+ },
46
+ "scripts": {
47
+ "build": "tsc && npm run build:pricing",
48
+ "build:pricing": "mkdir -p dist/pricing && cp src/pricing/manifest.json dist/pricing/manifest.json",
49
+ "dev": "tsc --watch",
50
+ "lint": "eslint . --max-warnings 0",
51
+ "check-types": "tsc --noEmit",
52
+ "test": "vitest run",
53
+ "test:watch": "vitest"
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/lminne/tokenmeter.git"
58
+ },
59
+ "homepage": "https://github.com/lminne/tokenmeter#readme",
60
+ "bugs": {
61
+ "url": "https://github.com/lminne/tokenmeter/issues"
62
+ },
63
+ "author": "Lukas Minnebeck",
64
+ "license": "MIT",
65
+ "dependencies": {
66
+ "@opentelemetry/api": "^1.9.0",
67
+ "@opentelemetry/core": "^1.25.0"
68
+ },
69
+ "peerDependencies": {
70
+ "@opentelemetry/sdk-trace-base": "^1.25.0",
71
+ "@opentelemetry/sdk-trace-node": "^1.25.0",
72
+ "pg": "^8.0.0",
73
+ "inngest": "^3.0.0"
74
+ },
75
+ "peerDependenciesMeta": {
76
+ "@opentelemetry/sdk-trace-base": {
77
+ "optional": true
78
+ },
79
+ "@opentelemetry/sdk-trace-node": {
80
+ "optional": true
81
+ },
82
+ "pg": {
83
+ "optional": true
84
+ },
85
+ "inngest": {
86
+ "optional": true
87
+ }
88
+ },
89
+ "devDependencies": {
90
+ "@anthropic-ai/sdk": "^0.39.0",
91
+ "@eslint/js": "^9.17.0",
92
+ "@fal-ai/client": "^1.8.0",
93
+ "@opentelemetry/context-async-hooks": "^2.2.0",
94
+ "@opentelemetry/sdk-trace-base": "^1.25.0",
95
+ "@opentelemetry/sdk-trace-node": "^1.25.0",
96
+ "@types/node": "^22.15.3",
97
+ "@types/pg": "^8.11.6",
98
+ "eslint": "^9.17.0",
99
+ "openai": "^4.77.0",
100
+ "pg": "^8.13.0",
101
+ "typescript": "^5.9.2",
102
+ "typescript-eslint": "^8.18.2",
103
+ "vitest": "^2.1.0"
104
+ },
105
+ "keywords": [
106
+ "ai",
107
+ "cost-tracking",
108
+ "opentelemetry",
109
+ "otel",
110
+ "tracing",
111
+ "openai",
112
+ "anthropic",
113
+ "fal",
114
+ "llm",
115
+ "tokens",
116
+ "billing",
117
+ "observability"
118
+ ]
119
+ }