@revenium/perplexity 2.0.3 → 2.0.5

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 (183) hide show
  1. package/CHANGELOG.md +47 -10
  2. package/README.md +144 -720
  3. package/SECURITY.md +34 -0
  4. package/dist/cjs/constants/models.js +38 -0
  5. package/dist/cjs/constants/models.js.map +1 -0
  6. package/dist/cjs/core/client/index.js +13 -0
  7. package/dist/cjs/core/client/index.js.map +1 -0
  8. package/dist/cjs/core/client/manager.js +85 -0
  9. package/dist/cjs/core/client/manager.js.map +1 -0
  10. package/dist/cjs/core/config/index.js +21 -0
  11. package/dist/cjs/core/config/index.js.map +1 -0
  12. package/dist/cjs/core/config/loader.js +48 -0
  13. package/dist/cjs/core/config/loader.js.map +1 -0
  14. package/dist/cjs/core/config/manager.js +77 -0
  15. package/dist/cjs/core/config/manager.js.map +1 -0
  16. package/dist/cjs/core/config/validator.js +45 -0
  17. package/dist/cjs/core/config/validator.js.map +1 -0
  18. package/dist/cjs/core/middleware/index.js +14 -0
  19. package/dist/cjs/core/middleware/index.js.map +1 -0
  20. package/dist/cjs/core/middleware/interfaces.js +94 -0
  21. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  22. package/dist/cjs/core/middleware/revenium-client.js +44 -0
  23. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  24. package/dist/cjs/core/middleware/streaming-wrapper.js +80 -0
  25. package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -0
  26. package/dist/cjs/core/providers/detector.js +38 -0
  27. package/dist/cjs/core/providers/detector.js.map +1 -0
  28. package/dist/cjs/core/providers/index.js +14 -0
  29. package/dist/cjs/core/providers/index.js.map +1 -0
  30. package/dist/cjs/core/tracking/api-client.js +67 -0
  31. package/dist/cjs/core/tracking/api-client.js.map +1 -0
  32. package/dist/cjs/core/tracking/index.js +21 -0
  33. package/dist/cjs/core/tracking/index.js.map +1 -0
  34. package/dist/cjs/core/tracking/payload-builder.js +95 -0
  35. package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
  36. package/dist/cjs/core/tracking/usage-tracker.js +83 -0
  37. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
  38. package/dist/cjs/index.js +60 -54
  39. package/dist/cjs/index.js.map +1 -0
  40. package/dist/cjs/types/function-parameters.js +14 -0
  41. package/dist/cjs/types/function-parameters.js.map +1 -0
  42. package/dist/cjs/types/index.js +20 -16
  43. package/dist/cjs/types/index.js.map +1 -0
  44. package/dist/cjs/utils/constants.js +20 -0
  45. package/dist/cjs/utils/constants.js.map +1 -0
  46. package/dist/cjs/utils/error-handler.js +194 -0
  47. package/dist/cjs/utils/error-handler.js.map +1 -0
  48. package/dist/cjs/utils/metadata-builder.js +191 -0
  49. package/dist/cjs/utils/metadata-builder.js.map +1 -0
  50. package/dist/cjs/utils/stop-reason-mapper.js +74 -0
  51. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
  52. package/dist/cjs/utils/transaction-id.js +19 -0
  53. package/dist/cjs/utils/transaction-id.js.map +1 -0
  54. package/dist/cjs/utils/url-builder.js +57 -0
  55. package/dist/cjs/utils/url-builder.js.map +1 -0
  56. package/dist/esm/constants/models.js +35 -0
  57. package/dist/esm/constants/models.js.map +1 -0
  58. package/dist/esm/core/client/index.js +5 -0
  59. package/dist/esm/core/client/index.js.map +1 -0
  60. package/dist/esm/core/client/manager.js +78 -0
  61. package/dist/esm/core/client/manager.js.map +1 -0
  62. package/dist/esm/core/config/index.js +11 -0
  63. package/dist/esm/core/config/index.js.map +1 -0
  64. package/dist/esm/core/config/loader.js +45 -0
  65. package/dist/esm/core/config/loader.js.map +1 -0
  66. package/dist/esm/core/config/manager.js +70 -0
  67. package/dist/esm/core/config/manager.js.map +1 -0
  68. package/dist/esm/core/config/validator.js +42 -0
  69. package/dist/esm/core/config/validator.js.map +1 -0
  70. package/dist/esm/core/middleware/index.js +7 -0
  71. package/dist/esm/core/middleware/index.js.map +1 -0
  72. package/dist/esm/core/middleware/interfaces.js +89 -0
  73. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  74. package/dist/esm/core/middleware/revenium-client.js +37 -0
  75. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  76. package/dist/esm/core/middleware/streaming-wrapper.js +76 -0
  77. package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -0
  78. package/dist/esm/core/providers/detector.js +34 -0
  79. package/dist/esm/core/providers/detector.js.map +1 -0
  80. package/dist/esm/core/providers/index.js +9 -0
  81. package/dist/esm/core/providers/index.js.map +1 -0
  82. package/dist/esm/core/tracking/api-client.js +64 -0
  83. package/dist/esm/core/tracking/api-client.js.map +1 -0
  84. package/dist/esm/core/tracking/index.js +13 -0
  85. package/dist/esm/core/tracking/index.js.map +1 -0
  86. package/dist/esm/core/tracking/payload-builder.js +92 -0
  87. package/dist/esm/core/tracking/payload-builder.js.map +1 -0
  88. package/dist/esm/core/tracking/usage-tracker.js +79 -0
  89. package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
  90. package/dist/esm/index.js +46 -36
  91. package/dist/esm/index.js.map +1 -0
  92. package/dist/esm/types/function-parameters.js +13 -0
  93. package/dist/esm/types/function-parameters.js.map +1 -0
  94. package/dist/esm/types/index.js +6 -15
  95. package/dist/esm/types/index.js.map +1 -0
  96. package/dist/esm/utils/constants.js +17 -0
  97. package/dist/esm/utils/constants.js.map +1 -0
  98. package/dist/esm/utils/error-handler.js +182 -0
  99. package/dist/esm/utils/error-handler.js.map +1 -0
  100. package/dist/esm/utils/metadata-builder.js +183 -0
  101. package/dist/esm/utils/metadata-builder.js.map +1 -0
  102. package/dist/esm/utils/stop-reason-mapper.js +69 -0
  103. package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
  104. package/dist/esm/utils/transaction-id.js +16 -0
  105. package/dist/esm/utils/transaction-id.js.map +1 -0
  106. package/dist/esm/utils/url-builder.js +53 -0
  107. package/dist/esm/utils/url-builder.js.map +1 -0
  108. package/dist/types/constants/models.d.ts +39 -0
  109. package/dist/types/constants/models.d.ts.map +1 -0
  110. package/dist/types/core/client/index.d.ts +5 -0
  111. package/dist/types/core/client/index.d.ts.map +1 -0
  112. package/dist/types/core/client/manager.d.ts +44 -0
  113. package/dist/types/core/client/manager.d.ts.map +1 -0
  114. package/dist/types/core/config/index.d.ts +10 -0
  115. package/dist/types/core/config/index.d.ts.map +1 -0
  116. package/dist/types/core/config/loader.d.ts +13 -0
  117. package/dist/types/core/config/loader.d.ts.map +1 -0
  118. package/dist/types/core/config/manager.d.ts +28 -0
  119. package/dist/types/core/config/manager.d.ts.map +1 -0
  120. package/dist/types/core/config/validator.d.ts +12 -0
  121. package/dist/types/core/config/validator.d.ts.map +1 -0
  122. package/dist/types/core/middleware/index.d.ts +7 -0
  123. package/dist/types/core/middleware/index.d.ts.map +1 -0
  124. package/dist/types/core/middleware/interfaces.d.ts +35 -0
  125. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  126. package/dist/types/core/middleware/revenium-client.d.ts +25 -0
  127. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  128. package/dist/types/core/middleware/streaming-wrapper.d.ts +21 -0
  129. package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -0
  130. package/dist/types/core/providers/detector.d.ts +24 -0
  131. package/dist/types/core/providers/detector.d.ts.map +1 -0
  132. package/dist/types/core/providers/index.d.ts +8 -0
  133. package/dist/types/core/providers/index.d.ts.map +1 -0
  134. package/dist/types/core/tracking/api-client.d.ts +17 -0
  135. package/dist/types/core/tracking/api-client.d.ts.map +1 -0
  136. package/dist/types/core/tracking/index.d.ts +11 -0
  137. package/dist/types/core/tracking/index.d.ts.map +1 -0
  138. package/dist/types/core/tracking/payload-builder.d.ts +24 -0
  139. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
  140. package/dist/types/core/tracking/usage-tracker.d.ts +30 -0
  141. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
  142. package/dist/types/index.d.ts +56 -27
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/types/function-parameters.d.ts +185 -0
  145. package/dist/types/types/function-parameters.d.ts.map +1 -0
  146. package/dist/types/types/index.d.ts +108 -137
  147. package/dist/types/types/index.d.ts.map +1 -0
  148. package/dist/types/utils/constants.d.ts +9 -0
  149. package/dist/types/utils/constants.d.ts.map +1 -0
  150. package/dist/types/utils/error-handler.d.ts +95 -0
  151. package/dist/types/utils/error-handler.d.ts.map +1 -0
  152. package/dist/types/utils/metadata-builder.d.ts +65 -0
  153. package/dist/types/utils/metadata-builder.d.ts.map +1 -0
  154. package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
  155. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
  156. package/dist/types/utils/transaction-id.d.ts +14 -0
  157. package/dist/types/utils/transaction-id.d.ts.map +1 -0
  158. package/dist/types/utils/url-builder.d.ts +22 -0
  159. package/dist/types/utils/url-builder.d.ts.map +1 -0
  160. package/examples/README.md +136 -233
  161. package/examples/advanced.ts +123 -0
  162. package/examples/basic.ts +36 -46
  163. package/examples/getting_started.ts +41 -0
  164. package/examples/metadata.ts +55 -59
  165. package/examples/stream.ts +53 -0
  166. package/package.json +12 -17
  167. package/dist/cjs/core/config/perplexity-config.js +0 -45
  168. package/dist/cjs/core/config/revenium-config.js +0 -80
  169. package/dist/cjs/core/tracking/metering.js +0 -131
  170. package/dist/cjs/core/wrapper/perplexity-client.js +0 -177
  171. package/dist/cjs/utils/logger.js +0 -23
  172. package/dist/esm/core/config/perplexity-config.js +0 -40
  173. package/dist/esm/core/config/revenium-config.js +0 -72
  174. package/dist/esm/core/tracking/metering.js +0 -126
  175. package/dist/esm/core/wrapper/perplexity-client.js +0 -170
  176. package/dist/esm/utils/logger.js +0 -20
  177. package/dist/types/core/config/perplexity-config.d.ts +0 -24
  178. package/dist/types/core/config/revenium-config.d.ts +0 -37
  179. package/dist/types/core/tracking/metering.d.ts +0 -31
  180. package/dist/types/core/wrapper/perplexity-client.d.ts +0 -32
  181. package/dist/types/utils/logger.d.ts +0 -10
  182. package/examples/chat.ts +0 -87
  183. package/examples/streaming.ts +0 -61
