@revenium/perplexity 1.0.23 → 2.0.1

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 (123) hide show
  1. package/README.md +468 -364
  2. package/dist/cjs/core/config/perplexity-config.js +45 -0
  3. package/dist/cjs/core/config/perplexity-config.js.map +1 -0
  4. package/dist/cjs/core/config/revenium-config.js +80 -0
  5. package/dist/cjs/core/config/revenium-config.js.map +1 -0
  6. package/dist/cjs/core/tracking/metering.js +131 -0
  7. package/dist/cjs/core/tracking/metering.js.map +1 -0
  8. package/dist/cjs/core/wrapper/perplexity-client.js +177 -0
  9. package/dist/cjs/core/wrapper/perplexity-client.js.map +1 -0
  10. package/dist/cjs/index.js +64 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/types/index.js +21 -0
  13. package/dist/cjs/types/index.js.map +1 -0
  14. package/dist/cjs/utils/logger.js +23 -0
  15. package/dist/cjs/utils/logger.js.map +1 -0
  16. package/dist/esm/core/config/perplexity-config.js +40 -0
  17. package/dist/esm/core/config/perplexity-config.js.map +1 -0
  18. package/dist/esm/core/config/revenium-config.js +72 -0
  19. package/dist/esm/core/config/revenium-config.js.map +1 -0
  20. package/dist/esm/core/tracking/metering.js +126 -0
  21. package/dist/esm/core/tracking/metering.js.map +1 -0
  22. package/dist/esm/core/wrapper/perplexity-client.js +170 -0
  23. package/dist/esm/core/wrapper/perplexity-client.js.map +1 -0
  24. package/dist/esm/index.js +44 -0
  25. package/dist/esm/index.js.map +1 -0
  26. package/dist/esm/types/index.js +18 -0
  27. package/dist/esm/types/index.js.map +1 -0
  28. package/dist/esm/utils/logger.js +20 -0
  29. package/dist/esm/utils/logger.js.map +1 -0
  30. package/dist/types/core/config/perplexity-config.d.ts +24 -0
  31. package/dist/types/core/config/perplexity-config.d.ts.map +1 -0
  32. package/dist/types/core/config/revenium-config.d.ts +37 -0
  33. package/dist/types/core/config/revenium-config.d.ts.map +1 -0
  34. package/dist/types/core/tracking/metering.d.ts +31 -0
  35. package/dist/types/core/tracking/metering.d.ts.map +1 -0
  36. package/dist/types/core/wrapper/perplexity-client.d.ts +32 -0
  37. package/dist/types/core/wrapper/perplexity-client.d.ts.map +1 -0
  38. package/dist/types/index.d.ts +34 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/types/index.d.ts +159 -0
  41. package/dist/types/types/index.d.ts.map +1 -0
  42. package/dist/types/utils/logger.d.ts +10 -0
  43. package/dist/types/utils/logger.d.ts.map +1 -0
  44. package/package.json +36 -16
  45. package/.env.example +0 -3
  46. package/dist/index.js +0 -19
  47. package/dist/interfaces/chatCompletionRequest.d.ts +0 -9
  48. package/dist/interfaces/chatCompletionRequest.js +0 -2
  49. package/dist/interfaces/credential.d.ts +0 -4
  50. package/dist/interfaces/credential.js +0 -2
  51. package/dist/interfaces/meteringRequest.d.ts +0 -13
  52. package/dist/interfaces/meteringRequest.js +0 -2
  53. package/dist/interfaces/meteringResponse.d.ts +0 -27
  54. package/dist/interfaces/meteringResponse.js +0 -2
  55. package/dist/interfaces/operation.d.ts +0 -4
  56. package/dist/interfaces/operation.js +0 -8
  57. package/dist/interfaces/subscriber.d.ts +0 -8
  58. package/dist/interfaces/subscriber.js +0 -2
  59. package/dist/interfaces/tokenCounts.d.ts +0 -7
  60. package/dist/interfaces/tokenCounts.js +0 -2
  61. package/dist/interfaces/usageMetadata.d.ts +0 -27
  62. package/dist/interfaces/usageMetadata.js +0 -2
  63. package/dist/middleware.d.ts +0 -22
  64. package/dist/middleware.js +0 -129
  65. package/dist/models/Logger.js +0 -35
  66. package/dist/models/Metering.d.ts +0 -9
  67. package/dist/models/Metering.js +0 -80
  68. package/dist/utils/calculateDurationMs.d.ts +0 -1
  69. package/dist/utils/calculateDurationMs.js +0 -6
  70. package/dist/utils/constants/constants.d.ts +0 -6
  71. package/dist/utils/constants/constants.js +0 -11
  72. package/dist/utils/constants/logLevels.d.ts +0 -1
  73. package/dist/utils/constants/logLevels.js +0 -4
  74. package/dist/utils/constants/messages.d.ts +0 -5
  75. package/dist/utils/constants/messages.js +0 -8
  76. package/dist/utils/constants/models.d.ts +0 -1
  77. package/dist/utils/constants/models.js +0 -21
  78. package/dist/utils/extractTokenCount.d.ts +0 -2
  79. package/dist/utils/extractTokenCount.js +0 -28
  80. package/dist/utils/formatTimeStamp.d.ts +0 -1
  81. package/dist/utils/formatTimeStamp.js +0 -6
  82. package/dist/utils/generateTransactionId.d.ts +0 -1
  83. package/dist/utils/generateTransactionId.js +0 -7
  84. package/dist/utils/index.d.ts +0 -6
  85. package/dist/utils/index.js +0 -23
  86. package/dist/utils/loadEnv.d.ts +0 -1
  87. package/dist/utils/loadEnv.js +0 -7
  88. package/dist/utils/safeExtract.d.ts +0 -29
  89. package/dist/utils/safeExtract.js +0 -67
  90. package/examples/basic.ts +0 -17
  91. package/examples/chat-completions.ts +0 -22
  92. package/examples/enhanced.ts +0 -20
  93. package/examples/metadata.ts +0 -43
  94. package/examples/streaming.ts +0 -24
  95. package/playground/basic.js +0 -17
  96. package/playground/chat-completions.js +0 -22
  97. package/playground/enhanced.js +0 -20
  98. package/playground/metadata.js +0 -43
  99. package/playground/streaming.js +0 -24
  100. package/src/index.ts +0 -4
  101. package/src/interfaces/chatCompletionRequest.ts +0 -10
  102. package/src/interfaces/credential.ts +0 -4
  103. package/src/interfaces/meteringRequest.ts +0 -14
  104. package/src/interfaces/meteringResponse.ts +0 -28
  105. package/src/interfaces/operation.ts +0 -4
  106. package/src/interfaces/subscriber.ts +0 -8
  107. package/src/interfaces/tokenCounts.ts +0 -7
  108. package/src/interfaces/usageMetadata.ts +0 -27
  109. package/src/middleware.ts +0 -157
  110. package/src/models/Logger.ts +0 -38
  111. package/src/models/Metering.ts +0 -114
  112. package/src/utils/calculateDurationMs.ts +0 -3
  113. package/src/utils/constants/constants.ts +0 -10
  114. package/src/utils/constants/logLevels.ts +0 -1
  115. package/src/utils/constants/messages.ts +0 -11
  116. package/src/utils/constants/models.ts +0 -20
  117. package/src/utils/extractTokenCount.ts +0 -26
  118. package/src/utils/formatTimestamp.ts +0 -3
  119. package/src/utils/generateTransactionId.ts +0 -5
  120. package/src/utils/index.ts +0 -39
  121. package/src/utils/loadEnv.ts +0 -8
  122. package/src/utils/safeExtract.ts +0 -67
  123. package/tsconfig.json +0 -15
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Revenium Middleware for Perplexity
3
+ *
4
+ * A lightweight middleware that adds Revenium metering to Perplexity API calls.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import {
9
+ * initializeReveniumFromEnv,
10
+ * initializePerplexityFromEnv,
11
+ * createChatCompletion,
12
+ * } from '@revenium/perplexity';
13
+ *
14
+ * // Initialize configurations
15
+ * initializeReveniumFromEnv();
16
+ * initializePerplexityFromEnv();
17
+ *
18
+ * // Create a chat completion
19
+ * const result = await createChatCompletion({
20
+ * messages: [{ role: 'user', content: 'Hello!' }],
21
+ * model: 'sonar-pro',
22
+ * });
23
+ *
24
+ * console.log(result.content);
25
+ * ```
26
+ */
27
+ export { initializeReveniumFromEnv, initializeRevenium, getReveniumConfig, isReveniumEnabled, disableRevenium, enableRevenium, type ReveniumConfig, } from "./core/config/revenium-config";
28
+ export { initializePerplexityFromEnv, initializePerplexity, getPerplexityConfig, type PerplexityConfig, } from "./core/config/perplexity-config";
29
+ export { createChatCompletion, createStreamingChatCompletion, } from "./core/wrapper/perplexity-client";
30
+ export { generateTransactionId, buildMeteringData, sendMeteringData, } from "./core/tracking/metering";
31
+ export type { PerplexityMessage, PerplexityChatRequest, PerplexityUsage, PerplexityChoice, PerplexityResponse, PerplexityStreamChunk, UsageMetadata, MeteringData, ChatCompletionResult, StreamingResult, PerplexityModel, } from "./types";
32
+ export { PERPLEXITY_MODELS, DEFAULT_MODEL } from "./types";
33
+ export { logger } from "./utils/logger";
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,KAAK,cAAc,GACpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAMlC,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAM3D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * TypeScript Type Definitions for Perplexity Middleware
3
+ */
4
+ export interface PerplexityMessage {
5
+ role: "system" | "user" | "assistant";
6
+ content: string;
7
+ }
8
+ export interface PerplexityChatRequest {
9
+ model: string;
10
+ messages: PerplexityMessage[];
11
+ max_tokens?: number;
12
+ temperature?: number;
13
+ top_p?: number;
14
+ stream?: boolean;
15
+ presence_penalty?: number;
16
+ frequency_penalty?: number;
17
+ }
18
+ export interface PerplexityUsage {
19
+ prompt_tokens: number;
20
+ completion_tokens: number;
21
+ total_tokens: number;
22
+ }
23
+ export interface PerplexityChoice {
24
+ index: number;
25
+ message?: {
26
+ role: string;
27
+ content: string;
28
+ };
29
+ delta?: {
30
+ role?: string;
31
+ content?: string;
32
+ };
33
+ finish_reason: string | null;
34
+ }
35
+ export interface PerplexityResponse {
36
+ id: string;
37
+ object: string;
38
+ created: number;
39
+ model: string;
40
+ choices: PerplexityChoice[];
41
+ usage?: PerplexityUsage;
42
+ }
43
+ export interface PerplexityStreamChunk {
44
+ id: string;
45
+ object: string;
46
+ created: number;
47
+ model: string;
48
+ choices: PerplexityChoice[];
49
+ }
50
+ export interface UsageMetadata {
51
+ subscriber?: {
52
+ id: string;
53
+ email?: string;
54
+ credential?: {
55
+ name: string;
56
+ value: string;
57
+ };
58
+ };
59
+ organizationId?: string;
60
+ productId?: string;
61
+ transactionId?: string;
62
+ traceId?: string;
63
+ inputTokenCount?: number;
64
+ outputTokenCount?: number;
65
+ totalTokenCount?: number;
66
+ reasoningTokenCount?: number;
67
+ cacheCreationTokenCount?: number;
68
+ cacheReadTokenCount?: number;
69
+ requestTime?: string;
70
+ responseTime?: string;
71
+ completionStartTime?: string;
72
+ timeToFirstToken?: number;
73
+ operationType?: string;
74
+ taskType?: string;
75
+ agent?: string;
76
+ stopReason?: string;
77
+ costType?: string;
78
+ subscriberId?: string;
79
+ subscriberEmail?: string;
80
+ subscriberCredentialName?: string;
81
+ subscriberCredential?: string;
82
+ }
83
+ /**
84
+ * Metering data sent to Revenium
85
+ * Field order matches the expected API format
86
+ */
87
+ export interface MeteringData {
88
+ stopReason: string;
89
+ costType: string;
90
+ isStreamed: boolean;
91
+ taskType: string;
92
+ agent: string;
93
+ operationType: string;
94
+ inputTokenCount: number;
95
+ outputTokenCount: number;
96
+ reasoningTokenCount: number;
97
+ cacheCreationTokenCount: number;
98
+ cacheReadTokenCount: number;
99
+ totalTokenCount: number;
100
+ organizationId: string;
101
+ productId: string;
102
+ subscriber: {
103
+ id: string;
104
+ email: string;
105
+ credential: {
106
+ name: string;
107
+ value: string;
108
+ };
109
+ };
110
+ model: string;
111
+ transactionId: string;
112
+ responseTime: string;
113
+ requestDuration: number;
114
+ provider: string;
115
+ requestTime: string;
116
+ completionStartTime: string;
117
+ timeToFirstToken: number;
118
+ middleware_source: string;
119
+ traceId?: string;
120
+ }
121
+ export interface ChatCompletionResult {
122
+ content: string;
123
+ role: string;
124
+ finishReason: string | null;
125
+ usage: {
126
+ promptTokens: number;
127
+ completionTokens: number;
128
+ totalTokens: number;
129
+ };
130
+ model: string;
131
+ transactionId: string;
132
+ rawResponse: PerplexityResponse;
133
+ }
134
+ export interface StreamingResult {
135
+ stream: AsyncGenerator<PerplexityStreamChunk>;
136
+ transactionId: string;
137
+ model: string;
138
+ }
139
+ export interface ReveniumConfig {
140
+ meteringApiKey: string;
141
+ meteringBaseUrl: string;
142
+ teamId?: string;
143
+ enabled: boolean;
144
+ }
145
+ export interface PerplexityConfig {
146
+ apiKey: string;
147
+ baseUrl: string;
148
+ }
149
+ export declare const PERPLEXITY_MODELS: {
150
+ readonly SONAR: "sonar";
151
+ readonly SONAR_PRO: "sonar-pro";
152
+ readonly SONAR_REASONING: "sonar-reasoning";
153
+ readonly LLAMA_3_1_SONAR_SMALL_128K_CHAT: "llama-3.1-sonar-small-128k-chat";
154
+ readonly LLAMA_3_1_SONAR_LARGE_128K_CHAT: "llama-3.1-sonar-large-128k-chat";
155
+ readonly LLAMA_3_1_SONAR_HUGE_128K_CHAT: "llama-3.1-sonar-huge-128k-chat";
156
+ };
157
+ export type PerplexityModel = (typeof PERPLEXITY_MODELS)[keyof typeof PERPLEXITY_MODELS];
158
+ export declare const DEFAULT_MODEL: PerplexityModel;
159
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Simple logger utility
3
+ */
4
+ export declare const logger: {
5
+ info: (...args: any[]) => void;
6
+ warn: (...args: any[]) => void;
7
+ error: (...args: any[]) => void;
8
+ debug: (...args: any[]) => void;
9
+ };
10
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;oBACD,GAAG,EAAE;oBAGL,GAAG,EAAE;qBAGJ,GAAG,EAAE;qBAGL,GAAG,EAAE;CAKvB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@revenium/perplexity",
3
- "version": "1.0.23",
4
- "description": "NodeJS middleware for perplexity's AI API",
3
+ "version": "2.0.1",
4
+ "description": "NodeJS middleware for Perplexity AI API with Revenium metering",
5
5
  "homepage": "https://github.com/revenium/revenium-middleware-perplexity-node#readme",
6
6
  "bugs": {
7
7
  "url": "https://github.com/revenium/revenium-middleware-perplexity-node/issues"
@@ -10,20 +10,37 @@
10
10
  "type": "git",
11
11
  "url": "git+https://github.com/revenium/revenium-middleware-perplexity-node.git"
12
12
  },
13
- "main": "dist/index.js",
14
- "types": "dist/index.d.ts",
13
+ "main": "dist/cjs/index.js",
14
+ "module": "dist/esm/index.js",
15
+ "types": "dist/types/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/esm/index.js",
19
+ "require": "./dist/cjs/index.js",
20
+ "types": "./dist/types/index.d.ts"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist/**/*",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
15
28
  "scripts": {
16
- "build": "tsc -b",
17
- "p-basic": "npx ts-node playground/basic.js",
18
- "p-streaming": "npx ts-node playground/streaming.js",
19
- "p-enhanced": "npx ts-node playground/enhanced.js",
20
- "p-chat-completions": "npx ts-node playground/chat-completions.js",
21
- "p-metadata": "npx ts-node playground/metadata.js",
22
- "e-basic": "npx ts-node examples/basic.ts",
23
- "e-streaming": "npx ts-node examples/streaming.ts",
24
- "e-chat-completions": "npx ts-node examples/chat-completions.ts",
25
- "e-enhanced": "npx ts-node examples/enhanced.ts",
26
- "e-metadata": "npx ts-node examples/metadata.ts"
29
+ "clean": "if exist dist rmdir /s /q dist",
30
+ "build:esm": "tsc -p tsconfig.esm.json",
31
+ "build:cjs": "tsc -p tsconfig.cjs.json",
32
+ "build:types": "tsc -p tsconfig.types.json",
33
+ "build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:types",
34
+ "prepublishOnly": "npm run build",
35
+ "example:basic": "tsx examples/basic.ts",
36
+ "example:streaming": "tsx examples/streaming.ts",
37
+ "example:chat": "tsx examples/chat.ts",
38
+ "example:metadata": "tsx examples/metadata.ts",
39
+ "playground:basic": "node playground/basic.js",
40
+ "playground:streaming": "node playground/streaming.js",
41
+ "playground:chat": "node playground/chat.js",
42
+ "playground:metadata": "node playground/metadata.js",
43
+ "test": "npm run example:basic && npm run example:streaming && npm run example:chat && npm run example:metadata"
27
44
  },
28
45
  "keywords": [
29
46
  "revenium",
@@ -42,8 +59,11 @@
42
59
  "dependencies": {
43
60
  "dotenv": "^17.2.2",
44
61
  "openai": "^5.23.1",
45
- "ts-node": "^10.9.2",
62
+ "tsx": "^4.19.2",
46
63
  "typescript": "^5.9.2",
47
64
  "uuid": "^13.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "^24.7.1"
48
68
  }
49
69
  }
package/.env.example DELETED
@@ -1,3 +0,0 @@
1
- PERPLEXITY_API_KEY="your_perplexity_api_key_here"
2
- REVENIUM_METERING_API_KEY="your_revenium_api_key_here"
3
- REVENIUM_METERING_BASE_URL="https://api.revenium.io/meter"
package/dist/index.js DELETED
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- const dotenv_1 = require("dotenv");
18
- (0, dotenv_1.config)();
19
- __exportStar(require("./middleware"), exports);
@@ -1,9 +0,0 @@
1
- import { ChatCompletionMessageParam } from "openai/resources/index";
2
- import { IUsageMetadata } from "./usageMetadata";
3
- export interface IChatCompletionRequest {
4
- model?: string;
5
- messages: ChatCompletionMessageParam[];
6
- stream?: boolean;
7
- usageMetadata?: IUsageMetadata;
8
- [key: string]: any;
9
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +0,0 @@
1
- export interface ICredential {
2
- name: string;
3
- value: string;
4
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,13 +0,0 @@
1
- import { IOperationType } from "./operation";
2
- import { ITokenCounts } from "./tokenCounts";
3
- import { IUsageMetadata } from "./usageMetadata";
4
- export interface IMeteringRequest {
5
- transactionId?: string;
6
- startTime: Date;
7
- endTime: Date;
8
- modelName: string;
9
- tokenCounts: ITokenCounts;
10
- stopReason: string;
11
- operationType: IOperationType;
12
- usageMetadata?: IUsageMetadata;
13
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,27 +0,0 @@
1
- import { ISubscriber } from "./subscriber";
2
- export interface IMeteringResponse {
3
- stopReason: string;
4
- costType: string;
5
- isStreamed: boolean;
6
- taskType: string;
7
- agent: string;
8
- operationType: string;
9
- inputTokenCount: number;
10
- outputTokenCount: number;
11
- reasoningTokenCount: number;
12
- cacheCreationTokenCount: number;
13
- cacheReadTokenCount: number;
14
- totalTokenCount: number;
15
- organizationId: string;
16
- productId: string;
17
- subscriber: ISubscriber;
18
- model: string;
19
- transactionId: string;
20
- responseTime: string;
21
- requestDuration: number;
22
- provider: string;
23
- requestTime: string;
24
- completionStartTime: string;
25
- timeToFirstToken: number;
26
- middleware_source: string;
27
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +0,0 @@
1
- export declare enum IOperationType {
2
- CHAT = "CHAT",
3
- EMBED = "EMBED"
4
- }
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IOperationType = void 0;
4
- var IOperationType;
5
- (function (IOperationType) {
6
- IOperationType["CHAT"] = "CHAT";
7
- IOperationType["EMBED"] = "EMBED";
8
- })(IOperationType || (exports.IOperationType = IOperationType = {}));
@@ -1,8 +0,0 @@
1
- export interface ISubscriber {
2
- id: string;
3
- email: string;
4
- credential: {
5
- name: string;
6
- value: string;
7
- };
8
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,7 +0,0 @@
1
- export interface ITokenCounts {
2
- inputTokens: number;
3
- outputTokens: number;
4
- totalTokens: number;
5
- cachedTokens?: number;
6
- reasoningTokens?: number;
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,27 +0,0 @@
1
- export interface IUsageMetadata {
2
- traceId?: string;
3
- taskType?: string;
4
- subscriberEmail?: string;
5
- subscriberId?: string;
6
- subscriberCredentialName?: string;
7
- subscriberCredential?: string;
8
- organizationId?: string;
9
- subscriptionId?: string;
10
- productId?: string;
11
- agent?: string;
12
- responseQualityScore?: number;
13
- transactionId?: string;
14
- timeToFirstToken?: number;
15
- requestTime?: Date;
16
- completionStartTime?: Date;
17
- operationType?: string;
18
- inputTokenCount?: number;
19
- outputTokenCount?: number;
20
- reasoningTokenCount?: number;
21
- cacheCreationTokenCount?: number;
22
- cacheReadTokenCount?: number;
23
- totalTokenCount?: number;
24
- responseTime?: Date;
25
- requestDuration?: number;
26
- stopReason?: string;
27
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,22 +0,0 @@
1
- import OpenAI from "openai";
2
- import { IChatCompletionRequest } from "./interfaces/chatCompletionRequest";
3
- import { RequestOptions } from "openai/internal/request-options";
4
- export declare class PerplexityReveniumMiddleware {
5
- private client;
6
- private working;
7
- private modelName;
8
- constructor();
9
- getGenerativeModel(model: string): {
10
- createChatCompletion: (params: IChatCompletionRequest) => Promise<OpenAI.Chat.Completions.ChatCompletion & {
11
- _request_id?: string | null | undefined;
12
- }>;
13
- createChatCompletionStream: (params: IChatCompletionRequest) => Promise<import("openai/core/streaming").Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {
14
- _request_id?: string | null;
15
- }>;
16
- createEmbeddings: (_body: Omit<OpenAI.Embeddings.EmbeddingCreateParams, "model">, _options?: RequestOptions) => Promise<void>;
17
- };
18
- private embeddings;
19
- private streamingChatCompletion;
20
- private chatCompletion;
21
- private verifyEnv;
22
- }
@@ -1,129 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PerplexityReveniumMiddleware = void 0;
7
- const openai_1 = __importDefault(require("openai"));
8
- const utils_1 = require("./utils");
9
- const Logger_1 = require("./models/Logger");
10
- const Metering_1 = require("./models/Metering");
11
- const operation_1 = require("./interfaces/operation");
12
- const extractTokenCount_1 = require("./utils/extractTokenCount");
13
- class PerplexityReveniumMiddleware {
14
- constructor() {
15
- this.working = true;
16
- this.modelName = "";
17
- this.embeddings = async (_body, _options) => { };
18
- this.streamingChatCompletion = async (params) => {
19
- var _a;
20
- const startTime = new Date();
21
- try {
22
- const { usageMetadata, ...openaiParams } = params;
23
- const requestParams = {
24
- ...openaiParams,
25
- model: this.modelName,
26
- };
27
- const result = await ((_a = this.client) === null || _a === void 0 ? void 0 : _a.chat.completions.create({
28
- ...requestParams,
29
- stream: true,
30
- }));
31
- if (!this.working) {
32
- Logger_1.logger.warning("Metering is not working. Check your configuration.");
33
- return result;
34
- }
35
- const tokenCounts = (0, extractTokenCount_1.extractGoogleAITokenCounts)(result);
36
- const endTime = new Date();
37
- Logger_1.logger.info("Metering is working.");
38
- const metering = new Metering_1.Metering(utils_1.REVENIUM_METERING_API_KEY !== null && utils_1.REVENIUM_METERING_API_KEY !== void 0 ? utils_1.REVENIUM_METERING_API_KEY : "", utils_1.REVENIUM_METERING_BASE_URL !== null && utils_1.REVENIUM_METERING_BASE_URL !== void 0 ? utils_1.REVENIUM_METERING_BASE_URL : "");
39
- const getMetering = metering.createMetering({
40
- modelName: this.modelName,
41
- endTime,
42
- startTime,
43
- operationType: operation_1.IOperationType.CHAT,
44
- stopReason: "END",
45
- tokenCounts,
46
- usageMetadata,
47
- }, true);
48
- await metering.sendMeteringData(getMetering);
49
- return result;
50
- }
51
- catch (error) {
52
- throw error;
53
- }
54
- };
55
- this.chatCompletion = async (params) => {
56
- var _a;
57
- const startTime = new Date();
58
- try {
59
- const { usageMetadata, ...openaiParams } = params;
60
- const requestParams = {
61
- ...openaiParams,
62
- model: this.modelName,
63
- };
64
- const result = await ((_a = this.client) === null || _a === void 0 ? void 0 : _a.chat.completions.create({
65
- ...requestParams,
66
- stream: false,
67
- }));
68
- if (!this.working) {
69
- Logger_1.logger.warning("Metering is not working. Check your configuration.");
70
- return result;
71
- }
72
- const tokenCounts = (0, extractTokenCount_1.extractGoogleAITokenCounts)(result);
73
- const endTime = new Date();
74
- Logger_1.logger.info(" Metering is working.");
75
- const metering = new Metering_1.Metering(utils_1.REVENIUM_METERING_API_KEY !== null && utils_1.REVENIUM_METERING_API_KEY !== void 0 ? utils_1.REVENIUM_METERING_API_KEY : "", utils_1.REVENIUM_METERING_BASE_URL !== null && utils_1.REVENIUM_METERING_BASE_URL !== void 0 ? utils_1.REVENIUM_METERING_BASE_URL : "");
76
- const getMetering = metering.createMetering({
77
- modelName: this.modelName,
78
- endTime,
79
- startTime,
80
- operationType: operation_1.IOperationType.CHAT,
81
- stopReason: "END",
82
- tokenCounts,
83
- usageMetadata,
84
- }, false);
85
- await metering.sendMeteringData(getMetering);
86
- return result;
87
- }
88
- catch (error) {
89
- throw error;
90
- }
91
- };
92
- this.verifyEnv();
93
- this.client = new openai_1.default({
94
- apiKey: utils_1.PERPLEXITY_API_KEY,
95
- baseURL: utils_1.PERPLEXITY_API_BASE_URL,
96
- });
97
- Logger_1.logger.info(utils_1.PERPLEXITY_CLIENT_INITIALIZED_MESSAGE);
98
- }
99
- getGenerativeModel(model) {
100
- this.modelName = model;
101
- if (!utils_1.models.includes(model)) {
102
- throw new Error(`Model ${model} is not supported`);
103
- }
104
- return {
105
- createChatCompletion: this.chatCompletion,
106
- createChatCompletionStream: this.streamingChatCompletion,
107
- createEmbeddings: this.embeddings,
108
- };
109
- }
110
- verifyEnv() {
111
- if (!utils_1.PERPLEXITY_API_KEY) {
112
- Logger_1.logger.error(utils_1.PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
113
- throw new Error(utils_1.PERPLEXITY_REQUIRED_API_KEY_MESSAGE);
114
- }
115
- if (!utils_1.PERPLEXITY_API_KEY.includes("pplx-")) {
116
- Logger_1.logger.error(utils_1.PERPLEXITY_API_KEY_INVALID_MESSAGE);
117
- throw new Error(utils_1.PERPLEXITY_API_KEY_INVALID_MESSAGE);
118
- }
119
- if (!utils_1.REVENIUM_METERING_API_KEY) {
120
- Logger_1.logger.warning(utils_1.PERPLEXITY_METERING_API_KEY_IS_NOT_SET_MESSAGE);
121
- this.working = false;
122
- }
123
- if (!utils_1.REVENIUM_METERING_BASE_URL) {
124
- Logger_1.logger.warning(utils_1.PERPLEXITY_METERING_BASE_URL_IS_NOT_SET_MESSAGE);
125
- this.working = false;
126
- }
127
- }
128
- }
129
- exports.PerplexityReveniumMiddleware = PerplexityReveniumMiddleware;
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.logger = exports.Logger = void 0;
4
- const utils_1 = require("../utils");
5
- class Logger {
6
- static debug(message, data) {
7
- if (this.shouldLog(utils_1.LOG_LEVELS[0])) {
8
- console.log(`[${utils_1.LOG_LEVELS[0]}] ${message}`, data || "");
9
- }
10
- }
11
- static info(message, data) {
12
- if (this.shouldLog(utils_1.LOG_LEVELS[1])) {
13
- console.log(`[${utils_1.LOG_LEVELS[1]}] ${message}`, data || "");
14
- }
15
- }
16
- static warning(message, data) {
17
- if (this.shouldLog(utils_1.LOG_LEVELS[2])) {
18
- console.warn(`[${utils_1.LOG_LEVELS[2]}] ${message}`, data || "");
19
- }
20
- }
21
- static error(message, data) {
22
- if (this.shouldLog(utils_1.LOG_LEVELS[3])) {
23
- console.error(`[${utils_1.LOG_LEVELS[3]}] ${message}`, data || "");
24
- }
25
- }
26
- static shouldLog(level) {
27
- const levels = utils_1.LOG_LEVELS;
28
- const currentLevel = levels.indexOf(this.logLevel.toUpperCase());
29
- const messageLevel = levels.indexOf(level);
30
- return messageLevel >= currentLevel;
31
- }
32
- }
33
- exports.Logger = Logger;
34
- Logger.logLevel = process.env.REVENIUM_LOG_LEVEL || "INFO";
35
- exports.logger = Logger;