@revenium/openai 1.0.12 → 1.0.14

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 (236) hide show
  1. package/.env.example +10 -15
  2. package/CHANGELOG.md +59 -0
  3. package/CODE_OF_CONDUCT.md +57 -0
  4. package/CONTRIBUTING.md +38 -0
  5. package/README.md +109 -515
  6. package/SECURITY.md +34 -0
  7. package/dist/cjs/core/client/index.js +14 -0
  8. package/dist/cjs/core/client/index.js.map +1 -0
  9. package/dist/cjs/core/client/manager.js +109 -0
  10. package/dist/cjs/core/client/manager.js.map +1 -0
  11. package/dist/cjs/core/config/azure-config.js +5 -17
  12. package/dist/cjs/core/config/azure-config.js.map +1 -1
  13. package/dist/cjs/core/config/index.js +2 -2
  14. package/dist/cjs/core/config/index.js.map +1 -1
  15. package/dist/cjs/core/config/loader.js +34 -14
  16. package/dist/cjs/core/config/loader.js.map +1 -1
  17. package/dist/cjs/core/config/manager.js +12 -5
  18. package/dist/cjs/core/config/manager.js.map +1 -1
  19. package/dist/cjs/core/config/validator.js +3 -45
  20. package/dist/cjs/core/config/validator.js.map +1 -1
  21. package/dist/cjs/core/middleware/index.js +17 -0
  22. package/dist/cjs/core/middleware/index.js.map +1 -0
  23. package/dist/cjs/core/middleware/interfaces.js +361 -0
  24. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  25. package/dist/cjs/core/middleware/revenium-client.js +142 -0
  26. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  27. package/dist/cjs/core/providers/detector.js +45 -23
  28. package/dist/cjs/core/providers/detector.js.map +1 -1
  29. package/dist/cjs/core/providers/index.js +2 -1
  30. package/dist/cjs/core/providers/index.js.map +1 -1
  31. package/dist/cjs/core/tracking/api-client.js +14 -13
  32. package/dist/cjs/core/tracking/api-client.js.map +1 -1
  33. package/dist/cjs/core/tracking/payload-builder.js +30 -35
  34. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  35. package/dist/cjs/core/tracking/usage-tracker.js +22 -18
  36. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  37. package/dist/cjs/index.js +26 -174
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/cjs/types/index.js +0 -8
  40. package/dist/cjs/types/index.js.map +1 -1
  41. package/dist/cjs/types/openai-augmentation.js +0 -49
  42. package/dist/cjs/types/openai-augmentation.js.map +1 -1
  43. package/dist/cjs/utils/constants.js +17 -20
  44. package/dist/cjs/utils/constants.js.map +1 -1
  45. package/dist/cjs/utils/error-handler.js +18 -14
  46. package/dist/cjs/utils/error-handler.js.map +1 -1
  47. package/dist/cjs/utils/metadata-builder.js +27 -19
  48. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  49. package/dist/cjs/utils/provider-detection.js +25 -28
  50. package/dist/cjs/utils/provider-detection.js.map +1 -1
  51. package/dist/cjs/utils/stop-reason-mapper.js +4 -0
  52. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -1
  53. package/dist/cjs/utils/url-builder.js +3 -3
  54. package/dist/esm/core/client/index.js +6 -0
  55. package/dist/esm/core/client/index.js.map +1 -0
  56. package/dist/esm/core/client/manager.js +102 -0
  57. package/dist/esm/core/client/manager.js.map +1 -0
  58. package/dist/esm/core/config/azure-config.js +6 -18
  59. package/dist/esm/core/config/azure-config.js.map +1 -1
  60. package/dist/esm/core/config/index.js +5 -4
  61. package/dist/esm/core/config/index.js.map +1 -1
  62. package/dist/esm/core/config/loader.js +33 -13
  63. package/dist/esm/core/config/loader.js.map +1 -1
  64. package/dist/esm/core/config/manager.js +14 -7
  65. package/dist/esm/core/config/manager.js.map +1 -1
  66. package/dist/esm/core/config/validator.js +3 -44
  67. package/dist/esm/core/config/validator.js.map +1 -1
  68. package/dist/esm/core/middleware/index.js +8 -0
  69. package/dist/esm/core/middleware/index.js.map +1 -0
  70. package/dist/esm/core/middleware/interfaces.js +353 -0
  71. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  72. package/dist/esm/core/middleware/revenium-client.js +105 -0
  73. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  74. package/dist/esm/core/providers/detector.js +43 -22
  75. package/dist/esm/core/providers/detector.js.map +1 -1
  76. package/dist/esm/core/providers/index.js +2 -2
  77. package/dist/esm/core/providers/index.js.map +1 -1
  78. package/dist/esm/core/tracking/api-client.js +13 -12
  79. package/dist/esm/core/tracking/api-client.js.map +1 -1
  80. package/dist/esm/core/tracking/payload-builder.js +31 -36
  81. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  82. package/dist/esm/core/tracking/usage-tracker.js +24 -20
  83. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  84. package/dist/esm/index.js +9 -157
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/types/index.js +2 -10
  87. package/dist/esm/types/index.js.map +1 -1
  88. package/dist/esm/types/openai-augmentation.js +0 -49
  89. package/dist/esm/types/openai-augmentation.js.map +1 -1
  90. package/dist/esm/utils/constants.js +16 -19
  91. package/dist/esm/utils/constants.js.map +1 -1
  92. package/dist/esm/utils/error-handler.js +19 -15
  93. package/dist/esm/utils/error-handler.js.map +1 -1
  94. package/dist/esm/utils/metadata-builder.js +27 -19
  95. package/dist/esm/utils/metadata-builder.js.map +1 -1
  96. package/dist/esm/utils/provider-detection.js +26 -29
  97. package/dist/esm/utils/provider-detection.js.map +1 -1
  98. package/dist/esm/utils/stop-reason-mapper.js +4 -0
  99. package/dist/esm/utils/stop-reason-mapper.js.map +1 -1
  100. package/dist/esm/utils/url-builder.js +3 -3
  101. package/dist/types/core/client/index.d.ts +6 -0
  102. package/dist/types/core/client/index.d.ts.map +1 -0
  103. package/dist/types/core/client/manager.d.ts +32 -0
  104. package/dist/types/core/client/manager.d.ts.map +1 -0
  105. package/dist/types/core/config/azure-config.d.ts +2 -2
  106. package/dist/types/core/config/azure-config.d.ts.map +1 -1
  107. package/dist/types/core/config/index.d.ts +4 -4
  108. package/dist/types/core/config/index.d.ts.map +1 -1
  109. package/dist/types/core/config/loader.d.ts +3 -1
  110. package/dist/types/core/config/loader.d.ts.map +1 -1
  111. package/dist/types/core/config/manager.d.ts +1 -1
  112. package/dist/types/core/config/manager.d.ts.map +1 -1
  113. package/dist/types/core/config/validator.d.ts +1 -12
  114. package/dist/types/core/config/validator.d.ts.map +1 -1
  115. package/dist/types/core/middleware/index.d.ts +8 -0
  116. package/dist/types/core/middleware/index.d.ts.map +1 -0
  117. package/dist/types/core/middleware/interfaces.d.ts +74 -0
  118. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  119. package/dist/types/core/middleware/revenium-client.d.ts +58 -0
  120. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  121. package/dist/types/core/providers/detector.d.ts +9 -2
  122. package/dist/types/core/providers/detector.d.ts.map +1 -1
  123. package/dist/types/core/providers/index.d.ts +2 -2
  124. package/dist/types/core/providers/index.d.ts.map +1 -1
  125. package/dist/types/core/tracking/api-client.d.ts +1 -1
  126. package/dist/types/core/tracking/api-client.d.ts.map +1 -1
  127. package/dist/types/core/tracking/payload-builder.d.ts +3 -3
  128. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  129. package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
  130. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  131. package/dist/types/index.d.ts +11 -114
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/dist/types/types/function-parameters.d.ts +2 -23
  134. package/dist/types/types/function-parameters.d.ts.map +1 -1
  135. package/dist/types/types/index.d.ts +17 -115
  136. package/dist/types/types/index.d.ts.map +1 -1
  137. package/dist/types/types/openai-augmentation.d.ts +4 -139
  138. package/dist/types/types/openai-augmentation.d.ts.map +1 -1
  139. package/dist/types/utils/constants.d.ts +7 -1
  140. package/dist/types/utils/constants.d.ts.map +1 -1
  141. package/dist/types/utils/error-handler.d.ts +2 -2
  142. package/dist/types/utils/error-handler.d.ts.map +1 -1
  143. package/dist/types/utils/metadata-builder.d.ts +4 -3
  144. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  145. package/dist/types/utils/provider-detection.d.ts +3 -3
  146. package/dist/types/utils/provider-detection.d.ts.map +1 -1
  147. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -1
  148. package/dist/types/utils/url-builder.d.ts +3 -3
  149. package/examples/README.md +270 -224
  150. package/examples/azure/basic.ts +62 -0
  151. package/examples/azure/responses-basic.ts +45 -0
  152. package/examples/azure/responses-stream.ts +61 -0
  153. package/examples/azure/stream.ts +56 -0
  154. package/examples/getting_started.ts +31 -43
  155. package/examples/openai/basic.ts +45 -0
  156. package/examples/openai/metadata.ts +67 -0
  157. package/examples/openai/responses-basic.ts +44 -0
  158. package/examples/openai/responses-embed.ts +34 -0
  159. package/examples/openai/responses-streaming.ts +63 -0
  160. package/examples/openai/streaming.ts +59 -0
  161. package/package.json +20 -13
  162. package/dist/cjs/core/wrapper/index.js +0 -15
  163. package/dist/cjs/core/wrapper/index.js.map +0 -1
  164. package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
  165. package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
  166. package/dist/cjs/core/wrapper/request-handler.js +0 -317
  167. package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
  168. package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
  169. package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
  170. package/dist/cjs/utils/azure-model-resolver.js +0 -211
  171. package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
  172. package/dist/cjs/utils/request-handler-factory.js +0 -185
  173. package/dist/cjs/utils/request-handler-factory.js.map +0 -1
  174. package/dist/esm/core/wrapper/index.js +0 -9
  175. package/dist/esm/core/wrapper/index.js.map +0 -1
  176. package/dist/esm/core/wrapper/instance-patcher.js +0 -199
  177. package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
  178. package/dist/esm/core/wrapper/request-handler.js +0 -310
  179. package/dist/esm/core/wrapper/request-handler.js.map +0 -1
  180. package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
  181. package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
  182. package/dist/esm/utils/azure-model-resolver.js +0 -204
  183. package/dist/esm/utils/azure-model-resolver.js.map +0 -1
  184. package/dist/esm/utils/request-handler-factory.js +0 -146
  185. package/dist/esm/utils/request-handler-factory.js.map +0 -1
  186. package/dist/types/core/wrapper/index.d.ts +0 -8
  187. package/dist/types/core/wrapper/index.d.ts.map +0 -1
  188. package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
  189. package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
  190. package/dist/types/core/wrapper/request-handler.d.ts +0 -29
  191. package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
  192. package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
  193. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
  194. package/dist/types/utils/azure-model-resolver.d.ts +0 -41
  195. package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
  196. package/dist/types/utils/request-handler-factory.d.ts +0 -81
  197. package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
  198. package/examples/azure-basic.ts +0 -206
  199. package/examples/azure-responses-basic.ts +0 -233
  200. package/examples/azure-responses-streaming.ts +0 -255
  201. package/examples/azure-streaming.ts +0 -209
  202. package/examples/openai-basic.ts +0 -147
  203. package/examples/openai-function-calling.ts +0 -259
  204. package/examples/openai-responses-basic.ts +0 -212
  205. package/examples/openai-responses-streaming.ts +0 -232
  206. package/examples/openai-streaming.ts +0 -172
  207. package/examples/openai-vision.ts +0 -289
  208. package/src/core/config/azure-config.ts +0 -72
  209. package/src/core/config/index.ts +0 -23
  210. package/src/core/config/loader.ts +0 -66
  211. package/src/core/config/manager.ts +0 -94
  212. package/src/core/config/validator.ts +0 -89
  213. package/src/core/providers/detector.ts +0 -159
  214. package/src/core/providers/index.ts +0 -16
  215. package/src/core/tracking/api-client.ts +0 -78
  216. package/src/core/tracking/index.ts +0 -21
  217. package/src/core/tracking/payload-builder.ts +0 -132
  218. package/src/core/tracking/usage-tracker.ts +0 -189
  219. package/src/core/wrapper/index.ts +0 -9
  220. package/src/core/wrapper/instance-patcher.ts +0 -288
  221. package/src/core/wrapper/request-handler.ts +0 -423
  222. package/src/core/wrapper/stream-wrapper.ts +0 -100
  223. package/src/index.ts +0 -336
  224. package/src/types/function-parameters.ts +0 -251
  225. package/src/types/index.ts +0 -313
  226. package/src/types/openai-augmentation.ts +0 -233
  227. package/src/types/responses-api.ts +0 -308
  228. package/src/utils/azure-model-resolver.ts +0 -220
  229. package/src/utils/constants.ts +0 -21
  230. package/src/utils/error-handler.ts +0 -251
  231. package/src/utils/metadata-builder.ts +0 -219
  232. package/src/utils/provider-detection.ts +0 -257
  233. package/src/utils/request-handler-factory.ts +0 -285
  234. package/src/utils/stop-reason-mapper.ts +0 -74
  235. package/src/utils/type-guards.ts +0 -202
  236. package/src/utils/url-builder.ts +0 -68
