@revenium/perplexity 1.0.19 → 1.0.21
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/README.md +61 -1
- package/dist/index.js +19 -19
- package/dist/interfaces/chatCompletionRequest.d.ts +2 -1
- package/dist/interfaces/credential.d.ts +4 -4
- package/dist/interfaces/credential.js +2 -2
- package/dist/interfaces/meteringRequest.d.ts +13 -13
- package/dist/interfaces/meteringResponse.d.ts +27 -27
- package/dist/interfaces/meteringResponse.js +2 -2
- package/dist/interfaces/operation.d.ts +4 -4
- package/dist/interfaces/operation.js +8 -8
- package/dist/interfaces/subscriber.d.ts +8 -8
- package/dist/interfaces/subscriber.js +2 -2
- package/dist/interfaces/tokenCounts.d.ts +7 -7
- package/dist/interfaces/tokenCounts.js +2 -2
- package/dist/interfaces/usageMetadata.d.ts +14 -0
- package/dist/middleware.d.ts +22 -22
- package/dist/middleware.js +2 -2
- package/dist/models/Logger.js +35 -35
- package/dist/models/Metering.d.ts +1 -1
- package/dist/models/Metering.js +28 -20
- package/dist/utils/calculateDurationMs.d.ts +1 -1
- package/dist/utils/calculateDurationMs.js +6 -6
- package/dist/utils/constants/constants.d.ts +6 -6
- package/dist/utils/constants/constants.js +11 -11
- package/dist/utils/constants/logLevels.d.ts +1 -1
- package/dist/utils/constants/logLevels.js +4 -4
- package/dist/utils/constants/messages.d.ts +5 -5
- package/dist/utils/constants/messages.js +8 -8
- package/dist/utils/constants/models.d.ts +1 -1
- package/dist/utils/constants/models.js +21 -21
- package/dist/utils/extractTokenCount.d.ts +2 -2
- package/dist/utils/extractTokenCount.js +28 -28
- package/dist/utils/formatTimeStamp.d.ts +1 -1
- package/dist/utils/formatTimeStamp.js +6 -6
- package/dist/utils/generateTransactionId.d.ts +1 -1
- package/dist/utils/generateTransactionId.js +7 -7
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.js +23 -23
- package/dist/utils/loadEnv.d.ts +1 -1
- package/dist/utils/loadEnv.js +7 -7
- package/dist/utils/safeExtract.d.ts +29 -29
- package/dist/utils/safeExtract.js +67 -67
- package/examples/metadata.ts +43 -0
- package/package.json +3 -2
- package/playground/basic.js +7 -11
- package/playground/chat-completions.js +22 -0
- package/playground/enhanced.js +6 -9
- package/playground/metadata.js +43 -0
- package/playground/streaming.js +2 -2
- package/src/interfaces/chatCompletionRequest.ts +2 -1
- package/src/interfaces/usageMetadata.ts +14 -0
- package/src/middleware.ts +24 -18
- package/src/models/Metering.ts +48 -20
package/playground/streaming.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const chatCompletionStreamingExample = async () => {
|
|
4
4
|
console.log("=".repeat(50));
|
|
5
5
|
try {
|
|
6
6
|
const middleware = new PerplexityReveniumMiddleware();
|
|
@@ -21,4 +21,4 @@ const streamingExample = async () => {
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
chatCompletionStreamingExample();
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ChatCompletionMessageParam } from "openai/resources/index";
|
|
2
|
+
import { IUsageMetadata } from "./usageMetadata";
|
|
2
3
|
|
|
3
4
|
export interface IChatCompletionRequest {
|
|
4
5
|
model?: string;
|
|
5
6
|
messages: ChatCompletionMessageParam[];
|
|
6
7
|
stream?: boolean;
|
|
7
|
-
usageMetadata?:
|
|
8
|
+
usageMetadata?: IUsageMetadata;
|
|
8
9
|
[key: string]: any;
|
|
9
10
|
}
|
|
@@ -10,4 +10,18 @@ export interface IUsageMetadata {
|
|
|
10
10
|
productId?: string;
|
|
11
11
|
agent?: string;
|
|
12
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;
|
|
13
27
|
}
|
package/src/middleware.ts
CHANGED
|
@@ -70,15 +70,18 @@ export class PerplexityReveniumMiddleware {
|
|
|
70
70
|
REVENIUM_METERING_API_KEY ?? "",
|
|
71
71
|
REVENIUM_METERING_BASE_URL ?? ""
|
|
72
72
|
);
|
|
73
|
-
const getMetering = metering.createMetering(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
+
);
|
|
82
85
|
await metering.sendMeteringData(getMetering);
|
|
83
86
|
return result;
|
|
84
87
|
} catch (error) {
|
|
@@ -111,15 +114,18 @@ export class PerplexityReveniumMiddleware {
|
|
|
111
114
|
REVENIUM_METERING_API_KEY ?? "",
|
|
112
115
|
REVENIUM_METERING_BASE_URL ?? ""
|
|
113
116
|
);
|
|
114
|
-
const getMetering = metering.createMetering(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
+
);
|
|
123
129
|
await metering.sendMeteringData(getMetering);
|
|
124
130
|
return result;
|
|
125
131
|
} catch (error) {
|
package/src/models/Metering.ts
CHANGED
|
@@ -21,39 +21,67 @@ export class Metering {
|
|
|
21
21
|
this.endpoint = clientEndpoint;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
public createMetering(
|
|
24
|
+
public createMetering(
|
|
25
|
+
metering: IMeteringRequest,
|
|
26
|
+
isStreamed: boolean
|
|
27
|
+
): IMeteringResponse {
|
|
28
|
+
const usageMetadata = metering.usageMetadata;
|
|
25
29
|
const agent: string = "perplexity";
|
|
26
30
|
return {
|
|
27
|
-
stopReason: metering.stopReason,
|
|
31
|
+
stopReason: usageMetadata?.stopReason ?? metering.stopReason,
|
|
28
32
|
costType: COST_TYPE,
|
|
29
|
-
isStreamed
|
|
33
|
+
isStreamed,
|
|
30
34
|
taskType: COST_TYPE,
|
|
31
|
-
agent,
|
|
32
|
-
operationType:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
agent: usageMetadata?.agent ?? agent,
|
|
36
|
+
operationType:
|
|
37
|
+
usageMetadata?.operationType ?? metering.operationType.toString(),
|
|
38
|
+
inputTokenCount:
|
|
39
|
+
usageMetadata?.inputTokenCount ?? metering.tokenCounts.inputTokens,
|
|
40
|
+
outputTokenCount:
|
|
41
|
+
usageMetadata?.outputTokenCount ?? metering.tokenCounts.outputTokens,
|
|
42
|
+
reasoningTokenCount:
|
|
43
|
+
usageMetadata?.reasoningTokenCount ??
|
|
44
|
+
metering.tokenCounts.reasoningTokens ??
|
|
45
|
+
0,
|
|
46
|
+
cacheCreationTokenCount:
|
|
47
|
+
usageMetadata?.cacheCreationTokenCount ??
|
|
48
|
+
metering.tokenCounts.cachedTokens ??
|
|
49
|
+
0,
|
|
50
|
+
cacheReadTokenCount: usageMetadata?.cacheReadTokenCount ?? 0,
|
|
51
|
+
totalTokenCount:
|
|
52
|
+
usageMetadata?.totalTokenCount ?? metering.tokenCounts.totalTokens,
|
|
53
|
+
organizationId:
|
|
54
|
+
usageMetadata?.organizationId ??
|
|
55
|
+
`my-customer-name-${generateTransactionId()}`,
|
|
56
|
+
productId: usageMetadata?.productId ?? PRODUCT_ID_FREE,
|
|
41
57
|
subscriber: {
|
|
42
|
-
id: `user-${generateTransactionId()}`,
|
|
43
|
-
email:
|
|
44
|
-
|
|
58
|
+
id: usageMetadata?.subscriberId ?? `user-${generateTransactionId()}`,
|
|
59
|
+
email:
|
|
60
|
+
usageMetadata?.subscriberEmail ?? `user-@${agent.toLowerCase()}.ai`,
|
|
61
|
+
credential:
|
|
62
|
+
usageMetadata?.subscriberCredentialName &&
|
|
63
|
+
usageMetadata?.subscriberCredential
|
|
64
|
+
? {
|
|
65
|
+
name: usageMetadata.subscriberCredentialName,
|
|
66
|
+
value: usageMetadata.subscriberCredential,
|
|
67
|
+
}
|
|
68
|
+
: CURRENT_CREDENTIAL,
|
|
45
69
|
},
|
|
46
70
|
model: metering.modelName,
|
|
47
|
-
transactionId: generateTransactionId(),
|
|
71
|
+
transactionId: usageMetadata?.transactionId ?? generateTransactionId(),
|
|
48
72
|
responseTime: formatTimestamp(metering.endTime),
|
|
49
73
|
requestDuration: calculateDurationMs(
|
|
50
74
|
metering.startTime,
|
|
51
75
|
metering.endTime
|
|
52
76
|
),
|
|
53
77
|
provider: agent,
|
|
54
|
-
requestTime:
|
|
55
|
-
|
|
56
|
-
|
|
78
|
+
requestTime:
|
|
79
|
+
usageMetadata?.requestTime?.toString() ??
|
|
80
|
+
formatTimestamp(metering.startTime),
|
|
81
|
+
completionStartTime:
|
|
82
|
+
usageMetadata?.completionStartTime?.toString() ??
|
|
83
|
+
formatTimestamp(metering.endTime),
|
|
84
|
+
timeToFirstToken: usageMetadata?.timeToFirstToken ?? 0,
|
|
57
85
|
middleware_source: MIDDLEWARE_SOURCE,
|
|
58
86
|
};
|
|
59
87
|
}
|