@revenium/perplexity 1.0.10 → 1.0.14

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 (255) hide show
  1. package/.env.example +2 -2
  2. package/README.md +448 -566
  3. package/examples/basic.ts +17 -0
  4. package/examples/chat-completions.ts +22 -0
  5. package/examples/enhanced.ts +20 -0
  6. package/examples/streaming.ts +24 -0
  7. package/package.json +45 -61
  8. package/playground/basic.js +7 -17
  9. package/playground/enhanced.js +9 -22
  10. package/playground/streaming.js +10 -26
  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/basic-client-example.ts +0 -36
  211. package/examples/metadata-example.ts +0 -97
  212. package/examples/multiple-models-example.ts +0 -65
  213. package/examples/openai-client-example.ts +0 -76
  214. package/examples/perplexity_basic_example.ts +0 -24
  215. package/examples/perplexity_middleware_example.ts +0 -222
  216. package/examples/run-all-examples.ts +0 -118
  217. package/examples/simple-test.ts +0 -278
  218. package/examples/streaming-example.ts +0 -46
  219. package/playground/custom-config.js +0 -82
  220. package/playground/metadata.js +0 -94
  221. package/playground/multiple-models.js +0 -62
  222. package/playground/openai-client.js +0 -73
  223. package/src/models/Exception/ApiResponseError.ts +0 -6
  224. package/src/models/Exception/ConfigurationError.ts +0 -6
  225. package/src/models/Exception/MeteringError.ts +0 -6
  226. package/src/models/Exception/MiddlewareActivationError.ts +0 -6
  227. package/src/models/Exception/StreamTrackingError.ts +0 -6
  228. package/src/models/Exception/TokenCountingError.ts +0 -6
  229. package/src/models/Exception/index.ts +0 -6
  230. package/src/models/index.ts +0 -2
  231. package/src/perplexity-ai/client.ts +0 -100
  232. package/src/perplexity-ai/index.ts +0 -2
  233. package/src/perplexity-ai/middleware.ts +0 -297
  234. package/src/types/context.ts +0 -9
  235. package/src/types/index.ts +0 -11
  236. package/src/types/modelInfo.ts +0 -5
  237. package/src/types/operation.ts +0 -4
  238. package/src/types/perplexityConfig.ts +0 -4
  239. package/src/types/provider.ts +0 -3
  240. package/src/types/reveniumConfig.ts +0 -5
  241. package/src/types/streamTracker.ts +0 -9
  242. package/src/types/tokenCounts.ts +0 -5
  243. package/src/types/usageData.ts +0 -16
  244. package/src/utils/activeMiddleware.ts +0 -34
  245. package/src/utils/askConsole.ts +0 -15
  246. package/src/utils/createMeteringRequest.ts +0 -16
  247. package/src/utils/createPerplexityMetadata.ts +0 -11
  248. package/src/utils/extractModelName.ts +0 -14
  249. package/src/utils/extractPerplexityTokenCounts.ts +0 -16
  250. package/src/utils/extractStopReason.ts +0 -13
  251. package/src/utils/extractUsageMetadata.ts +0 -15
  252. package/src/utils/getEnv.ts +0 -16
  253. package/src/utils/sendMeteringData.ts +0 -46
  254. package/src/utils/verifyLogVerbose.ts +0 -7
  255. /package/src/utils/{formatTimestamp.ts → formatTimeStamp.ts} +0 -0
