@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,184 @@
1
+ "use strict";
2
+ /**
3
+ * Metadata Builder Utilities
4
+ *
5
+ * Centralized metadata handling to eliminate repetitive spreading
6
+ * and provide consistent metadata processing across the codebase.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildMetadataFields = buildMetadataFields;
10
+ exports.validateMetadata = validateMetadata;
11
+ exports.mergeMetadata = mergeMetadata;
12
+ exports.extractMetadata = extractMetadata;
13
+ exports.createLoggingContext = createLoggingContext;
14
+ exports.sanitizeMetadataForLogging = sanitizeMetadataForLogging;
15
+ /**
16
+ * Metadata mapping configuration
17
+ * Maps UsageMetadata fields to payload fields with optional transformations
18
+ * Subscriber object is passed through directly without transformation
19
+ */
20
+ const METADATA_FIELD_MAP = [
21
+ { source: 'traceId' },
22
+ { source: 'taskType' },
23
+ { source: 'agent' },
24
+ { source: 'organizationId' },
25
+ { source: 'productId' },
26
+ { source: 'subscriber' }, // Pass through nested subscriber object directly
27
+ { source: 'subscriptionId' },
28
+ {
29
+ source: 'responseQualityScore',
30
+ transform: (value) => {
31
+ // Ensure quality score is between 0 and 1
32
+ if (typeof value === 'number')
33
+ return Math.max(0, Math.min(1, value));
34
+ return value;
35
+ },
36
+ },
37
+ ];
38
+ /**
39
+ * Build metadata object for payload inclusion
40
+ *
41
+ * This function eliminates the repetitive spreading pattern and provides
42
+ * a clean, testable way to handle metadata transformation.
43
+ * Subscriber object is passed through directly without transformation.
44
+ *
45
+ * @param usageMetadata - Source metadata from request
46
+ * @returns Clean metadata object for payload
47
+ */
48
+ function buildMetadataFields(usageMetadata) {
49
+ if (!usageMetadata)
50
+ return {};
51
+ const result = {};
52
+ // Process all metadata fields including nested subscriber object
53
+ for (const config of METADATA_FIELD_MAP) {
54
+ const value = usageMetadata[config.source];
55
+ // Skip undefined values (but allow null, empty strings, objects, etc.)
56
+ if (value === undefined)
57
+ continue;
58
+ // Apply transformation if configured
59
+ const transformedValue = config.transform ? config.transform(value) : value;
60
+ // Use target field name or default to source
61
+ const targetField = config.target || config.source;
62
+ result[targetField] = transformedValue;
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Validate metadata completeness for specific use cases
68
+ *
69
+ * @param usageMetadata - Metadata to validate
70
+ * @param requiredFields - List of required field names
71
+ * @returns Validation result
72
+ */
73
+ function validateMetadata(usageMetadata, requiredFields = []) {
74
+ const missingFields = [];
75
+ const warnings = [];
76
+ if (!usageMetadata && requiredFields.length > 0) {
77
+ return {
78
+ isValid: false,
79
+ missingFields: requiredFields,
80
+ warnings: ['No metadata provided'],
81
+ };
82
+ }
83
+ if (usageMetadata) {
84
+ // Check required fields
85
+ for (const field of requiredFields) {
86
+ if (!usageMetadata[field])
87
+ missingFields.push(String(field));
88
+ }
89
+ // Check for common issues
90
+ if (usageMetadata.responseQualityScore) {
91
+ const score = usageMetadata.responseQualityScore;
92
+ if (typeof score !== 'number' || score < 0 || score > 1) {
93
+ warnings.push('responseQualityScore should be a number between 0 and 1');
94
+ }
95
+ }
96
+ if (usageMetadata.subscriber?.email && !usageMetadata.subscriber.email.includes('@')) {
97
+ warnings.push('subscriber.email does not appear to be a valid email address');
98
+ }
99
+ }
100
+ return {
101
+ isValid: missingFields.length === 0,
102
+ missingFields,
103
+ warnings,
104
+ };
105
+ }
106
+ /**
107
+ * Merge multiple metadata sources with priority
108
+ *
109
+ * @param sources - Metadata sources in priority order (first wins)
110
+ * @returns Merged metadata object
111
+ */
112
+ function mergeMetadata(...sources) {
113
+ const result = {};
114
+ // Process sources in reverse order so first source wins
115
+ for (const source of sources.reverse()) {
116
+ if (source)
117
+ Object.assign(result, source);
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * Extract metadata from request parameters safely
123
+ *
124
+ * @param params - Request parameters that might contain usageMetadata
125
+ * @returns Extracted metadata and cleaned parameters
126
+ */
127
+ function extractMetadata(params) {
128
+ const { usageMetadata, ...cleanParams } = params;
129
+ return {
130
+ metadata: usageMetadata,
131
+ cleanParams: cleanParams,
132
+ };
133
+ }
134
+ /**
135
+ * Create a metadata context for consistent logging
136
+ *
137
+ * @param usageMetadata - Source metadata
138
+ * @returns Logging context object
139
+ */
140
+ function createLoggingContext(usageMetadata) {
141
+ if (!usageMetadata)
142
+ return {};
143
+ return {
144
+ traceId: usageMetadata.traceId,
145
+ taskType: usageMetadata.taskType,
146
+ subscriberId: usageMetadata.subscriber?.id,
147
+ subscriberEmail: usageMetadata.subscriber?.email,
148
+ organizationId: usageMetadata.organizationId,
149
+ productId: usageMetadata.productId,
150
+ agent: usageMetadata.agent,
151
+ };
152
+ }
153
+ /**
154
+ * Sanitize metadata for logging (remove sensitive fields)
155
+ *
156
+ * @param usageMetadata - Source metadata
157
+ * @returns Sanitized metadata safe for logging
158
+ */
159
+ function sanitizeMetadataForLogging(usageMetadata) {
160
+ if (!usageMetadata)
161
+ return {};
162
+ // Create a copy and handle nested subscriber object
163
+ const { subscriber, ...safeMetadata } = usageMetadata;
164
+ const result = { ...safeMetadata };
165
+ // Sanitize subscriber object if present
166
+ if (subscriber) {
167
+ const sanitizedSubscriber = {};
168
+ if (subscriber.id) {
169
+ sanitizedSubscriber.id = subscriber.id;
170
+ }
171
+ if (subscriber.email) {
172
+ sanitizedSubscriber.email = subscriber.email.replace(/(.{2}).*(@.*)/, '$1***$2');
173
+ }
174
+ if (subscriber.credential) {
175
+ sanitizedSubscriber.credential = {
176
+ name: subscriber.credential.name,
177
+ value: '[REDACTED]',
178
+ };
179
+ }
180
+ result.subscriber = sanitizedSubscriber;
181
+ }
182
+ return result;
183
+ }
184
+ //# sourceMappingURL=metadata-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-builder.js","sourceRoot":"","sources":["../../../src/utils/metadata-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * Provider Detection Utilities
4
+ *
5
+ * Simplifies complex provider detection logic using strategy pattern
6
+ * instead of nested conditionals.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.detectProviderStrategy = detectProviderStrategy;
10
+ exports.gatherAzureConfigStrategy = gatherAzureConfigStrategy;
11
+ exports.createProviderInfo = createProviderInfo;
12
+ exports.validateProviderInfo = validateProviderInfo;
13
+ const index_js_1 = require("../types/index.js");
14
+ /**
15
+ * Provider detection strategies in priority order
16
+ */
17
+ const DETECTION_STRATEGIES = [
18
+ {
19
+ name: 'Constructor Name',
20
+ priority: 100,
21
+ detect: client => {
22
+ return client?.constructor?.name?.includes('Azure') || false;
23
+ },
24
+ getContext: client => ({
25
+ constructorName: client?.constructor?.name,
26
+ }),
27
+ },
28
+ {
29
+ name: 'Base URL',
30
+ priority: 90,
31
+ detect: client => {
32
+ const baseUrl = getBaseUrlString(client);
33
+ return baseUrl?.toLowerCase().includes('azure') || false;
34
+ },
35
+ getContext: client => ({
36
+ baseURL: getBaseUrlString(client),
37
+ }),
38
+ },
39
+ {
40
+ name: 'Environment Variables',
41
+ priority: 80,
42
+ detect: client => {
43
+ // Only use env vars if not explicitly OpenAI
44
+ const baseUrl = getBaseUrlString(client);
45
+ const isExplicitlyOpenAI = baseUrl?.includes('api.openai.com') ||
46
+ (client?.constructor?.name?.toLowerCase().includes('openai') &&
47
+ !client?.constructor?.name?.toLowerCase().includes('azure'));
48
+ return !isExplicitlyOpenAI && !!process.env.AZURE_OPENAI_ENDPOINT;
49
+ },
50
+ getContext: () => ({
51
+ hasAzureEndpoint: !!process.env.AZURE_OPENAI_ENDPOINT,
52
+ hasAzureDeployment: !!process.env.AZURE_OPENAI_DEPLOYMENT,
53
+ hasAzureApiKey: !!process.env.AZURE_OPENAI_API_KEY,
54
+ }),
55
+ },
56
+ ];
57
+ /**
58
+ * Extract base URL as string from client
59
+ */
60
+ function getBaseUrlString(client) {
61
+ if (!client?.baseURL)
62
+ return undefined;
63
+ return typeof client.baseURL === 'string' ? client.baseURL : client.baseURL.toString();
64
+ }
65
+ /**
66
+ * Detect provider using strategy pattern
67
+ *
68
+ * This replaces the complex nested conditional logic with a clean,
69
+ * testable strategy pattern.
70
+ *
71
+ * @param client - OpenAI client instance
72
+ * @param logger - Logger for debugging
73
+ * @returns Provider detection result
74
+ */
75
+ function detectProviderStrategy(client, logger) {
76
+ // Sort strategies by priority (highest first)
77
+ const sortedStrategies = [...DETECTION_STRATEGIES].sort((a, b) => b.priority - a.priority);
78
+ for (const strategy of sortedStrategies) {
79
+ try {
80
+ if (strategy.detect(client)) {
81
+ const context = strategy.getContext?.(client) || {};
82
+ if (logger) {
83
+ logger.debug(`Azure provider detected via ${strategy.name}`, context);
84
+ }
85
+ return {
86
+ provider: index_js_1.Provider.AZURE_OPENAI,
87
+ strategy: strategy.name,
88
+ context,
89
+ };
90
+ }
91
+ }
92
+ catch (error) {
93
+ if (logger) {
94
+ logger.warn(`Provider detection strategy '${strategy.name}' failed`, {
95
+ error: error instanceof Error ? error.message : String(error),
96
+ });
97
+ }
98
+ }
99
+ }
100
+ // Default to OpenAI
101
+ if (logger) {
102
+ logger.debug('Standard OpenAI provider detected (no Azure indicators found)');
103
+ }
104
+ return { provider: index_js_1.Provider.OPENAI };
105
+ }
106
+ const AZURE_CONFIG_STRATEGIES = [
107
+ {
108
+ name: 'Client BaseURL',
109
+ gather: client => {
110
+ const baseUrl = getBaseUrlString(client);
111
+ return baseUrl ? { endpoint: baseUrl } : {};
112
+ },
113
+ },
114
+ {
115
+ name: 'Environment Variables',
116
+ gather: () => ({
117
+ endpoint: process.env.AZURE_OPENAI_ENDPOINT,
118
+ deployment: process.env.AZURE_OPENAI_DEPLOYMENT,
119
+ apiVersion: process.env.AZURE_OPENAI_API_VERSION || '2024-12-01-preview',
120
+ apiKey: process.env.AZURE_OPENAI_API_KEY,
121
+ tenantId: process.env.AZURE_OPENAI_TENANT_ID,
122
+ resourceGroup: process.env.AZURE_OPENAI_RESOURCE_GROUP,
123
+ }),
124
+ },
125
+ ];
126
+ /**
127
+ * Gather Azure configuration using strategy pattern
128
+ *
129
+ * @param client - OpenAI client instance
130
+ * @param logger - Logger for debugging
131
+ * @returns Merged Azure configuration
132
+ */
133
+ function gatherAzureConfigStrategy(client, logger) {
134
+ const config = {};
135
+ for (const strategy of AZURE_CONFIG_STRATEGIES) {
136
+ try {
137
+ const strategyConfig = strategy.gather(client);
138
+ // Merge non-undefined values
139
+ Object.entries(strategyConfig).forEach(([key, value]) => {
140
+ if (value !== undefined && !(key in config)) {
141
+ config[key] = value;
142
+ }
143
+ });
144
+ }
145
+ catch (error) {
146
+ if (logger) {
147
+ logger.warn(`Azure config strategy '${strategy.name}' failed`, {
148
+ error: error instanceof Error ? error.message : String(error),
149
+ });
150
+ }
151
+ }
152
+ }
153
+ if (logger) {
154
+ logger.debug('Azure configuration gathered', {
155
+ hasEndpoint: !!config.endpoint,
156
+ hasDeployment: !!config.deployment,
157
+ hasApiKey: !!config.apiKey,
158
+ apiVersion: config.apiVersion,
159
+ });
160
+ }
161
+ return config;
162
+ }
163
+ /**
164
+ * Create complete provider info using strategies
165
+ *
166
+ * @param client - OpenAI client instance
167
+ * @param logger - Logger for debugging
168
+ * @returns Complete provider information
169
+ */
170
+ function createProviderInfo(client, logger) {
171
+ const detection = detectProviderStrategy(client, logger);
172
+ if (detection.provider === index_js_1.Provider.AZURE_OPENAI) {
173
+ const azureConfig = gatherAzureConfigStrategy(client, logger);
174
+ return {
175
+ provider: detection.provider,
176
+ isAzure: true,
177
+ azureConfig,
178
+ };
179
+ }
180
+ return {
181
+ provider: detection.provider,
182
+ isAzure: false,
183
+ azureConfig: undefined,
184
+ };
185
+ }
186
+ /**
187
+ * Validate provider detection result
188
+ *
189
+ * @param providerInfo - Provider info to validate
190
+ * @returns Validation result
191
+ */
192
+ function validateProviderInfo(providerInfo) {
193
+ const warnings = [];
194
+ if (providerInfo.isAzure) {
195
+ if (!providerInfo.azureConfig) {
196
+ warnings.push('Azure provider detected but no Azure configuration available');
197
+ }
198
+ else {
199
+ if (!providerInfo.azureConfig.endpoint) {
200
+ warnings.push('Azure configuration missing endpoint');
201
+ }
202
+ if (!providerInfo.azureConfig.apiKey) {
203
+ warnings.push('Azure configuration missing API key');
204
+ }
205
+ }
206
+ }
207
+ return {
208
+ isValid: warnings.length === 0,
209
+ warnings,
210
+ };
211
+ }
212
+ //# sourceMappingURL=provider-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-detection.js","sourceRoot":"","sources":["../../../src/utils/provider-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Request Handler Factory
4
+ *
5
+ * Eliminates dynamic require() calls and provides a clean factory pattern
6
+ * for creating request handlers with proper dependency injection.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.requestHandlerFactory = exports.RequestHandlerFactory = void 0;
43
+ exports.initializeRequestHandlerFactory = initializeRequestHandlerFactory;
44
+ exports.ensureFactoryInitialized = ensureFactoryInitialized;
45
+ /**
46
+ * Request handler factory class
47
+ *
48
+ * This eliminates the need for dynamic require() calls and provides
49
+ * a clean dependency injection pattern.
50
+ */
51
+ class RequestHandlerFactory {
52
+ constructor() {
53
+ this.dependencies = null;
54
+ }
55
+ /**
56
+ * Initialize the factory with dependencies
57
+ */
58
+ initialize(dependencies) {
59
+ this.dependencies = dependencies;
60
+ }
61
+ /**
62
+ * Get streaming request handler
63
+ */
64
+ getStreamingHandler() {
65
+ if (!this.dependencies) {
66
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
67
+ }
68
+ return this.dependencies.handleStreamingRequest;
69
+ }
70
+ /**
71
+ * Get non-streaming request handler
72
+ */
73
+ getNonStreamingHandler() {
74
+ if (!this.dependencies) {
75
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
76
+ }
77
+ return this.dependencies.handleNonStreamingRequest;
78
+ }
79
+ /**
80
+ * Get embeddings request handler
81
+ */
82
+ getEmbeddingsHandler() {
83
+ if (!this.dependencies) {
84
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
85
+ }
86
+ return this.dependencies.handleEmbeddingsRequest;
87
+ }
88
+ /**
89
+ * Route chat request to appropriate handler
90
+ */
91
+ routeChatRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
92
+ if (!this.dependencies) {
93
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
94
+ }
95
+ // Pass clean params (without usageMetadata) to handlers
96
+ // The handlers will receive usageMetadata separately
97
+ if (params.stream) {
98
+ return this.dependencies.handleStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance);
99
+ }
100
+ else {
101
+ return this.dependencies.handleNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance);
102
+ }
103
+ }
104
+ /**
105
+ * Route embeddings request to appropriate handler
106
+ */
107
+ routeEmbeddingsRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
108
+ if (!this.dependencies) {
109
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
110
+ }
111
+ // Pass clean params (without usageMetadata) to handler
112
+ // The handler will receive usageMetadata separately
113
+ return this.dependencies.handleEmbeddingsRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance);
114
+ }
115
+ /**
116
+ * Route responses request to appropriate handler (new OpenAI Responses API)
117
+ */
118
+ routeResponsesRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance) {
119
+ if (!this.dependencies) {
120
+ throw new Error('RequestHandlerFactory not initialized. Call initialize() first.');
121
+ }
122
+ // Route to appropriate handler based on streaming
123
+ if (params.stream) {
124
+ return this.dependencies.handleResponsesStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance);
125
+ }
126
+ else {
127
+ return this.dependencies.handleResponsesNonStreamingRequest(originalCreate, params, options, usageMetadata, requestStartTime, instance);
128
+ }
129
+ }
130
+ /**
131
+ * Check if factory is initialized
132
+ */
133
+ isInitialized() {
134
+ return this.dependencies !== null;
135
+ }
136
+ }
137
+ exports.RequestHandlerFactory = RequestHandlerFactory;
138
+ /**
139
+ * Global factory instance
140
+ */
141
+ exports.requestHandlerFactory = new RequestHandlerFactory();
142
+ /**
143
+ * Initialize the global factory (called once during module setup)
144
+ * Uses dynamic import to avoid circular dependencies
145
+ */
146
+ async function initializeRequestHandlerFactory() {
147
+ // Use dynamic import instead of require for better TypeScript support
148
+ const handlerModule = await Promise.resolve().then(() => __importStar(require('../core/wrapper/request-handler.js')));
149
+ exports.requestHandlerFactory.initialize({
150
+ handleStreamingRequest: handlerModule.handleStreamingRequest,
151
+ handleNonStreamingRequest: handlerModule.handleNonStreamingRequest,
152
+ handleEmbeddingsRequest: handlerModule.handleEmbeddingsRequest,
153
+ handleResponsesStreamingRequest: handlerModule.handleResponsesStreamingRequest,
154
+ handleResponsesNonStreamingRequest: handlerModule.handleResponsesNonStreamingRequest,
155
+ });
156
+ }
157
+ // Promise cache to prevent race conditions during initialization
158
+ let initializationPromise = null;
159
+ /**
160
+ * Utility function to ensure factory is initialized
161
+ */
162
+ async function ensureFactoryInitialized() {
163
+ if (!exports.requestHandlerFactory.isInitialized()) {
164
+ if (!initializationPromise) {
165
+ initializationPromise = initializeRequestHandlerFactoryAsync();
166
+ }
167
+ await initializationPromise;
168
+ }
169
+ }
170
+ /**
171
+ * Async initialization for ES Module compatibility
172
+ * Uses dynamic import for ES Module compatibility
173
+ */
174
+ async function initializeRequestHandlerFactoryAsync() {
175
+ // Use dynamic import for ES Module compatibility
176
+ const handlerModule = await Promise.resolve().then(() => __importStar(require('../core/wrapper/request-handler.js')));
177
+ exports.requestHandlerFactory.initialize({
178
+ handleStreamingRequest: handlerModule.handleStreamingRequest,
179
+ handleNonStreamingRequest: handlerModule.handleNonStreamingRequest,
180
+ handleEmbeddingsRequest: handlerModule.handleEmbeddingsRequest,
181
+ handleResponsesStreamingRequest: handlerModule.handleResponsesStreamingRequest,
182
+ handleResponsesNonStreamingRequest: handlerModule.handleResponsesNonStreamingRequest,
183
+ });
184
+ }
185
+ //# sourceMappingURL=request-handler-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-handler-factory.js","sourceRoot":"","sources":["../../../src/utils/request-handler-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * Stop Reason Mapper Utilities
4
+ *
5
+ * Centralized stop reason mapping logic using lookup tables
6
+ * instead of nested conditionals. Based on the good example
7
+ * from the anthropic-node middleware.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.mapStopReason = mapStopReason;
11
+ exports.getSupportedStopReasons = getSupportedStopReasons;
12
+ exports.isStopReasonSupported = isStopReasonSupported;
13
+ /**
14
+ * Stop reason mapping configuration
15
+ * Maps provider-specific stop reasons to Revenium's standardized set
16
+ */
17
+ const STOP_REASON_MAP = {
18
+ // OpenAI/Azure OpenAI stop reasons
19
+ stop: 'END',
20
+ function_call: 'END_SEQUENCE',
21
+ tool_calls: 'END_SEQUENCE',
22
+ timeout: 'TIMEOUT',
23
+ length: 'TOKEN_LIMIT',
24
+ max_tokens: 'TOKEN_LIMIT',
25
+ content_filter: 'ERROR',
26
+ error: 'ERROR',
27
+ // Anthropic stop reasons (for consistency across middleware)
28
+ end_turn: 'END',
29
+ stop_sequence: 'END_SEQUENCE',
30
+ tool_use: 'END_SEQUENCE',
31
+ };
32
+ /**
33
+ * Default stop reason when mapping fails
34
+ */
35
+ const DEFAULT_STOP_REASON = 'END';
36
+ /**
37
+ * Map provider stop reasons to Revenium stop reasons
38
+ *
39
+ * This replaces the nested if/switch logic with a clean lookup table approach.
40
+ * Based on the good example from the anthropic-node middleware.
41
+ *
42
+ * @param providerStopReason - Stop reason from the AI provider
43
+ * @param logger - Optional logger for warnings about unknown reasons
44
+ * @returns Standardized Revenium stop reason
45
+ */
46
+ function mapStopReason(providerStopReason, logger) {
47
+ if (!providerStopReason)
48
+ return DEFAULT_STOP_REASON;
49
+ const normalizedReason = providerStopReason.toLowerCase();
50
+ const mappedReason = STOP_REASON_MAP[normalizedReason];
51
+ if (!mappedReason) {
52
+ // Log warning for unknown stop reasons to help with future mapping
53
+ logger?.warn(`Unknown stop reason: ${providerStopReason}, mapping to ${DEFAULT_STOP_REASON}`);
54
+ return DEFAULT_STOP_REASON;
55
+ }
56
+ return mappedReason;
57
+ }
58
+ /**
59
+ * Get all supported stop reasons for documentation/testing
60
+ */
61
+ function getSupportedStopReasons() {
62
+ return Object.keys(STOP_REASON_MAP);
63
+ }
64
+ /**
65
+ * Check if a stop reason is supported
66
+ */
67
+ function isStopReasonSupported(reason) {
68
+ return reason.toLowerCase() in STOP_REASON_MAP;
69
+ }
70
+ //# sourceMappingURL=stop-reason-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-reason-mapper.js","sourceRoot":"","sources":["../../../src/utils/stop-reason-mapper.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAsCH,sCAeC;AAKD,0DAEC;AAKD,sDAEC;AAjED;;;GAGG;AACH,MAAM,eAAe,GAA2B;IAC9C,mCAAmC;IACnC,IAAI,EAAE,KAAK;IACX,aAAa,EAAE,cAAc;IAC7B,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,aAAa;IACzB,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,OAAO;IAEd,6DAA6D;IAC7D,QAAQ,EAAE,KAAK;IACf,aAAa,EAAE,cAAc;IAC7B,QAAQ,EAAE,cAAc;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAC3B,kBAA6C,EAC7C,MAA4D;IAE5D,IAAI,CAAC,kBAAkB;QAAE,OAAO,mBAAmB,CAAC;IACpD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,mEAAmE;QACnE,MAAM,EAAE,IAAI,CAAC,wBAAwB,kBAAkB,gBAAgB,mBAAmB,EAAE,CAAC,CAAC;QAC9F,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,MAAc;IAClD,OAAO,MAAM,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC;AACjD,CAAC"}