@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
@@ -1,222 +0,0 @@
1
- import { config } from "dotenv";
2
- import { OpenAI } from "openai";
3
-
4
- // Importar el middleware para activar el tracking automático
5
- import "../src/index";
6
-
7
- config();
8
-
9
- // Configurar el cliente de OpenAI para usar Perplexity
10
- const client = new OpenAI({
11
- apiKey: process.env.PERPLEXITY_API_KEY,
12
- baseURL: "https://api.perplexity.ai",
13
- });
14
-
15
- /**
16
- * Ejemplo básico usando el middleware
17
- */
18
- const basicExample = async () => {
19
- console.log("\n🤖 Perplexity AI - Middleware Example");
20
- console.log("=".repeat(50));
21
-
22
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
23
- const reveniumKey = process.env.REVENIUM_METERING_API_KEY;
24
-
25
- if (!perplexityApiKey) {
26
- console.log("❌ PERPLEXITY_API_KEY not found");
27
- console.log(" Set: export PERPLEXITY_API_KEY=your-perplexity-api-key");
28
- return false;
29
- }
30
-
31
- if (!reveniumKey) {
32
- console.log(
33
- "⚠️ REVENIUM_METERING_API_KEY not found - metering will be disabled"
34
- );
35
- console.log(" Set: export REVENIUM_METERING_API_KEY=your-revenium-key");
36
- }
37
-
38
- console.log(`✅ Perplexity API Key: ${perplexityApiKey.substring(0, 10)}...`);
39
- if (reveniumKey) {
40
- console.log(`✅ Revenium Key: ${reveniumKey.substring(0, 10)}...`);
41
- }
42
-
43
- try {
44
- const response = await client.chat.completions.create({
45
- model: "sonar-pro",
46
- messages: [
47
- {
48
- role: "user",
49
- content: "What is the meaning of life, the universe and everything?",
50
- },
51
- ],
52
- });
53
-
54
- const content = response.choices[0]?.message?.content;
55
- if (content) {
56
- console.log(`✅ Response: ${content.substring(0, 100)}...`);
57
- } else {
58
- console.log("✅ Response received (no content)");
59
- }
60
- console.log("✅ Response received successfully");
61
- console.log("📊 Token usage automatically tracked by middleware");
62
- console.log("🎉 Middleware integration successful!");
63
- return true;
64
- } catch (error) {
65
- console.log(`❌ Perplexity test failed: ${error}`);
66
- console.error(error);
67
- return false;
68
- }
69
- };
70
-
71
- /**
72
- * Ejemplo con metadatos de uso
73
- */
74
- const enhancedExample = async () => {
75
- console.log("\n📊 Perplexity AI - Enhanced Tracking Example");
76
- console.log("=".repeat(50));
77
-
78
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
79
- if (!perplexityApiKey) {
80
- console.log("❌ PERPLEXITY_API_KEY not found");
81
- return false;
82
- }
83
-
84
- try {
85
- const response = await client.chat.completions.create({
86
- model: "sonar-pro",
87
- messages: [
88
- {
89
- role: "user",
90
- content: "Analyze this quarterly report for key insights",
91
- },
92
- ],
93
- // Los metadatos se pueden incluir en el body de la request
94
- // El middleware los detectará automáticamente
95
- });
96
-
97
- const content = response.choices[0]?.message?.content;
98
- if (content) {
99
- console.log(`✅ Enhanced response: ${content.substring(0, 100)}...`);
100
- } else {
101
- console.log("✅ Enhanced response received (no content)");
102
- }
103
- console.log("🎯 Enhanced tracking with middleware successful!");
104
- return true;
105
- } catch (error) {
106
- console.log(`❌ Perplexity enhanced test failed: ${error}`);
107
- console.error(error);
108
- return false;
109
- }
110
- };
111
-
112
- /**
113
- * Ejemplo con streaming
114
- */
115
- const streamingExample = async () => {
116
- console.log("\n🌊 Perplexity AI - Streaming Example");
117
- console.log("=".repeat(50));
118
-
119
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
120
- if (!perplexityApiKey) {
121
- console.log("❌ PERPLEXITY_API_KEY not found");
122
- return false;
123
- }
124
-
125
- try {
126
- const stream = await client.chat.completions.create({
127
- model: "sonar-pro",
128
- messages: [
129
- {
130
- role: "user",
131
- content: "Write a creative story about AI",
132
- },
133
- ],
134
- stream: true,
135
- });
136
-
137
- let streamedContent = "";
138
- for await (const chunk of stream) {
139
- const content = chunk.choices[0]?.delta?.content;
140
- if (content) {
141
- streamedContent += content;
142
- process.stdout.write(content);
143
- }
144
- }
145
-
146
- console.log("\n✅ Streaming completed successfully");
147
- console.log("📊 Streaming usage automatically tracked by middleware");
148
- return true;
149
- } catch (error) {
150
- console.log(`❌ Perplexity streaming test failed: ${error}`);
151
- console.error(error);
152
- return false;
153
- }
154
- };
155
-
156
- /**
157
- * Ejemplo con diferentes modelos
158
- */
159
- const differentModelExample = async () => {
160
- console.log("\n🔧 Perplexity AI - Different Model Example");
161
- console.log("=".repeat(50));
162
-
163
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
164
- if (!perplexityApiKey) {
165
- console.log("❌ PERPLEXITY_API_KEY not found");
166
- return false;
167
- }
168
-
169
- try {
170
- const response = await client.chat.completions.create({
171
- model: "sonar-pro",
172
- messages: [
173
- {
174
- role: "user",
175
- content: "Explain quantum computing in simple terms",
176
- },
177
- ],
178
- });
179
-
180
- const content = response.choices[0]?.message?.content;
181
- if (content) {
182
- console.log(`✅ Llama response: ${content.substring(0, 100)}...`);
183
- } else {
184
- console.log("✅ Llama response received (no content)");
185
- }
186
- console.log("✅ Different model test successful!");
187
- return true;
188
- } catch (error) {
189
- console.log(`❌ Perplexity different model test failed: ${error}`);
190
- console.error(error);
191
- return false;
192
- }
193
- };
194
-
195
- /**
196
- * Función principal que ejecuta todos los ejemplos
197
- */
198
- const main = async (): Promise<void> => {
199
- console.log("🚀 Starting Revenium Perplexity AI Middleware Examples");
200
- console.log("=".repeat(60));
201
-
202
- let successCount = 0;
203
- const totalTests: number = 4;
204
-
205
- // Ejecutar ejemplos de Perplexity AI
206
- if (await basicExample()) successCount++;
207
- if (await enhancedExample()) successCount++;
208
- if (await streamingExample()) successCount++;
209
- if (await differentModelExample()) successCount++;
210
-
211
- console.log("\n" + "=".repeat(60));
212
- console.log(`📊 Test Results: ${successCount}/${totalTests} tests passed`);
213
-
214
- if (successCount === totalTests) {
215
- console.log("🎉 All tests passed! Middleware is working correctly.");
216
- } else {
217
- console.log("⚠️ Some tests failed. Check the logs above for details.");
218
- }
219
- };
220
-
221
- // Ejecutar el ejemplo
222
- main().catch(console.error);
@@ -1,118 +0,0 @@
1
- import { config } from "dotenv";
2
- import { createPerplexityClient } from "../src/perplexity-ai";
3
-
4
- config();
5
-
6
- async function runAllExamples() {
7
- console.log("🚀 Running All Perplexity AI Middleware Examples");
8
- console.log("=".repeat(60));
9
-
10
- const examples = [
11
- {
12
- name: "Basic Client Example",
13
- run: async () => {
14
- const client = createPerplexityClient();
15
- const response = await client.createChatCompletion({
16
- model: "sonar-pro",
17
- messages: [
18
- {
19
- role: "user",
20
- content: "Say hello in one sentence",
21
- },
22
- ],
23
- });
24
- return response.choices[0]?.message?.content || "";
25
- },
26
- },
27
- {
28
- name: "Streaming Example",
29
- run: async () => {
30
- const client = createPerplexityClient();
31
- const stream = await client.createStreamingChatCompletion({
32
- model: "sonar-pro",
33
- messages: [
34
- {
35
- role: "user",
36
- content: "Write a very short story",
37
- },
38
- ],
39
- });
40
-
41
- let content = "";
42
- for await (const chunk of stream) {
43
- const chunkContent = chunk.choices[0]?.delta?.content;
44
- if (chunkContent) {
45
- content += chunkContent;
46
- }
47
- }
48
- return content;
49
- },
50
- },
51
- {
52
- name: "Multiple Models Example",
53
- run: async () => {
54
- const client = createPerplexityClient();
55
- const response = await client.createChatCompletion({
56
- model: "sonar-pro",
57
- messages: [
58
- {
59
- role: "user",
60
- content: "What is AI?",
61
- },
62
- ],
63
- });
64
- return response.choices[0]?.message?.content || "";
65
- },
66
- },
67
- {
68
- name: "Metadata Example",
69
- run: async () => {
70
- const client = createPerplexityClient();
71
- const response = await client.createChatCompletion({
72
- model: "sonar-pro",
73
- messages: [
74
- {
75
- role: "user",
76
- content: "What is the weather like?",
77
- },
78
- ],
79
- usageMetadata: {
80
- traceId: "test-123",
81
- taskType: "weather-query",
82
- organizationId: "test-org",
83
- },
84
- });
85
- return response.choices[0]?.message?.content || "";
86
- },
87
- },
88
- ];
89
-
90
- let successCount = 0;
91
- const totalExamples = examples.length;
92
-
93
- for (const example of examples) {
94
- console.log(`\n🤖 Running: ${example.name}`);
95
- console.log("-".repeat(40));
96
-
97
- try {
98
- const result = await example.run();
99
- console.log("✅ Success!");
100
- console.log("📝 Response:", result.substring(0, 100) + "...");
101
- successCount++;
102
- } catch (error) {
103
- console.log("❌ Failed:", error);
104
- }
105
- }
106
-
107
- console.log("\n" + "=".repeat(60));
108
- console.log(`📊 Results: ${successCount}/${totalExamples} examples passed`);
109
-
110
- if (successCount === totalExamples) {
111
- console.log("🎉 All examples completed successfully!");
112
- console.log("✅ Middleware is working correctly");
113
- } else {
114
- console.log("⚠️ Some examples failed. Check the logs above.");
115
- }
116
- }
117
-
118
- runAllExamples().catch(console.error);
@@ -1,278 +0,0 @@
1
- import { config } from "dotenv";
2
- import "../src/index"; // Import middleware to activate automatic tracking
3
-
4
- config();
5
-
6
- async function perplexityBasicExample(): Promise<boolean> {
7
- console.log("\n🤖 Perplexity AI - Basic Example");
8
- console.log("=".repeat(50));
9
-
10
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
11
- const reveniumKey = process.env.REVENIUM_METERING_API_KEY;
12
-
13
- if (!perplexityApiKey) {
14
- console.log("❌ PERPLEXITY_API_KEY not found");
15
- console.log(" Set: export PERPLEXITY_API_KEY=your-perplexity-api-key");
16
- return false;
17
- }
18
-
19
- if (!reveniumKey) {
20
- console.log("⚠️ REVENIUM_METERING_API_KEY not found - metering will fail");
21
- console.log(" Set: export REVENIUM_METERING_API_KEY=your-revenium-key");
22
- }
23
-
24
- console.log(`✅ Perplexity API Key: ${perplexityApiKey.substring(0, 10)}...`);
25
- if (reveniumKey) {
26
- console.log(`✅ Revenium Key: ${reveniumKey.substring(0, 10)}...`);
27
- }
28
-
29
- try {
30
- const response = await fetch("https://api.perplexity.ai/chat/completions", {
31
- method: "POST",
32
- headers: {
33
- Authorization: `Bearer ${perplexityApiKey}`,
34
- "Content-Type": "application/json",
35
- },
36
- body: JSON.stringify({
37
- model: "perplexity-online",
38
- messages: [
39
- {
40
- role: "user",
41
- content:
42
- "What is the meaning of life, the universe and everything?",
43
- },
44
- ],
45
- }),
46
- });
47
-
48
- if (!response.ok) {
49
- throw new Error(`HTTP error! status: ${response.status}`);
50
- }
51
-
52
- const result = await response.json();
53
- console.log(
54
- `✅ Response: ${result.choices[0].message.content.substring(0, 100)}...`
55
- );
56
- console.log("✅ Response received successfully");
57
- console.log("📊 Token usage will be tracked by the middleware");
58
- console.log("🎉 Zero-config integration successful!");
59
- console.log(" Your usage is automatically tracked in Revenium");
60
- return true;
61
- } catch (error) {
62
- console.log(`❌ Perplexity test failed: ${error}`);
63
- console.error(error);
64
- return false;
65
- }
66
- }
67
-
68
- async function perplexityEnhancedExample(): Promise<boolean> {
69
- console.log("\n📊 Perplexity AI - Enhanced Tracking Example");
70
- console.log("=".repeat(50));
71
-
72
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
73
- if (!perplexityApiKey) {
74
- console.log("❌ PERPLEXITY_API_KEY not found");
75
- return false;
76
- }
77
-
78
- try {
79
- const response = await fetch("https://api.perplexity.ai/chat/completions", {
80
- method: "POST",
81
- headers: {
82
- Authorization: `Bearer ${perplexityApiKey}`,
83
- "Content-Type": "application/json",
84
- },
85
- body: JSON.stringify({
86
- model: "perplexity-online",
87
- messages: [
88
- {
89
- role: "user",
90
- content: "Analyze this quarterly report for key insights",
91
- },
92
- ],
93
- usageMetadata: {
94
- traceId: "conv-28a7e9d4",
95
- taskType: "document-analysis",
96
- subscriberEmail: "user@example.com",
97
- subscriberId: "user-12345",
98
- organizationId: "acme-corp",
99
- subscriptionId: "premium-plan",
100
- productId: "business-intelligence",
101
- agent: "report-analyzer-v2",
102
- },
103
- }),
104
- });
105
-
106
- if (!response.ok) {
107
- throw new Error(`HTTP error! status: ${response.status}`);
108
- }
109
-
110
- const result = await response.json();
111
- console.log(
112
- `✅ Enhanced response: ${result.choices[0].message.content.substring(
113
- 0,
114
- 100
115
- )}...`
116
- );
117
- console.log("🎯 Enhanced tracking with metadata successful!");
118
- return true;
119
- } catch (error) {
120
- console.log(`❌ Perplexity enhanced test failed: ${error}`);
121
- console.error(error);
122
- return false;
123
- }
124
- }
125
-
126
- async function perplexityStreamingExample(): Promise<boolean> {
127
- console.log("\n🌊 Perplexity AI - Streaming Example");
128
- console.log("=".repeat(50));
129
-
130
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
131
- if (!perplexityApiKey) {
132
- console.log("❌ PERPLEXITY_API_KEY not found");
133
- return false;
134
- }
135
-
136
- try {
137
- const response = await fetch("https://api.perplexity.ai/chat/completions", {
138
- method: "POST",
139
- headers: {
140
- Authorization: `Bearer ${perplexityApiKey}`,
141
- "Content-Type": "application/json",
142
- },
143
- body: JSON.stringify({
144
- model: "perplexity-online",
145
- messages: [
146
- {
147
- role: "user",
148
- content: "Write a creative story about AI",
149
- },
150
- ],
151
- stream: true,
152
- usageMetadata: {
153
- organizationId: "creative-studio",
154
- taskType: "creative-writing",
155
- },
156
- }),
157
- });
158
-
159
- if (!response.ok) {
160
- throw new Error(`HTTP error! status: ${response.status}`);
161
- }
162
-
163
- if (!response.body) {
164
- throw new Error("No response body for streaming");
165
- }
166
-
167
- const reader = response.body.getReader();
168
- const decoder = new TextDecoder();
169
- let streamedContent = "";
170
-
171
- while (true) {
172
- const { done, value } = await reader.read();
173
- if (done) break;
174
-
175
- const chunk = decoder.decode(value);
176
- const lines = chunk.split("\n");
177
-
178
- for (const line of lines) {
179
- if (line.startsWith("data: ")) {
180
- const data = line.slice(6);
181
- if (data === "[DONE]") break;
182
-
183
- try {
184
- const parsed = JSON.parse(data);
185
- if (parsed.choices[0]?.delta?.content) {
186
- const content = parsed.choices[0].delta.content;
187
- streamedContent += content;
188
- process.stdout.write(content);
189
- }
190
- } catch (e) {
191
- // Ignore parsing errors for incomplete chunks
192
- }
193
- }
194
- }
195
- }
196
-
197
- console.log("\n✅ Streaming completed successfully");
198
- console.log("📊 Streaming usage will be tracked by the middleware");
199
- return true;
200
- } catch (error) {
201
- console.log(`❌ Perplexity streaming test failed: ${error}`);
202
- console.error(error);
203
- return false;
204
- }
205
- }
206
-
207
- async function perplexityDifferentModelExample(): Promise<boolean> {
208
- console.log("\n🔧 Perplexity AI - Different Model Example");
209
- console.log("=".repeat(50));
210
-
211
- const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
212
- if (!perplexityApiKey) {
213
- console.log("❌ PERPLEXITY_API_KEY not found");
214
- return false;
215
- }
216
-
217
- try {
218
- const response = await fetch("https://api.perplexity.ai/chat/completions", {
219
- method: "POST",
220
- headers: {
221
- Authorization: `Bearer ${perplexityApiKey}`,
222
- "Content-Type": "application/json",
223
- },
224
- body: JSON.stringify({
225
- model: "llama-3.1-8b-online",
226
- messages: [
227
- {
228
- role: "user",
229
- content: "Explain quantum computing in simple terms",
230
- },
231
- ],
232
- }),
233
- });
234
-
235
- if (!response.ok) {
236
- throw new Error(`HTTP error! status: ${response.status}`);
237
- }
238
-
239
- const result = await response.json();
240
- console.log(
241
- `✅ Llama response: ${result.choices[0].message.content.substring(
242
- 0,
243
- 100
244
- )}...`
245
- );
246
- console.log("✅ Different model test successful!");
247
- return true;
248
- } catch (error) {
249
- console.log(`❌ Perplexity different model test failed: ${error}`);
250
- console.error(error);
251
- return false;
252
- }
253
- }
254
-
255
- async function main(): Promise<void> {
256
- console.log("🚀 Starting Revenium Perplexity AI Middleware Tests");
257
- console.log("=".repeat(60));
258
-
259
- let successCount = 0;
260
- const totalTests: number = 4;
261
-
262
- // Run Perplexity AI tests
263
- if (await perplexityBasicExample()) successCount++;
264
- if (await perplexityEnhancedExample()) successCount++;
265
- if (await perplexityStreamingExample()) successCount++;
266
- if (await perplexityDifferentModelExample()) successCount++;
267
-
268
- console.log("\n" + "=".repeat(60));
269
- console.log(`📊 Test Results: ${successCount}/${totalTests} tests passed`);
270
-
271
- if (successCount === totalTests) {
272
- console.log("🎉 All tests passed! Middleware is working correctly.");
273
- } else {
274
- console.log("⚠️ Some tests failed. Check the logs above for details.");
275
- }
276
- }
277
-
278
- main().catch(console.error);
@@ -1,46 +0,0 @@
1
- import { config } from "dotenv";
2
- import { createPerplexityClient } from "../src/perplexity-ai";
3
-
4
- config();
5
-
6
- async function streamingExample() {
7
- console.log("\n🌊 Perplexity AI - Streaming Example");
8
- console.log("=".repeat(50));
9
-
10
- try {
11
- // Create client instance
12
- const client = createPerplexityClient();
13
-
14
- // Create streaming chat completion
15
- const stream = await client.createStreamingChatCompletion({
16
- model: "sonar-pro",
17
- messages: [
18
- {
19
- role: "user",
20
- content: "Write a creative story about AI and the future of technology",
21
- },
22
- ],
23
- });
24
-
25
- console.log("📝 Streaming response:");
26
- console.log("-".repeat(30));
27
-
28
- let fullContent = "";
29
- for await (const chunk of stream) {
30
- const content = chunk.choices[0]?.delta?.content;
31
- if (content) {
32
- fullContent += content;
33
- process.stdout.write(content);
34
- }
35
- }
36
-
37
- console.log("\n\n✅ Streaming completed successfully");
38
- console.log("📊 Streaming usage automatically tracked by middleware");
39
- console.log("🎉 Streaming example successful!");
40
-
41
- } catch (error) {
42
- console.error("❌ Error:", error);
43
- }
44
- }
45
-
46
- streamingExample().catch(console.error);