@revenium/perplexity 2.0.4 → 2.0.5
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/CHANGELOG.md +32 -33
- package/README.md +120 -101
- package/SECURITY.md +34 -0
- package/dist/cjs/constants/models.js +38 -0
- package/dist/cjs/constants/models.js.map +1 -0
- package/dist/cjs/core/client/index.js +13 -0
- package/dist/cjs/core/client/index.js.map +1 -0
- package/dist/cjs/core/client/manager.js +85 -0
- package/dist/cjs/core/client/manager.js.map +1 -0
- package/dist/cjs/core/config/index.js +21 -0
- package/dist/cjs/core/config/index.js.map +1 -0
- package/dist/cjs/core/config/loader.js +48 -0
- package/dist/cjs/core/config/loader.js.map +1 -0
- package/dist/cjs/core/config/manager.js +77 -0
- package/dist/cjs/core/config/manager.js.map +1 -0
- package/dist/cjs/core/config/validator.js +45 -0
- package/dist/cjs/core/config/validator.js.map +1 -0
- package/dist/cjs/core/middleware/index.js +14 -0
- package/dist/cjs/core/middleware/index.js.map +1 -0
- package/dist/cjs/core/middleware/interfaces.js +94 -0
- package/dist/cjs/core/middleware/interfaces.js.map +1 -0
- package/dist/cjs/core/middleware/revenium-client.js +44 -0
- package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
- package/dist/cjs/core/middleware/streaming-wrapper.js +80 -0
- package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -0
- package/dist/cjs/core/providers/detector.js +38 -0
- package/dist/cjs/core/providers/detector.js.map +1 -0
- package/dist/cjs/core/providers/index.js +14 -0
- package/dist/cjs/core/providers/index.js.map +1 -0
- package/dist/cjs/core/tracking/api-client.js +67 -0
- package/dist/cjs/core/tracking/api-client.js.map +1 -0
- package/dist/cjs/core/tracking/index.js +21 -0
- package/dist/cjs/core/tracking/index.js.map +1 -0
- package/dist/cjs/core/tracking/payload-builder.js +95 -0
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
- package/dist/cjs/core/tracking/usage-tracker.js +83 -0
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
- package/dist/cjs/index.js +60 -59
- package/dist/cjs/index.js.map +1 -1
- 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 +20 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/utils/constants.js +20 -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 +191 -0
- package/dist/cjs/utils/metadata-builder.js.map +1 -0
- package/dist/cjs/utils/stop-reason-mapper.js +74 -0
- package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
- package/dist/cjs/utils/transaction-id.js +19 -0
- package/dist/cjs/utils/transaction-id.js.map +1 -0
- package/dist/cjs/utils/url-builder.js +57 -0
- package/dist/cjs/utils/url-builder.js.map +1 -0
- package/dist/esm/constants/models.js +35 -0
- package/dist/esm/constants/models.js.map +1 -0
- package/dist/esm/core/client/index.js +5 -0
- package/dist/esm/core/client/index.js.map +1 -0
- package/dist/esm/core/client/manager.js +78 -0
- package/dist/esm/core/client/manager.js.map +1 -0
- package/dist/esm/core/config/index.js +11 -0
- package/dist/esm/core/config/index.js.map +1 -0
- package/dist/esm/core/config/loader.js +45 -0
- package/dist/esm/core/config/loader.js.map +1 -0
- package/dist/esm/core/config/manager.js +70 -0
- package/dist/esm/core/config/manager.js.map +1 -0
- package/dist/esm/core/config/validator.js +42 -0
- package/dist/esm/core/config/validator.js.map +1 -0
- package/dist/esm/core/middleware/index.js +7 -0
- package/dist/esm/core/middleware/index.js.map +1 -0
- package/dist/esm/core/middleware/interfaces.js +89 -0
- package/dist/esm/core/middleware/interfaces.js.map +1 -0
- package/dist/esm/core/middleware/revenium-client.js +37 -0
- package/dist/esm/core/middleware/revenium-client.js.map +1 -0
- package/dist/esm/core/middleware/streaming-wrapper.js +76 -0
- package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -0
- package/dist/esm/core/providers/detector.js +34 -0
- package/dist/esm/core/providers/detector.js.map +1 -0
- package/dist/esm/core/providers/index.js +9 -0
- package/dist/esm/core/providers/index.js.map +1 -0
- package/dist/esm/core/tracking/api-client.js +64 -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 +92 -0
- package/dist/esm/core/tracking/payload-builder.js.map +1 -0
- package/dist/esm/core/tracking/usage-tracker.js +79 -0
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
- package/dist/esm/index.js +46 -39
- package/dist/esm/index.js.map +1 -1
- 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 +6 -2
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/constants.js +17 -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 +183 -0
- package/dist/esm/utils/metadata-builder.js.map +1 -0
- package/dist/esm/utils/stop-reason-mapper.js +69 -0
- package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
- package/dist/esm/utils/transaction-id.js +16 -0
- package/dist/esm/utils/transaction-id.js.map +1 -0
- package/dist/esm/utils/url-builder.js +53 -0
- package/dist/esm/utils/url-builder.js.map +1 -0
- package/dist/types/constants/models.d.ts +39 -0
- package/dist/types/constants/models.d.ts.map +1 -0
- package/dist/types/core/client/index.d.ts +5 -0
- package/dist/types/core/client/index.d.ts.map +1 -0
- package/dist/types/core/client/manager.d.ts +44 -0
- package/dist/types/core/client/manager.d.ts.map +1 -0
- package/dist/types/core/config/index.d.ts +10 -0
- package/dist/types/core/config/index.d.ts.map +1 -0
- package/dist/types/core/config/loader.d.ts +13 -0
- package/dist/types/core/config/loader.d.ts.map +1 -0
- package/dist/types/core/config/manager.d.ts +28 -0
- package/dist/types/core/config/manager.d.ts.map +1 -0
- package/dist/types/core/config/validator.d.ts +12 -0
- package/dist/types/core/config/validator.d.ts.map +1 -0
- package/dist/types/core/middleware/index.d.ts +7 -0
- package/dist/types/core/middleware/index.d.ts.map +1 -0
- package/dist/types/core/middleware/interfaces.d.ts +35 -0
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
- package/dist/types/core/middleware/revenium-client.d.ts +25 -0
- package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
- package/dist/types/core/middleware/streaming-wrapper.d.ts +21 -0
- package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -0
- package/dist/types/core/providers/detector.d.ts +24 -0
- package/dist/types/core/providers/detector.d.ts.map +1 -0
- package/dist/types/core/providers/index.d.ts +8 -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 +30 -0
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
- package/dist/types/index.d.ts +56 -27
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/function-parameters.d.ts +185 -0
- package/dist/types/types/function-parameters.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +108 -129
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utils/constants.d.ts +9 -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 +65 -0
- package/dist/types/utils/metadata-builder.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/transaction-id.d.ts +14 -0
- package/dist/types/utils/transaction-id.d.ts.map +1 -0
- package/dist/types/utils/url-builder.d.ts +22 -0
- package/dist/types/utils/url-builder.d.ts.map +1 -0
- package/examples/README.md +124 -220
- package/examples/advanced.ts +123 -0
- package/examples/basic.ts +32 -37
- package/examples/getting_started.ts +26 -49
- package/examples/metadata.ts +51 -48
- package/examples/stream.ts +53 -0
- package/package.json +9 -10
- package/dist/cjs/constants.js +0 -70
- package/dist/cjs/constants.js.map +0 -1
- package/dist/cjs/core/config/perplexity-config.js +0 -45
- package/dist/cjs/core/config/perplexity-config.js.map +0 -1
- package/dist/cjs/core/config/revenium-config.js +0 -80
- package/dist/cjs/core/config/revenium-config.js.map +0 -1
- package/dist/cjs/core/tracking/metering.js +0 -211
- package/dist/cjs/core/tracking/metering.js.map +0 -1
- package/dist/cjs/core/wrapper/perplexity-client.js +0 -187
- package/dist/cjs/core/wrapper/perplexity-client.js.map +0 -1
- package/dist/cjs/utils/logger.js +0 -23
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/esm/constants.js +0 -67
- package/dist/esm/constants.js.map +0 -1
- package/dist/esm/core/config/perplexity-config.js +0 -40
- package/dist/esm/core/config/perplexity-config.js.map +0 -1
- package/dist/esm/core/config/revenium-config.js +0 -72
- package/dist/esm/core/config/revenium-config.js.map +0 -1
- package/dist/esm/core/tracking/metering.js +0 -206
- package/dist/esm/core/tracking/metering.js.map +0 -1
- package/dist/esm/core/wrapper/perplexity-client.js +0 -180
- package/dist/esm/core/wrapper/perplexity-client.js.map +0 -1
- package/dist/esm/utils/logger.js +0 -20
- package/dist/esm/utils/logger.js.map +0 -1
- package/dist/types/constants.d.ts +0 -67
- package/dist/types/constants.d.ts.map +0 -1
- package/dist/types/core/config/perplexity-config.d.ts +0 -24
- package/dist/types/core/config/perplexity-config.d.ts.map +0 -1
- package/dist/types/core/config/revenium-config.d.ts +0 -37
- package/dist/types/core/config/revenium-config.d.ts.map +0 -1
- package/dist/types/core/tracking/metering.d.ts +0 -31
- package/dist/types/core/tracking/metering.d.ts.map +0 -1
- package/dist/types/core/wrapper/perplexity-client.d.ts +0 -32
- package/dist/types/core/wrapper/perplexity-client.d.ts.map +0 -1
- package/dist/types/utils/logger.d.ts +0 -10
- package/dist/types/utils/logger.d.ts.map +0 -1
- package/examples/advanced-features.ts +0 -148
- package/examples/chat.ts +0 -73
- package/examples/streaming.ts +0 -50
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration Loader Module
|
|
4
|
+
*
|
|
5
|
+
* Handles loading configuration from environment variables.
|
|
6
|
+
* Separated from validation and management for single responsibility.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadConfigFromEnv = loadConfigFromEnv;
|
|
10
|
+
const dotenv_1 = require("dotenv");
|
|
11
|
+
/**
|
|
12
|
+
* Default URLs for consistency with other middleware
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_REVENIUM_BASE_URL = "https://api.revenium.ai";
|
|
15
|
+
const DEFAULT_PERPLEXITY_BASE_URL = "https://api.perplexity.ai";
|
|
16
|
+
/**
|
|
17
|
+
* Flag to track if .env file has been loaded
|
|
18
|
+
*/
|
|
19
|
+
let envFileLoaded = false;
|
|
20
|
+
/**
|
|
21
|
+
* Load configuration from environment variables
|
|
22
|
+
* Automatically loads .env file from current directory if present
|
|
23
|
+
*/
|
|
24
|
+
function loadConfigFromEnv() {
|
|
25
|
+
if (!envFileLoaded) {
|
|
26
|
+
(0, dotenv_1.config)();
|
|
27
|
+
envFileLoaded = true;
|
|
28
|
+
}
|
|
29
|
+
const reveniumApiKey = process.env.REVENIUM_METERING_API_KEY || process.env.REVENIUM_API_KEY;
|
|
30
|
+
const reveniumBaseUrl = process.env.REVENIUM_METERING_BASE_URL ||
|
|
31
|
+
process.env.REVENIUM_BASE_URL ||
|
|
32
|
+
DEFAULT_REVENIUM_BASE_URL;
|
|
33
|
+
const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
34
|
+
const perplexityBaseUrl = process.env.PERPLEXITY_API_BASE_URL || DEFAULT_PERPLEXITY_BASE_URL;
|
|
35
|
+
const debug = process.env.REVENIUM_DEBUG === "true";
|
|
36
|
+
if (!reveniumApiKey)
|
|
37
|
+
return null;
|
|
38
|
+
if (!perplexityApiKey)
|
|
39
|
+
return null;
|
|
40
|
+
return {
|
|
41
|
+
reveniumApiKey,
|
|
42
|
+
reveniumBaseUrl,
|
|
43
|
+
perplexityApiKey,
|
|
44
|
+
perplexityBaseUrl,
|
|
45
|
+
debug,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/core/config/loader.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoBH,8CA2BC;AA5CD,mCAA8C;AAE9C;;GAEG;AACH,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AAC5D,MAAM,2BAA2B,GAAG,2BAA2B,CAAC;AAEhE;;GAEG;AACH,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAA,eAAU,GAAE,CAAC;QACb,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACxE,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,yBAAyB,CAAC;IAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,iBAAiB,GACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,2BAA2B,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC;IAEpD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,cAAc;QACd,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration Manager Module
|
|
4
|
+
*
|
|
5
|
+
* Handles global configuration state management and logging.
|
|
6
|
+
* Aligned with OpenAI modular implementation.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.defaultLogger = void 0;
|
|
10
|
+
exports.getConfig = getConfig;
|
|
11
|
+
exports.setConfig = setConfig;
|
|
12
|
+
exports.getLogger = getLogger;
|
|
13
|
+
exports.initializeConfig = initializeConfig;
|
|
14
|
+
const loader_js_1 = require("./loader.js");
|
|
15
|
+
const validator_js_1 = require("./validator.js");
|
|
16
|
+
/**
|
|
17
|
+
* Global configuration instance
|
|
18
|
+
*/
|
|
19
|
+
let globalConfig = null;
|
|
20
|
+
/**
|
|
21
|
+
* Default console logger implementation
|
|
22
|
+
*/
|
|
23
|
+
exports.defaultLogger = {
|
|
24
|
+
debug: (message, ...args) => {
|
|
25
|
+
if (globalConfig?.debug || process.env.REVENIUM_DEBUG === "true") {
|
|
26
|
+
console.debug(`[Revenium Debug] ${message}`, ...args);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
info: (message, ...args) => {
|
|
30
|
+
console.info(`[Revenium] ${message}`, ...args);
|
|
31
|
+
},
|
|
32
|
+
warn: (message, ...args) => {
|
|
33
|
+
console.warn(`[Revenium Warning] ${message}`, ...args);
|
|
34
|
+
},
|
|
35
|
+
error: (message, ...args) => {
|
|
36
|
+
console.error(`[Revenium Error] ${message}`, ...args);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
let globalLogger = exports.defaultLogger;
|
|
40
|
+
/**
|
|
41
|
+
* Get the current global configuration
|
|
42
|
+
*/
|
|
43
|
+
function getConfig() {
|
|
44
|
+
return globalConfig;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set the global configuration
|
|
48
|
+
*/
|
|
49
|
+
function setConfig(config) {
|
|
50
|
+
(0, validator_js_1.validateConfig)(config);
|
|
51
|
+
globalConfig = config;
|
|
52
|
+
globalLogger.debug("Revenium configuration updated", {
|
|
53
|
+
baseUrl: config.reveniumBaseUrl,
|
|
54
|
+
hasReveniumKey: !!config.reveniumApiKey,
|
|
55
|
+
hasPerplexityKey: !!config.perplexityApiKey,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the current logger
|
|
60
|
+
*/
|
|
61
|
+
function getLogger() {
|
|
62
|
+
return globalLogger;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Initialize configuration from environment variables
|
|
66
|
+
*/
|
|
67
|
+
function initializeConfig() {
|
|
68
|
+
const envConfig = (0, loader_js_1.loadConfigFromEnv)();
|
|
69
|
+
if (!envConfig) {
|
|
70
|
+
globalLogger.error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
|
|
71
|
+
throw new Error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
|
|
72
|
+
}
|
|
73
|
+
setConfig(envConfig);
|
|
74
|
+
globalLogger.debug("Revenium middleware initialized from environment variables");
|
|
75
|
+
return envConfig;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/core/config/manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAuCH,8BAEC;AAKD,8BAQC;AAKD,8BAEC;AAKD,4CAkBC;AAjFD,2CAAgD;AAChD,iDAAgD;AAIhD;;GAEG;AACH,IAAI,YAAY,GAA0B,IAAI,CAAC;AAG/C;;GAEG;AACU,QAAA,aAAa,GAAW;IACnC,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,IAAI,YAAY,GAAW,qBAAa,CAAC;AAEzC;;GAEG;AACH,SAAgB,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,MAAsB;IAC9C,IAAA,6BAAc,EAAC,MAAM,CAAC,CAAC;IACvB,YAAY,GAAG,MAAM,CAAC;IACtB,YAAY,CAAC,KAAK,CAAC,gCAAgC,EAAE;QACnD,OAAO,EAAE,MAAM,CAAC,eAAe;QAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACvC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB;KAC5C,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,SAAS,GAAG,IAAA,6BAAiB,GAAE,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,CAChB,iHAAiH,CAClH,CAAC;QACF,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,YAAY,CAAC,KAAK,CAChB,4DAA4D,CAC7D,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration Validator Module
|
|
4
|
+
*
|
|
5
|
+
* Handles validation of configuration objects.
|
|
6
|
+
* Separated from loading and management for single responsibility.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.validateConfig = validateConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Validate Revenium configuration
|
|
12
|
+
*/
|
|
13
|
+
function validateConfig(config) {
|
|
14
|
+
if (!config.reveniumApiKey) {
|
|
15
|
+
throw new Error("Revenium API key is required. Set REVENIUM_METERING_API_KEY environment variable or provide reveniumApiKey in config.");
|
|
16
|
+
}
|
|
17
|
+
if (!config.reveniumApiKey.startsWith("hak_")) {
|
|
18
|
+
throw new Error('Invalid Revenium API key format. Revenium API keys should start with "hak_"');
|
|
19
|
+
}
|
|
20
|
+
// Validate Revenium URL format (base URL should always be provided by loader with default)
|
|
21
|
+
if (config.reveniumBaseUrl) {
|
|
22
|
+
try {
|
|
23
|
+
new URL(config.reveniumBaseUrl);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error(`Invalid Revenium base URL format: ${config.reveniumBaseUrl}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!config.perplexityApiKey) {
|
|
30
|
+
throw new Error("Perplexity API key is required. Set PERPLEXITY_API_KEY environment variable or provide perplexityApiKey in config.");
|
|
31
|
+
}
|
|
32
|
+
if (!config.perplexityApiKey.startsWith("pplx-")) {
|
|
33
|
+
throw new Error('Invalid Perplexity API key format. Perplexity API keys should start with "pplx-"');
|
|
34
|
+
}
|
|
35
|
+
// Validate Perplexity URL format (base URL should always be provided by loader with default)
|
|
36
|
+
if (config.perplexityBaseUrl) {
|
|
37
|
+
try {
|
|
38
|
+
new URL(config.perplexityBaseUrl);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new Error(`Invalid Perplexity base URL format: ${config.perplexityBaseUrl}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/core/config/validator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,wCA8CC;AAjDD;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAsB;IACnD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,2FAA2F;IAC3F,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,eAAe,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,6FAA6F;IAC7F,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,CAAC,iBAAiB,EAAE,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware module exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StreamingWrapper = exports.CompletionsInterface = exports.ChatInterface = exports.ReveniumPerplexity = void 0;
|
|
7
|
+
var revenium_client_js_1 = require("./revenium-client.js");
|
|
8
|
+
Object.defineProperty(exports, "ReveniumPerplexity", { enumerable: true, get: function () { return revenium_client_js_1.ReveniumPerplexity; } });
|
|
9
|
+
var interfaces_js_1 = require("./interfaces.js");
|
|
10
|
+
Object.defineProperty(exports, "ChatInterface", { enumerable: true, get: function () { return interfaces_js_1.ChatInterface; } });
|
|
11
|
+
Object.defineProperty(exports, "CompletionsInterface", { enumerable: true, get: function () { return interfaces_js_1.CompletionsInterface; } });
|
|
12
|
+
var streaming_wrapper_js_1 = require("./streaming-wrapper.js");
|
|
13
|
+
Object.defineProperty(exports, "StreamingWrapper", { enumerable: true, get: function () { return streaming_wrapper_js_1.StreamingWrapper; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/middleware/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAC3B,iDAAsE;AAA7D,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAC5C,+DAA0D;AAAjD,wHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware interfaces for Perplexity API
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CompletionsInterface = exports.ChatInterface = void 0;
|
|
7
|
+
const index_js_1 = require("../config/index.js");
|
|
8
|
+
const transaction_id_js_1 = require("../../utils/transaction-id.js");
|
|
9
|
+
const index_js_2 = require("../tracking/index.js");
|
|
10
|
+
const streaming_wrapper_js_1 = require("./streaming-wrapper.js");
|
|
11
|
+
const logger = (0, index_js_1.getLogger)();
|
|
12
|
+
/**
|
|
13
|
+
* Chat interface - provides access to chat completions
|
|
14
|
+
*/
|
|
15
|
+
class ChatInterface {
|
|
16
|
+
constructor(client, config) {
|
|
17
|
+
this.client = client;
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get completions interface
|
|
22
|
+
*/
|
|
23
|
+
completions() {
|
|
24
|
+
return new CompletionsInterface(this.client, this.config);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ChatInterface = ChatInterface;
|
|
28
|
+
/**
|
|
29
|
+
* Completions interface - handles chat completion requests
|
|
30
|
+
*/
|
|
31
|
+
class CompletionsInterface {
|
|
32
|
+
constructor(client, config) {
|
|
33
|
+
this.client = client;
|
|
34
|
+
this.config = config;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a chat completion
|
|
38
|
+
*/
|
|
39
|
+
async create(params, metadata) {
|
|
40
|
+
const startTime = new Date();
|
|
41
|
+
const transactionId = (0, transaction_id_js_1.generateTransactionId)();
|
|
42
|
+
try {
|
|
43
|
+
logger.debug(`[Revenium] Creating chat completion with model: ${params.model}`);
|
|
44
|
+
const response = await this.client.chat.completions.create(params);
|
|
45
|
+
const endTime = Date.now();
|
|
46
|
+
const duration = endTime - startTime.getTime();
|
|
47
|
+
// Track usage asynchronously (fire-and-forget - errors handled internally)
|
|
48
|
+
if ("usage" in response && response.usage) {
|
|
49
|
+
// Extract cost if available (Perplexity-specific)
|
|
50
|
+
const usage = response.usage;
|
|
51
|
+
(0, index_js_2.trackUsageAsync)({
|
|
52
|
+
requestId: ("id" in response ? response.id : null) || transactionId,
|
|
53
|
+
model: params.model,
|
|
54
|
+
promptTokens: response.usage.prompt_tokens,
|
|
55
|
+
completionTokens: response.usage.completion_tokens,
|
|
56
|
+
totalTokens: response.usage.total_tokens,
|
|
57
|
+
duration,
|
|
58
|
+
finishReason: "choices" in response
|
|
59
|
+
? response.choices[0]?.finish_reason || null
|
|
60
|
+
: null,
|
|
61
|
+
usageMetadata: metadata,
|
|
62
|
+
isStreamed: false,
|
|
63
|
+
cost: usage.cost,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
logger.error(`[Revenium] Error in chat completion: ${error.message}`);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a streaming chat completion
|
|
75
|
+
*/
|
|
76
|
+
async createStreaming(params, metadata) {
|
|
77
|
+
const startTime = new Date();
|
|
78
|
+
const transactionId = (0, transaction_id_js_1.generateTransactionId)();
|
|
79
|
+
try {
|
|
80
|
+
logger.debug(`[Revenium] Creating streaming chat completion with model: ${params.model}`);
|
|
81
|
+
const stream = await this.client.chat.completions.create({
|
|
82
|
+
...params,
|
|
83
|
+
stream: true,
|
|
84
|
+
});
|
|
85
|
+
return new streaming_wrapper_js_1.StreamingWrapper(stream, params.model, startTime, transactionId, metadata, this.config);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.error(`[Revenium] Error in streaming chat completion: ${error.message}`);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.CompletionsInterface = CompletionsInterface;
|
|
94
|
+
//# sourceMappingURL=interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/core/middleware/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenium Perplexity Client
|
|
4
|
+
*
|
|
5
|
+
* Main client class that wraps Perplexity API with Revenium tracking
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ReveniumPerplexity = void 0;
|
|
12
|
+
const openai_1 = __importDefault(require("openai"));
|
|
13
|
+
const interfaces_js_1 = require("./interfaces.js");
|
|
14
|
+
/**
|
|
15
|
+
* Revenium Perplexity client with usage tracking
|
|
16
|
+
*/
|
|
17
|
+
class ReveniumPerplexity {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.client = new openai_1.default({
|
|
21
|
+
apiKey: config.perplexityApiKey,
|
|
22
|
+
baseURL: config.perplexityBaseUrl,
|
|
23
|
+
});
|
|
24
|
+
if (config.debug) {
|
|
25
|
+
console.log("[Revenium] Perplexity client created", {
|
|
26
|
+
baseURL: config.perplexityBaseUrl,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get chat interface
|
|
32
|
+
*/
|
|
33
|
+
chat() {
|
|
34
|
+
return new interfaces_js_1.ChatInterface(this.client, this.config);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get underlying OpenAI client (for advanced use cases)
|
|
38
|
+
*/
|
|
39
|
+
getUnderlyingClient() {
|
|
40
|
+
return this.client;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ReveniumPerplexity = ReveniumPerplexity;
|
|
44
|
+
//# sourceMappingURL=revenium-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revenium-client.js","sourceRoot":"","sources":["../../../../src/core/middleware/revenium-client.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,oDAA4B;AAC5B,mDAAgD;AAGhD;;GAEG;AACH,MAAa,kBAAkB;IAI7B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,gBAAgB;YAC/B,OAAO,EAAE,MAAM,CAAC,iBAAiB;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE;gBAClD,OAAO,EAAE,MAAM,CAAC,iBAAiB;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,6BAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA/BD,gDA+BC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Streaming wrapper for Perplexity API
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StreamingWrapper = void 0;
|
|
7
|
+
const index_js_1 = require("../config/index.js");
|
|
8
|
+
const index_js_2 = require("../tracking/index.js");
|
|
9
|
+
const logger = (0, index_js_1.getLogger)();
|
|
10
|
+
/**
|
|
11
|
+
* Wrapper for streaming responses that tracks usage
|
|
12
|
+
*/
|
|
13
|
+
class StreamingWrapper {
|
|
14
|
+
constructor(stream, model, startTime, transactionId, metadata, config) {
|
|
15
|
+
this.stream = stream;
|
|
16
|
+
this.model = model;
|
|
17
|
+
this.startTime = startTime;
|
|
18
|
+
this.transactionId = transactionId;
|
|
19
|
+
this.metadata = metadata;
|
|
20
|
+
this.config = config || {};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Iterate over stream chunks
|
|
24
|
+
*/
|
|
25
|
+
async *[Symbol.asyncIterator]() {
|
|
26
|
+
let lastChunk = null;
|
|
27
|
+
let inputTokens = 0;
|
|
28
|
+
let outputTokens = 0;
|
|
29
|
+
let totalTokens = 0;
|
|
30
|
+
let costData = undefined;
|
|
31
|
+
let firstChunkTime = null;
|
|
32
|
+
let timeToFirstToken = 0;
|
|
33
|
+
try {
|
|
34
|
+
for await (const chunk of this.stream) {
|
|
35
|
+
// Capture time of first chunk
|
|
36
|
+
if (!firstChunkTime) {
|
|
37
|
+
firstChunkTime = new Date();
|
|
38
|
+
timeToFirstToken =
|
|
39
|
+
firstChunkTime.getTime() - this.startTime.getTime();
|
|
40
|
+
}
|
|
41
|
+
lastChunk = chunk;
|
|
42
|
+
// Track usage if available in chunk
|
|
43
|
+
if (chunk.usage) {
|
|
44
|
+
inputTokens = chunk.usage.prompt_tokens || 0;
|
|
45
|
+
outputTokens = chunk.usage.completion_tokens || 0;
|
|
46
|
+
totalTokens = chunk.usage.total_tokens || 0;
|
|
47
|
+
// Extract cost data if available (Perplexity-specific)
|
|
48
|
+
if (chunk.usage.cost) {
|
|
49
|
+
costData = chunk.usage.cost;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
yield chunk;
|
|
53
|
+
}
|
|
54
|
+
// Send metering data when stream completes (fire-and-forget)
|
|
55
|
+
const endTime = Date.now();
|
|
56
|
+
const duration = endTime - this.startTime.getTime();
|
|
57
|
+
// fire-and-forget
|
|
58
|
+
(0, index_js_2.trackUsageAsync)({
|
|
59
|
+
requestId: this.transactionId,
|
|
60
|
+
model: this.model,
|
|
61
|
+
promptTokens: inputTokens,
|
|
62
|
+
completionTokens: outputTokens,
|
|
63
|
+
totalTokens,
|
|
64
|
+
duration,
|
|
65
|
+
finishReason: lastChunk?.choices?.[0]?.finish_reason || null,
|
|
66
|
+
usageMetadata: this.metadata,
|
|
67
|
+
isStreamed: true,
|
|
68
|
+
timeToFirstToken,
|
|
69
|
+
cost: costData,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
// Log error
|
|
74
|
+
logger.error("[Revenium] Error in stream processing:", error.message);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.StreamingWrapper = StreamingWrapper;
|
|
80
|
+
//# sourceMappingURL=streaming-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-wrapper.js","sourceRoot":"","sources":["../../../../src/core/middleware/streaming-wrapper.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,iDAA+C;AAC/C,mDAAuD;AAEvD,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;GAEG;AACH,MAAa,gBAAgB;IAQ3B,YACE,MAA0B,EAC1B,KAAa,EACb,SAAe,EACf,aAAqB,EACrB,QAAwB,EACxB,MAAY;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,IAAI,SAAS,GAAQ,IAAI,CAAC;QAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAQ,SAAS,CAAC;QAC9B,IAAI,cAAc,GAAgB,IAAI,CAAC;QACvC,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtC,8BAA8B;gBAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC5B,gBAAgB;wBACd,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxD,CAAC;gBAED,SAAS,GAAG,KAAK,CAAC;gBAElB,oCAAoC;gBACpC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;oBAC7C,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;oBAClD,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;oBAC5C,uDAAuD;oBACvD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;wBACrB,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;YAED,6DAA6D;YAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAEpD,kBAAkB;YAClB,IAAA,0BAAe,EAAC;gBACd,SAAS,EAAE,IAAI,CAAC,aAAa;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,WAAW;gBACzB,gBAAgB,EAAE,YAAY;gBAC9B,WAAW;gBACX,QAAQ;gBACR,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,IAAI;gBAC5D,aAAa,EAAE,IAAI,CAAC,QAAQ;gBAC5B,UAAU,EAAE,IAAI;gBAChB,gBAAgB;gBAChB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,YAAY;YACZ,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AArFD,4CAqFC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provider Detection Module
|
|
4
|
+
*
|
|
5
|
+
* Handles provider metadata for Perplexity AI.
|
|
6
|
+
* Simplified compared to OpenAI modular since Perplexity doesn't have Azure variant.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.detectProvider = detectProvider;
|
|
10
|
+
exports.getProviderMetadata = getProviderMetadata;
|
|
11
|
+
const index_js_1 = require("../config/index.js");
|
|
12
|
+
// Global logger
|
|
13
|
+
const logger = (0, index_js_1.getLogger)();
|
|
14
|
+
/**
|
|
15
|
+
* Get provider info for Perplexity
|
|
16
|
+
* Always returns Perplexity since there's no Azure variant
|
|
17
|
+
*
|
|
18
|
+
* @returns ProviderInfo with Perplexity provider
|
|
19
|
+
*/
|
|
20
|
+
function detectProvider() {
|
|
21
|
+
logger.debug("Using Perplexity AI provider");
|
|
22
|
+
return {
|
|
23
|
+
provider: "PERPLEXITY",
|
|
24
|
+
modelSource: "PERPLEXITY",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get provider metadata for Revenium payload
|
|
29
|
+
*
|
|
30
|
+
* @returns metadata object for Revenium
|
|
31
|
+
*/
|
|
32
|
+
function getProviderMetadata() {
|
|
33
|
+
return {
|
|
34
|
+
provider: "Perplexity",
|
|
35
|
+
modelSource: "PERPLEXITY",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../../src/core/providers/detector.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAcH,wCAMC;AAOD,kDAQC;AAhCD,iDAA+C;AAE/C,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;;;;GAKG;AACH,SAAgB,cAAc;IAC5B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7C,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB;IAIjC,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Providers module - Main exports
|
|
4
|
+
*
|
|
5
|
+
* This module provides a clean interface for provider detection and management.
|
|
6
|
+
* Simplified for Perplexity (no Azure variant).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getProviderMetadata = exports.detectProvider = void 0;
|
|
10
|
+
// Re-export all provider functionality
|
|
11
|
+
var detector_js_1 = require("./detector.js");
|
|
12
|
+
Object.defineProperty(exports, "detectProvider", { enumerable: true, get: function () { return detector_js_1.detectProvider; } });
|
|
13
|
+
Object.defineProperty(exports, "getProviderMetadata", { enumerable: true, get: function () { return detector_js_1.getProviderMetadata; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/providers/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uCAAuC;AACvC,6CAAoE;AAA3D,6GAAA,cAAc,OAAA;AAAE,kHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenium API Client Module
|
|
4
|
+
*
|
|
5
|
+
* Handles HTTP communication with the Revenium API.
|
|
6
|
+
* Extracted from tracking.ts for single responsibility.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.sendToRevenium = sendToRevenium;
|
|
10
|
+
const index_js_1 = require("../config/index.js");
|
|
11
|
+
const url_builder_js_1 = require("../../utils/url-builder.js");
|
|
12
|
+
// Global logger
|
|
13
|
+
const logger = (0, index_js_1.getLogger)();
|
|
14
|
+
/**
|
|
15
|
+
* Send payload to Revenium API
|
|
16
|
+
*
|
|
17
|
+
* This is the shared HTTP function that eliminates all duplication
|
|
18
|
+
* between chat completions and embeddings tracking.
|
|
19
|
+
*
|
|
20
|
+
* @param payload - The payload to send to Revenium
|
|
21
|
+
*/
|
|
22
|
+
async function sendToRevenium(payload) {
|
|
23
|
+
const config = (0, index_js_1.getConfig)();
|
|
24
|
+
if (!config)
|
|
25
|
+
return logger.warn("Revenium configuration not found, skipping tracking");
|
|
26
|
+
const url = (0, url_builder_js_1.buildReveniumUrl)(config.reveniumBaseUrl || "https://api.revenium.ai", "/ai/completions");
|
|
27
|
+
logger.debug("Sending Revenium API request", {
|
|
28
|
+
url,
|
|
29
|
+
operationType: payload.operationType,
|
|
30
|
+
transactionId: payload.transactionId,
|
|
31
|
+
model: payload.model,
|
|
32
|
+
totalTokens: payload.totalTokenCount,
|
|
33
|
+
});
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: {
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Accept: "application/json",
|
|
39
|
+
"x-api-key": config.reveniumApiKey,
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(payload),
|
|
42
|
+
});
|
|
43
|
+
logger.debug("Revenium API response", {
|
|
44
|
+
status: response.status,
|
|
45
|
+
statusText: response.statusText,
|
|
46
|
+
transactionId: payload.transactionId,
|
|
47
|
+
operationType: payload.operationType,
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const responseText = await response.text();
|
|
51
|
+
logger.error("Revenium API error response", {
|
|
52
|
+
status: response.status,
|
|
53
|
+
statusText: response.statusText,
|
|
54
|
+
body: responseText,
|
|
55
|
+
transactionId: payload.transactionId,
|
|
56
|
+
operationType: payload.operationType,
|
|
57
|
+
});
|
|
58
|
+
throw new Error(`Revenium API error: ${response.status} ${response.statusText} - ${responseText}`);
|
|
59
|
+
}
|
|
60
|
+
const responseBody = await response.text();
|
|
61
|
+
logger.debug("Revenium tracking successful", {
|
|
62
|
+
transactionId: payload.transactionId,
|
|
63
|
+
operationType: payload.operationType,
|
|
64
|
+
response: responseBody,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../../../src/core/tracking/api-client.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiBH,wCAuDC;AArED,iDAA0D;AAC1D,+DAA8D;AAE9D,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;;;;;;GAOG;AACI,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAE5E,MAAM,GAAG,GAAG,IAAA,iCAAgB,EAC1B,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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tracking module - Main exports
|
|
4
|
+
*
|
|
5
|
+
* This module provides a clean interface for usage tracking,
|
|
6
|
+
* separating concerns into focused sub-modules.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.mapStopReason = exports.trackUsageAsync = exports.sendReveniumMetrics = exports.buildPayload = exports.sendToRevenium = void 0;
|
|
10
|
+
// Re-export all tracking functionality
|
|
11
|
+
var api_client_js_1 = require("./api-client.js");
|
|
12
|
+
Object.defineProperty(exports, "sendToRevenium", { enumerable: true, get: function () { return api_client_js_1.sendToRevenium; } });
|
|
13
|
+
var payload_builder_js_1 = require("./payload-builder.js");
|
|
14
|
+
Object.defineProperty(exports, "buildPayload", { enumerable: true, get: function () { return payload_builder_js_1.buildPayload; } });
|
|
15
|
+
var usage_tracker_js_1 = require("./usage-tracker.js");
|
|
16
|
+
Object.defineProperty(exports, "sendReveniumMetrics", { enumerable: true, get: function () { return usage_tracker_js_1.sendReveniumMetrics; } });
|
|
17
|
+
Object.defineProperty(exports, "trackUsageAsync", { enumerable: true, get: function () { return usage_tracker_js_1.trackUsageAsync; } });
|
|
18
|
+
// Export utility functions
|
|
19
|
+
var stop_reason_mapper_js_1 = require("../../utils/stop-reason-mapper.js");
|
|
20
|
+
Object.defineProperty(exports, "mapStopReason", { enumerable: true, get: function () { return stop_reason_mapper_js_1.mapStopReason; } });
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/tracking/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uCAAuC;AACvC,iDAAiD;AAAxC,+GAAA,cAAc,OAAA;AAEvB,2DAAoD;AAA3C,kHAAA,YAAY,OAAA;AAErB,uDAA0E;AAAjE,uHAAA,mBAAmB,OAAA;AAAE,mHAAA,eAAe,OAAA;AAE7C,2BAA2B;AAC3B,2EAAkE;AAAzD,sHAAA,aAAa,OAAA"}
|