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