@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.
- package/LICENSE +21 -0
- package/README.md +1095 -0
- package/dist/cjs/core/config/azure-config.js +64 -0
- package/dist/cjs/core/config/azure-config.js.map +1 -0
- package/dist/cjs/core/config/index.js +41 -0
- package/dist/cjs/core/config/index.js.map +1 -0
- package/dist/cjs/core/config/loader.js +63 -0
- package/dist/cjs/core/config/loader.js.map +1 -0
- package/dist/cjs/core/config/manager.js +93 -0
- package/dist/cjs/core/config/manager.js.map +1 -0
- package/dist/cjs/core/config/validator.js +73 -0
- package/dist/cjs/core/config/validator.js.map +1 -0
- package/dist/cjs/core/providers/detector.js +140 -0
- package/dist/cjs/core/providers/detector.js.map +1 -0
- package/dist/cjs/core/providers/index.js +18 -0
- package/dist/cjs/core/providers/index.js.map +1 -0
- package/dist/cjs/core/tracking/api-client.js +68 -0
- package/dist/cjs/core/tracking/api-client.js.map +1 -0
- package/dist/cjs/core/tracking/index.js +23 -0
- package/dist/cjs/core/tracking/index.js.map +1 -0
- package/dist/cjs/core/tracking/payload-builder.js +107 -0
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
- package/dist/cjs/core/tracking/usage-tracker.js +120 -0
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
- package/dist/cjs/core/wrapper/index.js +15 -0
- package/dist/cjs/core/wrapper/index.js.map +1 -0
- package/dist/cjs/core/wrapper/instance-patcher.js +202 -0
- package/dist/cjs/core/wrapper/instance-patcher.js.map +1 -0
- package/dist/cjs/core/wrapper/request-handler.js +317 -0
- package/dist/cjs/core/wrapper/request-handler.js.map +1 -0
- package/dist/cjs/core/wrapper/stream-wrapper.js +82 -0
- package/dist/cjs/core/wrapper/stream-wrapper.js.map +1 -0
- package/dist/cjs/index.js +195 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/function-parameters.js +14 -0
- package/dist/cjs/types/function-parameters.js.map +1 -0
- package/dist/cjs/types/index.js +49 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/openai-augmentation.js +55 -0
- package/dist/cjs/types/openai-augmentation.js.map +1 -0
- package/dist/cjs/types/responses-api.js +30 -0
- package/dist/cjs/types/responses-api.js.map +1 -0
- package/dist/cjs/utils/azure-model-resolver.js +211 -0
- package/dist/cjs/utils/azure-model-resolver.js.map +1 -0
- package/dist/cjs/utils/constants.js +24 -0
- package/dist/cjs/utils/constants.js.map +1 -0
- package/dist/cjs/utils/error-handler.js +194 -0
- package/dist/cjs/utils/error-handler.js.map +1 -0
- package/dist/cjs/utils/metadata-builder.js +184 -0
- package/dist/cjs/utils/metadata-builder.js.map +1 -0
- package/dist/cjs/utils/provider-detection.js +212 -0
- package/dist/cjs/utils/provider-detection.js.map +1 -0
- package/dist/cjs/utils/request-handler-factory.js +185 -0
- package/dist/cjs/utils/request-handler-factory.js.map +1 -0
- package/dist/cjs/utils/stop-reason-mapper.js +70 -0
- package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
- package/dist/cjs/utils/type-guards.js +175 -0
- package/dist/cjs/utils/type-guards.js.map +1 -0
- package/dist/cjs/utils/url-builder.js +43 -0
- package/dist/cjs/utils/url-builder.js.map +1 -0
- package/dist/esm/core/config/azure-config.js +61 -0
- package/dist/esm/core/config/azure-config.js.map +1 -0
- package/dist/esm/core/config/index.js +13 -0
- package/dist/esm/core/config/index.js.map +1 -0
- package/dist/esm/core/config/loader.js +58 -0
- package/dist/esm/core/config/loader.js.map +1 -0
- package/dist/esm/core/config/manager.js +85 -0
- package/dist/esm/core/config/manager.js.map +1 -0
- package/dist/esm/core/config/validator.js +69 -0
- package/dist/esm/core/config/validator.js.map +1 -0
- package/dist/esm/core/providers/detector.js +134 -0
- package/dist/esm/core/providers/detector.js.map +1 -0
- package/dist/esm/core/providers/index.js +10 -0
- package/dist/esm/core/providers/index.js.map +1 -0
- package/dist/esm/core/tracking/api-client.js +65 -0
- package/dist/esm/core/tracking/api-client.js.map +1 -0
- package/dist/esm/core/tracking/index.js +13 -0
- package/dist/esm/core/tracking/index.js.map +1 -0
- package/dist/esm/core/tracking/payload-builder.js +104 -0
- package/dist/esm/core/tracking/payload-builder.js.map +1 -0
- package/dist/esm/core/tracking/usage-tracker.js +114 -0
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
- package/dist/esm/core/wrapper/index.js +9 -0
- package/dist/esm/core/wrapper/index.js.map +1 -0
- package/dist/esm/core/wrapper/instance-patcher.js +199 -0
- package/dist/esm/core/wrapper/instance-patcher.js.map +1 -0
- package/dist/esm/core/wrapper/request-handler.js +310 -0
- package/dist/esm/core/wrapper/request-handler.js.map +1 -0
- package/dist/esm/core/wrapper/stream-wrapper.js +79 -0
- package/dist/esm/core/wrapper/stream-wrapper.js.map +1 -0
- package/dist/esm/index.js +175 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/function-parameters.js +13 -0
- package/dist/esm/types/function-parameters.js.map +1 -0
- package/dist/esm/types/index.js +32 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/openai-augmentation.js +54 -0
- package/dist/esm/types/openai-augmentation.js.map +1 -0
- package/dist/esm/types/responses-api.js +26 -0
- package/dist/esm/types/responses-api.js.map +1 -0
- package/dist/esm/utils/azure-model-resolver.js +204 -0
- package/dist/esm/utils/azure-model-resolver.js.map +1 -0
- package/dist/esm/utils/constants.js +21 -0
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/error-handler.js +182 -0
- package/dist/esm/utils/error-handler.js.map +1 -0
- package/dist/esm/utils/metadata-builder.js +176 -0
- package/dist/esm/utils/metadata-builder.js.map +1 -0
- package/dist/esm/utils/provider-detection.js +206 -0
- package/dist/esm/utils/provider-detection.js.map +1 -0
- package/dist/esm/utils/request-handler-factory.js +146 -0
- package/dist/esm/utils/request-handler-factory.js.map +1 -0
- package/dist/esm/utils/stop-reason-mapper.js +65 -0
- package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
- package/dist/esm/utils/type-guards.js +158 -0
- package/dist/esm/utils/type-guards.js.map +1 -0
- package/dist/esm/utils/url-builder.js +39 -0
- package/dist/esm/utils/url-builder.js.map +1 -0
- package/dist/types/core/config/azure-config.d.ts +16 -0
- package/dist/types/core/config/azure-config.d.ts.map +1 -0
- package/dist/types/core/config/index.d.ts +11 -0
- package/dist/types/core/config/index.d.ts.map +1 -0
- package/dist/types/core/config/loader.d.ts +20 -0
- package/dist/types/core/config/loader.d.ts.map +1 -0
- package/dist/types/core/config/manager.d.ts +32 -0
- package/dist/types/core/config/manager.d.ts.map +1 -0
- package/dist/types/core/config/validator.d.ts +23 -0
- package/dist/types/core/config/validator.d.ts.map +1 -0
- package/dist/types/core/providers/detector.d.ts +44 -0
- package/dist/types/core/providers/detector.d.ts.map +1 -0
- package/dist/types/core/providers/index.d.ts +9 -0
- package/dist/types/core/providers/index.d.ts.map +1 -0
- package/dist/types/core/tracking/api-client.d.ts +17 -0
- package/dist/types/core/tracking/api-client.d.ts.map +1 -0
- package/dist/types/core/tracking/index.d.ts +11 -0
- package/dist/types/core/tracking/index.d.ts.map +1 -0
- package/dist/types/core/tracking/payload-builder.d.ts +24 -0
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
- package/dist/types/core/tracking/usage-tracker.d.ts +48 -0
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
- package/dist/types/core/wrapper/index.d.ts +8 -0
- package/dist/types/core/wrapper/index.d.ts.map +1 -0
- package/dist/types/core/wrapper/instance-patcher.d.ts +33 -0
- package/dist/types/core/wrapper/instance-patcher.d.ts.map +1 -0
- package/dist/types/core/wrapper/request-handler.d.ts +29 -0
- package/dist/types/core/wrapper/request-handler.d.ts.map +1 -0
- package/dist/types/core/wrapper/stream-wrapper.d.ts +13 -0
- package/dist/types/core/wrapper/stream-wrapper.d.ts.map +1 -0
- package/dist/types/index.d.ts +179 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types/function-parameters.d.ts +229 -0
- package/dist/types/types/function-parameters.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +283 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/openai-augmentation.d.ts +226 -0
- package/dist/types/types/openai-augmentation.d.ts.map +1 -0
- package/dist/types/types/responses-api.d.ts +247 -0
- package/dist/types/types/responses-api.d.ts.map +1 -0
- package/dist/types/utils/azure-model-resolver.d.ts +41 -0
- package/dist/types/utils/azure-model-resolver.d.ts.map +1 -0
- package/dist/types/utils/constants.d.ts +4 -0
- package/dist/types/utils/constants.d.ts.map +1 -0
- package/dist/types/utils/error-handler.d.ts +95 -0
- package/dist/types/utils/error-handler.d.ts.map +1 -0
- package/dist/types/utils/metadata-builder.d.ts +64 -0
- package/dist/types/utils/metadata-builder.d.ts.map +1 -0
- package/dist/types/utils/provider-detection.d.ts +51 -0
- package/dist/types/utils/provider-detection.d.ts.map +1 -0
- package/dist/types/utils/request-handler-factory.d.ts +81 -0
- package/dist/types/utils/request-handler-factory.d.ts.map +1 -0
- package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
- package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
- package/dist/types/utils/type-guards.d.ts +73 -0
- package/dist/types/utils/type-guards.d.ts.map +1 -0
- package/dist/types/utils/url-builder.d.ts +25 -0
- package/dist/types/utils/url-builder.d.ts.map +1 -0
- 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":";AAAA;;;;;GAKG;;AAmDH,kDAoBC;AASD,4CA0CC;AAQD,sCAQC;AAQD,0CAWC;AAQD,oDAWC;AAQD,gEA6BC;AAnMD;;;;GAIG;AACH,MAAM,kBAAkB,GAA0B;IAChD,EAAE,MAAM,EAAE,SAAS,EAAE;IACrB,EAAE,MAAM,EAAE,UAAU,EAAE;IACtB,EAAE,MAAM,EAAE,OAAO,EAAE;IACnB,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAC5B,EAAE,MAAM,EAAE,WAAW,EAAE;IACvB,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,iDAAiD;IAC3E,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAC5B;QACE,MAAM,EAAE,sBAAsB;QAC9B,SAAS,EAAE,CAAC,KAAc,EAAE,EAAE;YAC5B,0CAA0C;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC;KACF;CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,aAA6B;IAC/D,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,iEAAiE;IACjE,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3C,uEAAuE;QACvE,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,qCAAqC;QACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5E,6CAA6C;QAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAEnD,MAAM,CAAC,WAAW,CAAC,GAAG,gBAAgB,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,aAA6B,EAC7B,iBAA0C,EAAE;IAM5C,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,cAA0B;YACzC,QAAQ,EAAE,CAAC,sBAAsB,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,wBAAwB;QACxB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,0BAA0B;QAC1B,IAAI,aAAa,CAAC,oBAAoB,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,aAAa,CAAC,oBAAoB,CAAC;YACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrF,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;QACnC,aAAa;QACb,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,GAAG,OAAsC;IACrE,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,wDAAwD;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAC7B,MAA6C;IAK7C,MAAM,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;IACjD,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE,WAAuC;KACrD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,aAA6B;IAChE,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,YAAY,EAAE,aAAa,CAAC,UAAU,EAAE,EAAE;QAC1C,eAAe,EAAE,aAAa,CAAC,UAAU,EAAE,KAAK;QAChD,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,KAAK,EAAE,aAAa,CAAC,KAAK;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CAAC,aAA6B;IACtE,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAE9B,oDAAoD;IACpD,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC;IAEtD,MAAM,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAEnC,wCAAwC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,mBAAmB,GAAQ,EAAE,CAAC;QAEpC,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YAClB,mBAAmB,CAAC,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,mBAAmB,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,mBAAmB,CAAC,UAAU,GAAG;gBAC/B,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI;gBAChC,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,UAAU,GAAG,mBAAmB,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4OH,0EAWC;AAQD,4DAOC;AA/LD;;;;;GAKG;AACH,MAAa,qBAAqB;IAAlC;QACU,iBAAY,GAAsC,IAAI,CAAC;IAmJjE,CAAC;IAjJC;;OAEG;IACH,UAAU,CAAC,YAAwC;QACjD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,cAAsC,EACtC,MAAgD,EAChD,OAAyC,EACzC,aAAwC,EACxC,gBAAwB,EACxB,QAA8B;QAE9B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,wDAAwD;QACxD,qDAAqD;QACrD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAC7C,cAAc,EACd,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAChD,cAAc,EACd,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,sBAAsB,CACpB,cAAsC,EACtC,MAAqD,EACrD,OAAyC,EACzC,aAAwC,EACxC,gBAAwB,EACxB,QAA8B;QAE9B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,uDAAuD;QACvD,oDAAoD;QACpD,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAC9C,cAAc,EACd,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,qBAAqB,CACnB,cAA+C,EAC/C,MAAqD,EACrD,OAAyC,EACzC,aAAwC,EACxC,gBAAwB,EACxB,QAA8B;QAE9B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,kDAAkD;QAClD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,YAAY,CAAC,+BAA+B,CACtD,cAAc,EACd,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,YAAY,CAAC,kCAAkC,CACzD,cAAc,EACd,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC;IACpC,CAAC;CACF;AApJD,sDAoJC;AAED;;GAEG;AACU,QAAA,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAC;AAEjE;;;GAGG;AACI,KAAK,UAAU,+BAA+B;IACnD,sEAAsE;IACtE,MAAM,aAAa,GAAG,wDAAa,oCAAoC,GAAC,CAAC;IAEzE,6BAAqB,CAAC,UAAU,CAAC;QAC/B,sBAAsB,EAAE,aAAa,CAAC,sBAAsB;QAC5D,yBAAyB,EAAE,aAAa,CAAC,yBAAyB;QAClE,uBAAuB,EAAE,aAAa,CAAC,uBAAuB;QAC9D,+BAA+B,EAAE,aAAa,CAAC,+BAA+B;QAC9E,kCAAkC,EAAE,aAAa,CAAC,kCAAkC;KACrF,CAAC,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,IAAI,qBAAqB,GAAyB,IAAI,CAAC;AAEvD;;GAEG;AACI,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC,6BAAqB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,qBAAqB,GAAG,oCAAoC,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,qBAAqB,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oCAAoC;IACjD,iDAAiD;IACjD,MAAM,aAAa,GAAG,wDAAa,oCAAoC,GAAC,CAAC;IAEzE,6BAAqB,CAAC,UAAU,CAAC;QAC/B,sBAAsB,EAAE,aAAa,CAAC,sBAAsB;QAC5D,yBAAyB,EAAE,aAAa,CAAC,yBAAyB;QAClE,uBAAuB,EAAE,aAAa,CAAC,uBAAuB;QAC9D,+BAA+B,EAAE,aAAa,CAAC,+BAA+B;QAC9E,kCAAkC,EAAE,aAAa,CAAC,kCAAkC;KACrF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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"}
|