@revenium/perplexity 1.0.23 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +391 -162
  2. package/dist/interfaces/meteringResponse.d.ts +28 -27
  3. package/dist/interfaces/meteringResponse.js +2 -2
  4. package/dist/models/Metering.js +21 -18
  5. package/dist/v1/perplexityV1.service.js +166 -0
  6. package/dist/v2/perplexityV2.service.js +178 -0
  7. package/examples/v1/basic.ts +50 -0
  8. package/examples/v1/chat.ts +40 -0
  9. package/examples/v1/metadata.ts +49 -0
  10. package/examples/v1/streaming.ts +44 -0
  11. package/examples/v2/basic.ts +49 -0
  12. package/examples/v2/chat.ts +60 -0
  13. package/examples/v2/metadata.ts +71 -0
  14. package/examples/v2/streaming.ts +61 -0
  15. package/package.json +26 -11
  16. package/playground/v1/basic.js +50 -0
  17. package/playground/v1/chat.js +46 -0
  18. package/playground/v1/metadata.js +50 -0
  19. package/playground/v1/streaming.js +44 -0
  20. package/playground/v2/basic.js +49 -0
  21. package/playground/v2/chat.js +72 -0
  22. package/playground/v2/metadata.js +76 -0
  23. package/playground/v2/streaming.js +67 -0
  24. package/src/index.ts +14 -1
  25. package/src/interfaces/chatCompletionRequest.ts +7 -2
  26. package/src/interfaces/meteringResponse.ts +1 -0
  27. package/src/interfaces/perplexityResponse.ts +63 -0
  28. package/src/interfaces/perplexityStreaming.ts +56 -0
  29. package/src/models/Metering.ts +8 -1
  30. package/src/utils/constants/perplexityModels.ts +71 -0
  31. package/src/v1/perplexityV1.controller.ts +164 -0
  32. package/src/v1/perplexityV1.service.ts +230 -0
  33. package/src/v2/perplexityV2.controller.ts +219 -0
  34. package/src/v2/perplexityV2.service.ts +260 -0
  35. package/dist/index.js +0 -19
  36. package/dist/interfaces/chatCompletionRequest.d.ts +0 -9
  37. package/dist/interfaces/chatCompletionRequest.js +0 -2
  38. package/dist/interfaces/credential.d.ts +0 -4
  39. package/dist/interfaces/credential.js +0 -2
  40. package/dist/interfaces/meteringRequest.d.ts +0 -13
  41. package/dist/interfaces/meteringRequest.js +0 -2
  42. package/dist/interfaces/operation.d.ts +0 -4
  43. package/dist/interfaces/operation.js +0 -8
  44. package/dist/interfaces/subscriber.d.ts +0 -8
  45. package/dist/interfaces/subscriber.js +0 -2
  46. package/dist/interfaces/tokenCounts.d.ts +0 -7
  47. package/dist/interfaces/tokenCounts.js +0 -2
  48. package/dist/interfaces/usageMetadata.d.ts +0 -27
  49. package/dist/interfaces/usageMetadata.js +0 -2
  50. package/dist/middleware.d.ts +0 -22
  51. package/dist/middleware.js +0 -129
  52. package/dist/models/Logger.js +0 -35
  53. package/dist/models/Metering.d.ts +0 -9
  54. package/dist/utils/calculateDurationMs.d.ts +0 -1
  55. package/dist/utils/calculateDurationMs.js +0 -6
  56. package/dist/utils/constants/constants.d.ts +0 -6
  57. package/dist/utils/constants/constants.js +0 -11
  58. package/dist/utils/constants/logLevels.d.ts +0 -1
  59. package/dist/utils/constants/logLevels.js +0 -4
  60. package/dist/utils/constants/messages.d.ts +0 -5
  61. package/dist/utils/constants/messages.js +0 -8
  62. package/dist/utils/constants/models.d.ts +0 -1
  63. package/dist/utils/constants/models.js +0 -21
  64. package/dist/utils/extractTokenCount.d.ts +0 -2
  65. package/dist/utils/extractTokenCount.js +0 -28
  66. package/dist/utils/formatTimeStamp.d.ts +0 -1
  67. package/dist/utils/formatTimeStamp.js +0 -6
  68. package/dist/utils/generateTransactionId.d.ts +0 -1
  69. package/dist/utils/generateTransactionId.js +0 -7
  70. package/dist/utils/index.d.ts +0 -6
  71. package/dist/utils/index.js +0 -23
  72. package/dist/utils/loadEnv.d.ts +0 -1
  73. package/dist/utils/loadEnv.js +0 -7
  74. package/dist/utils/safeExtract.d.ts +0 -29
  75. package/dist/utils/safeExtract.js +0 -67
  76. package/examples/basic.ts +0 -17
  77. package/examples/chat-completions.ts +0 -22
  78. package/examples/enhanced.ts +0 -20
  79. package/examples/metadata.ts +0 -43
  80. package/examples/streaming.ts +0 -24
  81. package/playground/basic.js +0 -17
  82. package/playground/chat-completions.js +0 -22
  83. package/playground/enhanced.js +0 -20
  84. package/playground/metadata.js +0 -43
  85. package/playground/streaming.js +0 -24
  86. package/src/middleware.ts +0 -157
