@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.
- package/dist/perplexity-ai/middleware.js +37 -5
- package/dist/perplexity-ai/middleware.js.map +1 -1
- package/examples/metadata-example.ts +8 -3
- package/package.json +2 -2
- package/playground/basic.js +31 -0
- package/playground/enhanced.js +36 -0
- package/src/perplexity-ai/middleware.ts +43 -5
- package/playground/basic-client-example.js +0 -22
|
@@ -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
|
-
//
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
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": "
|
|
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
|
-
//
|
|
190
|
-
const
|
|
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();
|