@revenium/perplexity 2.0.3 → 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 +47 -10
- package/README.md +144 -720
- 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 -54
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/function-parameters.js +14 -0
- package/dist/cjs/types/function-parameters.js.map +1 -0
- package/dist/cjs/types/index.js +20 -16
- package/dist/cjs/types/index.js.map +1 -0
- 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 -36
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/function-parameters.js +13 -0
- package/dist/esm/types/function-parameters.js.map +1 -0
- package/dist/esm/types/index.js +6 -15
- package/dist/esm/types/index.js.map +1 -0
- 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 -0
- 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 -137
- package/dist/types/types/index.d.ts.map +1 -0
- 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 +136 -233
- package/examples/advanced.ts +123 -0
- package/examples/basic.ts +36 -46
- package/examples/getting_started.ts +41 -0
- package/examples/metadata.ts +55 -59
- package/examples/stream.ts +53 -0
- package/package.json +12 -17
- package/dist/cjs/core/config/perplexity-config.js +0 -45
- package/dist/cjs/core/config/revenium-config.js +0 -80
- package/dist/cjs/core/tracking/metering.js +0 -131
- package/dist/cjs/core/wrapper/perplexity-client.js +0 -177
- package/dist/cjs/utils/logger.js +0 -23
- package/dist/esm/core/config/perplexity-config.js +0 -40
- package/dist/esm/core/config/revenium-config.js +0 -72
- package/dist/esm/core/tracking/metering.js +0 -126
- package/dist/esm/core/wrapper/perplexity-client.js +0 -170
- package/dist/esm/utils/logger.js +0 -20
- package/dist/types/core/config/perplexity-config.d.ts +0 -24
- package/dist/types/core/config/revenium-config.d.ts +0 -37
- package/dist/types/core/tracking/metering.d.ts +0 -31
- package/dist/types/core/wrapper/perplexity-client.d.ts +0 -32
- package/dist/types/utils/logger.d.ts +0 -10
- package/examples/chat.ts +0 -87
- package/examples/streaming.ts +0 -61
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Getting Started with Revenium Perplexity Middleware
|
|
3
|
+
*
|
|
4
|
+
* This example shows the new Initialize/GetClient pattern.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Initialize, GetClient, UsageMetadata } from "@revenium/perplexity";
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
Initialize();
|
|
11
|
+
|
|
12
|
+
// Get client
|
|
13
|
+
const client = GetClient();
|
|
14
|
+
const metadata: UsageMetadata = {
|
|
15
|
+
organizationId: "org-getting-started",
|
|
16
|
+
productId: "prod-perplexity-getting-started",
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Create a simple chat completion
|
|
20
|
+
const response = await client
|
|
21
|
+
.chat()
|
|
22
|
+
.completions()
|
|
23
|
+
.create(
|
|
24
|
+
{
|
|
25
|
+
model: "sonar-pro",
|
|
26
|
+
messages: [
|
|
27
|
+
{
|
|
28
|
+
role: "user",
|
|
29
|
+
content: "What is artificial intelligence?",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
max_tokens: 500,
|
|
33
|
+
},
|
|
34
|
+
metadata
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
console.log("Assistant:", response.choices[0]?.message?.content);
|
|
38
|
+
console.log("\nUsage:", response.usage);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
main().catch(console.error);
|
package/examples/metadata.ts
CHANGED
|
@@ -1,72 +1,68 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* This example demonstrates how to pass custom metadata
|
|
5
|
-
* for tracking and metering purposes.
|
|
2
|
+
* Metadata Example
|
|
3
|
+
* Demonstrates advanced metadata usage with Revenium Perplexity middleware.
|
|
6
4
|
*/
|
|
7
5
|
|
|
8
|
-
import {
|
|
9
|
-
initializeReveniumFromEnv,
|
|
10
|
-
initializePerplexityFromEnv,
|
|
11
|
-
createChatCompletion,
|
|
12
|
-
PERPLEXITY_MODELS,
|
|
13
|
-
} from "../src";
|
|
6
|
+
import { Initialize, GetClient, UsageMetadata } from "@revenium/perplexity";
|
|
14
7
|
|
|
15
8
|
async function main() {
|
|
16
|
-
|
|
9
|
+
// Initialize middleware
|
|
10
|
+
Initialize();
|
|
17
11
|
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
const reveniumConfig = initializeReveniumFromEnv();
|
|
21
|
-
initializePerplexityFromEnv();
|
|
22
|
-
console.log("Configurations initialized\n");
|
|
12
|
+
// Get client
|
|
13
|
+
const client = GetClient();
|
|
23
14
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
15
|
+
// Optional metadata for advanced reporting, lineage tracking, and cost allocation
|
|
16
|
+
const metadata: UsageMetadata = {
|
|
17
|
+
// Organization & billing
|
|
18
|
+
organizationId: "org-metadata-demo",
|
|
19
|
+
subscriptionId: "plan-premium-2025",
|
|
20
|
+
|
|
21
|
+
// Product & task tracking
|
|
22
|
+
productId: "ai-assistant",
|
|
23
|
+
taskType: "explanation-request",
|
|
24
|
+
agent: "perplexity-metadata-chat-node",
|
|
25
|
+
|
|
26
|
+
// Session tracking
|
|
27
|
+
traceId: "session-" + Date.now(),
|
|
28
|
+
|
|
29
|
+
// Quality metrics
|
|
30
|
+
responseQualityScore: 0.95, // 0.0-1.0 scale
|
|
31
|
+
|
|
32
|
+
// User tracking
|
|
33
|
+
subscriber: {
|
|
34
|
+
id: "user-12345",
|
|
35
|
+
email: "developer@company.com",
|
|
36
|
+
credential: {
|
|
37
|
+
name: "api-key-prod",
|
|
38
|
+
value: "key-abc-123",
|
|
39
39
|
},
|
|
40
|
-
organizationId: "org-example",
|
|
41
|
-
productId: "product-premium",
|
|
42
|
-
traceId: "trace-abc-123",
|
|
43
40
|
},
|
|
44
|
-
}
|
|
41
|
+
};
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
43
|
+
const response = await client
|
|
44
|
+
.chat()
|
|
45
|
+
.completions()
|
|
46
|
+
.create(
|
|
47
|
+
{
|
|
48
|
+
model: "sonar-pro",
|
|
49
|
+
messages: [
|
|
50
|
+
{
|
|
51
|
+
role: "user",
|
|
52
|
+
content:
|
|
53
|
+
"Say hello in Spanish and explain why Spanish is a beautiful language in 2-3 sentences.",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
max_tokens: 1000,
|
|
57
|
+
},
|
|
58
|
+
metadata
|
|
59
|
+
);
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
// Display response
|
|
62
|
+
if (response.choices.length > 0) {
|
|
63
|
+
console.log(`Assistant: ${response.choices[0].message.content}`);
|
|
64
|
+
}
|
|
65
|
+
console.log("\nUsage data sent to Revenium! Check your dashboard");
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
main().catch(
|
|
69
|
-
console.error("Error:", error.message);
|
|
70
|
-
process.exit(1);
|
|
71
|
-
});
|
|
72
|
-
|
|
68
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Example with Revenium Perplexity Middleware (New Go-Aligned API)
|
|
3
|
+
*
|
|
4
|
+
* This example shows how to use streaming with the new API.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Initialize, GetClient } from "@revenium/perplexity";
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
// Initialize from environment variables
|
|
11
|
+
Initialize();
|
|
12
|
+
|
|
13
|
+
// Get client
|
|
14
|
+
const client = GetClient();
|
|
15
|
+
|
|
16
|
+
console.log("Streaming response:\n");
|
|
17
|
+
|
|
18
|
+
// Create a streaming chat completion
|
|
19
|
+
const stream = await client
|
|
20
|
+
.chat()
|
|
21
|
+
.completions()
|
|
22
|
+
.createStreaming(
|
|
23
|
+
{
|
|
24
|
+
model: "sonar-pro",
|
|
25
|
+
messages: [
|
|
26
|
+
{
|
|
27
|
+
role: "user",
|
|
28
|
+
content: "Write a short poem about AI",
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
max_tokens: 200,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
// Optional metadata
|
|
35
|
+
organizationId: "my-customers-name",
|
|
36
|
+
productId: "my-product",
|
|
37
|
+
subscriber: {
|
|
38
|
+
id: "user-123",
|
|
39
|
+
email: "user@example.com",
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// Process stream
|
|
45
|
+
for await (const chunk of stream) {
|
|
46
|
+
const content = chunk.choices[0]?.delta?.content || "";
|
|
47
|
+
process.stdout.write(content);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
console.log("\n\nUsage data sent to Revenium! Check your dashboard");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
main().catch(console.error);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revenium/perplexity",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"description": "NodeJS middleware for Perplexity AI API with Revenium metering",
|
|
5
5
|
"homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -21,13 +21,12 @@
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
|
-
"dist/
|
|
25
|
-
"
|
|
26
|
-
"dist/types/**/*.d.ts",
|
|
27
|
-
"examples/**/*",
|
|
24
|
+
"dist/",
|
|
25
|
+
"examples/",
|
|
28
26
|
"README.md",
|
|
29
27
|
"CHANGELOG.md",
|
|
30
|
-
"LICENSE"
|
|
28
|
+
"LICENSE",
|
|
29
|
+
"SECURITY.md"
|
|
31
30
|
],
|
|
32
31
|
"scripts": {
|
|
33
32
|
"clean": "rm -rf dist",
|
|
@@ -36,15 +35,12 @@
|
|
|
36
35
|
"build:types": "tsc -p tsconfig.types.json",
|
|
37
36
|
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:types",
|
|
38
37
|
"prepublishOnly": "npm run build",
|
|
39
|
-
"example:
|
|
40
|
-
"example:
|
|
41
|
-
"example:
|
|
42
|
-
"example:
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"playground:chat": "node playground/chat.js",
|
|
46
|
-
"playground:metadata": "node playground/metadata.js",
|
|
47
|
-
"test": "npm run example:basic && npm run example:streaming && npm run example:chat && npm run example:metadata"
|
|
38
|
+
"example:getting-started": "npx tsx examples/getting_started.ts",
|
|
39
|
+
"example:basic": "npx tsx examples/basic.ts",
|
|
40
|
+
"example:metadata": "npx tsx examples/metadata.ts",
|
|
41
|
+
"example:advanced": "npx tsx examples/advanced.ts",
|
|
42
|
+
"example:stream": "npx tsx examples/stream.ts",
|
|
43
|
+
"test": "npm run example:getting-started && npm run example:stream"
|
|
48
44
|
},
|
|
49
45
|
"keywords": [
|
|
50
46
|
"revenium",
|
|
@@ -59,9 +55,8 @@
|
|
|
59
55
|
],
|
|
60
56
|
"author": "Revenium",
|
|
61
57
|
"license": "MIT",
|
|
62
|
-
"type": "commonjs",
|
|
63
58
|
"engines": {
|
|
64
|
-
"node": ">=
|
|
59
|
+
"node": ">=20.0.0"
|
|
65
60
|
},
|
|
66
61
|
"dependencies": {
|
|
67
62
|
"dotenv": "^17.2.2",
|
|
@@ -1,45 +0,0 @@
|
|
|
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
|
|
@@ -1,80 +0,0 @@
|
|
|
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
|
|
@@ -1,131 +0,0 @@
|
|
|
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
|