@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,182 @@
1
+ /**
2
+ * Error Handler Utilities
3
+ *
4
+ * Centralized error handling patterns to eliminate repetitive try/catch blocks
5
+ * and provide consistent error logging and recovery strategies.
6
+ */
7
+ import { ERROR_MESSAGE_PATTERNS_TYPE_CONFIG, MESSAGE_PATTERNS_TYPE_NETWORK } from './constants.js';
8
+ /**
9
+ * Default error handling strategy
10
+ */
11
+ const DEFAULT_STRATEGY = {
12
+ logError: true,
13
+ rethrow: true,
14
+ messagePrefix: '',
15
+ fallbackValue: undefined,
16
+ transformError: (error) => (error instanceof Error ? error : new Error(String(error))),
17
+ };
18
+ /**
19
+ * Safe async operation wrapper with comprehensive error handling
20
+ *
21
+ * @param operation - The async operation to execute
22
+ * @param context - Context information for logging
23
+ * @param strategy - Error handling strategy
24
+ * @param logger - Logger instance
25
+ * @returns Promise with result or fallback value
26
+ */
27
+ export async function safeAsyncOperation(operation, context, strategy = {}, logger) {
28
+ const config = { ...DEFAULT_STRATEGY, ...strategy };
29
+ try {
30
+ return await operation();
31
+ }
32
+ catch (error) {
33
+ const transformedError = config.transformError(error);
34
+ if (config.logError && logger) {
35
+ logger.error(`${config.messagePrefix}${context}`, {
36
+ error: transformedError.message,
37
+ stack: transformedError.stack,
38
+ });
39
+ }
40
+ if (config.rethrow)
41
+ throw transformedError;
42
+ return config.fallbackValue;
43
+ }
44
+ }
45
+ /**
46
+ * Safe sync operation wrapper
47
+ *
48
+ * @param operation - The sync operation to execute
49
+ * @param context - Context information for logging
50
+ * @param strategy - Error handling strategy
51
+ * @param logger - Logger instance
52
+ * @returns Result or fallback value
53
+ */
54
+ export function safeSyncOperation(operation, context, strategy = {}, logger) {
55
+ const config = { ...DEFAULT_STRATEGY, ...strategy };
56
+ try {
57
+ return operation();
58
+ }
59
+ catch (error) {
60
+ const transformedError = config.transformError(error);
61
+ if (config.logError && logger) {
62
+ logger.error(`${config.messagePrefix}${context}`, {
63
+ error: transformedError.message,
64
+ stack: transformedError.stack,
65
+ });
66
+ }
67
+ if (config.rethrow)
68
+ throw transformedError;
69
+ return config.fallbackValue;
70
+ }
71
+ }
72
+ /**
73
+ * Validation wrapper that provides clear error messages
74
+ *
75
+ * @param value - Value to validate
76
+ * @param validator - Validation function
77
+ * @param errorMessage - Error message if validation fails
78
+ * @returns Validated value
79
+ */
80
+ export function validateOrThrow(value, validator, errorMessage) {
81
+ if (!validator(value))
82
+ throw new Error(errorMessage);
83
+ return value;
84
+ }
85
+ /**
86
+ * Validation wrapper that returns undefined on failure
87
+ *
88
+ * @param value - Value to validate
89
+ * @param validator - Validation function
90
+ * @param logger - Optional logger for warnings
91
+ * @param context - Context for logging
92
+ * @returns Validated value or undefined
93
+ */
94
+ export function validateOrUndefined(value, validator, logger, context) {
95
+ if (!validator(value)) {
96
+ if (logger && context) {
97
+ logger.warn(`Validation failed: ${context}`, { value });
98
+ }
99
+ return;
100
+ }
101
+ return value;
102
+ }
103
+ /**
104
+ * Create a retry wrapper for operations that might fail temporarily
105
+ *
106
+ * @param operation - Operation to retry
107
+ * @param maxRetries - Maximum number of retries
108
+ * @param delayMs - Delay between retries in milliseconds
109
+ * @param logger - Logger for retry attempts
110
+ * @returns Promise with operation result
111
+ */
112
+ export async function withRetry(operation, maxRetries = 3, delayMs = 1000, logger) {
113
+ let lastError;
114
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
115
+ try {
116
+ return await operation();
117
+ }
118
+ catch (error) {
119
+ lastError = error instanceof Error ? error : new Error(String(error));
120
+ if (attempt === maxRetries) {
121
+ break;
122
+ }
123
+ if (logger) {
124
+ logger.warn(`Operation failed, retrying (${attempt}/${maxRetries})`, {
125
+ error: lastError.message,
126
+ nextRetryIn: delayMs,
127
+ });
128
+ }
129
+ await new Promise(resolve => setTimeout(resolve, delayMs));
130
+ }
131
+ }
132
+ // eslint-disable-next-line no-throw-literal
133
+ throw lastError;
134
+ }
135
+ /**
136
+ * Common error types for better error handling
137
+ */
138
+ export class ValidationError extends Error {
139
+ constructor(message, context) {
140
+ super(message);
141
+ this.context = context;
142
+ this.name = 'ValidationError';
143
+ }
144
+ }
145
+ export class ConfigurationError extends Error {
146
+ constructor(message, context) {
147
+ super(message);
148
+ this.context = context;
149
+ this.name = 'ConfigurationError';
150
+ }
151
+ }
152
+ export class NetworkError extends Error {
153
+ constructor(message, context) {
154
+ super(message);
155
+ this.context = context;
156
+ this.name = 'NetworkError';
157
+ }
158
+ }
159
+ /**
160
+ * Error classification utility
161
+ */
162
+ export function classifyError(error) {
163
+ if (error instanceof ValidationError) {
164
+ return { type: 'validation', message: error.message, isRetryable: false };
165
+ }
166
+ if (error instanceof ConfigurationError) {
167
+ return { type: 'configuration', message: error.message, isRetryable: false };
168
+ }
169
+ if (error instanceof NetworkError) {
170
+ return { type: 'network', message: error.message, isRetryable: true };
171
+ }
172
+ const message = error instanceof Error ? error.message : String(error);
173
+ // Classify based on message patterns
174
+ if (MESSAGE_PATTERNS_TYPE_NETWORK.some(pattern => message.includes(pattern))) {
175
+ return { type: 'network', message, isRetryable: true };
176
+ }
177
+ if (ERROR_MESSAGE_PATTERNS_TYPE_CONFIG.some(pattern => message.includes(pattern))) {
178
+ return { type: 'configuration', message, isRetryable: false };
179
+ }
180
+ return { type: 'unknown', message, isRetryable: false };
181
+ }
182
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/utils/error-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Metadata Builder Utilities
3
+ *
4
+ * Centralized metadata handling to eliminate repetitive spreading
5
+ * and provide consistent metadata processing across the codebase.
6
+ */
7
+ /**
8
+ * Metadata mapping configuration
9
+ * Maps UsageMetadata fields to payload fields with optional transformations
10
+ * Subscriber object is passed through directly without transformation
11
+ */
12
+ const METADATA_FIELD_MAP = [
13
+ { source: 'traceId' },
14
+ { source: 'taskType' },
15
+ { source: 'agent' },
16
+ { source: 'organizationId' },
17
+ { source: 'productId' },
18
+ { source: 'subscriber' }, // Pass through nested subscriber object directly
19
+ { source: 'subscriptionId' },
20
+ {
21
+ source: 'responseQualityScore',
22
+ transform: (value) => {
23
+ // Ensure quality score is between 0 and 1
24
+ if (typeof value === 'number')
25
+ return Math.max(0, Math.min(1, value));
26
+ return value;
27
+ },
28
+ },
29
+ ];
30
+ /**
31
+ * Build metadata object for payload inclusion
32
+ *
33
+ * This function eliminates the repetitive spreading pattern and provides
34
+ * a clean, testable way to handle metadata transformation.
35
+ * Subscriber object is passed through directly without transformation.
36
+ *
37
+ * @param usageMetadata - Source metadata from request
38
+ * @returns Clean metadata object for payload
39
+ */
40
+ export function buildMetadataFields(usageMetadata) {
41
+ if (!usageMetadata)
42
+ return {};
43
+ const result = {};
44
+ // Process all metadata fields including nested subscriber object
45
+ for (const config of METADATA_FIELD_MAP) {
46
+ const value = usageMetadata[config.source];
47
+ // Skip undefined values (but allow null, empty strings, objects, etc.)
48
+ if (value === undefined)
49
+ continue;
50
+ // Apply transformation if configured
51
+ const transformedValue = config.transform ? config.transform(value) : value;
52
+ // Use target field name or default to source
53
+ const targetField = config.target || config.source;
54
+ result[targetField] = transformedValue;
55
+ }
56
+ return result;
57
+ }
58
+ /**
59
+ * Validate metadata completeness for specific use cases
60
+ *
61
+ * @param usageMetadata - Metadata to validate
62
+ * @param requiredFields - List of required field names
63
+ * @returns Validation result
64
+ */
65
+ export function validateMetadata(usageMetadata, requiredFields = []) {
66
+ const missingFields = [];
67
+ const warnings = [];
68
+ if (!usageMetadata && requiredFields.length > 0) {
69
+ return {
70
+ isValid: false,
71
+ missingFields: requiredFields,
72
+ warnings: ['No metadata provided'],
73
+ };
74
+ }
75
+ if (usageMetadata) {
76
+ // Check required fields
77
+ for (const field of requiredFields) {
78
+ if (!usageMetadata[field])
79
+ missingFields.push(String(field));
80
+ }
81
+ // Check for common issues
82
+ if (usageMetadata.responseQualityScore) {
83
+ const score = usageMetadata.responseQualityScore;
84
+ if (typeof score !== 'number' || score < 0 || score > 1) {
85
+ warnings.push('responseQualityScore should be a number between 0 and 1');
86
+ }
87
+ }
88
+ if (usageMetadata.subscriber?.email && !usageMetadata.subscriber.email.includes('@')) {
89
+ warnings.push('subscriber.email does not appear to be a valid email address');
90
+ }
91
+ }
92
+ return {
93
+ isValid: missingFields.length === 0,
94
+ missingFields,
95
+ warnings,
96
+ };
97
+ }
98
+ /**
99
+ * Merge multiple metadata sources with priority
100
+ *
101
+ * @param sources - Metadata sources in priority order (first wins)
102
+ * @returns Merged metadata object
103
+ */
104
+ export function mergeMetadata(...sources) {
105
+ const result = {};
106
+ // Process sources in reverse order so first source wins
107
+ for (const source of sources.reverse()) {
108
+ if (source)
109
+ Object.assign(result, source);
110
+ }
111
+ return result;
112
+ }
113
+ /**
114
+ * Extract metadata from request parameters safely
115
+ *
116
+ * @param params - Request parameters that might contain usageMetadata
117
+ * @returns Extracted metadata and cleaned parameters
118
+ */
119
+ export function extractMetadata(params) {
120
+ const { usageMetadata, ...cleanParams } = params;
121
+ return {
122
+ metadata: usageMetadata,
123
+ cleanParams: cleanParams,
124
+ };
125
+ }
126
+ /**
127
+ * Create a metadata context for consistent logging
128
+ *
129
+ * @param usageMetadata - Source metadata
130
+ * @returns Logging context object
131
+ */
132
+ export function createLoggingContext(usageMetadata) {
133
+ if (!usageMetadata)
134
+ return {};
135
+ return {
136
+ traceId: usageMetadata.traceId,
137
+ taskType: usageMetadata.taskType,
138
+ subscriberId: usageMetadata.subscriber?.id,
139
+ subscriberEmail: usageMetadata.subscriber?.email,
140
+ organizationId: usageMetadata.organizationId,
141
+ productId: usageMetadata.productId,
142
+ agent: usageMetadata.agent,
143
+ };
144
+ }
145
+ /**
146
+ * Sanitize metadata for logging (remove sensitive fields)
147
+ *
148
+ * @param usageMetadata - Source metadata
149
+ * @returns Sanitized metadata safe for logging
150
+ */
151
+ export function sanitizeMetadataForLogging(usageMetadata) {
152
+ if (!usageMetadata)
153
+ return {};
154
+ // Create a copy and handle nested subscriber object
155
+ const { subscriber, ...safeMetadata } = usageMetadata;
156
+ const result = { ...safeMetadata };
157
+ // Sanitize subscriber object if present
158
+ if (subscriber) {
159
+ const sanitizedSubscriber = {};
160
+ if (subscriber.id) {
161
+ sanitizedSubscriber.id = subscriber.id;
162
+ }
163
+ if (subscriber.email) {
164
+ sanitizedSubscriber.email = subscriber.email.replace(/(.{2}).*(@.*)/, '$1***$2');
165
+ }
166
+ if (subscriber.credential) {
167
+ sanitizedSubscriber.credential = {
168
+ name: subscriber.credential.name,
169
+ value: '[REDACTED]',
170
+ };
171
+ }
172
+ result.subscriber = sanitizedSubscriber;
173
+ }
174
+ return result;
175
+ }
176
+ //# 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,206 @@
1
+ /**
2
+ * Provider Detection Utilities
3
+ *
4
+ * Simplifies complex provider detection logic using strategy pattern
5
+ * instead of nested conditionals.
6
+ */
7
+ import { Provider } from '../types/index.js';
8
+ /**
9
+ * Provider detection strategies in priority order
10
+ */
11
+ const DETECTION_STRATEGIES = [
12
+ {
13
+ name: 'Constructor Name',
14
+ priority: 100,
15
+ detect: client => {
16
+ return client?.constructor?.name?.includes('Azure') || false;
17
+ },
18
+ getContext: client => ({
19
+ constructorName: client?.constructor?.name,
20
+ }),
21
+ },
22
+ {
23
+ name: 'Base URL',
24
+ priority: 90,
25
+ detect: client => {
26
+ const baseUrl = getBaseUrlString(client);
27
+ return baseUrl?.toLowerCase().includes('azure') || false;
28
+ },
29
+ getContext: client => ({
30
+ baseURL: getBaseUrlString(client),
31
+ }),
32
+ },
33
+ {
34
+ name: 'Environment Variables',
35
+ priority: 80,
36
+ detect: client => {
37
+ // Only use env vars if not explicitly OpenAI
38
+ const baseUrl = getBaseUrlString(client);
39
+ const isExplicitlyOpenAI = baseUrl?.includes('api.openai.com') ||
40
+ (client?.constructor?.name?.toLowerCase().includes('openai') &&
41
+ !client?.constructor?.name?.toLowerCase().includes('azure'));
42
+ return !isExplicitlyOpenAI && !!process.env.AZURE_OPENAI_ENDPOINT;
43
+ },
44
+ getContext: () => ({
45
+ hasAzureEndpoint: !!process.env.AZURE_OPENAI_ENDPOINT,
46
+ hasAzureDeployment: !!process.env.AZURE_OPENAI_DEPLOYMENT,
47
+ hasAzureApiKey: !!process.env.AZURE_OPENAI_API_KEY,
48
+ }),
49
+ },
50
+ ];
51
+ /**
52
+ * Extract base URL as string from client
53
+ */
54
+ function getBaseUrlString(client) {
55
+ if (!client?.baseURL)
56
+ return undefined;
57
+ return typeof client.baseURL === 'string' ? client.baseURL : client.baseURL.toString();
58
+ }
59
+ /**
60
+ * Detect provider using strategy pattern
61
+ *
62
+ * This replaces the complex nested conditional logic with a clean,
63
+ * testable strategy pattern.
64
+ *
65
+ * @param client - OpenAI client instance
66
+ * @param logger - Logger for debugging
67
+ * @returns Provider detection result
68
+ */
69
+ export function detectProviderStrategy(client, logger) {
70
+ // Sort strategies by priority (highest first)
71
+ const sortedStrategies = [...DETECTION_STRATEGIES].sort((a, b) => b.priority - a.priority);
72
+ for (const strategy of sortedStrategies) {
73
+ try {
74
+ if (strategy.detect(client)) {
75
+ const context = strategy.getContext?.(client) || {};
76
+ if (logger) {
77
+ logger.debug(`Azure provider detected via ${strategy.name}`, context);
78
+ }
79
+ return {
80
+ provider: Provider.AZURE_OPENAI,
81
+ strategy: strategy.name,
82
+ context,
83
+ };
84
+ }
85
+ }
86
+ catch (error) {
87
+ if (logger) {
88
+ logger.warn(`Provider detection strategy '${strategy.name}' failed`, {
89
+ error: error instanceof Error ? error.message : String(error),
90
+ });
91
+ }
92
+ }
93
+ }
94
+ // Default to OpenAI
95
+ if (logger) {
96
+ logger.debug('Standard OpenAI provider detected (no Azure indicators found)');
97
+ }
98
+ return { provider: Provider.OPENAI };
99
+ }
100
+ const AZURE_CONFIG_STRATEGIES = [
101
+ {
102
+ name: 'Client BaseURL',
103
+ gather: client => {
104
+ const baseUrl = getBaseUrlString(client);
105
+ return baseUrl ? { endpoint: baseUrl } : {};
106
+ },
107
+ },
108
+ {
109
+ name: 'Environment Variables',
110
+ gather: () => ({
111
+ endpoint: process.env.AZURE_OPENAI_ENDPOINT,
112
+ deployment: process.env.AZURE_OPENAI_DEPLOYMENT,
113
+ apiVersion: process.env.AZURE_OPENAI_API_VERSION || '2024-12-01-preview',
114
+ apiKey: process.env.AZURE_OPENAI_API_KEY,
115
+ tenantId: process.env.AZURE_OPENAI_TENANT_ID,
116
+ resourceGroup: process.env.AZURE_OPENAI_RESOURCE_GROUP,
117
+ }),
118
+ },
119
+ ];
120
+ /**
121
+ * Gather Azure configuration using strategy pattern
122
+ *
123
+ * @param client - OpenAI client instance
124
+ * @param logger - Logger for debugging
125
+ * @returns Merged Azure configuration
126
+ */
127
+ export function gatherAzureConfigStrategy(client, logger) {
128
+ const config = {};
129
+ for (const strategy of AZURE_CONFIG_STRATEGIES) {
130
+ try {
131
+ const strategyConfig = strategy.gather(client);
132
+ // Merge non-undefined values
133
+ Object.entries(strategyConfig).forEach(([key, value]) => {
134
+ if (value !== undefined && !(key in config)) {
135
+ config[key] = value;
136
+ }
137
+ });
138
+ }
139
+ catch (error) {
140
+ if (logger) {
141
+ logger.warn(`Azure config strategy '${strategy.name}' failed`, {
142
+ error: error instanceof Error ? error.message : String(error),
143
+ });
144
+ }
145
+ }
146
+ }
147
+ if (logger) {
148
+ logger.debug('Azure configuration gathered', {
149
+ hasEndpoint: !!config.endpoint,
150
+ hasDeployment: !!config.deployment,
151
+ hasApiKey: !!config.apiKey,
152
+ apiVersion: config.apiVersion,
153
+ });
154
+ }
155
+ return config;
156
+ }
157
+ /**
158
+ * Create complete provider info using strategies
159
+ *
160
+ * @param client - OpenAI client instance
161
+ * @param logger - Logger for debugging
162
+ * @returns Complete provider information
163
+ */
164
+ export function createProviderInfo(client, logger) {
165
+ const detection = detectProviderStrategy(client, logger);
166
+ if (detection.provider === Provider.AZURE_OPENAI) {
167
+ const azureConfig = gatherAzureConfigStrategy(client, logger);
168
+ return {
169
+ provider: detection.provider,
170
+ isAzure: true,
171
+ azureConfig,
172
+ };
173
+ }
174
+ return {
175
+ provider: detection.provider,
176
+ isAzure: false,
177
+ azureConfig: undefined,
178
+ };
179
+ }
180
+ /**
181
+ * Validate provider detection result
182
+ *
183
+ * @param providerInfo - Provider info to validate
184
+ * @returns Validation result
185
+ */
186
+ export function validateProviderInfo(providerInfo) {
187
+ const warnings = [];
188
+ if (providerInfo.isAzure) {
189
+ if (!providerInfo.azureConfig) {
190
+ warnings.push('Azure provider detected but no Azure configuration available');
191
+ }
192
+ else {
193
+ if (!providerInfo.azureConfig.endpoint) {
194
+ warnings.push('Azure configuration missing endpoint');
195
+ }
196
+ if (!providerInfo.azureConfig.apiKey) {
197
+ warnings.push('Azure configuration missing API key');
198
+ }
199
+ }
200
+ }
201
+ return {
202
+ isValid: warnings.length === 0,
203
+ warnings,
204
+ };
205
+ }
206
+ //# 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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"}