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,192 @@
1
+ /**
2
+ * ElevenLabs SDK Wrapper for cost tracking
3
+ *
4
+ * ElevenLabs pricing is based on characters, not tokens.
5
+ * Different voice models have different per-character costs.
6
+ *
7
+ * Official SDK: https://github.com/elevenlabs/elevenlabs-js
8
+ *
9
+ * Models:
10
+ * - eleven_multilingual_v2: High quality, 29 languages
11
+ * - eleven_flash_v2_5: Ultra-low latency, 50% cheaper, 32 languages
12
+ * - eleven_turbo_v2_5: Balanced quality/latency, 32 languages
13
+ */
14
+ import { recordEvent } from "../recorder.js";
15
+ import { getPricing, resolveModel } from "../config.js";
16
+ /**
17
+ * Calculate cost for ElevenLabs based on character count
18
+ */
19
+ function calculateElevenLabsCost(model, characterCount) {
20
+ const pricing = getPricing();
21
+ const resolvedModel = resolveModel(model);
22
+ // Try various pricing key formats
23
+ const modelPricing = pricing[resolvedModel] ||
24
+ pricing[`elevenlabs/${resolvedModel}`] ||
25
+ pricing[model] ||
26
+ pricing[`elevenlabs/${model}`] ||
27
+ pricing["elevenlabs/default"];
28
+ if (!modelPricing) {
29
+ console.warn(`[tokenmeter] No pricing found for ElevenLabs model: ${model}`);
30
+ return 0;
31
+ }
32
+ // ElevenLabs pricing uses 'input' field for per-character cost (per 1K characters)
33
+ return (characterCount / 1000) * modelPricing.input;
34
+ }
35
+ /**
36
+ * Wrap an ElevenLabs client to track costs
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { ElevenLabsClient } from "elevenlabs";
41
+ * import { trackElevenLabs } from "tokenmeter/elevenlabs";
42
+ *
43
+ * const client = new ElevenLabsClient({ apiKey: "..." });
44
+ * const trackedClient = trackElevenLabs(client);
45
+ *
46
+ * // All calls are now tracked
47
+ * await trackedClient.textToSpeech.convert("voice_id", {
48
+ * text: "Hello world",
49
+ * modelId: "eleven_multilingual_v2"
50
+ * });
51
+ * ```
52
+ */
53
+ export function trackElevenLabs(client) {
54
+ const wrapped = { ...client };
55
+ // Wrap textToSpeech.convert if it exists
56
+ if (client.textToSpeech?.convert) {
57
+ const originalConvert = client.textToSpeech.convert.bind(client.textToSpeech);
58
+ wrapped.textToSpeech = {
59
+ ...client.textToSpeech,
60
+ convert: async (voiceId, options) => {
61
+ const startTime = Date.now();
62
+ const model = options.modelId || "eleven_multilingual_v2";
63
+ const characterCount = options.text.length;
64
+ try {
65
+ const result = await originalConvert(voiceId, options);
66
+ const cost = calculateElevenLabsCost(model, characterCount);
67
+ recordEvent({
68
+ provider: "elevenlabs",
69
+ model,
70
+ operation: "text-to-speech",
71
+ costUsd: cost,
72
+ status: "success",
73
+ metadata: {
74
+ voiceId,
75
+ characterCount,
76
+ durationMs: Date.now() - startTime,
77
+ outputFormat: options.outputFormat,
78
+ },
79
+ });
80
+ return result;
81
+ }
82
+ catch (error) {
83
+ recordEvent({
84
+ provider: "elevenlabs",
85
+ model,
86
+ operation: "text-to-speech",
87
+ status: "failed",
88
+ billable: false,
89
+ errorMessage: error instanceof Error ? error.message : String(error),
90
+ costUsd: 0,
91
+ metadata: {
92
+ voiceId,
93
+ characterCount,
94
+ durationMs: Date.now() - startTime,
95
+ },
96
+ });
97
+ throw error;
98
+ }
99
+ },
100
+ stream: typeof client.textToSpeech.stream === "function"
101
+ ? async (voiceId, options) => {
102
+ const startTime = Date.now();
103
+ const model = options.modelId || "eleven_multilingual_v2";
104
+ const characterCount = options.text.length;
105
+ try {
106
+ const stream = await client.textToSpeech.stream(voiceId, options);
107
+ // Track cost immediately for streaming (we know the input size)
108
+ const cost = calculateElevenLabsCost(model, characterCount);
109
+ recordEvent({
110
+ provider: "elevenlabs",
111
+ model,
112
+ operation: "text-to-speech",
113
+ costUsd: cost,
114
+ status: "success",
115
+ metadata: {
116
+ voiceId,
117
+ characterCount,
118
+ durationMs: Date.now() - startTime,
119
+ outputFormat: options.outputFormat,
120
+ streamed: true,
121
+ },
122
+ });
123
+ return stream;
124
+ }
125
+ catch (error) {
126
+ recordEvent({
127
+ provider: "elevenlabs",
128
+ model,
129
+ operation: "text-to-speech",
130
+ status: "failed",
131
+ billable: false,
132
+ errorMessage: error instanceof Error ? error.message : String(error),
133
+ costUsd: 0,
134
+ metadata: {
135
+ voiceId,
136
+ characterCount,
137
+ durationMs: Date.now() - startTime,
138
+ },
139
+ });
140
+ throw error;
141
+ }
142
+ }
143
+ : undefined,
144
+ };
145
+ }
146
+ // Wrap generate if it exists (alternative API)
147
+ if (client.generate) {
148
+ const originalGenerate = client.generate.bind(client);
149
+ wrapped.generate = async (options) => {
150
+ const startTime = Date.now();
151
+ const model = options.modelId || "eleven_multilingual_v2";
152
+ const characterCount = options.text.length;
153
+ try {
154
+ const result = await originalGenerate(options);
155
+ const cost = calculateElevenLabsCost(model, characterCount);
156
+ recordEvent({
157
+ provider: "elevenlabs",
158
+ model,
159
+ operation: "text-to-speech",
160
+ costUsd: cost,
161
+ status: "success",
162
+ metadata: {
163
+ voice: options.voice,
164
+ characterCount,
165
+ durationMs: Date.now() - startTime,
166
+ },
167
+ });
168
+ return result;
169
+ }
170
+ catch (error) {
171
+ recordEvent({
172
+ provider: "elevenlabs",
173
+ model,
174
+ operation: "text-to-speech",
175
+ status: "failed",
176
+ billable: false,
177
+ errorMessage: error instanceof Error ? error.message : String(error),
178
+ costUsd: 0,
179
+ metadata: {
180
+ voice: options.voice,
181
+ characterCount,
182
+ durationMs: Date.now() - startTime,
183
+ },
184
+ });
185
+ throw error;
186
+ }
187
+ };
188
+ }
189
+ return wrapped;
190
+ }
191
+ export default trackElevenLabs;
192
+ //# sourceMappingURL=elevenlabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs.js","sourceRoot":"","sources":["../../src/sdks/elevenlabs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * fal.ai SDK Wrapper for cost tracking
3
+ *
4
+ * fal.ai pricing varies by model - image models charge per image,
5
+ * video models charge per second, etc.
6
+ *
7
+ * Official SDK: https://github.com/fal-ai/fal-js
8
+ *
9
+ * Main methods:
10
+ * - fal.run(functionId, { input }) - Direct execution
11
+ * - fal.subscribe(functionId, { input, onQueueUpdate }) - Queue-based execution
12
+ */
13
+ interface FalStream<T = unknown> {
14
+ [Symbol.asyncIterator](): AsyncIterator<T>;
15
+ on(event: "data", callback: (data: T) => void): void;
16
+ on(event: "error", callback: (error: Error) => void): void;
17
+ on(event: "done", callback: (data: T) => void): void;
18
+ done(): Promise<T>;
19
+ }
20
+ interface StreamingClient {
21
+ stream: <T = unknown>(endpointId: string, options: StreamOptions) => Promise<FalStream<T>>;
22
+ }
23
+ interface FalClient {
24
+ subscribe: <T = unknown>(endpointId: string, options: SubscribeOptions) => Promise<FalResult<T>>;
25
+ run: <T = unknown>(endpointId: string, options: RunOptions) => Promise<FalResult<T>>;
26
+ stream?: <T = unknown>(endpointId: string, options: StreamOptions) => Promise<FalStream<T>>;
27
+ streaming?: StreamingClient;
28
+ queue?: {
29
+ submit: (endpointId: string, options: SubmitOptions) => Promise<QueueSubmitResult>;
30
+ status: (endpointId: string, options: StatusOptions) => Promise<QueueStatusResult>;
31
+ result: <T = unknown>(endpointId: string, options: ResultOptions) => Promise<FalResult<T>>;
32
+ cancel?: (endpointId: string, options: {
33
+ requestId: string;
34
+ }) => Promise<void>;
35
+ };
36
+ }
37
+ interface SubscribeOptions {
38
+ input: Record<string, unknown>;
39
+ logs?: boolean;
40
+ onQueueUpdate?: (update: QueueUpdate) => void;
41
+ [key: string]: unknown;
42
+ }
43
+ interface RunOptions {
44
+ input: Record<string, unknown>;
45
+ [key: string]: unknown;
46
+ }
47
+ interface SubmitOptions {
48
+ input: Record<string, unknown>;
49
+ webhookUrl?: string;
50
+ priority?: "low" | "normal";
51
+ [key: string]: unknown;
52
+ }
53
+ interface StatusOptions {
54
+ requestId: string;
55
+ logs?: boolean;
56
+ abortSignal?: AbortSignal;
57
+ }
58
+ interface ResultOptions {
59
+ requestId: string;
60
+ abortSignal?: AbortSignal;
61
+ }
62
+ interface StreamOptions<Input = Record<string, unknown>> {
63
+ input?: Input;
64
+ [key: string]: unknown;
65
+ }
66
+ interface QueueUpdate {
67
+ status: string;
68
+ position?: number;
69
+ [key: string]: unknown;
70
+ }
71
+ interface QueueSubmitResult {
72
+ request_id: string;
73
+ [key: string]: unknown;
74
+ }
75
+ interface QueueStatusResult {
76
+ status: string;
77
+ [key: string]: unknown;
78
+ }
79
+ interface FalResult<T = unknown> {
80
+ data: T;
81
+ requestId: string;
82
+ [key: string]: unknown;
83
+ }
84
+ /**
85
+ * Wrap a fal.ai client to track costs
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * import { fal } from "@fal-ai/client";
90
+ * import { trackFal } from "tokenmeter/fal";
91
+ *
92
+ * const trackedFal = trackFal(fal);
93
+ *
94
+ * // All calls are now tracked
95
+ * const result = await trackedFal.subscribe("fal-ai/flux-pro", {
96
+ * input: { prompt: "A beautiful sunset" }
97
+ * });
98
+ * ```
99
+ */
100
+ export declare function trackFal<T extends Partial<FalClient>>(client: T): T;
101
+ export default trackFal;
102
+ //# sourceMappingURL=fal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fal.d.ts","sourceRoot":"","sources":["../../src/sdks/fal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,306 @@
1
+ /**
2
+ * fal.ai SDK Wrapper for cost tracking
3
+ *
4
+ * fal.ai pricing varies by model - image models charge per image,
5
+ * video models charge per second, etc.
6
+ *
7
+ * Official SDK: https://github.com/fal-ai/fal-js
8
+ *
9
+ * Main methods:
10
+ * - fal.run(functionId, { input }) - Direct execution
11
+ * - fal.subscribe(functionId, { input, onQueueUpdate }) - Queue-based execution
12
+ */
13
+ import { recordEvent } from "../recorder.js";
14
+ import { getPricing, resolveModel } from "../config.js";
15
+ /**
16
+ * Extract the model name from fal.ai endpoint ID
17
+ * e.g., "fal-ai/flux-pro" -> "fal/flux-pro"
18
+ * e.g., "fal-ai/minimax/video-01" -> "fal/minimax/video-01"
19
+ */
20
+ function normalizeModelId(endpointId) {
21
+ // Replace fal-ai/ prefix with fal/
22
+ return endpointId.replace("fal-ai/", "fal/");
23
+ }
24
+ /**
25
+ * Calculate cost for fal.ai based on model and output
26
+ */
27
+ function calculateFalCost(model, result, input) {
28
+ const pricing = getPricing();
29
+ const resolvedModel = resolveModel(model);
30
+ const modelPricing = pricing[resolvedModel] || pricing[model];
31
+ const metadata = {};
32
+ if (!modelPricing) {
33
+ console.warn(`[tokenmeter] No pricing found for fal.ai model: ${model}`);
34
+ return { cost: 0, metadata };
35
+ }
36
+ // Try to determine output type and calculate accordingly
37
+ const data = result?.data || result;
38
+ // Image generation models
39
+ if (isImageOutput(data)) {
40
+ const imageCount = data.images?.length || (data.image ? 1 : 0);
41
+ metadata.imageCount = imageCount;
42
+ // Use 'output' field for per-image pricing
43
+ if (modelPricing.output) {
44
+ return { cost: imageCount * modelPricing.output, metadata };
45
+ }
46
+ }
47
+ // Video generation models
48
+ if (isVideoOutput(data)) {
49
+ const duration = data.duration || input.duration || 5;
50
+ metadata.videoDuration = duration;
51
+ // Use 'output' field for per-second pricing
52
+ if (modelPricing.output) {
53
+ return { cost: duration * modelPricing.output, metadata };
54
+ }
55
+ }
56
+ // Fallback: use input pricing as flat rate
57
+ if (modelPricing.input) {
58
+ return { cost: modelPricing.input, metadata };
59
+ }
60
+ return { cost: 0, metadata };
61
+ }
62
+ function isImageOutput(data) {
63
+ if (!data || typeof data !== "object")
64
+ return false;
65
+ const d = data;
66
+ return "images" in d || "image" in d;
67
+ }
68
+ function isVideoOutput(data) {
69
+ if (!data || typeof data !== "object")
70
+ return false;
71
+ const d = data;
72
+ return "video" in d || "duration" in d;
73
+ }
74
+ /**
75
+ * Determine operation type from endpoint ID
76
+ */
77
+ function getOperationType(endpointId) {
78
+ const lower = endpointId.toLowerCase();
79
+ if (lower.includes("flux") ||
80
+ lower.includes("stable-diffusion") ||
81
+ lower.includes("sdxl") ||
82
+ lower.includes("imagen") ||
83
+ lower.includes("recraft") ||
84
+ lower.includes("ideogram")) {
85
+ return "image";
86
+ }
87
+ if (lower.includes("video") ||
88
+ lower.includes("runway") ||
89
+ lower.includes("animate") ||
90
+ lower.includes("minimax") ||
91
+ lower.includes("kling") ||
92
+ lower.includes("luma")) {
93
+ return "video";
94
+ }
95
+ if (lower.includes("whisper") || lower.includes("transcribe")) {
96
+ return "transcription";
97
+ }
98
+ if (lower.includes("llava") || lower.includes("llm")) {
99
+ return "llm";
100
+ }
101
+ return "inference";
102
+ }
103
+ /**
104
+ * Wrap a fal.ai client to track costs
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * import { fal } from "@fal-ai/client";
109
+ * import { trackFal } from "tokenmeter/fal";
110
+ *
111
+ * const trackedFal = trackFal(fal);
112
+ *
113
+ * // All calls are now tracked
114
+ * const result = await trackedFal.subscribe("fal-ai/flux-pro", {
115
+ * input: { prompt: "A beautiful sunset" }
116
+ * });
117
+ * ```
118
+ */
119
+ export function trackFal(client) {
120
+ const wrapped = { ...client };
121
+ // Wrap subscribe
122
+ if (client.subscribe) {
123
+ const originalSubscribe = client.subscribe.bind(client);
124
+ wrapped.subscribe = async (endpointId, options) => {
125
+ const startTime = Date.now();
126
+ const model = normalizeModelId(endpointId);
127
+ const operation = getOperationType(endpointId);
128
+ try {
129
+ const result = await originalSubscribe(endpointId, options);
130
+ const { cost, metadata } = calculateFalCost(model, result, options.input);
131
+ recordEvent({
132
+ provider: "fal",
133
+ model,
134
+ operation,
135
+ costUsd: cost,
136
+ status: "success",
137
+ metadata: {
138
+ ...metadata,
139
+ requestId: result.requestId,
140
+ durationMs: Date.now() - startTime,
141
+ },
142
+ });
143
+ return result;
144
+ }
145
+ catch (error) {
146
+ recordEvent({
147
+ provider: "fal",
148
+ model,
149
+ operation,
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
+ },
157
+ });
158
+ throw error;
159
+ }
160
+ };
161
+ }
162
+ // Wrap run
163
+ if (client.run) {
164
+ const originalRun = client.run.bind(client);
165
+ wrapped.run = async (endpointId, options) => {
166
+ const startTime = Date.now();
167
+ const model = normalizeModelId(endpointId);
168
+ const operation = getOperationType(endpointId);
169
+ try {
170
+ const result = await originalRun(endpointId, options);
171
+ const { cost, metadata } = calculateFalCost(model, result, options.input);
172
+ recordEvent({
173
+ provider: "fal",
174
+ model,
175
+ operation,
176
+ costUsd: cost,
177
+ status: "success",
178
+ metadata: {
179
+ ...metadata,
180
+ requestId: result.requestId,
181
+ durationMs: Date.now() - startTime,
182
+ },
183
+ });
184
+ return result;
185
+ }
186
+ catch (error) {
187
+ recordEvent({
188
+ provider: "fal",
189
+ model,
190
+ operation,
191
+ status: "failed",
192
+ billable: false,
193
+ errorMessage: error instanceof Error ? error.message : String(error),
194
+ costUsd: 0,
195
+ metadata: {
196
+ durationMs: Date.now() - startTime,
197
+ },
198
+ });
199
+ throw error;
200
+ }
201
+ };
202
+ }
203
+ // Wrap stream method (for streaming LLM responses, etc.)
204
+ if (client.stream) {
205
+ const originalStream = client.stream.bind(client);
206
+ wrapped.stream = async (endpointId, options) => {
207
+ const startTime = Date.now();
208
+ const model = normalizeModelId(endpointId);
209
+ const operation = getOperationType(endpointId);
210
+ try {
211
+ const stream = await originalStream(endpointId, options);
212
+ // For streaming, we track when the stream completes via the done() promise
213
+ // We wrap the done() method to capture the final result
214
+ const originalDone = stream.done.bind(stream);
215
+ stream.done = async () => {
216
+ const result = await originalDone();
217
+ const { cost, metadata } = calculateFalCost(model, { data: result }, options.input || {});
218
+ recordEvent({
219
+ provider: "fal",
220
+ model,
221
+ operation,
222
+ costUsd: cost,
223
+ status: "success",
224
+ metadata: {
225
+ ...metadata,
226
+ durationMs: Date.now() - startTime,
227
+ streamed: true,
228
+ },
229
+ });
230
+ return result;
231
+ };
232
+ return stream;
233
+ }
234
+ catch (error) {
235
+ recordEvent({
236
+ provider: "fal",
237
+ model,
238
+ operation,
239
+ status: "failed",
240
+ billable: false,
241
+ errorMessage: error instanceof Error ? error.message : String(error),
242
+ costUsd: 0,
243
+ metadata: {
244
+ durationMs: Date.now() - startTime,
245
+ streamed: true,
246
+ },
247
+ });
248
+ throw error;
249
+ }
250
+ };
251
+ }
252
+ // Wrap queue methods
253
+ if (client.queue) {
254
+ const originalQueue = client.queue;
255
+ wrapped.queue = {
256
+ submit: originalQueue.submit?.bind(originalQueue),
257
+ status: originalQueue.status?.bind(originalQueue),
258
+ result: originalQueue.result
259
+ ? async (endpointId, options) => {
260
+ const startTime = Date.now();
261
+ const model = normalizeModelId(endpointId);
262
+ const operation = getOperationType(endpointId);
263
+ try {
264
+ const result = await originalQueue.result(endpointId, options);
265
+ const { cost, metadata } = calculateFalCost(model, result, {});
266
+ recordEvent({
267
+ provider: "fal",
268
+ model,
269
+ operation,
270
+ costUsd: cost,
271
+ status: "success",
272
+ metadata: {
273
+ ...metadata,
274
+ requestId: options.requestId,
275
+ durationMs: Date.now() - startTime,
276
+ queued: true,
277
+ },
278
+ });
279
+ return result;
280
+ }
281
+ catch (error) {
282
+ recordEvent({
283
+ provider: "fal",
284
+ model,
285
+ operation,
286
+ status: "failed",
287
+ billable: false,
288
+ errorMessage: error instanceof Error ? error.message : String(error),
289
+ costUsd: 0,
290
+ metadata: {
291
+ requestId: options.requestId,
292
+ durationMs: Date.now() - startTime,
293
+ queued: true,
294
+ },
295
+ });
296
+ throw error;
297
+ }
298
+ }
299
+ : undefined,
300
+ cancel: originalQueue.cancel?.bind(originalQueue),
301
+ };
302
+ }
303
+ return wrapped;
304
+ }
305
+ export default trackFal;
306
+ //# sourceMappingURL=fal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fal.js","sourceRoot":"","sources":["../../src/sdks/fal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import OpenAI from "openai";
2
+ import type { ClientOptions } from "openai";
3
+ /**
4
+ * Wrapped OpenAI client that automatically tracks costs
5
+ */
6
+ export declare class TrackedOpenAI extends OpenAI {
7
+ constructor(opts?: ClientOptions);
8
+ }
9
+ /**
10
+ * Create a tracked OpenAI client
11
+ */
12
+ export declare function createOpenAI(opts?: ClientOptions): TrackedOpenAI;
13
+ /**
14
+ * Default export - a function to create tracked clients
15
+ */
16
+ export default createOpenAI;
17
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/sdks/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AA8P5C;;GAEG;AACH,qBAAa,aAAc,SAAQ,MAAM;gBAC3B,IAAI,CAAC,EAAE,aAAa;CAOjC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,aAAa,CAEhE;AAED;;GAEG;AACH,eAAe,YAAY,CAAC"}