@@ -1,323 +1,226 @@
1
- # Revenium Perplexity AI Middleware Examples
1
+ # Revenium Perplexity Middleware - Examples
2
2
 
3
- Comprehensive examples demonstrating how to use the @revenium/perplexity middleware with automatic usage tracking and metering.
3
+ This directory contains examples demonstrating how to use the Revenium Perplexity middleware.
4
4
 
5
- ## TypeScript-First Approach
5
+ ## Prerequisites
6
6
 
7
- These examples are written in TypeScript to showcase type-safe development patterns. You can use them in both TypeScript and JavaScript projects:
7
+ Before running the examples, make sure you have:
8
8
 
9
- - **TypeScript projects**: Run examples directly with `tsx` or `ts-node`
10
- - **JavaScript projects**: See playground/ directory for JavaScript versions
9
+ 1. **Node.js 20 or later** installed
10
+ 2. **Revenium API Key** - Get one from [Revenium Dashboard](https://app.revenium.io)
11
+ 3. **Perplexity API Key** - Get one from [Perplexity Platform](https://www.perplexity.ai)
11
12
 
12
- **For npm users:** These examples are included in your `node_modules/@revenium/perplexity/examples/` directory after installation.
13
+ ## Setup
13
14
 
14
- **For GitHub users:** Clone the repository to run examples directly with the included npm scripts.
15
+ 1. **Clone the repository** (if you haven't already):
15
16
 
16
- ## Quick Start
17
+ ```bash
18
+ git clone https://github.com/revenium/revenium-middleware-perplexity-node.git
19
+ cd revenium-middleware-perplexity-node
20
+ ```
17
21
 
18
- ### 1. Installation
22
+ 2. **Install dependencies**:
19
23
 
20
- ```bash
21
- npm install @revenium/perplexity dotenv
22
- npm install --save-dev tsx # For TypeScript projects
23
- ```
24
+ ```bash
25
+ npm install
26
+ ```
24
27
 
25
- ### 2. Environment Setup
28
+ 3. **Configure environment variables**:
26
29
 
27
- Create a `.env` file in your project root:
30
+ Copy the `.env.example` file to `.env` and edit it with your API keys:
28
31
 
29
- ```env
30
- # Required: Your Perplexity API key
31
- PERPLEXITY_API_KEY=pplx_your_perplexity_key
32
+ ```bash
33
+ cp .env.example .env
34
+ ```
32
35
 
33
- # Required: Revenium metering API key
34
- REVENIUM_METERING_API_KEY=hak_your_revenium_key
35
- REVENIUM_METERING_BASE_URL=https://api.revenium.io/meter/v2
36
+ See [.env.example](https://github.com/revenium/revenium-middleware-perplexity-node/blob/HEAD/.env.example) for all available configuration options.
36
37
 
37
- # Optional: Perplexity base URL (defaults to https://api.perplexity.ai)
38
- PERPLEXITY_API_BASE_URL=https://api.perplexity.ai
38
+ ## Examples
39
39
 
40
- # Optional: Enable debug logging
41
- DEBUG=true
42
- ```
40
+ ### 1. Getting Started
43
41
 
44
- ### 3. Run Examples
42
+ **File:** `getting_started.ts`
45
43
 
46
- From the repository:
47
- ```bash
48
- npm run example:basic # Basic chat completion
49
- npm run example:streaming # Streaming responses
50
- npm run example:chat # Multi-turn conversations
51
- npm run example:metadata # Custom usage metadata
52
- ```
44
+ The simplest example to get you started with Revenium tracking:
45
+
46
+ - Initialize the middleware
47
+ - Create a basic chat completion
48
+ - Display response and usage metrics
49
+
50
+ **Run:**
53
51
 
54
- Or run all examples:
55
52
  ```bash
56
- npm test
53
+ npm run example:getting-started
54
+ # or
55
+ npx tsx examples/getting_started.ts
57
56
  ```
58
57
 
59
- ## Getting Started - Step by Step
58
+ **What it does:**
60
59
 
61
- ### Step 1: Create Your First Test
60
+ - Loads configuration from environment variables
61
+ - Creates a simple chat completion request
62
+ - Automatically sends metering data to Revenium API
63
+ - Displays the response
62
64
 
63
- **TypeScript:**
64
- ```typescript
65
- // test-perplexity.ts
66
- import { config } from "dotenv";
67
- import {
68
- initializeReveniumFromEnv,
69
- initializePerplexityFromEnv,
70
- createChatCompletion,
71
- } from "@revenium/perplexity";
65
+ ---
72
66
 
73
- config(); // Load .env file
67
+ ### 2. Basic Usage
74
68
 
75
- async function test() {
76
- // Initialize configurations
77
- initializeReveniumFromEnv();
78
- initializePerplexityFromEnv();
69
+ **File:** `basic.ts`
79
70
 
80
- // Create chat completion
81
- const result = await createChatCompletion({
82
- messages: [{ role: "user", content: "Hello!" }],
83
- model: "sonar-pro",
84
- });
71
+ Demonstrates standard Perplexity API usage:
85
72
 
86
- console.log(result.choices[0].message.content);
87
- }
73
+ - Chat completions with metadata
74
+ - Simple metadata tracking
88
75
 
89
- test();
90
- ```
76
+ **Run:**
91
77
 
92
- **JavaScript (CommonJS):**
93
- ```javascript
94
- // test-perplexity.js
95
- require("dotenv").config();
96
- const {
97
- initializeReveniumFromEnv,
98
- initializePerplexityFromEnv,
99
- createChatCompletion
100
- } = require("@revenium/perplexity");
101
-
102
- async function test() {
103
- initializeReveniumFromEnv();
104
- initializePerplexityFromEnv();
105
-
106
- const result = await createChatCompletion({
107
- messages: [{ role: "user", content: "Hello!" }],
108
- model: "sonar-pro",
109
- });
110
-
111
- console.log(result.choices[0].message.content);
112
- }
113
-
114
- test();
78
+ ```bash
79
+ npm run example:basic
80
+ # or
81
+ npx tsx examples/basic.ts
115
82
  ```
116
83
 
117
- ### Step 2: Update package.json
84
+ **What it does:**
118
85
 
119
- Add scripts to run your tests:
86
+ - Creates chat completions with metadata tracking
87
+ - Demonstrates basic metadata usage
120
88
 
121
- ```json
122
- {
123
- "scripts": {
124
- "test:perplexity": "tsx test-perplexity.ts"
125
- }
126
- }
127
- ```
89
+ ---
128
90
 
129
- Or for JavaScript:
130
- ```json
131
- {
132
- "scripts": {
133
- "test:perplexity": "node test-perplexity.js"
134
- }
135
- }
136
- ```
91
+ ### 3. Metadata
137
92
 
138
- ### Step 3: Run Your Tests
93
+ **File:** `metadata.ts`
94
+
95
+ Demonstrates all available metadata fields:
96
+
97
+ - Complete metadata structure
98
+ - All optional fields documented
99
+ - Subscriber information
100
+
101
+ **Run:**
139
102
 
140
103
  ```bash
141
- npm run test:perplexity
104
+ npm run example:metadata
105
+ # or
106
+ npx tsx examples/metadata.ts
142
107
  ```
143
108
 
144
- ### Step 4: Explore Advanced Features
109
+ **What it does:**
145
110
 
146
- Once basic integration works, explore the included examples:
147
- - `basic.ts` - Simple chat completions
148
- - `streaming.ts` - Real-time streaming responses
149
- - `chat.ts` - Multi-turn conversations with context
150
- - `metadata.ts` - Custom usage tracking and analytics
111
+ - Shows all available metadata fields
112
+ - Demonstrates subscriber tracking
113
+ - Includes organization and product tracking
151
114
 
152
- ### Step 5: Project Structure
115
+ **Metadata fields supported:**
153
116
 
154
- Recommended structure for your Perplexity AI project:
117
+ - `traceId` - Session or conversation tracking identifier
118
+ - `taskType` - Type of AI task being performed
119
+ - `agent` - AI agent or bot identifier
120
+ - `organizationId` - Organization identifier
121
+ - `productId` - Product or service identifier
122
+ - `subscriptionId` - Subscription tier identifier
123
+ - `responseQualityScore` - Quality rating (0.0-1.0)
124
+ - `subscriber` - Nested subscriber object with `id`, `email`, `credential` (with `name` and `value`)
155
125
 
156
- ```
157
- your-project/
158
- ├── .env # Your API keys (DON'T COMMIT!)
159
- ├── .env.example # Template for others
160
- ├── .gitignore # Include .env
161
- ├── package.json
162
- ├── src/
163
- │ ├── perplexity/
164
- │ │ ├── client.ts # Perplexity client setup
165
- │ │ └── prompts.ts # Your prompts
166
- │ └── index.ts
167
- └── tests/
168
- └── perplexity.test.ts
169
- ```
126
+ ---
170
127
 
171
- ## Available Examples
128
+ ### 4. Streaming
172
129
 
173
- ### basic.ts - Start Here
130
+ **File:** `stream.ts`
174
131
 
175
- Simple chat completion with automatic usage tracking.
132
+ Demonstrates streaming responses:
176
133
 
177
- **Features:**
178
- - Basic configuration initialization
179
- - Simple chat completion request
180
- - Automatic metering to Revenium
134
+ - Real-time token streaming
135
+ - Accumulating responses
136
+ - Streaming metrics
181
137
 
182
138
  **Run:**
139
+
183
140
  ```bash
184
- npm run example:basic
141
+ npm run example:stream
142
+ # or
143
+ npx tsx examples/stream.ts
185
144
  ```
186
145
 
187
- ### streaming.ts
146
+ **What it does:**
188
147
 
189
- Real-time streaming responses with usage tracking.
148
+ - Creates a streaming chat completion
149
+ - Displays tokens as they arrive in real-time
150
+ - Tracks streaming metrics
151
+ - Sends metering data after stream completes
190
152
 
191
- **Features:**
192
- - Streaming chat completions
193
- - Real-time content delivery
194
- - Automatic tracking when stream completes
153
+ ---
195
154
 
196
- **Run:**
197
- ```bash
198
- npm run example:streaming
199
- ```
155
+ ### 5. Advanced Features
200
156
 
201
- ### chat.ts
157
+ **File:** `advanced.ts`
202
158
 
203
- Multi-turn conversations with context.
159
+ Demonstrates advanced Perplexity features:
204
160
 
205
- **Features:**
206
- - Conversation history management
207
- - Context-aware responses
208
- - Multi-message interactions
161
+ - Multi-turn conversations
162
+ - Different temperature settings
163
+ - Multiple Perplexity models
209
164
 
210
165
  **Run:**
166
+
211
167
  ```bash
212
- npm run example:chat
168
+ npm run example:advanced
169
+ # or
170
+ npx tsx examples/advanced.ts
213
171
  ```
214
172
 
215
- ### metadata.ts
173
+ **What it does:**
216
174
 
217
- Custom usage metadata for advanced tracking.
175
+ - Demonstrates multi-turn conversation with system prompt
176
+ - Shows creative responses with higher temperature
177
+ - Uses sonar-reasoning model for complex reasoning tasks
218
178
 
219
- **Features:**
220
- - Custom subscriber information
221
- - Organization and product tracking
222
- - Quality scoring
223
- - Business analytics integration
179
+ ---
224
180
 
225
- **Run:**
226
- ```bash
227
- npm run example:metadata
228
- ```
181
+ ## Common Issues
229
182
 
230
- ## TypeScript Integration Patterns
183
+ ### "Client not initialized" error
231
184
 
232
- ### Pattern A: Direct Import (Recommended)
185
+ **Solution:** Make sure to call `Initialize()` before using `GetClient()`.
233
186
 
234
- ```typescript
235
- import {
236
- initializeReveniumFromEnv,
237
- initializePerplexityFromEnv,
238
- createChatCompletion
239
- } from "@revenium/perplexity";
240
- ```
187
+ ### "REVENIUM_METERING_API_KEY is required" error
241
188
 
242
- ### Pattern B: Manual Configuration
189
+ **Solution:** Set the `REVENIUM_METERING_API_KEY` environment variable in your `.env` file.
243
190
 
244
- ```typescript
245
- import {
246
- initializeRevenium,
247
- initializePerplexity,
248
- createChatCompletion
249
- } from "@revenium/perplexity";
191
+ ### "invalid Revenium API key format" error
250
192
 
251
- // Manual configuration
252
- initializeRevenium({
253
- apiKey: process.env.REVENIUM_METERING_API_KEY!,
254
- baseUrl: "https://api.revenium.io/meter/v2"
255
- });
193
+ **Solution:** Revenium API keys should start with `hak_`. Check your API key format.
256
194
 
257
- initializePerplexity({
258
- apiKey: process.env.PERPLEXITY_API_KEY!
259
- });
260
- ```
195
+ ### Environment variables not loading
261
196
 
262
- ### Pattern C: With Custom Metadata
263
-
264
- ```typescript
265
- const result = await createChatCompletion({
266
- messages: [{ role: "user", content: "Hello" }],
267
- model: "sonar-pro",
268
- usageMetadata: {
269
- subscriberId: "user-123",
270
- subscriberEmail: "user@example.com",
271
- organizationId: "acme-corp",
272
- productId: "chat-app"
273
- }
274
- });
275
- ```
276
-
277
- ## Troubleshooting
197
+ **Solution:** Make sure your `.env` file is in the project root directory and contains the required variables.
278
198
 
279
- ### Common Issues
199
+ ### Perplexity API errors
280
200
 
281
- 1. **Module not found**: Ensure you've run `npm install @revenium/perplexity`
282
- 2. **Environment variables not loading**: Verify your `.env` file exists and `dotenv` is configured
283
- 3. **API key errors**: Check both Perplexity and Revenium API keys are valid
284
- 4. **TypeScript errors**: Ensure you have `tsx` or `ts-node` installed for TypeScript projects
201
+ **Solution:** Make sure you have set `PERPLEXITY_API_KEY` in your `.env` file and that it starts with `pplx-`.
285
202
 
286
203
  ### Debug Mode
287
204
 
288
- Enable debug logging to troubleshoot issues:
205
+ Enable detailed logging to troubleshoot issues:
289
206
 
290
207
  ```bash
291
- DEBUG=true npm run example:basic
292
- ```
293
-
294
- ### Expected Output
295
-
296
- When running examples successfully:
297
- ```
298
- Basic Chat Completion Example
299
-
300
- Initializing configurations...
301
- Configurations initialized
302
-
303
- Creating chat completion...
304
- Chat completion created
208
+ # In .env file
209
+ REVENIUM_DEBUG=true
305
210
 
306
- Response: [AI response here]
307
- Usage: { prompt_tokens: X, completion_tokens: Y, total_tokens: Z }
211
+ # Then run examples
212
+ npm run example:getting-started
308
213
  ```
309
214
 
310
- ## JavaScript Playground
215
+ ## Next Steps
311
216
 
312
- For JavaScript users, see the `playground/` directory for CommonJS versions of all examples:
313
-
314
- - `playground/basic.js`
315
- - `playground/streaming.js`
316
- - `playground/chat.js`
317
- - `playground/metadata.js`
217
+ - Check the [main README](https://github.com/revenium/revenium-middleware-perplexity-node/blob/HEAD/README.md) for detailed documentation
218
+ - Visit the [Revenium Dashboard](https://app.revenium.io) to view your metering data
219
+ - See [.env.example](https://github.com/revenium/revenium-middleware-perplexity-node/blob/HEAD/.env.example) for all configuration options
318
220
 
319
221
  ## Support
320
222
 
223
+ For issues or questions:
224
+
321
225
  - Documentation: https://docs.revenium.io
322
- - GitHub Issues: https://github.com/revenium/revenium-middleware-perplexity-node/issues
323
226
  - Email: support@revenium.io
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Advanced Example
3
+ * Demonstrates advanced features like system prompts, conversation history,
4
+ * and different model parameters with Revenium Perplexity middleware.
5
+ */
6
+
7
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/perplexity";
8
+
9
+ async function main() {
10
+ // Initialize middleware
11
+ Initialize();
12
+
13
+ // Get client
14
+ const client = GetClient();
15
+
16
+ // Metadata for tracking
17
+ const metadata: UsageMetadata = {
18
+ organizationId: "org-advanced-demo",
19
+ productId: "prod-perplexity-advanced",
20
+ taskType: "multi-turn-conversation",
21
+ subscriber: {
22
+ id: "user-advanced-001",
23
+ email: "advanced@example.com",
24
+ },
25
+ };
26
+
27
+ console.log("=== Advanced Perplexity Example ===\n");
28
+
29
+ // Example 1: Using system prompt and conversation history
30
+ console.log("1. Multi-turn conversation with system prompt:\n");
31
+
32
+ const response1 = await client
33
+ .chat()
34
+ .completions()
35
+ .create(
36
+ {
37
+ model: "sonar-pro",
38
+ messages: [
39
+ {
40
+ role: "system",
41
+ content:
42
+ "You are a helpful AI assistant that provides concise, accurate answers.",
43
+ },
44
+ {
45
+ role: "user",
46
+ content: "What is the capital of France?",
47
+ },
48
+ {
49
+ role: "assistant",
50
+ content: "The capital of France is Paris.",
51
+ },
52
+ {
53
+ role: "user",
54
+ content: "What is its population?",
55
+ },
56
+ ],
57
+ max_tokens: 500,
58
+ temperature: 0.7,
59
+ },
60
+ metadata
61
+ );
62
+
63
+ console.log(`Assistant: ${response1.choices[0].message.content}\n`);
64
+ console.log(`Tokens used: ${response1.usage?.total_tokens}\n`);
65
+
66
+ // Example 2: Using different temperature for creative responses
67
+ console.log("2. Creative response with higher temperature:\n");
68
+
69
+ const response2 = await client
70
+ .chat()
71
+ .completions()
72
+ .create(
73
+ {
74
+ model: "sonar-pro",
75
+ messages: [
76
+ {
77
+ role: "user",
78
+ content:
79
+ "Write a creative tagline for an AI company in 10 words or less.",
80
+ },
81
+ ],
82
+ max_tokens: 100,
83
+ temperature: 1.0, // Higher temperature for more creativity
84
+ },
85
+ {
86
+ ...metadata,
87
+ taskType: "creative-generation",
88
+ }
89
+ );
90
+
91
+ console.log(`Assistant: ${response2.choices[0].message.content}\n`);
92
+
93
+ // Example 3: Using sonar-reasoning for complex reasoning tasks
94
+ console.log("3. Complex reasoning with sonar-reasoning model:\n");
95
+
96
+ const response3 = await client
97
+ .chat()
98
+ .completions()
99
+ .create(
100
+ {
101
+ model: "sonar-reasoning",
102
+ messages: [
103
+ {
104
+ role: "user",
105
+ content:
106
+ "If a train travels 120 km in 2 hours, and then 180 km in 3 hours, what is its average speed for the entire journey?",
107
+ },
108
+ ],
109
+ max_tokens: 500,
110
+ },
111
+ {
112
+ ...metadata,
113
+ taskType: "reasoning",
114
+ }
115
+ );
116
+
117
+ console.log(`Assistant: ${response3.choices[0].message.content}\n`);
118
+ console.log(`Tokens used: ${response3.usage?.total_tokens}\n`);
119
+
120
+ console.log("\nAll usage data sent to Revenium! Check your dashboard");
121
+ }
122
+
123
+ main().catch(console.error);
package/examples/basic.ts CHANGED
@@ -1,55 +1,45 @@
1
1
  /**
2
- * Basic Chat Completion Example
3
- *
4
- * This example demonstrates how to use the Perplexity middleware
5
- * to create a simple chat completion with Revenium metering.
2
+ * Basic Example
3
+ * Demonstrates basic usage of Revenium Perplexity middleware.
6
4
  */
7
5
 
8
- import {
9
- initializeReveniumFromEnv,
10
- initializePerplexityFromEnv,
11
- createChatCompletion,
12
- PERPLEXITY_MODELS,
13
- } from "../src";
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/perplexity";
14
7
 
15
8
  async function main() {
16
- console.log("Basic Chat Completion Example\n");
17
-
18
- // Initialize configurations from environment variables
19
- console.log("Initializing configurations...");
20
- initializeReveniumFromEnv();
21
- initializePerplexityFromEnv();
22
- console.log("Configurations initialized\n");
23
-
24
- // Create a simple chat completion
25
- console.log("Creating chat completion...");
26
- const result = await createChatCompletion({
27
- messages: [
9
+ // Initialize middleware
10
+ Initialize();
11
+
12
+ // Get client
13
+ const client = GetClient();
14
+ const metadata: UsageMetadata = {
15
+ organizationId: "org-basic-demo",
16
+ productId: "prod-perplexity-basic",
17
+ };
18
+
19
+ // Create chat completion
20
+ const response = await client
21
+ .chat()
22
+ .completions()
23
+ .create(
28
24
  {
29
- role: "user",
30
- content: "What is the capital of France? Answer in one sentence.",
25
+ model: "sonar-pro",
26
+ messages: [
27
+ {
28
+ role: "user",
29
+ content:
30
+ "Say hello in Spanish and explain why Spanish is a beautiful language in 2-3 sentences.",
31
+ },
32
+ ],
33
+ max_tokens: 1000,
31
34
  },
32
- ],
33
- model: PERPLEXITY_MODELS.SONAR_PRO,
34
- maxTokens: 100,
35
- });
36
-
37
- console.log("\nResponse:");
38
- console.log("─────────────────────────────────────────");
39
- console.log(`Content: ${result.content}`);
40
- console.log(`Model: ${result.model}`);
41
- console.log(`Transaction ID: ${result.transactionId}`);
42
- console.log(`\nToken Usage:`);
43
- console.log(` - Prompt Tokens: ${result.usage.promptTokens}`);
44
- console.log(` - Completion Tokens: ${result.usage.completionTokens}`);
45
- console.log(` - Total Tokens: ${result.usage.totalTokens}`);
46
- console.log("─────────────────────────────────────────\n");
47
-
48
- console.log("Example completed successfully!");
35
+ metadata
36
+ );
37
+
38
+ // Display response
39
+ if (response.choices.length > 0) {
40
+ console.log(`Assistant: ${response.choices[0].message.content}`);
41
+ }
42
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
49
43
  }
50
44
 
51
- main().catch((error) => {
52
- console.error("Error:", error.message);
53
- process.exit(1);
54
- });
55
-
45
+ main().catch(console.error);