@@ -0,0 +1,17 @@
1
+ import { PerplexityReveniumMiddleware } from "../src";
2
+
3
+ async function basicRequest() {
4
+ console.log("=".repeat(50));
5
+ try {
6
+ const middleware = new PerplexityReveniumMiddleware();
7
+ const model = middleware.getGenerativeModel("sonar-pro");
8
+ const result = await model.createChatCompletion({
9
+ model: "sonar-pro",
10
+ messages: [{ role: "user", content: "What is the capital of France?" }],
11
+ });
12
+ console.log("[BASIC REQUEST]", result.choices[0].message);
13
+ } catch (error) {
14
+ console.log(error);
15
+ }
16
+ }
17
+ basicRequest();
@@ -0,0 +1,22 @@
1
+ import { PerplexityReveniumMiddleware } from "../src";
2
+
3
+ const chatCompletionsExample = async () => {
4
+ console.log("=".repeat(50));
5
+ try {
6
+ const middleware = new PerplexityReveniumMiddleware();
7
+ const model = middleware.getGenerativeModel("sonar-pro");
8
+ const result = await model.createChatCompletion({
9
+ messages: [
10
+ {
11
+ role: "user",
12
+ content: "Hello world",
13
+ },
14
+ ],
15
+ });
16
+ console.log(result.choices[0].message.content);
17
+ } catch (error) {
18
+ console.log(error);
19
+ }
20
+ };
21
+
22
+ chatCompletionsExample();
@@ -0,0 +1,20 @@
1
+ import { PerplexityReveniumMiddleware } from "../src";
2
+
3
+ async function enhancedRequest() {
4
+ console.log("=".repeat(50));
5
+ try {
6
+ const middleware = new PerplexityReveniumMiddleware();
7
+ const model = middleware.getGenerativeModel("sonar-pro");
8
+ const result = await model.createChatCompletion({
9
+ messages: [
10
+ { role: "user", content: "Explain quantum computing in simple terms" },
11
+ ],
12
+ max_tokens: 100,
13
+ temperature: 0.7,
14
+ });
15
+ console.log("[ENHANCED REQUEST]", result.choices[0].message.content);
16
+ } catch (error) {
17
+ console.log(error);
18
+ }
19
+ }
20
+ enhancedRequest();
@@ -0,0 +1,24 @@
1
+ import { PerplexityReveniumMiddleware } from "../src";
2
+
3
+ const chatCompletionStreamingExample = async () => {
4
+ console.log("=".repeat(50));
5
+ try {
6
+ const middleware = new PerplexityReveniumMiddleware();
7
+ const model = middleware.getGenerativeModel("sonar-pro");
8
+ const result = await model.createChatCompletionStream({
9
+ messages: [
10
+ {
11
+ role: "user",
12
+ content: "Hello world",
13
+ },
14
+ ],
15
+ });
16
+ for await (const chunk of result) {
17
+ process.stdout.write(chunk.choices[0]?.delta?.content || "");
18
+ }
19
+ } catch (error) {
20
+ console.log(error);
21
+ }
22
+ };
23
+
24
+ chatCompletionStreamingExample();
package/package.json CHANGED
@@ -1,61 +1,45 @@
1
- {
2
- "name": "@revenium/perplexity",
3
- "version": "1.0.10",
4
- "description": "NodeJS middleware for perplexity's AI API",
5
- "homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
6
- "bugs": {
7
- "url": "https://github.com/revenium/revenium-middleware-perplexity-node/issues"
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/revenium/revenium-middleware-perplexity-node.git"
12
- },
13
- "license": "ISC",
14
- "author": "",
15
- "type": "commonjs",
16
- "main": "dist/index.js",
17
- "scripts": {
18
- "build": "tsc",
19
- "dev": "tsc --watch",
20
- "clean": "rimraf dist",
21
- "prebuild": "npm run clean",
22
- "simple-test": "npx ts-node examples/simple-test.ts",
23
- "perplexity-basic-example": "npx ts-node examples/perplexity_basic_example.ts",
24
- "perplexity-middleware-example": "npx ts-node examples/perplexity_middleware_example.ts",
25
- "basic-client-example": "npx ts-node examples/basic-client-example.ts",
26
- "streaming-example": "npx ts-node examples/streaming-example.ts",
27
- "multiple-models-example": "npx ts-node examples/multiple-models-example.ts",
28
- "openai-client-example": "npx ts-node examples/openai-client-example.ts",
29
- "metadata-example": "npx ts-node examples/metadata-example.ts",
30
- "run-all-examples": "npx ts-node examples/run-all-examples.ts",
31
- "p-basic": "npx ts-node playground/basic.js",
32
- "p-custom-config": "npx ts-node playground/custom-config.js",
33
- "p-enhanced": "npx ts-node playground/enhanced.js",
34
- "p-metadata": "npx ts-node playground/metadata.js",
35
- "p-multiple-models": "npx ts-node playground/multiple-models.js",
36
- "p-openai-client": "npx ts-node playground/openai-client.js",
37
- "p-streaming": "npx ts-node playground/openai-client.js"
38
- },
39
- "keywords": [
40
- "revenium",
41
- "middleware",
42
- "perplexity",
43
- "ai",
44
- "chat",
45
- "completion",
46
- "metering",
47
- "monitoring",
48
- "typescript"
49
- ],
50
- "dependencies": {
51
- "axios": "^1.11.0",
52
- "dotenv": "^17.2.1",
53
- "openai": "^5.15.0",
54
- "uuid": "^11.1.0"
55
- },
56
- "devDependencies": {
57
- "@types/node": "^24.3.0",
58
- "rimraf": "^6.0.1",
59
- "typescript": "^5.9.2"
60
- }
61
- }
1
+ {
2
+ "name": "@revenium/perplexity",
3
+ "version": "1.0.14",
4
+ "description": "NodeJS middleware for perplexity's AI API",
5
+ "homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/revenium/revenium-middleware-perplexity-node/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/revenium/revenium-middleware-perplexity-node.git"
12
+ },
13
+ "main": "index.js",
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "p-basic": "npx ts-node playground/basic.js",
17
+ "p-streaming": "npx ts-node playground/streaming.js",
18
+ "p-enhanced": "npx ts-node playground/enhanced.js",
19
+ "e-basic": "npx ts-node examples/basic.ts",
20
+ "e-streaming": "npx ts-node examples/streaming.ts",
21
+ "e-chat-completions": "npx ts-node examples/chat-completions.ts",
22
+ "e-enhanced": "npx ts-node examples/enhanced.ts"
23
+ },
24
+ "keywords": [
25
+ "revenium",
26
+ "middleware",
27
+ "perplexity",
28
+ "ai",
29
+ "chat",
30
+ "completion",
31
+ "metering",
32
+ "monitoring",
33
+ "typescript"
34
+ ],
35
+ "author": "",
36
+ "license": "ISC",
37
+ "type": "commonjs",
38
+ "dependencies": {
39
+ "dotenv": "^17.2.2",
40
+ "openai": "^5.23.1",
41
+ "ts-node": "^10.9.2",
42
+ "typescript": "^5.9.2",
43
+ "uuid": "^13.0.0"
44
+ }
45
+ }
@@ -1,30 +1,20 @@
1
- import { createPerplexityClient } from "@revenium/perplexity";
1
+ import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
2
2
 
