@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.
Files changed (183) hide show
  1. package/CHANGELOG.md +47 -10
  2. package/README.md +144 -720
  3. package/SECURITY.md +34 -0
  4. package/dist/cjs/constants/models.js +38 -0
  5. package/dist/cjs/constants/models.js.map +1 -0
  6. package/dist/cjs/core/client/index.js +13 -0
  7. package/dist/cjs/core/client/index.js.map +1 -0
  8. package/dist/cjs/core/client/manager.js +85 -0
  9. package/dist/cjs/core/client/manager.js.map +1 -0
  10. package/dist/cjs/core/config/index.js +21 -0
  11. package/dist/cjs/core/config/index.js.map +1 -0
  12. package/dist/cjs/core/config/loader.js +48 -0
  13. package/dist/cjs/core/config/loader.js.map +1 -0
  14. package/dist/cjs/core/config/manager.js +77 -0
  15. package/dist/cjs/core/config/manager.js.map +1 -0
  16. package/dist/cjs/core/config/validator.js +45 -0
  17. package/dist/cjs/core/config/validator.js.map +1 -0
  18. package/dist/cjs/core/middleware/index.js +14 -0
  19. package/dist/cjs/core/middleware/index.js.map +1 -0
  20. package/dist/cjs/core/middleware/interfaces.js +94 -0
  21. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  22. package/dist/cjs/core/middleware/revenium-client.js +44 -0
  23. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  24. package/dist/cjs/core/middleware/streaming-wrapper.js +80 -0
  25. package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -0
  26. package/dist/cjs/core/providers/detector.js +38 -0
  27. package/dist/cjs/core/providers/detector.js.map +1 -0
  28. package/dist/cjs/core/providers/index.js +14 -0
  29. package/dist/cjs/core/providers/index.js.map +1 -0
  30. package/dist/cjs/core/tracking/api-client.js +67 -0
  31. package/dist/cjs/core/tracking/api-client.js.map +1 -0
  32. package/dist/cjs/core/tracking/index.js +21 -0
  33. package/dist/cjs/core/tracking/index.js.map +1 -0
  34. package/dist/cjs/core/tracking/payload-builder.js +95 -0
  35. package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
  36. package/dist/cjs/core/tracking/usage-tracker.js +83 -0
  37. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
  38. package/dist/cjs/index.js +60 -54
  39. package/dist/cjs/index.js.map +1 -0
  40. package/dist/cjs/types/function-parameters.js +14 -0
  41. package/dist/cjs/types/function-parameters.js.map +1 -0
  42. package/dist/cjs/types/index.js +20 -16
  43. package/dist/cjs/types/index.js.map +1 -0
  44. package/dist/cjs/utils/constants.js +20 -0
  45. package/dist/cjs/utils/constants.js.map +1 -0
  46. package/dist/cjs/utils/error-handler.js +194 -0
  47. package/dist/cjs/utils/error-handler.js.map +1 -0
  48. package/dist/cjs/utils/metadata-builder.js +191 -0
  49. package/dist/cjs/utils/metadata-builder.js.map +1 -0
  50. package/dist/cjs/utils/stop-reason-mapper.js +74 -0
  51. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
  52. package/dist/cjs/utils/transaction-id.js +19 -0
  53. package/dist/cjs/utils/transaction-id.js.map +1 -0
  54. package/dist/cjs/utils/url-builder.js +57 -0
  55. package/dist/cjs/utils/url-builder.js.map +1 -0
  56. package/dist/esm/constants/models.js +35 -0
  57. package/dist/esm/constants/models.js.map +1 -0
  58. package/dist/esm/core/client/index.js +5 -0
  59. package/dist/esm/core/client/index.js.map +1 -0
  60. package/dist/esm/core/client/manager.js +78 -0
  61. package/dist/esm/core/client/manager.js.map +1 -0
  62. package/dist/esm/core/config/index.js +11 -0
  63. package/dist/esm/core/config/index.js.map +1 -0
  64. package/dist/esm/core/config/loader.js +45 -0
  65. package/dist/esm/core/config/loader.js.map +1 -0
  66. package/dist/esm/core/config/manager.js +70 -0
  67. package/dist/esm/core/config/manager.js.map +1 -0
  68. package/dist/esm/core/config/validator.js +42 -0
  69. package/dist/esm/core/config/validator.js.map +1 -0
  70. package/dist/esm/core/middleware/index.js +7 -0
  71. package/dist/esm/core/middleware/index.js.map +1 -0
  72. package/dist/esm/core/middleware/interfaces.js +89 -0
  73. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  74. package/dist/esm/core/middleware/revenium-client.js +37 -0
  75. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  76. package/dist/esm/core/middleware/streaming-wrapper.js +76 -0
  77. package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -0
  78. package/dist/esm/core/providers/detector.js +34 -0
  79. package/dist/esm/core/providers/detector.js.map +1 -0
  80. package/dist/esm/core/providers/index.js +9 -0
  81. package/dist/esm/core/providers/index.js.map +1 -0
  82. package/dist/esm/core/tracking/api-client.js +64 -0
  83. package/dist/esm/core/tracking/api-client.js.map +1 -0
  84. package/dist/esm/core/tracking/index.js +13 -0
  85. package/dist/esm/core/tracking/index.js.map +1 -0
  86. package/dist/esm/core/tracking/payload-builder.js +92 -0
  87. package/dist/esm/core/tracking/payload-builder.js.map +1 -0
  88. package/dist/esm/core/tracking/usage-tracker.js +79 -0
  89. package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
  90. package/dist/esm/index.js +46 -36
  91. package/dist/esm/index.js.map +1 -0
  92. package/dist/esm/types/function-parameters.js +13 -0
  93. package/dist/esm/types/function-parameters.js.map +1 -0
  94. package/dist/esm/types/index.js +6 -15
  95. package/dist/esm/types/index.js.map +1 -0
  96. package/dist/esm/utils/constants.js +17 -0
  97. package/dist/esm/utils/constants.js.map +1 -0
  98. package/dist/esm/utils/error-handler.js +182 -0
  99. package/dist/esm/utils/error-handler.js.map +1 -0
  100. package/dist/esm/utils/metadata-builder.js +183 -0
  101. package/dist/esm/utils/metadata-builder.js.map +1 -0
  102. package/dist/esm/utils/stop-reason-mapper.js +69 -0
  103. package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
  104. package/dist/esm/utils/transaction-id.js +16 -0
  105. package/dist/esm/utils/transaction-id.js.map +1 -0
  106. package/dist/esm/utils/url-builder.js +53 -0
  107. package/dist/esm/utils/url-builder.js.map +1 -0
  108. package/dist/types/constants/models.d.ts +39 -0
  109. package/dist/types/constants/models.d.ts.map +1 -0
  110. package/dist/types/core/client/index.d.ts +5 -0
  111. package/dist/types/core/client/index.d.ts.map +1 -0
  112. package/dist/types/core/client/manager.d.ts +44 -0
  113. package/dist/types/core/client/manager.d.ts.map +1 -0
  114. package/dist/types/core/config/index.d.ts +10 -0
  115. package/dist/types/core/config/index.d.ts.map +1 -0
  116. package/dist/types/core/config/loader.d.ts +13 -0
  117. package/dist/types/core/config/loader.d.ts.map +1 -0
  118. package/dist/types/core/config/manager.d.ts +28 -0
  119. package/dist/types/core/config/manager.d.ts.map +1 -0
  120. package/dist/types/core/config/validator.d.ts +12 -0
  121. package/dist/types/core/config/validator.d.ts.map +1 -0
  122. package/dist/types/core/middleware/index.d.ts +7 -0
  123. package/dist/types/core/middleware/index.d.ts.map +1 -0
  124. package/dist/types/core/middleware/interfaces.d.ts +35 -0
  125. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  126. package/dist/types/core/middleware/revenium-client.d.ts +25 -0
  127. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  128. package/dist/types/core/middleware/streaming-wrapper.d.ts +21 -0
  129. package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -0
  130. package/dist/types/core/providers/detector.d.ts +24 -0
  131. package/dist/types/core/providers/detector.d.ts.map +1 -0
  132. package/dist/types/core/providers/index.d.ts +8 -0
  133. package/dist/types/core/providers/index.d.ts.map +1 -0
  134. package/dist/types/core/tracking/api-client.d.ts +17 -0
  135. package/dist/types/core/tracking/api-client.d.ts.map +1 -0
  136. package/dist/types/core/tracking/index.d.ts +11 -0
  137. package/dist/types/core/tracking/index.d.ts.map +1 -0
  138. package/dist/types/core/tracking/payload-builder.d.ts +24 -0
  139. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
  140. package/dist/types/core/tracking/usage-tracker.d.ts +30 -0
  141. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
  142. package/dist/types/index.d.ts +56 -27
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/types/function-parameters.d.ts +185 -0
  145. package/dist/types/types/function-parameters.d.ts.map +1 -0
  146. package/dist/types/types/index.d.ts +108 -137
  147. package/dist/types/types/index.d.ts.map +1 -0
  148. package/dist/types/utils/constants.d.ts +9 -0
  149. package/dist/types/utils/constants.d.ts.map +1 -0
  150. package/dist/types/utils/error-handler.d.ts +95 -0
  151. package/dist/types/utils/error-handler.d.ts.map +1 -0
  152. package/dist/types/utils/metadata-builder.d.ts +65 -0
  153. package/dist/types/utils/metadata-builder.d.ts.map +1 -0
  154. package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
  155. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
  156. package/dist/types/utils/transaction-id.d.ts +14 -0
  157. package/dist/types/utils/transaction-id.d.ts.map +1 -0
  158. package/dist/types/utils/url-builder.d.ts +22 -0
  159. package/dist/types/utils/url-builder.d.ts.map +1 -0
  160. package/examples/README.md +136 -233
  161. package/examples/advanced.ts +123 -0
  162. package/examples/basic.ts +36 -46
  163. package/examples/getting_started.ts +41 -0
  164. package/examples/metadata.ts +55 -59
  165. package/examples/stream.ts +53 -0
  166. package/package.json +12 -17
  167. package/dist/cjs/core/config/perplexity-config.js +0 -45
  168. package/dist/cjs/core/config/revenium-config.js +0 -80
  169. package/dist/cjs/core/tracking/metering.js +0 -131
  170. package/dist/cjs/core/wrapper/perplexity-client.js +0 -177
  171. package/dist/cjs/utils/logger.js +0 -23
  172. package/dist/esm/core/config/perplexity-config.js +0 -40
  173. package/dist/esm/core/config/revenium-config.js +0 -72
  174. package/dist/esm/core/tracking/metering.js +0 -126
  175. package/dist/esm/core/wrapper/perplexity-client.js +0 -170
  176. package/dist/esm/utils/logger.js +0 -20
  177. package/dist/types/core/config/perplexity-config.d.ts +0 -24
  178. package/dist/types/core/config/revenium-config.d.ts +0 -37
  179. package/dist/types/core/tracking/metering.d.ts +0 -31
  180. package/dist/types/core/wrapper/perplexity-client.d.ts +0 -32
  181. package/dist/types/utils/logger.d.ts +0 -10
  182. package/examples/chat.ts +0 -87
  183. 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);
