@revenium/perplexity 1.0.4 → 1.0.6

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.
@@ -97,11 +97,43 @@ async function processPerplexityResponse(response, transactionId, model, startTi
97
97
  try {
98
98
  const endTime = new Date();
99
99
  const duration = (0, utils_1.calculateDurationMs)(startTime, endTime);
100
- // Parse response body
101
- const responseData = await response.json();
102
- // Extract token counts and other data
103
- const tokenCounts = (0, utils_1.extractPerplexityTokenCounts)(responseData);
104
- const stopReason = (0, utils_1.extractStopReason)(responseData);
100
+ // Check if this is a streaming response
101
+ const contentType = response.headers.get("content-type") || "";
102
+ const isStreamingResponse = contentType.includes("text/plain") ||
103
+ contentType.includes("text/event-stream");
104
+ let responseData;
105
+ let tokenCounts = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
106
+ let stopReason = "END";
107
+ if (isStreamingResponse) {
108
+ // For streaming responses, we can't easily parse the full response
109
+ // We'll extract what we can from the stream or use defaults
110
+ const responseText = await response.text();
111
+ // Try to extract token information from the last complete JSON chunk
112
+ const jsonChunks = responseText
113
+ .split("\n")
114
+ .filter((line) => line.startsWith("data: ") && line !== "data: [DONE]")
115
+ .map((line) => line.substring(6)); // Remove 'data: ' prefix
116
+ if (jsonChunks.length > 0) {
117
+ try {
118
+ // Parse the last chunk to get usage information
119
+ const lastChunk = JSON.parse(jsonChunks[jsonChunks.length - 1]);
120
+ if (lastChunk.usage) {
121
+ tokenCounts = (0, utils_1.extractPerplexityTokenCounts)(lastChunk);
122
+ }
123
+ }
124
+ catch (e) {
125
+ // If we can't parse, use defaults
126
+ models_1.Logger.warning("Could not parse streaming response for token counts, using defaults");
127
+ }
128
+ }
129
+ responseData = { usage: tokenCounts };
130
+ }
131
+ else {
132
+ // Parse response body for non-streaming responses
133
+ responseData = await response.json();
134
+ tokenCounts = (0, utils_1.extractPerplexityTokenCounts)(responseData);
135
+ stopReason = (0, utils_1.extractStopReason)(responseData);
136
+ }
105
137
  const modelName = (0, utils_1.extractModelName)(responseData, model);
106
138
  // Send metering data (only if API key is available)
107
139
  if ((0, getEnv_1.getReveniumApiKey)()) {
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/perplexity-ai/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/perplexity-ai/middleware.ts"],"names":[],"mappings":";;AAAA,sCAA2C;AAC3C,oCAKkB;AAClB,oCAUkB;AAClB,sCAAoE;AACpE,0DAcqC;AACrC,4DAIsC;AAEtC,4CAIyB;AAEzB,0BAA0B;AAC1B,MAAM,cAAc,GAA+B,IAAI,GAAG,EAGvD,CAAC;AAEJ,0EAA0E;AAC1E,IAAI,qBAAqB,GAAY,KAAK,CAAC;AAE3C,sCAAsC;AACtC,SAAS,8BAA8B;IACrC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,uDAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,qDAAqD;IACrD,IAAI,CAAC,IAAA,0BAAiB,GAAE,EAAE,CAAC;QACzB,eAAM,CAAC,OAAO,CAAC,8DAAmD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC;QACH,4CAA4C;QAC5C,+BAA+B,EAAE,CAAC;QAElC,sBAAsB;QACtB,qBAAqB,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,+CAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wDAA6C,EAAE,KAAK,CAAC,CAAC;QACpE,MAAM,IAAI,2BAAkB,CAC1B,GAAG,6DAAkD,KAAK,KAAK,EAAE,CAClE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,SAAS,+BAA+B;IACtC,gCAAgC;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;IAEnC,mDAAmD;IACnD,MAAM,CAAC,KAAK,GAAG,KAAK,WAClB,KAA6B,EAC7B,IAAkB;QAElB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAEpC,4CAA4C;QAC5C,IACE,GAAG,CAAC,QAAQ,CAAC,IAAA,6BAAoB,GAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACjC,CAAC;YACD,OAAO,MAAM,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACjE,CAAC;QAED,kDAAkD;QAClD,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,oEAAyD,CAAC,CAAC;AACzE,CAAC;AAED,gCAAgC;AAChC,KAAK,UAAU,uBAAuB,CACpC,GAAW,EACX,IAA6B,EAC7B,aAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAG,IAAA,6BAAqB,GAAE,CAAC;IAE9C,oCAAoC;IACpC,IAAI,WAAW,GAAQ,EAAE,CAAC;IAC1B,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QACf,IAAI,CAAC;YACH,WAAW;gBACT,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,OAAO,CACZ,uEAA4D,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,aAAa,GAAG,IAAA,4BAAoB,EAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,oCAAwB,CAAC;IAE5D,eAAM,CAAC,KAAK,CAAC,sEAA2D,EAAE;QACxE,aAAa;QACb,KAAK;QACL,GAAG;KACJ,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEhD,2DAA2D;QAC3D,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEvC,0DAA0D;QAC1D,yBAAyB,CACvB,aAAa,EACb,aAAa,EACb,KAAK,EACL,SAAS,EACT,aAAa,CACd,CAAC;QAEF,2CAA2C;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,sDAA2C,EAAE;YACxD,aAAa;YACb,KAAK;SACN,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,KAAK,UAAU,yBAAyB,CACtC,QAAkB,EAClB,aAAqB,EACrB,KAAa,EACb,SAAe,EACf,aAA6B,EAC7B,UAAuB,EACvB,QAAiB,EACjB,QAAiB,EACjB,aAAsB,EACtB,cAAuB,EACvB,SAAkB,EAClB,UAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEzD,wCAAwC;QACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,mBAAmB,GACvB,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClC,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAE5C,IAAI,YAAiB,CAAC;QACtB,IAAI,WAAW,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,mBAAmB,EAAE,CAAC;YACxB,mEAAmE;YACnE,4DAA4D;YAC5D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE3C,qEAAqE;YACrE,MAAM,UAAU,GAAG,YAAY;iBAC5B,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,cAAc,CAAC;iBACtE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;YAE9D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,gDAAgD;oBAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChE,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpB,WAAW,GAAG,IAAA,oCAA4B,EAAC,SAAS,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,kCAAkC;oBAClC,eAAM,CAAC,OAAO,CACZ,qEAAqE,CACtE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,YAAY,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,WAAW,GAAG,IAAA,oCAA4B,EAAC,YAAY,CAAC,CAAC;YACzD,UAAU,GAAG,IAAA,yBAAiB,EAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAExD,oDAAoD;QACpD,IAAI,IAAA,0BAAiB,GAAE,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,IAAA,wBAAgB,EACpB;oBACE,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,QAAQ,IAAI,IAAI;oBAC1B,UAAU,EAAE,UAAU,IAAI,IAAI;oBAC9B,QAAQ,EAAE,QAAQ,IAAI,MAAM;oBAC5B,KAAK,EAAE,eAAe;oBACtB,aAAa,EAAE,aAAa,IAAI,MAAM;oBACtC,eAAe,EAAE,WAAW,CAAC,WAAW;oBACxC,gBAAgB,EAAE,WAAW,CAAC,YAAY;oBAC1C,mBAAmB,EAAE,CAAC;oBACtB,uBAAuB,EAAE,CAAC;oBAC1B,mBAAmB,EAAE,CAAC;oBACtB,eAAe,EAAE,WAAW,CAAC,WAAW;oBACxC,cAAc,EAAE,cAAc,IAAI,mBAAmB;oBACrD,SAAS,EAAE,SAAS,IAAI,YAAY;oBACpC,UAAU,EAAE,UAAU,IAAI;wBACxB,EAAE,EAAE,QAAQ,IAAA,6BAAqB,GAAE,EAAE;wBACrC,KAAK,EAAE,oBAAoB;wBAC3B,UAAU,EAAE;4BACV,IAAI,EAAE,SAAS;4BACf,KAAK,EAAE,UAAU;yBAClB;qBACF;oBACD,KAAK,EAAE,SAAS;oBAChB,aAAa;oBACb,YAAY,EAAE,IAAA,uBAAe,EAAC,OAAO,CAAC;oBACtC,eAAe,EAAE,QAAQ;oBACzB,QAAQ,EAAE,gBAAQ,CAAC,UAAU;oBAC7B,WAAW,EAAE,IAAA,uBAAe,EAAC,SAAS,CAAC;oBACvC,mBAAmB,EAAE,IAAA,uBAAe,EAAC,OAAO,CAAC;oBAC7C,gBAAgB,EAAE,CAAC;oBACnB,iBAAiB,EAAE,MAAM;iBAC1B,EACD,IAAA,0BAAiB,GAAE,EACnB,IAAA,2BAAkB,GAAE,CACrB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAM,CAAC,OAAO,CAAC,uDAA4C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,oDAAyC,CAAC,CAAC;QAC1D,CAAC;QAED,eAAM,CAAC,KAAK,CACV,8EAAmE,EACnE;YACE,aAAa;SACd,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,8DAAmD,EAAE;YAChE,aAAa;YACb,KAAK;SACN,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,8BAA8B,EAAE,CAAC"}
@@ -30,7 +30,10 @@ async function metadataExample() {
30
30
  },
31
31
  });
32
32
 
33
- console.log("✅ Response:", basicResponse.choices[0]?.message?.content?.substring(0, 100) + "...");
33
+ console.log(
34
+ "✅ Response:",
35
+ basicResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
36
+ );
34
37
 
35
38
  // Example 2: Advanced metadata
36
39
  console.log("\n2️⃣ Advanced metadata tracking:");
@@ -53,7 +56,10 @@ async function metadataExample() {
53
56
  },
54
57
  });