3
3
  const basicExample = async () => {
4
- console.log("\n🤖 Perplexity AI - Basic Client Example");
5
- console.log("=".repeat(50));
6
-
7
4
  try {
8
- // Create client instance
9
- const client = createPerplexityClient();
10
-
11
- // Make a simple chat completion
12
- const response = await client.createChatCompletion({
13
- model: "sonar-pro",
5
+ const middleware = new PerplexityReveniumMiddleware();
6
+ const model = middleware.getGenerativeModel("sonar-pro");
7
+ const result = await model.createChatCompletion({
14
8
  messages: [
15
9
  {
16
10
  role: "user",
17
- content: "What is the meaning of life, the universe and everything?",
11
+ content: "Hello world",
18
12
  },
19
13
  ],
20
14
  });
21
-
22
- console.log("✅ Response received:");
23
- console.log(response.choices[0].message.content);
24
- console.log("\n📊 Token usage automatically tracked by middleware");
25
- console.log("🎉 Basic client example successful!");
15
+ console.log("[BASIC EXAMPLE]", result.choices[0].message.content);
26
16
  } catch (error) {
27
- console.error("❌ Error:", error);
17
+ console.log(error);
28
18
  }
29
19
  };
30
20
 
@@ -1,35 +1,22 @@
1
- import { createPerplexityClient } from "@revenium/perplexity";
1
+ import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
2
2
 
3
3
  const enhancedExample = async () => {
4
- console.log("\n1️⃣ Enhanced Example:");
5
-
6
4
  try {
7
- const client = createPerplexityClient();
8
- const advancedResponse = await client.createChatCompletion({
9
- model: "sonar-pro",
5
+ const middleware = new PerplexityReveniumMiddleware();
6
+ const model = middleware.getGenerativeModel("sonar-pro");
7
+ const result = await model.createChatCompletion({
10
8
  messages: [
11
9
  {
12
10
  role: "user",
13
- content: "What are the latest developments in AI?",
11
+ content: "Explain quantum computing in simple terms",
14
12
  },
15
13
  ],
16
- usageMetadata: {
17
- traceId: "conv-advanced-123",
18
- taskType: "research",
19
- subscriberId: "user-12345",
20
- subscriberCredentialName: "api-key-1",
21
- productId: "business-intelligence",
22
- agent: "research-assistant-v2",
23
- responseQualityScore: 0.95,
24
- },
14
+ max_tokens: 100,
15
+ temperature: 0.7,
25
16
  });
26
-
27
- console.log(
28
- "✅ Response:",
29
- advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
30
- );
17
+ console.log("[ENHANCED EXAMPLE]", result.choices[0].message.content);
31
18
  } catch (error) {
32
- console.error("❌ Error:", error);
19
+ console.log(error);
33
20
  }
34
21
  };
35
22
 
@@ -1,40 +1,24 @@
1
- import { createPerplexityClient } from "@revenium/perplexity";
1
+ import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
2
2
 
3
- async function streamingExample() {
4
- console.log("\n📊 Perplexity AI - Streaming Example");
3
+ const streamingExample = async () => {
5
4
  console.log("=".repeat(50));
6
-
7
5
  try {
8
- const client = createPerplexityClient();
9
- console.log("\n3️⃣ Streaming with metadata:");
10
- const stream = await client.createStreamingChatCompletion({
11
- model: "sonar-pro",
6
+ const middleware = new PerplexityReveniumMiddleware();
7
+ const model = middleware.getGenerativeModel("sonar-pro");
8
+ const result = await model.createChatCompletionStream({
12
9
  messages: [
13
10
  {
14
11
  role: "user",
15
- content: "Write a creative story about AI",
12
+ content: "Hello world",
16
13
  },
17
14
  ],
18
- usageMetadata: {
19
- traceId: "conv-streaming-456",
20
- taskType: "creative-writing",
21
- organizationId: "creative-studio",
22
- agent: "story-generator",
23
- },
24
15
  });
25
-
26
- console.log("📝 Streaming response with metadata:");
27
- for await (const chunk of stream) {
28
- const content = chunk.choices[0]?.delta?.content;
29
- if (content) {
30
- process.stdout.write(content);
31
- }
16
+ for await (const chunk of result) {
17
+ process.stdout.write(chunk.choices[0]?.delta?.content || "");
32
18
  }
33
-
34
- console.log("\n\n🎉 Streaming completed!");
35
19
  } catch (error) {
36
- console.error("❌ Error:", error);
20
+ console.log(error);
37
21
  }
38
- }
22
+ };
39
23
 
40
24
  streamingExample();
package/src/index.ts CHANGED
@@ -1,38 +1,4 @@
1
1
  import { config } from "dotenv";
2
- import { Logger } from "./models";
3
- import { activeMiddleware } from "./utils/activeMiddleware";
4
- import { verifyLogVerbose } from "./utils/verifyLogVerbose";
5
-
6
- // Import the Perplexity middleware to activate it
7
- import "./perplexity-ai/middleware";
8
-
9
2
  config();
10
3
 
11
- const verboseStartup:boolean =
12
- process.env.REVENIUM_VERBOSE_STARTUP?.toLowerCase() === "true";
13
-
14
- verifyLogVerbose(
15
- verboseStartup,
16
- "Revenium Perplexity middleware initialization starting"
17
- );
18
-
19
- // Activate middleware for Perplexity AI
20
- let activeSDKs: string[] = [];
21
- activeMiddleware(verboseStartup, activeSDKs, "perplexity-ai");
22
-
23
- // Export all utilities, types, and models
24
- export * from "./utils";
25
- export * from "./types";
26
- export * from "./models";
27
-
28
- // Export Perplexity client and middleware
29
- export * from "./perplexity-ai";
30
-
31
- // Log the active SDKs
32
- Logger.info(
33
- "Revenium Perplexity middleware activated for: %s",
34
- activeSDKs.length > 0 ? activeSDKs.join(", ") : "none"
35
- );
36
-
37
- export const version:string = "0.1.0";
38
- export const activeSDKList:string[] = activeSDKs;
4
+ export * from "./middleware";
@@ -0,0 +1,9 @@
1
+ import { ChatCompletionMessageParam } from "openai/resources/index";
2
+
3
+ export interface IChatCompletionRequest {
4
+ model?: string;
5
+ messages: ChatCompletionMessageParam[];
6
+ stream?: boolean;
7
+ usageMetadata?: any;
8
+ [key: string]: any;
9
+ }
@@ -0,0 +1,4 @@
1
+ export interface ICredential {
2
+ name: string;
3
+ value: string;
4
+ }
@@ -0,0 +1,14 @@
1
+ import { IOperationType } from "./operation";
2
+ import { ITokenCounts } from "./tokenCounts";
3
+ import { IUsageMetadata } from "./usageMetadata";
4
+
5
+ export interface IMeteringRequest {
6
+ transactionId?: string;
7
+ startTime: Date;
8
+ endTime: Date;
9
+ modelName: string;
10
+ tokenCounts: ITokenCounts;
11
+ stopReason: string;
12
+ operationType: IOperationType;
13
+ usageMetadata?: IUsageMetadata;
14
+ }
@@ -1,6 +1,6 @@
1
- import { Subscriber } from "./subscriber";
1
+ import { ISubscriber } from "./subscriber";
2
2
 
3
- export interface MeteringRequest {
3
+ export interface IMeteringResponse {
4
4
  stopReason: string;
5
5
  costType: string;
6
6
  isStreamed: boolean;
@@ -15,7 +15,7 @@ export interface MeteringRequest {
15
15
  totalTokenCount: number;
16
16
  organizationId: string;
17
17
  productId: string;
18
- subscriber: Subscriber;
18
+ subscriber: ISubscriber;
19
19
  model: string;
20
20
  transactionId: string;
21
21
  responseTime: string;
@@ -0,0 +1,4 @@
1
+ export enum IOperationType {
2
+ CHAT = "CHAT",
3
+ EMBED = "EMBED",
4
+ }
@@ -1,4 +1,4 @@
1
- export interface Subscriber {
1
+ export interface ISubscriber {
2
2
  id: string;
3
3
  email: string;
4
4
  credential: {
@@ -0,0 +1,7 @@
1
+ export interface ITokenCounts {
2
+ inputTokens: number;
3
+ outputTokens: number;
4
+ totalTokens: number;
5
+ cachedTokens?: number;
6
+ reasoningTokens?: number;
7
+ }
@@ -1,4 +1,4 @@
1
- export interface UsageMetadata {
1
+ export interface IUsageMetadata {
2
2
  traceId?: string;
3
3
  taskType?: string;
4
4
  subscriberEmail?: string;
@@ -0,0 +1,151 @@
1
+ import OpenAI, { APIPromise } from "openai";
2
+ import {
3
+ models,
4
+ PERPLEXITY_API_BASE_URL,
5
+ PERPLEXITY_API_KEY,
6
+ PERPLEXITY_API_KEY_INVALID_MESSAGE,
7
+ PERPLEXITY_CLIENT_INITIALIZED_MESSAGE,
8
+ PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE,
9
+ PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE,
10
+ PERPLEXITY_REQUIRED_API_KEY_MESSAGE,
11
+ REVENIUM_METERING_API_KEY,
12
+ REVENIUM_METERING_BASE_URL,
13
+ } from "./utils";
14
+ import { logger } from "./models/Logger";
15
+ import { IChatCompletionRequest } from "./interfaces/chatCompletionRequest";
16
+ import { Metering } from "./models/Metering";
17
+ import { IOperationType } from "./interfaces/operation";
18
+ import { extractGoogleAITokenCounts } from "./utils/extractTokenCount";
19
+ import { RequestOptions } from "openai/internal/request-options";
20
+
21
+ export class PerplexityReveniumMiddleware {
22
+ private client: OpenAI;
23
+ private working: boolean = true;
24
+ private modelName: string = "";
25
+ constructor() {
26
+ this.verifyEnv();
27
+ this.client = new OpenAI({
28
+ apiKey: PERPLEXITY_API_KEY,
29
+ baseURL: PERPLEXITY_API_BASE_URL,
30
+ });
31
+ logger.info(PERPLEXITY_CLIENT_INITIALIZED_MESSAGE);
32
+ }
33
+ public getGenerativeModel(model: string) {
34
+ this.modelName = model;
35
+ if (!models.includes(model)) {
36
+ throw new Error(`Model ${model} is not supported`);
37
+ }
38
+ return {
39
+ createChatCompletion: this.chatCompletion,
40
+ createChatCompletionStream: this.streamingChatCompletion,
41
+ createEmbeddings: this.embeddings,
42
+ };
43
+ }
44
+
45
+ private embeddings = async (
46
+ _body: Omit<OpenAI.Embeddings.EmbeddingCreateParams, "model">,
47
+ _options?: RequestOptions
48
+ ) => {};
49
+
50
+ private streamingChatCompletion = async (params: IChatCompletionRequest) => {
51
+ const startTime: Date = new Date();
52
+ try {
53
+ const { usageMetadata, ...openaiParams } = params;
54
+ const requestParams = {
55
+ ...openaiParams,
56
+ model: this.modelName,
57
+ };
58
+ const result = await this.client?.chat.completions.create({
59
+ ...requestParams,
60
+ stream: true,
61
+ });
62
+ if (!this.working) {
63
+ logger.warning("Metering is not working. Check your configuration.");
64
+ return result;
65
+ }
66
+ const tokenCounts = extractGoogleAITokenCounts(result);
67
+ const endTime: Date = new Date();
68
+ logger.info("Metering is working.");
69
+ const metering = new Metering(
70
+ REVENIUM_METERING_API_KEY ?? "",
71
+ REVENIUM_METERING_BASE_URL ?? ""
72
+ );
73
+ const getMetering = metering.createMetering({
74
+ modelName: this.modelName,
75
+ endTime,
76
+ startTime,
77
+ operationType: IOperationType.CHAT,
78
+ stopReason: "END",
79
+ tokenCounts,
80
+ usageMetadata,
81
+ });
82
+ await metering.sendMeteringData(getMetering);
83
+ return result;
84
+ } catch (error) {
85
+ throw error;
86
+ }
87
+ };
88
+
89
+ private chatCompletion = async (params: IChatCompletionRequest) => {
90
+ const startTime: Date = new Date();
91
+ try {
92
+ const { usageMetadata, ...openaiParams } = params;
93
+ const requestParams = {
94
+ ...openaiParams,
95
+ model: this.modelName,
96
+ };
97
+ const result: OpenAI.Chat.Completions.ChatCompletion & {
98
+ _request_id?: string | null | undefined;
99
+ } = await this.client?.chat.completions.create({
100
+ ...requestParams,
101
+ stream: false,
102
+ });
103
+ if (!this.working) {
104
+ logger.warning("Metering is not working. Check your configuration.");
105
+ return result;
106
+ }
107
+ const tokenCounts = extractGoogleAITokenCounts(result);
108
+ const endTime: Date = new Date();
109
+ logger.info(" Metering is working.");
110
+ const metering = new Metering(
111
+ REVENIUM_METERING_API_KEY ?? "",
112
+ REVENIUM_METERING_BASE_URL ?? ""
113
+ );
114
+ const getMetering = metering.createMetering({
115
+ modelName: this.modelName,
116
+ endTime,
117
+ startTime,
118
+ operationType: IOperationType.CHAT,
119
+ stopReason: "END",
120
+ tokenCounts,
121
+ usageMetadata,
122
+ });
123
+ await metering.sendMeteringData(getMetering);
124
+ return result;
125
+ } catch (error) {
126
+ throw error;
127
+ }
128
+ };
129
+
130
+ private verifyEnv(): void {
131
+ if (!PERPLEXITY_API_KEY) {
132
+ logger.error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
133
+ throw new Error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
134
+ }
135
+
136
+ if (!PERPLEXITY_API_KEY.includes("pplx-")) {
137
+ logger.error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
138
+ throw new Error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
139
+ }
140
+
141
+ if (!REVENIUM_METERING_API_KEY) {
142
+ logger.warning(PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE);
143
+ this.working = false;
144
+ }
145
+
146
+ if (!REVENIUM_METERING_BASE_URL) {
147
+ logger.warning(PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE);
148
+ this.working = false;
149
+ }
150
+ }
151
+ }
@@ -1,29 +1,29 @@
1
- import { LOG_LEVELS } from "../utils/constants/constants";
1
+ import { LOG_LEVELS } from "../utils";
2
2
 
3
3
  export class Logger {
4
4
  private static logLevel: string = process.env.REVENIUM_LOG_LEVEL || "INFO";
5
5
 
6
6
  static debug(message: string, data?: any): void {
7
7
  if (this.shouldLog(LOG_LEVELS[0])) {
8
- console.log(`${LOG_LEVELS[0]} ${message}`, data || "");
8
+ console.log(`[${LOG_LEVELS[0]}] ${message}`, data || "");
9
9
  }
10
10
  }
11
11
 
12
12
  static info(message: string, data?: any): void {
13
13
  if (this.shouldLog(LOG_LEVELS[1])) {
14
- console.log(`${LOG_LEVELS[1]} ${message}`, data || "");
14
+ console.log(`[${LOG_LEVELS[1]}] ${message}`, data || "");
15
15
  }
16
16
  }
17
17
 
18
18
  static warning(message: string, data?: any): void {
19
19
  if (this.shouldLog(LOG_LEVELS[2])) {
20
- console.warn(`${LOG_LEVELS[2]} ${message}`, data || "");
20
+ console.warn(`[${LOG_LEVELS[2]}] ${message}`, data || "");
21
21
  }
22
22
  }
23
23
 
24
24
  static error(message: string, data?: any): void {
25
25
  if (this.shouldLog(LOG_LEVELS[3])) {
26
- console.error(`${LOG_LEVELS[3]} ${message}`, data || "");
26
+ console.error(`[${LOG_LEVELS[3]}] ${message}`, data || "");
27
27
  }
28
28
  }
29
29