@@ -1,72 +1,68 @@
1
1
  /**
2
- * Custom Metadata Example
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
- console.log("Custom Metadata Example\n");
9
+ // Initialize middleware
10
+ Initialize();
17
11
 
18
- // Initialize configurations from environment variables
19
- console.log("Initializing configurations...");
20
- const reveniumConfig = initializeReveniumFromEnv();
21
- initializePerplexityFromEnv();
22
- console.log("Configurations initialized\n");
12
+ // Get client
13
+ const client = GetClient();
23
14
 
24
- // Create a chat completion with custom metadata
25
- console.log("Creating chat completion with custom metadata...");
26
- const result = await createChatCompletion({
27
- messages: [
28
- {
29
- role: "user",
30
- content: "What is 2 + 2?",
31
- },
32
- ],
33
- model: PERPLEXITY_MODELS.SONAR_PRO,
34
- maxTokens: 50,
35
- usageMetadata: {
36
- subscriber: {
37
- id: "user-123",
38
- email: "user@example.com",
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
- console.log("\nResponse:");
47
- console.log("─────────────────────────────────────────");
48
- console.log(`Content: ${result.content}`);
49
- console.log(`Model: ${result.model}`);
50
- console.log(`Transaction ID: ${result.transactionId}`);
51
- console.log(`\nToken Usage:`);
52
- console.log(` - Prompt Tokens: ${result.usage.promptTokens}`);
53
- console.log(` - Completion Tokens: ${result.usage.completionTokens}`);
54
- console.log(` - Total Tokens: ${result.usage.totalTokens}`);
55
- console.log("\nCustom Metadata:");
56
- console.log(` - Subscriber ID: user-123`);
57
- console.log(` - Organization ID: org-example`);
58
- console.log(` - Product ID: product-premium`);
59
- console.log(` - Trace ID: trace-abc-123`);
60
- console.log("─────────────────────────────────────────\n");
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
- console.log("Example completed successfully!");
63
- console.log(
64
- "Check your Revenium dashboard to see the metering data with custom metadata."
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((error) => {
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",
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/cjs/**/*.js",
25
- "dist/esm/**/*.js",
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:basic": "tsx examples/basic.ts",
40
- "example:streaming": "tsx examples/streaming.ts",
41
- "example:chat": "tsx examples/chat.ts",
42
- "example:metadata": "tsx examples/metadata.ts",
43
- "playground:basic": "node playground/basic.js",
44
- "playground:streaming": "node playground/streaming.js",
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": ">=16.0.0"
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