@revenium/perplexity 1.0.25 → 2.0.1
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/README.md +443 -568
- package/dist/cjs/core/config/perplexity-config.js +45 -0
- package/dist/cjs/core/config/perplexity-config.js.map +1 -0
- package/dist/cjs/core/config/revenium-config.js +80 -0
- package/dist/cjs/core/config/revenium-config.js.map +1 -0
- package/dist/cjs/core/tracking/metering.js +131 -0
- package/dist/cjs/core/tracking/metering.js.map +1 -0
- package/dist/cjs/core/wrapper/perplexity-client.js +177 -0
- package/dist/cjs/core/wrapper/perplexity-client.js.map +1 -0
- package/dist/cjs/index.js +64 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/index.js +21 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/utils/logger.js +23 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/esm/core/config/perplexity-config.js +40 -0
- package/dist/esm/core/config/perplexity-config.js.map +1 -0
- package/dist/esm/core/config/revenium-config.js +72 -0
- package/dist/esm/core/config/revenium-config.js.map +1 -0
- package/dist/esm/core/tracking/metering.js +126 -0
- package/dist/esm/core/tracking/metering.js.map +1 -0
- package/dist/esm/core/wrapper/perplexity-client.js +170 -0
- package/dist/esm/core/wrapper/perplexity-client.js.map +1 -0
- package/dist/esm/index.js +44 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/index.js +18 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/utils/logger.js +20 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/types/core/config/perplexity-config.d.ts +24 -0
- package/dist/types/core/config/perplexity-config.d.ts.map +1 -0
- package/dist/types/core/config/revenium-config.d.ts +37 -0
- package/dist/types/core/config/revenium-config.d.ts.map +1 -0
- package/dist/types/core/tracking/metering.d.ts +31 -0
- package/dist/types/core/tracking/metering.d.ts.map +1 -0
- package/dist/types/core/wrapper/perplexity-client.d.ts +32 -0
- package/dist/types/core/wrapper/perplexity-client.d.ts.map +1 -0
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +159 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/utils/logger.d.ts +10 -0
- package/dist/types/utils/logger.d.ts.map +1 -0
- package/package.json +36 -31
- package/.env.example +0 -3
- package/dist/interfaces/meteringResponse.d.ts +0 -28
- package/dist/interfaces/meteringResponse.js +0 -2
- package/dist/models/Metering.js +0 -83
- package/dist/v1/perplexityV1.service.js +0 -166
- package/dist/v2/perplexityV2.service.js +0 -178
- package/examples/v1/basic.ts +0 -50
- package/examples/v1/chat.ts +0 -40
- package/examples/v1/metadata.ts +0 -49
- package/examples/v1/streaming.ts +0 -44
- package/examples/v2/basic.ts +0 -49
- package/examples/v2/chat.ts +0 -60
- package/examples/v2/metadata.ts +0 -71
- package/examples/v2/streaming.ts +0 -61
- package/playground/v1/basic.js +0 -50
- package/playground/v1/chat.js +0 -46
- package/playground/v1/metadata.js +0 -50
- package/playground/v1/streaming.js +0 -44
- package/playground/v2/basic.js +0 -49
- package/playground/v2/chat.js +0 -72
- package/playground/v2/metadata.js +0 -76
- package/playground/v2/streaming.js +0 -67
- package/src/index.ts +0 -17
- package/src/interfaces/chatCompletionRequest.ts +0 -15
- package/src/interfaces/credential.ts +0 -4
- package/src/interfaces/meteringRequest.ts +0 -14
- package/src/interfaces/meteringResponse.ts +0 -29
- package/src/interfaces/operation.ts +0 -4
- package/src/interfaces/perplexityResponse.ts +0 -63
- package/src/interfaces/perplexityStreaming.ts +0 -56
- package/src/interfaces/subscriber.ts +0 -8
- package/src/interfaces/tokenCounts.ts +0 -7
- package/src/interfaces/usageMetadata.ts +0 -27
- package/src/models/Logger.ts +0 -38
- package/src/models/Metering.ts +0 -121
- package/src/utils/calculateDurationMs.ts +0 -3
- package/src/utils/constants/constants.ts +0 -10
- package/src/utils/constants/logLevels.ts +0 -1
- package/src/utils/constants/messages.ts +0 -11
- package/src/utils/constants/models.ts +0 -20
- package/src/utils/constants/perplexityModels.ts +0 -71
- package/src/utils/extractTokenCount.ts +0 -26
- package/src/utils/formatTimestamp.ts +0 -3
- package/src/utils/generateTransactionId.ts +0 -5
- package/src/utils/index.ts +0 -39
- package/src/utils/loadEnv.ts +0 -8
- package/src/utils/safeExtract.ts +0 -67
- package/src/v1/perplexityV1.controller.ts +0 -164
- package/src/v1/perplexityV1.service.ts +0 -230
- package/src/v2/perplexityV2.controller.ts +0 -219
- package/src/v2/perplexityV2.service.ts +0 -260
- package/tsconfig.json +0 -15
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Perplexity Configuration Module
|
|
4
|
+
* Manages Perplexity API configuration
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.initializePerplexityFromEnv = initializePerplexityFromEnv;
|
|
8
|
+
exports.initializePerplexity = initializePerplexity;
|
|
9
|
+
exports.getPerplexityConfig = getPerplexityConfig;
|
|
10
|
+
const logger_1 = require("../../utils/logger");
|
|
11
|
+
let perplexityConfig = null;
|
|
12
|
+
/**
|
|
13
|
+
* Initialize Perplexity configuration from environment variables
|
|
14
|
+
*/
|
|
15
|
+
function initializePerplexityFromEnv() {
|
|
16
|
+
const apiKey = process.env.PERPLEXITY_API_KEY;
|
|
17
|
+
const baseUrl = process.env.PERPLEXITY_API_BASE_URL || "https://api.perplexity.ai";
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
throw new Error("PERPLEXITY_API_KEY environment variable is required but not set");
|
|
20
|
+
}
|
|
21
|
+
perplexityConfig = {
|
|
22
|
+
apiKey,
|
|
23
|
+
baseUrl,
|
|
24
|
+
};
|
|
25
|
+
logger_1.logger.info("Perplexity configuration initialized successfully");
|
|
26
|
+
return perplexityConfig;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize Perplexity configuration with custom values
|
|
30
|
+
*/
|
|
31
|
+
function initializePerplexity(config) {
|
|
32
|
+
perplexityConfig = {
|
|
33
|
+
apiKey: config.apiKey,
|
|
34
|
+
baseUrl: config.baseUrl || "https://api.perplexity.ai",
|
|
35
|
+
};
|
|
36
|
+
logger_1.logger.info("Perplexity configuration initialized with custom config");
|
|
37
|
+
return perplexityConfig;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get current Perplexity configuration
|
|
41
|
+
*/
|
|
42
|
+
function getPerplexityConfig() {
|
|
43
|
+
return perplexityConfig;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=perplexity-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity-config.js","sourceRoot":"","sources":["../../../../src/core/config/perplexity-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAcH,kEAkBC;AAKD,oDAWC;AAKD,kDAEC;AArDD,+CAA4C;AAO5C,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AAErD;;GAEG;AACH,SAAgB,2BAA2B;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,2BAA2B,CAAC;IAErE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,gBAAgB,GAAG;QACjB,MAAM;QACN,OAAO;KACR,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAGpC;IACC,gBAAgB,GAAG;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;KACvD,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenium Configuration Module
|
|
4
|
+
* Manages Revenium metering configuration and initialization
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.initializeReveniumFromEnv = initializeReveniumFromEnv;
|
|
8
|
+
exports.initializeRevenium = initializeRevenium;
|
|
9
|
+
exports.getReveniumConfig = getReveniumConfig;
|
|
10
|
+
exports.isReveniumEnabled = isReveniumEnabled;
|
|
11
|
+
exports.disableRevenium = disableRevenium;
|
|
12
|
+
exports.enableRevenium = enableRevenium;
|
|
13
|
+
const logger_1 = require("../../utils/logger");
|
|
14
|
+
let reveniumConfig = null;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize Revenium configuration from environment variables
|
|
17
|
+
*/
|
|
18
|
+
function initializeReveniumFromEnv() {
|
|
19
|
+
const meteringApiKey = process.env.REVENIUM_METERING_API_KEY?.trim().replace(/^["']|["']$/g, "");
|
|
20
|
+
const meteringBaseUrl = process.env.REVENIUM_METERING_BASE_URL?.trim().replace(/^["']|["']$/g, "");
|
|
21
|
+
if (!meteringApiKey || !meteringBaseUrl) {
|
|
22
|
+
logger_1.logger.warn("Revenium metering disabled: Missing REVENIUM_METERING_API_KEY or REVENIUM_METERING_BASE_URL");
|
|
23
|
+
reveniumConfig = {
|
|
24
|
+
meteringApiKey: "",
|
|
25
|
+
meteringBaseUrl: "",
|
|
26
|
+
enabled: false,
|
|
27
|
+
};
|
|
28
|
+
return reveniumConfig;
|
|
29
|
+
}
|
|
30
|
+
reveniumConfig = {
|
|
31
|
+
meteringApiKey,
|
|
32
|
+
meteringBaseUrl,
|
|
33
|
+
enabled: true,
|
|
34
|
+
};
|
|
35
|
+
logger_1.logger.info("Revenium configuration initialized successfully");
|
|
36
|
+
logger_1.logger.debug(`Metering Base URL: ${meteringBaseUrl}`);
|
|
37
|
+
return reveniumConfig;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Initialize Revenium configuration with custom values
|
|
41
|
+
*/
|
|
42
|
+
function initializeRevenium(config) {
|
|
43
|
+
reveniumConfig = {
|
|
44
|
+
...config,
|
|
45
|
+
enabled: true,
|
|
46
|
+
};
|
|
47
|
+
logger_1.logger.info("Revenium configuration initialized with custom config");
|
|
48
|
+
return reveniumConfig;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get current Revenium configuration
|
|
52
|
+
*/
|
|
53
|
+
function getReveniumConfig() {
|
|
54
|
+
return reveniumConfig;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if Revenium is enabled
|
|
58
|
+
*/
|
|
59
|
+
function isReveniumEnabled() {
|
|
60
|
+
return reveniumConfig?.enabled ?? false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Disable Revenium metering
|
|
64
|
+
*/
|
|
65
|
+
function disableRevenium() {
|
|
66
|
+
if (reveniumConfig) {
|
|
67
|
+
reveniumConfig.enabled = false;
|
|
68
|
+
logger_1.logger.info("Revenium metering disabled");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Enable Revenium metering
|
|
73
|
+
*/
|
|
74
|
+
function enableRevenium() {
|
|
75
|
+
if (reveniumConfig) {
|
|
76
|
+
reveniumConfig.enabled = true;
|
|
77
|
+
logger_1.logger.info("Revenium metering enabled");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=revenium-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revenium-config.js","sourceRoot":"","sources":["../../../../src/core/config/revenium-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAeH,8DA6BC;AAKD,gDAWC;AAKD,8CAEC;AAKD,8CAEC;AAKD,0CAKC;AAKD,wCAKC;AA5FD,+CAA4C;AAQ5C,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD;;GAEG;AACH,SAAgB,yBAAyB;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC,OAAO,CAC1E,cAAc,EACd,EAAE,CACH,CAAC;IACF,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE7E,IAAI,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,eAAM,CAAC,IAAI,CACT,6FAA6F,CAC9F,CAAC;QACF,cAAc,GAAG;YACf,cAAc,EAAE,EAAE;YAClB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,cAAc,GAAG;QACf,cAAc;QACd,eAAe;QACf,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC/D,eAAM,CAAC,KAAK,CAAC,sBAAsB,eAAe,EAAE,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAGlC;IACC,cAAc,GAAG;QACf,GAAG,MAAM;QACT,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,cAAc,EAAE,OAAO,IAAI,KAAK,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe;IAC7B,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;QAC/B,eAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,eAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenium Metering Module
|
|
4
|
+
* Handles tracking and sending metering data to Revenium
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateTransactionId = generateTransactionId;
|
|
8
|
+
exports.buildMeteringData = buildMeteringData;
|
|
9
|
+
exports.sendMeteringData = sendMeteringData;
|
|
10
|
+
const revenium_config_1 = require("../config/revenium-config");
|
|
11
|
+
const logger_1 = require("../../utils/logger");
|
|
12
|
+
/**
|
|
13
|
+
* Generate a unique transaction ID
|
|
14
|
+
*/
|
|
15
|
+
function generateTransactionId() {
|
|
16
|
+
return `txn_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Format timestamp to ISO string
|
|
20
|
+
*/
|
|
21
|
+
function formatTimestamp(date) {
|
|
22
|
+
return date.toISOString();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calculate duration in milliseconds
|
|
26
|
+
*/
|
|
27
|
+
function calculateDuration(startTime, endTime) {
|
|
28
|
+
return endTime.getTime() - startTime.getTime();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build metering data from request information
|
|
32
|
+
*/
|
|
33
|
+
function buildMeteringData(params) {
|
|
34
|
+
const { model, startTime, endTime, inputTokens, outputTokens, totalTokens, reasoningTokens = 0, cachedTokens = 0, transactionId, isStreamed, stopReason, usageMetadata = {}, } = params;
|
|
35
|
+
const config = (0, revenium_config_1.getReveniumConfig)();
|
|
36
|
+
const agent = "perplexity";
|
|
37
|
+
const costType = "TOKEN";
|
|
38
|
+
const operationType = "CHAT";
|
|
39
|
+
// Build subscriber information
|
|
40
|
+
const subscriberId = usageMetadata.subscriber?.id ||
|
|
41
|
+
usageMetadata.subscriberId ||
|
|
42
|
+
`user-${generateTransactionId()}`;
|
|
43
|
+
const subscriberEmail = usageMetadata.subscriber?.email ||
|
|
44
|
+
usageMetadata.subscriberEmail ||
|
|
45
|
+
`user@${agent}.ai`;
|
|
46
|
+
const subscriberCredential = usageMetadata.subscriber?.credential ||
|
|
47
|
+
(usageMetadata.subscriberCredentialName &&
|
|
48
|
+
usageMetadata.subscriberCredential
|
|
49
|
+
? {
|
|
50
|
+
name: usageMetadata.subscriberCredentialName,
|
|
51
|
+
value: usageMetadata.subscriberCredential,
|
|
52
|
+
}
|
|
53
|
+
: {
|
|
54
|
+
name: "default",
|
|
55
|
+
value: "default-credential",
|
|
56
|
+
});
|
|
57
|
+
const subscriber = {
|
|
58
|
+
id: subscriberId,
|
|
59
|
+
email: subscriberEmail,
|
|
60
|
+
credential: subscriberCredential,
|
|
61
|
+
};
|
|
62
|
+
// Build the payload in the exact order expected by Revenium API v2
|
|
63
|
+
const payload = {
|
|
64
|
+
stopReason: "END",
|
|
65
|
+
costType: "AI", // Fixed value as per Google middleware
|
|
66
|
+
isStreamed,
|
|
67
|
+
taskType: "AI", // Fixed value as per Google middleware
|
|
68
|
+
agent: usageMetadata.agent || agent,
|
|
69
|
+
operationType: usageMetadata.operationType || operationType,
|
|
70
|
+
inputTokenCount: usageMetadata.inputTokenCount ?? inputTokens,
|
|
71
|
+
outputTokenCount: usageMetadata.outputTokenCount ?? outputTokens,
|
|
72
|
+
reasoningTokenCount: usageMetadata.reasoningTokenCount ?? reasoningTokens,
|
|
73
|
+
cacheCreationTokenCount: usageMetadata.cacheCreationTokenCount ?? cachedTokens,
|
|
74
|
+
cacheReadTokenCount: usageMetadata.cacheReadTokenCount ?? 0,
|
|
75
|
+
totalTokenCount: usageMetadata.totalTokenCount ?? totalTokens,
|
|
76
|
+
organizationId: usageMetadata.organizationId || "my-customers-name",
|
|
77
|
+
productId: usageMetadata.productId || "free-trial",
|
|
78
|
+
subscriber,
|
|
79
|
+
model,
|
|
80
|
+
transactionId: usageMetadata.transactionId || transactionId,
|
|
81
|
+
responseTime: usageMetadata.responseTime || formatTimestamp(endTime),
|
|
82
|
+
requestDuration: calculateDuration(startTime, endTime),
|
|
83
|
+
provider: agent,
|
|
84
|
+
requestTime: usageMetadata.requestTime || formatTimestamp(startTime),
|
|
85
|
+
completionStartTime: usageMetadata.completionStartTime || formatTimestamp(endTime),
|
|
86
|
+
timeToFirstToken: usageMetadata.timeToFirstToken || 0,
|
|
87
|
+
middleware_source: "node",
|
|
88
|
+
};
|
|
89
|
+
// Only add traceId if it's provided
|
|
90
|
+
if (usageMetadata.traceId) {
|
|
91
|
+
payload.traceId = usageMetadata.traceId;
|
|
92
|
+
}
|
|
93
|
+
return payload;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Send metering data to Revenium
|
|
97
|
+
*/
|
|
98
|
+
async function sendMeteringData(meteringData) {
|
|
99
|
+
if (!(0, revenium_config_1.isReveniumEnabled)()) {
|
|
100
|
+
logger_1.logger.debug("Revenium metering is disabled, skipping metering data");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const config = (0, revenium_config_1.getReveniumConfig)();
|
|
104
|
+
if (!config) {
|
|
105
|
+
logger_1.logger.warn("Revenium configuration not initialized");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const url = `${config.meteringBaseUrl}/v2/ai/completions`;
|
|
110
|
+
logger_1.logger.debug("Sending metering data to Revenium:", JSON.stringify(meteringData, null, 2));
|
|
111
|
+
const response = await fetch(url, {
|
|
112
|
+
method: "POST",
|
|
113
|
+
headers: {
|
|
114
|
+
"Content-Type": "application/json",
|
|
115
|
+
"x-api-key": config.meteringApiKey,
|
|
116
|
+
accept: "application/json",
|
|
117
|
+
},
|
|
118
|
+
body: JSON.stringify(meteringData),
|
|
119
|
+
});
|
|
120
|
+
if (!response.ok) {
|
|
121
|
+
const errorData = await response.text();
|
|
122
|
+
logger_1.logger.error(`Metering API request failed with status ${response.status}: ${errorData}`);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
logger_1.logger.info("Metering data sent successfully to Revenium");
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
logger_1.logger.error("Error sending metering data:", error.message);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=metering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../../../../src/core/tracking/metering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Perplexity Client Wrapper
|
|
4
|
+
* Wraps Perplexity API calls with Revenium metering
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createChatCompletion = createChatCompletion;
|
|
11
|
+
exports.createStreamingChatCompletion = createStreamingChatCompletion;
|
|
12
|
+
const openai_1 = __importDefault(require("openai"));
|
|
13
|
+
const perplexity_config_1 = require("../config/perplexity-config");
|
|
14
|
+
const logger_1 = require("../../utils/logger");
|
|
15
|
+
const metering_1 = require("../tracking/metering");
|
|
16
|
+
let perplexityClient = null;
|
|
17
|
+
/**
|
|
18
|
+
* Get or create Perplexity client
|
|
19
|
+
*/
|
|
20
|
+
function getClient() {
|
|
21
|
+
if (!perplexityClient) {
|
|
22
|
+
const config = (0, perplexity_config_1.getPerplexityConfig)();
|
|
23
|
+
if (!config) {
|
|
24
|
+
throw new Error("Perplexity configuration not initialized. Call initializePerplexityFromEnv() or initializePerplexity() first.");
|
|
25
|
+
}
|
|
26
|
+
perplexityClient = new openai_1.default({
|
|
27
|
+
apiKey: config.apiKey,
|
|
28
|
+
baseURL: config.baseUrl,
|
|
29
|
+
});
|
|
30
|
+
logger_1.logger.info("Perplexity client initialized successfully");
|
|
31
|
+
}
|
|
32
|
+
return perplexityClient;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a chat completion
|
|
36
|
+
*/
|
|
37
|
+
async function createChatCompletion(params) {
|
|
38
|
+
const client = getClient();
|
|
39
|
+
const transactionId = (0, metering_1.generateTransactionId)();
|
|
40
|
+
const startTime = new Date();
|
|
41
|
+
try {
|
|
42
|
+
const { usageMetadata, ...requestParams } = params;
|
|
43
|
+
logger_1.logger.info(`Creating chat completion with model: ${params.model}`);
|
|
44
|
+
const response = (await client.chat.completions.create({
|
|
45
|
+
model: requestParams.model,
|
|
46
|
+
messages: requestParams.messages,
|
|
47
|
+
max_tokens: requestParams.maxTokens,
|
|
48
|
+
temperature: requestParams.temperature,
|
|
49
|
+
top_p: requestParams.topP,
|
|
50
|
+
presence_penalty: requestParams.presencePenalty,
|
|
51
|
+
frequency_penalty: requestParams.frequencyPenalty,
|
|
52
|
+
stream: false,
|
|
53
|
+
}));
|
|
54
|
+
const endTime = new Date();
|
|
55
|
+
// Extract response data
|
|
56
|
+
const content = response.choices[0]?.message?.content || "";
|
|
57
|
+
const role = response.choices[0]?.message?.role || "assistant";
|
|
58
|
+
const finishReason = response.choices[0]?.finish_reason || null;
|
|
59
|
+
const usage = response.usage || {
|
|
60
|
+
prompt_tokens: 0,
|
|
61
|
+
completion_tokens: 0,
|
|
62
|
+
total_tokens: 0,
|
|
63
|
+
};
|
|
64
|
+
// Build and send metering data
|
|
65
|
+
const meteringData = (0, metering_1.buildMeteringData)({
|
|
66
|
+
model: response.model,
|
|
67
|
+
startTime,
|
|
68
|
+
endTime,
|
|
69
|
+
inputTokens: usage.prompt_tokens,
|
|
70
|
+
outputTokens: usage.completion_tokens,
|
|
71
|
+
totalTokens: usage.total_tokens,
|
|
72
|
+
transactionId,
|
|
73
|
+
isStreamed: false,
|
|
74
|
+
stopReason: finishReason || "END",
|
|
75
|
+
usageMetadata,
|
|
76
|
+
});
|
|
77
|
+
// Send metering data asynchronously (don't wait)
|
|
78
|
+
(0, metering_1.sendMeteringData)(meteringData).catch((error) => {
|
|
79
|
+
logger_1.logger.error("Failed to send metering data:", error);
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
content,
|
|
83
|
+
role,
|
|
84
|
+
finishReason,
|
|
85
|
+
usage: {
|
|
86
|
+
promptTokens: usage.prompt_tokens,
|
|
87
|
+
completionTokens: usage.completion_tokens,
|
|
88
|
+
totalTokens: usage.total_tokens,
|
|
89
|
+
},
|
|
90
|
+
model: response.model,
|
|
91
|
+
transactionId,
|
|
92
|
+
rawResponse: response,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logger_1.logger.error("Error in chat completion:", error.message);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a streaming chat completion
|
|
102
|
+
*/
|
|
103
|
+
async function createStreamingChatCompletion(params) {
|
|
104
|
+
const client = getClient();
|
|
105
|
+
const transactionId = (0, metering_1.generateTransactionId)();
|
|
106
|
+
const startTime = new Date();
|
|
107
|
+
try {
|
|
108
|
+
const { usageMetadata, ...requestParams } = params;
|
|
109
|
+
logger_1.logger.info(`Creating streaming chat completion with model: ${params.model}`);
|
|
110
|
+
const stream = await client.chat.completions.create({
|
|
111
|
+
model: requestParams.model,
|
|
112
|
+
messages: requestParams.messages,
|
|
113
|
+
max_tokens: requestParams.maxTokens,
|
|
114
|
+
temperature: requestParams.temperature,
|
|
115
|
+
top_p: requestParams.topP,
|
|
116
|
+
presence_penalty: requestParams.presencePenalty,
|
|
117
|
+
frequency_penalty: requestParams.frequencyPenalty,
|
|
118
|
+
stream: true,
|
|
119
|
+
});
|
|
120
|
+
// Wrap the stream to track metering
|
|
121
|
+
const wrappedStream = wrapStream(stream, transactionId, params.model, startTime, usageMetadata);
|
|
122
|
+
return {
|
|
123
|
+
stream: wrappedStream,
|
|
124
|
+
transactionId,
|
|
125
|
+
model: params.model,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger_1.logger.error("Error in streaming chat completion:", error.message);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Wrap stream to track metering data
|
|
135
|
+
*/
|
|
136
|
+
async function* wrapStream(stream, transactionId, model, startTime, usageMetadata) {
|
|
137
|
+
let lastChunk = null;
|
|
138
|
+
let inputTokens = 0;
|
|
139
|
+
let outputTokens = 0;
|
|
140
|
+
let totalTokens = 0;
|
|
141
|
+
try {
|
|
142
|
+
for await (const chunk of stream) {
|
|
143
|
+
lastChunk = chunk;
|
|
144
|
+
// Track usage if available in chunk
|
|
145
|
+
if (chunk.usage) {
|
|
146
|
+
inputTokens = chunk.usage.prompt_tokens || 0;
|
|
147
|
+
outputTokens = chunk.usage.completion_tokens || 0;
|
|
148
|
+
totalTokens = chunk.usage.total_tokens || 0;
|
|
149
|
+
}
|
|
150
|
+
yield chunk;
|
|
151
|
+
}
|
|
152
|
+
// Send metering data when stream completes
|
|
153
|
+
const endTime = new Date();
|
|
154
|
+
const finishReason = lastChunk?.choices?.[0]?.finish_reason || "END";
|
|
155
|
+
const meteringData = (0, metering_1.buildMeteringData)({
|
|
156
|
+
model,
|
|
157
|
+
startTime,
|
|
158
|
+
endTime,
|
|
159
|
+
inputTokens,
|
|
160
|
+
outputTokens,
|
|
161
|
+
totalTokens,
|
|
162
|
+
transactionId,
|
|
163
|
+
isStreamed: true,
|
|
164
|
+
stopReason: finishReason,
|
|
165
|
+
usageMetadata,
|
|
166
|
+
});
|
|
167
|
+
// Send metering data asynchronously (don't wait)
|
|
168
|
+
(0, metering_1.sendMeteringData)(meteringData).catch((error) => {
|
|
169
|
+
logger_1.logger.error("Failed to send metering data:", error);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
logger_1.logger.error("Error in stream processing:", error.message);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=perplexity-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity-client.js","sourceRoot":"","sources":["../../../../src/core/wrapper/perplexity-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenium Middleware for Perplexity
|
|
4
|
+
*
|
|
5
|
+
* A lightweight middleware that adds Revenium metering to Perplexity API calls.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import {
|
|
10
|
+
* initializeReveniumFromEnv,
|
|
11
|
+
* initializePerplexityFromEnv,
|
|
12
|
+
* createChatCompletion,
|
|
13
|
+
* } from '@revenium/perplexity';
|
|
14
|
+
*
|
|
15
|
+
* // Initialize configurations
|
|
16
|
+
* initializeReveniumFromEnv();
|
|
17
|
+
* initializePerplexityFromEnv();
|
|
18
|
+
*
|
|
19
|
+
* // Create a chat completion
|
|
20
|
+
* const result = await createChatCompletion({
|
|
21
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
22
|
+
* model: 'sonar-pro',
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* console.log(result.content);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.logger = exports.DEFAULT_MODEL = exports.PERPLEXITY_MODELS = exports.sendMeteringData = exports.buildMeteringData = exports.generateTransactionId = exports.createStreamingChatCompletion = exports.createChatCompletion = exports.getPerplexityConfig = exports.initializePerplexity = exports.initializePerplexityFromEnv = exports.enableRevenium = exports.disableRevenium = exports.isReveniumEnabled = exports.getReveniumConfig = exports.initializeRevenium = exports.initializeReveniumFromEnv = void 0;
|
|
30
|
+
const dotenv_1 = require("dotenv");
|
|
31
|
+
(0, dotenv_1.config)();
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Configuration
|
|
34
|
+
// ============================================================================
|
|
35
|
+
var revenium_config_1 = require("./core/config/revenium-config");
|
|
36
|
+
Object.defineProperty(exports, "initializeReveniumFromEnv", { enumerable: true, get: function () { return revenium_config_1.initializeReveniumFromEnv; } });
|
|
37
|
+
Object.defineProperty(exports, "initializeRevenium", { enumerable: true, get: function () { return revenium_config_1.initializeRevenium; } });
|
|
38
|
+
Object.defineProperty(exports, "getReveniumConfig", { enumerable: true, get: function () { return revenium_config_1.getReveniumConfig; } });
|
|
39
|
+
Object.defineProperty(exports, "isReveniumEnabled", { enumerable: true, get: function () { return revenium_config_1.isReveniumEnabled; } });
|
|
40
|
+
Object.defineProperty(exports, "disableRevenium", { enumerable: true, get: function () { return revenium_config_1.disableRevenium; } });
|
|
41
|
+
Object.defineProperty(exports, "enableRevenium", { enumerable: true, get: function () { return revenium_config_1.enableRevenium; } });
|
|
42
|
+
var perplexity_config_1 = require("./core/config/perplexity-config");
|
|
43
|
+
Object.defineProperty(exports, "initializePerplexityFromEnv", { enumerable: true, get: function () { return perplexity_config_1.initializePerplexityFromEnv; } });
|
|
44
|
+
Object.defineProperty(exports, "initializePerplexity", { enumerable: true, get: function () { return perplexity_config_1.initializePerplexity; } });
|
|
45
|
+
Object.defineProperty(exports, "getPerplexityConfig", { enumerable: true, get: function () { return perplexity_config_1.getPerplexityConfig; } });
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Core API
|
|
48
|
+
// ============================================================================
|
|
49
|
+
var perplexity_client_1 = require("./core/wrapper/perplexity-client");
|
|
50
|
+
Object.defineProperty(exports, "createChatCompletion", { enumerable: true, get: function () { return perplexity_client_1.createChatCompletion; } });
|
|
51
|
+
Object.defineProperty(exports, "createStreamingChatCompletion", { enumerable: true, get: function () { return perplexity_client_1.createStreamingChatCompletion; } });
|
|
52
|
+
var metering_1 = require("./core/tracking/metering");
|
|
53
|
+
Object.defineProperty(exports, "generateTransactionId", { enumerable: true, get: function () { return metering_1.generateTransactionId; } });
|
|
54
|
+
Object.defineProperty(exports, "buildMeteringData", { enumerable: true, get: function () { return metering_1.buildMeteringData; } });
|
|
55
|
+
Object.defineProperty(exports, "sendMeteringData", { enumerable: true, get: function () { return metering_1.sendMeteringData; } });
|
|
56
|
+
var types_1 = require("./types");
|
|
57
|
+
Object.defineProperty(exports, "PERPLEXITY_MODELS", { enumerable: true, get: function () { return types_1.PERPLEXITY_MODELS; } });
|
|
58
|
+
Object.defineProperty(exports, "DEFAULT_MODEL", { enumerable: true, get: function () { return types_1.DEFAULT_MODEL; } });
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Utilities
|
|
61
|
+
// ============================================================================
|
|
62
|
+
var logger_1 = require("./utils/logger");
|
|
63
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAEH,mCAAgC;AAChC,IAAA,eAAM,GAAE,CAAC;AAET,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,iEAQuC;AAPrC,4HAAA,yBAAyB,OAAA;AACzB,qHAAA,kBAAkB,OAAA;AAClB,oHAAA,iBAAiB,OAAA;AACjB,oHAAA,iBAAiB,OAAA;AACjB,kHAAA,eAAe,OAAA;AACf,iHAAA,cAAc,OAAA;AAIhB,qEAKyC;AAJvC,gIAAA,2BAA2B,OAAA;AAC3B,yHAAA,oBAAoB,OAAA;AACpB,wHAAA,mBAAmB,OAAA;AAIrB,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,sEAG0C;AAFxC,yHAAA,oBAAoB,OAAA;AACpB,kIAAA,6BAA6B,OAAA;AAG/B,qDAIkC;AAHhC,iHAAA,qBAAqB,OAAA;AACrB,6GAAA,iBAAiB,OAAA;AACjB,4GAAA,gBAAgB,OAAA;AAqBlB,iCAA2D;AAAlD,0GAAA,iBAAiB,OAAA;AAAE,sGAAA,aAAa,OAAA;AAEzC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,yCAAwC;AAA/B,gGAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript Type Definitions for Perplexity Middleware
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_MODEL = exports.PERPLEXITY_MODELS = void 0;
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Constants
|
|
9
|
+
// ============================================================================
|
|
10
|
+
exports.PERPLEXITY_MODELS = {
|
|
11
|
+
// Sonar Models (Online)
|
|
12
|
+
SONAR: "sonar",
|
|
13
|
+
SONAR_PRO: "sonar-pro",
|
|
14
|
+
SONAR_REASONING: "sonar-reasoning",
|
|
15
|
+
// Chat Models (Offline)
|
|
16
|
+
LLAMA_3_1_SONAR_SMALL_128K_CHAT: "llama-3.1-sonar-small-128k-chat",
|
|
17
|
+
LLAMA_3_1_SONAR_LARGE_128K_CHAT: "llama-3.1-sonar-large-128k-chat",
|
|
18
|
+
LLAMA_3_1_SONAR_HUGE_128K_CHAT: "llama-3.1-sonar-huge-128k-chat",
|
|
19
|
+
};
|
|
20
|
+
exports.DEFAULT_MODEL = exports.PERPLEXITY_MODELS.SONAR_PRO;
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA4LH,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAElE,QAAA,iBAAiB,GAAG;IAC/B,wBAAwB;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;IAElC,wBAAwB;IACxB,+BAA+B,EAAE,iCAAiC;IAClE,+BAA+B,EAAE,iCAAiC;IAClE,8BAA8B,EAAE,gCAAgC;CACxD,CAAC;AAKE,QAAA,aAAa,GAAoB,yBAAiB,CAAC,SAAS,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple logger utility
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logger = void 0;
|
|
7
|
+
exports.logger = {
|
|
8
|
+
info: (...args) => {
|
|
9
|
+
console.log("[Revenium]", ...args);
|
|
10
|
+
},
|
|
11
|
+
warn: (...args) => {
|
|
12
|
+
console.warn("[Revenium Warning]", ...args);
|
|
13
|
+
},
|
|
14
|
+
error: (...args) => {
|
|
15
|
+
console.error("[Revenium Error]", ...args);
|
|
16
|
+
},
|
|
17
|
+
debug: (...args) => {
|
|
18
|
+
if (process.env.DEBUG === "true") {
|
|
19
|
+
console.log("[Revenium Debug]", ...args);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACvB,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perplexity Configuration Module
|
|
3
|
+
* Manages Perplexity API configuration
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../../utils/logger";
|
|
6
|
+
let perplexityConfig = null;
|
|
7
|
+
/**
|
|
8
|
+
* Initialize Perplexity configuration from environment variables
|
|
9
|
+
*/
|
|
10
|
+
export function initializePerplexityFromEnv() {
|
|
11
|
+
const apiKey = process.env.PERPLEXITY_API_KEY;
|
|
12
|
+
const baseUrl = process.env.PERPLEXITY_API_BASE_URL || "https://api.perplexity.ai";
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
throw new Error("PERPLEXITY_API_KEY environment variable is required but not set");
|
|
15
|
+
}
|
|
16
|
+
perplexityConfig = {
|
|
17
|
+
apiKey,
|
|
18
|
+
baseUrl,
|
|
19
|
+
};
|
|
20
|
+
logger.info("Perplexity configuration initialized successfully");
|
|
21
|
+
return perplexityConfig;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize Perplexity configuration with custom values
|
|
25
|
+
*/
|
|
26
|
+
export function initializePerplexity(config) {
|
|
27
|
+
perplexityConfig = {
|
|
28
|
+
apiKey: config.apiKey,
|
|
29
|
+
baseUrl: config.baseUrl || "https://api.perplexity.ai",
|
|
30
|
+
};
|
|
31
|
+
logger.info("Perplexity configuration initialized with custom config");
|
|
32
|
+
return perplexityConfig;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get current Perplexity configuration
|
|
36
|
+
*/
|
|
37
|
+
export function getPerplexityConfig() {
|
|
38
|
+
return perplexityConfig;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=perplexity-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity-config.js","sourceRoot":"","sources":["../../../../src/core/config/perplexity-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,2BAA2B,CAAC;IAErE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,gBAAgB,GAAG;QACjB,MAAM;QACN,OAAO;KACR,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAGpC;IACC,gBAAgB,GAAG;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,2BAA2B;KACvD,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|