@revenium/openai 1.0.12 → 1.0.14
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/.env.example +10 -15
- package/CHANGELOG.md +59 -0
- package/CODE_OF_CONDUCT.md +57 -0
- package/CONTRIBUTING.md +38 -0
- package/README.md +109 -515
- package/SECURITY.md +34 -0
- package/dist/cjs/core/client/index.js +14 -0
- package/dist/cjs/core/client/index.js.map +1 -0
- package/dist/cjs/core/client/manager.js +109 -0
- package/dist/cjs/core/client/manager.js.map +1 -0
- package/dist/cjs/core/config/azure-config.js +5 -17
- package/dist/cjs/core/config/azure-config.js.map +1 -1
- package/dist/cjs/core/config/index.js +2 -2
- package/dist/cjs/core/config/index.js.map +1 -1
- package/dist/cjs/core/config/loader.js +34 -14
- package/dist/cjs/core/config/loader.js.map +1 -1
- package/dist/cjs/core/config/manager.js +12 -5
- package/dist/cjs/core/config/manager.js.map +1 -1
- package/dist/cjs/core/config/validator.js +3 -45
- package/dist/cjs/core/config/validator.js.map +1 -1
- package/dist/cjs/core/middleware/index.js +17 -0
- package/dist/cjs/core/middleware/index.js.map +1 -0
- package/dist/cjs/core/middleware/interfaces.js +361 -0
- package/dist/cjs/core/middleware/interfaces.js.map +1 -0
- package/dist/cjs/core/middleware/revenium-client.js +142 -0
- package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
- package/dist/cjs/core/providers/detector.js +45 -23
- package/dist/cjs/core/providers/detector.js.map +1 -1
- package/dist/cjs/core/providers/index.js +2 -1
- package/dist/cjs/core/providers/index.js.map +1 -1
- package/dist/cjs/core/tracking/api-client.js +14 -13
- package/dist/cjs/core/tracking/api-client.js.map +1 -1
- package/dist/cjs/core/tracking/payload-builder.js +30 -35
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
- package/dist/cjs/core/tracking/usage-tracker.js +22 -18
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
- package/dist/cjs/index.js +26 -174
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/index.js +0 -8
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/openai-augmentation.js +0 -49
- package/dist/cjs/types/openai-augmentation.js.map +1 -1
- package/dist/cjs/utils/constants.js +17 -20
- package/dist/cjs/utils/constants.js.map +1 -1
- package/dist/cjs/utils/error-handler.js +18 -14
- package/dist/cjs/utils/error-handler.js.map +1 -1
- package/dist/cjs/utils/metadata-builder.js +27 -19
- package/dist/cjs/utils/metadata-builder.js.map +1 -1
- package/dist/cjs/utils/provider-detection.js +25 -28
- package/dist/cjs/utils/provider-detection.js.map +1 -1
- package/dist/cjs/utils/stop-reason-mapper.js +4 -0
- package/dist/cjs/utils/stop-reason-mapper.js.map +1 -1
- package/dist/cjs/utils/url-builder.js +3 -3
- package/dist/esm/core/client/index.js +6 -0
- package/dist/esm/core/client/index.js.map +1 -0
- package/dist/esm/core/client/manager.js +102 -0
- package/dist/esm/core/client/manager.js.map +1 -0
- package/dist/esm/core/config/azure-config.js +6 -18
- package/dist/esm/core/config/azure-config.js.map +1 -1
- package/dist/esm/core/config/index.js +5 -4
- package/dist/esm/core/config/index.js.map +1 -1
- package/dist/esm/core/config/loader.js +33 -13
- package/dist/esm/core/config/loader.js.map +1 -1
- package/dist/esm/core/config/manager.js +14 -7
- package/dist/esm/core/config/manager.js.map +1 -1
- package/dist/esm/core/config/validator.js +3 -44
- package/dist/esm/core/config/validator.js.map +1 -1
- package/dist/esm/core/middleware/index.js +8 -0
- package/dist/esm/core/middleware/index.js.map +1 -0
- package/dist/esm/core/middleware/interfaces.js +353 -0
- package/dist/esm/core/middleware/interfaces.js.map +1 -0
- package/dist/esm/core/middleware/revenium-client.js +105 -0
- package/dist/esm/core/middleware/revenium-client.js.map +1 -0
- package/dist/esm/core/providers/detector.js +43 -22
- package/dist/esm/core/providers/detector.js.map +1 -1
- package/dist/esm/core/providers/index.js +2 -2
- package/dist/esm/core/providers/index.js.map +1 -1
- package/dist/esm/core/tracking/api-client.js +13 -12
- package/dist/esm/core/tracking/api-client.js.map +1 -1
- package/dist/esm/core/tracking/payload-builder.js +31 -36
- package/dist/esm/core/tracking/payload-builder.js.map +1 -1
- package/dist/esm/core/tracking/usage-tracker.js +24 -20
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
- package/dist/esm/index.js +9 -157
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/index.js +2 -10
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/openai-augmentation.js +0 -49
- package/dist/esm/types/openai-augmentation.js.map +1 -1
- package/dist/esm/utils/constants.js +16 -19
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/error-handler.js +19 -15
- package/dist/esm/utils/error-handler.js.map +1 -1
- package/dist/esm/utils/metadata-builder.js +27 -19
- package/dist/esm/utils/metadata-builder.js.map +1 -1
- package/dist/esm/utils/provider-detection.js +26 -29
- package/dist/esm/utils/provider-detection.js.map +1 -1
- package/dist/esm/utils/stop-reason-mapper.js +4 -0
- package/dist/esm/utils/stop-reason-mapper.js.map +1 -1
- package/dist/esm/utils/url-builder.js +3 -3
- package/dist/types/core/client/index.d.ts +6 -0
- package/dist/types/core/client/index.d.ts.map +1 -0
- package/dist/types/core/client/manager.d.ts +32 -0
- package/dist/types/core/client/manager.d.ts.map +1 -0
- package/dist/types/core/config/azure-config.d.ts +2 -2
- package/dist/types/core/config/azure-config.d.ts.map +1 -1
- package/dist/types/core/config/index.d.ts +4 -4
- package/dist/types/core/config/index.d.ts.map +1 -1
- package/dist/types/core/config/loader.d.ts +3 -1
- package/dist/types/core/config/loader.d.ts.map +1 -1
- package/dist/types/core/config/manager.d.ts +1 -1
- package/dist/types/core/config/manager.d.ts.map +1 -1
- package/dist/types/core/config/validator.d.ts +1 -12
- package/dist/types/core/config/validator.d.ts.map +1 -1
- package/dist/types/core/middleware/index.d.ts +8 -0
- package/dist/types/core/middleware/index.d.ts.map +1 -0
- package/dist/types/core/middleware/interfaces.d.ts +74 -0
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
- package/dist/types/core/middleware/revenium-client.d.ts +58 -0
- package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
- package/dist/types/core/providers/detector.d.ts +9 -2
- package/dist/types/core/providers/detector.d.ts.map +1 -1
- package/dist/types/core/providers/index.d.ts +2 -2
- package/dist/types/core/providers/index.d.ts.map +1 -1
- package/dist/types/core/tracking/api-client.d.ts +1 -1
- package/dist/types/core/tracking/api-client.d.ts.map +1 -1
- package/dist/types/core/tracking/payload-builder.d.ts +3 -3
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
- package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -114
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/function-parameters.d.ts +2 -23
- package/dist/types/types/function-parameters.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +17 -115
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/openai-augmentation.d.ts +4 -139
- package/dist/types/types/openai-augmentation.d.ts.map +1 -1
- package/dist/types/utils/constants.d.ts +7 -1
- package/dist/types/utils/constants.d.ts.map +1 -1
- package/dist/types/utils/error-handler.d.ts +2 -2
- package/dist/types/utils/error-handler.d.ts.map +1 -1
- package/dist/types/utils/metadata-builder.d.ts +4 -3
- package/dist/types/utils/metadata-builder.d.ts.map +1 -1
- package/dist/types/utils/provider-detection.d.ts +3 -3
- package/dist/types/utils/provider-detection.d.ts.map +1 -1
- package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -1
- package/dist/types/utils/url-builder.d.ts +3 -3
- package/examples/README.md +270 -224
- package/examples/azure/basic.ts +62 -0
- package/examples/azure/responses-basic.ts +45 -0
- package/examples/azure/responses-stream.ts +61 -0
- package/examples/azure/stream.ts +56 -0
- package/examples/getting_started.ts +31 -43
- package/examples/openai/basic.ts +45 -0
- package/examples/openai/metadata.ts +67 -0
- package/examples/openai/responses-basic.ts +44 -0
- package/examples/openai/responses-embed.ts +34 -0
- package/examples/openai/responses-streaming.ts +63 -0
- package/examples/openai/streaming.ts +59 -0
- package/package.json +20 -13
- package/dist/cjs/core/wrapper/index.js +0 -15
- package/dist/cjs/core/wrapper/index.js.map +0 -1
- package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
- package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
- package/dist/cjs/core/wrapper/request-handler.js +0 -317
- package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
- package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
- package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
- package/dist/cjs/utils/azure-model-resolver.js +0 -211
- package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
- package/dist/cjs/utils/request-handler-factory.js +0 -185
- package/dist/cjs/utils/request-handler-factory.js.map +0 -1
- package/dist/esm/core/wrapper/index.js +0 -9
- package/dist/esm/core/wrapper/index.js.map +0 -1
- package/dist/esm/core/wrapper/instance-patcher.js +0 -199
- package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
- package/dist/esm/core/wrapper/request-handler.js +0 -310
- package/dist/esm/core/wrapper/request-handler.js.map +0 -1
- package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
- package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
- package/dist/esm/utils/azure-model-resolver.js +0 -204
- package/dist/esm/utils/azure-model-resolver.js.map +0 -1
- package/dist/esm/utils/request-handler-factory.js +0 -146
- package/dist/esm/utils/request-handler-factory.js.map +0 -1
- package/dist/types/core/wrapper/index.d.ts +0 -8
- package/dist/types/core/wrapper/index.d.ts.map +0 -1
- package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
- package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
- package/dist/types/core/wrapper/request-handler.d.ts +0 -29
- package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
- package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
- package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
- package/dist/types/utils/azure-model-resolver.d.ts +0 -41
- package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
- package/dist/types/utils/request-handler-factory.d.ts +0 -81
- package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
- package/examples/azure-basic.ts +0 -206
- package/examples/azure-responses-basic.ts +0 -233
- package/examples/azure-responses-streaming.ts +0 -255
- package/examples/azure-streaming.ts +0 -209
- package/examples/openai-basic.ts +0 -147
- package/examples/openai-function-calling.ts +0 -259
- package/examples/openai-responses-basic.ts +0 -212
- package/examples/openai-responses-streaming.ts +0 -232
- package/examples/openai-streaming.ts +0 -172
- package/examples/openai-vision.ts +0 -289
- package/src/core/config/azure-config.ts +0 -72
- package/src/core/config/index.ts +0 -23
- package/src/core/config/loader.ts +0 -66
- package/src/core/config/manager.ts +0 -94
- package/src/core/config/validator.ts +0 -89
- package/src/core/providers/detector.ts +0 -159
- package/src/core/providers/index.ts +0 -16
- package/src/core/tracking/api-client.ts +0 -78
- package/src/core/tracking/index.ts +0 -21
- package/src/core/tracking/payload-builder.ts +0 -132
- package/src/core/tracking/usage-tracker.ts +0 -189
- package/src/core/wrapper/index.ts +0 -9
- package/src/core/wrapper/instance-patcher.ts +0 -288
- package/src/core/wrapper/request-handler.ts +0 -423
- package/src/core/wrapper/stream-wrapper.ts +0 -100
- package/src/index.ts +0 -336
- package/src/types/function-parameters.ts +0 -251
- package/src/types/index.ts +0 -313
- package/src/types/openai-augmentation.ts +0 -233
- package/src/types/responses-api.ts +0 -308
- package/src/utils/azure-model-resolver.ts +0 -220
- package/src/utils/constants.ts +0 -21
- package/src/utils/error-handler.ts +0 -251
- package/src/utils/metadata-builder.ts +0 -219
- package/src/utils/provider-detection.ts +0 -257
- package/src/utils/request-handler-factory.ts +0 -285
- package/src/utils/stop-reason-mapper.ts +0 -74
- package/src/utils/type-guards.ts +0 -202
- package/src/utils/url-builder.ts +0 -68
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Handles HTTP communication with the Revenium API.
|
|
5
5
|
* Extracted from tracking.ts for single responsibility.
|
|
6
6
|
*/
|
|
7
|
-
import { getConfig, getLogger } from
|
|
8
|
-
import { buildReveniumUrl } from
|
|
7
|
+
import { getConfig, getLogger } from "../config";
|
|
8
|
+
import { buildReveniumUrl } from "../../utils/url-builder.js";
|
|
9
|
+
import { DEFAULT_REVENIUM_BASE_URL } from "../../utils/constants";
|
|
9
10
|
// Global logger
|
|
10
11
|
const logger = getLogger();
|
|
11
12
|
/**
|
|
@@ -19,10 +20,10 @@ const logger = getLogger();
|
|
|
19
20
|
export async function sendToRevenium(payload) {
|
|
20
21
|
const config = getConfig();
|
|
21
22
|
if (!config)
|
|
22
|
-
return logger.warn(
|
|
23
|
+
return logger.warn("Revenium configuration not found, skipping tracking");
|
|
23
24
|
// Use the new URL builder utility instead of nested conditionals
|
|
24
|
-
const url = buildReveniumUrl(config.reveniumBaseUrl ||
|
|
25
|
-
logger.debug(
|
|
25
|
+
const url = buildReveniumUrl(config.reveniumBaseUrl || DEFAULT_REVENIUM_BASE_URL, "/ai/completions");
|
|
26
|
+
logger.debug("Sending Revenium API request", {
|
|
26
27
|
url,
|
|
27
28
|
operationType: payload.operationType,
|
|
28
29
|
transactionId: payload.transactionId,
|
|
@@ -30,15 +31,15 @@ export async function sendToRevenium(payload) {
|
|
|
30
31
|
totalTokens: payload.totalTokenCount,
|
|
31
32
|
});
|
|
32
33
|
const response = await fetch(url, {
|
|
33
|
-
method:
|
|
34
|
+
method: "POST",
|
|
34
35
|
headers: {
|
|
35
|
-
|
|
36
|
-
Accept:
|
|
37
|
-
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
Accept: "application/json",
|
|
38
|
+
"x-api-key": config.reveniumApiKey,
|
|
38
39
|
},
|
|
39
40
|
body: JSON.stringify(payload),
|
|
40
41
|
});
|
|
41
|
-
logger.debug(
|
|
42
|
+
logger.debug("Revenium API response", {
|
|
42
43
|
status: response.status,
|
|
43
44
|
statusText: response.statusText,
|
|
44
45
|
transactionId: payload.transactionId,
|
|
@@ -46,7 +47,7 @@ export async function sendToRevenium(payload) {
|
|
|
46
47
|
});
|
|
47
48
|
if (!response.ok) {
|
|
48
49
|
const responseText = await response.text();
|
|
49
|
-
logger.error(
|
|
50
|
+
logger.error("Revenium API error response", {
|
|
50
51
|
status: response.status,
|
|
51
52
|
statusText: response.statusText,
|
|
52
53
|
body: responseText,
|
|
@@ -56,7 +57,7 @@ export async function sendToRevenium(payload) {
|
|
|
56
57
|
throw new Error(`Revenium API error: ${response.status} ${response.statusText} - ${responseText}`);
|
|
57
58
|
}
|
|
58
59
|
const responseBody = await response.text();
|
|
59
|
-
logger.debug(
|
|
60
|
+
logger.debug("Revenium tracking successful", {
|
|
60
61
|
transactionId: payload.transactionId,
|
|
61
62
|
operationType: payload.operationType,
|
|
62
63
|
response: responseBody,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../../src/core/tracking/api-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../../src/core/tracking/api-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,gBAAgB;AAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAE3B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAE5E,iEAAiE;IACjE,MAAM,GAAG,GAAG,gBAAgB,CAC1B,MAAM,CAAC,eAAe,IAAI,yBAAyB,EACnD,iBAAiB,CAClB,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;QAC3C,GAAG;QACH,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,eAAe;KACrC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,WAAW,EAAE,MAAM,CAAC,cAAc;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;QACpC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,IAAI,EAAE,YAAY;YAClB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,YAAY,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;QAC3C,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Handles construction of Revenium API payloads.
|
|
5
5
|
* Extracted from tracking.ts for single responsibility.
|
|
6
6
|
*/
|
|
7
|
-
import { randomUUID } from
|
|
8
|
-
import { getLogger } from
|
|
9
|
-
import { mapStopReason } from
|
|
10
|
-
import { buildMetadataFields } from
|
|
11
|
-
import {
|
|
12
|
-
import { getProviderMetadata } from '../providers/index.js';
|
|
7
|
+
import { randomUUID } from "crypto";
|
|
8
|
+
import { getLogger } from "../config";
|
|
9
|
+
import { mapStopReason } from "../../utils/stop-reason-mapper.js";
|
|
10
|
+
import { buildMetadataFields } from "../../utils/metadata-builder.js";
|
|
11
|
+
import { getProviderMetadata } from "../providers";
|
|
13
12
|
// Global logger
|
|
14
13
|
const logger = getLogger();
|
|
15
14
|
/**
|
|
@@ -30,28 +29,19 @@ export function buildPayload(operationType, response, request, startTime, durati
|
|
|
30
29
|
const now = new Date().toISOString();
|
|
31
30
|
const requestTime = new Date(startTime).toISOString();
|
|
32
31
|
const usage = response.usage;
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
: originalModel;
|
|
38
|
-
// Get provider metadata
|
|
32
|
+
// For Azure, use the deployment name as-is
|
|
33
|
+
// The deployment name is what the user provided and should be sent to Revenium
|
|
34
|
+
const modelName = response.model;
|
|
35
|
+
// Get provider metadata (fallback: OpenAI direct)
|
|
39
36
|
const providerMetadata = providerInfo
|
|
40
37
|
? getProviderMetadata(providerInfo)
|
|
41
|
-
: { provider:
|
|
42
|
-
if (providerInfo?.isAzure && resolvedModel !== originalModel) {
|
|
43
|
-
logger.debug('Azure model name resolved for pricing', {
|
|
44
|
-
deployment: originalModel,
|
|
45
|
-
resolved: resolvedModel,
|
|
46
|
-
provider: providerMetadata.provider,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
38
|
+
: { provider: "OpenAI", modelSource: "OPENAI" };
|
|
49
39
|
// Build metadata fields using utility (eliminates repetitive spreading)
|
|
50
40
|
const metadataFields = buildMetadataFields(request.usageMetadata);
|
|
51
41
|
// Common fields for all operations
|
|
52
42
|
const commonPayload = {
|
|
53
|
-
costType:
|
|
54
|
-
model:
|
|
43
|
+
costType: "AI",
|
|
44
|
+
model: modelName, // Use model/deployment name as-is
|
|
55
45
|
responseTime: now,
|
|
56
46
|
requestDuration: duration,
|
|
57
47
|
provider: providerMetadata.provider,
|
|
@@ -63,42 +53,47 @@ export function buildPayload(operationType, response, request, startTime, durati
|
|
|
63
53
|
totalTokenCount: usage.total_tokens,
|
|
64
54
|
// Metadata fields (processed by utility)
|
|
65
55
|
...metadataFields,
|
|
66
|
-
// Fixed middleware source identifier
|
|
67
|
-
middlewareSource:
|
|
56
|
+
// Fixed middleware source identifier (spec format: revenium-{provider}-{language})
|
|
57
|
+
middlewareSource: "revenium-openai-node",
|
|
68
58
|
// Backend calculates costs
|
|
69
59
|
inputTokenCost: undefined,
|
|
70
60
|
outputTokenCost: undefined,
|
|
71
61
|
totalCost: undefined,
|
|
72
62
|
};
|
|
73
63
|
// Operation-specific fields
|
|
74
|
-
if (operationType !==
|
|
64
|
+
if (operationType !== "CHAT") {
|
|
75
65
|
// For embeddings, we don't need the response cast since we use commonPayload
|
|
76
66
|
return {
|
|
77
67
|
...commonPayload,
|
|
78
|
-
operationType:
|
|
68
|
+
operationType: "EMBED",
|
|
79
69
|
transactionId: `embed-${randomUUID()}`,
|
|
80
70
|
outputTokenCount: 0,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
// Embeddings don't support reasoning or caching
|
|
72
|
+
reasoningTokenCount: undefined,
|
|
73
|
+
cacheCreationTokenCount: undefined,
|
|
74
|
+
cacheReadTokenCount: undefined,
|
|
75
|
+
stopReason: "END",
|
|
85
76
|
isStreamed: false,
|
|
86
|
-
timeToFirstToken:
|
|
77
|
+
timeToFirstToken: undefined, // Not applicable for embeddings
|
|
87
78
|
};
|
|
88
79
|
}
|
|
89
80
|
const chatResponse = response;
|
|
90
81
|
const chatUsage = chatResponse.usage;
|
|
91
82
|
return {
|
|
92
83
|
...commonPayload,
|
|
93
|
-
operationType:
|
|
84
|
+
operationType: "CHAT",
|
|
94
85
|
transactionId: chatResponse.id || `chat-${randomUUID()}`,
|
|
95
86
|
outputTokenCount: chatUsage.completion_tokens || 0,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
87
|
+
// Leave null for models without reasoning capabilities (API spec)
|
|
88
|
+
reasoningTokenCount: chatUsage.reasoning_tokens ?? undefined,
|
|
89
|
+
// OpenAI doesn't report cache creation tokens
|
|
90
|
+
cacheCreationTokenCount: undefined,
|
|
91
|
+
// Only include if provider reports cache hits
|
|
92
|
+
cacheReadTokenCount: chatUsage.cached_tokens ?? undefined,
|
|
99
93
|
stopReason: mapStopReason(chatResponse.choices?.[0]?.finish_reason, logger),
|
|
100
94
|
isStreamed: Boolean(request.stream),
|
|
101
|
-
|
|
95
|
+
// TODO: Implement real TTFB tracking for streaming requests
|
|
96
|
+
timeToFirstToken: undefined,
|
|
102
97
|
};
|
|
103
98
|
}
|
|
104
99
|
//# sourceMappingURL=payload-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload-builder.js","sourceRoot":"","sources":["../../../../src/core/tracking/payload-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAQpC,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"payload-builder.js","sourceRoot":"","sources":["../../../../src/core/tracking/payload-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* High-level tracking functions that combine payload building and API communication.
|
|
5
5
|
* Extracted from tracking.ts for better organization.
|
|
6
6
|
*/
|
|
7
|
-
import { getLogger } from
|
|
8
|
-
import { sendToRevenium } from
|
|
9
|
-
import { buildPayload } from
|
|
10
|
-
import { safeAsyncOperation } from
|
|
7
|
+
import { getLogger } from "../config";
|
|
8
|
+
import { sendToRevenium } from "./api-client.js";
|
|
9
|
+
import { buildPayload } from "./payload-builder.js";
|
|
10
|
+
import { safeAsyncOperation } from "../../utils/error-handler.js";
|
|
11
11
|
// Global logger
|
|
12
12
|
const logger = getLogger();
|
|
13
13
|
/**
|
|
@@ -15,12 +15,12 @@ const logger = getLogger();
|
|
|
15
15
|
*/
|
|
16
16
|
export async function sendReveniumMetrics(response, request, startTime, duration, providerInfo) {
|
|
17
17
|
await safeAsyncOperation(async () => {
|
|
18
|
-
const payload = buildPayload(
|
|
18
|
+
const payload = buildPayload("CHAT", response, request, startTime, duration, providerInfo);
|
|
19
19
|
await sendToRevenium(payload);
|
|
20
|
-
},
|
|
20
|
+
}, "Chat completion tracking", {
|
|
21
21
|
logError: true,
|
|
22
22
|
rethrow: false, // Don't rethrow to maintain fire-and-forget behavior
|
|
23
|
-
messagePrefix:
|
|
23
|
+
messagePrefix: "Chat completion tracking failed: ",
|
|
24
24
|
}, logger);
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
@@ -28,12 +28,12 @@ export async function sendReveniumMetrics(response, request, startTime, duration
|
|
|
28
28
|
*/
|
|
29
29
|
export async function sendReveniumEmbeddingsMetrics(response, request, startTime, duration, providerInfo) {
|
|
30
30
|
await safeAsyncOperation(async () => {
|
|
31
|
-
const payload = buildPayload(
|
|
31
|
+
const payload = buildPayload("EMBED", response, request, startTime, duration, providerInfo);
|
|
32
32
|
await sendToRevenium(payload);
|
|
33
|
-
},
|
|
33
|
+
}, "Embeddings tracking", {
|
|
34
34
|
logError: true,
|
|
35
35
|
rethrow: false, // Don't rethrow to maintain fire-and-forget behavior
|
|
36
|
-
messagePrefix:
|
|
36
|
+
messagePrefix: "Embeddings tracking failed: ",
|
|
37
37
|
}, logger);
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
@@ -47,8 +47,12 @@ export function trackUsageAsync(trackingData) {
|
|
|
47
47
|
prompt_tokens: trackingData.promptTokens,
|
|
48
48
|
completion_tokens: trackingData.completionTokens,
|
|
49
49
|
total_tokens: trackingData.totalTokens,
|
|
50
|
-
...(trackingData.reasoningTokens && {
|
|
51
|
-
|
|
50
|
+
...(trackingData.reasoningTokens && {
|
|
51
|
+
reasoning_tokens: trackingData.reasoningTokens,
|
|
52
|
+
}),
|
|
53
|
+
...(trackingData.cachedTokens && {
|
|
54
|
+
cached_tokens: trackingData.cachedTokens,
|
|
55
|
+
}),
|
|
52
56
|
},
|
|
53
57
|
choices: [
|
|
54
58
|
{
|
|
@@ -65,15 +69,15 @@ export function trackUsageAsync(trackingData) {
|
|
|
65
69
|
const startTime = Date.now() - trackingData.duration;
|
|
66
70
|
sendReveniumMetrics(mockResponse, mockRequest, startTime, trackingData.duration, trackingData.providerInfo)
|
|
67
71
|
.then(() => {
|
|
68
|
-
logger.debug(
|
|
72
|
+
logger.debug("Usage tracking completed successfully", {
|
|
69
73
|
requestId: trackingData.requestId,
|
|
70
74
|
model: trackingData.model,
|
|
71
75
|
totalTokens: trackingData.totalTokens,
|
|
72
76
|
isStreamed: trackingData.isStreamed,
|
|
73
77
|
});
|
|
74
78
|
})
|
|
75
|
-
.catch(error => {
|
|
76
|
-
logger.warn(
|
|
79
|
+
.catch((error) => {
|
|
80
|
+
logger.warn("Usage tracking failed", {
|
|
77
81
|
error: error instanceof Error ? error.message : String(error),
|
|
78
82
|
requestId: trackingData.requestId,
|
|
79
83
|
model: trackingData.model,
|
|
@@ -91,21 +95,21 @@ export function trackEmbeddingsUsageAsync(trackingData) {
|
|
|
91
95
|
total_tokens: trackingData.totalTokens,
|
|
92
96
|
},
|
|
93
97
|
data: [], // Mock empty data array for type compliance
|
|
94
|
-
object:
|
|
98
|
+
object: "list",
|
|
95
99
|
};
|
|
96
100
|
const mockRequest = {
|
|
97
101
|
model: trackingData.model,
|
|
98
|
-
input:
|
|
102
|
+
input: "", // Mock empty input for type compliance
|
|
99
103
|
usageMetadata: trackingData.usageMetadata,
|
|
100
104
|
};
|
|
101
105
|
sendReveniumEmbeddingsMetrics(mockResponse, mockRequest, trackingData.requestStartTime, trackingData.duration, trackingData.providerInfo)
|
|
102
106
|
.then(() => {
|
|
103
|
-
logger.debug(
|
|
107
|
+
logger.debug("Embeddings tracking completed successfully", {
|
|
104
108
|
transactionId: trackingData.transactionId,
|
|
105
109
|
});
|
|
106
110
|
})
|
|
107
|
-
.catch(error => {
|
|
108
|
-
logger.warn(
|
|
111
|
+
.catch((error) => {
|
|
112
|
+
logger.warn("Embeddings tracking failed", {
|
|
109
113
|
error: error instanceof Error ? error.message : String(error),
|
|
110
114
|
transactionId: trackingData.transactionId,
|
|
111
115
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../../../../src/core/tracking/usage-tracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"usage-tracker.js","sourceRoot":"","sources":["../../../../src/core/tracking/usage-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -2,174 +2,26 @@
|
|
|
2
2
|
* Revenium OpenAI Middleware for TypeScript
|
|
3
3
|
*
|
|
4
4
|
* This middleware tracks OpenAI usage and sends metrics to Revenium.
|
|
5
|
-
* Uses hybrid initialization: auto-initializes on import with graceful fallback to manual init.
|
|
6
|
-
*
|
|
7
|
-
* Environment Variables:
|
|
8
|
-
* REVENIUM_METERING_API_KEY=hak_your_api_key
|
|
9
|
-
* REVENIUM_METERING_BASE_URL=https://api.revenium.io (optional)
|
|
10
|
-
* OPENAI_API_KEY=sk_your_openai_key
|
|
11
|
-
*
|
|
12
|
-
* Simple Usage (auto-initialization):
|
|
13
|
-
* import { patchOpenAIInstance } from '@revenium/openai';
|
|
14
|
-
* import OpenAI from 'openai';
|
|
15
|
-
*
|
|
16
|
-
* const openai = patchOpenAIInstance(new OpenAI());
|
|
17
|
-
* // Auto-initializes from environment variables
|
|
18
|
-
*
|
|
19
|
-
* Advanced Usage (explicit initialization):
|
|
20
|
-
* import { initializeReveniumFromEnv, patchOpenAIInstance } from '@revenium/openai';
|
|
21
|
-
* import OpenAI from 'openai';
|
|
22
|
-
*
|
|
23
|
-
* const result = initializeReveniumFromEnv();
|
|
24
|
-
* if (!result.success) {
|
|
25
|
-
* throw new Error(result.message);
|
|
26
|
-
* }
|
|
27
|
-
* const openai = patchOpenAIInstance(new OpenAI());
|
|
28
|
-
*
|
|
29
|
-
* const response = await openai.chat.completions.create({
|
|
30
|
-
* model: 'gpt-4',
|
|
31
|
-
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
32
|
-
* usageMetadata: {
|
|
33
|
-
* subscriber: {
|
|
34
|
-
* id: 'user-123',
|
|
35
|
-
* email: 'user@my-org.com'
|
|
36
|
-
* },
|
|
37
|
-
* organizationId: 'my-org',
|
|
38
|
-
* productId: 'my-app'
|
|
39
|
-
* }
|
|
40
|
-
* });
|
|
41
5
|
*/
|
|
42
6
|
// Import type augmentations to extend OpenAI types with usageMetadata
|
|
43
|
-
import
|
|
44
|
-
// Import from new modular structure
|
|
45
|
-
import { setConfig, validateConfig, initializeConfig, getConfig, getLogger, } from './core/config/index.js';
|
|
46
|
-
import { patchOpenAI } from './core/wrapper/index.js';
|
|
47
|
-
// Track initialization state
|
|
48
|
-
let isInitialized = false;
|
|
49
|
-
let autoInitAttempted = false;
|
|
7
|
+
import "./types/openai-augmentation.js";
|
|
50
8
|
// Note: ExtendedChatCompletionCreateParams and ExtendedEmbeddingCreateParams are no longer exported
|
|
51
9
|
// as they have been replaced with seamless TypeScript module augmentation. The usageMetadata field
|
|
52
10
|
// is now natively available on OpenAI's types without requiring additional imports.
|
|
53
|
-
// Export tracking functions
|
|
54
|
-
export { trackUsageAsync, trackEmbeddingsUsageAsync } from './core/tracking/index.js';
|
|
55
|
-
// Export provider detection functions
|
|
56
|
-
export { detectProvider, hasAzureConfig, validateAzureConfig, getProviderMetadata, } from './core/providers/index.js';
|
|
57
|
-
export { getProviderInfo } from './core/wrapper/index.js';
|
|
58
|
-
// Export Azure model resolution functions
|
|
59
|
-
export { resolveAzureModelName, clearModelNameCache, getModelNameCacheStats, batchResolveModelNames, wouldTransformDeploymentName, } from './utils/azure-model-resolver.js';
|
|
60
|
-
// Global logger
|
|
61
|
-
const logger = getLogger();
|
|
62
|
-
/**
|
|
63
|
-
* Initialize Revenium middleware with configuration
|
|
64
|
-
*/
|
|
65
|
-
export function initializeRevenium(config) {
|
|
66
|
-
// Check if already initialized to prevent duplicate initialization
|
|
67
|
-
if (isInitialized) {
|
|
68
|
-
return {
|
|
69
|
-
success: true,
|
|
70
|
-
message: 'Revenium middleware already initialized',
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
try {
|
|
74
|
-
// Apply default base URL if not provided
|
|
75
|
-
const configWithDefaults = {
|
|
76
|
-
...config,
|
|
77
|
-
reveniumBaseUrl: config.reveniumBaseUrl || 'https://api.revenium.io',
|
|
78
|
-
};
|
|
79
|
-
validateConfig(configWithDefaults);
|
|
80
|
-
setConfig(configWithDefaults);
|
|
81
|
-
// Mark as initialized
|
|
82
|
-
isInitialized = true;
|
|
83
|
-
// Patch OpenAI prototype methods
|
|
84
|
-
patchOpenAI();
|
|
85
|
-
return {
|
|
86
|
-
success: true,
|
|
87
|
-
message: 'Revenium middleware initialized successfully',
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
isInitialized = false;
|
|
92
|
-
return {
|
|
93
|
-
success: false,
|
|
94
|
-
message: error instanceof Error ? error.message : 'Unknown initialization error',
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Initialize Revenium middleware from environment variables
|
|
100
|
-
*/
|
|
101
|
-
export function initializeReveniumFromEnv() {
|
|
102
|
-
// Check if already initialized to prevent duplicate initialization
|
|
103
|
-
if (isInitialized) {
|
|
104
|
-
return {
|
|
105
|
-
success: true,
|
|
106
|
-
message: 'Revenium middleware already initialized',
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const envSuccess = initializeConfig();
|
|
110
|
-
if (!envSuccess) {
|
|
111
|
-
isInitialized = false;
|
|
112
|
-
return {
|
|
113
|
-
success: false,
|
|
114
|
-
message: 'Failed to load configuration from environment variables. Check REVENIUM_METERING_API_KEY and REVENIUM_METERING_BASE_URL.',
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// Mark as initialized
|
|
118
|
-
isInitialized = true;
|
|
119
|
-
// Patch OpenAI prototype methods
|
|
120
|
-
patchOpenAI();
|
|
121
|
-
return {
|
|
122
|
-
success: true,
|
|
123
|
-
message: 'Revenium middleware initialized from environment',
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
11
|
/**
|
|
127
|
-
*
|
|
12
|
+
* Main API
|
|
128
13
|
*/
|
|
129
|
-
export {
|
|
14
|
+
export { Initialize, GetClient, IsInitialized, Reset, Configure, } from "./core/client";
|
|
130
15
|
/**
|
|
131
|
-
*
|
|
132
|
-
* Attempts to initialize from environment variables on module load.
|
|
133
|
-
* If it fails, logs a debug message but doesn't throw - allows manual configuration later.
|
|
16
|
+
* Middleware classes
|
|
134
17
|
*/
|
|
135
|
-
|
|
136
|
-
if (autoInitAttempted || isInitialized)
|
|
137
|
-
return;
|
|
138
|
-
autoInitAttempted = true;
|
|
139
|
-
try {
|
|
140
|
-
const result = initializeReveniumFromEnv();
|
|
141
|
-
if (result.success) {
|
|
142
|
-
// Auto-init succeeded - log debug message
|
|
143
|
-
logger.debug('Revenium middleware auto-initialized from environment variables');
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// Auto-init failed - log debug message but don't throw
|
|
147
|
-
logger.debug('Auto-initialization failed, manual initialization required:', result.message);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
// Unexpected error during auto-init - log but don't throw
|
|
152
|
-
logger.debug('Auto-initialization encountered error:', error instanceof Error ? error.message : String(error));
|
|
153
|
-
}
|
|
154
|
-
}
|
|
18
|
+
export { ReveniumOpenAI, ChatInterface, CompletionsInterface, EmbeddingsInterface, ResponsesInterface, StreamingWrapper, } from "./core/middleware";
|
|
155
19
|
/**
|
|
156
|
-
*
|
|
20
|
+
* Tracking functions (for advanced use cases)
|
|
157
21
|
*/
|
|
158
|
-
export
|
|
159
|
-
return isInitialized;
|
|
160
|
-
}
|
|
22
|
+
export { trackUsageAsync, trackEmbeddingsUsageAsync } from "./core/tracking";
|
|
161
23
|
/**
|
|
162
|
-
*
|
|
24
|
+
* Provider detection functions
|
|
163
25
|
*/
|
|
164
|
-
export
|
|
165
|
-
const config = getConfig();
|
|
166
|
-
return {
|
|
167
|
-
initialized: isInitialized,
|
|
168
|
-
hasConfig: !!config,
|
|
169
|
-
hasApiKey: !!config?.reveniumApiKey,
|
|
170
|
-
autoInitAttempted,
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
// Perform auto-initialization when module is imported
|
|
174
|
-
attemptAutoInitialization();
|
|
26
|
+
export { detectProvider, hasAzureConfig, validateAzureConfig, getProviderMetadata, } from "./core/providers";
|
|
175
27
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,OAAO,gCAAgC,CAAC;AA8DxC,oGAAoG;AACpG,mGAAmG;AACnG,oFAAoF;AAEpF;;GAEG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE7E;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
|
package/dist/esm/types/index.js
CHANGED
|
@@ -5,22 +5,14 @@
|
|
|
5
5
|
* This module exports all core types used throughout the application.
|
|
6
6
|
*/
|
|
7
7
|
// Re-export function parameter types
|
|
8
|
-
export * from
|
|
8
|
+
export * from "./function-parameters.js";
|
|
9
9
|
// Re-export Responses API types
|
|
10
|
-
export * from
|
|
10
|
+
export * from "./responses-api.js";
|
|
11
11
|
/**
|
|
12
12
|
* Supported AI providers
|
|
13
13
|
*
|
|
14
14
|
* Enumeration of AI providers supported by the Revenium middleware.
|
|
15
15
|
* Used for automatic detection, routing, and provider-specific handling.
|
|
16
|
-
*
|
|
17
|
-
* @public
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* if (providerInfo.provider === Provider.AZURE_OPENAI) {
|
|
21
|
-
* console.log('Using Azure OpenAI');
|
|
22
|
-
* }
|
|
23
|
-
* ```
|
|
24
16
|
*/
|
|
25
17
|
export var Provider;
|
|
26
18
|
(function (Provider) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qCAAqC;AACrC,cAAc,0BAA0B,CAAC;AAEzC,gCAAgC;AAChC,cAAc,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qCAAqC;AACrC,cAAc,0BAA0B,CAAC;AAEzC,gCAAgC;AAChC,cAAc,oBAAoB,CAAC;AAiFnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
|
|
@@ -1,54 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TypeScript module augmentation for OpenAI SDK
|
|
3
|
-
*
|
|
4
|
-
* This file extends OpenAI's existing types to include the usageMetadata field
|
|
5
|
-
* through TypeScript's declaration merging feature. This provides seamless
|
|
6
|
-
* integration with the OpenAI SDK, allowing developers to use usageMetadata
|
|
7
|
-
* directly in OpenAI API calls without type casting or additional imports.
|
|
8
|
-
*
|
|
9
|
-
* The augmentation covers all major OpenAI API endpoints including:
|
|
10
|
-
* - Chat completions (streaming and non-streaming)
|
|
11
|
-
* - Embeddings
|
|
12
|
-
* - Future API endpoints as they become available
|
|
13
|
-
*
|
|
14
|
-
* @fileoverview OpenAI SDK type augmentation for Revenium middleware
|
|
15
|
-
* @author Revenium
|
|
16
|
-
* @since 1.0.0
|
|
17
|
-
*
|
|
18
|
-
* @example Basic usage with chat completions
|
|
19
|
-
* ```typescript
|
|
20
|
-
* import '@revenium/openai';
|
|
21
|
-
* import OpenAI from 'openai';
|
|
22
|
-
*
|
|
23
|
-
* const openai = new OpenAI();
|
|
24
|
-
*
|
|
25
|
-
* const response = await openai.chat.completions.create({
|
|
26
|
-
* model: 'gpt-4o-mini',
|
|
27
|
-
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
28
|
-
* usageMetadata: { // TypeScript recognizes this natively
|
|
29
|
-
* subscriber: {
|
|
30
|
-
* id: 'user-123',
|
|
31
|
-
* email: 'user@my-company.com'
|
|
32
|
-
* },
|
|
33
|
-
* organizationId: 'my-company',
|
|
34
|
-
* productId: 'chat-app',
|
|
35
|
-
* taskType: 'customer-support'
|
|
36
|
-
* }
|
|
37
|
-
* });
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @example Usage with embeddings
|
|
41
|
-
* ```typescript
|
|
42
|
-
* const embedding = await openai.embeddings.create({
|
|
43
|
-
* model: 'text-embedding-ada-002',
|
|
44
|
-
* input: 'Text to embed',
|
|
45
|
-
* usageMetadata: {
|
|
46
|
-
* subscriber: { id: 'user-456' },
|
|
47
|
-
* productId: 'search-engine',
|
|
48
|
-
* taskType: 'document-indexing'
|
|
49
|
-
* }
|
|
50
|
-
* });
|
|
51
|
-
* ```
|
|
52
3
|
*/
|
|
53
4
|
export {};
|
|
54
5
|
//# sourceMappingURL=openai-augmentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-augmentation.js","sourceRoot":"","sources":["../../../src/types/openai-augmentation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openai-augmentation.js","sourceRoot":"","sources":["../../../src/types/openai-augmentation.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|