@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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "../src";
|
|
2
|
+
|
|
3
|
+
async function basicRequest() {
|
|
4
|
+
console.log("=".repeat(50));
|
|
5
|
+
try {
|
|
6
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
7
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
8
|
+
const result = await model.createChatCompletion({
|
|
9
|
+
model: "sonar-pro",
|
|
10
|
+
messages: [{ role: "user", content: "What is the capital of France?" }],
|
|
11
|
+
});
|
|
12
|
+
console.log("[BASIC REQUEST]", result.choices[0].message);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.log(error);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
basicRequest();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "../src";
|
|
2
|
+
|
|
3
|
+
const chatCompletionsExample = async () => {
|
|
4
|
+
console.log("=".repeat(50));
|
|
5
|
+
try {
|
|
6
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
7
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
8
|
+
const result = await model.createChatCompletion({
|
|
9
|
+
messages: [
|
|
10
|
+
{
|
|
11
|
+
role: "user",
|
|
12
|
+
content: "Hello world",
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
});
|
|
16
|
+
console.log(result.choices[0].message.content);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.log(error);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
chatCompletionsExample();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "../src";
|
|
2
|
+
|
|
3
|
+
async function enhancedRequest() {
|
|
4
|
+
console.log("=".repeat(50));
|
|
5
|
+
try {
|
|
6
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
7
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
8
|
+
const result = await model.createChatCompletion({
|
|
9
|
+
messages: [
|
|
10
|
+
{ role: "user", content: "Explain quantum computing in simple terms" },
|
|
11
|
+
],
|
|
12
|
+
max_tokens: 100,
|
|
13
|
+
temperature: 0.7,
|
|
14
|
+
});
|
|
15
|
+
console.log("[ENHANCED REQUEST]", result.choices[0].message.content);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.log(error);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
enhancedRequest();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "../src";
|
|
2
|
+
|
|
3
|
+
const chatCompletionStreamingExample = async () => {
|
|
4
|
+
console.log("=".repeat(50));
|
|
5
|
+
try {
|
|
6
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
7
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
8
|
+
const result = await model.createChatCompletionStream({
|
|
9
|
+
messages: [
|
|
10
|
+
{
|
|
11
|
+
role: "user",
|
|
12
|
+
content: "Hello world",
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
});
|
|
16
|
+
for await (const chunk of result) {
|
|
17
|
+
process.stdout.write(chunk.choices[0]?.delta?.content || "");
|
|
18
|
+
}
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.log(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
chatCompletionStreamingExample();
|
package/package.json
CHANGED
|
@@ -1,61 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@revenium/perplexity",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "NodeJS middleware for perplexity's AI API",
|
|
5
|
-
"homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
|
|
6
|
-
"bugs": {
|
|
7
|
-
"url": "https://github.com/revenium/revenium-middleware-perplexity-node/issues"
|
|
8
|
-
},
|
|
9
|
-
"repository": {
|
|
10
|
-
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/revenium/revenium-middleware-perplexity-node.git"
|
|
12
|
-
},
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"metering",
|
|
47
|
-
"monitoring",
|
|
48
|
-
"typescript"
|
|
49
|
-
],
|
|
50
|
-
"dependencies": {
|
|
51
|
-
"axios": "^1.11.0",
|
|
52
|
-
"dotenv": "^17.2.1",
|
|
53
|
-
"openai": "^5.15.0",
|
|
54
|
-
"uuid": "^11.1.0"
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@types/node": "^24.3.0",
|
|
58
|
-
"rimraf": "^6.0.1",
|
|
59
|
-
"typescript": "^5.9.2"
|
|
60
|
-
}
|
|
61
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@revenium/perplexity",
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "NodeJS middleware for perplexity's AI API",
|
|
5
|
+
"homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/revenium/revenium-middleware-perplexity-node/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/revenium/revenium-middleware-perplexity-node.git"
|
|
12
|
+
},
|
|
13
|
+
"main": "index.js",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"p-basic": "npx ts-node playground/basic.js",
|
|
17
|
+
"p-streaming": "npx ts-node playground/streaming.js",
|
|
18
|
+
"p-enhanced": "npx ts-node playground/enhanced.js",
|
|
19
|
+
"e-basic": "npx ts-node examples/basic.ts",
|
|
20
|
+
"e-streaming": "npx ts-node examples/streaming.ts",
|
|
21
|
+
"e-chat-completions": "npx ts-node examples/chat-completions.ts",
|
|
22
|
+
"e-enhanced": "npx ts-node examples/enhanced.ts"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"revenium",
|
|
26
|
+
"middleware",
|
|
27
|
+
"perplexity",
|
|
28
|
+
"ai",
|
|
29
|
+
"chat",
|
|
30
|
+
"completion",
|
|
31
|
+
"metering",
|
|
32
|
+
"monitoring",
|
|
33
|
+
"typescript"
|
|
34
|
+
],
|
|
35
|
+
"author": "",
|
|
36
|
+
"license": "ISC",
|
|
37
|
+
"type": "commonjs",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"dotenv": "^17.2.2",
|
|
40
|
+
"openai": "^5.23.1",
|
|
41
|
+
"ts-node": "^10.9.2",
|
|
42
|
+
"typescript": "^5.9.2",
|
|
43
|
+
"uuid": "^13.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/playground/basic.js
CHANGED
|
@@ -1,30 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
|
|
2
2
|
|
|
3
3
|
const basicExample = async () => {
|
|
4
|
-
console.log("\n🤖 Perplexity AI - Basic Client Example");
|
|
5
|
-
console.log("=".repeat(50));
|
|
6
|
-
|
|
7
4
|
try {
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
// Make a simple chat completion
|
|
12
|
-
const response = await client.createChatCompletion({
|
|
13
|
-
model: "sonar-pro",
|
|
5
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
6
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
7
|
+
const result = await model.createChatCompletion({
|
|
14
8
|
messages: [
|
|
15
9
|
{
|
|
16
10
|
role: "user",
|
|
17
|
-
content: "
|
|
11
|
+
content: "Hello world",
|
|
18
12
|
},
|
|
19
13
|
],
|
|
20
14
|
});
|
|
21
|
-
|
|
22
|
-
console.log("✅ Response received:");
|
|
23
|
-
console.log(response.choices[0].message.content);
|
|
24
|
-
console.log("\n📊 Token usage automatically tracked by middleware");
|
|
25
|
-
console.log("🎉 Basic client example successful!");
|
|
15
|
+
console.log("[BASIC EXAMPLE]", result.choices[0].message.content);
|
|
26
16
|
} catch (error) {
|
|
27
|
-
console.
|
|
17
|
+
console.log(error);
|
|
28
18
|
}
|
|
29
19
|
};
|
|
30
20
|
|
package/playground/enhanced.js
CHANGED
|
@@ -1,35 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
|
|
2
2
|
|
|
3
3
|
const enhancedExample = async () => {
|
|
4
|
-
console.log("\n1️⃣ Enhanced Example:");
|
|
5
|
-
|
|
6
4
|
try {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
5
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
6
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
7
|
+
const result = await model.createChatCompletion({
|
|
10
8
|
messages: [
|
|
11
9
|
{
|
|
12
10
|
role: "user",
|
|
13
|
-
content: "
|
|
11
|
+
content: "Explain quantum computing in simple terms",
|
|
14
12
|
},
|
|
15
13
|
],
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
taskType: "research",
|
|
19
|
-
subscriberId: "user-12345",
|
|
20
|
-
subscriberCredentialName: "api-key-1",
|
|
21
|
-
productId: "business-intelligence",
|
|
22
|
-
agent: "research-assistant-v2",
|
|
23
|
-
responseQualityScore: 0.95,
|
|
24
|
-
},
|
|
14
|
+
max_tokens: 100,
|
|
15
|
+
temperature: 0.7,
|
|
25
16
|
});
|
|
26
|
-
|
|
27
|
-
console.log(
|
|
28
|
-
"✅ Response:",
|
|
29
|
-
advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "..."
|
|
30
|
-
);
|
|
17
|
+
console.log("[ENHANCED EXAMPLE]", result.choices[0].message.content);
|
|
31
18
|
} catch (error) {
|
|
32
|
-
console.
|
|
19
|
+
console.log(error);
|
|
33
20
|
}
|
|
34
21
|
};
|
|
35
22
|
|
package/playground/streaming.js
CHANGED
|
@@ -1,40 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
|
|
2
2
|
|
|
3
|
-
async
|
|
4
|
-
console.log("\n📊 Perplexity AI - Streaming Example");
|
|
3
|
+
const streamingExample = async () => {
|
|
5
4
|
console.log("=".repeat(50));
|
|
6
|
-
|
|
7
5
|
try {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
model: "sonar-pro",
|
|
6
|
+
const middleware = new PerplexityReveniumMiddleware();
|
|
7
|
+
const model = middleware.getGenerativeModel("sonar-pro");
|
|
8
|
+
const result = await model.createChatCompletionStream({
|
|
12
9
|
messages: [
|
|
13
10
|
{
|
|
14
11
|
role: "user",
|
|
15
|
-
content: "
|
|
12
|
+
content: "Hello world",
|
|
16
13
|
},
|
|
17
14
|
],
|
|
18
|
-
usageMetadata: {
|
|
19
|
-
traceId: "conv-streaming-456",
|
|
20
|
-
taskType: "creative-writing",
|
|
21
|
-
organizationId: "creative-studio",
|
|
22
|
-
agent: "story-generator",
|
|
23
|
-
},
|
|
24
15
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
for await (const chunk of stream) {
|
|
28
|
-
const content = chunk.choices[0]?.delta?.content;
|
|
29
|
-
if (content) {
|
|
30
|
-
process.stdout.write(content);
|
|
31
|
-
}
|
|
16
|
+
for await (const chunk of result) {
|
|
17
|
+
process.stdout.write(chunk.choices[0]?.delta?.content || "");
|
|
32
18
|
}
|
|
33
|
-
|
|
34
|
-
console.log("\n\n🎉 Streaming completed!");
|
|
35
19
|
} catch (error) {
|
|
36
|
-
console.
|
|
20
|
+
console.log(error);
|
|
37
21
|
}
|
|
38
|
-
}
|
|
22
|
+
};
|
|
39
23
|
|
|
40
24
|
streamingExample();
|
package/src/index.ts
CHANGED
|
@@ -1,38 +1,4 @@
|
|
|
1
1
|
import { config } from "dotenv";
|
|
2
|
-
import { Logger } from "./models";
|
|
3
|
-
import { activeMiddleware } from "./utils/activeMiddleware";
|
|
4
|
-
import { verifyLogVerbose } from "./utils/verifyLogVerbose";
|
|
5
|
-
|
|
6
|
-
// Import the Perplexity middleware to activate it
|
|
7
|
-
import "./perplexity-ai/middleware";
|
|
8
|
-
|
|
9
2
|
config();
|
|
10
3
|
|
|
11
|
-
|
|
12
|
-
process.env.REVENIUM_VERBOSE_STARTUP?.toLowerCase() === "true";
|
|
13
|
-
|
|
14
|
-
verifyLogVerbose(
|
|
15
|
-
verboseStartup,
|
|
16
|
-
"Revenium Perplexity middleware initialization starting"
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
// Activate middleware for Perplexity AI
|
|
20
|
-
let activeSDKs: string[] = [];
|
|
21
|
-
activeMiddleware(verboseStartup, activeSDKs, "perplexity-ai");
|
|
22
|
-
|
|
23
|
-
// Export all utilities, types, and models
|
|
24
|
-
export * from "./utils";
|
|
25
|
-
export * from "./types";
|
|
26
|
-
export * from "./models";
|
|
27
|
-
|
|
28
|
-
// Export Perplexity client and middleware
|
|
29
|
-
export * from "./perplexity-ai";
|
|
30
|
-
|
|
31
|
-
// Log the active SDKs
|
|
32
|
-
Logger.info(
|
|
33
|
-
"Revenium Perplexity middleware activated for: %s",
|
|
34
|
-
activeSDKs.length > 0 ? activeSDKs.join(", ") : "none"
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
export const version:string = "0.1.0";
|
|
38
|
-
export const activeSDKList:string[] = activeSDKs;
|
|
4
|
+
export * from "./middleware";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IOperationType } from "./operation";
|
|
2
|
+
import { ITokenCounts } from "./tokenCounts";
|
|
3
|
+
import { IUsageMetadata } from "./usageMetadata";
|
|
4
|
+
|
|
5
|
+
export interface IMeteringRequest {
|
|
6
|
+
transactionId?: string;
|
|
7
|
+
startTime: Date;
|
|
8
|
+
endTime: Date;
|
|
9
|
+
modelName: string;
|
|
10
|
+
tokenCounts: ITokenCounts;
|
|
11
|
+
stopReason: string;
|
|
12
|
+
operationType: IOperationType;
|
|
13
|
+
usageMetadata?: IUsageMetadata;
|
|
14
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ISubscriber } from "./subscriber";
|
|
2
2
|
|
|
3
|
-
export interface
|
|
3
|
+
export interface IMeteringResponse {
|
|
4
4
|
stopReason: string;
|
|
5
5
|
costType: string;
|
|
6
6
|
isStreamed: boolean;
|
|
@@ -15,7 +15,7 @@ export interface MeteringRequest {
|
|
|
15
15
|
totalTokenCount: number;
|
|
16
16
|
organizationId: string;
|
|
17
17
|
productId: string;
|
|
18
|
-
subscriber:
|
|
18
|
+
subscriber: ISubscriber;
|
|
19
19
|
model: string;
|
|
20
20
|
transactionId: string;
|
|
21
21
|
responseTime: string;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import OpenAI, { APIPromise } from "openai";
|
|
2
|
+
import {
|
|
3
|
+
models,
|
|
4
|
+
PERPLEXITY_API_BASE_URL,
|
|
5
|
+
PERPLEXITY_API_KEY,
|
|
6
|
+
PERPLEXITY_API_KEY_INVALID_MESSAGE,
|
|
7
|
+
PERPLEXITY_CLIENT_INITIALIZED_MESSAGE,
|
|
8
|
+
PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE,
|
|
9
|
+
PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE,
|
|
10
|
+
PERPLEXITY_REQUIRED_API_KEY_MESSAGE,
|
|
11
|
+
REVENIUM_METERING_API_KEY,
|
|
12
|
+
REVENIUM_METERING_BASE_URL,
|
|
13
|
+
} from "./utils";
|
|
14
|
+
import { logger } from "./models/Logger";
|
|
15
|
+
import { IChatCompletionRequest } from "./interfaces/chatCompletionRequest";
|
|
16
|
+
import { Metering } from "./models/Metering";
|
|
17
|
+
import { IOperationType } from "./interfaces/operation";
|
|
18
|
+
import { extractGoogleAITokenCounts } from "./utils/extractTokenCount";
|
|
19
|
+
import { RequestOptions } from "openai/internal/request-options";
|
|
20
|
+
|
|
21
|
+
export class PerplexityReveniumMiddleware {
|
|
22
|
+
private client: OpenAI;
|
|
23
|
+
private working: boolean = true;
|
|
24
|
+
private modelName: string = "";
|
|
25
|
+
constructor() {
|
|
26
|
+
this.verifyEnv();
|
|
27
|
+
this.client = new OpenAI({
|
|
28
|
+
apiKey: PERPLEXITY_API_KEY,
|
|
29
|
+
baseURL: PERPLEXITY_API_BASE_URL,
|
|
30
|
+
});
|
|
31
|
+
logger.info(PERPLEXITY_CLIENT_INITIALIZED_MESSAGE);
|
|
32
|
+
}
|
|
33
|
+
public getGenerativeModel(model: string) {
|
|
34
|
+
this.modelName = model;
|
|
35
|
+
if (!models.includes(model)) {
|
|
36
|
+
throw new Error(`Model ${model} is not supported`);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
createChatCompletion: this.chatCompletion,
|
|
40
|
+
createChatCompletionStream: this.streamingChatCompletion,
|
|
41
|
+
createEmbeddings: this.embeddings,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private embeddings = async (
|
|
46
|
+
_body: Omit<OpenAI.Embeddings.EmbeddingCreateParams, "model">,
|
|
47
|
+
_options?: RequestOptions
|
|
48
|
+
) => {};
|
|
49
|
+
|
|
50
|
+
private streamingChatCompletion = async (params: IChatCompletionRequest) => {
|
|
51
|
+
const startTime: Date = new Date();
|
|
52
|
+
try {
|
|
53
|
+
const { usageMetadata, ...openaiParams } = params;
|
|
54
|
+
const requestParams = {
|
|
55
|
+
...openaiParams,
|
|
56
|
+
model: this.modelName,
|
|
57
|
+
};
|
|
58
|
+
const result = await this.client?.chat.completions.create({
|
|
59
|
+
...requestParams,
|
|
60
|
+
stream: true,
|
|
61
|
+
});
|
|
62
|
+
if (!this.working) {
|
|
63
|
+
logger.warning("Metering is not working. Check your configuration.");
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
const tokenCounts = extractGoogleAITokenCounts(result);
|
|
67
|
+
const endTime: Date = new Date();
|
|
68
|
+
logger.info("Metering is working.");
|
|
69
|
+
const metering = new Metering(
|
|
70
|
+
REVENIUM_METERING_API_KEY ?? "",
|
|
71
|
+
REVENIUM_METERING_BASE_URL ?? ""
|
|
72
|
+
);
|
|
73
|
+
const getMetering = metering.createMetering({
|
|
74
|
+
modelName: this.modelName,
|
|
75
|
+
endTime,
|
|
76
|
+
startTime,
|
|
77
|
+
operationType: IOperationType.CHAT,
|
|
78
|
+
stopReason: "END",
|
|
79
|
+
tokenCounts,
|
|
80
|
+
usageMetadata,
|
|
81
|
+
});
|
|
82
|
+
await metering.sendMeteringData(getMetering);
|
|
83
|
+
return result;
|
|
84
|
+
} catch (error) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
private chatCompletion = async (params: IChatCompletionRequest) => {
|
|
90
|
+
const startTime: Date = new Date();
|
|
91
|
+
try {
|
|
92
|
+
const { usageMetadata, ...openaiParams } = params;
|
|
93
|
+
const requestParams = {
|
|
94
|
+
...openaiParams,
|
|
95
|
+
model: this.modelName,
|
|
96
|
+
};
|
|
97
|
+
const result: OpenAI.Chat.Completions.ChatCompletion & {
|
|
98
|
+
_request_id?: string | null | undefined;
|
|
99
|
+
} = await this.client?.chat.completions.create({
|
|
100
|
+
...requestParams,
|
|
101
|
+
stream: false,
|
|
102
|
+
});
|
|
103
|
+
if (!this.working) {
|
|
104
|
+
logger.warning("Metering is not working. Check your configuration.");
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
const tokenCounts = extractGoogleAITokenCounts(result);
|
|
108
|
+
const endTime: Date = new Date();
|
|
109
|
+
logger.info(" Metering is working.");
|
|
110
|
+
const metering = new Metering(
|
|
111
|
+
REVENIUM_METERING_API_KEY ?? "",
|
|
112
|
+
REVENIUM_METERING_BASE_URL ?? ""
|
|
113
|
+
);
|
|
114
|
+
const getMetering = metering.createMetering({
|
|
115
|
+
modelName: this.modelName,
|
|
116
|
+
endTime,
|
|
117
|
+
startTime,
|
|
118
|
+
operationType: IOperationType.CHAT,
|
|
119
|
+
stopReason: "END",
|
|
120
|
+
tokenCounts,
|
|
121
|
+
usageMetadata,
|
|
122
|
+
});
|
|
123
|
+
await metering.sendMeteringData(getMetering);
|
|
124
|
+
return result;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
private verifyEnv(): void {
|
|
131
|
+
if (!PERPLEXITY_API_KEY) {
|
|
132
|
+
logger.error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
|
|
133
|
+
throw new Error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!PERPLEXITY_API_KEY.includes("pplx-")) {
|
|
137
|
+
logger.error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
|
|
138
|
+
throw new Error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!REVENIUM_METERING_API_KEY) {
|
|
142
|
+
logger.warning(PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE);
|
|
143
|
+
this.working = false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (!REVENIUM_METERING_BASE_URL) {
|
|
147
|
+
logger.warning(PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE);
|
|
148
|
+
this.working = false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
package/src/models/Logger.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { LOG_LEVELS } from "../utils
|
|
1
|
+
import { LOG_LEVELS } from "../utils";
|
|
2
2
|
|
|
3
3
|
export class Logger {
|
|
4
4
|
private static logLevel: string = process.env.REVENIUM_LOG_LEVEL || "INFO";
|
|
5
5
|
|
|
6
6
|
static debug(message: string, data?: any): void {
|
|
7
7
|
if (this.shouldLog(LOG_LEVELS[0])) {
|
|
8
|
-
console.log(
|
|
8
|
+
console.log(`[${LOG_LEVELS[0]}] ${message}`, data || "");
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
static info(message: string, data?: any): void {
|
|
13
13
|
if (this.shouldLog(LOG_LEVELS[1])) {
|
|
14
|
-
console.log(
|
|
14
|
+
console.log(`[${LOG_LEVELS[1]}] ${message}`, data || "");
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
static warning(message: string, data?: any): void {
|
|
19
19
|
if (this.shouldLog(LOG_LEVELS[2])) {
|
|
20
|
-
console.warn(
|
|
20
|
+
console.warn(`[${LOG_LEVELS[2]}] ${message}`, data || "");
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
static error(message: string, data?: any): void {
|
|
25
25
|
if (this.shouldLog(LOG_LEVELS[3])) {
|
|
26
|
-
console.error(
|
|
26
|
+
console.error(`[${LOG_LEVELS[3]}] ${message}`, data || "");
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|