@@ -1,22 +0,0 @@
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();
@@ -1,20 +0,0 @@
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();
@@ -1,43 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "../src";
2
-
3
- async function metadataRequest() {
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
- usageMetadata: {
12
- taskType: "test",
13
- subscriberEmail: "test@revenium.ai",
14
- subscriberId: "123456",
15
- subscriberCredentialName: "apiKey",
16
- subscriberCredential: "keyValue",
17
- organizationId: "123456",
18
- subscriptionId: "123456",
19
- productId: "free-trial",
20
- agent: "perplexity",
21
- responseQualityScore: 100,
22
- transactionId: "123456",
23
- timeToFirstToken: 1000,
24
- requestTime: new Date(),
25
- completionStartTime: new Date(),
26
- operationType: "CHAT",
27
- inputTokenCount: 10,
28
- outputTokenCount: 10,
29
- reasoningTokenCount: 20,
30
- cacheCreationTokenCount: 0,
31
- cacheReadTokenCount: 0,
32
- totalTokenCount: 40,
33
- responseTime: new Date(),
34
- requestDuration: 1000,
35
- stopReason: "END",
36
- },
37
- });
38
- console.log("[METADATA REQUEST]", result.choices[0].message);
39
- } catch (error) {
40
- console.log(error);
41
- }
42
- }
43
- metadataRequest();
@@ -1,24 +0,0 @@
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();
@@ -1,17 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
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();
@@ -1,22 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
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();
@@ -1,20 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
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();
@@ -1,43 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
2
-
3
- async function metadataRequest() {
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
- usageMetadata: {
12
- taskType: "test",
13
- subscriberEmail: "test@revenium.ai",
14
- subscriberId: "123456",
15
- subscriberCredentialName: "apiKey",
16
- subscriberCredential: "keyValue",
17
- organizationId: "123456",
18
- subscriptionId: "123456",
19
- productId: "free-trial",
20
- agent: "perplexity",
21
- responseQualityScore: 100,
22
- transactionId: "123456",
23
- timeToFirstToken: 1000,
24
- requestTime: new Date(),
25
- completionStartTime: new Date(),
26
- operationType: "CHAT",
27
- inputTokenCount: 10,
28
- outputTokenCount: 10,
29
- reasoningTokenCount: 20,
30
- cacheCreationTokenCount: 0,
31
- cacheReadTokenCount: 0,
32
- totalTokenCount: 40,
33
- responseTime: new Date(),
34
- requestDuration: 1000,
35
- stopReason: "END",
36
- },
37
- });
38
- console.log("[METADATA REQUEST]", result.choices[0].message);
39
- } catch (error) {
40
- console.log(error);
41
- }
42
- }
43
- metadataRequest();
@@ -1,24 +0,0 @@
1
- import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
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/src/middleware.ts DELETED
@@ -1,157 +0,0 @@
1
- import OpenAI 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
- {
75
- modelName: this.modelName,
76
- endTime,
77
- startTime,
78
- operationType: IOperationType.CHAT,
79
- stopReason: "END",
80
- tokenCounts,
81
- usageMetadata,
82
- },
83
- true
84
- );
85
- await metering.sendMeteringData(getMetering);
86
- return result;
87
- } catch (error) {
88
- throw error;
89
- }
90
- };
91
-
92
- private chatCompletion = async (params: IChatCompletionRequest) => {
93
- const startTime: Date = new Date();
94
- try {
95
- const { usageMetadata, ...openaiParams } = params;
96
- const requestParams = {
97
- ...openaiParams,
98
- model: this.modelName,
99
- };
100
- const result: OpenAI.Chat.Completions.ChatCompletion & {
101
- _request_id?: string | null | undefined;
102
- } = await this.client?.chat.completions.create({
103
- ...requestParams,
104
- stream: false,
105
- });
106
- if (!this.working) {
107
- logger.warning("Metering is not working. Check your configuration.");
108
- return result;
109
- }
110
- const tokenCounts = extractGoogleAITokenCounts(result);
111
- const endTime: Date = new Date();
112
- logger.info(" Metering is working.");
113
- const metering = new Metering(
114
- REVENIUM_METERING_API_KEY ?? "",
115
- REVENIUM_METERING_BASE_URL ?? ""
116
- );
117
- const getMetering = metering.createMetering(
118
- {
119
- modelName: this.modelName,
120
- endTime,
121
- startTime,
122
- operationType: IOperationType.CHAT,
123
- stopReason: "END",
124
- tokenCounts,
125
- usageMetadata,
126
- },
127
- false
128
- );
129
- await metering.sendMeteringData(getMetering);
130
- return result;
131
- } catch (error) {
132
- throw error;
133
- }
134
- };
135
-
136
- private verifyEnv(): void {
137
- if (!PERPLEXITY_API_KEY) {
138
- logger.error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
139
- throw new Error(PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
140
- }
141
-
142
- if (!PERPLEXITY_API_KEY.includes("pplx-")) {
143
- logger.error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
144
- throw new Error(PERPLEXITY_API_KEY_INVALID_MESSAGE);
145
- }
146
-
147
- if (!REVENIUM_METERING_API_KEY) {
148
- logger.warning(PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE);
149
- this.working = false;
150
- }
151
-
152
- if (!REVENIUM_METERING_BASE_URL) {
153
- logger.warning(PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE);
154
- this.working = false;
155
- }
156
- }
157
- }