55
58
 
56
- console.log("✅ Response:", advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "...");
59
+ console.log(
60
+ "✅ Response:",
61
+ advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
62
+ );
57
63
 
58
64
  // Example 3: Streaming with metadata
59
65
  console.log("\n3️⃣ Streaming with metadata:");
@@ -83,7 +89,6 @@ async function metadataExample() {
83
89
 
84
90
  console.log("\n\n🎉 All metadata examples completed successfully!");
85
91
  console.log("📊 All usage tracked with custom metadata");
86
-
87
92
  } catch (error) {
88
93
  console.error("❌ Error:", error);
89
94
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenium/perplexity",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "NodeJS middleware for perplexity's AI API",
5
5
  "homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
6
6
  "bugs": {
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "license": "ISC",
14
14
  "author": "",
15
- "type": "module",
15
+ "type": "commonjs",
16
16
  "main": "dist/index.js",
17
17
  "scripts": {
18
18
  "build": "tsc",
@@ -0,0 +1,31 @@
1
+ import { createPerplexityClient } from "@revenium/perplexity";
2
+
3
+ const basicExampl = async () => {
4
+ console.log("\n🤖 Perplexity AI - Basic Client Example");
5
+ console.log("=".repeat(50));
6
+
7
+ 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",
14
+ messages: [
15
+ {
16
+ role: "user",
17
+ content: "What is the meaning of life, the universe and everything?",
18
+ },
19
+ ],
20
+ });
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!");
26
+ } catch (error) {
27
+ console.error("❌ Error:", error);
28
+ }
29
+ };
30
+
31
+ basicExampl();
@@ -0,0 +1,36 @@
1
+ import { createPerplexityClient } from "@revenium/perplexity";
2
+
3
+ const enhancedExample = async () => {
4
+ console.log("\n1️⃣ Enhanced Example:");
5
+
6
+ try {
7
+ const client = createPerplexityClient();
8
+ const advancedResponse = await client.createChatCompletion({
9
+ model: "sonar-pro",
10
+ messages: [
11
+ {
12
+ role: "user",
13
+ content: "What are the latest developments in AI?",
14
+ },
15
+ ],
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
+ },
25
+ });
26
+
27
+ console.log(
28
+ "✅ Response:",
29
+ advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
30
+ );
31
+ } catch (error) {
32
+ console.error("❌ Error:", error);
33
+ }
34
+ };
35
+
36
+ enhancedExample();
@@ -186,12 +186,50 @@ async function processPerplexityResponse(
186
186
  const endTime = new Date();
187
187
  const duration = calculateDurationMs(startTime, endTime);
188
188
 
189
- // Parse response body
190
- const responseData = await response.json();
189
+ // Check if this is a streaming response
190
+ const contentType = response.headers.get("content-type") || "";
191
+ const isStreamingResponse =
192
+ contentType.includes("text/plain") ||
193
+ contentType.includes("text/event-stream");
194
+
195
+ let responseData: any;
196
+ let tokenCounts = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
197
+ let stopReason = "END";
198
+
199
+ if (isStreamingResponse) {
200
+ // For streaming responses, we can't easily parse the full response
201
+ // We'll extract what we can from the stream or use defaults
202
+ const responseText = await response.text();
203
+
204
+ // Try to extract token information from the last complete JSON chunk
205
+ const jsonChunks = responseText
206
+ .split("\n")
207
+ .filter((line) => line.startsWith("data: ") && line !== "data: [DONE]")
208
+ .map((line) => line.substring(6)); // Remove 'data: ' prefix
209
+
210
+ if (jsonChunks.length > 0) {
211
+ try {
212
+ // Parse the last chunk to get usage information
213
+ const lastChunk = JSON.parse(jsonChunks[jsonChunks.length - 1]);
214
+ if (lastChunk.usage) {
215
+ tokenCounts = extractPerplexityTokenCounts(lastChunk);
216
+ }
217
+ } catch (e) {
218
+ // If we can't parse, use defaults
219
+ Logger.warning(
220
+ "Could not parse streaming response for token counts, using defaults"
221
+ );
222
+ }
223
+ }
224
+
225
+ responseData = { usage: tokenCounts };
226
+ } else {
227
+ // Parse response body for non-streaming responses
228
+ responseData = await response.json();
229
+ tokenCounts = extractPerplexityTokenCounts(responseData);
230
+ stopReason = extractStopReason(responseData);
231
+ }
191
232
 
192
- // Extract token counts and other data
193
- const tokenCounts = extractPerplexityTokenCounts(responseData);
194
- const stopReason = extractStopReason(responseData);
195
233
  const modelName = extractModelName(responseData, model);
196
234
 
197
235
  // Send metering data (only if API key is available)
@@ -1,22 +0,0 @@
1
- import { createPerplexityClient } from "@revenium/perplexity";
2
-
3
- async function basicExample() {
4
- const client = createPerplexityClient();
5
-
6
- const response = await client.createChatCompletion({
7
- model: "sonar-pro",
8
- messages: [
9
- {
10
- role: "user",
11
- content: "What is the meaning of life, the universe and everything?",
12
- },
13
- ],
14
- });
15
-
16
- console.log("✅ Response received:");
17
- console.log(response.choices[0].message.content);
18
- console.log("\n📊 Token usage automatically tracked by middleware");
19
- console.log("🎉 Basic client example successful!");
20
- }
21
-
22
- basicExample();