@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.
Files changed (53) hide show
  1. package/.env.example +4 -0
  2. package/CHANGELOG.md +25 -0
  3. package/README.md +103 -37
  4. package/dist/cjs/core/config/loader.js +6 -1
  5. package/dist/cjs/core/config/loader.js.map +1 -1
  6. package/dist/cjs/core/middleware/interfaces.js +38 -1
  7. package/dist/cjs/core/middleware/interfaces.js.map +1 -1
  8. package/dist/cjs/core/middleware/streaming-wrapper.js +67 -2
  9. package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -1
  10. package/dist/cjs/core/tracking/payload-builder.js +28 -0
  11. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  12. package/dist/cjs/core/tracking/usage-tracker.js +8 -5
  13. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  14. package/dist/cjs/utils/metadata-builder.js +36 -19
  15. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  16. package/dist/cjs/utils/prompt-extraction.js +194 -0
  17. package/dist/cjs/utils/prompt-extraction.js.map +1 -0
  18. package/dist/esm/core/config/loader.js +6 -1
  19. package/dist/esm/core/config/loader.js.map +1 -1
  20. package/dist/esm/core/middleware/interfaces.js +38 -1
  21. package/dist/esm/core/middleware/interfaces.js.map +1 -1
  22. package/dist/esm/core/middleware/streaming-wrapper.js +67 -2
  23. package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -1
  24. package/dist/esm/core/tracking/payload-builder.js +28 -0
  25. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  26. package/dist/esm/core/tracking/usage-tracker.js +8 -5
  27. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  28. package/dist/esm/utils/metadata-builder.js +36 -19
  29. package/dist/esm/utils/metadata-builder.js.map +1 -1
  30. package/dist/esm/utils/prompt-extraction.js +188 -0
  31. package/dist/esm/utils/prompt-extraction.js.map +1 -0
  32. package/dist/types/core/config/loader.d.ts.map +1 -1
  33. package/dist/types/core/middleware/interfaces.d.ts.map +1 -1
  34. package/dist/types/core/middleware/streaming-wrapper.d.ts +9 -1
  35. package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -1
  36. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  37. package/dist/types/core/tracking/usage-tracker.d.ts +8 -0
  38. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  39. package/dist/types/types/function-parameters.d.ts +7 -0
  40. package/dist/types/types/function-parameters.d.ts.map +1 -1
  41. package/dist/types/types/index.d.ts +25 -4
  42. package/dist/types/types/index.d.ts.map +1 -1
  43. package/dist/types/utils/metadata-builder.d.ts +3 -2
  44. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  45. package/dist/types/utils/prompt-extraction.d.ts +29 -0
  46. package/dist/types/utils/prompt-extraction.d.ts.map +1 -0
  47. package/examples/advanced.ts +5 -5
  48. package/examples/basic.ts +3 -3
  49. package/examples/getting_started.ts +3 -3
  50. package/examples/metadata.ts +3 -3
  51. package/examples/prompt-capture.ts +108 -0
  52. package/examples/stream.ts +3 -3
  53. 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"}
@@ -15,8 +15,8 @@ async function main() {
15
15
 
16
16
  // Metadata for tracking
17
17
  const metadata: UsageMetadata = {
18
- organizationId: "org-advanced-demo",
19
- productId: "prod-perplexity-advanced",
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
- organizationId: "org-basic-demo",
16
- productId: "prod-perplexity-basic",
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
- organizationId: "org-getting-started",
16
- productId: "prod-perplexity-getting-started",
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);
@@ -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
- organizationId: "org-metadata-demo",
18
+ organizationName: "org-metadata-demo",
19
19
  subscriptionId: "plan-premium-2025",
20
20
 
21
21
  // Product & task tracking
22
- productId: "ai-assistant",
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);
@@ -32,13 +32,13 @@ async function main() {
32
32
  },
33
33
  {
34
34
  // Optional metadata
35
- organizationId: "my-customers-name",
36
- productId: "my-product",
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.0.9",
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": [