@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
package/SECURITY.md ADDED
@@ -0,0 +1,34 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a Vulnerability
4
+
5
+ If you discover a security vulnerability in this package, please report it to us.
6
+
7
+ **DO NOT** create a public GitHub issue for security vulnerabilities.
8
+
9
+ ### How to Report
10
+
11
+ Email: support@revenium.io
12
+
13
+ Please include:
14
+ - Package name and version
15
+ - Description of the vulnerability
16
+ - Steps to reproduce (if applicable)
17
+ - Potential impact
18
+ - Suggested fix (if available)
19
+
20
+ We will review and respond to security reports in a timely manner.
21
+
22
+ ## Security Best Practices
23
+
24
+ When using this middleware:
25
+
26
+ 1. **API Keys**: Never commit API keys to version control
27
+ 2. **Environment Variables**: Use environment variables for sensitive configuration
28
+ 3. **PII Handling**: Ensure no PII is sent to Revenium unless explicitly configured for billing purposes
29
+ 4. **Network Security**: Always use HTTPS connections
30
+ 5. **Updates**: Keep the package updated to the latest version
31
+
32
+ ## Additional Resources
33
+
34
+ - [Revenium Documentation](https://docs.revenium.io)
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Perplexity Model Constants
4
+ *
5
+ * Official model names for Perplexity AI.
6
+ * Use these constants instead of hardcoding model strings.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { PERPLEXITY_MODELS } from "@revenium/perplexity";
11
+ *
12
+ * const response = await client.chat().completions().create({
13
+ * model: PERPLEXITY_MODELS.SONAR_PRO,
14
+ * messages: [{ role: "user", content: "Hello!" }]
15
+ * });
16
+ * ```
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.PERPLEXITY_MODELS = void 0;
20
+ /**
21
+ * Available Perplexity AI models
22
+ * @see https://docs.perplexity.ai/docs/model-cards
23
+ */
24
+ exports.PERPLEXITY_MODELS = {
25
+ /**
26
+ * Sonar Pro - Most capable model for complex queries
27
+ */
28
+ SONAR_PRO: "sonar-pro",
29
+ /**
30
+ * Sonar - Standard model for most use cases
31
+ */
32
+ SONAR: "sonar",
33
+ /**
34
+ * Sonar Reasoning - Specialized for reasoning tasks
35
+ */
36
+ SONAR_REASONING: "sonar-reasoning",
37
+ };
38
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/constants/models.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH;;;GAGG;AACU,QAAA,iBAAiB,GAAG;IAC/B;;OAEG;IACH,SAAS,EAAE,WAAoB;IAE/B;;OAEG;IACH,KAAK,EAAE,OAAgB;IAEvB;;OAEG;IACH,eAAe,EAAE,iBAA0B;CACnC,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Client module exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Configure = exports.Reset = exports.IsInitialized = exports.GetClient = exports.Initialize = void 0;
7
+ var manager_js_1 = require("./manager.js");
8
+ Object.defineProperty(exports, "Initialize", { enumerable: true, get: function () { return manager_js_1.Initialize; } });
9
+ Object.defineProperty(exports, "GetClient", { enumerable: true, get: function () { return manager_js_1.GetClient; } });
10
+ Object.defineProperty(exports, "IsInitialized", { enumerable: true, get: function () { return manager_js_1.IsInitialized; } });
11
+ Object.defineProperty(exports, "Reset", { enumerable: true, get: function () { return manager_js_1.Reset; } });
12
+ Object.defineProperty(exports, "Configure", { enumerable: true, get: function () { return manager_js_1.Configure; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/client/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAAsF;AAA7E,wGAAA,UAAU,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,2GAAA,aAAa,OAAA;AAAE,mGAAA,KAAK,OAAA;AAAE,uGAAA,SAAS,OAAA"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Client Manager - singleton pattern
4
+ *
5
+ * Provides Initialize/GetClient pattern.
6
+ * Manages singleton instance of ReveniumPerplexity client.
7
+ *
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.Initialize = Initialize;
11
+ exports.Configure = Configure;
12
+ exports.GetClient = GetClient;
13
+ exports.IsInitialized = IsInitialized;
14
+ exports.Reset = Reset;
15
+ const revenium_client_js_1 = require("../middleware/revenium-client.js");
16
+ const manager_js_1 = require("../config/manager.js");
17
+ const validator_js_1 = require("../config/validator.js");
18
+ /**
19
+ * Singleton instance of ReveniumPerplexity client
20
+ */
21
+ let clientInstance = null;
22
+ const logger = (0, manager_js_1.getLogger)();
23
+ /**
24
+ * Initialize Revenium Perplexity client from environment variables
25
+ *
26
+ * Loads configuration from environment:
27
+ * - REVENIUM_METERING_API_KEY (required)
28
+ * - PERPLEXITY_API_KEY (required)
29
+ * @throws {Error} If required environment variables are missing
30
+ */
31
+ function Initialize() {
32
+ logger.debug("Initializing Revenium Perplexity client");
33
+ const config = (0, manager_js_1.initializeConfig)();
34
+ Configure(config);
35
+ logger.debug("Revenium Perplexity client initialized successfully");
36
+ }
37
+ /**
38
+ * Configure Revenium Perplexity client with custom configuration
39
+ *
40
+ * @param config - Configuration object
41
+ * @throws {Error} If required configuration fields are missing
42
+ *
43
+ */
44
+ function Configure(config) {
45
+ logger.debug("Configuring Revenium Perplexity client");
46
+ // Validate configuration (including API key formats)
47
+ (0, validator_js_1.validateConfig)(config);
48
+ const fullConfig = {
49
+ ...config,
50
+ reveniumBaseUrl: config.reveniumBaseUrl || "https://api.revenium.ai",
51
+ perplexityBaseUrl: config.perplexityBaseUrl || "https://api.perplexity.ai",
52
+ debug: config.debug ?? false,
53
+ };
54
+ clientInstance = new revenium_client_js_1.ReveniumPerplexity(fullConfig);
55
+ if (fullConfig.debug) {
56
+ logger.debug("Revenium Perplexity client initialized successfully");
57
+ }
58
+ }
59
+ /**
60
+ * Get the singleton ReveniumPerplexity client instance
61
+ *
62
+ * @returns {ReveniumPerplexity} The client instance
63
+ * @throws {Error} If client has not been initialized
64
+ *
65
+ */
66
+ function GetClient() {
67
+ if (!clientInstance) {
68
+ throw new Error("Revenium Perplexity client not initialized. Call Initialize() or Configure() first.");
69
+ }
70
+ return clientInstance;
71
+ }
72
+ /**
73
+ * Check if client has been initialized
74
+ * @returns {boolean} True if client is initialized
75
+ */
76
+ function IsInitialized() {
77
+ return clientInstance !== null;
78
+ }
79
+ /**
80
+ * Reset the client instance (useful for testing)
81
+ */
82
+ function Reset() {
83
+ clientInstance = null;
84
+ }
85
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/core/client/manager.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAsBH,gCAOC;AASD,8BAkBC;AASD,8BAOC;AAMD,sCAEC;AAKD,sBAEC;AArFD,yEAAsE;AAEtE,qDAAmE;AACnE,yDAAwD;AAExD;;GAEG;AACH,IAAI,cAAc,GAA8B,IAAI,CAAC;AACrD,MAAM,MAAM,GAAG,IAAA,sBAAS,GAAE,CAAC;AAG3B;;;;;;;GAOG;AACH,SAAgB,UAAU;IACxB,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,IAAA,6BAAgB,GAAE,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,CAAC;IAElB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,MAAsB;IAC9C,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAEvD,qDAAqD;IACrD,IAAA,6BAAc,EAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAmB;QACjC,GAAG,MAAM;QACT,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,yBAAyB;QACpE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,2BAA2B;QAC1E,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;KAC7B,CAAC;IAEF,cAAc,GAAG,IAAI,uCAAkB,CAAC,UAAU,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,OAAO,cAAc,KAAK,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK;IACnB,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration module - Main exports
4
+ *
5
+ * This module provides a clean interface for configuration management.
6
+ * Aligned with OpenAI modular implementation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.defaultLogger = exports.initializeConfig = exports.getLogger = exports.setConfig = exports.getConfig = exports.validateConfig = exports.loadConfigFromEnv = void 0;
10
+ // Re-export all configuration functionality
11
+ var loader_js_1 = require("./loader.js");
12
+ Object.defineProperty(exports, "loadConfigFromEnv", { enumerable: true, get: function () { return loader_js_1.loadConfigFromEnv; } });
13
+ var validator_js_1 = require("./validator.js");
14
+ Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return validator_js_1.validateConfig; } });
15
+ var manager_js_1 = require("./manager.js");
16
+ Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return manager_js_1.getConfig; } });
17
+ Object.defineProperty(exports, "setConfig", { enumerable: true, get: function () { return manager_js_1.setConfig; } });
18
+ Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return manager_js_1.getLogger; } });
19
+ Object.defineProperty(exports, "initializeConfig", { enumerable: true, get: function () { return manager_js_1.initializeConfig; } });
20
+ Object.defineProperty(exports, "defaultLogger", { enumerable: true, get: function () { return manager_js_1.defaultLogger; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/config/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,4CAA4C;AAC5C,yCAAgD;AAAvC,8GAAA,iBAAiB,OAAA;AAE1B,+CAAgD;AAAvC,8GAAA,cAAc,OAAA;AAEvB,2CAMsB;AALpB,uGAAA,SAAS,OAAA;AACT,uGAAA,SAAS,OAAA;AACT,uGAAA,SAAS,OAAA;AACT,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Loader Module
4
+ *
5
+ * Handles loading configuration from environment variables.
6
+ * Separated from validation and management for single responsibility.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.loadConfigFromEnv = loadConfigFromEnv;
10
+ const dotenv_1 = require("dotenv");
11
+ /**
12
+ * Default URLs for consistency with other middleware
13
+ */
14
+ const DEFAULT_REVENIUM_BASE_URL = "https://api.revenium.ai";
15
+ const DEFAULT_PERPLEXITY_BASE_URL = "https://api.perplexity.ai";
16
+ /**
17
+ * Flag to track if .env file has been loaded
18
+ */
19
+ let envFileLoaded = false;
20
+ /**
21
+ * Load configuration from environment variables
22
+ * Automatically loads .env file from current directory if present
23
+ */
24
+ function loadConfigFromEnv() {
25
+ if (!envFileLoaded) {
26
+ (0, dotenv_1.config)();
27
+ envFileLoaded = true;
28
+ }
29
+ const reveniumApiKey = process.env.REVENIUM_METERING_API_KEY || process.env.REVENIUM_API_KEY;
30
+ const reveniumBaseUrl = process.env.REVENIUM_METERING_BASE_URL ||
31
+ process.env.REVENIUM_BASE_URL ||
32
+ DEFAULT_REVENIUM_BASE_URL;
33
+ const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
34
+ const perplexityBaseUrl = process.env.PERPLEXITY_API_BASE_URL || DEFAULT_PERPLEXITY_BASE_URL;
35
+ const debug = process.env.REVENIUM_DEBUG === "true";
36
+ if (!reveniumApiKey)
37
+ return null;
38
+ if (!perplexityApiKey)
39
+ return null;
40
+ return {
41
+ reveniumApiKey,
42
+ reveniumBaseUrl,
43
+ perplexityApiKey,
44
+ perplexityBaseUrl,
45
+ debug,
46
+ };
47
+ }
48
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/core/config/loader.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoBH,8CA2BC;AA5CD,mCAA8C;AAE9C;;GAEG;AACH,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AAC5D,MAAM,2BAA2B,GAAG,2BAA2B,CAAC;AAEhE;;GAEG;AACH,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAA,eAAU,GAAE,CAAC;QACb,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACxE,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,yBAAyB,CAAC;IAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,iBAAiB,GACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,2BAA2B,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC;IAEpD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,cAAc;QACd,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Manager Module
4
+ *
5
+ * Handles global configuration state management and logging.
6
+ * Aligned with OpenAI modular implementation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.defaultLogger = void 0;
10
+ exports.getConfig = getConfig;
11
+ exports.setConfig = setConfig;
12
+ exports.getLogger = getLogger;
13
+ exports.initializeConfig = initializeConfig;
14
+ const loader_js_1 = require("./loader.js");
15
+ const validator_js_1 = require("./validator.js");
16
+ /**
17
+ * Global configuration instance
18
+ */
19
+ let globalConfig = null;
20
+ /**
21
+ * Default console logger implementation
22
+ */
23
+ exports.defaultLogger = {
24
+ debug: (message, ...args) => {
25
+ if (globalConfig?.debug || process.env.REVENIUM_DEBUG === "true") {
26
+ console.debug(`[Revenium Debug] ${message}`, ...args);
27
+ }
28
+ },
29
+ info: (message, ...args) => {
30
+ console.info(`[Revenium] ${message}`, ...args);
31
+ },
32
+ warn: (message, ...args) => {
33
+ console.warn(`[Revenium Warning] ${message}`, ...args);
34
+ },
35
+ error: (message, ...args) => {
36
+ console.error(`[Revenium Error] ${message}`, ...args);
37
+ },
38
+ };
39
+ let globalLogger = exports.defaultLogger;
40
+ /**
41
+ * Get the current global configuration
42
+ */
43
+ function getConfig() {
44
+ return globalConfig;
45
+ }
46
+ /**
47
+ * Set the global configuration
48
+ */
49
+ function setConfig(config) {
50
+ (0, validator_js_1.validateConfig)(config);
51
+ globalConfig = config;
52
+ globalLogger.debug("Revenium configuration updated", {
53
+ baseUrl: config.reveniumBaseUrl,
54
+ hasReveniumKey: !!config.reveniumApiKey,
55
+ hasPerplexityKey: !!config.perplexityApiKey,
56
+ });
57
+ }
58
+ /**
59
+ * Get the current logger
60
+ */
61
+ function getLogger() {
62
+ return globalLogger;
63
+ }
64
+ /**
65
+ * Initialize configuration from environment variables
66
+ */
67
+ function initializeConfig() {
68
+ const envConfig = (0, loader_js_1.loadConfigFromEnv)();
69
+ if (!envConfig) {
70
+ globalLogger.error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
71
+ throw new Error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
72
+ }
73
+ setConfig(envConfig);
74
+ globalLogger.debug("Revenium middleware initialized from environment variables");
75
+ return envConfig;
76
+ }
77
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/core/config/manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAuCH,8BAEC;AAKD,8BAQC;AAKD,8BAEC;AAKD,4CAkBC;AAjFD,2CAAgD;AAChD,iDAAgD;AAIhD;;GAEG;AACH,IAAI,YAAY,GAA0B,IAAI,CAAC;AAG/C;;GAEG;AACU,QAAA,aAAa,GAAW;IACnC,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,IAAI,YAAY,GAAW,qBAAa,CAAC;AAEzC;;GAEG;AACH,SAAgB,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,MAAsB;IAC9C,IAAA,6BAAc,EAAC,MAAM,CAAC,CAAC;IACvB,YAAY,GAAG,MAAM,CAAC;IACtB,YAAY,CAAC,KAAK,CAAC,gCAAgC,EAAE;QACnD,OAAO,EAAE,MAAM,CAAC,eAAe;QAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACvC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB;KAC5C,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,SAAS,GAAG,IAAA,6BAAiB,GAAE,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,CAChB,iHAAiH,CAClH,CAAC;QACF,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,YAAY,CAAC,KAAK,CAChB,4DAA4D,CAC7D,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Validator Module
4
+ *
5
+ * Handles validation of configuration objects.
6
+ * Separated from loading and management for single responsibility.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.validateConfig = validateConfig;
10
+ /**
11
+ * Validate Revenium configuration
12
+ */
13
+ function validateConfig(config) {
14
+ if (!config.reveniumApiKey) {
15
+ throw new Error("Revenium API key is required. Set REVENIUM_METERING_API_KEY environment variable or provide reveniumApiKey in config.");
16
+ }
17
+ if (!config.reveniumApiKey.startsWith("hak_")) {
18
+ throw new Error('Invalid Revenium API key format. Revenium API keys should start with "hak_"');
19
+ }
20
+ // Validate Revenium URL format (base URL should always be provided by loader with default)
21
+ if (config.reveniumBaseUrl) {
22
+ try {
23
+ new URL(config.reveniumBaseUrl);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Invalid Revenium base URL format: ${config.reveniumBaseUrl}`);
27
+ }
28
+ }
29
+ if (!config.perplexityApiKey) {
30
+ throw new Error("Perplexity API key is required. Set PERPLEXITY_API_KEY environment variable or provide perplexityApiKey in config.");
31
+ }
32
+ if (!config.perplexityApiKey.startsWith("pplx-")) {
33
+ throw new Error('Invalid Perplexity API key format. Perplexity API keys should start with "pplx-"');
34
+ }
35
+ // Validate Perplexity URL format (base URL should always be provided by loader with default)
36
+ if (config.perplexityBaseUrl) {
37
+ try {
38
+ new URL(config.perplexityBaseUrl);
39
+ }
40
+ catch (error) {
41
+ throw new Error(`Invalid Perplexity base URL format: ${config.perplexityBaseUrl}`);
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/core/config/validator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,wCA8CC;AAjDD;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAsB;IACnD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,2FAA2F;IAC3F,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,eAAe,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,6FAA6F;IAC7F,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,CAAC,iBAAiB,EAAE,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Middleware module exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StreamingWrapper = exports.CompletionsInterface = exports.ChatInterface = exports.ReveniumPerplexity = void 0;
7
+ var revenium_client_js_1 = require("./revenium-client.js");
8
+ Object.defineProperty(exports, "ReveniumPerplexity", { enumerable: true, get: function () { return revenium_client_js_1.ReveniumPerplexity; } });
9
+ var interfaces_js_1 = require("./interfaces.js");
10
+ Object.defineProperty(exports, "ChatInterface", { enumerable: true, get: function () { return interfaces_js_1.ChatInterface; } });
11
+ Object.defineProperty(exports, "CompletionsInterface", { enumerable: true, get: function () { return interfaces_js_1.CompletionsInterface; } });
12
+ var streaming_wrapper_js_1 = require("./streaming-wrapper.js");
13
+ Object.defineProperty(exports, "StreamingWrapper", { enumerable: true, get: function () { return streaming_wrapper_js_1.StreamingWrapper; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/middleware/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAC3B,iDAAsE;AAA7D,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAC5C,+DAA0D;AAAjD,wHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Middleware interfaces for Perplexity API
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CompletionsInterface = exports.ChatInterface = void 0;
7
+ const index_js_1 = require("../config/index.js");
8
+ const transaction_id_js_1 = require("../../utils/transaction-id.js");
9
+ const index_js_2 = require("../tracking/index.js");
10
+ const streaming_wrapper_js_1 = require("./streaming-wrapper.js");
11
+ const logger = (0, index_js_1.getLogger)();
12
+ /**
13
+ * Chat interface - provides access to chat completions
14
+ */
15
+ class ChatInterface {
16
+ constructor(client, config) {
17
+ this.client = client;
18
+ this.config = config;
19
+ }
20
+ /**
21
+ * Get completions interface
22
+ */
23
+ completions() {
24
+ return new CompletionsInterface(this.client, this.config);
25
+ }
26
+ }
27
+ exports.ChatInterface = ChatInterface;
28
+ /**
29
+ * Completions interface - handles chat completion requests
30
+ */
31
+ class CompletionsInterface {
32
+ constructor(client, config) {
33
+ this.client = client;
34
+ this.config = config;
35
+ }
36
+ /**
37
+ * Create a chat completion
38
+ */
39
+ async create(params, metadata) {
40
+ const startTime = new Date();
41
+ const transactionId = (0, transaction_id_js_1.generateTransactionId)();
42
+ try {
43
+ logger.debug(`[Revenium] Creating chat completion with model: ${params.model}`);
44
+ const response = await this.client.chat.completions.create(params);
45
+ const endTime = Date.now();
46
+ const duration = endTime - startTime.getTime();
47
+ // Track usage asynchronously (fire-and-forget - errors handled internally)
48
+ if ("usage" in response && response.usage) {
49
+ // Extract cost if available (Perplexity-specific)
50
+ const usage = response.usage;
51
+ (0, index_js_2.trackUsageAsync)({
52
+ requestId: ("id" in response ? response.id : null) || transactionId,
53
+ model: params.model,
54
+ promptTokens: response.usage.prompt_tokens,
55
+ completionTokens: response.usage.completion_tokens,
56
+ totalTokens: response.usage.total_tokens,
57
+ duration,
58
+ finishReason: "choices" in response
59
+ ? response.choices[0]?.finish_reason || null
60
+ : null,
61
+ usageMetadata: metadata,
62
+ isStreamed: false,
63
+ cost: usage.cost,
64
+ });
65
+ }
66
+ return response;
67
+ }
68
+ catch (error) {
69
+ logger.error(`[Revenium] Error in chat completion: ${error.message}`);
70
+ throw error;
71
+ }
72
+ }
73
+ /**
74
+ * Create a streaming chat completion
75
+ */
76
+ async createStreaming(params, metadata) {
77
+ const startTime = new Date();
78
+ const transactionId = (0, transaction_id_js_1.generateTransactionId)();
79
+ try {
80
+ logger.debug(`[Revenium] Creating streaming chat completion with model: ${params.model}`);
81
+ const stream = await this.client.chat.completions.create({
82
+ ...params,
83
+ stream: true,
84
+ });
85
+ return new streaming_wrapper_js_1.StreamingWrapper(stream, params.model, startTime, transactionId, metadata, this.config);
86
+ }
87
+ catch (error) {
88
+ logger.error(`[Revenium] Error in streaming chat completion: ${error.message}`);
89
+ throw error;
90
+ }
91
+ }
92
+ }
93
+ exports.CompletionsInterface = CompletionsInterface;
94
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/core/middleware/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Revenium Perplexity Client
4
+ *
5
+ * Main client class that wraps Perplexity API with Revenium tracking
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ReveniumPerplexity = void 0;
12
+ const openai_1 = __importDefault(require("openai"));
13
+ const interfaces_js_1 = require("./interfaces.js");
14
+ /**
15
+ * Revenium Perplexity client with usage tracking
16
+ */
17
+ class ReveniumPerplexity {
18
+ constructor(config) {
19
+ this.config = config;
20
+ this.client = new openai_1.default({
21
+ apiKey: config.perplexityApiKey,
22
+ baseURL: config.perplexityBaseUrl,
23
+ });
24
+ if (config.debug) {
25
+ console.log("[Revenium] Perplexity client created", {
26
+ baseURL: config.perplexityBaseUrl,
27
+ });
28
+ }
29
+ }
30
+ /**
31
+ * Get chat interface
32
+ */
33
+ chat() {
34
+ return new interfaces_js_1.ChatInterface(this.client, this.config);
35
+ }
36
+ /**
37
+ * Get underlying OpenAI client (for advanced use cases)
38
+ */
39
+ getUnderlyingClient() {
40
+ return this.client;
41
+ }
42
+ }
43
+ exports.ReveniumPerplexity = ReveniumPerplexity;
44
+ //# sourceMappingURL=revenium-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenium-client.js","sourceRoot":"","sources":["../../../../src/core/middleware/revenium-client.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,oDAA4B;AAC5B,mDAAgD;AAGhD;;GAEG;AACH,MAAa,kBAAkB;IAI7B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,gBAAgB;YAC/B,OAAO,EAAE,MAAM,CAAC,iBAAiB;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE;gBAClD,OAAO,EAAE,MAAM,CAAC,iBAAiB;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,6BAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA/BD,gDA+BC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Streaming wrapper for Perplexity API
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StreamingWrapper = void 0;
7
+ const index_js_1 = require("../config/index.js");
8
+ const index_js_2 = require("../tracking/index.js");
9
+ const logger = (0, index_js_1.getLogger)();
10
+ /**
11
+ * Wrapper for streaming responses that tracks usage
12
+ */
13
+ class StreamingWrapper {
14
+ constructor(stream, model, startTime, transactionId, metadata, config) {
15
+ this.stream = stream;
16
+ this.model = model;
17
+ this.startTime = startTime;
18
+ this.transactionId = transactionId;
19
+ this.metadata = metadata;
20
+ this.config = config || {};
21
+ }
22
+ /**
23
+ * Iterate over stream chunks
24
+ */
25
+ async *[Symbol.asyncIterator]() {
26
+ let lastChunk = null;
27
+ let inputTokens = 0;
28
+ let outputTokens = 0;
29
+ let totalTokens = 0;
30
+ let costData = undefined;
31
+ let firstChunkTime = null;
32
+ let timeToFirstToken = 0;
33
+ try {
34
+ for await (const chunk of this.stream) {
35
+ // Capture time of first chunk
36
+ if (!firstChunkTime) {
37
+ firstChunkTime = new Date();
38
+ timeToFirstToken =
39
+ firstChunkTime.getTime() - this.startTime.getTime();
40
+ }
41
+ lastChunk = chunk;
42
+ // Track usage if available in chunk
43
+ if (chunk.usage) {
44
+ inputTokens = chunk.usage.prompt_tokens || 0;
45
+ outputTokens = chunk.usage.completion_tokens || 0;
46
+ totalTokens = chunk.usage.total_tokens || 0;
47
+ // Extract cost data if available (Perplexity-specific)
48
+ if (chunk.usage.cost) {
49
+ costData = chunk.usage.cost;
50
+ }
51
+ }
52
+ yield chunk;
53
+ }
54
+ // Send metering data when stream completes (fire-and-forget)
55
+ const endTime = Date.now();
56
+ const duration = endTime - this.startTime.getTime();
57
+ // fire-and-forget
58
+ (0, index_js_2.trackUsageAsync)({
59
+ requestId: this.transactionId,
60
+ model: this.model,
61
+ promptTokens: inputTokens,
62
+ completionTokens: outputTokens,
63
+ totalTokens,
64
+ duration,
65
+ finishReason: lastChunk?.choices?.[0]?.finish_reason || null,
66
+ usageMetadata: this.metadata,
67
+ isStreamed: true,
68
+ timeToFirstToken,
69
+ cost: costData,
70
+ });
71
+ }
72
+ catch (error) {
73
+ // Log error
74
+ logger.error("[Revenium] Error in stream processing:", error.message);
75
+ throw error;
76
+ }
77
+ }
78
+ }
79
+ exports.StreamingWrapper = StreamingWrapper;
80
+ //# sourceMappingURL=streaming-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-wrapper.js","sourceRoot":"","sources":["../../../../src/core/middleware/streaming-wrapper.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,iDAA+C;AAC/C,mDAAuD;AAEvD,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;AAE3B;;GAEG;AACH,MAAa,gBAAgB;IAQ3B,YACE,MAA0B,EAC1B,KAAa,EACb,SAAe,EACf,aAAqB,EACrB,QAAwB,EACxB,MAAY;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,IAAI,SAAS,GAAQ,IAAI,CAAC;QAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAQ,SAAS,CAAC;QAC9B,IAAI,cAAc,GAAgB,IAAI,CAAC;QACvC,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtC,8BAA8B;gBAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC5B,gBAAgB;wBACd,cAAc,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxD,CAAC;gBAED,SAAS,GAAG,KAAK,CAAC;gBAElB,oCAAoC;gBACpC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;oBAC7C,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;oBAClD,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;oBAC5C,uDAAuD;oBACvD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;wBACrB,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;YAED,6DAA6D;YAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAEpD,kBAAkB;YAClB,IAAA,0BAAe,EAAC;gBACd,SAAS,EAAE,IAAI,CAAC,aAAa;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,WAAW;gBACzB,gBAAgB,EAAE,YAAY;gBAC9B,WAAW;gBACX,QAAQ;gBACR,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,IAAI;gBAC5D,aAAa,EAAE,IAAI,CAAC,QAAQ;gBAC5B,UAAU,EAAE,IAAI;gBAChB,gBAAgB;gBAChB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,YAAY;YACZ,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AArFD,4CAqFC"}