@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,107 @@
1
+ "use strict";
2
+ /**
3
+ * Payload Builder Module
4
+ *
5
+ * Handles construction of Revenium API payloads.
6
+ * Extracted from tracking.ts for single responsibility.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildPayload = buildPayload;
10
+ const crypto_1 = require("crypto");
11
+ const index_js_1 = require("../config/index.js");
12
+ const stop_reason_mapper_js_1 = require("../../utils/stop-reason-mapper.js");
13
+ const metadata_builder_js_1 = require("../../utils/metadata-builder.js");
14
+ const azure_model_resolver_js_1 = require("../../utils/azure-model-resolver.js");
15
+ const index_js_2 = require("../providers/index.js");
16
+ // Global logger
17
+ const logger = (0, index_js_1.getLogger)();
18
+ /**
19
+ * Build payload for Revenium API
20
+ *
21
+ * This shared payload builder eliminates payload duplication between
22
+ * chat completions and embeddings. Handles both CHAT and EMBED operation types.
23
+ *
24
+ * @param operationType - Type of operation (CHAT or EMBED)
25
+ * @param response - API response from OpenAI/Azure
26
+ * @param request - Original request parameters
27
+ * @param startTime - Request start timestamp
28
+ * @param duration - Request duration in milliseconds
29
+ * @param providerInfo - Provider information for Azure support
30
+ * @returns Constructed payload for Revenium API
31
+ */
32
+ function buildPayload(operationType, response, request, startTime, duration, providerInfo) {
33
+ const now = new Date().toISOString();
34
+ const requestTime = new Date(startTime).toISOString();
35
+ const usage = response.usage;
36
+ // Resolve model name for Azure deployments
37
+ const originalModel = response.model;
38
+ const resolvedModel = providerInfo?.isAzure
39
+ ? (0, azure_model_resolver_js_1.resolveAzureModelName)(originalModel)
40
+ : originalModel;
41
+ // Get provider metadata
42
+ const providerMetadata = providerInfo
43
+ ? (0, index_js_2.getProviderMetadata)(providerInfo)
44
+ : { provider: 'OPENAI', modelSource: 'OPENAI' };
45
+ if (providerInfo?.isAzure && resolvedModel !== originalModel) {
46
+ logger.debug('Azure model name resolved for pricing', {
47
+ deployment: originalModel,
48
+ resolved: resolvedModel,
49
+ provider: providerMetadata.provider,
50
+ });
51
+ }
52
+ // Build metadata fields using utility (eliminates repetitive spreading)
53
+ const metadataFields = (0, metadata_builder_js_1.buildMetadataFields)(request.usageMetadata);
54
+ // Common fields for all operations
55
+ const commonPayload = {
56
+ costType: 'AI',
57
+ model: resolvedModel, // Use resolved model name for accurate pricing
58
+ responseTime: now,
59
+ requestDuration: duration,
60
+ provider: providerMetadata.provider,
61
+ modelSource: providerMetadata.modelSource,
62
+ requestTime,
63
+ completionStartTime: now,
64
+ // Common token counts
65
+ inputTokenCount: usage.prompt_tokens,
66
+ totalTokenCount: usage.total_tokens,
67
+ // Metadata fields (processed by utility)
68
+ ...metadataFields,
69
+ // Fixed middleware source identifier
70
+ middlewareSource: 'nodejs',
71
+ // Backend calculates costs
72
+ inputTokenCost: undefined,
73
+ outputTokenCost: undefined,
74
+ totalCost: undefined,
75
+ };
76
+ // Operation-specific fields
77
+ if (operationType !== 'CHAT') {
78
+ // For embeddings, we don't need the response cast since we use commonPayload
79
+ return {
80
+ ...commonPayload,
81
+ operationType: 'EMBED',
82
+ transactionId: `embed-${(0, crypto_1.randomUUID)()}`,
83
+ outputTokenCount: 0,
84
+ reasoningTokenCount: 0,
85
+ cacheCreationTokenCount: 0,
86
+ cacheReadTokenCount: 0,
87
+ stopReason: 'END',
88
+ isStreamed: false,
89
+ timeToFirstToken: 0,
90
+ };
91
+ }
92
+ const chatResponse = response;
93
+ const chatUsage = chatResponse.usage;
94
+ return {
95
+ ...commonPayload,
96
+ operationType: 'CHAT',
97
+ transactionId: chatResponse.id || `chat-${(0, crypto_1.randomUUID)()}`,
98
+ outputTokenCount: chatUsage.completion_tokens || 0,
99
+ reasoningTokenCount: chatUsage.reasoning_tokens || 0,
100
+ cacheCreationTokenCount: 0,
101
+ cacheReadTokenCount: chatUsage.cached_tokens || 0,
102
+ stopReason: (0, stop_reason_mapper_js_1.mapStopReason)(chatResponse.choices?.[0]?.finish_reason, logger),
103
+ isStreamed: Boolean(request.stream),
104
+ timeToFirstToken: request.stream ? 0 : duration,
105
+ };
106
+ }
107
+ //# sourceMappingURL=payload-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-builder.js","sourceRoot":"","sources":["../../../../src/core/tracking/payload-builder.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiCH,oCA6FC;AA5HD,mCAAoC;AAQpC,iDAA+C;AAC/C,6EAAkE;AAClE,yEAAsE;AACtE,iFAA4E;AAC5E,oDAA4D;AAE5D,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;;;;;;;;;;;;GAaG;AACH,SAAgB,YAAY,CAC1B,aAA+B,EAC/B,QAAsD,EACtD,OAAmD,EACnD,SAAiB,EACjB,QAAgB,EAChB,YAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE7B,2CAA2C;IAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;IACrC,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO;QACzC,CAAC,CAAC,IAAA,+CAAqB,EAAC,aAAa,CAAC;QACtC,CAAC,CAAC,aAAa,CAAC;IAElB,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,YAAY;QACnC,CAAC,CAAC,IAAA,8BAAmB,EAAC,YAAY,CAAC;QACnC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAElD,IAAI,YAAY,EAAE,OAAO,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;YACpD,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;SACpC,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,MAAM,cAAc,GAAG,IAAA,yCAAmB,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAElE,mCAAmC;IACnC,MAAM,aAAa,GAAG;QACpB,QAAQ,EAAE,IAAa;QACvB,KAAK,EAAE,aAAa,EAAE,+CAA+C;QACrE,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,QAAQ;QACzB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;QACnC,WAAW,EAAE,gBAAgB,CAAC,WAAW;QACzC,WAAW;QACX,mBAAmB,EAAE,GAAG;QAExB,sBAAsB;QACtB,eAAe,EAAE,KAAK,CAAC,aAAa;QACpC,eAAe,EAAE,KAAK,CAAC,YAAY;QAEnC,yCAAyC;QACzC,GAAG,cAAc;QAEjB,qCAAqC;QACrC,gBAAgB,EAAE,QAAQ;QAE1B,2BAA2B;QAC3B,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,SAAS;QAC1B,SAAS,EAAE,SAAS;KACrB,CAAC;IAEF,4BAA4B;IAE5B,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,6EAA6E;QAC7E,OAAO;YACL,GAAG,aAAa;YAChB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,SAAS,IAAA,mBAAU,GAAE,EAAE;YACtC,gBAAgB,EAAE,CAAC;YACnB,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,mBAAmB,EAAE,CAAC;YACtB,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,CAAC;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,QAA8B,CAAC;IACpD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;IAErC,OAAO;QACL,GAAG,aAAa;QAChB,aAAa,EAAE,MAAM;QACrB,aAAa,EAAE,YAAY,CAAC,EAAE,IAAI,QAAQ,IAAA,mBAAU,GAAE,EAAE;QACxD,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,IAAI,CAAC;QAClD,mBAAmB,EAAE,SAAS,CAAC,gBAAgB,IAAI,CAAC;QACpD,uBAAuB,EAAE,CAAC;QAC1B,mBAAmB,EAAE,SAAS,CAAC,aAAa,IAAI,CAAC;QACjD,UAAU,EAAE,IAAA,qCAAa,EAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC;QAC3E,UAAU,EAAE,OAAO,CAAE,OAA6B,CAAC,MAAM,CAAC;QAC1D,gBAAgB,EAAG,OAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;KACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Usage Tracker Module
4
+ *
5
+ * High-level tracking functions that combine payload building and API communication.
6
+ * Extracted from tracking.ts for better organization.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.sendReveniumMetrics = sendReveniumMetrics;
10
+ exports.sendReveniumEmbeddingsMetrics = sendReveniumEmbeddingsMetrics;
11
+ exports.trackUsageAsync = trackUsageAsync;
12
+ exports.trackEmbeddingsUsageAsync = trackEmbeddingsUsageAsync;
13
+ const index_js_1 = require("../config/index.js");
14
+ const api_client_js_1 = require("./api-client.js");
15
+ const payload_builder_js_1 = require("./payload-builder.js");
16
+ const error_handler_js_1 = require("../../utils/error-handler.js");
17
+ // Global logger
18
+ const logger = (0, index_js_1.getLogger)();
19
+ /**
20
+ * Chat completions tracking - now a thin wrapper with Azure support
21
+ */
22
+ async function sendReveniumMetrics(response, request, startTime, duration, providerInfo) {
23
+ await (0, error_handler_js_1.safeAsyncOperation)(async () => {
24
+ const payload = (0, payload_builder_js_1.buildPayload)('CHAT', response, request, startTime, duration, providerInfo);
25
+ await (0, api_client_js_1.sendToRevenium)(payload);
26
+ }, 'Chat completion tracking', {
27
+ logError: true,
28
+ rethrow: false, // Don't rethrow to maintain fire-and-forget behavior
29
+ messagePrefix: 'Chat completion tracking failed: ',
30
+ }, logger);
31
+ }
32
+ /**
33
+ * Embeddings tracking - now a thin wrapper with Azure support
34
+ */
35
+ async function sendReveniumEmbeddingsMetrics(response, request, startTime, duration, providerInfo) {
36
+ await (0, error_handler_js_1.safeAsyncOperation)(async () => {
37
+ const payload = (0, payload_builder_js_1.buildPayload)('EMBED', response, request, startTime, duration, providerInfo);
38
+ await (0, api_client_js_1.sendToRevenium)(payload);
39
+ }, 'Embeddings tracking', {
40
+ logError: true,
41
+ rethrow: false, // Don't rethrow to maintain fire-and-forget behavior
42
+ messagePrefix: 'Embeddings tracking failed: ',
43
+ }, logger);
44
+ }
45
+ /**
46
+ * Fire-and-forget wrapper for chat completions with Azure support
47
+ */
48
+ function trackUsageAsync(trackingData) {
49
+ const mockResponse = {
50
+ id: trackingData.requestId,
51
+ model: trackingData.model,
52
+ usage: {
53
+ prompt_tokens: trackingData.promptTokens,
54
+ completion_tokens: trackingData.completionTokens,
55
+ total_tokens: trackingData.totalTokens,
56
+ ...(trackingData.reasoningTokens && { reasoning_tokens: trackingData.reasoningTokens }),
57
+ ...(trackingData.cachedTokens && { cached_tokens: trackingData.cachedTokens }),
58
+ },
59
+ choices: [
60
+ {
61
+ finish_reason: trackingData.finishReason,
62
+ },
63
+ ],
64
+ };
65
+ const mockRequest = {
66
+ model: trackingData.model,
67
+ messages: [], // Mock empty messages array for type compliance
68
+ usageMetadata: trackingData.usageMetadata,
69
+ stream: trackingData.isStreamed,
70
+ };
71
+ const startTime = Date.now() - trackingData.duration;
72
+ sendReveniumMetrics(mockResponse, mockRequest, startTime, trackingData.duration, trackingData.providerInfo)
73
+ .then(() => {
74
+ logger.debug('Usage tracking completed successfully', {
75
+ requestId: trackingData.requestId,
76
+ model: trackingData.model,
77
+ totalTokens: trackingData.totalTokens,
78
+ isStreamed: trackingData.isStreamed,
79
+ });
80
+ })
81
+ .catch(error => {
82
+ logger.warn('Usage tracking failed', {
83
+ error: error instanceof Error ? error.message : String(error),
84
+ requestId: trackingData.requestId,
85
+ model: trackingData.model,
86
+ });
87
+ });
88
+ }
89
+ /**
90
+ * Fire-and-forget wrapper for embeddings with Azure support
91
+ */
92
+ function trackEmbeddingsUsageAsync(trackingData) {
93
+ const mockResponse = {
94
+ model: trackingData.model,
95
+ usage: {
96
+ prompt_tokens: trackingData.promptTokens,
97
+ total_tokens: trackingData.totalTokens,
98
+ },
99
+ data: [], // Mock empty data array for type compliance
100
+ object: 'list',
101
+ };
102
+ const mockRequest = {
103
+ model: trackingData.model,
104
+ input: '', // Mock empty input for type compliance
105
+ usageMetadata: trackingData.usageMetadata,
106
+ };
107
+ sendReveniumEmbeddingsMetrics(mockResponse, mockRequest, trackingData.requestStartTime, trackingData.duration, trackingData.providerInfo)
108
+ .then(() => {
109
+ logger.debug('Embeddings tracking completed successfully', {
110
+ transactionId: trackingData.transactionId,
111
+ });
112
+ })
113
+ .catch(error => {
114
+ logger.warn('Embeddings tracking failed', {
115
+ error: error instanceof Error ? error.message : String(error),
116
+ transactionId: trackingData.transactionId,
117
+ });
118
+ });
119
+ }
120
+ //# sourceMappingURL=usage-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../../../../src/core/tracking/usage-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Wrapper module - Main exports
4
+ *
5
+ * This module provides a clean interface for OpenAI client wrapping,
6
+ * separating concerns into focused sub-modules.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getProviderInfo = exports.patchOpenAIInstance = exports.patchOpenAI = void 0;
10
+ // Re-export all wrapper functionality
11
+ var instance_patcher_js_1 = require("./instance-patcher.js");
12
+ Object.defineProperty(exports, "patchOpenAI", { enumerable: true, get: function () { return instance_patcher_js_1.patchOpenAI; } });
13
+ Object.defineProperty(exports, "patchOpenAIInstance", { enumerable: true, get: function () { return instance_patcher_js_1.patchOpenAIInstance; } });
14
+ Object.defineProperty(exports, "getProviderInfo", { enumerable: true, get: function () { return instance_patcher_js_1.getProviderInfo; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/wrapper/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,sCAAsC;AACtC,6DAA0F;AAAjF,kHAAA,WAAW,OAAA;AAAE,0HAAA,mBAAmB,OAAA;AAAE,sHAAA,eAAe,OAAA"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Instance Patcher Module
4
+ *
5
+ * Handles patching of OpenAI client instances.
6
+ * Extracted from wrapper.ts for better organization.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.instanceProviders = void 0;
10
+ exports.getProviderInfo = getProviderInfo;
11
+ exports.patchOpenAI = patchOpenAI;
12
+ exports.patchOpenAIInstance = patchOpenAIInstance;
13
+ const type_guards_js_1 = require("../../utils/type-guards.js");
14
+ const metadata_builder_js_1 = require("../../utils/metadata-builder.js");
15
+ const request_handler_factory_js_1 = require("../../utils/request-handler-factory.js");
16
+ const index_js_1 = require("../config/index.js");
17
+ const index_js_2 = require("../providers/index.js");
18
+ // Import the type augmentations to ensure they're available
19
+ require("../../types/openai-augmentation.js");
20
+ /**
21
+ * Set to track patched instances
22
+ */
23
+ const patchedInstances = new WeakSet();
24
+ /**
25
+ * WeakMap to store provider information for each client instance
26
+ */
27
+ const instanceProviders = new WeakMap();
28
+ exports.instanceProviders = instanceProviders;
29
+ // Global logger
30
+ const logger = (0, index_js_1.getLogger)();
31
+ /**
32
+ * Get provider information for a client instance
33
+ */
34
+ function getProviderInfo(instance) {
35
+ return instanceProviders.get(instance);
36
+ }
37
+ /**
38
+ * Simple approach: Only patch instances when users create them
39
+ * No global patching, no dummy keys - just clean instance patching
40
+ */
41
+ function patchOpenAI() {
42
+ logger.info('Revenium OpenAI middleware loaded and ready');
43
+ logger.debug('Use patchOpenAIInstance() to patch specific OpenAI instances');
44
+ }
45
+ /**
46
+ * Manually patch an existing OpenAI instance
47
+ * This is the main function users should call
48
+ */
49
+ function patchOpenAIInstance(instance) {
50
+ // Check if middleware is initialized
51
+ const config = (0, index_js_1.getConfig)();
52
+ if (!config) {
53
+ logger.warn('Revenium middleware not initialized.');
54
+ logger.warn('Auto-initialization may have failed. Try calling initializeReveniumFromEnv() explicitly.');
55
+ logger.warn('Check that REVENIUM_METERING_API_KEY environment variable is set.');
56
+ logger.warn('OpenAI instance will be patched but tracking may not work without proper configuration.');
57
+ }
58
+ else {
59
+ logger.debug('Revenium middleware is properly configured');
60
+ }
61
+ if (patchedInstances.has(instance)) {
62
+ logger.debug('OpenAI instance already patched, skipping');
63
+ return instance;
64
+ }
65
+ patchInstance(instance);
66
+ logger.debug('OpenAI instance patched successfully');
67
+ return instance;
68
+ }
69
+ /**
70
+ * Patch an individual OpenAI instance
71
+ */
72
+ function patchInstance(instance) {
73
+ try {
74
+ // Validate instance
75
+ if (!(0, type_guards_js_1.isOpenAIClientInstance)(instance)) {
76
+ logger.error('Invalid OpenAI client instance provided to patchInstance');
77
+ return;
78
+ }
79
+ // Detect provider type for this instance
80
+ const providerInfo = (0, index_js_2.detectProvider)(instance);
81
+ instanceProviders.set(instance, providerInfo);
82
+ logger.debug('Provider detection completed for instance', {
83
+ provider: providerInfo.provider,
84
+ isAzure: providerInfo.isAzure,
85
+ hasAzureConfig: !!providerInfo.azureConfig,
86
+ });
87
+ // Patch chat completions
88
+ patchChatCompletions(instance);
89
+ // Patch embeddings
90
+ patchEmbeddings(instance);
91
+ // Patch responses API (new OpenAI Responses API)
92
+ patchResponses(instance);
93
+ // Mark as patched
94
+ patchedInstances.add(instance);
95
+ }
96
+ catch (error) {
97
+ logger.error('Failed to patch OpenAI instance', {
98
+ error: error instanceof Error ? error.message : String(error),
99
+ });
100
+ }
101
+ }
102
+ /**
103
+ * Patch chat completions endpoint
104
+ */
105
+ function patchChatCompletions(instance) {
106
+ if (!instance.chat || !instance.chat.completions || !instance.chat.completions.create) {
107
+ return logger.warn('OpenAI instance missing chat.completions.create, skipping chat patch');
108
+ }
109
+ // Store the original create method
110
+ const originalCreate = instance.chat.completions.create.bind(instance.chat.completions);
111
+ // Replace the create method with our wrapped version
112
+ instance.chat.completions.create = async function (params, options) {
113
+ // Extract metadata using utility
114
+ const { metadata, cleanParams } = (0, metadata_builder_js_1.extractMetadata)(params);
115
+ const typedParams = params;
116
+ logger.debug('OpenAI chat.completions.create intercepted', {
117
+ ...(0, metadata_builder_js_1.createLoggingContext)(metadata),
118
+ model: typedParams.model,
119
+ stream: !!typedParams.stream,
120
+ });
121
+ // Record request start time
122
+ const requestStartTime = Date.now();
123
+ // Ensure factory is initialized and route request
124
+ try {
125
+ await (0, request_handler_factory_js_1.ensureFactoryInitialized)();
126
+ }
127
+ catch (error) {
128
+ logger.error('Failed to initialize request handler factory', { error });
129
+ throw new Error('Middleware initialization failed - cannot process request');
130
+ }
131
+ return request_handler_factory_js_1.requestHandlerFactory.routeChatRequest(originalCreate, cleanParams, options, metadata, requestStartTime, instance);
132
+ };
133
+ }
134
+ /**
135
+ * Patch embeddings endpoint
136
+ */
137
+ function patchEmbeddings(instance) {
138
+ if (!instance.embeddings || !instance.embeddings.create) {
139
+ return logger.warn('OpenAI instance missing embeddings.create, skipping embeddings patch');
140
+ }
141
+ // Store the original embeddings create method
142
+ const originalEmbeddingsCreate = instance.embeddings.create.bind(instance.embeddings);
143
+ // Replace the embeddings create method with our wrapped version
144
+ instance.embeddings.create = async function (params, options) {
145
+ // Extract metadata using utility
146
+ const { metadata, cleanParams } = (0, metadata_builder_js_1.extractMetadata)(params);
147
+ const typedParams = params;
148
+ logger.debug('OpenAI embeddings.create intercepted', {
149
+ ...(0, metadata_builder_js_1.createLoggingContext)(metadata),
150
+ model: typedParams.model,
151
+ inputType: typeof typedParams.input,
152
+ });
153
+ // Record request start time
154
+ const requestStartTime = Date.now();
155
+ // Ensure factory is initialized and route request
156
+ try {
157
+ await (0, request_handler_factory_js_1.ensureFactoryInitialized)();
158
+ }
159
+ catch (error) {
160
+ logger.error('Failed to initialize request handler factory', { error });
161
+ throw new Error('Middleware initialization failed - cannot process request');
162
+ }
163
+ return request_handler_factory_js_1.requestHandlerFactory.routeEmbeddingsRequest(originalEmbeddingsCreate, cleanParams, options, metadata, requestStartTime, instance);
164
+ };
165
+ }
166
+ /**
167
+ * Patch responses endpoint (new OpenAI Responses API)
168
+ */
169
+ function patchResponses(instance) {
170
+ // Type assertion for new Responses API (not yet in OpenAI types)
171
+ const responsesAPI = instance;
172
+ // Check if the instance has the responses API (it's a newer feature)
173
+ if (!responsesAPI.responses || !responsesAPI.responses.create) {
174
+ logger.debug('OpenAI instance missing responses.create, skipping responses patch (this is normal for older SDK versions)');
175
+ return;
176
+ }
177
+ // Store the original responses create method
178
+ const originalResponsesCreate = responsesAPI.responses.create.bind(responsesAPI.responses);
179
+ // Replace the responses create method with our wrapped version
180
+ responsesAPI.responses.create = async function (params, options) {
181
+ // Extract metadata using utility (similar to chat completions)
182
+ const { metadata, cleanParams } = (0, metadata_builder_js_1.extractMetadata)(params);
183
+ logger.debug('OpenAI responses.create intercepted', {
184
+ ...(0, metadata_builder_js_1.createLoggingContext)(metadata),
185
+ model: params.model,
186
+ stream: !!params.stream,
187
+ inputType: typeof params.input,
188
+ });
189
+ // Record request start time
190
+ const requestStartTime = Date.now();
191
+ // Ensure factory is initialized and route request
192
+ try {
193
+ await (0, request_handler_factory_js_1.ensureFactoryInitialized)();
194
+ }
195
+ catch (error) {
196
+ logger.error('Failed to initialize request handler factory', { error });
197
+ throw new Error('Middleware initialization failed - cannot process request');
198
+ }
199
+ return request_handler_factory_js_1.requestHandlerFactory.routeResponsesRequest(originalResponsesCreate, cleanParams, options, metadata, requestStartTime, instance);
200
+ };
201
+ }
202
+ //# sourceMappingURL=instance-patcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-patcher.js","sourceRoot":"","sources":["../../../../src/core/wrapper/instance-patcher.ts"],"names":[],"mappings":"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"}