@revenium/openai 1.0.8

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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1095 -0
  3. package/dist/cjs/core/config/azure-config.js +64 -0
  4. package/dist/cjs/core/config/azure-config.js.map +1 -0
  5. package/dist/cjs/core/config/index.js +41 -0
  6. package/dist/cjs/core/config/index.js.map +1 -0
  7. package/dist/cjs/core/config/loader.js +63 -0
  8. package/dist/cjs/core/config/loader.js.map +1 -0
  9. package/dist/cjs/core/config/manager.js +93 -0
  10. package/dist/cjs/core/config/manager.js.map +1 -0
  11. package/dist/cjs/core/config/validator.js +73 -0
  12. package/dist/cjs/core/config/validator.js.map +1 -0
  13. package/dist/cjs/core/providers/detector.js +140 -0
  14. package/dist/cjs/core/providers/detector.js.map +1 -0
  15. package/dist/cjs/core/providers/index.js +18 -0
  16. package/dist/cjs/core/providers/index.js.map +1 -0
  17. package/dist/cjs/core/tracking/api-client.js +68 -0
  18. package/dist/cjs/core/tracking/api-client.js.map +1 -0
  19. package/dist/cjs/core/tracking/index.js +23 -0
  20. package/dist/cjs/core/tracking/index.js.map +1 -0
  21. package/dist/cjs/core/tracking/payload-builder.js +107 -0
  22. package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
  23. package/dist/cjs/core/tracking/usage-tracker.js +120 -0
  24. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
  25. package/dist/cjs/core/wrapper/index.js +15 -0
  26. package/dist/cjs/core/wrapper/index.js.map +1 -0
  27. package/dist/cjs/core/wrapper/instance-patcher.js +202 -0
  28. package/dist/cjs/core/wrapper/instance-patcher.js.map +1 -0
  29. package/dist/cjs/core/wrapper/request-handler.js +317 -0
  30. package/dist/cjs/core/wrapper/request-handler.js.map +1 -0
  31. package/dist/cjs/core/wrapper/stream-wrapper.js +82 -0
  32. package/dist/cjs/core/wrapper/stream-wrapper.js.map +1 -0
  33. package/dist/cjs/index.js +195 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/types/function-parameters.js +14 -0
  36. package/dist/cjs/types/function-parameters.js.map +1 -0
  37. package/dist/cjs/types/index.js +49 -0
  38. package/dist/cjs/types/index.js.map +1 -0
  39. package/dist/cjs/types/openai-augmentation.js +55 -0
  40. package/dist/cjs/types/openai-augmentation.js.map +1 -0
  41. package/dist/cjs/types/responses-api.js +30 -0
  42. package/dist/cjs/types/responses-api.js.map +1 -0
  43. package/dist/cjs/utils/azure-model-resolver.js +211 -0
  44. package/dist/cjs/utils/azure-model-resolver.js.map +1 -0
  45. package/dist/cjs/utils/constants.js +24 -0
  46. package/dist/cjs/utils/constants.js.map +1 -0
  47. package/dist/cjs/utils/error-handler.js +194 -0
  48. package/dist/cjs/utils/error-handler.js.map +1 -0
  49. package/dist/cjs/utils/metadata-builder.js +184 -0
  50. package/dist/cjs/utils/metadata-builder.js.map +1 -0
  51. package/dist/cjs/utils/provider-detection.js +212 -0
  52. package/dist/cjs/utils/provider-detection.js.map +1 -0
  53. package/dist/cjs/utils/request-handler-factory.js +185 -0
  54. package/dist/cjs/utils/request-handler-factory.js.map +1 -0
  55. package/dist/cjs/utils/stop-reason-mapper.js +70 -0
  56. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
  57. package/dist/cjs/utils/type-guards.js +175 -0
  58. package/dist/cjs/utils/type-guards.js.map +1 -0
  59. package/dist/cjs/utils/url-builder.js +43 -0
  60. package/dist/cjs/utils/url-builder.js.map +1 -0
  61. package/dist/esm/core/config/azure-config.js +61 -0
  62. package/dist/esm/core/config/azure-config.js.map +1 -0
  63. package/dist/esm/core/config/index.js +13 -0
  64. package/dist/esm/core/config/index.js.map +1 -0
  65. package/dist/esm/core/config/loader.js +58 -0
  66. package/dist/esm/core/config/loader.js.map +1 -0
  67. package/dist/esm/core/config/manager.js +85 -0
  68. package/dist/esm/core/config/manager.js.map +1 -0
  69. package/dist/esm/core/config/validator.js +69 -0
  70. package/dist/esm/core/config/validator.js.map +1 -0
  71. package/dist/esm/core/providers/detector.js +134 -0
  72. package/dist/esm/core/providers/detector.js.map +1 -0
  73. package/dist/esm/core/providers/index.js +10 -0
  74. package/dist/esm/core/providers/index.js.map +1 -0
  75. package/dist/esm/core/tracking/api-client.js +65 -0
  76. package/dist/esm/core/tracking/api-client.js.map +1 -0
  77. package/dist/esm/core/tracking/index.js +13 -0
  78. package/dist/esm/core/tracking/index.js.map +1 -0
  79. package/dist/esm/core/tracking/payload-builder.js +104 -0
  80. package/dist/esm/core/tracking/payload-builder.js.map +1 -0
  81. package/dist/esm/core/tracking/usage-tracker.js +114 -0
  82. package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
  83. package/dist/esm/core/wrapper/index.js +9 -0
  84. package/dist/esm/core/wrapper/index.js.map +1 -0
  85. package/dist/esm/core/wrapper/instance-patcher.js +199 -0
  86. package/dist/esm/core/wrapper/instance-patcher.js.map +1 -0
  87. package/dist/esm/core/wrapper/request-handler.js +310 -0
  88. package/dist/esm/core/wrapper/request-handler.js.map +1 -0
  89. package/dist/esm/core/wrapper/stream-wrapper.js +79 -0
  90. package/dist/esm/core/wrapper/stream-wrapper.js.map +1 -0
  91. package/dist/esm/index.js +175 -0
  92. package/dist/esm/index.js.map +1 -0
  93. package/dist/esm/types/function-parameters.js +13 -0
  94. package/dist/esm/types/function-parameters.js.map +1 -0
  95. package/dist/esm/types/index.js +32 -0
  96. package/dist/esm/types/index.js.map +1 -0
  97. package/dist/esm/types/openai-augmentation.js +54 -0
  98. package/dist/esm/types/openai-augmentation.js.map +1 -0
  99. package/dist/esm/types/responses-api.js +26 -0
  100. package/dist/esm/types/responses-api.js.map +1 -0
  101. package/dist/esm/utils/azure-model-resolver.js +204 -0
  102. package/dist/esm/utils/azure-model-resolver.js.map +1 -0
  103. package/dist/esm/utils/constants.js +21 -0
  104. package/dist/esm/utils/constants.js.map +1 -0
  105. package/dist/esm/utils/error-handler.js +182 -0
  106. package/dist/esm/utils/error-handler.js.map +1 -0
  107. package/dist/esm/utils/metadata-builder.js +176 -0
  108. package/dist/esm/utils/metadata-builder.js.map +1 -0
  109. package/dist/esm/utils/provider-detection.js +206 -0
  110. package/dist/esm/utils/provider-detection.js.map +1 -0
  111. package/dist/esm/utils/request-handler-factory.js +146 -0
  112. package/dist/esm/utils/request-handler-factory.js.map +1 -0
  113. package/dist/esm/utils/stop-reason-mapper.js +65 -0
  114. package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
  115. package/dist/esm/utils/type-guards.js +158 -0
  116. package/dist/esm/utils/type-guards.js.map +1 -0
  117. package/dist/esm/utils/url-builder.js +39 -0
  118. package/dist/esm/utils/url-builder.js.map +1 -0
  119. package/dist/types/core/config/azure-config.d.ts +16 -0
  120. package/dist/types/core/config/azure-config.d.ts.map +1 -0
  121. package/dist/types/core/config/index.d.ts +11 -0
  122. package/dist/types/core/config/index.d.ts.map +1 -0
  123. package/dist/types/core/config/loader.d.ts +20 -0
  124. package/dist/types/core/config/loader.d.ts.map +1 -0
  125. package/dist/types/core/config/manager.d.ts +32 -0
  126. package/dist/types/core/config/manager.d.ts.map +1 -0
  127. package/dist/types/core/config/validator.d.ts +23 -0
  128. package/dist/types/core/config/validator.d.ts.map +1 -0
  129. package/dist/types/core/providers/detector.d.ts +44 -0
  130. package/dist/types/core/providers/detector.d.ts.map +1 -0
  131. package/dist/types/core/providers/index.d.ts +9 -0
  132. package/dist/types/core/providers/index.d.ts.map +1 -0
  133. package/dist/types/core/tracking/api-client.d.ts +17 -0
  134. package/dist/types/core/tracking/api-client.d.ts.map +1 -0
  135. package/dist/types/core/tracking/index.d.ts +11 -0
  136. package/dist/types/core/tracking/index.d.ts.map +1 -0
  137. package/dist/types/core/tracking/payload-builder.d.ts +24 -0
  138. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
  139. package/dist/types/core/tracking/usage-tracker.d.ts +48 -0
  140. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
  141. package/dist/types/core/wrapper/index.d.ts +8 -0
  142. package/dist/types/core/wrapper/index.d.ts.map +1 -0
  143. package/dist/types/core/wrapper/instance-patcher.d.ts +33 -0
  144. package/dist/types/core/wrapper/instance-patcher.d.ts.map +1 -0
  145. package/dist/types/core/wrapper/request-handler.d.ts +29 -0
  146. package/dist/types/core/wrapper/request-handler.d.ts.map +1 -0
  147. package/dist/types/core/wrapper/stream-wrapper.d.ts +13 -0
  148. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +1 -0
  149. package/dist/types/index.d.ts +179 -0
  150. package/dist/types/index.d.ts.map +1 -0
  151. package/dist/types/types/function-parameters.d.ts +229 -0
  152. package/dist/types/types/function-parameters.d.ts.map +1 -0
  153. package/dist/types/types/index.d.ts +283 -0
  154. package/dist/types/types/index.d.ts.map +1 -0
  155. package/dist/types/types/openai-augmentation.d.ts +226 -0
  156. package/dist/types/types/openai-augmentation.d.ts.map +1 -0
  157. package/dist/types/types/responses-api.d.ts +247 -0
  158. package/dist/types/types/responses-api.d.ts.map +1 -0
  159. package/dist/types/utils/azure-model-resolver.d.ts +41 -0
  160. package/dist/types/utils/azure-model-resolver.d.ts.map +1 -0
  161. package/dist/types/utils/constants.d.ts +4 -0
  162. package/dist/types/utils/constants.d.ts.map +1 -0
  163. package/dist/types/utils/error-handler.d.ts +95 -0
  164. package/dist/types/utils/error-handler.d.ts.map +1 -0
  165. package/dist/types/utils/metadata-builder.d.ts +64 -0
  166. package/dist/types/utils/metadata-builder.d.ts.map +1 -0
  167. package/dist/types/utils/provider-detection.d.ts +51 -0
  168. package/dist/types/utils/provider-detection.d.ts.map +1 -0
  169. package/dist/types/utils/request-handler-factory.d.ts +81 -0
  170. package/dist/types/utils/request-handler-factory.d.ts.map +1 -0
  171. package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
  172. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
  173. package/dist/types/utils/type-guards.d.ts +73 -0
  174. package/dist/types/utils/type-guards.d.ts.map +1 -0
  175. package/dist/types/utils/url-builder.d.ts +25 -0
  176. package/dist/types/utils/url-builder.d.ts.map +1 -0
  177. package/package.json +84 -0
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ /**
3
+ * Request Handler Module
4
+ *
5
+ * Handles different types of OpenAI requests (streaming, non-streaming, embeddings).
6
+ * Extracted from wrapper.ts for better organization.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.handleNonStreamingRequest = handleNonStreamingRequest;
10
+ exports.handleStreamingRequest = handleStreamingRequest;
11
+ exports.handleEmbeddingsRequest = handleEmbeddingsRequest;
12
+ exports.handleResponsesNonStreamingRequest = handleResponsesNonStreamingRequest;
13
+ exports.handleResponsesStreamingRequest = handleResponsesStreamingRequest;
14
+ const crypto_1 = require("crypto");
15
+ const type_guards_js_1 = require("../../utils/type-guards.js");
16
+ const error_handler_js_1 = require("../../utils/error-handler.js");
17
+ const metadata_builder_js_1 = require("../../utils/metadata-builder.js");
18
+ const index_js_1 = require("../tracking/index.js");
19
+ const index_js_2 = require("../config/index.js");
20
+ const instance_patcher_js_1 = require("./instance-patcher.js");
21
+ const stream_wrapper_js_1 = require("./stream-wrapper.js");
22
+ // Global logger
23
+ const logger = (0, index_js_2.getLogger)();
24
+ /**
25
+ * Handle non-streaming OpenAI requests
26
+ */
27
+ async function handleNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
28
+ const loggingContext = (0, metadata_builder_js_1.createLoggingContext)(usageMetadata);
29
+ const result = await (0, error_handler_js_1.safeAsyncOperation)(async () => {
30
+ // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
31
+ const response = await originalCreate(params, options);
32
+ // Validate response structure
33
+ if (!(0, type_guards_js_1.hasValidUsage)(response)) {
34
+ logger.warn('Invalid response structure from OpenAI API', {
35
+ ...loggingContext,
36
+ response,
37
+ });
38
+ return response;
39
+ }
40
+ // Calculate duration
41
+ const duration = Date.now() - requestStartTime;
42
+ // Get provider info for this instance
43
+ const providerInfo = instance_patcher_js_1.instanceProviders.get(instance);
44
+ // Track usage for chat completions
45
+ if ((0, type_guards_js_1.isOpenAIChatResponse)(response)) {
46
+ (0, index_js_1.trackUsageAsync)({
47
+ requestId: response.id,
48
+ model: response.model,
49
+ promptTokens: response.usage.prompt_tokens,
50
+ completionTokens: response.usage.completion_tokens || 0,
51
+ totalTokens: response.usage.total_tokens,
52
+ reasoningTokens: response.usage.reasoning_tokens,
53
+ cachedTokens: response.usage.cached_tokens,
54
+ duration,
55
+ finishReason: response.choices?.[0]?.finish_reason || null,
56
+ usageMetadata,
57
+ isStreamed: false,
58
+ providerInfo,
59
+ });
60
+ }
61
+ logger.debug('Chat completion request completed', {
62
+ ...loggingContext,
63
+ model: response.model,
64
+ duration,
65
+ totalTokens: response.usage.total_tokens,
66
+ });
67
+ return response;
68
+ }, 'Non-streaming OpenAI request', {
69
+ logError: true,
70
+ rethrow: true,
71
+ messagePrefix: 'Chat completion request failed: ',
72
+ transformError: error => {
73
+ const classified = (0, error_handler_js_1.classifyError)(error);
74
+ if (classified.type === 'network') {
75
+ return new error_handler_js_1.NetworkError(classified.message, {
76
+ ...loggingContext,
77
+ duration: Date.now() - requestStartTime,
78
+ });
79
+ }
80
+ return error instanceof Error ? error : new Error(String(error));
81
+ },
82
+ }, logger);
83
+ if (!result)
84
+ throw new Error('OpenAI request failed without specific error');
85
+ return result;
86
+ }
87
+ /**
88
+ * Handle streaming OpenAI requests
89
+ */
90
+ async function handleStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
91
+ try {
92
+ // Ensure stream_options includes usage data for token tracking
93
+ const enhancedParams = {
94
+ ...params,
95
+ stream_options: {
96
+ include_usage: true,
97
+ ...(params.stream_options || {}),
98
+ },
99
+ };
100
+ logger.debug('Enhanced streaming params with usage tracking', {
101
+ originalStreamOptions: params.stream_options,
102
+ enhancedStreamOptions: enhancedParams.stream_options,
103
+ });
104
+ // Call the original OpenAI method to get the stream (cast params back to original type since usageMetadata is removed)
105
+ const originalStream = await originalCreate(enhancedParams, options);
106
+ logger.debug('Chat completion streaming request initiated', {
107
+ model: params.model,
108
+ });
109
+ // Return a wrapped stream that tracks usage when complete
110
+ return (0, stream_wrapper_js_1.createTrackingStreamWrapper)(originalStream, usageMetadata, requestStartTime, instance);
111
+ }
112
+ catch (error) {
113
+ const duration = Date.now() - requestStartTime;
114
+ logger.error('Chat completion streaming request failed', {
115
+ error: error instanceof Error ? error.message : String(error),
116
+ duration,
117
+ });
118
+ // Re-throw the error to maintain original behavior
119
+ throw error;
120
+ }
121
+ }
122
+ /**
123
+ * Handle embeddings requests
124
+ */
125
+ async function handleEmbeddingsRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
126
+ try {
127
+ // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
128
+ const response = await originalCreate(params, options);
129
+ // Validate response structure
130
+ if (!(0, type_guards_js_1.isOpenAIEmbeddingResponse)(response)) {
131
+ logger.warn('Invalid embeddings response structure from OpenAI API', { response });
132
+ return response;
133
+ }
134
+ // Calculate duration
135
+ const duration = Date.now() - requestStartTime;
136
+ // Get provider info for this instance
137
+ const providerInfo = instance_patcher_js_1.instanceProviders.get(instance);
138
+ // Track embeddings usage
139
+ (0, index_js_1.trackEmbeddingsUsageAsync)({
140
+ transactionId: `embed-${(0, crypto_1.randomUUID)()}`,
141
+ model: response.model,
142
+ promptTokens: response.usage.prompt_tokens,
143
+ totalTokens: response.usage.total_tokens,
144
+ duration,
145
+ usageMetadata,
146
+ requestStartTime,
147
+ providerInfo,
148
+ });
149
+ logger.debug('Embeddings request completed', {
150
+ model: response.model,
151
+ duration,
152
+ totalTokens: response.usage.total_tokens,
153
+ });
154
+ return response;
155
+ }
156
+ catch (error) {
157
+ const duration = Date.now() - requestStartTime;
158
+ logger.error('Embeddings request failed', {
159
+ error: error instanceof Error ? error.message : String(error),
160
+ duration,
161
+ });
162
+ // Re-throw the error to maintain original behavior
163
+ throw error;
164
+ }
165
+ }
166
+ /**
167
+ * Handle non-streaming OpenAI Responses API requests
168
+ */
169
+ async function handleResponsesNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
170
+ const loggingContext = (0, metadata_builder_js_1.createLoggingContext)(usageMetadata);
171
+ const result = await (0, error_handler_js_1.safeAsyncOperation)(async () => {
172
+ // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
173
+ const response = await originalCreate(params, options);
174
+ // Validate response structure
175
+ if (!response || typeof response !== 'object') {
176
+ throw new Error('Invalid response from OpenAI Responses API');
177
+ }
178
+ const duration = Date.now() - requestStartTime;
179
+ // Extract usage information (Responses API may have different structure)
180
+ const usage = response.usage;
181
+ if (usage) {
182
+ // Track usage asynchronously using similar pattern to chat completions
183
+ (0, index_js_1.trackUsageAsync)({
184
+ requestId: response.id || (0, crypto_1.randomUUID)(),
185
+ model: response.model || params.model,
186
+ promptTokens: usage.input_tokens || 0,
187
+ completionTokens: usage.output_tokens || 0,
188
+ totalTokens: usage.total_tokens || 0,
189
+ reasoningTokens: usage.reasoning_tokens,
190
+ cachedTokens: usage.cached_tokens,
191
+ duration,
192
+ finishReason: response.finish_reason || 'completed',
193
+ usageMetadata,
194
+ isStreamed: false,
195
+ providerInfo: instance_patcher_js_1.instanceProviders.get(instance),
196
+ });
197
+ }
198
+ logger.debug('Responses API request completed', {
199
+ ...loggingContext,
200
+ model: response.model,
201
+ duration,
202
+ totalTokens: usage?.total_tokens,
203
+ });
204
+ return response;
205
+ }, 'Non-streaming OpenAI Responses API request', {
206
+ logError: true,
207
+ rethrow: true,
208
+ messagePrefix: 'Responses API request failed: ',
209
+ transformError: error => {
210
+ const classified = (0, error_handler_js_1.classifyError)(error);
211
+ if (classified.type === 'network') {
212
+ return new error_handler_js_1.NetworkError(classified.message, {
213
+ ...loggingContext,
214
+ duration: Date.now() - requestStartTime,
215
+ });
216
+ }
217
+ return error instanceof Error ? error : new Error(String(error));
218
+ },
219
+ }, logger);
220
+ if (!result)
221
+ throw new Error('OpenAI Responses API request failed without specific error');
222
+ return result;
223
+ }
224
+ /**
225
+ * Handle streaming OpenAI Responses API requests
226
+ */
227
+ async function handleResponsesStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
228
+ try {
229
+ // Call the original OpenAI method to get the stream (cast params back to original type since usageMetadata is removed)
230
+ const originalStream = await originalCreate(params, options);
231
+ logger.debug('Responses API streaming request initiated', {
232
+ model: params.model,
233
+ });
234
+ // Return a wrapped stream that tracks usage when complete
235
+ // We'll use a similar pattern to chat completions but adapted for Responses API
236
+ return createResponsesTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance);
237
+ }
238
+ catch (error) {
239
+ const duration = Date.now() - requestStartTime;
240
+ logger.error('Responses API streaming request failed', {
241
+ error: error instanceof Error ? error.message : String(error),
242
+ duration,
243
+ });
244
+ // Re-throw the error to maintain original behavior
245
+ throw error;
246
+ }
247
+ }
248
+ /**
249
+ * Create a tracking stream wrapper for Responses API
250
+ * Similar to createTrackingStreamWrapper but adapted for Responses API structure
251
+ */
252
+ async function* createResponsesTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance) {
253
+ let firstChunkTime;
254
+ let finalUsage = null;
255
+ let model = '';
256
+ let requestId = '';
257
+ let finishReason = null;
258
+ try {
259
+ for await (const chunk of originalStream) {
260
+ // Record time to first token
261
+ if (!firstChunkTime) {
262
+ firstChunkTime = Date.now();
263
+ }
264
+ // Extract information from chunk (Responses API structure may differ)
265
+ if (chunk && typeof chunk === 'object') {
266
+ const chunkObj = chunk;
267
+ // Extract model and ID from chunk
268
+ if (chunkObj.model)
269
+ model = chunkObj.model;
270
+ if (chunkObj.id)
271
+ requestId = chunkObj.id;
272
+ // Check for final usage information
273
+ if (chunkObj.usage) {
274
+ finalUsage = chunkObj.usage;
275
+ }
276
+ // Check for finish reason
277
+ if (chunkObj.finish_reason) {
278
+ finishReason = chunkObj.finish_reason;
279
+ }
280
+ }
281
+ yield chunk;
282
+ }
283
+ // Track usage after stream completes
284
+ if (finalUsage) {
285
+ const duration = Date.now() - requestStartTime;
286
+ const timeToFirstToken = firstChunkTime ? firstChunkTime - requestStartTime : undefined;
287
+ (0, index_js_1.trackUsageAsync)({
288
+ requestId: requestId || (0, crypto_1.randomUUID)(),
289
+ model: model,
290
+ promptTokens: finalUsage.input_tokens || 0,
291
+ completionTokens: finalUsage.output_tokens || 0,
292
+ totalTokens: finalUsage.total_tokens || 0,
293
+ reasoningTokens: finalUsage.reasoning_tokens,
294
+ cachedTokens: finalUsage.cached_tokens,
295
+ duration,
296
+ finishReason: finishReason || 'completed',
297
+ usageMetadata,
298
+ isStreamed: true,
299
+ timeToFirstToken,
300
+ providerInfo: instance_patcher_js_1.instanceProviders.get(instance),
301
+ });
302
+ logger.debug('Responses API streaming completed', {
303
+ model,
304
+ duration,
305
+ timeToFirstToken,
306
+ totalTokens: finalUsage.total_tokens,
307
+ });
308
+ }
309
+ }
310
+ catch (error) {
311
+ logger.error('Error in Responses API stream wrapper', {
312
+ error: error instanceof Error ? error.message : String(error),
313
+ });
314
+ throw error;
315
+ }
316
+ }
317
+ //# sourceMappingURL=request-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-handler.js","sourceRoot":"","sources":["../../../../src/core/wrapper/request-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * Stream Wrapper Module
4
+ *
5
+ * Handles wrapping of streaming responses for usage tracking.
6
+ * Extracted from wrapper.ts for better organization.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createTrackingStreamWrapper = createTrackingStreamWrapper;
10
+ const type_guards_js_1 = require("../../utils/type-guards.js");
11
+ const index_js_1 = require("../tracking/index.js");
12
+ const index_js_2 = require("../config/index.js");
13
+ const instance_patcher_js_1 = require("./instance-patcher.js");
14
+ // Global logger
15
+ const logger = (0, index_js_2.getLogger)();
16
+ /**
17
+ * Create a simple stream wrapper that tracks usage when complete
18
+ */
19
+ function createTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance) {
20
+ // For streaming, we need to collect the final response data
21
+ let accumulatedResponse = null;
22
+ // Create async iterator
23
+ const wrappedIterator = {
24
+ async *[Symbol.asyncIterator]() {
25
+ try {
26
+ for await (const chunk of originalStream) {
27
+ // Validate and accumulate response data for tracking
28
+ if ((0, type_guards_js_1.isStreamChunk)(chunk)) {
29
+ if (!accumulatedResponse) {
30
+ accumulatedResponse = {
31
+ id: chunk.id,
32
+ model: chunk.model,
33
+ usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
34
+ };
35
+ }
36
+ // Update usage if available in chunk
37
+ if (chunk.usage) {
38
+ accumulatedResponse.usage = chunk.usage;
39
+ }
40
+ }
41
+ // Forward the chunk to the client
42
+ yield chunk;
43
+ }
44
+ // Stream completed - track usage
45
+ if (accumulatedResponse && accumulatedResponse.usage) {
46
+ const duration = Date.now() - requestStartTime;
47
+ // Get provider info for this instance
48
+ const providerInfo = instance_patcher_js_1.instanceProviders.get(instance);
49
+ // Safely access extended usage fields
50
+ const usage = accumulatedResponse.usage;
51
+ (0, index_js_1.trackUsageAsync)({
52
+ requestId: accumulatedResponse.id,
53
+ model: accumulatedResponse.model,
54
+ promptTokens: usage.prompt_tokens,
55
+ completionTokens: usage.completion_tokens || 0,
56
+ totalTokens: usage.total_tokens,
57
+ reasoningTokens: usage.reasoning_tokens,
58
+ cachedTokens: usage.cached_tokens,
59
+ duration,
60
+ finishReason: null, // Will be determined from final chunk
61
+ usageMetadata,
62
+ isStreamed: true,
63
+ providerInfo,
64
+ });
65
+ logger.debug('Chat completion streaming completed', {
66
+ model: accumulatedResponse.model,
67
+ duration,
68
+ totalTokens: accumulatedResponse.usage.total_tokens,
69
+ });
70
+ }
71
+ }
72
+ catch (error) {
73
+ logger.error('Chat completion streaming error', {
74
+ error: error instanceof Error ? error.message : String(error),
75
+ });
76
+ throw error;
77
+ }
78
+ },
79
+ };
80
+ return wrappedIterator;
81
+ }
82
+ //# sourceMappingURL=stream-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-wrapper.js","sourceRoot":"","sources":["../../../../src/core/wrapper/stream-wrapper.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAmBH,kEA2EC;AAtFD,+DAA2D;AAC3D,mDAAuD;AACvD,iDAA+C;AAC/C,+DAA0D;AAE1D,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;GAEG;AACH,SAAgB,2BAA2B,CACzC,cAAsC,EACtC,aAAwC,EACxC,gBAAwB,EACxB,QAA8B;IAE9B,4DAA4D;IAC5D,IAAI,mBAAmB,GAAuB,IAAI,CAAC;IAEnD,wBAAwB;IACxB,MAAM,eAAe,GAAG;QACtB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;oBACzC,qDAAqD;oBACrD,IAAI,IAAA,8BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BACzB,mBAAmB,GAAG;gCACpB,EAAE,EAAE,KAAK,CAAC,EAAE;gCACZ,KAAK,EAAE,KAAK,CAAC,KAAK;gCAClB,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;6BACnE,CAAC;wBACJ,CAAC;wBAED,qCAAqC;wBACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;4BAChB,mBAAmB,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;wBAC1C,CAAC;oBACH,CAAC;oBAED,kCAAkC;oBAClC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,iCAAiC;gBACjC,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;oBAE/C,sCAAsC;oBACtC,MAAM,YAAY,GAAG,uCAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAErD,sCAAsC;oBACtC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAsB,CAAC;oBAEzD,IAAA,0BAAe,EAAC;wBACd,SAAS,EAAE,mBAAmB,CAAC,EAAE;wBACjC,KAAK,EAAE,mBAAmB,CAAC,KAAK;wBAChC,YAAY,EAAE,KAAK,CAAC,aAAa;wBACjC,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,IAAI,CAAC;wBAC9C,WAAW,EAAE,KAAK,CAAC,YAAY;wBAC/B,eAAe,EAAE,KAAK,CAAC,gBAAgB;wBACvC,YAAY,EAAE,KAAK,CAAC,aAAa;wBACjC,QAAQ;wBACR,YAAY,EAAE,IAAI,EAAE,sCAAsC;wBAC1D,aAAa;wBACb,UAAU,EAAE,IAAI;wBAChB,YAAY;qBACb,CAAC,CAAC;oBAEH,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;wBAClD,KAAK,EAAE,mBAAmB,CAAC,KAAK;wBAChC,QAAQ;wBACR,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC,YAAY;qBACpD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBAC9C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * Revenium OpenAI Middleware for TypeScript
4
+ *
5
+ * This middleware tracks OpenAI usage and sends metrics to Revenium.
6
+ * Uses hybrid initialization: auto-initializes on import with graceful fallback to manual init.
7
+ *
8
+ * Environment Variables:
9
+ * REVENIUM_METERING_API_KEY=hak_your_api_key
10
+ * REVENIUM_METERING_BASE_URL=https://api.revenium.io/meter (optional)
11
+ * OPENAI_API_KEY=sk_your_openai_key
12
+ *
13
+ * Simple Usage (auto-initialization):
14
+ * import { patchOpenAIInstance } from 'revenium-middleware-openai-node';
15
+ * import OpenAI from 'openai';
16
+ *
17
+ * const openai = patchOpenAIInstance(new OpenAI());
18
+ * // Auto-initializes from environment variables
19
+ *
20
+ * Advanced Usage (explicit initialization):
21
+ * import { initializeReveniumFromEnv, patchOpenAIInstance } from 'revenium-middleware-openai-node';
22
+ * import OpenAI from 'openai';
23
+ *
24
+ * const result = initializeReveniumFromEnv();
25
+ * if (!result.success) {
26
+ * throw new Error(result.message);
27
+ * }
28
+ * const openai = patchOpenAIInstance(new OpenAI());
29
+ *
30
+ * const response = await openai.chat.completions.create({
31
+ * model: 'gpt-4',
32
+ * messages: [{ role: 'user', content: 'Hello!' }],
33
+ * usageMetadata: {
34
+ * subscriber: {
35
+ * id: 'user-123',
36
+ * email: 'user@my-org.com'
37
+ * },
38
+ * organizationId: 'my-org',
39
+ * productId: 'my-app'
40
+ * }
41
+ * });
42
+ */
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.patchOpenAIInstance = exports.wouldTransformDeploymentName = exports.batchResolveModelNames = exports.getModelNameCacheStats = exports.clearModelNameCache = exports.resolveAzureModelName = exports.getProviderInfo = exports.getProviderMetadata = exports.validateAzureConfig = exports.hasAzureConfig = exports.detectProvider = exports.trackEmbeddingsUsageAsync = exports.trackUsageAsync = void 0;
45
+ exports.initializeRevenium = initializeRevenium;
46
+ exports.initializeReveniumFromEnv = initializeReveniumFromEnv;
47
+ exports.isReveniumInitialized = isReveniumInitialized;
48
+ exports.getInitializationStatus = getInitializationStatus;
49
+ // Import type augmentations to extend OpenAI types with usageMetadata
50
+ require("./types/openai-augmentation.js");
51
+ // Import from new modular structure
52
+ const index_js_1 = require("./core/config/index.js");
53
+ const index_js_2 = require("./core/wrapper/index.js");
54
+ // Track initialization state
55
+ let isInitialized = false;
56
+ let autoInitAttempted = false;
57
+ // Note: ExtendedChatCompletionCreateParams and ExtendedEmbeddingCreateParams are no longer exported
58
+ // as they have been replaced with seamless TypeScript module augmentation. The usageMetadata field
59
+ // is now natively available on OpenAI's types without requiring additional imports.
60
+ // Export tracking functions
61
+ var index_js_3 = require("./core/tracking/index.js");
62
+ Object.defineProperty(exports, "trackUsageAsync", { enumerable: true, get: function () { return index_js_3.trackUsageAsync; } });
63
+ Object.defineProperty(exports, "trackEmbeddingsUsageAsync", { enumerable: true, get: function () { return index_js_3.trackEmbeddingsUsageAsync; } });
64
+ // Export provider detection functions
65
+ var index_js_4 = require("./core/providers/index.js");
66
+ Object.defineProperty(exports, "detectProvider", { enumerable: true, get: function () { return index_js_4.detectProvider; } });
67
+ Object.defineProperty(exports, "hasAzureConfig", { enumerable: true, get: function () { return index_js_4.hasAzureConfig; } });
68
+ Object.defineProperty(exports, "validateAzureConfig", { enumerable: true, get: function () { return index_js_4.validateAzureConfig; } });
69
+ Object.defineProperty(exports, "getProviderMetadata", { enumerable: true, get: function () { return index_js_4.getProviderMetadata; } });
70
+ var index_js_5 = require("./core/wrapper/index.js");
71
+ Object.defineProperty(exports, "getProviderInfo", { enumerable: true, get: function () { return index_js_5.getProviderInfo; } });
72
+ // Export Azure model resolution functions
73
+ var azure_model_resolver_js_1 = require("./utils/azure-model-resolver.js");
74
+ Object.defineProperty(exports, "resolveAzureModelName", { enumerable: true, get: function () { return azure_model_resolver_js_1.resolveAzureModelName; } });
75
+ Object.defineProperty(exports, "clearModelNameCache", { enumerable: true, get: function () { return azure_model_resolver_js_1.clearModelNameCache; } });
76
+ Object.defineProperty(exports, "getModelNameCacheStats", { enumerable: true, get: function () { return azure_model_resolver_js_1.getModelNameCacheStats; } });
77
+ Object.defineProperty(exports, "batchResolveModelNames", { enumerable: true, get: function () { return azure_model_resolver_js_1.batchResolveModelNames; } });
78
+ Object.defineProperty(exports, "wouldTransformDeploymentName", { enumerable: true, get: function () { return azure_model_resolver_js_1.wouldTransformDeploymentName; } });
79
+ // Global logger
80
+ const logger = (0, index_js_1.getLogger)();
81
+ /**
82
+ * Initialize Revenium middleware with configuration
83
+ */
84
+ function initializeRevenium(config) {
85
+ // Check if already initialized to prevent duplicate initialization
86
+ if (isInitialized) {
87
+ return {
88
+ success: true,
89
+ message: 'Revenium middleware already initialized',
90
+ };
91
+ }
92
+ try {
93
+ // Apply default base URL if not provided
94
+ const configWithDefaults = {
95
+ ...config,
96
+ reveniumBaseUrl: config.reveniumBaseUrl || 'https://api.revenium.io/meter',
97
+ };
98
+ (0, index_js_1.validateConfig)(configWithDefaults);
99
+ (0, index_js_1.setConfig)(configWithDefaults);
100
+ // Mark as initialized
101
+ isInitialized = true;
102
+ // Patch OpenAI prototype methods
103
+ (0, index_js_2.patchOpenAI)();
104
+ return {
105
+ success: true,
106
+ message: 'Revenium middleware initialized successfully',
107
+ };
108
+ }
109
+ catch (error) {
110
+ isInitialized = false;
111
+ return {
112
+ success: false,
113
+ message: error instanceof Error ? error.message : 'Unknown initialization error',
114
+ };
115
+ }
116
+ }
117
+ /**
118
+ * Initialize Revenium middleware from environment variables
119
+ */
120
+ function initializeReveniumFromEnv() {
121
+ // Check if already initialized to prevent duplicate initialization
122
+ if (isInitialized) {
123
+ return {
124
+ success: true,
125
+ message: 'Revenium middleware already initialized',
126
+ };
127
+ }
128
+ const envSuccess = (0, index_js_1.initializeConfig)();
129
+ if (!envSuccess) {
130
+ isInitialized = false;
131
+ return {
132
+ success: false,
133
+ message: 'Failed to load configuration from environment variables. Check REVENIUM_METERING_API_KEY and REVENIUM_METERING_BASE_URL.',
134
+ };
135
+ }
136
+ // Mark as initialized
137
+ isInitialized = true;
138
+ // Patch OpenAI prototype methods
139
+ (0, index_js_2.patchOpenAI)();
140
+ return {
141
+ success: true,
142
+ message: 'Revenium middleware initialized from environment',
143
+ };
144
+ }
145
+ /**
146
+ * Manually patch an OpenAI instance (for advanced use cases)
147
+ */
148
+ var index_js_6 = require("./core/wrapper/index.js");
149
+ Object.defineProperty(exports, "patchOpenAIInstance", { enumerable: true, get: function () { return index_js_6.patchOpenAIInstance; } });
150
+ /**
151
+ * Auto-initialization with graceful fallback
152
+ * Attempts to initialize from environment variables on module load.
153
+ * If it fails, logs a debug message but doesn't throw - allows manual configuration later.
154
+ */
155
+ function attemptAutoInitialization() {
156
+ if (autoInitAttempted || isInitialized)
157
+ return;
158
+ autoInitAttempted = true;
159
+ try {
160
+ const result = initializeReveniumFromEnv();
161
+ if (result.success) {
162
+ // Auto-init succeeded - log debug message
163
+ logger.debug('Revenium middleware auto-initialized from environment variables');
164
+ }
165
+ else {
166
+ // Auto-init failed - log debug message but don't throw
167
+ logger.debug('Auto-initialization failed, manual initialization required:', result.message);
168
+ }
169
+ }
170
+ catch (error) {
171
+ // Unexpected error during auto-init - log but don't throw
172
+ logger.debug('Auto-initialization encountered error:', error instanceof Error ? error.message : String(error));
173
+ }
174
+ }
175
+ /**
176
+ * Check if middleware has been initialized
177
+ */
178
+ function isReveniumInitialized() {
179
+ return isInitialized;
180
+ }
181
+ /**
182
+ * Get detailed initialization status
183
+ */
184
+ function getInitializationStatus() {
185
+ const config = (0, index_js_1.getConfig)();
186
+ return {
187
+ initialized: isInitialized,
188
+ hasConfig: !!config,
189
+ hasApiKey: !!config?.reveniumApiKey,
190
+ autoInitAttempted,
191
+ };
192
+ }
193
+ // Perform auto-initialization when module is imported
194
+ attemptAutoInitialization();
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Function Parameter Types
4
+ *
5
+ * Comprehensive type definitions for function parameters throughout the middleware.
6
+ * These interfaces provide type safety by replacing 'any' types with proper,
7
+ * well-documented interfaces that match OpenAI API structures and internal requirements.
8
+ *
9
+ * @fileoverview Type-safe function parameter definitions
10
+ * @author Revenium
11
+ * @since 1.0.0
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ //# sourceMappingURL=function-parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-parameters.js","sourceRoot":"","sources":["../../../src/types/function-parameters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG"}