@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.
Files changed (53) hide show
  1. package/README.md +61 -1
  2. package/dist/index.js +19 -19
  3. package/dist/interfaces/chatCompletionRequest.d.ts +2 -1
  4. package/dist/interfaces/credential.d.ts +4 -4
  5. package/dist/interfaces/credential.js +2 -2
  6. package/dist/interfaces/meteringRequest.d.ts +13 -13
  7. package/dist/interfaces/meteringResponse.d.ts +27 -27
  8. package/dist/interfaces/meteringResponse.js +2 -2
  9. package/dist/interfaces/operation.d.ts +4 -4
  10. package/dist/interfaces/operation.js +8 -8
  11. package/dist/interfaces/subscriber.d.ts +8 -8
  12. package/dist/interfaces/subscriber.js +2 -2
  13. package/dist/interfaces/tokenCounts.d.ts +7 -7
  14. package/dist/interfaces/tokenCounts.js +2 -2
  15. package/dist/interfaces/usageMetadata.d.ts +14 -0
  16. package/dist/middleware.d.ts +22 -22
  17. package/dist/middleware.js +2 -2
  18. package/dist/models/Logger.js +35 -35
  19. package/dist/models/Metering.d.ts +1 -1
  20. package/dist/models/Metering.js +28 -20
  21. package/dist/utils/calculateDurationMs.d.ts +1 -1
  22. package/dist/utils/calculateDurationMs.js +6 -6
  23. package/dist/utils/constants/constants.d.ts +6 -6
  24. package/dist/utils/constants/constants.js +11 -11
  25. package/dist/utils/constants/logLevels.d.ts +1 -1
  26. package/dist/utils/constants/logLevels.js +4 -4
  27. package/dist/utils/constants/messages.d.ts +5 -5
  28. package/dist/utils/constants/messages.js +8 -8
  29. package/dist/utils/constants/models.d.ts +1 -1
  30. package/dist/utils/constants/models.js +21 -21
  31. package/dist/utils/extractTokenCount.d.ts +2 -2
  32. package/dist/utils/extractTokenCount.js +28 -28
  33. package/dist/utils/formatTimeStamp.d.ts +1 -1
  34. package/dist/utils/formatTimeStamp.js +6 -6
  35. package/dist/utils/generateTransactionId.d.ts +1 -1
  36. package/dist/utils/generateTransactionId.js +7 -7
  37. package/dist/utils/index.d.ts +6 -6
  38. package/dist/utils/index.js +23 -23
  39. package/dist/utils/loadEnv.d.ts +1 -1
  40. package/dist/utils/loadEnv.js +7 -7
  41. package/dist/utils/safeExtract.d.ts +29 -29
  42. package/dist/utils/safeExtract.js +67 -67
  43. package/examples/metadata.ts +43 -0
  44. package/package.json +3 -2
  45. package/playground/basic.js +7 -11
  46. package/playground/chat-completions.js +22 -0
  47. package/playground/enhanced.js +6 -9
  48. package/playground/metadata.js +43 -0
  49. package/playground/streaming.js +2 -2
  50. package/src/interfaces/chatCompletionRequest.ts +2 -1
  51. package/src/interfaces/usageMetadata.ts +14 -0
  52. package/src/middleware.ts +24 -18
  53. package/src/models/Metering.ts +48 -20
@@ -1,6 +1,6 @@
1
1
  import { PerplexityReveniumMiddleware } from "@revenium/perplexity";
2
2
 
3
- const streamingExample = async () => {
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
- streamingExample();
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?: any;
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
- modelName: this.modelName,
75
- endTime,
76
- startTime,
77
- operationType: IOperationType.CHAT,
78
- stopReason: "END",
79
- tokenCounts,
80
- usageMetadata,
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
- modelName: this.modelName,
116
- endTime,
117
- startTime,
118
- operationType: IOperationType.CHAT,
119
- stopReason: "END",
120
- tokenCounts,
121
- usageMetadata,
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) {
@@ -21,39 +21,67 @@ export class Metering {
21
21
  this.endpoint = clientEndpoint;
22
22
  }
23
23
 
24
- public createMetering(metering: IMeteringRequest): IMeteringResponse {
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: false,
33
+ isStreamed,
30
34
  taskType: COST_TYPE,
31
- agent,
32
- operationType: metering.operationType.toString(),
33
- inputTokenCount: metering.tokenCounts.inputTokens,
34
- outputTokenCount: metering.tokenCounts.outputTokens,
35
- reasoningTokenCount: metering.tokenCounts.reasoningTokens || 0,
36
- cacheCreationTokenCount: metering.tokenCounts.cachedTokens || 0,
37
- cacheReadTokenCount: 0,
38
- totalTokenCount: metering.tokenCounts.totalTokens,
39
- organizationId: `my-customer-name-${generateTransactionId()}`,
40
- productId: PRODUCT_ID_FREE,
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: `user-@${agent.toLowerCase()}.ai`,
44
- credential: CURRENT_CREDENTIAL,
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: formatTimestamp(metering.startTime),
55
- completionStartTime: formatTimestamp(metering.endTime),
56
- timeToFirstToken: 0,
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
  }