@revenium/perplexity 1.0.9 → 1.0.11
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/.env.example +2 -2
- package/README.md +0 -0
- package/examples/basic.ts +17 -0
- package/examples/chat-completions.ts +23 -0
- package/examples/enhanced.ts +21 -0
- package/examples/streaming.ts +25 -0
- package/package.json +45 -61
- package/playground/basic.js +7 -16
- package/playground/enhanced.js +9 -21
- package/playground/streaming.js +10 -25
- package/src/index.ts +1 -35
- package/src/interfaces/chatCompletionRequest.ts +9 -0
- package/src/interfaces/credential.ts +4 -0
- package/src/interfaces/meteringRequest.ts +14 -0
- package/src/{types/metering.ts → interfaces/meteringResponse.ts} +3 -3
- package/src/interfaces/operation.ts +4 -0
- package/src/{types → interfaces}/subscriber.ts +1 -1
- package/src/interfaces/tokenCounts.ts +7 -0
- package/src/{types → interfaces}/usageMetadata.ts +1 -1
- package/src/middleware.ts +151 -0
- package/src/models/Logger.ts +5 -5
- package/src/models/Metering.ts +86 -0
- package/src/utils/calculateDurationMs.ts +1 -1
- package/src/utils/constants/constants.ts +9 -16
- package/src/utils/constants/logLevels.ts +1 -0
- package/src/utils/constants/messages.ts +8 -32
- package/src/utils/constants/models.ts +20 -0
- package/src/utils/extractTokenCount.ts +26 -0
- package/src/utils/generateTransactionId.ts +1 -1
- package/src/utils/index.ts +39 -12
- package/src/utils/loadEnv.ts +8 -0
- package/src/utils/safeExtract.ts +60 -11
- package/tsconfig.json +10 -18
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -40
- package/dist/index.js.map +0 -1
- package/dist/models/Exception/ApiResponseError.d.ts +0 -6
- package/dist/models/Exception/ApiResponseError.d.ts.map +0 -1
- package/dist/models/Exception/ApiResponseError.js +0 -13
- package/dist/models/Exception/ApiResponseError.js.map +0 -1
- package/dist/models/Exception/ConfigurationError.d.ts +0 -4
- package/dist/models/Exception/ConfigurationError.d.ts.map +0 -1
- package/dist/models/Exception/ConfigurationError.js +0 -11
- package/dist/models/Exception/ConfigurationError.js.map +0 -1
- package/dist/models/Exception/MeteringError.d.ts +0 -5
- package/dist/models/Exception/MeteringError.d.ts.map +0 -1
- package/dist/models/Exception/MeteringError.js +0 -12
- package/dist/models/Exception/MeteringError.js.map +0 -1
- package/dist/models/Exception/MiddlewareActivationError.d.ts +0 -4
- package/dist/models/Exception/MiddlewareActivationError.d.ts.map +0 -1
- package/dist/models/Exception/MiddlewareActivationError.js +0 -11
- package/dist/models/Exception/MiddlewareActivationError.js.map +0 -1
- package/dist/models/Exception/StreamTrackingError.d.ts +0 -4
- package/dist/models/Exception/StreamTrackingError.d.ts.map +0 -1
- package/dist/models/Exception/StreamTrackingError.js +0 -11
- package/dist/models/Exception/StreamTrackingError.js.map +0 -1
- package/dist/models/Exception/TokenCountingError.d.ts +0 -4
- package/dist/models/Exception/TokenCountingError.d.ts.map +0 -1
- package/dist/models/Exception/TokenCountingError.js +0 -11
- package/dist/models/Exception/TokenCountingError.js.map +0 -1
- package/dist/models/Exception/index.d.ts +0 -7
- package/dist/models/Exception/index.d.ts.map +0 -1
- package/dist/models/Exception/index.js +0 -23
- package/dist/models/Exception/index.js.map +0 -1
- package/dist/models/Logger.d.ts +0 -10
- package/dist/models/Logger.d.ts.map +0 -1
- package/dist/models/Logger.js +0 -36
- package/dist/models/Logger.js.map +0 -1
- package/dist/models/index.d.ts +0 -3
- package/dist/models/index.d.ts.map +0 -1
- package/dist/models/index.js +0 -19
- package/dist/models/index.js.map +0 -1
- package/dist/perplexity-ai/client.d.ts +0 -31
- package/dist/perplexity-ai/client.d.ts.map +0 -1
- package/dist/perplexity-ai/client.js +0 -75
- package/dist/perplexity-ai/client.js.map +0 -1
- package/dist/perplexity-ai/index.d.ts +0 -3
- package/dist/perplexity-ai/index.d.ts.map +0 -1
- package/dist/perplexity-ai/index.js +0 -19
- package/dist/perplexity-ai/index.js.map +0 -1
- package/dist/perplexity-ai/middleware.d.ts +0 -2
- package/dist/perplexity-ai/middleware.d.ts.map +0 -1
- package/dist/perplexity-ai/middleware.js +0 -195
- package/dist/perplexity-ai/middleware.js.map +0 -1
- package/dist/types/context.d.ts +0 -9
- package/dist/types/context.d.ts.map +0 -1
- package/dist/types/context.js +0 -3
- package/dist/types/context.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -28
- package/dist/types/index.js.map +0 -1
- package/dist/types/metering.d.ts +0 -28
- package/dist/types/metering.d.ts.map +0 -1
- package/dist/types/metering.js +0 -3
- package/dist/types/metering.js.map +0 -1
- package/dist/types/modelInfo.d.ts +0 -6
- package/dist/types/modelInfo.d.ts.map +0 -1
- package/dist/types/modelInfo.js +0 -3
- package/dist/types/modelInfo.js.map +0 -1
- package/dist/types/operation.d.ts +0 -5
- package/dist/types/operation.d.ts.map +0 -1
- package/dist/types/operation.js +0 -9
- package/dist/types/operation.js.map +0 -1
- package/dist/types/perplexityConfig.d.ts +0 -5
- package/dist/types/perplexityConfig.d.ts.map +0 -1
- package/dist/types/perplexityConfig.js +0 -3
- package/dist/types/perplexityConfig.js.map +0 -1
- package/dist/types/provider.d.ts +0 -4
- package/dist/types/provider.d.ts.map +0 -1
- package/dist/types/provider.js +0 -8
- package/dist/types/provider.js.map +0 -1
- package/dist/types/reveniumConfig.d.ts +0 -6
- package/dist/types/reveniumConfig.d.ts.map +0 -1
- package/dist/types/reveniumConfig.js +0 -3
- package/dist/types/reveniumConfig.js.map +0 -1
- package/dist/types/streamTracker.d.ts +0 -9
- package/dist/types/streamTracker.d.ts.map +0 -1
- package/dist/types/streamTracker.js +0 -3
- package/dist/types/streamTracker.js.map +0 -1
- package/dist/types/subscriber.d.ts +0 -9
- package/dist/types/subscriber.d.ts.map +0 -1
- package/dist/types/subscriber.js +0 -3
- package/dist/types/subscriber.js.map +0 -1
- package/dist/types/tokenCounts.d.ts +0 -6
- package/dist/types/tokenCounts.d.ts.map +0 -1
- package/dist/types/tokenCounts.js +0 -3
- package/dist/types/tokenCounts.js.map +0 -1
- package/dist/types/usageData.d.ts +0 -16
- package/dist/types/usageData.d.ts.map +0 -1
- package/dist/types/usageData.js +0 -3
- package/dist/types/usageData.js.map +0 -1
- package/dist/types/usageMetadata.d.ts +0 -14
- package/dist/types/usageMetadata.d.ts.map +0 -1
- package/dist/types/usageMetadata.js +0 -3
- package/dist/types/usageMetadata.js.map +0 -1
- package/dist/utils/activeMiddleware.d.ts +0 -2
- package/dist/utils/activeMiddleware.d.ts.map +0 -1
- package/dist/utils/activeMiddleware.js +0 -24
- package/dist/utils/activeMiddleware.js.map +0 -1
- package/dist/utils/askConsole.d.ts +0 -2
- package/dist/utils/askConsole.d.ts.map +0 -1
- package/dist/utils/askConsole.js +0 -20
- package/dist/utils/askConsole.js.map +0 -1
- package/dist/utils/calculateDurationMs.d.ts +0 -2
- package/dist/utils/calculateDurationMs.d.ts.map +0 -1
- package/dist/utils/calculateDurationMs.js +0 -7
- package/dist/utils/calculateDurationMs.js.map +0 -1
- package/dist/utils/constants/constants.d.ts +0 -9
- package/dist/utils/constants/constants.d.ts.map +0 -1
- package/dist/utils/constants/constants.js +0 -19
- package/dist/utils/constants/constants.js.map +0 -1
- package/dist/utils/constants/messages.d.ts +0 -19
- package/dist/utils/constants/messages.d.ts.map +0 -1
- package/dist/utils/constants/messages.js +0 -22
- package/dist/utils/constants/messages.js.map +0 -1
- package/dist/utils/createMeteringRequest.d.ts +0 -3
- package/dist/utils/createMeteringRequest.d.ts.map +0 -1
- package/dist/utils/createMeteringRequest.js +0 -10
- package/dist/utils/createMeteringRequest.js.map +0 -1
- package/dist/utils/createPerplexityMetadata.d.ts +0 -3
- package/dist/utils/createPerplexityMetadata.d.ts.map +0 -1
- package/dist/utils/createPerplexityMetadata.js +0 -12
- package/dist/utils/createPerplexityMetadata.js.map +0 -1
- package/dist/utils/extractModelName.d.ts +0 -2
- package/dist/utils/extractModelName.d.ts.map +0 -1
- package/dist/utils/extractModelName.js +0 -15
- package/dist/utils/extractModelName.js.map +0 -1
- package/dist/utils/extractPerplexityTokenCounts.d.ts +0 -3
- package/dist/utils/extractPerplexityTokenCounts.d.ts.map +0 -1
- package/dist/utils/extractPerplexityTokenCounts.js +0 -17
- package/dist/utils/extractPerplexityTokenCounts.js.map +0 -1
- package/dist/utils/extractStopReason.d.ts +0 -2
- package/dist/utils/extractStopReason.d.ts.map +0 -1
- package/dist/utils/extractStopReason.js +0 -14
- package/dist/utils/extractStopReason.js.map +0 -1
- package/dist/utils/extractUsageMetadata.d.ts +0 -3
- package/dist/utils/extractUsageMetadata.d.ts.map +0 -1
- package/dist/utils/extractUsageMetadata.js +0 -15
- package/dist/utils/extractUsageMetadata.js.map +0 -1
- package/dist/utils/formatTimestamp.d.ts +0 -2
- package/dist/utils/formatTimestamp.d.ts.map +0 -1
- package/dist/utils/formatTimestamp.js +0 -7
- package/dist/utils/formatTimestamp.js.map +0 -1
- package/dist/utils/generateTransactionId.d.ts +0 -2
- package/dist/utils/generateTransactionId.d.ts.map +0 -1
- package/dist/utils/generateTransactionId.js +0 -8
- package/dist/utils/generateTransactionId.js.map +0 -1
- package/dist/utils/getEnv.d.ts +0 -4
- package/dist/utils/getEnv.d.ts.map +0 -1
- package/dist/utils/getEnv.js +0 -16
- package/dist/utils/getEnv.js.map +0 -1
- package/dist/utils/index.d.ts +0 -13
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -29
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/safeExtract.d.ts +0 -2
- package/dist/utils/safeExtract.d.ts.map +0 -1
- package/dist/utils/safeExtract.js +0 -22
- package/dist/utils/safeExtract.js.map +0 -1
- package/dist/utils/sendMeteringData.d.ts +0 -3
- package/dist/utils/sendMeteringData.d.ts.map +0 -1
- package/dist/utils/sendMeteringData.js +0 -35
- package/dist/utils/sendMeteringData.js.map +0 -1
- package/dist/utils/verifyLogVerbose.d.ts +0 -2
- package/dist/utils/verifyLogVerbose.d.ts.map +0 -1
- package/dist/utils/verifyLogVerbose.js +0 -10
- package/dist/utils/verifyLogVerbose.js.map +0 -1
- package/examples/README.md +0 -316
- package/examples/basic-client-example.ts +0 -36
- package/examples/metadata-example.ts +0 -97
- package/examples/multiple-models-example.ts +0 -65
- package/examples/openai-client-example.ts +0 -76
- package/examples/perplexity_basic_example.ts +0 -24
- package/examples/perplexity_middleware_example.ts +0 -222
- package/examples/run-all-examples.ts +0 -118
- package/examples/simple-test.ts +0 -278
- package/examples/streaming-example.ts +0 -46
- package/playground/custom-config.js +0 -82
- package/playground/metadata.js +0 -94
- package/playground/multiple-models.js +0 -62
- package/playground/openai-client.js +0 -73
- package/src/models/Exception/ApiResponseError.ts +0 -6
- package/src/models/Exception/ConfigurationError.ts +0 -6
- package/src/models/Exception/MeteringError.ts +0 -6
- package/src/models/Exception/MiddlewareActivationError.ts +0 -6
- package/src/models/Exception/StreamTrackingError.ts +0 -6
- package/src/models/Exception/TokenCountingError.ts +0 -6
- package/src/models/Exception/index.ts +0 -6
- package/src/models/index.ts +0 -2
- package/src/perplexity-ai/client.ts +0 -100
- package/src/perplexity-ai/index.ts +0 -2
- package/src/perplexity-ai/middleware.ts +0 -297
- package/src/types/context.ts +0 -9
- package/src/types/index.ts +0 -11
- package/src/types/modelInfo.ts +0 -5
- package/src/types/operation.ts +0 -4
- package/src/types/perplexityConfig.ts +0 -4
- package/src/types/provider.ts +0 -3
- package/src/types/reveniumConfig.ts +0 -5
- package/src/types/streamTracker.ts +0 -9
- package/src/types/tokenCounts.ts +0 -5
- package/src/types/usageData.ts +0 -16
- package/src/utils/activeMiddleware.ts +0 -34
- package/src/utils/askConsole.ts +0 -15
- package/src/utils/createMeteringRequest.ts +0 -16
- package/src/utils/createPerplexityMetadata.ts +0 -11
- package/src/utils/extractModelName.ts +0 -14
- package/src/utils/extractPerplexityTokenCounts.ts +0 -16
- package/src/utils/extractStopReason.ts +0 -13
- package/src/utils/extractUsageMetadata.ts +0 -15
- package/src/utils/getEnv.ts +0 -16
- package/src/utils/sendMeteringData.ts +0 -46
- package/src/utils/verifyLogVerbose.ts +0 -7
- /package/src/utils/{formatTimestamp.ts → formatTimeStamp.ts} +0 -0
package/examples/simple-test.ts
DELETED
|
@@ -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);
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { createPerplexityClient } from "@revenium/perplexity";
|
|
2
|
-
|
|
3
|
-
async function customConfigExample() {
|
|
4
|
-
console.log("\n⚙️ Perplexity AI - Custom Configuration Example");
|
|
5
|
-
console.log("=".repeat(50));
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
// Example 1: Using environment variables (default)
|
|
9
|
-
console.log("\n1️⃣ Using environment variables:");
|
|
10
|
-
const defaultClient = createPerplexityClient();
|
|
11
|
-
|
|
12
|
-
const response1 = await defaultClient.createChatCompletion({
|
|
13
|
-
model: "sonar-pro",
|
|
14
|
-
messages: [
|
|
15
|
-
{
|
|
16
|
-
role: "user",
|
|
17
|
-
content: "Hello from default configuration!",
|
|
18
|
-
},
|
|
19
|
-
],
|
|
20
|
-
});
|
|
21
|
-
console.log("✅ Default config response:", response1.choices[0]?.message?.content?.substring(0, 50) + "...");
|
|
22
|
-
|
|
23
|
-
// Example 2: Custom API key only
|
|
24
|
-
console.log("\n2️⃣ Using custom API key:");
|
|
25
|
-
const customKeyClient = createPerplexityClient(process.env.PERPLEXITY_API_KEY);
|
|
26
|
-
|
|
27
|
-
const response2 = await customKeyClient.createChatCompletion({
|
|
28
|
-
model: "sonar-pro",
|
|
29
|
-
messages: [
|
|
30
|
-
{
|
|
31
|
-
role: "user",
|
|
32
|
-
content: "Hello from custom API key configuration!",
|
|
33
|
-
},
|
|
34
|
-
],
|
|
35
|
-
});
|
|
36
|
-
console.log("✅ Custom key response:", response2.choices[0]?.message?.content?.substring(0, 50) + "...");
|
|
37
|
-
|
|
38
|
-
// Example 3: Custom API key and base URL
|
|
39
|
-
console.log("\n3️⃣ Using custom API key and base URL:");
|
|
40
|
-
const fullCustomClient = createPerplexityClient(
|
|
41
|
-
process.env.PERPLEXITY_API_KEY,
|
|
42
|
-
"https://api.perplexity.ai"
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
const response3 = await fullCustomClient.createChatCompletion({
|
|
46
|
-
model: "sonar-pro",
|
|
47
|
-
messages: [
|
|
48
|
-
{
|
|
49
|
-
role: "user",
|
|
50
|
-
content: "Hello from fully custom configuration!",
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
});
|
|
54
|
-
console.log("✅ Full custom response:", response3.choices[0]?.message?.content?.substring(0, 50) + "...");
|
|
55
|
-
|
|
56
|
-
// Example 4: Custom base URL only (API key from env)
|
|
57
|
-
console.log("\n4️⃣ Using custom base URL only:");
|
|
58
|
-
const customUrlClient = createPerplexityClient(
|
|
59
|
-
undefined,
|
|
60
|
-
"https://api.perplexity.ai"
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
const response4 = await customUrlClient.createChatCompletion({
|
|
64
|
-
model: "sonar-pro",
|
|
65
|
-
messages: [
|
|
66
|
-
{
|
|
67
|
-
role: "user",
|
|
68
|
-
content: "Hello from custom URL configuration!",
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
});
|
|
72
|
-
console.log("✅ Custom URL response:", response4.choices[0]?.message?.content?.substring(0, 50) + "...");
|
|
73
|
-
|
|
74
|
-
console.log("\n🎉 All configuration examples completed successfully!");
|
|
75
|
-
console.log("📊 All requests tracked by middleware regardless of configuration");
|
|
76
|
-
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.error("❌ Error:", error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
customConfigExample();
|
package/playground/metadata.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { createPerplexityClient } from "@revenium/perplexity";
|
|
2
|
-
|
|
3
|
-
async function metadataExample() {
|
|
4
|
-
console.log("\n📊 Perplexity AI - Metadata Tracking Example");
|
|
5
|
-
console.log("=".repeat(50));
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
// Create client instance
|
|
9
|
-
const client = createPerplexityClient();
|
|
10
|
-
|
|
11
|
-
// Example 1: Basic metadata
|
|
12
|
-
console.log("\n1️⃣ Basic metadata tracking:");
|
|
13
|
-
const basicResponse = await client.createChatCompletion({
|
|
14
|
-
model: "sonar-pro",
|
|
15
|
-
messages: [
|
|
16
|
-
{
|
|
17
|
-
role: "user",
|
|
18
|
-
content: "Analyze this quarterly report for key insights",
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
usageMetadata: {
|
|
22
|
-
traceId: "conv-28a7e9d4",
|
|
23
|
-
taskType: "document-analysis",
|
|
24
|
-
subscriberEmail: "user@example.com",
|
|
25
|
-
organizationId: "acme-corp",
|
|
26
|
-
subscriptionId: "premium-plan",
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
console.log(
|
|
31
|
-
"✅ Response:",
|
|
32
|
-
basicResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
// Example 2: Advanced metadata
|
|
36
|
-
console.log("\n2️⃣ Advanced metadata tracking:");
|
|
37
|
-
const advancedResponse = await client.createChatCompletion({
|
|
38
|
-
model: "sonar-pro",
|
|
39
|
-
messages: [
|
|
40
|
-
{
|
|
41
|
-
role: "user",
|
|
42
|
-
content: "What are the latest developments in AI?",
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
usageMetadata: {
|
|
46
|
-
traceId: "conv-advanced-123",
|
|
47
|
-
taskType: "research",
|
|
48
|
-
subscriberId: "user-12345",
|
|
49
|
-
subscriberCredentialName: "api-key-1",
|
|
50
|
-
productId: "business-intelligence",
|
|
51
|
-
agent: "research-assistant-v2",
|
|
52
|
-
responseQualityScore: 0.95,
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
console.log(
|
|
57
|
-
"✅ Response:",
|
|
58
|
-
advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
// Example 3: Streaming with metadata
|
|
62
|
-
console.log("\n3️⃣ Streaming with metadata:");
|
|
63
|
-
const stream = await client.createStreamingChatCompletion({
|
|
64
|
-
model: "sonar-pro",
|
|
65
|
-
messages: [
|
|
66
|
-
{
|
|
67
|
-
role: "user",
|
|
68
|
-
content: "Write a creative story about AI",
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
usageMetadata: {
|
|
72
|
-
traceId: "conv-streaming-456",
|
|
73
|
-
taskType: "creative-writing",
|
|
74
|
-
organizationId: "creative-studio",
|
|
75
|
-
agent: "story-generator",
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
console.log("📝 Streaming response with metadata:");
|
|
80
|
-
for await (const chunk of stream) {
|
|
81
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
82
|
-
if (content) {
|
|
83
|
-
process.stdout.write(content);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
console.log("\n\n🎉 All metadata examples completed successfully!");
|
|
88
|
-
console.log("📊 All usage tracked with custom metadata");
|
|
89
|
-
} catch (error) {
|
|
90
|
-
console.error("❌ Error:", error);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
metadataExample();
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { createPerplexityClient } from "@revenium/perplexity";
|
|
2
|
-
|
|
3
|
-
async function multipleModelsExample() {
|
|
4
|
-
console.log("\n🔧 Perplexity AI - Multiple Models Example");
|
|
5
|
-
console.log("=".repeat(50));
|
|
6
|
-
|
|
7
|
-
try {
|
|
8
|
-
// Create client instance
|
|
9
|
-
const client = createPerplexityClient();
|
|
10
|
-
|
|
11
|
-
// Test different prompts with the same model
|
|
12
|
-
const testCases = [
|
|
13
|
-
{
|
|
14
|
-
name: "sonar-pro (Quantum Computing)",
|
|
15
|
-
description: "Latest and most capable model",
|
|
16
|
-
prompt: "Explain quantum computing in simple terms",
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
name: "sonar-pro (AI Developments)",
|
|
20
|
-
description: "Latest and most capable model",
|
|
21
|
-
prompt: "What are the latest developments in AI?",
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: "sonar-pro (Weather)",
|
|
25
|
-
description: "Latest and most capable model",
|
|
26
|
-
prompt: "What is the weather like today?",
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
for (const testCase of testCases) {
|
|
31
|
-
console.log(`\n🤖 Testing: ${testCase.name}`);
|
|
32
|
-
console.log(`📝 Description: ${testCase.description}`);
|
|
33
|
-
console.log("-".repeat(40));
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const response = await client.createChatCompletion({
|
|
37
|
-
model: "sonar-pro",
|
|
38
|
-
messages: [
|
|
39
|
-
{
|
|
40
|
-
role: "user",
|
|
41
|
-
content: testCase.prompt,
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
console.log("✅ Response:");
|
|
47
|
-
console.log(response.choices[0]?.message?.content?.substring(0, 200) + "...");
|
|
48
|
-
console.log("📊 Usage tracked by middleware");
|
|
49
|
-
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.log(`❌ Error with ${testCase.name}:`, error);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
console.log("\n🎉 Multiple models example completed!");
|
|
56
|
-
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error("❌ Error:", error);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
multipleModelsExample();
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { OpenAI } from "openai";
|
|
2
|
-
|
|
3
|
-
// Import middleware to activate automatic tracking
|
|
4
|
-
import "@revenium/perplexity";
|
|
5
|
-
|
|
6
|
-
async function openaiClientExample() {
|
|
7
|
-
console.log("\n🤖 Perplexity AI - OpenAI Client Example");
|
|
8
|
-
console.log("=".repeat(50));
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
// Create OpenAI client configured for Perplexity (like in basic example)
|
|
12
|
-
const client = new OpenAI({
|
|
13
|
-
apiKey: process.env.PERPLEXITY_API_KEY,
|
|
14
|
-
baseURL: "https://api.perplexity.ai",
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
console.log("✅ OpenAI client configured for Perplexity AI");
|
|
18
|
-
console.log("📊 Middleware automatically tracking all requests");
|
|
19
|
-
|
|
20
|
-
// Test different types of requests
|
|
21
|
-
console.log("\n1️⃣ Basic chat completion:");
|
|
22
|
-
const basicResponse = await client.chat.completions.create({
|
|
23
|
-
model: "sonar-pro",
|
|
24
|
-
messages: [
|
|
25
|
-
{
|
|
26
|
-
role: "user",
|
|
27
|
-
content: "What is the meaning of life, the universe and everything?",
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
console.log("✅ Response:", basicResponse.choices[0]?.message?.content?.substring(0, 100) + "...");
|
|
32
|
-
|
|
33
|
-
console.log("\n2️⃣ Streaming chat completion:");
|
|
34
|
-
const stream = await client.chat.completions.create({
|
|
35
|
-
model: "sonar-pro",
|
|
36
|
-
messages: [
|
|
37
|
-
{
|
|
38
|
-
role: "user",
|
|
39
|
-
content: "Write a short poem about AI",
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
stream: true,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
console.log("📝 Streaming response:");
|
|
46
|
-
for await (const chunk of stream) {
|
|
47
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
48
|
-
if (content) {
|
|
49
|
-
process.stdout.write(content);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
console.log("\n\n3️⃣ Different prompt:");
|
|
54
|
-
const differentResponse = await client.chat.completions.create({
|
|
55
|
-
model: "sonar-pro",
|
|
56
|
-
messages: [
|
|
57
|
-
{
|
|
58
|
-
role: "user",
|
|
59
|
-
content: "Explain machine learning in one sentence",
|
|
60
|
-
},
|
|
61
|
-
],
|
|
62
|
-
});
|
|
63
|
-
console.log("✅ Response:", differentResponse.choices[0]?.message?.content);
|
|
64
|
-
|
|
65
|
-
console.log("\n🎉 All examples completed successfully!");
|
|
66
|
-
console.log("📊 All usage automatically tracked by middleware");
|
|
67
|
-
|
|
68
|
-
} catch (error) {
|
|
69
|
-
console.error("❌ Error:", error);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
openaiClientExample();
|
package/src/models/index.ts
DELETED