@revenium/perplexity 1.0.9 → 1.0.11

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 (256) hide show
  1. package/.env.example +2 -2
  2. package/README.md +0 -0
  3. package/examples/basic.ts +17 -0
  4. package/examples/chat-completions.ts +23 -0
  5. package/examples/enhanced.ts +21 -0
  6. package/examples/streaming.ts +25 -0
  7. package/package.json +45 -61
  8. package/playground/basic.js +7 -16
  9. package/playground/enhanced.js +9 -21
  10. package/playground/streaming.js +10 -25
  11. package/src/index.ts +1 -35
  12. package/src/interfaces/chatCompletionRequest.ts +9 -0
  13. package/src/interfaces/credential.ts +4 -0
  14. package/src/interfaces/meteringRequest.ts +14 -0
  15. package/src/{types/metering.ts → interfaces/meteringResponse.ts} +3 -3
  16. package/src/interfaces/operation.ts +4 -0
  17. package/src/{types → interfaces}/subscriber.ts +1 -1
  18. package/src/interfaces/tokenCounts.ts +7 -0
  19. package/src/{types → interfaces}/usageMetadata.ts +1 -1
  20. package/src/middleware.ts +151 -0
  21. package/src/models/Logger.ts +5 -5
  22. package/src/models/Metering.ts +86 -0
  23. package/src/utils/calculateDurationMs.ts +1 -1
  24. package/src/utils/constants/constants.ts +9 -16
  25. package/src/utils/constants/logLevels.ts +1 -0
  26. package/src/utils/constants/messages.ts +8 -32
  27. package/src/utils/constants/models.ts +20 -0
  28. package/src/utils/extractTokenCount.ts +26 -0
  29. package/src/utils/generateTransactionId.ts +1 -1
  30. package/src/utils/index.ts +39 -12
  31. package/src/utils/loadEnv.ts +8 -0
  32. package/src/utils/safeExtract.ts +60 -11
  33. package/tsconfig.json +10 -18
  34. package/dist/index.d.ts +0 -8
  35. package/dist/index.d.ts.map +0 -1
  36. package/dist/index.js +0 -40
  37. package/dist/index.js.map +0 -1
  38. package/dist/models/Exception/ApiResponseError.d.ts +0 -6
  39. package/dist/models/Exception/ApiResponseError.d.ts.map +0 -1
  40. package/dist/models/Exception/ApiResponseError.js +0 -13
  41. package/dist/models/Exception/ApiResponseError.js.map +0 -1
  42. package/dist/models/Exception/ConfigurationError.d.ts +0 -4
  43. package/dist/models/Exception/ConfigurationError.d.ts.map +0 -1
  44. package/dist/models/Exception/ConfigurationError.js +0 -11
  45. package/dist/models/Exception/ConfigurationError.js.map +0 -1
  46. package/dist/models/Exception/MeteringError.d.ts +0 -5
  47. package/dist/models/Exception/MeteringError.d.ts.map +0 -1
  48. package/dist/models/Exception/MeteringError.js +0 -12
  49. package/dist/models/Exception/MeteringError.js.map +0 -1
  50. package/dist/models/Exception/MiddlewareActivationError.d.ts +0 -4
  51. package/dist/models/Exception/MiddlewareActivationError.d.ts.map +0 -1
  52. package/dist/models/Exception/MiddlewareActivationError.js +0 -11
  53. package/dist/models/Exception/MiddlewareActivationError.js.map +0 -1
  54. package/dist/models/Exception/StreamTrackingError.d.ts +0 -4
  55. package/dist/models/Exception/StreamTrackingError.d.ts.map +0 -1
  56. package/dist/models/Exception/StreamTrackingError.js +0 -11
  57. package/dist/models/Exception/StreamTrackingError.js.map +0 -1
  58. package/dist/models/Exception/TokenCountingError.d.ts +0 -4
  59. package/dist/models/Exception/TokenCountingError.d.ts.map +0 -1
  60. package/dist/models/Exception/TokenCountingError.js +0 -11
  61. package/dist/models/Exception/TokenCountingError.js.map +0 -1
  62. package/dist/models/Exception/index.d.ts +0 -7
  63. package/dist/models/Exception/index.d.ts.map +0 -1
  64. package/dist/models/Exception/index.js +0 -23
  65. package/dist/models/Exception/index.js.map +0 -1
  66. package/dist/models/Logger.d.ts +0 -10
  67. package/dist/models/Logger.d.ts.map +0 -1
  68. package/dist/models/Logger.js +0 -36
  69. package/dist/models/Logger.js.map +0 -1
  70. package/dist/models/index.d.ts +0 -3
  71. package/dist/models/index.d.ts.map +0 -1
  72. package/dist/models/index.js +0 -19
  73. package/dist/models/index.js.map +0 -1
  74. package/dist/perplexity-ai/client.d.ts +0 -31
  75. package/dist/perplexity-ai/client.d.ts.map +0 -1
  76. package/dist/perplexity-ai/client.js +0 -75
  77. package/dist/perplexity-ai/client.js.map +0 -1
  78. package/dist/perplexity-ai/index.d.ts +0 -3
  79. package/dist/perplexity-ai/index.d.ts.map +0 -1
  80. package/dist/perplexity-ai/index.js +0 -19
  81. package/dist/perplexity-ai/index.js.map +0 -1
  82. package/dist/perplexity-ai/middleware.d.ts +0 -2
  83. package/dist/perplexity-ai/middleware.d.ts.map +0 -1
  84. package/dist/perplexity-ai/middleware.js +0 -195
  85. package/dist/perplexity-ai/middleware.js.map +0 -1
  86. package/dist/types/context.d.ts +0 -9
  87. package/dist/types/context.d.ts.map +0 -1
  88. package/dist/types/context.js +0 -3
  89. package/dist/types/context.js.map +0 -1
  90. package/dist/types/index.d.ts +0 -12
  91. package/dist/types/index.d.ts.map +0 -1
  92. package/dist/types/index.js +0 -28
  93. package/dist/types/index.js.map +0 -1
  94. package/dist/types/metering.d.ts +0 -28
  95. package/dist/types/metering.d.ts.map +0 -1
  96. package/dist/types/metering.js +0 -3
  97. package/dist/types/metering.js.map +0 -1
  98. package/dist/types/modelInfo.d.ts +0 -6
  99. package/dist/types/modelInfo.d.ts.map +0 -1
  100. package/dist/types/modelInfo.js +0 -3
  101. package/dist/types/modelInfo.js.map +0 -1
  102. package/dist/types/operation.d.ts +0 -5
  103. package/dist/types/operation.d.ts.map +0 -1
  104. package/dist/types/operation.js +0 -9
  105. package/dist/types/operation.js.map +0 -1
  106. package/dist/types/perplexityConfig.d.ts +0 -5
  107. package/dist/types/perplexityConfig.d.ts.map +0 -1
  108. package/dist/types/perplexityConfig.js +0 -3
  109. package/dist/types/perplexityConfig.js.map +0 -1
  110. package/dist/types/provider.d.ts +0 -4
  111. package/dist/types/provider.d.ts.map +0 -1
  112. package/dist/types/provider.js +0 -8
  113. package/dist/types/provider.js.map +0 -1
  114. package/dist/types/reveniumConfig.d.ts +0 -6
  115. package/dist/types/reveniumConfig.d.ts.map +0 -1
  116. package/dist/types/reveniumConfig.js +0 -3
  117. package/dist/types/reveniumConfig.js.map +0 -1
  118. package/dist/types/streamTracker.d.ts +0 -9
  119. package/dist/types/streamTracker.d.ts.map +0 -1
  120. package/dist/types/streamTracker.js +0 -3
  121. package/dist/types/streamTracker.js.map +0 -1
  122. package/dist/types/subscriber.d.ts +0 -9
  123. package/dist/types/subscriber.d.ts.map +0 -1
  124. package/dist/types/subscriber.js +0 -3
  125. package/dist/types/subscriber.js.map +0 -1
  126. package/dist/types/tokenCounts.d.ts +0 -6
  127. package/dist/types/tokenCounts.d.ts.map +0 -1
  128. package/dist/types/tokenCounts.js +0 -3
  129. package/dist/types/tokenCounts.js.map +0 -1
  130. package/dist/types/usageData.d.ts +0 -16
  131. package/dist/types/usageData.d.ts.map +0 -1
  132. package/dist/types/usageData.js +0 -3
  133. package/dist/types/usageData.js.map +0 -1
  134. package/dist/types/usageMetadata.d.ts +0 -14
  135. package/dist/types/usageMetadata.d.ts.map +0 -1
  136. package/dist/types/usageMetadata.js +0 -3
  137. package/dist/types/usageMetadata.js.map +0 -1
  138. package/dist/utils/activeMiddleware.d.ts +0 -2
  139. package/dist/utils/activeMiddleware.d.ts.map +0 -1
  140. package/dist/utils/activeMiddleware.js +0 -24
  141. package/dist/utils/activeMiddleware.js.map +0 -1
  142. package/dist/utils/askConsole.d.ts +0 -2
  143. package/dist/utils/askConsole.d.ts.map +0 -1
  144. package/dist/utils/askConsole.js +0 -20
  145. package/dist/utils/askConsole.js.map +0 -1
  146. package/dist/utils/calculateDurationMs.d.ts +0 -2
  147. package/dist/utils/calculateDurationMs.d.ts.map +0 -1
  148. package/dist/utils/calculateDurationMs.js +0 -7
  149. package/dist/utils/calculateDurationMs.js.map +0 -1
  150. package/dist/utils/constants/constants.d.ts +0 -9
  151. package/dist/utils/constants/constants.d.ts.map +0 -1
  152. package/dist/utils/constants/constants.js +0 -19
  153. package/dist/utils/constants/constants.js.map +0 -1
  154. package/dist/utils/constants/messages.d.ts +0 -19
  155. package/dist/utils/constants/messages.d.ts.map +0 -1
  156. package/dist/utils/constants/messages.js +0 -22
  157. package/dist/utils/constants/messages.js.map +0 -1
  158. package/dist/utils/createMeteringRequest.d.ts +0 -3
  159. package/dist/utils/createMeteringRequest.d.ts.map +0 -1
  160. package/dist/utils/createMeteringRequest.js +0 -10
  161. package/dist/utils/createMeteringRequest.js.map +0 -1
  162. package/dist/utils/createPerplexityMetadata.d.ts +0 -3
  163. package/dist/utils/createPerplexityMetadata.d.ts.map +0 -1
  164. package/dist/utils/createPerplexityMetadata.js +0 -12
  165. package/dist/utils/createPerplexityMetadata.js.map +0 -1
  166. package/dist/utils/extractModelName.d.ts +0 -2
  167. package/dist/utils/extractModelName.d.ts.map +0 -1
  168. package/dist/utils/extractModelName.js +0 -15
  169. package/dist/utils/extractModelName.js.map +0 -1
  170. package/dist/utils/extractPerplexityTokenCounts.d.ts +0 -3
  171. package/dist/utils/extractPerplexityTokenCounts.d.ts.map +0 -1
  172. package/dist/utils/extractPerplexityTokenCounts.js +0 -17
  173. package/dist/utils/extractPerplexityTokenCounts.js.map +0 -1
  174. package/dist/utils/extractStopReason.d.ts +0 -2
  175. package/dist/utils/extractStopReason.d.ts.map +0 -1
  176. package/dist/utils/extractStopReason.js +0 -14
  177. package/dist/utils/extractStopReason.js.map +0 -1
  178. package/dist/utils/extractUsageMetadata.d.ts +0 -3
  179. package/dist/utils/extractUsageMetadata.d.ts.map +0 -1
  180. package/dist/utils/extractUsageMetadata.js +0 -15
  181. package/dist/utils/extractUsageMetadata.js.map +0 -1
  182. package/dist/utils/formatTimestamp.d.ts +0 -2
  183. package/dist/utils/formatTimestamp.d.ts.map +0 -1
  184. package/dist/utils/formatTimestamp.js +0 -7
  185. package/dist/utils/formatTimestamp.js.map +0 -1
  186. package/dist/utils/generateTransactionId.d.ts +0 -2
  187. package/dist/utils/generateTransactionId.d.ts.map +0 -1
  188. package/dist/utils/generateTransactionId.js +0 -8
  189. package/dist/utils/generateTransactionId.js.map +0 -1
  190. package/dist/utils/getEnv.d.ts +0 -4
  191. package/dist/utils/getEnv.d.ts.map +0 -1
  192. package/dist/utils/getEnv.js +0 -16
  193. package/dist/utils/getEnv.js.map +0 -1
  194. package/dist/utils/index.d.ts +0 -13
  195. package/dist/utils/index.d.ts.map +0 -1
  196. package/dist/utils/index.js +0 -29
  197. package/dist/utils/index.js.map +0 -1
  198. package/dist/utils/safeExtract.d.ts +0 -2
  199. package/dist/utils/safeExtract.d.ts.map +0 -1
  200. package/dist/utils/safeExtract.js +0 -22
  201. package/dist/utils/safeExtract.js.map +0 -1
  202. package/dist/utils/sendMeteringData.d.ts +0 -3
  203. package/dist/utils/sendMeteringData.d.ts.map +0 -1
  204. package/dist/utils/sendMeteringData.js +0 -35
  205. package/dist/utils/sendMeteringData.js.map +0 -1
  206. package/dist/utils/verifyLogVerbose.d.ts +0 -2
  207. package/dist/utils/verifyLogVerbose.d.ts.map +0 -1
  208. package/dist/utils/verifyLogVerbose.js +0 -10
  209. package/dist/utils/verifyLogVerbose.js.map +0 -1
  210. package/examples/README.md +0 -316
  211. package/examples/basic-client-example.ts +0 -36
  212. package/examples/metadata-example.ts +0 -97
  213. package/examples/multiple-models-example.ts +0 -65
  214. package/examples/openai-client-example.ts +0 -76
  215. package/examples/perplexity_basic_example.ts +0 -24
  216. package/examples/perplexity_middleware_example.ts +0 -222
  217. package/examples/run-all-examples.ts +0 -118
  218. package/examples/simple-test.ts +0 -278
  219. package/examples/streaming-example.ts +0 -46
  220. package/playground/custom-config.js +0 -82
  221. package/playground/metadata.js +0 -94
  222. package/playground/multiple-models.js +0 -62
  223. package/playground/openai-client.js +0 -73
  224. package/src/models/Exception/ApiResponseError.ts +0 -6
  225. package/src/models/Exception/ConfigurationError.ts +0 -6
  226. package/src/models/Exception/MeteringError.ts +0 -6
  227. package/src/models/Exception/MiddlewareActivationError.ts +0 -6
  228. package/src/models/Exception/StreamTrackingError.ts +0 -6
  229. package/src/models/Exception/TokenCountingError.ts +0 -6
  230. package/src/models/Exception/index.ts +0 -6
  231. package/src/models/index.ts +0 -2
  232. package/src/perplexity-ai/client.ts +0 -100
  233. package/src/perplexity-ai/index.ts +0 -2
  234. package/src/perplexity-ai/middleware.ts +0 -297
  235. package/src/types/context.ts +0 -9
  236. package/src/types/index.ts +0 -11
  237. package/src/types/modelInfo.ts +0 -5
  238. package/src/types/operation.ts +0 -4
  239. package/src/types/perplexityConfig.ts +0 -4
  240. package/src/types/provider.ts +0 -3
  241. package/src/types/reveniumConfig.ts +0 -5
  242. package/src/types/streamTracker.ts +0 -9
  243. package/src/types/tokenCounts.ts +0 -5
  244. package/src/types/usageData.ts +0 -16
  245. package/src/utils/activeMiddleware.ts +0 -34
  246. package/src/utils/askConsole.ts +0 -15
  247. package/src/utils/createMeteringRequest.ts +0 -16
  248. package/src/utils/createPerplexityMetadata.ts +0 -11
  249. package/src/utils/extractModelName.ts +0 -14
  250. package/src/utils/extractPerplexityTokenCounts.ts +0 -16
  251. package/src/utils/extractStopReason.ts +0 -13
  252. package/src/utils/extractUsageMetadata.ts +0 -15
  253. package/src/utils/getEnv.ts +0 -16
  254. package/src/utils/sendMeteringData.ts +0 -46
  255. package/src/utils/verifyLogVerbose.ts +0 -7
  256. /package/src/utils/{formatTimestamp.ts → formatTimeStamp.ts} +0 -0
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateTransactionId = generateTransactionId;
4
- const uuid_1 = require("uuid");
5
- function generateTransactionId() {
6
- return (0, uuid_1.v4)();
7
- }
8
- //# sourceMappingURL=generateTransactionId.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generateTransactionId.js","sourceRoot":"","sources":["../../src/utils/generateTransactionId.ts"],"names":[],"mappings":";;AAEA,sDAEC;AAJD,+BAAoC;AAEpC,SAAgB,qBAAqB;IACnC,OAAO,IAAA,SAAM,GAAE,CAAC;AAClB,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare function getReveniumApiKey(): string;
2
- export declare function getReveniumBaseUrl(): string;
3
- export declare function getPerplexityBaseUrl(): string;
4
- //# sourceMappingURL=getEnv.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getEnv.d.ts","sourceRoot":"","sources":["../../src/utils/getEnv.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getReveniumApiKey = getReveniumApiKey;
4
- exports.getReveniumBaseUrl = getReveniumBaseUrl;
5
- exports.getPerplexityBaseUrl = getPerplexityBaseUrl;
6
- const constants_1 = require("./constants/constants");
7
- function getReveniumApiKey() {
8
- return process.env.REVENIUM_METERING_API_KEY ?? "";
9
- }
10
- function getReveniumBaseUrl() {
11
- return process.env.REVENIUM_METERING_BASE_URL || constants_1.REVENIUM_METERING_BASE_URL;
12
- }
13
- function getPerplexityBaseUrl() {
14
- return process.env.PERPLEXITY_BASE_URL || constants_1.CURRENT_PERPLEXITY_BASE_URL;
15
- }
16
- //# sourceMappingURL=getEnv.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getEnv.js","sourceRoot":"","sources":["../../src/utils/getEnv.ts"],"names":[],"mappings":";;AAKA,8CAEC;AAED,gDAEC;AAED,oDAEC;AAfD,qDAG+B;AAE/B,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,sCAA0B,CAAC;AAC9E,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,uCAA2B,CAAC;AACxE,CAAC"}
@@ -1,13 +0,0 @@
1
- export * from "./activeMiddleware";
2
- export * from "./calculateDurationMs";
3
- export * from "./createMeteringRequest";
4
- export * from "./createPerplexityMetadata";
5
- export * from "./extractModelName";
6
- export * from "./extractPerplexityTokenCounts";
7
- export * from "./extractStopReason";
8
- export * from "./extractUsageMetadata";
9
- export * from "./formatTimestamp";
10
- export * from "./generateTransactionId";
11
- export * from "./safeExtract";
12
- export * from "./sendMeteringData";
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
@@ -1,29 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./activeMiddleware"), exports);
18
- __exportStar(require("./calculateDurationMs"), exports);
19
- __exportStar(require("./createMeteringRequest"), exports);
20
- __exportStar(require("./createPerplexityMetadata"), exports);
21
- __exportStar(require("./extractModelName"), exports);
22
- __exportStar(require("./extractPerplexityTokenCounts"), exports);
23
- __exportStar(require("./extractStopReason"), exports);
24
- __exportStar(require("./extractUsageMetadata"), exports);
25
- __exportStar(require("./formatTimestamp"), exports);
26
- __exportStar(require("./generateTransactionId"), exports);
27
- __exportStar(require("./safeExtract"), exports);
28
- __exportStar(require("./sendMeteringData"), exports);
29
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,wDAAsC;AACtC,0DAAwC;AACxC,6DAA2C;AAC3C,qDAAmC;AACnC,iEAA+C;AAC/C,sDAAoC;AACpC,yDAAuC;AACvC,oDAAkC;AAClC,0DAAwC;AACxC,gDAA8B;AAC9B,qDAAmC"}
@@ -1,2 +0,0 @@
1
- export declare function safeExtract<T>(obj: any, path: string, defaultValue: T): T;
2
- //# sourceMappingURL=safeExtract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeExtract.d.ts","sourceRoot":"","sources":["../../src/utils/safeExtract.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAiBzE"}
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.safeExtract = safeExtract;
4
- function safeExtract(obj, path, defaultValue) {
5
- try {
6
- const keys = path.split(".");
7
- let result = obj;
8
- for (const key of keys) {
9
- if (result && typeof result === "object" && key in result) {
10
- result = result[key];
11
- }
12
- else {
13
- return defaultValue;
14
- }
15
- }
16
- return result ?? defaultValue;
17
- }
18
- catch (error) {
19
- return defaultValue;
20
- }
21
- }
22
- //# sourceMappingURL=safeExtract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeExtract.js","sourceRoot":"","sources":["../../src/utils/safeExtract.ts"],"names":[],"mappings":";;AAAA,kCAiBC;AAjBD,SAAgB,WAAW,CAAI,GAAQ,EAAE,IAAY,EAAE,YAAe;IACpE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,GAAG,CAAC;QAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBAC1D,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,IAAI,YAAY,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -1,3 +0,0 @@
1
- import { MeteringRequest } from "../types";
2
- export declare function sendMeteringData(meteringRequest: MeteringRequest, apiKey: string, baseUrl: string): Promise<void>;
3
- //# sourceMappingURL=sendMeteringData.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sendMeteringData.d.ts","sourceRoot":"","sources":["../../src/utils/sendMeteringData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI3C,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -1,35 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.sendMeteringData = sendMeteringData;
7
- const axios_1 = __importDefault(require("axios"));
8
- const models_1 = require("../models");
9
- const constants_1 = require("./constants/constants");
10
- async function sendMeteringData(meteringRequest, apiKey, baseUrl) {
11
- try {
12
- const response = await axios_1.default.post(`${baseUrl}/v2/ai/completions`, meteringRequest, {
13
- headers: {
14
- "Content-Type": "application/json",
15
- Accept: "application/json",
16
- "x-api-key": apiKey,
17
- },
18
- timeout: constants_1.TIMEOUT_MS,
19
- });
20
- if (response.status !== constants_1.STATUS_CODE.SUCCESS &&
21
- response.status !== constants_1.STATUS_CODE.CREATED) {
22
- throw new models_1.MeteringError(`Failed to send metering data. Status: ${response.status}`, new Error(`HTTP ${response.status}`));
23
- }
24
- else {
25
- console.log("🔍 [DEBUG] Metering data sent successfully");
26
- }
27
- }
28
- catch (error) {
29
- if (error instanceof models_1.MeteringError) {
30
- throw error;
31
- }
32
- throw new models_1.MeteringError("Failed to send metering data to Revenium", error);
33
- }
34
- }
35
- //# sourceMappingURL=sendMeteringData.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sendMeteringData.js","sourceRoot":"","sources":["../../src/utils/sendMeteringData.ts"],"names":[],"mappings":";;;;;AAKA,4CAwCC;AA7CD,kDAA0B;AAE1B,sCAA0C;AAC1C,qDAAgE;AAEzD,KAAK,UAAU,gBAAgB,CACpC,eAAgC,EAChC,MAAc,EACd,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,OAAO,oBAAoB,EAC9B,eAAe,EACf;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,WAAW,EAAE,MAAM;aACpB;YACD,OAAO,EAAE,sBAAU;SACpB,CACF,CAAC;QAEF,IACE,QAAQ,CAAC,MAAM,KAAK,uBAAW,CAAC,OAAO;YACvC,QAAQ,CAAC,MAAM,KAAK,uBAAW,CAAC,OAAO,EACvC,CAAC;YACD,MAAM,IAAI,sBAAa,CACrB,yCAAyC,QAAQ,CAAC,MAAM,EAAE,EAC1D,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CACrC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAa,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,sBAAa,CACrB,0CAA0C,EAC1C,KAAc,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function verifyLogVerbose(verbose: boolean, message: string): void;
2
- //# sourceMappingURL=verifyLogVerbose.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifyLogVerbose.d.ts","sourceRoot":"","sources":["../../src/utils/verifyLogVerbose.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIxE"}
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.verifyLogVerbose = verifyLogVerbose;
4
- const models_1 = require("../models");
5
- function verifyLogVerbose(verbose, message) {
6
- if (verbose) {
7
- models_1.Logger.info(message);
8
- }
9
- }
10
- //# sourceMappingURL=verifyLogVerbose.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifyLogVerbose.js","sourceRoot":"","sources":["../../src/utils/verifyLogVerbose.ts"],"names":[],"mappings":";;AAEA,4CAIC;AAND,sCAAmC;AAEnC,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,OAAe;IAChE,IAAI,OAAO,EAAE,CAAC;QACZ,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,316 +0,0 @@
1
- # 🚀 Revenium Perplexity AI Middleware Examples
2
-
3
- Examples that demonstrate seamless metadata integration with Perplexity AI using the published npm package.
4
-
5
- ## Quick Start
6
-
7
- ### Install the package:
8
-
9
- ```bash
10
- npm install revenium-middleware-perplexity-node
11
- ```
12
-
13
- ### Set up environment variables (create .env in your project):
14
-
15
- ```env
16
- # Required for all examples
17
- REVENIUM_METERING_API_KEY=hak_your_api_key
18
- # REVENIUM_METERING_BASE_URL=https://api.revenium.io/meter/v2 # Optional: defaults to this URL
19
-
20
- # Required for Perplexity AI
21
- PERPLEXITY_API_KEY=pplx_your_perplexity_key
22
-
23
- # Optional: Perplexity base URL (defaults to https://api.perplexity.ai)
24
- PERPLEXITY_BASE_URL=https://api.perplexity.ai
25
-
26
- # Optional: Enable verbose logging
27
- REVENIUM_VERBOSE_STARTUP=true
28
- ```
29
-
30
- ### Copy and run any example:
31
-
32
- ```bash
33
- # Copy the example files to your project and run them
34
- node basic-client-example.js # Basic Perplexity integration
35
- node streaming-example.js # Streaming with metadata
36
- node metadata-example.js # Advanced metadata tracking
37
- node multiple-models-example.js # Multiple models usage
38
- node openai-client-example.js # OpenAI client compatibility
39
- ```
40
-
41
- ## Development Setup (For Contributors)
42
-
43
- If you're contributing to this repository:
44
-
45
- ### Clone and build:
46
-
47
- ```bash
48
- git clone https://github.com/revenium/revenium-middleware-perplexity-node.git
49
- cd revenium-middleware-perplexity-node
50
- npm install && npm run build
51
- ```
52
-
53
- ### Run examples from repository:
54
-
55
- ```bash
56
- npx ts-node examples/basic-client-example.ts # Basic Perplexity integration
57
- npx ts-node examples/streaming-example.ts # Streaming with metadata
58
- npx ts-node examples/metadata-example.ts # Advanced metadata tracking
59
- npx ts-node examples/multiple-models-example.ts # Multiple models usage
60
- npx ts-node examples/openai-client-example.ts # OpenAI client compatibility
61
- ```
62
-
63
- ## Basic API Examples
64
-
65
- ### 📝 basic-client-example.ts - Start here
66
-
67
- Perplexity AI chat completions with automatic metadata tracking. Shows native TypeScript support without type casting.
68
-
69
- ```typescript
70
- // Chat with automatic tracking - no configuration needed!
71
- const response = await client.createChatCompletion({
72
- model: "sonar-pro",
73
- messages: [{ role: "user", content: "Hello!" }],
74
- // ✨ All metadata fields are optional!
75
- usageMetadata: {
76
- // User tracking (optional)
77
- subscriberId: "user-123",
78
- subscriberEmail: "user@acme-corp.com",
79
-
80
- // Business context (optional)
81
- organizationId: "acme-corp",
82
- productId: "chat-app",
83
- },
84
- });
85
- ```
86
-
87
- ### 🌊 streaming-example.ts
88
-
89
- Streaming chat responses with automatic usage tracking when streams complete.
90
-
91
- ```typescript
92
- const stream = await client.createStreamingChatCompletion({
93
- model: "sonar-pro",
94
- messages: [{ role: "user", content: "Write a creative story about AI" }],
95
- });
96
-
97
- for await (const chunk of stream) {
98
- const content = chunk.choices[0]?.delta?.content;
99
- if (content) {
100
- process.stdout.write(content);
101
- }
102
- }
103
- // Usage automatically tracked when stream completes
104
- ```
105
-
106
- ### 📊 metadata-example.ts
107
-
108
- Advanced metadata tracking with multiple examples showing different use cases.
109
-
110
- ```typescript
111
- // Example 1: Basic metadata
112
- const basicResponse = await client.createChatCompletion({
113
- model: "sonar-pro",
114
- messages: [{ role: "user", content: "Analyze this quarterly report" }],
115
- usageMetadata: {
116
- traceId: "conv-28a7e9d4",
117
- taskType: "document-analysis",
118
- subscriberEmail: "user@example.com",
119
- organizationId: "acme-corp",
120
- subscriptionId: "premium-plan",
121
- },
122
- });
123
-
124
- // Example 2: Advanced metadata
125
- const advancedResponse = await client.createChatCompletion({
126
- model: "sonar-pro",
127
- messages: [
128
- { role: "user", content: "What are the latest developments in AI?" },
129
- ],
130
- usageMetadata: {
131
- traceId: "conv-advanced-123",
132
- taskType: "research",
133
- subscriberId: "user-12345",
134
- subscriberCredentialName: "api-key-1",
135
- productId: "business-intelligence",
136
- agent: "research-assistant-v2",
137
- responseQualityScore: 0.95,
138
- },
139
- });
140
- ```
141
-
142
- ### 🤖 multiple-models-example.ts
143
-
144
- Demonstrates usage across different Perplexity AI models.
145
-
146
- ```typescript
147
- const models = ["sonar-small", "sonar-medium", "sonar-pro"];
148
-
149
- for (const model of models) {
150
- const response = await client.createChatCompletion({
151
- model,
152
- messages: [{ role: "user", content: "Hello, how are you?" }],
153
- usageMetadata: {
154
- taskType: "model-testing",
155
- model: model,
156
- },
157
- });
158
- console.log(`${model}: ${response.choices[0].message.content}`);
159
- }
160
- ```
161
-
162
- ### 🔄 openai-client-example.ts
163
-
164
- Shows compatibility with OpenAI client library for easy migration.
165
-
166
- ```typescript
167
- import { OpenAI } from "openai";
168
- import "revenium-middleware-perplexity-node";
169
-
170
- const client = new OpenAI({
171
- apiKey: process.env.PERPLEXITY_API_KEY,
172
- baseURL: "https://api.perplexity.ai",
173
- });
174
-
175
- const response = await client.chat.completions.create({
176
- model: "sonar-pro",
177
- messages: [{ role: "user", content: "Hello from OpenAI client!" }],
178
- });
179
- ```
180
-
181
- ### 🧪 simple-test.ts
182
-
183
- Comprehensive test suite demonstrating all middleware capabilities.
184
-
185
- ```typescript
186
- // Tests various scenarios:
187
- // - Basic chat completion
188
- // - Streaming responses
189
- // - Error handling
190
- // - Metadata validation
191
- // - Token counting
192
- // - Request interception
193
- ```
194
-
195
- ### 🏃‍♂️ run-all-examples.ts
196
-
197
- Executes all examples in sequence for comprehensive testing.
198
-
199
- ```typescript
200
- // Runs all examples in order:
201
- // 1. Basic client
202
- // 2. Streaming
203
- // 3. Metadata
204
- // 4. Multiple models
205
- // 5. OpenAI client
206
- // 6. Simple test
207
- ```
208
-
209
- ## Key Features Demonstrated
210
-
211
- - ✅ **Optional Metadata**: All Revenium metadata fields are optional - use what you need
212
- - ✅ **Automatic Tracking**: Revenium meters usage automatically for standard AI metadata
213
- - ✅ **Streaming Support**: Real-time tracking when streams complete
214
- - ✅ **Perplexity AI Support**: Native integration with Perplexity's API
215
- - ✅ **Multiple APIs**: Chat completions and streaming both supported
216
- - ✅ **TypeScript Support**: Full type safety with optional metadata fields
217
- - ✅ **Error Handling**: Graceful fallbacks when metering fails
218
- - ✅ **Background Processing**: Non-blocking usage tracking
219
-
220
- ## Running Examples
221
-
222
- ### Prerequisites:
223
-
224
- - Node.js 16+
225
- - Valid Revenium API key
226
- - Valid Perplexity AI API key
227
-
228
- ### Run compiled JavaScript (after npm run build):
229
-
230
- ```bash
231
- node dist/examples/basic-client-example.js
232
- node dist/examples/streaming-example.js
233
- node dist/examples/metadata-example.js
234
- node dist/examples/multiple-models-example.js
235
- node dist/examples/openai-client-example.js
236
- ```
237
-
238
- ### Run with TypeScript directly:
239
-
240
- ```bash
241
- npx ts-node examples/basic-client-example.ts
242
- npx ts-node examples/streaming-example.ts
243
- npx ts-node examples/metadata-example.ts
244
- npx ts-node examples/multiple-models-example.ts
245
- npx ts-node examples/openai-client-example.ts
246
- ```
247
-
248
- ## Understanding the Magic
249
-
250
- The middleware works by:
251
-
252
- 1. **Initialize**: `createPerplexityClient()` loads configuration automatically
253
- 2. **Seamless Integration**: Use Perplexity AI normally with optional `usageMetadata`
254
- 3. **Data Extraction**: Captures tokens, timing, model info, and metadata
255
- 4. **Background Tracking**: Sends data to Revenium without blocking your app
256
- 5. **Transparent Response**: Returns original Perplexity AI response unchanged
257
-
258
- The result: Your existing Perplexity AI code works exactly the same, but now you get automatic usage tracking and rich analytics.
259
-
260
- ## Integration Tips
261
-
262
- ### Express.js
263
-
264
- Load env vars first, create separate Perplexity module, use client instance everywhere.
265
-
266
- ### Next.js
267
-
268
- Use global variables to prevent re-initialization, works with Pages/App Router.
269
-
270
- ### Serverless
271
-
272
- Singleton pattern for cold starts, handle CORS for browsers.
273
-
274
- ### Docker
275
-
276
- Validate env vars at startup, add health checks for orchestration.
277
-
278
- For detailed framework integration patterns, see the main [README.md](../README.md) documentation.
279
-
280
- ## Troubleshooting
281
-
282
- Having integration issues? Check the Troubleshooting Guide for:
283
-
284
- - Common integration problems and solutions
285
- - Debug logging and diagnostics
286
- - Framework-specific troubleshooting tips
287
- - Environment variable configuration
288
-
289
- ### Quick debug mode:
290
-
291
- ```bash
292
- export REVENIUM_VERBOSE_STARTUP=true
293
- npx ts-node examples/basic-client-example.ts
294
- ```
295
-
296
- ### Common Issues:
297
-
298
- 1. **Middleware not activating**: Ensure you're importing the package before creating client instances
299
- 2. **Environment variables**: Verify all required environment variables are set
300
- 3. **API keys**: Check that both Perplexity AI and Revenium API keys are valid
301
- 4. **TypeScript errors**: Ensure you have the latest TypeScript version
302
-
303
- ### Error Logs
304
-
305
- The middleware provides detailed error logs when issues occur. Check your console output for specific error messages and refer to the main documentation for solutions.
306
-
307
- ## Next Steps
308
-
309
- After running the examples:
310
-
311
- 1. **Customize metadata**: Adapt the metadata examples to your use case
312
- 2. **Integrate in your app**: Follow the integration patterns shown
313
- 3. **Monitor usage**: Check your Revenium dashboard for usage analytics
314
- 4. **Scale up**: Use the middleware across your entire application
315
-
316
- For more information, visit the main [README.md](../README.md) or the [Revenium documentation](https://docs.revenium.io).
@@ -1,36 +0,0 @@
1
- import { config } from "dotenv";
2
-
3
- // Cargar variables de entorno ANTES de importar el middleware
4
- config();
5
-
6
- import { createPerplexityClient } from "../src/perplexity-ai";
7
-
8
- async function basicExample() {
9
- console.log("\n🤖 Perplexity AI - Basic Client Example");
10
- console.log("=".repeat(50));
11
-
12
- try {
13
- // Create client instance
14
- const client = createPerplexityClient();
15
-
16
- // Make a simple chat completion
17
- const response = await client.createChatCompletion({
18
- model: "sonar-pro",
19
- messages: [
20
- {
21
- role: "user",
22
- content: "What is the meaning of life, the universe and everything?",
23
- },
24
- ],
25
- });
26
-
27
- console.log("✅ Response received:");
28
- console.log(response.choices[0].message.content);
29
- console.log("\n📊 Token usage automatically tracked by middleware");
30
- console.log("🎉 Basic client example successful!");
31
- } catch (error) {
32
- console.error("❌ Error:", error);
33
- }
34
- }
35
-
36
- basicExample().catch(console.error);
@@ -1,97 +0,0 @@
1
- import { config } from "dotenv";
2
- import { createPerplexityClient } from "../src/perplexity-ai";
3
-
4
- config();
5
-
6
- async function metadataExample() {
7
- console.log("\n📊 Perplexity AI - Metadata Tracking Example");
8
- console.log("=".repeat(50));
9
-
10
- try {
11
- // Create client instance
12
- const client = createPerplexityClient();
13
-
14
- // Example 1: Basic metadata
15
- console.log("\n1️⃣ Basic metadata tracking:");
16
- const basicResponse = await client.createChatCompletion({
17
- model: "sonar-pro",
18
- messages: [
19
- {
20
- role: "user",
21
- content: "Analyze this quarterly report for key insights",
22
- },
23
- ],
24
- usageMetadata: {
25
- traceId: "conv-28a7e9d4",
26
- taskType: "document-analysis",
27
- subscriberEmail: "user@example.com",
28
- organizationId: "acme-corp",
29
- subscriptionId: "premium-plan",
30
- },
31
- });
32
-
33
- console.log(
34
- "✅ Response:",
35
- basicResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
36
- );
37
-
38
- // Example 2: Advanced metadata
39
- console.log("\n2️⃣ Advanced metadata tracking:");
40
- const advancedResponse = await client.createChatCompletion({
41
- model: "sonar-pro",
42
- messages: [
43
- {
44
- role: "user",
45
- content: "What are the latest developments in AI?",
46
- },
47
- ],
48
- usageMetadata: {
49
- traceId: "conv-advanced-123",
50
- taskType: "research",
51
- subscriberId: "user-12345",
52
- subscriberCredentialName: "api-key-1",
53
- productId: "business-intelligence",
54
- agent: "research-assistant-v2",
55
- responseQualityScore: 0.95,
56
- },
57
- });
58
-
59
- console.log(
60
- "✅ Response:",
61
- advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
62
- );
63
-
64
- // Example 3: Streaming with metadata
65
- console.log("\n3️⃣ Streaming with metadata:");
66
- const stream = await client.createStreamingChatCompletion({
67
- model: "sonar-pro",
68
- messages: [
69
- {
70
- role: "user",
71
- content: "Write a creative story about AI",
72
- },
73
- ],
74
- usageMetadata: {
75
- traceId: "conv-streaming-456",
76
- taskType: "creative-writing",
77
- organizationId: "creative-studio",
78
- agent: "story-generator",
79
- },
80
- });
81
-
82
- console.log("📝 Streaming response with metadata:");
83
- for await (const chunk of stream) {
84
- const content = chunk.choices[0]?.delta?.content;
85
- if (content) {
86
- process.stdout.write(content);
87
- }
88
- }
89
-
90
- console.log("\n\n🎉 All metadata examples completed successfully!");
91
- console.log("📊 All usage tracked with custom metadata");
92
- } catch (error) {
93
- console.error("❌ Error:", error);
94
- }
95
- }
96
-
97
- metadataExample().catch(console.error);