@@ -1,310 +0,0 @@
1
- /**
2
- * Request Handler Module
3
- *
4
- * Handles different types of OpenAI requests (streaming, non-streaming, embeddings).
5
- * Extracted from wrapper.ts for better organization.
6
- */
7
- import { randomUUID } from 'crypto';
8
- import { isOpenAIChatResponse, isOpenAIEmbeddingResponse, hasValidUsage, } from '../../utils/type-guards.js';
9
- import { safeAsyncOperation, NetworkError, classifyError } from '../../utils/error-handler.js';
10
- import { createLoggingContext } from '../../utils/metadata-builder.js';
11
- import { trackUsageAsync, trackEmbeddingsUsageAsync } from '../tracking/index.js';
12
- import { getLogger } from '../config/index.js';
13
- import { instanceProviders } from './instance-patcher.js';
14
- import { createTrackingStreamWrapper } from './stream-wrapper.js';
15
- // Global logger
16
- const logger = getLogger();
17
- /**
18
- * Handle non-streaming OpenAI requests
19
- */
20
- export async function handleNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
21
- const loggingContext = createLoggingContext(usageMetadata);
22
- const result = await safeAsyncOperation(async () => {
23
- // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
24
- const response = await originalCreate(params, options);
25
- // Validate response structure
26
- if (!hasValidUsage(response)) {
27
- logger.warn('Invalid response structure from OpenAI API', {
28
- ...loggingContext,
29
- response,
30
- });
31
- return response;
32
- }
33
- // Calculate duration
34
- const duration = Date.now() - requestStartTime;
35
- // Get provider info for this instance
36
- const providerInfo = instanceProviders.get(instance);
37
- // Track usage for chat completions
38
- if (isOpenAIChatResponse(response)) {
39
- trackUsageAsync({
40
- requestId: response.id,
41
- model: response.model,
42
- promptTokens: response.usage.prompt_tokens,
43
- completionTokens: response.usage.completion_tokens || 0,
44
- totalTokens: response.usage.total_tokens,
45
- reasoningTokens: response.usage.reasoning_tokens,
46
- cachedTokens: response.usage.cached_tokens,
47
- duration,
48
- finishReason: response.choices?.[0]?.finish_reason || null,
49
- usageMetadata,
50
- isStreamed: false,
51
- providerInfo,
52
- });
53
- }
54
- logger.debug('Chat completion request completed', {
55
- ...loggingContext,
56
- model: response.model,
57
- duration,
58
- totalTokens: response.usage.total_tokens,
59
- });
60
- return response;
61
- }, 'Non-streaming OpenAI request', {
62
- logError: true,
63
- rethrow: true,
64
- messagePrefix: 'Chat completion request failed: ',
65
- transformError: error => {
66
- const classified = classifyError(error);
67
- if (classified.type === 'network') {
68
- return new NetworkError(classified.message, {
69
- ...loggingContext,
70
- duration: Date.now() - requestStartTime,
71
- });
72
- }
73
- return error instanceof Error ? error : new Error(String(error));
74
- },
75
- }, logger);
76
- if (!result)
77
- throw new Error('OpenAI request failed without specific error');
78
- return result;
79
- }
80
- /**
81
- * Handle streaming OpenAI requests
82
- */
83
- export async function handleStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
84
- try {
85
- // Ensure stream_options includes usage data for token tracking
86
- const enhancedParams = {
87
- ...params,
88
- stream_options: {
89
- include_usage: true,
90
- ...(params.stream_options || {}),
91
- },
92
- };
93
- logger.debug('Enhanced streaming params with usage tracking', {
94
- originalStreamOptions: params.stream_options,
95
- enhancedStreamOptions: enhancedParams.stream_options,
96
- });
97
- // Call the original OpenAI method to get the stream (cast params back to original type since usageMetadata is removed)
98
- const originalStream = await originalCreate(enhancedParams, options);
99
- logger.debug('Chat completion streaming request initiated', {
100
- model: params.model,
101
- });
102
- // Return a wrapped stream that tracks usage when complete
103
- return createTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance);
104
- }
105
- catch (error) {
106
- const duration = Date.now() - requestStartTime;
107
- logger.error('Chat completion streaming request failed', {
108
- error: error instanceof Error ? error.message : String(error),
109
- duration,
110
- });
111
- // Re-throw the error to maintain original behavior
112
- throw error;
113
- }
114
- }
115
- /**
116
- * Handle embeddings requests
117
- */
118
- export async function handleEmbeddingsRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
119
- try {
120
- // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
121
- const response = await originalCreate(params, options);
122
- // Validate response structure
123
- if (!isOpenAIEmbeddingResponse(response)) {
124
- logger.warn('Invalid embeddings response structure from OpenAI API', { response });
125
- return response;
126
- }
127
- // Calculate duration
128
- const duration = Date.now() - requestStartTime;
129
- // Get provider info for this instance
130
- const providerInfo = instanceProviders.get(instance);
131
- // Track embeddings usage
132
- trackEmbeddingsUsageAsync({
133
- transactionId: `embed-${randomUUID()}`,
134
- model: response.model,
135
- promptTokens: response.usage.prompt_tokens,
136
- totalTokens: response.usage.total_tokens,
137
- duration,
138
- usageMetadata,
139
- requestStartTime,
140
- providerInfo,
141
- });
142
- logger.debug('Embeddings request completed', {
143
- model: response.model,
144
- duration,
145
- totalTokens: response.usage.total_tokens,
146
- });
147
- return response;
148
- }
149
- catch (error) {
150
- const duration = Date.now() - requestStartTime;
151
- logger.error('Embeddings request failed', {
152
- error: error instanceof Error ? error.message : String(error),
153
- duration,
154
- });
155
- // Re-throw the error to maintain original behavior
156
- throw error;
157
- }
158
- }
159
- /**
160
- * Handle non-streaming OpenAI Responses API requests
161
- */
162
- export async function handleResponsesNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
163
- const loggingContext = createLoggingContext(usageMetadata);
164
- const result = await safeAsyncOperation(async () => {
165
- // Call the original OpenAI method (cast params back to original type since usageMetadata is removed)
166
- const response = await originalCreate(params, options);
167
- // Validate response structure
168
- if (!response || typeof response !== 'object') {
169
- throw new Error('Invalid response from OpenAI Responses API');
170
- }
171
- const duration = Date.now() - requestStartTime;
172
- // Extract usage information (Responses API may have different structure)
173
- const usage = response.usage;
174
- if (usage) {
175
- // Track usage asynchronously using similar pattern to chat completions
176
- trackUsageAsync({
177
- requestId: response.id || randomUUID(),
178
- model: response.model || params.model,
179
- promptTokens: usage.input_tokens || 0,
180
- completionTokens: usage.output_tokens || 0,
181
- totalTokens: usage.total_tokens || 0,
182
- reasoningTokens: usage.reasoning_tokens,
183
- cachedTokens: usage.cached_tokens,
184
- duration,
185
- finishReason: response.finish_reason || 'completed',
186
- usageMetadata,
187
- isStreamed: false,
188
- providerInfo: instanceProviders.get(instance),
189
- });
190
- }
191
- logger.debug('Responses API request completed', {
192
- ...loggingContext,
193
- model: response.model,
194
- duration,
195
- totalTokens: usage?.total_tokens,
196
- });
197
- return response;
198
- }, 'Non-streaming OpenAI Responses API request', {
199
- logError: true,
200
- rethrow: true,
201
- messagePrefix: 'Responses API request failed: ',
202
- transformError: error => {
203
- const classified = classifyError(error);
204
- if (classified.type === 'network') {
205
- return new NetworkError(classified.message, {
206
- ...loggingContext,
207
- duration: Date.now() - requestStartTime,
208
- });
209
- }
210
- return error instanceof Error ? error : new Error(String(error));
211
- },
212
- }, logger);
213
- if (!result)
214
- throw new Error('OpenAI Responses API request failed without specific error');
215
- return result;
216
- }
217
- /**
218
- * Handle streaming OpenAI Responses API requests
219
- */
220
- export async function handleResponsesStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
221
- try {
222
- // Call the original OpenAI method to get the stream (cast params back to original type since usageMetadata is removed)
223
- const originalStream = await originalCreate(params, options);
224
- logger.debug('Responses API streaming request initiated', {
225
- model: params.model,
226
- });
227
- // Return a wrapped stream that tracks usage when complete
228
- // We'll use a similar pattern to chat completions but adapted for Responses API
229
- return createResponsesTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance);
230
- }
231
- catch (error) {
232
- const duration = Date.now() - requestStartTime;
233
- logger.error('Responses API streaming request failed', {
234
- error: error instanceof Error ? error.message : String(error),
235
- duration,
236
- });
237
- // Re-throw the error to maintain original behavior
238
- throw error;
239
- }
240
- }
241
- /**
242
- * Create a tracking stream wrapper for Responses API
243
- * Similar to createTrackingStreamWrapper but adapted for Responses API structure
244
- */
245
- async function* createResponsesTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance) {
246
- let firstChunkTime;
247
- let finalUsage = null;
248
- let model = '';
249
- let requestId = '';
250
- let finishReason = null;
251
- try {
252
- for await (const chunk of originalStream) {
253
- // Record time to first token
254
- if (!firstChunkTime) {
255
- firstChunkTime = Date.now();
256
- }
257
- // Extract information from chunk (Responses API structure may differ)
258
- if (chunk && typeof chunk === 'object') {
259
- const chunkObj = chunk;
260
- // Extract model and ID from chunk
261
- if (chunkObj.model)
262
- model = chunkObj.model;
263
- if (chunkObj.id)
264
- requestId = chunkObj.id;
265
- // Check for final usage information
266
- if (chunkObj.usage) {
267
- finalUsage = chunkObj.usage;
268
- }
269
- // Check for finish reason
270
- if (chunkObj.finish_reason) {
271
- finishReason = chunkObj.finish_reason;
272
- }
273
- }
274
- yield chunk;
275
- }
276
- // Track usage after stream completes
277
- if (finalUsage) {
278
- const duration = Date.now() - requestStartTime;
279
- const timeToFirstToken = firstChunkTime ? firstChunkTime - requestStartTime : undefined;
280
- trackUsageAsync({
281
- requestId: requestId || randomUUID(),
282
- model: model,
283
- promptTokens: finalUsage.input_tokens || 0,
284
- completionTokens: finalUsage.output_tokens || 0,
285
- totalTokens: finalUsage.total_tokens || 0,
286
- reasoningTokens: finalUsage.reasoning_tokens,
287
- cachedTokens: finalUsage.cached_tokens,
288
- duration,
289
- finishReason: finishReason || 'completed',
290
- usageMetadata,
291
- isStreamed: true,
292
- timeToFirstToken,
293
- providerInfo: instanceProviders.get(instance),
294
- });
295
- logger.debug('Responses API streaming completed', {
296
- model,
297
- duration,
298
- timeToFirstToken,
299
- totalTokens: finalUsage.total_tokens,
300
- });
301
- }
302
- }
303
- catch (error) {
304
- logger.error('Error in Responses API stream wrapper', {
305
- error: error instanceof Error ? error.message : String(error),
306
- });
307
- throw error;
308
- }
309
- }
310
- //# sourceMappingURL=request-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-handler.js","sourceRoot":"","sources":["../../../../src/core/wrapper/request-handler.ts"],"names":[],"mappings":"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"}
@@ -1,79 +0,0 @@
1
- /**
2
- * Stream Wrapper Module
3
- *
4
- * Handles wrapping of streaming responses for usage tracking.
5
- * Extracted from wrapper.ts for better organization.
6
- */
7
- import { isStreamChunk } from '../../utils/type-guards.js';
8
- import { trackUsageAsync } from '../tracking/index.js';
9
- import { getLogger } from '../config/index.js';
10
- import { instanceProviders } from './instance-patcher.js';
11
- // Global logger
12
- const logger = getLogger();
13
- /**
14
- * Create a simple stream wrapper that tracks usage when complete
15
- */
16
- export function createTrackingStreamWrapper(originalStream, usageMetadata, requestStartTime, instance) {
17
- // For streaming, we need to collect the final response data
18
- let accumulatedResponse = null;
19
- // Create async iterator
20
- const wrappedIterator = {
21
- async *[Symbol.asyncIterator]() {
22
- try {
23
- for await (const chunk of originalStream) {
24
- // Validate and accumulate response data for tracking
25
- if (isStreamChunk(chunk)) {
26
- if (!accumulatedResponse) {
27
- accumulatedResponse = {
28
- id: chunk.id,
29
- model: chunk.model,
30
- usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
31
- };
32
- }
33
- // Update usage if available in chunk
34
- if (chunk.usage) {
35
- accumulatedResponse.usage = chunk.usage;
36
- }
37
- }
38
- // Forward the chunk to the client
39
- yield chunk;
40
- }
41
- // Stream completed - track usage
42
- if (accumulatedResponse && accumulatedResponse.usage) {
43
- const duration = Date.now() - requestStartTime;
44
- // Get provider info for this instance
45
- const providerInfo = instanceProviders.get(instance);
46
- // Safely access extended usage fields
47
- const usage = accumulatedResponse.usage;
48
- trackUsageAsync({
49
- requestId: accumulatedResponse.id,
50
- model: accumulatedResponse.model,
51
- promptTokens: usage.prompt_tokens,
52
- completionTokens: usage.completion_tokens || 0,
53
- totalTokens: usage.total_tokens,
54
- reasoningTokens: usage.reasoning_tokens,
55
- cachedTokens: usage.cached_tokens,
56
- duration,
57
- finishReason: null, // Will be determined from final chunk
58
- usageMetadata,
59
- isStreamed: true,
60
- providerInfo,
61
- });
62
- logger.debug('Chat completion streaming completed', {
63
- model: accumulatedResponse.model,
64
- duration,
65
- totalTokens: accumulatedResponse.usage.total_tokens,
66
- });
67
- }
68
- }
69
- catch (error) {
70
- logger.error('Chat completion streaming error', {
71
- error: error instanceof Error ? error.message : String(error),
72
- });
73
- throw error;
74
- }
75
- },
76
- };
77
- return wrappedIterator;
78
- }
79
- //# sourceMappingURL=stream-wrapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-wrapper.js","sourceRoot":"","sources":["../../../../src/core/wrapper/stream-wrapper.ts"],"names":[],"mappings":"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"}
@@ -1,204 +0,0 @@
1
- import { getLogger } from '../core/config/index.js';
2
- import { knownModels } from './constants.js';
3
- /**
4
- * Azure Model Name Resolution Module
5
- *
6
- * This module maps Azure deployment names to LiteLLM-compatible model names for accurate pricing.
7
- * Based on learnings from the Python implementation, it uses heuristic pattern matching
8
- * with fallback strategies to ensure reliable model name resolution.
9
- *
10
- * Key patterns observed in real Azure deployments:
11
- * - "gpt-4o-2024-11-20" → "gpt-4o"
12
- * - "text-embedding-3-large" → "text-embedding-3-large" (exact match)
13
- * - "o4-mini" → "gpt-4o-mini"
14
- * - "gpt4o-prod" → "gpt-4o"
15
- * - "gpt-35-turbo-dev" → "gpt-3.5-turbo"
16
- */
17
- /**
18
- * In-memory cache for resolved model names
19
- * Using Map for thread-safe operations in Node.js
20
- */
21
- const modelNameCache = new Map();
22
- /**
23
- * Cache for failed resolution attempts to avoid repeated warnings
24
- */
25
- const failedResolutionCache = new Set();
26
- // Global logger
27
- const logger = getLogger();
28
- /**
29
- * Resolve Azure deployment name to LiteLLM-compatible model name
30
- *
31
- * @param deploymentName - Azure deployment name
32
- * @param useCache - Whether to use cached results (default: true)
33
- * @returns LiteLLM-compatible model name
34
- */
35
- export function resolveAzureModelName(deploymentName, useCache = true) {
36
- if (!deploymentName) {
37
- logger.warn('Empty deployment name provided to model resolver');
38
- return deploymentName;
39
- }
40
- // Check cache first
41
- if (useCache && modelNameCache.has(deploymentName)) {
42
- const cachedResult = modelNameCache.get(deploymentName);
43
- logger.debug('Model name resolved from cache', {
44
- deployment: deploymentName,
45
- resolved: cachedResult,
46
- });
47
- return cachedResult;
48
- }
49
- try {
50
- const resolved = resolveModelNameHeuristic(deploymentName);
51
- // Cache the result
52
- if (useCache) {
53
- modelNameCache.set(deploymentName, resolved);
54
- }
55
- // Log successful resolution
56
- if (resolved !== deploymentName) {
57
- logger.debug('Model name resolved via heuristics', {
58
- deployment: deploymentName,
59
- resolved,
60
- });
61
- }
62
- return resolved;
63
- }
64
- catch (error) {
65
- logger.error('Error during model name resolution', {
66
- deployment: deploymentName,
67
- error: error instanceof Error ? error.message : String(error),
68
- });
69
- // Fallback to deployment name
70
- return deploymentName;
71
- }
72
- }
73
- /**
74
- * Heuristic pattern matching for Azure deployment names
75
- * Based on real-world patterns observed in the Python implementation
76
- *
77
- * @param deploymentName - Azure deployment name
78
- * @returns LiteLLM-compatible model name
79
- */
80
- function resolveModelNameHeuristic(deploymentName) {
81
- const nameLower = deploymentName.toLowerCase();
82
- // GPT-4o family - handle both "gpt-4o" and "o4" patterns
83
- if (/gpt-?4o/.test(nameLower) || /o4/.test(nameLower)) {
84
- if (/mini/.test(nameLower))
85
- return 'gpt-4o-mini';
86
- return 'gpt-4o';
87
- }
88
- // GPT-4 family (non-omni)
89
- if (/gpt-?4(?!o)/.test(nameLower)) {
90
- if (/turbo/.test(nameLower))
91
- return 'gpt-4-turbo';
92
- if (/vision/.test(nameLower) || /v/.test(nameLower))
93
- return 'gpt-4-vision-preview';
94
- return 'gpt-4';
95
- }
96
- // GPT-3.5 family
97
- if (/gpt-?3\.?5/.test(nameLower) || /35-turbo/.test(nameLower) || /gpt-35/.test(nameLower)) {
98
- if (/instruct/.test(nameLower))
99
- return 'gpt-3.5-turbo-instruct';
100
- return 'gpt-3.5-turbo';
101
- }
102
- // Embedding models - exact matches work well
103
- if (/embed/.test(nameLower)) {
104
- if (/text-embedding-3-large/.test(nameLower))
105
- return 'text-embedding-3-large';
106
- if (/text-embedding-3-small/.test(nameLower))
107
- return 'text-embedding-3-small';
108
- if (/text-embedding-ada-002/.test(nameLower) || /ada-002/.test(nameLower))
109
- return 'text-embedding-ada-002';
110
- if (/3-large/.test(nameLower))
111
- return 'text-embedding-3-large';
112
- if (/3-small/.test(nameLower))
113
- return 'text-embedding-3-small';
114
- }
115
- // Ada-002 pattern (can appear without "embed" in deployment name)
116
- if (/ada-002/.test(nameLower))
117
- return 'text-embedding-ada-002';
118
- // DALL-E models
119
- if (/dall-?e/.test(nameLower)) {
120
- if (/3/.test(nameLower))
121
- return 'dall-e-3';
122
- if (/2/.test(nameLower))
123
- return 'dall-e-2';
124
- }
125
- // Whisper models
126
- if (/whisper/.test(nameLower))
127
- return 'whisper-1';
128
- // TTS models
129
- if (/tts/.test(nameLower)) {
130
- if (/hd/.test(nameLower))
131
- return 'tts-1-hd';
132
- return 'tts-1';
133
- }
134
- if (knownModels.includes(nameLower))
135
- return nameLower;
136
- // No heuristic match found - log warning and use deployment name
137
- if (!failedResolutionCache.has(deploymentName)) {
138
- logger.warn(`⚠️ No heuristic match for Azure deployment: ${deploymentName}. Using deployment name for pricing. Consider adding pattern to azure-model-resolver.ts`);
139
- failedResolutionCache.add(deploymentName);
140
- }
141
- return deploymentName;
142
- }
143
- /**
144
- * Clear the model name cache
145
- * Useful for testing or when deployment configurations change
146
- */
147
- export function clearModelNameCache() {
148
- modelNameCache.clear();
149
- failedResolutionCache.clear();
150
- getLogger().debug('Model name cache cleared');
151
- }
152
- /**
153
- * Get cache statistics for monitoring
154
- */
155
- export function getModelNameCacheStats() {
156
- return {
157
- cacheSize: modelNameCache.size,
158
- failedResolutionCount: failedResolutionCache.size,
159
- cacheEntries: Array.from(modelNameCache.entries()).map(([deployment, resolved]) => ({
160
- deployment,
161
- resolved,
162
- })),
163
- };
164
- }
165
- /**
166
- * Batch resolve multiple deployment names
167
- * Useful for pre-warming cache or bulk operations
168
- *
169
- * @param deploymentNames - Array of deployment names to resolve
170
- * @returns Map of deployment name to resolved model name
171
- */
172
- export function batchResolveModelNames(deploymentNames) {
173
- const results = new Map();
174
- logger.debug('Batch resolving model names', {
175
- count: deploymentNames.length,
176
- deployments: deploymentNames,
177
- });
178
- for (const deployment of deploymentNames) {
179
- try {
180
- const resolved = resolveAzureModelName(deployment);
181
- results.set(deployment, resolved);
182
- }
183
- catch (error) {
184
- logger.error('Error in batch resolution', {
185
- deployment,
186
- error: error instanceof Error ? error.message : String(error),
187
- });
188
- results.set(deployment, deployment); // Fallback to original name
189
- }
190
- }
191
- return results;
192
- }
193
- /**
194
- * Check if a deployment name would be resolved to a different model name
195
- * Useful for validation and testing
196
- *
197
- * @param deploymentName - Azure deployment name
198
- * @returns true if the deployment name would be transformed
199
- */
200
- export function wouldTransformDeploymentName(deploymentName) {
201
- const resolved = resolveAzureModelName(deploymentName, false); // Don't use cache for this check
202
- return resolved !== deploymentName;
203
- }
204
- //# sourceMappingURL=azure-model-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"azure-model-resolver.js","sourceRoot":"","sources":["../../../src/utils/azure-model-resolver.ts"],"names":[],"mappings":"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"}