@revenium/perplexity 2.0.9 → 2.1.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/.env.example +4 -0
- package/CHANGELOG.md +25 -0
- package/README.md +103 -37
- package/dist/cjs/core/config/loader.js +6 -1
- package/dist/cjs/core/config/loader.js.map +1 -1
- package/dist/cjs/core/middleware/interfaces.js +38 -1
- package/dist/cjs/core/middleware/interfaces.js.map +1 -1
- package/dist/cjs/core/middleware/streaming-wrapper.js +67 -2
- package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -1
- package/dist/cjs/core/tracking/payload-builder.js +28 -0
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
- package/dist/cjs/core/tracking/usage-tracker.js +8 -5
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
- package/dist/cjs/utils/metadata-builder.js +36 -19
- package/dist/cjs/utils/metadata-builder.js.map +1 -1
- package/dist/cjs/utils/prompt-extraction.js +194 -0
- package/dist/cjs/utils/prompt-extraction.js.map +1 -0
- package/dist/esm/core/config/loader.js +6 -1
- package/dist/esm/core/config/loader.js.map +1 -1
- package/dist/esm/core/middleware/interfaces.js +38 -1
- package/dist/esm/core/middleware/interfaces.js.map +1 -1
- package/dist/esm/core/middleware/streaming-wrapper.js +67 -2
- package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -1
- package/dist/esm/core/tracking/payload-builder.js +28 -0
- package/dist/esm/core/tracking/payload-builder.js.map +1 -1
- package/dist/esm/core/tracking/usage-tracker.js +8 -5
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
- package/dist/esm/utils/metadata-builder.js +36 -19
- package/dist/esm/utils/metadata-builder.js.map +1 -1
- package/dist/esm/utils/prompt-extraction.js +188 -0
- package/dist/esm/utils/prompt-extraction.js.map +1 -0
- package/dist/types/core/config/loader.d.ts.map +1 -1
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -1
- package/dist/types/core/middleware/streaming-wrapper.d.ts +9 -1
- package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -1
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
- package/dist/types/core/tracking/usage-tracker.d.ts +8 -0
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
- package/dist/types/types/function-parameters.d.ts +7 -0
- package/dist/types/types/function-parameters.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +25 -4
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utils/metadata-builder.d.ts +3 -2
- package/dist/types/utils/metadata-builder.d.ts.map +1 -1
- package/dist/types/utils/prompt-extraction.d.ts +29 -0
- package/dist/types/utils/prompt-extraction.d.ts.map +1 -0
- package/examples/advanced.ts +5 -5
- package/examples/basic.ts +3 -3
- package/examples/getting_started.ts +3 -3
- package/examples/metadata.ts +3 -3
- package/examples/prompt-capture.ts +108 -0
- package/examples/stream.ts +3 -3
- package/package.json +2 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UsageMetadata } from "../types/index.js";
|
|
2
|
+
import { PerplexityChatRequest, PerplexityResponse } from "../types/function-parameters.js";
|
|
3
|
+
export declare function getMaxPromptSize(): number;
|
|
4
|
+
export interface PromptData {
|
|
5
|
+
systemPrompt?: string;
|
|
6
|
+
inputMessages?: string;
|
|
7
|
+
outputResponse?: string;
|
|
8
|
+
promptsTruncated: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Sanitizes common credential patterns from text.
|
|
12
|
+
*
|
|
13
|
+
* Redacts the following credential types:
|
|
14
|
+
* - OpenAI keys: sk-*, sk-proj-*, sk-ant-* (20+ chars)
|
|
15
|
+
* - Perplexity keys: pplx-* (20+ chars)
|
|
16
|
+
* - AWS access keys: AKIA* (20 chars)
|
|
17
|
+
* - GitHub tokens: ghp_*, ghs_* (36+ chars)
|
|
18
|
+
* - JWT tokens: eyJ*.eyJ*.*
|
|
19
|
+
* - Bearer tokens
|
|
20
|
+
* - Generic API keys, tokens, passwords, secrets (8-20+ chars)
|
|
21
|
+
*
|
|
22
|
+
* LIMITATIONS:
|
|
23
|
+
* - Shorter credentials may pass through unsanitized
|
|
24
|
+
* - Length constraints balance security with false positive prevention
|
|
25
|
+
*/
|
|
26
|
+
export declare function sanitizeCredentials(text: string): string;
|
|
27
|
+
export declare function shouldCapturePrompts(metadata?: UsageMetadata): boolean;
|
|
28
|
+
export declare function extractPrompts(params: PerplexityChatRequest, response: PerplexityResponse, metadata?: UsageMetadata): PromptData | null;
|
|
29
|
+
//# sourceMappingURL=prompt-extraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-extraction.d.ts","sourceRoot":"","sources":["../../../src/utils/prompt-extraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAMzC,wBAAgB,gBAAgB,IAAI,MAAM,CAezC;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0DxD;AA0ED,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAgBtE;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACvB,UAAU,GAAG,IAAI,CAmCnB"}
|
package/examples/advanced.ts
CHANGED
|
@@ -15,8 +15,8 @@ async function main() {
|
|
|
15
15
|
|
|
16
16
|
// Metadata for tracking
|
|
17
17
|
const metadata: UsageMetadata = {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
organizationName: "org-advanced-demo",
|
|
19
|
+
productName: "prod-perplexity-advanced",
|
|
20
20
|
taskType: "multi-turn-conversation",
|
|
21
21
|
subscriber: {
|
|
22
22
|
id: "user-advanced-001",
|
|
@@ -57,7 +57,7 @@ async function main() {
|
|
|
57
57
|
max_tokens: 500,
|
|
58
58
|
temperature: 0.7,
|
|
59
59
|
},
|
|
60
|
-
metadata
|
|
60
|
+
metadata,
|
|
61
61
|
);
|
|
62
62
|
|
|
63
63
|
console.log(`Assistant: ${response1.choices[0].message.content}\n`);
|
|
@@ -85,7 +85,7 @@ async function main() {
|
|
|
85
85
|
{
|
|
86
86
|
...metadata,
|
|
87
87
|
taskType: "creative-generation",
|
|
88
|
-
}
|
|
88
|
+
},
|
|
89
89
|
);
|
|
90
90
|
|
|
91
91
|
console.log(`Assistant: ${response2.choices[0].message.content}\n`);
|
|
@@ -111,7 +111,7 @@ async function main() {
|
|
|
111
111
|
{
|
|
112
112
|
...metadata,
|
|
113
113
|
taskType: "reasoning",
|
|
114
|
-
}
|
|
114
|
+
},
|
|
115
115
|
);
|
|
116
116
|
|
|
117
117
|
console.log(`Assistant: ${response3.choices[0].message.content}\n`);
|
package/examples/basic.ts
CHANGED
|
@@ -12,8 +12,8 @@ async function main() {
|
|
|
12
12
|
// Get client
|
|
13
13
|
const client = GetClient();
|
|
14
14
|
const metadata: UsageMetadata = {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
organizationName: "org-basic-demo",
|
|
16
|
+
productName: "prod-perplexity-basic",
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// Create chat completion
|
|
@@ -32,7 +32,7 @@ async function main() {
|
|
|
32
32
|
],
|
|
33
33
|
max_tokens: 1000,
|
|
34
34
|
},
|
|
35
|
-
metadata
|
|
35
|
+
metadata,
|
|
36
36
|
);
|
|
37
37
|
|
|
38
38
|
// Display response
|
|
@@ -12,8 +12,8 @@ async function main() {
|
|
|
12
12
|
// Get client
|
|
13
13
|
const client = GetClient();
|
|
14
14
|
const metadata: UsageMetadata = {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
organizationName: "org-getting-started",
|
|
16
|
+
productName: "prod-perplexity-getting-started",
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// Create a simple chat completion
|
|
@@ -31,7 +31,7 @@ async function main() {
|
|
|
31
31
|
],
|
|
32
32
|
max_tokens: 500,
|
|
33
33
|
},
|
|
34
|
-
metadata
|
|
34
|
+
metadata,
|
|
35
35
|
);
|
|
36
36
|
|
|
37
37
|
console.log("Assistant:", response.choices[0]?.message?.content);
|
package/examples/metadata.ts
CHANGED
|
@@ -15,11 +15,11 @@ async function main() {
|
|
|
15
15
|
// Optional metadata for advanced reporting, lineage tracking, and cost allocation
|
|
16
16
|
const metadata: UsageMetadata = {
|
|
17
17
|
// Organization & billing
|
|
18
|
-
|
|
18
|
+
organizationName: "org-metadata-demo",
|
|
19
19
|
subscriptionId: "plan-premium-2025",
|
|
20
20
|
|
|
21
21
|
// Product & task tracking
|
|
22
|
-
|
|
22
|
+
productName: "ai-assistant",
|
|
23
23
|
taskType: "explanation-request",
|
|
24
24
|
agent: "perplexity-metadata-chat-node",
|
|
25
25
|
|
|
@@ -55,7 +55,7 @@ async function main() {
|
|
|
55
55
|
],
|
|
56
56
|
max_tokens: 1000,
|
|
57
57
|
},
|
|
58
|
-
metadata
|
|
58
|
+
metadata,
|
|
59
59
|
);
|
|
60
60
|
|
|
61
61
|
// Display response
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Configure, GetClient, UsageMetadata } from "../src/index.js";
|
|
2
|
+
|
|
3
|
+
async function main() {
|
|
4
|
+
console.log("=== Perplexity Prompt Capture Example ===\n");
|
|
5
|
+
|
|
6
|
+
Configure({
|
|
7
|
+
reveniumApiKey: process.env.REVENIUM_METERING_API_KEY || "test-key",
|
|
8
|
+
reveniumBaseUrl: process.env.REVENIUM_METERING_BASE_URL,
|
|
9
|
+
perplexityApiKey: process.env.PERPLEXITY_API_KEY || "test-key",
|
|
10
|
+
capturePrompts: true,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const client = GetClient();
|
|
14
|
+
|
|
15
|
+
console.log("Example 1: Prompt capture enabled via config");
|
|
16
|
+
console.log("Making request with prompt capture enabled...\n");
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const metadata: UsageMetadata = {
|
|
20
|
+
organizationName: "org-prompt-capture-demo",
|
|
21
|
+
productName: "prod-perplexity-prompt-capture",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const response = await client
|
|
25
|
+
.chat()
|
|
26
|
+
.completions()
|
|
27
|
+
.create(
|
|
28
|
+
{
|
|
29
|
+
model: "sonar-pro",
|
|
30
|
+
messages: [
|
|
31
|
+
{
|
|
32
|
+
role: "system",
|
|
33
|
+
content:
|
|
34
|
+
"You are a helpful assistant that provides concise answers.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
role: "user",
|
|
38
|
+
content: "What is the capital of France?",
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
max_tokens: 100,
|
|
42
|
+
},
|
|
43
|
+
metadata,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
console.log("Response:", response.choices[0]?.message?.content);
|
|
47
|
+
console.log("\nPrompts captured and sent to Revenium API!");
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error(
|
|
50
|
+
"Error:",
|
|
51
|
+
error instanceof Error ? error.message : String(error),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log("\n" + "=".repeat(50) + "\n");
|
|
56
|
+
console.log("Example 2: Prompt capture disabled via metadata override");
|
|
57
|
+
console.log("Making request with prompt capture disabled...\n");
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
const metadata2: UsageMetadata = {
|
|
61
|
+
organizationName: "org-prompt-capture-demo",
|
|
62
|
+
productName: "prod-perplexity-prompt-capture",
|
|
63
|
+
capturePrompts: false,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const response2 = await client
|
|
67
|
+
.chat()
|
|
68
|
+
.completions()
|
|
69
|
+
.create(
|
|
70
|
+
{
|
|
71
|
+
model: "sonar-pro",
|
|
72
|
+
messages: [
|
|
73
|
+
{
|
|
74
|
+
role: "system",
|
|
75
|
+
content: "You are a helpful assistant.",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
role: "user",
|
|
79
|
+
content: "What is 2+2?",
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
max_tokens: 100,
|
|
83
|
+
},
|
|
84
|
+
metadata2,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
console.log("Response:", response2.choices[0]?.message?.content);
|
|
88
|
+
console.log("\nPrompts NOT captured (overridden via metadata)!");
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error(
|
|
91
|
+
"Error:",
|
|
92
|
+
error instanceof Error ? error.message : String(error),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log("\n" + "=".repeat(50) + "\n");
|
|
97
|
+
console.log("Example 3: Prompt capture with environment variable");
|
|
98
|
+
console.log("Set REVENIUM_CAPTURE_PROMPTS=true in your .env file\n");
|
|
99
|
+
|
|
100
|
+
console.log("✅ Prompt capture examples completed!");
|
|
101
|
+
console.log("\nConfiguration hierarchy:");
|
|
102
|
+
console.log("1. Per-call metadata (highest priority)");
|
|
103
|
+
console.log("2. Global config");
|
|
104
|
+
console.log("3. Environment variable REVENIUM_CAPTURE_PROMPTS");
|
|
105
|
+
console.log("4. Default: false (lowest priority)");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
main().catch(console.error);
|
package/examples/stream.ts
CHANGED
|
@@ -32,13 +32,13 @@ async function main() {
|
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
// Optional metadata
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
organizationName: "my-customers-name",
|
|
36
|
+
productName: "my-product",
|
|
37
37
|
subscriber: {
|
|
38
38
|
id: "user-123",
|
|
39
39
|
email: "user@example.com",
|
|
40
40
|
},
|
|
41
|
-
}
|
|
41
|
+
},
|
|
42
42
|
);
|
|
43
43
|
|
|
44
44
|
// Process stream
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revenium/perplexity",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
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": {
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"example:metadata": "npx tsx examples/metadata.ts",
|
|
47
47
|
"example:advanced": "npx tsx examples/advanced.ts",
|
|
48
48
|
"example:stream": "npx tsx examples/stream.ts",
|
|
49
|
+
"example:prompt-capture": "npx tsx examples/prompt-capture.ts",
|
|
49
50
|
"example": "npm run example:getting-started"
|
|
50
51
|
},
|
|
51
52
|
"keywords": [
|