@revenium/perplexity 1.0.23 → 1.0.25
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/README.md +391 -162
- package/dist/interfaces/meteringResponse.d.ts +28 -27
- package/dist/interfaces/meteringResponse.js +2 -2
- package/dist/models/Metering.js +21 -18
- package/dist/v1/perplexityV1.service.js +166 -0
- package/dist/v2/perplexityV2.service.js +178 -0
- package/examples/v1/basic.ts +50 -0
- package/examples/v1/chat.ts +40 -0
- package/examples/v1/metadata.ts +49 -0
- package/examples/v1/streaming.ts +44 -0
- package/examples/v2/basic.ts +49 -0
- package/examples/v2/chat.ts +60 -0
- package/examples/v2/metadata.ts +71 -0
- package/examples/v2/streaming.ts +61 -0
- package/package.json +26 -11
- package/playground/v1/basic.js +50 -0
- package/playground/v1/chat.js +46 -0
- package/playground/v1/metadata.js +50 -0
- package/playground/v1/streaming.js +44 -0
- package/playground/v2/basic.js +49 -0
- package/playground/v2/chat.js +72 -0
- package/playground/v2/metadata.js +76 -0
- package/playground/v2/streaming.js +67 -0
- package/src/index.ts +14 -1
- package/src/interfaces/chatCompletionRequest.ts +7 -2
- package/src/interfaces/meteringResponse.ts +1 -0
- package/src/interfaces/perplexityResponse.ts +63 -0
- package/src/interfaces/perplexityStreaming.ts +56 -0
- package/src/models/Metering.ts +8 -1
- package/src/utils/constants/perplexityModels.ts +71 -0
- package/src/v1/perplexityV1.controller.ts +164 -0
- package/src/v1/perplexityV1.service.ts +230 -0
- package/src/v2/perplexityV2.controller.ts +219 -0
- package/src/v2/perplexityV2.service.ts +260 -0
- package/dist/index.js +0 -19
- package/dist/interfaces/chatCompletionRequest.d.ts +0 -9
- package/dist/interfaces/chatCompletionRequest.js +0 -2
- package/dist/interfaces/credential.d.ts +0 -4
- package/dist/interfaces/credential.js +0 -2
- package/dist/interfaces/meteringRequest.d.ts +0 -13
- package/dist/interfaces/meteringRequest.js +0 -2
- package/dist/interfaces/operation.d.ts +0 -4
- package/dist/interfaces/operation.js +0 -8
- package/dist/interfaces/subscriber.d.ts +0 -8
- package/dist/interfaces/subscriber.js +0 -2
- package/dist/interfaces/tokenCounts.d.ts +0 -7
- package/dist/interfaces/tokenCounts.js +0 -2
- package/dist/interfaces/usageMetadata.d.ts +0 -27
- package/dist/interfaces/usageMetadata.js +0 -2
- package/dist/middleware.d.ts +0 -22
- package/dist/middleware.js +0 -129
- package/dist/models/Logger.js +0 -35
- package/dist/models/Metering.d.ts +0 -9
- package/dist/utils/calculateDurationMs.d.ts +0 -1
- package/dist/utils/calculateDurationMs.js +0 -6
- package/dist/utils/constants/constants.d.ts +0 -6
- package/dist/utils/constants/constants.js +0 -11
- package/dist/utils/constants/logLevels.d.ts +0 -1
- package/dist/utils/constants/logLevels.js +0 -4
- package/dist/utils/constants/messages.d.ts +0 -5
- package/dist/utils/constants/messages.js +0 -8
- package/dist/utils/constants/models.d.ts +0 -1
- package/dist/utils/constants/models.js +0 -21
- package/dist/utils/extractTokenCount.d.ts +0 -2
- package/dist/utils/extractTokenCount.js +0 -28
- package/dist/utils/formatTimeStamp.d.ts +0 -1
- package/dist/utils/formatTimeStamp.js +0 -6
- package/dist/utils/generateTransactionId.d.ts +0 -1
- package/dist/utils/generateTransactionId.js +0 -7
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.js +0 -23
- package/dist/utils/loadEnv.d.ts +0 -1
- package/dist/utils/loadEnv.js +0 -7
- package/dist/utils/safeExtract.d.ts +0 -29
- package/dist/utils/safeExtract.js +0 -67
- package/examples/basic.ts +0 -17
- package/examples/chat-completions.ts +0 -22
- package/examples/enhanced.ts +0 -20
- package/examples/metadata.ts +0 -43
- package/examples/streaming.ts +0 -24
- package/playground/basic.js +0 -17
- package/playground/chat-completions.js +0 -22
- package/playground/enhanced.js +0 -20
- package/playground/metadata.js +0 -43
- package/playground/streaming.js +0 -24
- package/src/middleware.ts +0 -157
package/README.md
CHANGED
|
@@ -5,17 +5,24 @@
|
|
|
5
5
|
[](https://docs.revenium.io)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
Automatically track and meter your Perplexity AI API usage with Revenium. This
|
|
8
|
+
Automatically track and meter your Perplexity AI API usage with Revenium. This package provides seamless integration with Perplexity AI API using modern Controller architecture, supporting both V1 (compatible) and V2 (enhanced) response formats.
|
|
9
|
+
|
|
10
|
+
## 🎯 **New Architecture: V1 & V2 Controllers**
|
|
11
|
+
|
|
12
|
+
- **V1 Controller**: Maintains compatibility with existing middleware logic
|
|
13
|
+
- **V2 Controller**: Enhanced response format following [OpenAI Responses API](https://platform.openai.com/docs/guides/migrate-to-responses) guidelines
|
|
14
|
+
- **Service Layer**: Handles API calls, metering, and data transformation
|
|
15
|
+
- **Rich Examples**: TypeScript examples and JavaScript playground files
|
|
9
16
|
|
|
10
17
|
## 🚀 Getting Started
|
|
11
18
|
|
|
12
|
-
You have 3 options to start using Revenium
|
|
19
|
+
You have 3 options to start using Revenium Controllers for Perplexity AI:
|
|
13
20
|
|
|
14
|
-
| Option | Description
|
|
15
|
-
| ----------------------------------------- |
|
|
16
|
-
| **Option 1: Create Project from Scratch** | Perfect for new projects. We'll guide you step-by-step
|
|
17
|
-
| **Option 2: Clone Our Repository** | Quick testing with pre-built examples and playground scripts.
|
|
18
|
-
| **Option 3: Add to Existing Project** | Already have a project? Just install and
|
|
21
|
+
| Option | Description | Best For |
|
|
22
|
+
| ----------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
|
|
23
|
+
| **Option 1: Create Project from Scratch** | Perfect for new projects. We'll guide you step-by-step using V1 or V2 Controllers. | 👉 [Go to Step-by-Step Guide](#option-1-create-project-from-scratch) |
|
|
24
|
+
| **Option 2: Clone Our Repository** | Quick testing with pre-built V1/V2 examples and playground scripts. | 👉 [Go to Clone Guide](#option-2-clone-repository) |
|
|
25
|
+
| **Option 3: Add to Existing Project** | Already have a project? Just install and use Controllers. | 👉 [Go to Quick Integration](#option-3-existing-project-integration) |
|
|
19
26
|
|
|
20
27
|
---
|
|
21
28
|
|
|
@@ -65,36 +72,67 @@ REVENIUM_METERING_BASE_URL="https://api.revenium.io/meter"
|
|
|
65
72
|
|
|
66
73
|
### Step 4: Create Your First Test
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
Choose between V1 (compatible) or V2 (enhanced) Controller:
|
|
76
|
+
|
|
77
|
+
#### Option A: V1 Controller (Compatible)
|
|
78
|
+
|
|
79
|
+
Create `test-perplexity-v1.js`:
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
// test-perplexity-v1.js
|
|
83
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
84
|
+
|
|
85
|
+
const basicV1Example = async () => {
|
|
86
|
+
try {
|
|
87
|
+
const controller = new PerplexityV1Controller();
|
|
88
|
+
|
|
89
|
+
const result = await controller.createChat(
|
|
90
|
+
["What is the universe?"],
|
|
91
|
+
"sonar-pro"
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
console.log("*** V1 RESPONSE ***");
|
|
95
|
+
console.log(result.responses[0].text);
|
|
96
|
+
console.log(`📊 Tokens: ${result.usageMetadata.totalTokenCount}`);
|
|
97
|
+
console.log("✅ V1 Controller example successful!");
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error("❌ V1 Controller example failed:", error);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
basicV1Example();
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Option B: V2 Controller (Enhanced)
|
|
108
|
+
|
|
109
|
+
Create `test-perplexity-v2.js`:
|
|
69
110
|
|
|
70
111
|
```javascript
|
|
71
|
-
// test-perplexity.js
|
|
72
|
-
import {
|
|
112
|
+
// test-perplexity-v2.js
|
|
113
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
73
114
|
|
|
74
|
-
const
|
|
115
|
+
const basicV2Example = async () => {
|
|
75
116
|
try {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const result = await
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
console.log("*** RESPONSE ***");
|
|
89
|
-
console.log(text);
|
|
90
|
-
console.log("✅ Basic Perplexity AI example successful!");
|
|
117
|
+
const controller = new PerplexityV2Controller();
|
|
118
|
+
|
|
119
|
+
const result = await controller.createChat(
|
|
120
|
+
["What is the universe?"],
|
|
121
|
+
"sonar-pro"
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
console.log("*** V2 ENHANCED RESPONSE ***");
|
|
125
|
+
console.log(result.choices[0].message.content);
|
|
126
|
+
console.log(`📊 Usage: ${result.usage.total_tokens} tokens`);
|
|
127
|
+
console.log(`⚡ Processing: ${result.metadata.processingTime}ms`);
|
|
128
|
+
console.log("✅ V2 Enhanced Controller example successful!");
|
|
91
129
|
} catch (error) {
|
|
92
|
-
console.error("❌
|
|
130
|
+
console.error("❌ V2 Controller example failed:", error);
|
|
93
131
|
process.exit(1);
|
|
94
132
|
}
|
|
95
133
|
};
|
|
96
134
|
|
|
97
|
-
|
|
135
|
+
basicV2Example();
|
|
98
136
|
```
|
|
99
137
|
|
|
100
138
|
### Step 5: Update package.json
|
|
@@ -107,7 +145,8 @@ Add test scripts and module type to your `package.json`:
|
|
|
107
145
|
"version": "1.0.0",
|
|
108
146
|
"type": "module",
|
|
109
147
|
"scripts": {
|
|
110
|
-
"test-
|
|
148
|
+
"test-v1": "node test-perplexity-v1.js",
|
|
149
|
+
"test-v2": "node test-perplexity-v2.js"
|
|
111
150
|
},
|
|
112
151
|
"dependencies": {
|
|
113
152
|
"@revenium/perplexity": "^1.0.0"
|
|
@@ -132,8 +171,11 @@ Make sure your `package.json` includes `"type": "module"` as shown below.
|
|
|
132
171
|
### Step 6: Run Your Tests
|
|
133
172
|
|
|
134
173
|
```bash
|
|
135
|
-
# Test
|
|
136
|
-
npm run test-
|
|
174
|
+
# Test V1 Controller (Compatible)
|
|
175
|
+
npm run test-v1
|
|
176
|
+
|
|
177
|
+
# Test V2 Controller (Enhanced)
|
|
178
|
+
npm run test-v2
|
|
137
179
|
```
|
|
138
180
|
|
|
139
181
|
### Step 7: Create Advanced Examples
|
|
@@ -144,99 +186,164 @@ Create an examples directory and add these files:
|
|
|
144
186
|
mkdir examples
|
|
145
187
|
```
|
|
146
188
|
|
|
147
|
-
#### Streaming Example
|
|
189
|
+
#### V1 Streaming Example
|
|
190
|
+
|
|
191
|
+
Create `examples/streaming-v1.js`:
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
// examples/streaming-v1.js
|
|
195
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
196
|
+
|
|
197
|
+
const streamingV1Example = async () => {
|
|
198
|
+
try {
|
|
199
|
+
const controller = new PerplexityV1Controller();
|
|
200
|
+
|
|
201
|
+
const stream = await controller.createStreaming(
|
|
202
|
+
["What is artificial intelligence?"],
|
|
203
|
+
"sonar-pro"
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
console.log("*** V1 STREAMING RESPONSE ***");
|
|
207
|
+
let fullText = "";
|
|
208
|
+
|
|
209
|
+
for await (const chunk of stream) {
|
|
210
|
+
if (chunk.text) {
|
|
211
|
+
process.stdout.write(chunk.text);
|
|
212
|
+
fullText += chunk.text;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
console.log("\n✅ V1 Streaming with metering successful!");
|
|
217
|
+
console.log(`📊 Total response length: ${fullText.length} characters`);
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error("❌ V1 streaming example failed:", error);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
streamingV1Example();
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
#### V2 Streaming Example
|
|
148
228
|
|
|
149
|
-
Create `examples/streaming-
|
|
229
|
+
Create `examples/streaming-v2.js`:
|
|
150
230
|
|
|
151
231
|
```javascript
|
|
152
|
-
// examples/streaming-
|
|
153
|
-
import {
|
|
232
|
+
// examples/streaming-v2.js
|
|
233
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
154
234
|
|
|
155
|
-
const
|
|
235
|
+
const streamingV2Example = async () => {
|
|
156
236
|
try {
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
const stream = await
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
],
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
console.log("*** STREAMING RESPONSE ***");
|
|
237
|
+
const controller = new PerplexityV2Controller();
|
|
238
|
+
|
|
239
|
+
const stream = await controller.createStreaming(
|
|
240
|
+
["What is artificial intelligence?"],
|
|
241
|
+
"sonar-pro"
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
console.log("*** V2 ENHANCED STREAMING RESPONSE ***");
|
|
169
245
|
let fullText = "";
|
|
170
246
|
|
|
171
247
|
for await (const chunk of stream) {
|
|
172
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
248
|
+
const content = chunk.choices?.[0]?.delta?.content;
|
|
173
249
|
if (content) {
|
|
174
250
|
process.stdout.write(content);
|
|
175
251
|
fullText += content;
|
|
176
252
|
}
|
|
177
253
|
}
|
|
178
254
|
|
|
179
|
-
console.log("\n✅
|
|
255
|
+
console.log("\n✅ V2 Enhanced Streaming successful!");
|
|
180
256
|
console.log(`📊 Total response length: ${fullText.length} characters`);
|
|
181
257
|
} catch (error) {
|
|
182
|
-
console.error("❌
|
|
258
|
+
console.error("❌ V2 streaming example failed:", error);
|
|
183
259
|
process.exit(1);
|
|
184
260
|
}
|
|
185
261
|
};
|
|
186
262
|
|
|
187
|
-
|
|
263
|
+
streamingV2Example();
|
|
188
264
|
```
|
|
189
265
|
|
|
190
|
-
####
|
|
266
|
+
#### Metadata Example
|
|
191
267
|
|
|
192
|
-
Create `examples/metadata-
|
|
268
|
+
Create `examples/metadata-v1.js`:
|
|
193
269
|
|
|
194
270
|
```javascript
|
|
195
|
-
// examples/metadata-
|
|
196
|
-
import {
|
|
271
|
+
// examples/metadata-v1.js
|
|
272
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
197
273
|
|
|
198
|
-
const
|
|
274
|
+
const metadataV1Example = async () => {
|
|
199
275
|
try {
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
reasoningTokenCount: 20,
|
|
224
|
-
cacheCreationTokenCount: 0,
|
|
225
|
-
cacheReadTokenCount: 0,
|
|
226
|
-
totalTokenCount: 40,
|
|
227
|
-
responseTime: new Date(),
|
|
228
|
-
requestDuration: 1000,
|
|
229
|
-
stopReason: "END",
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
console.log("[BASIC REQUEST]", result.choices[0].message);
|
|
276
|
+
const controller = new PerplexityV1Controller();
|
|
277
|
+
|
|
278
|
+
// Custom metadata for tracking
|
|
279
|
+
const customMetadata = {
|
|
280
|
+
traceId: "trace-12345",
|
|
281
|
+
taskType: "research-query",
|
|
282
|
+
subscriberEmail: "user@example.com",
|
|
283
|
+
subscriberId: "user-456",
|
|
284
|
+
organizationId: "org-789",
|
|
285
|
+
agent: "perplexity-v1-demo",
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const result = await controller.createChat(
|
|
289
|
+
["What is the capital of France?"],
|
|
290
|
+
"sonar-pro",
|
|
291
|
+
customMetadata
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
console.log("*** V1 RESPONSE WITH METADATA ***");
|
|
295
|
+
console.log(result.responses[0].text);
|
|
296
|
+
console.log(`📊 Tokens: ${result.usageMetadata.totalTokenCount}`);
|
|
297
|
+
console.log(`🏷️ Trace ID: ${customMetadata.traceId}`);
|
|
298
|
+
console.log("✅ V1 Metadata example successful!");
|
|
233
299
|
} catch (error) {
|
|
234
|
-
console.error("❌
|
|
300
|
+
console.error("❌ V1 metadata example failed:", error);
|
|
235
301
|
process.exit(1);
|
|
236
302
|
}
|
|
237
303
|
};
|
|
238
304
|
|
|
239
|
-
|
|
305
|
+
metadataV1Example();
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Create `examples/metadata-v2.js`:
|
|
309
|
+
|
|
310
|
+
```javascript
|
|
311
|
+
// examples/metadata-v2.js
|
|
312
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
313
|
+
|
|
314
|
+
const metadataV2Example = async () => {
|
|
315
|
+
try {
|
|
316
|
+
const controller = new PerplexityV2Controller();
|
|
317
|
+
|
|
318
|
+
// Enhanced metadata for V2
|
|
319
|
+
const customMetadata = {
|
|
320
|
+
traceId: "trace-v2-67890",
|
|
321
|
+
taskType: "enhanced-research",
|
|
322
|
+
subscriberEmail: "user@example.com",
|
|
323
|
+
subscriberId: "user-456",
|
|
324
|
+
organizationId: "org-789",
|
|
325
|
+
agent: "perplexity-v2-demo",
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const result = await controller.createChat(
|
|
329
|
+
["What is the capital of France?"],
|
|
330
|
+
"sonar-pro",
|
|
331
|
+
customMetadata
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
console.log("*** V2 ENHANCED RESPONSE WITH METADATA ***");
|
|
335
|
+
console.log(result.choices[0].message.content);
|
|
336
|
+
console.log(`📊 Usage: ${result.usage.total_tokens} tokens`);
|
|
337
|
+
console.log(`⚡ Processing: ${result.metadata.processingTime}ms`);
|
|
338
|
+
console.log(`🏷️ Trace ID: ${customMetadata.traceId}`);
|
|
339
|
+
console.log("✅ V2 Enhanced Metadata example successful!");
|
|
340
|
+
} catch (error) {
|
|
341
|
+
console.error("❌ V2 metadata example failed:", error);
|
|
342
|
+
process.exit(1);
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
metadataV2Example();
|
|
240
347
|
```
|
|
241
348
|
|
|
242
349
|
### Step 8: Update package.json
|
|
@@ -247,9 +354,12 @@ metadataExample();
|
|
|
247
354
|
"version": "1.0.0",
|
|
248
355
|
"type": "module",
|
|
249
356
|
"scripts": {
|
|
250
|
-
"test-
|
|
251
|
-
"test-
|
|
252
|
-
"test-
|
|
357
|
+
"test-v1": "node test-perplexity-v1.js",
|
|
358
|
+
"test-v2": "node test-perplexity-v2.js",
|
|
359
|
+
"test-v1-stream": "node examples/streaming-v1.js",
|
|
360
|
+
"test-v2-stream": "node examples/streaming-v2.js",
|
|
361
|
+
"test-v1-metadata": "node examples/metadata-v1.js",
|
|
362
|
+
"test-v2-metadata": "node examples/metadata-v2.js"
|
|
253
363
|
},
|
|
254
364
|
"dependencies": {
|
|
255
365
|
"@revenium/perplexity": "^1.0.0"
|
|
@@ -260,12 +370,13 @@ metadataExample();
|
|
|
260
370
|
### Step 9: Test Advanced Examples
|
|
261
371
|
|
|
262
372
|
```bash
|
|
263
|
-
# Test
|
|
264
|
-
npm run test-
|
|
265
|
-
|
|
266
|
-
# Test metadata
|
|
267
|
-
npm run test-perplexity-metadata
|
|
373
|
+
# Test V1 examples
|
|
374
|
+
npm run test-v1-stream
|
|
375
|
+
npm run test-v1-metadata
|
|
268
376
|
|
|
377
|
+
# Test V2 examples
|
|
378
|
+
npm run test-v2-stream
|
|
379
|
+
npm run test-v2-metadata
|
|
269
380
|
```
|
|
270
381
|
|
|
271
382
|
---
|
|
@@ -299,29 +410,46 @@ REVENIUM_METERING_API_KEY="your_revenium_api_key_here"
|
|
|
299
410
|
REVENIUM_METERING_BASE_URL="https://api.revenium.io/meter"
|
|
300
411
|
```
|
|
301
412
|
|
|
302
|
-
### Run
|
|
413
|
+
### Run V1 & V2 Examples
|
|
303
414
|
|
|
304
415
|
```bash
|
|
305
|
-
#
|
|
306
|
-
## Change type to commonjs in package.json
|
|
307
|
-
"type": "commonjs",
|
|
308
|
-
# Then run any of the following
|
|
309
|
-
npm run e-basic # Basic chat completion
|
|
310
|
-
npm run e-streaming # Streaming response
|
|
311
|
-
npm run e-enhanced # Enhanced request
|
|
312
|
-
npm run e-chat-completions # Chat completions
|
|
313
|
-
npm run e-metadata # Metadata request
|
|
314
|
-
|
|
315
|
-
# Playground examples
|
|
316
|
-
# Required build first
|
|
416
|
+
# Build the project first
|
|
317
417
|
npm run build
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
npm run
|
|
322
|
-
npm run
|
|
323
|
-
npm run
|
|
324
|
-
|
|
418
|
+
|
|
419
|
+
# V1 Controller Examples (TypeScript)
|
|
420
|
+
npm run e-v1-basic # V1 Basic chat completion
|
|
421
|
+
npm run e-v1-streaming # V1 Streaming response
|
|
422
|
+
npm run e-v1-chat # V1 Multi-turn chat
|
|
423
|
+
npm run e-v1-metadata # V1 Metadata tracking
|
|
424
|
+
|
|
425
|
+
# V2 Controller Examples (TypeScript)
|
|
426
|
+
npm run e-v2-basic # V2 Enhanced chat completion
|
|
427
|
+
npm run e-v2-streaming # V2 Enhanced streaming
|
|
428
|
+
npm run e-v2-chat # V2 Enhanced multi-turn chat
|
|
429
|
+
npm run e-v2-metadata # V2 Enhanced metadata
|
|
430
|
+
|
|
431
|
+
# V1 Playground Examples (JavaScript)
|
|
432
|
+
npm run p-v1-basic # V1 Basic (JavaScript)
|
|
433
|
+
npm run p-v1-streaming # V1 Streaming (JavaScript)
|
|
434
|
+
npm run p-v1-chat # V1 Chat (JavaScript)
|
|
435
|
+
npm run p-v1-metadata # V1 Metadata (JavaScript)
|
|
436
|
+
|
|
437
|
+
# V2 Playground Examples (JavaScript)
|
|
438
|
+
npm run p-v2-basic # V2 Enhanced (JavaScript)
|
|
439
|
+
npm run p-v2-streaming # V2 Enhanced Streaming (JavaScript)
|
|
440
|
+
npm run p-v2-chat # V2 Enhanced Chat (JavaScript)
|
|
441
|
+
npm run p-v2-metadata # V2 Enhanced Metadata (JavaScript)
|
|
442
|
+
|
|
443
|
+
# Convenience Scripts
|
|
444
|
+
npm run examples:v1 # Run V1 basic example
|
|
445
|
+
npm run examples:v2 # Run V2 basic example
|
|
446
|
+
npm run examples:all # Run both V1 and V2 examples
|
|
447
|
+
npm run playground:v1 # Run V1 playground basic
|
|
448
|
+
npm run playground:v2 # Run V2 playground basic
|
|
449
|
+
npm run playground:all # Run both V1 and V2 playground
|
|
450
|
+
npm run test:v1 # Test all V1 examples
|
|
451
|
+
npm run test:v2 # Test all V2 examples
|
|
452
|
+
npm run test:all # Test all V1 and V2 examples
|
|
325
453
|
```
|
|
326
454
|
|
|
327
455
|
---
|
|
@@ -354,31 +482,45 @@ REVENIUM_METERING_BASE_URL="https://api.revenium.io/meter"
|
|
|
354
482
|
import { OpenAI } from "openai";
|
|
355
483
|
```
|
|
356
484
|
|
|
357
|
-
**After:**
|
|
485
|
+
**After (V1 Controller):**
|
|
486
|
+
|
|
487
|
+
```javascript
|
|
488
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**After (V2 Controller):**
|
|
358
492
|
|
|
359
493
|
```javascript
|
|
360
|
-
import {
|
|
494
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
361
495
|
```
|
|
362
496
|
|
|
363
497
|
### Step 4. Update Your Code
|
|
364
498
|
|
|
365
|
-
####
|
|
499
|
+
#### V1 Controller Example (Compatible)
|
|
500
|
+
|
|
501
|
+
```javascript
|
|
502
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
503
|
+
|
|
504
|
+
// Initialize V1 Controller
|
|
505
|
+
const controller = new PerplexityV1Controller();
|
|
506
|
+
const result = await controller.createChat(["Hello world"], "sonar-pro");
|
|
507
|
+
|
|
508
|
+
console.log("[V1 EXAMPLE]", result.responses[0].text);
|
|
509
|
+
console.log(`Tokens: ${result.usageMetadata.totalTokenCount}`);
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
#### V2 Controller Example (Enhanced)
|
|
366
513
|
|
|
367
514
|
```javascript
|
|
368
|
-
import {
|
|
369
|
-
|
|
370
|
-
// Initialize
|
|
371
|
-
const
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
content: "Hello world",
|
|
378
|
-
},
|
|
379
|
-
],
|
|
380
|
-
});
|
|
381
|
-
console.log("[BASIC EXAMPLE]", result.choices[0].message.content);
|
|
515
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
516
|
+
|
|
517
|
+
// Initialize V2 Controller
|
|
518
|
+
const controller = new PerplexityV2Controller();
|
|
519
|
+
const result = await controller.createChat(["Hello world"], "sonar-pro");
|
|
520
|
+
|
|
521
|
+
console.log("[V2 ENHANCED EXAMPLE]", result.choices[0].message.content);
|
|
522
|
+
console.log(`Usage: ${result.usage.total_tokens} tokens`);
|
|
523
|
+
console.log(`Processing: ${result.metadata.processingTime}ms`);
|
|
382
524
|
```
|
|
383
525
|
|
|
384
526
|
---
|
|
@@ -387,31 +529,98 @@ console.log("[BASIC EXAMPLE]", result.choices[0].message.content);
|
|
|
387
529
|
|
|
388
530
|
### Streaming Responses
|
|
389
531
|
|
|
390
|
-
####
|
|
532
|
+
#### V1 Controller Streaming
|
|
533
|
+
|
|
534
|
+
```javascript
|
|
535
|
+
import { PerplexityV1Controller } from "@revenium/perplexity";
|
|
536
|
+
|
|
537
|
+
const controller = new PerplexityV1Controller();
|
|
538
|
+
const stream = await controller.createStreaming(["Hello world"], "sonar-pro");
|
|
539
|
+
|
|
540
|
+
for await (const chunk of stream) {
|
|
541
|
+
if (chunk.text) {
|
|
542
|
+
process.stdout.write(chunk.text);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
#### V2 Controller Streaming (Enhanced)
|
|
391
548
|
|
|
392
549
|
```javascript
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
},
|
|
399
|
-
],
|
|
400
|
-
});
|
|
550
|
+
import { PerplexityV2Controller } from "@revenium/perplexity";
|
|
551
|
+
|
|
552
|
+
const controller = new PerplexityV2Controller();
|
|
553
|
+
const stream = await controller.createStreaming(["Hello world"], "sonar-pro");
|
|
554
|
+
|
|
401
555
|
for await (const chunk of stream) {
|
|
402
|
-
|
|
556
|
+
const content = chunk.choices?.[0]?.delta?.content;
|
|
557
|
+
if (content) {
|
|
558
|
+
process.stdout.write(content);
|
|
559
|
+
}
|
|
403
560
|
}
|
|
404
561
|
```
|
|
405
562
|
|
|
563
|
+
### Custom Metadata Tracking
|
|
564
|
+
|
|
565
|
+
#### V1 Metadata Example
|
|
566
|
+
|
|
567
|
+
```javascript
|
|
568
|
+
const customMetadata = {
|
|
569
|
+
traceId: "trace-12345",
|
|
570
|
+
taskType: "research-query",
|
|
571
|
+
subscriberEmail: "user@example.com",
|
|
572
|
+
organizationId: "org-789",
|
|
573
|
+
agent: "perplexity-v1-demo",
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
const result = await controller.createChat(
|
|
577
|
+
["What is AI?"],
|
|
578
|
+
"sonar-pro",
|
|
579
|
+
customMetadata
|
|
580
|
+
);
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
#### V2 Enhanced Metadata Example
|
|
584
|
+
|
|
585
|
+
```javascript
|
|
586
|
+
const customMetadata = {
|
|
587
|
+
traceId: "trace-v2-67890",
|
|
588
|
+
taskType: "enhanced-research",
|
|
589
|
+
subscriberEmail: "user@example.com",
|
|
590
|
+
organizationId: "org-789",
|
|
591
|
+
agent: "perplexity-v2-demo",
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
const result = await controller.createChat(
|
|
595
|
+
["What is AI?"],
|
|
596
|
+
"sonar-pro",
|
|
597
|
+
customMetadata
|
|
598
|
+
);
|
|
599
|
+
|
|
600
|
+
// V2 provides additional metadata
|
|
601
|
+
console.log(`Processing time: ${result.metadata.processingTime}ms`);
|
|
602
|
+
console.log(`Transaction ID: ${result.metadata.transactionId}`);
|
|
603
|
+
```
|
|
604
|
+
|
|
406
605
|
## 📊 What Gets Tracked
|
|
407
606
|
|
|
607
|
+
### V1 Controller Tracking
|
|
608
|
+
|
|
408
609
|
- **Token Usage**: Input and output tokens for accurate billing
|
|
409
610
|
- **Request Duration**: Total time for each API call
|
|
410
611
|
- **Model Information**: Which model was used
|
|
411
612
|
- **Operation Type**: Chat completion, streaming
|
|
412
613
|
- **Error Tracking**: Failed requests and error details
|
|
413
|
-
- **Streaming Metrics**: Time to first token for streaming responses
|
|
414
614
|
- **Custom Metadata**: Rich business context and user tracking
|
|
615
|
+
- **Transaction ID**: Unique identifier for each request
|
|
616
|
+
|
|
617
|
+
### V2 Enhanced Tracking (Additional)
|
|
618
|
+
|
|
619
|
+
- **Processing Time**: Enhanced timing metrics
|
|
620
|
+
- **Enhanced Metadata**: Additional context following OpenAI Responses API
|
|
621
|
+
- **Response Format**: OpenAI-compatible response structure
|
|
622
|
+
- **Model Performance**: Enhanced model capability tracking
|
|
623
|
+
- **Streaming Metrics**: Time to first token for streaming responses
|
|
415
624
|
|
|
416
625
|
---
|
|
417
626
|
|
|
@@ -422,6 +631,18 @@ for await (const chunk of stream) {
|
|
|
422
631
|
- **sonar-pro** (Latest and most capable)
|
|
423
632
|
- **sonar-small** (Fast and efficient)
|
|
424
633
|
- **sonar-medium** (Balanced performance)
|
|
634
|
+
- **llama-3.1-sonar-small-128k-online** (Llama-based with online search)
|
|
635
|
+
- **llama-3.1-sonar-large-128k-online** (Large Llama model with online search)
|
|
636
|
+
- **llama-3.1-sonar-huge-128k-online** (Huge Llama model with online search)
|
|
637
|
+
|
|
638
|
+
### Model Capabilities
|
|
639
|
+
|
|
640
|
+
Both V1 and V2 Controllers support:
|
|
641
|
+
|
|
642
|
+
- **Chat Completions**: All models support chat completions
|
|
643
|
+
- **Streaming**: Real-time response streaming
|
|
644
|
+
- **Online Search**: Models with "online" in the name support web search
|
|
645
|
+
- **Large Context**: 128k context window for Llama models
|
|
425
646
|
|
|
426
647
|
_Note: Model availability depends on your Perplexity AI account and API access level._
|
|
427
648
|
|
|
@@ -464,12 +685,6 @@ export REVENIUM_METERING_API_KEY="your-actual-revenium-key"
|
|
|
464
685
|
}
|
|
465
686
|
```
|
|
466
687
|
|
|
467
|
-
```json
|
|
468
|
-
{
|
|
469
|
-
"type": "commonjs"
|
|
470
|
-
}
|
|
471
|
-
```
|
|
472
|
-
|
|
473
688
|
This will show:
|
|
474
689
|
|
|
475
690
|
- Request/response details
|
|
@@ -482,16 +697,30 @@ This will show:
|
|
|
482
697
|
|
|
483
698
|
## 📚 Examples Repository
|
|
484
699
|
|
|
485
|
-
Check out our comprehensive examples:
|
|
700
|
+
Check out our comprehensive examples organized by version:
|
|
486
701
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
- **
|
|
490
|
-
- **
|
|
491
|
-
- **
|
|
492
|
-
- **
|
|
702
|
+
### V1 Controller Examples (Compatible)
|
|
703
|
+
|
|
704
|
+
- **Basic Usage**: Simple chat completions with V1 response format
|
|
705
|
+
- **Streaming**: Real-time response streaming with V1 format
|
|
706
|
+
- **Multi-turn Chat**: Conversation handling with V1 controllers
|
|
707
|
+
- **Metadata**: Rich tracking examples with V1 metadata
|
|
708
|
+
- **Model Capabilities**: Check model features and capabilities
|
|
709
|
+
|
|
710
|
+
### V2 Controller Examples (Enhanced)
|
|
711
|
+
|
|
712
|
+
- **Enhanced Basic**: Chat completions with OpenAI-compatible responses
|
|
713
|
+
- **Enhanced Streaming**: Streaming with enhanced metadata and timing
|
|
714
|
+
- **Enhanced Chat**: Multi-turn conversations with V2 enhancements
|
|
715
|
+
- **Enhanced Metadata**: Advanced tracking with processing time metrics
|
|
716
|
+
- **Model Performance**: Enhanced model capability and performance tracking
|
|
717
|
+
|
|
718
|
+
### File Organization
|
|
493
719
|
|
|
494
|
-
|
|
720
|
+
- **`/examples/v1/`**: TypeScript examples using V1 Controllers (development)
|
|
721
|
+
- **`/examples/v2/`**: TypeScript examples using V2 Controllers (development)
|
|
722
|
+
- **`/playground/v1/`**: JavaScript examples using V1 Controllers (production)
|
|
723
|
+
- **`/playground/v2/`**: JavaScript examples using V2 Controllers (production)
|
|
495
724
|
|
|
496
725
|
---
|
|
497
726
|
|