@revenium/perplexity 1.0.10 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -2
- package/README.md +448 -566
- package/examples/basic.ts +17 -0
- package/examples/chat-completions.ts +22 -0
- package/examples/enhanced.ts +20 -0
- package/examples/streaming.ts +24 -0
- package/package.json +45 -61
- package/playground/basic.js +7 -17
- package/playground/enhanced.js +9 -22
- package/playground/streaming.js +10 -26
- 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/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
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { config } from "dotenv";
|
|
2
|
-
import { OpenAI } from "openai";
|
|
3
|
-
|
|
4
|
-
// Importar el middleware para activar el tracking automático
|
|
5
|
-
import "../src/index";
|
|
6
|
-
|
|
7
|
-
config();
|
|
8
|
-
|
|
9
|
-
// Configurar el cliente de OpenAI para usar Perplexity
|
|
10
|
-
const client = new OpenAI({
|
|
11
|
-
apiKey: process.env.PERPLEXITY_API_KEY,
|
|
12
|
-
baseURL: "https://api.perplexity.ai",
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Ejemplo básico usando el middleware
|
|
17
|
-
*/
|
|
18
|
-
const basicExample = async () => {
|
|
19
|
-
console.log("\n🤖 Perplexity AI - Middleware Example");
|
|
20
|
-
console.log("=".repeat(50));
|
|
21
|
-
|
|
22
|
-
const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
23
|
-
const reveniumKey = process.env.REVENIUM_METERING_API_KEY;
|
|
24
|
-
|
|
25
|
-
if (!perplexityApiKey) {
|
|
26
|
-
console.log("❌ PERPLEXITY_API_KEY not found");
|
|
27
|
-
console.log(" Set: export PERPLEXITY_API_KEY=your-perplexity-api-key");
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (!reveniumKey) {
|
|
32
|
-
console.log(
|
|
33
|
-
"⚠️ REVENIUM_METERING_API_KEY not found - metering will be disabled"
|
|
34
|
-
);
|
|
35
|
-
console.log(" Set: export REVENIUM_METERING_API_KEY=your-revenium-key");
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
console.log(`✅ Perplexity API Key: ${perplexityApiKey.substring(0, 10)}...`);
|
|
39
|
-
if (reveniumKey) {
|
|
40
|
-
console.log(`✅ Revenium Key: ${reveniumKey.substring(0, 10)}...`);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const response = await client.chat.completions.create({
|
|
45
|
-
model: "sonar-pro",
|
|
46
|
-
messages: [
|
|
47
|
-
{
|
|
48
|
-
role: "user",
|
|
49
|
-
content: "What is the meaning of life, the universe and everything?",
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const content = response.choices[0]?.message?.content;
|
|
55
|
-
if (content) {
|
|
56
|
-
console.log(`✅ Response: ${content.substring(0, 100)}...`);
|
|
57
|
-
} else {
|
|
58
|
-
console.log("✅ Response received (no content)");
|
|
59
|
-
}
|
|
60
|
-
console.log("✅ Response received successfully");
|
|
61
|
-
console.log("📊 Token usage automatically tracked by middleware");
|
|
62
|
-
console.log("🎉 Middleware integration successful!");
|
|
63
|
-
return true;
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.log(`❌ Perplexity test failed: ${error}`);
|
|
66
|
-
console.error(error);
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Ejemplo con metadatos de uso
|
|
73
|
-
*/
|
|
74
|
-
const enhancedExample = async () => {
|
|
75
|
-
console.log("\n📊 Perplexity AI - Enhanced Tracking Example");
|
|
76
|
-
console.log("=".repeat(50));
|
|
77
|
-
|
|
78
|
-
const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
79
|
-
if (!perplexityApiKey) {
|
|
80
|
-
console.log("❌ PERPLEXITY_API_KEY not found");
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
const response = await client.chat.completions.create({
|
|
86
|
-
model: "sonar-pro",
|
|
87
|
-
messages: [
|
|
88
|
-
{
|
|
89
|
-
role: "user",
|
|
90
|
-
content: "Analyze this quarterly report for key insights",
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
// Los metadatos se pueden incluir en el body de la request
|
|
94
|
-
// El middleware los detectará automáticamente
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const content = response.choices[0]?.message?.content;
|
|
98
|
-
if (content) {
|
|
99
|
-
console.log(`✅ Enhanced response: ${content.substring(0, 100)}...`);
|
|
100
|
-
} else {
|
|
101
|
-
console.log("✅ Enhanced response received (no content)");
|
|
102
|
-
}
|
|
103
|
-
console.log("🎯 Enhanced tracking with middleware successful!");
|
|
104
|
-
return true;
|
|
105
|
-
} catch (error) {
|
|
106
|
-
console.log(`❌ Perplexity enhanced test failed: ${error}`);
|
|
107
|
-
console.error(error);
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Ejemplo con streaming
|
|
114
|
-
*/
|
|
115
|
-
const streamingExample = async () => {
|
|
116
|
-
console.log("\n🌊 Perplexity AI - Streaming Example");
|
|
117
|
-
console.log("=".repeat(50));
|
|
118
|
-
|
|
119
|
-
const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
120
|
-
if (!perplexityApiKey) {
|
|
121
|
-
console.log("❌ PERPLEXITY_API_KEY not found");
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
const stream = await client.chat.completions.create({
|
|
127
|
-
model: "sonar-pro",
|
|
128
|
-
messages: [
|
|
129
|
-
{
|
|
130
|
-
role: "user",
|
|
131
|
-
content: "Write a creative story about AI",
|
|
132
|
-
},
|
|
133
|
-
],
|
|
134
|
-
stream: true,
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
let streamedContent = "";
|
|
138
|
-
for await (const chunk of stream) {
|
|
139
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
140
|
-
if (content) {
|
|
141
|
-
streamedContent += content;
|
|
142
|
-
process.stdout.write(content);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
console.log("\n✅ Streaming completed successfully");
|
|
147
|
-
console.log("📊 Streaming usage automatically tracked by middleware");
|
|
148
|
-
return true;
|
|
149
|
-
} catch (error) {
|
|
150
|
-
console.log(`❌ Perplexity streaming test failed: ${error}`);
|
|
151
|
-
console.error(error);
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Ejemplo con diferentes modelos
|
|
158
|
-
*/
|
|
159
|
-
const differentModelExample = async () => {
|
|
160
|
-
console.log("\n🔧 Perplexity AI - Different Model Example");
|
|
161
|
-
console.log("=".repeat(50));
|
|
162
|
-
|
|
163
|
-
const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
164
|
-
if (!perplexityApiKey) {
|
|
165
|
-
console.log("❌ PERPLEXITY_API_KEY not found");
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
const response = await client.chat.completions.create({
|
|
171
|
-
model: "sonar-pro",
|
|
172
|
-
messages: [
|
|
173
|
-
{
|
|
174
|
-
role: "user",
|
|
175
|
-
content: "Explain quantum computing in simple terms",
|
|
176
|
-
},
|
|
177
|
-
],
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
const content = response.choices[0]?.message?.content;
|
|
181
|
-
if (content) {
|
|
182
|
-
console.log(`✅ Llama response: ${content.substring(0, 100)}...`);
|
|
183
|
-
} else {
|
|
184
|
-
console.log("✅ Llama response received (no content)");
|
|
185
|
-
}
|
|
186
|
-
console.log("✅ Different model test successful!");
|
|
187
|
-
return true;
|
|
188
|
-
} catch (error) {
|
|
189
|
-
console.log(`❌ Perplexity different model test failed: ${error}`);
|
|
190
|
-
console.error(error);
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Función principal que ejecuta todos los ejemplos
|
|
197
|
-
*/
|
|
198
|
-
const main = async (): Promise<void> => {
|
|
199
|
-
console.log("🚀 Starting Revenium Perplexity AI Middleware Examples");
|
|
200
|
-
console.log("=".repeat(60));
|
|
201
|
-
|
|
202
|
-
let successCount = 0;
|
|
203
|
-
const totalTests: number = 4;
|
|
204
|
-
|
|
205
|
-
// Ejecutar ejemplos de Perplexity AI
|
|
206
|
-
if (await basicExample()) successCount++;
|
|
207
|
-
if (await enhancedExample()) successCount++;
|
|
208
|
-
if (await streamingExample()) successCount++;
|
|
209
|
-
if (await differentModelExample()) successCount++;
|
|
210
|
-
|
|
211
|
-
console.log("\n" + "=".repeat(60));
|
|
212
|
-
console.log(`📊 Test Results: ${successCount}/${totalTests} tests passed`);
|
|
213
|
-
|
|
214
|
-
if (successCount === totalTests) {
|
|
215
|
-
console.log("🎉 All tests passed! Middleware is working correctly.");
|
|
216
|
-
} else {
|
|
217
|
-
console.log("⚠️ Some tests failed. Check the logs above for details.");
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
// Ejecutar el ejemplo
|
|
222
|
-
main().catch(console.error);
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { config } from "dotenv";
|
|
2
|
-
import { createPerplexityClient } from "../src/perplexity-ai";
|
|
3
|
-
|
|
4
|
-
config();
|
|
5
|
-
|
|
6
|
-
async function runAllExamples() {
|
|
7
|
-
console.log("🚀 Running All Perplexity AI Middleware Examples");
|
|
8
|
-
console.log("=".repeat(60));
|
|
9
|
-
|
|
10
|
-
const examples = [
|
|
11
|
-
{
|
|
12
|
-
name: "Basic Client Example",
|
|
13
|
-
run: async () => {
|
|
14
|
-
const client = createPerplexityClient();
|
|
15
|
-
const response = await client.createChatCompletion({
|
|
16
|
-
model: "sonar-pro",
|
|
17
|
-
messages: [
|
|
18
|
-
{
|
|
19
|
-
role: "user",
|
|
20
|
-
content: "Say hello in one sentence",
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
});
|
|
24
|
-
return response.choices[0]?.message?.content || "";
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: "Streaming Example",
|
|
29
|
-
run: async () => {
|
|
30
|
-
const client = createPerplexityClient();
|
|
31
|
-
const stream = await client.createStreamingChatCompletion({
|
|
32
|
-
model: "sonar-pro",
|
|
33
|
-
messages: [
|
|
34
|
-
{
|
|
35
|
-
role: "user",
|
|
36
|
-
content: "Write a very short story",
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
let content = "";
|
|
42
|
-
for await (const chunk of stream) {
|
|
43
|
-
const chunkContent = chunk.choices[0]?.delta?.content;
|
|
44
|
-
if (chunkContent) {
|
|
45
|
-
content += chunkContent;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return content;
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: "Multiple Models Example",
|
|
53
|
-
run: async () => {
|
|
54
|
-
const client = createPerplexityClient();
|
|
55
|
-
const response = await client.createChatCompletion({
|
|
56
|
-
model: "sonar-pro",
|
|
57
|
-
messages: [
|
|
58
|
-
{
|
|
59
|
-
role: "user",
|
|
60
|
-
content: "What is AI?",
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
});
|
|
64
|
-
return response.choices[0]?.message?.content || "";
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: "Metadata Example",
|
|
69
|
-
run: async () => {
|
|
70
|
-
const client = createPerplexityClient();
|
|
71
|
-
const response = await client.createChatCompletion({
|
|
72
|
-
model: "sonar-pro",
|
|
73
|
-
messages: [
|
|
74
|
-
{
|
|
75
|
-
role: "user",
|
|
76
|
-
content: "What is the weather like?",
|
|
77
|
-
},
|
|
78
|
-
],
|
|
79
|
-
usageMetadata: {
|
|
80
|
-
traceId: "test-123",
|
|
81
|
-
taskType: "weather-query",
|
|
82
|
-
organizationId: "test-org",
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
return response.choices[0]?.message?.content || "";
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
];
|
|
89
|
-
|
|
90
|
-
let successCount = 0;
|
|
91
|
-
const totalExamples = examples.length;
|
|
92
|
-
|
|
93
|
-
for (const example of examples) {
|
|
94
|
-
console.log(`\n🤖 Running: ${example.name}`);
|
|
95
|
-
console.log("-".repeat(40));
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
const result = await example.run();
|
|
99
|
-
console.log("✅ Success!");
|
|
100
|
-
console.log("📝 Response:", result.substring(0, 100) + "...");
|
|
101
|
-
successCount++;
|
|
102
|
-
} catch (error) {
|
|
103
|
-
console.log("❌ Failed:", error);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
console.log("\n" + "=".repeat(60));
|
|
108
|
-
console.log(`📊 Results: ${successCount}/${totalExamples} examples passed`);
|
|
109
|
-
|
|
110
|
-
if (successCount === totalExamples) {
|
|
111
|
-
console.log("🎉 All examples completed successfully!");
|
|
112
|
-
console.log("✅ Middleware is working correctly");
|
|
113
|
-
} else {
|
|
114
|
-
console.log("⚠️ Some examples failed. Check the logs above.");
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
runAllExamples().catch(console.error);
|
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);
|