@lavapayments/nodejs 0.1.0
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 +117 -0
- package/dist/index.d.mts +270 -0
- package/dist/index.d.ts +270 -0
- package/dist/index.js +228 -0
- package/dist/index.mjs +201 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# @lavapayments/nodejs
|
|
2
|
+
|
|
3
|
+
Backend SDK for Lava Payments API - enabling usage-based billing for AI services.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @lavapayments/nodejs
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Initialize the client
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import Lava from '@lavapayments/nodejs';
|
|
17
|
+
|
|
18
|
+
const lava = new Lava('your_secret_key', {
|
|
19
|
+
apiVersion: '2025-03-10.v1',
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Create a checkout session
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
const checkoutSession = await lava.checkout.create({
|
|
27
|
+
checkout_mode: 'onboarding', // or 'topup' for existing connections
|
|
28
|
+
origin_url: 'https://your-app.com/', // Must match window.location.origin where checkout will be opened
|
|
29
|
+
reference_id: 'user_123', // Optional: your user ID for tracking this connection
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Use checkout_session_token with @lavapayments/checkout on frontend
|
|
33
|
+
console.log(checkoutSession.checkout_session_token);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Make a request to an AI provider
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Generate a forward token
|
|
40
|
+
const forwardToken = lava.generateForwardToken({
|
|
41
|
+
connection_secret: 'connection_secret',
|
|
42
|
+
product_secret: 'product_secret',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Use the token to make an API request through Lava's proxy
|
|
46
|
+
const response = await fetch(lava.openaiUrl, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'Authorization': `Bearer ${forwardToken}`
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
model: 'gpt-4',
|
|
54
|
+
messages: [
|
|
55
|
+
{ role: 'user', content: 'Hello, world!' }
|
|
56
|
+
]
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Get the Lava request ID from the response header
|
|
61
|
+
const requestId = response.headers.get('x-lava-request-id');
|
|
62
|
+
console.log('Lava request ID:', requestId);
|
|
63
|
+
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
console.log(data);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Check a connection's balance
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
const connection = await lava.connections.retrieve('connection_id');
|
|
72
|
+
console.log('Current balance:', connection.wallet.balance);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Get connection requests
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
const requests = await lava.requests.list({
|
|
79
|
+
connection_id: 'connection_id',
|
|
80
|
+
limit: 10,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
console.log(requests.data);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Get usage statistics
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
const usage = await lava.usage.retrieve({
|
|
90
|
+
connection_id: 'connection_id',
|
|
91
|
+
start: '2024-01-01T00:00:00Z',
|
|
92
|
+
end: '2024-01-31T23:59:59Z',
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
console.log(usage);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Supported AI Providers
|
|
99
|
+
|
|
100
|
+
Convenience URLs are provided for the following AI providers:
|
|
101
|
+
|
|
102
|
+
- OpenAI: `lava.openaiUrl`
|
|
103
|
+
- Anthropic: `lava.anthropicUrl`
|
|
104
|
+
- Mistral: `lava.mistralUrl`
|
|
105
|
+
- DeepSeek: `lava.deepseekUrl`
|
|
106
|
+
- xAI: `lava.xaiUrl`
|
|
107
|
+
- Google: `lava.googleUrl`
|
|
108
|
+
|
|
109
|
+
For other providers, you can use the forward endpoint directly:
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
const url = `${lava.baseUrl}forward?u=https://api.yourprovider.com/endpoint`;
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Documentation
|
|
116
|
+
|
|
117
|
+
For more information, see the [Lava API documentation](https://docs.lavapayments.com).
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
type CheckoutMode = "onboarding" | "topup";
|
|
2
|
+
interface CreateCheckoutSessionParams {
|
|
3
|
+
checkout_mode: CheckoutMode;
|
|
4
|
+
origin_url: string;
|
|
5
|
+
reference_id?: string;
|
|
6
|
+
connection_id?: string;
|
|
7
|
+
}
|
|
8
|
+
interface CheckoutSession {
|
|
9
|
+
checkout_session_id: string;
|
|
10
|
+
checkout_session_token: string;
|
|
11
|
+
checkout_mode: CheckoutMode;
|
|
12
|
+
origin_url: string;
|
|
13
|
+
connection_id?: string;
|
|
14
|
+
reference_id?: string;
|
|
15
|
+
created_at: string;
|
|
16
|
+
completed_at?: string;
|
|
17
|
+
}
|
|
18
|
+
interface Wallet {
|
|
19
|
+
balance: string;
|
|
20
|
+
phone: string;
|
|
21
|
+
email: string;
|
|
22
|
+
first_name: string;
|
|
23
|
+
last_name: string;
|
|
24
|
+
}
|
|
25
|
+
interface Connection {
|
|
26
|
+
connection_id: string;
|
|
27
|
+
reference_id?: string;
|
|
28
|
+
wallet: Wallet;
|
|
29
|
+
created_at: string;
|
|
30
|
+
}
|
|
31
|
+
interface ConnectionsListParams {
|
|
32
|
+
cursor?: string;
|
|
33
|
+
limit?: number;
|
|
34
|
+
reference_id?: string;
|
|
35
|
+
}
|
|
36
|
+
interface ConnectionsListResponse {
|
|
37
|
+
data: Connection[];
|
|
38
|
+
has_more: boolean;
|
|
39
|
+
next_cursor?: string;
|
|
40
|
+
}
|
|
41
|
+
interface ModelUsage {
|
|
42
|
+
input_tokens: number;
|
|
43
|
+
output_tokens: number;
|
|
44
|
+
total_tokens: number;
|
|
45
|
+
input_cost: string;
|
|
46
|
+
output_cost: string;
|
|
47
|
+
total_cost: string;
|
|
48
|
+
}
|
|
49
|
+
interface FeeTierBreakdown {
|
|
50
|
+
tier: {
|
|
51
|
+
start: number;
|
|
52
|
+
rate: string;
|
|
53
|
+
};
|
|
54
|
+
tokens: number;
|
|
55
|
+
cost: string;
|
|
56
|
+
}
|
|
57
|
+
interface Fee {
|
|
58
|
+
amount: string;
|
|
59
|
+
rate_type: "fixed" | "percentage";
|
|
60
|
+
token_basis: "input+output" | "output";
|
|
61
|
+
breakdown: FeeTierBreakdown[];
|
|
62
|
+
}
|
|
63
|
+
interface ServiceCharge {
|
|
64
|
+
amount: string;
|
|
65
|
+
}
|
|
66
|
+
interface Request {
|
|
67
|
+
request_id: string;
|
|
68
|
+
connection_id: string;
|
|
69
|
+
product_id: string;
|
|
70
|
+
model: string;
|
|
71
|
+
endpoint: string;
|
|
72
|
+
response_id: string;
|
|
73
|
+
model_usage: ModelUsage;
|
|
74
|
+
fee: Fee;
|
|
75
|
+
service_charge: ServiceCharge;
|
|
76
|
+
total_request_cost: string;
|
|
77
|
+
timestamp: string;
|
|
78
|
+
created_at: string;
|
|
79
|
+
}
|
|
80
|
+
interface RequestsListParams {
|
|
81
|
+
cursor?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
connection_id?: string;
|
|
84
|
+
product_id?: string;
|
|
85
|
+
}
|
|
86
|
+
interface RequestsListResponse {
|
|
87
|
+
data: Request[];
|
|
88
|
+
has_more: boolean;
|
|
89
|
+
next_cursor?: string;
|
|
90
|
+
}
|
|
91
|
+
interface UsageData {
|
|
92
|
+
date: string;
|
|
93
|
+
total_usage_tokens: number;
|
|
94
|
+
total_usage_cost: string;
|
|
95
|
+
total_service_charge_amount: string;
|
|
96
|
+
total_request_cost: string;
|
|
97
|
+
}
|
|
98
|
+
interface UsageParams {
|
|
99
|
+
start: string;
|
|
100
|
+
end?: string;
|
|
101
|
+
connection_id?: string;
|
|
102
|
+
product_id?: string;
|
|
103
|
+
}
|
|
104
|
+
type Usage = UsageData[];
|
|
105
|
+
|
|
106
|
+
declare namespace Resources {
|
|
107
|
+
abstract class BaseResource {
|
|
108
|
+
protected lava: Lava;
|
|
109
|
+
constructor(lava: Lava);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checkout session related endpoints
|
|
113
|
+
*/
|
|
114
|
+
export class CheckoutResource extends BaseResource {
|
|
115
|
+
/**
|
|
116
|
+
* Create a checkout session
|
|
117
|
+
* @param params Checkout session parameters
|
|
118
|
+
* @returns Created checkout session
|
|
119
|
+
*/
|
|
120
|
+
create(params: CreateCheckoutSessionParams): Promise<CheckoutSession>;
|
|
121
|
+
/**
|
|
122
|
+
* Retrieve a checkout session
|
|
123
|
+
* @param checkoutSessionId Checkout session ID
|
|
124
|
+
* @returns Checkout session details
|
|
125
|
+
*/
|
|
126
|
+
retrieve(checkoutSessionId: string): Promise<CheckoutSession>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Connection related endpoints
|
|
130
|
+
*/
|
|
131
|
+
export class ConnectionsResource extends BaseResource {
|
|
132
|
+
/**
|
|
133
|
+
* List connections
|
|
134
|
+
* @param params List parameters
|
|
135
|
+
* @returns Paginated list of connections
|
|
136
|
+
*/
|
|
137
|
+
list(params?: ConnectionsListParams): Promise<ConnectionsListResponse>;
|
|
138
|
+
/**
|
|
139
|
+
* Retrieve a connection
|
|
140
|
+
* @param connectionId Connection ID
|
|
141
|
+
* @returns Connection details
|
|
142
|
+
*/
|
|
143
|
+
retrieve(connectionId: string): Promise<Connection>;
|
|
144
|
+
/**
|
|
145
|
+
* Delete a connection
|
|
146
|
+
* @param connectionId Connection ID
|
|
147
|
+
* @returns Success status
|
|
148
|
+
*/
|
|
149
|
+
delete(connectionId: string): Promise<{
|
|
150
|
+
success: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Request related endpoints
|
|
155
|
+
*/
|
|
156
|
+
export class RequestsResource extends BaseResource {
|
|
157
|
+
/**
|
|
158
|
+
* List requests
|
|
159
|
+
* @param params List parameters
|
|
160
|
+
* @returns Paginated list of requests
|
|
161
|
+
*/
|
|
162
|
+
list(params?: RequestsListParams): Promise<RequestsListResponse>;
|
|
163
|
+
/**
|
|
164
|
+
* Retrieve a request
|
|
165
|
+
* @param requestId Request ID
|
|
166
|
+
* @returns Request details
|
|
167
|
+
*/
|
|
168
|
+
retrieve(requestId: string): Promise<Request>;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Usage related endpoints
|
|
172
|
+
*/
|
|
173
|
+
export class UsageResource extends BaseResource {
|
|
174
|
+
/**
|
|
175
|
+
* Retrieve usage statistics
|
|
176
|
+
* @param params Usage parameters
|
|
177
|
+
* @returns Usage data
|
|
178
|
+
*/
|
|
179
|
+
retrieve(params: UsageParams): Promise<Usage>;
|
|
180
|
+
}
|
|
181
|
+
export { };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
type ApiVersion = "2025-03-10.v1";
|
|
185
|
+
interface Config {
|
|
186
|
+
apiVersion: ApiVersion;
|
|
187
|
+
/**
|
|
188
|
+
* Base URL for the API.
|
|
189
|
+
* If not provided, it will be inferred from the secret key (production or sandbox).
|
|
190
|
+
*/
|
|
191
|
+
baseUrl?: string;
|
|
192
|
+
}
|
|
193
|
+
type ForwardTokenOptions = {
|
|
194
|
+
connection_secret: string;
|
|
195
|
+
product_secret: string;
|
|
196
|
+
};
|
|
197
|
+
declare class Lava {
|
|
198
|
+
private readonly secretKey;
|
|
199
|
+
private readonly baseUrl;
|
|
200
|
+
private readonly apiVersion;
|
|
201
|
+
/**
|
|
202
|
+
* The checkout resource
|
|
203
|
+
*/
|
|
204
|
+
readonly checkout: Resources.CheckoutResource;
|
|
205
|
+
/**
|
|
206
|
+
* The connections resource
|
|
207
|
+
*/
|
|
208
|
+
readonly connections: Resources.ConnectionsResource;
|
|
209
|
+
/**
|
|
210
|
+
* The requests resource
|
|
211
|
+
*/
|
|
212
|
+
readonly requests: Resources.RequestsResource;
|
|
213
|
+
/**
|
|
214
|
+
* The usage resource
|
|
215
|
+
*/
|
|
216
|
+
readonly usage: Resources.UsageResource;
|
|
217
|
+
/**
|
|
218
|
+
* OpenAI base URL for convenience
|
|
219
|
+
*/
|
|
220
|
+
readonly openaiUrl: string;
|
|
221
|
+
/**
|
|
222
|
+
* Anthropic base URL for convenience
|
|
223
|
+
*/
|
|
224
|
+
readonly anthropicUrl: string;
|
|
225
|
+
/**
|
|
226
|
+
* Mistral base URL for convenience
|
|
227
|
+
*/
|
|
228
|
+
readonly mistralUrl: string;
|
|
229
|
+
/**
|
|
230
|
+
* DeepSeek base URL for convenience
|
|
231
|
+
*/
|
|
232
|
+
readonly deepseekUrl: string;
|
|
233
|
+
/**
|
|
234
|
+
* xAI base URL for convenience
|
|
235
|
+
*/
|
|
236
|
+
readonly xaiUrl: string;
|
|
237
|
+
/**
|
|
238
|
+
* Google base URL for convenience
|
|
239
|
+
*/
|
|
240
|
+
readonly googleUrl: string;
|
|
241
|
+
/**
|
|
242
|
+
* Google OpenAI-compatible base URL for convenience
|
|
243
|
+
*/
|
|
244
|
+
readonly googleOpenaiCompatibleUrl: string;
|
|
245
|
+
/**
|
|
246
|
+
* Create a new Lava client
|
|
247
|
+
* @param secretKey Your Lava secret key
|
|
248
|
+
* @param config Configuration options
|
|
249
|
+
*/
|
|
250
|
+
constructor(secretKey: string, config: Config);
|
|
251
|
+
/**
|
|
252
|
+
* Make a request to the Lava API
|
|
253
|
+
* @param method HTTP method
|
|
254
|
+
* @param path API path
|
|
255
|
+
* @param options Request options
|
|
256
|
+
* @returns Response data
|
|
257
|
+
*/
|
|
258
|
+
request<T>(method: string, path: string, { data, query }?: {
|
|
259
|
+
data?: any;
|
|
260
|
+
query?: Record<string, string>;
|
|
261
|
+
}): Promise<T>;
|
|
262
|
+
/**
|
|
263
|
+
* Generate a token for the forward endpoint
|
|
264
|
+
* @param options Token options
|
|
265
|
+
* @returns Base64 encoded token
|
|
266
|
+
*/
|
|
267
|
+
generateForwardToken(options: ForwardTokenOptions): string;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export { type ApiVersion, type CheckoutMode, type CheckoutSession, type Config, type Connection, type ConnectionsListParams, type ConnectionsListResponse, type CreateCheckoutSessionParams, type Fee, type FeeTierBreakdown, type ForwardTokenOptions, type ModelUsage, type Request, type RequestsListParams, type RequestsListResponse, Resources, type ServiceCharge, type Usage, type UsageData, type UsageParams, type Wallet, Lava as default };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
type CheckoutMode = "onboarding" | "topup";
|
|
2
|
+
interface CreateCheckoutSessionParams {
|
|
3
|
+
checkout_mode: CheckoutMode;
|
|
4
|
+
origin_url: string;
|
|
5
|
+
reference_id?: string;
|
|
6
|
+
connection_id?: string;
|
|
7
|
+
}
|
|
8
|
+
interface CheckoutSession {
|
|
9
|
+
checkout_session_id: string;
|
|
10
|
+
checkout_session_token: string;
|
|
11
|
+
checkout_mode: CheckoutMode;
|
|
12
|
+
origin_url: string;
|
|
13
|
+
connection_id?: string;
|
|
14
|
+
reference_id?: string;
|
|
15
|
+
created_at: string;
|
|
16
|
+
completed_at?: string;
|
|
17
|
+
}
|
|
18
|
+
interface Wallet {
|
|
19
|
+
balance: string;
|
|
20
|
+
phone: string;
|
|
21
|
+
email: string;
|
|
22
|
+
first_name: string;
|
|
23
|
+
last_name: string;
|
|
24
|
+
}
|
|
25
|
+
interface Connection {
|
|
26
|
+
connection_id: string;
|
|
27
|
+
reference_id?: string;
|
|
28
|
+
wallet: Wallet;
|
|
29
|
+
created_at: string;
|
|
30
|
+
}
|
|
31
|
+
interface ConnectionsListParams {
|
|
32
|
+
cursor?: string;
|
|
33
|
+
limit?: number;
|
|
34
|
+
reference_id?: string;
|
|
35
|
+
}
|
|
36
|
+
interface ConnectionsListResponse {
|
|
37
|
+
data: Connection[];
|
|
38
|
+
has_more: boolean;
|
|
39
|
+
next_cursor?: string;
|
|
40
|
+
}
|
|
41
|
+
interface ModelUsage {
|
|
42
|
+
input_tokens: number;
|
|
43
|
+
output_tokens: number;
|
|
44
|
+
total_tokens: number;
|
|
45
|
+
input_cost: string;
|
|
46
|
+
output_cost: string;
|
|
47
|
+
total_cost: string;
|
|
48
|
+
}
|
|
49
|
+
interface FeeTierBreakdown {
|
|
50
|
+
tier: {
|
|
51
|
+
start: number;
|
|
52
|
+
rate: string;
|
|
53
|
+
};
|
|
54
|
+
tokens: number;
|
|
55
|
+
cost: string;
|
|
56
|
+
}
|
|
57
|
+
interface Fee {
|
|
58
|
+
amount: string;
|
|
59
|
+
rate_type: "fixed" | "percentage";
|
|
60
|
+
token_basis: "input+output" | "output";
|
|
61
|
+
breakdown: FeeTierBreakdown[];
|
|
62
|
+
}
|
|
63
|
+
interface ServiceCharge {
|
|
64
|
+
amount: string;
|
|
65
|
+
}
|
|
66
|
+
interface Request {
|
|
67
|
+
request_id: string;
|
|
68
|
+
connection_id: string;
|
|
69
|
+
product_id: string;
|
|
70
|
+
model: string;
|
|
71
|
+
endpoint: string;
|
|
72
|
+
response_id: string;
|
|
73
|
+
model_usage: ModelUsage;
|
|
74
|
+
fee: Fee;
|
|
75
|
+
service_charge: ServiceCharge;
|
|
76
|
+
total_request_cost: string;
|
|
77
|
+
timestamp: string;
|
|
78
|
+
created_at: string;
|
|
79
|
+
}
|
|
80
|
+
interface RequestsListParams {
|
|
81
|
+
cursor?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
connection_id?: string;
|
|
84
|
+
product_id?: string;
|
|
85
|
+
}
|
|
86
|
+
interface RequestsListResponse {
|
|
87
|
+
data: Request[];
|
|
88
|
+
has_more: boolean;
|
|
89
|
+
next_cursor?: string;
|
|
90
|
+
}
|
|
91
|
+
interface UsageData {
|
|
92
|
+
date: string;
|
|
93
|
+
total_usage_tokens: number;
|
|
94
|
+
total_usage_cost: string;
|
|
95
|
+
total_service_charge_amount: string;
|
|
96
|
+
total_request_cost: string;
|
|
97
|
+
}
|
|
98
|
+
interface UsageParams {
|
|
99
|
+
start: string;
|
|
100
|
+
end?: string;
|
|
101
|
+
connection_id?: string;
|
|
102
|
+
product_id?: string;
|
|
103
|
+
}
|
|
104
|
+
type Usage = UsageData[];
|
|
105
|
+
|
|
106
|
+
declare namespace Resources {
|
|
107
|
+
abstract class BaseResource {
|
|
108
|
+
protected lava: Lava;
|
|
109
|
+
constructor(lava: Lava);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checkout session related endpoints
|
|
113
|
+
*/
|
|
114
|
+
export class CheckoutResource extends BaseResource {
|
|
115
|
+
/**
|
|
116
|
+
* Create a checkout session
|
|
117
|
+
* @param params Checkout session parameters
|
|
118
|
+
* @returns Created checkout session
|
|
119
|
+
*/
|
|
120
|
+
create(params: CreateCheckoutSessionParams): Promise<CheckoutSession>;
|
|
121
|
+
/**
|
|
122
|
+
* Retrieve a checkout session
|
|
123
|
+
* @param checkoutSessionId Checkout session ID
|
|
124
|
+
* @returns Checkout session details
|
|
125
|
+
*/
|
|
126
|
+
retrieve(checkoutSessionId: string): Promise<CheckoutSession>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Connection related endpoints
|
|
130
|
+
*/
|
|
131
|
+
export class ConnectionsResource extends BaseResource {
|
|
132
|
+
/**
|
|
133
|
+
* List connections
|
|
134
|
+
* @param params List parameters
|
|
135
|
+
* @returns Paginated list of connections
|
|
136
|
+
*/
|
|
137
|
+
list(params?: ConnectionsListParams): Promise<ConnectionsListResponse>;
|
|
138
|
+
/**
|
|
139
|
+
* Retrieve a connection
|
|
140
|
+
* @param connectionId Connection ID
|
|
141
|
+
* @returns Connection details
|
|
142
|
+
*/
|
|
143
|
+
retrieve(connectionId: string): Promise<Connection>;
|
|
144
|
+
/**
|
|
145
|
+
* Delete a connection
|
|
146
|
+
* @param connectionId Connection ID
|
|
147
|
+
* @returns Success status
|
|
148
|
+
*/
|
|
149
|
+
delete(connectionId: string): Promise<{
|
|
150
|
+
success: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Request related endpoints
|
|
155
|
+
*/
|
|
156
|
+
export class RequestsResource extends BaseResource {
|
|
157
|
+
/**
|
|
158
|
+
* List requests
|
|
159
|
+
* @param params List parameters
|
|
160
|
+
* @returns Paginated list of requests
|
|
161
|
+
*/
|
|
162
|
+
list(params?: RequestsListParams): Promise<RequestsListResponse>;
|
|
163
|
+
/**
|
|
164
|
+
* Retrieve a request
|
|
165
|
+
* @param requestId Request ID
|
|
166
|
+
* @returns Request details
|
|
167
|
+
*/
|
|
168
|
+
retrieve(requestId: string): Promise<Request>;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Usage related endpoints
|
|
172
|
+
*/
|
|
173
|
+
export class UsageResource extends BaseResource {
|
|
174
|
+
/**
|
|
175
|
+
* Retrieve usage statistics
|
|
176
|
+
* @param params Usage parameters
|
|
177
|
+
* @returns Usage data
|
|
178
|
+
*/
|
|
179
|
+
retrieve(params: UsageParams): Promise<Usage>;
|
|
180
|
+
}
|
|
181
|
+
export { };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
type ApiVersion = "2025-03-10.v1";
|
|
185
|
+
interface Config {
|
|
186
|
+
apiVersion: ApiVersion;
|
|
187
|
+
/**
|
|
188
|
+
* Base URL for the API.
|
|
189
|
+
* If not provided, it will be inferred from the secret key (production or sandbox).
|
|
190
|
+
*/
|
|
191
|
+
baseUrl?: string;
|
|
192
|
+
}
|
|
193
|
+
type ForwardTokenOptions = {
|
|
194
|
+
connection_secret: string;
|
|
195
|
+
product_secret: string;
|
|
196
|
+
};
|
|
197
|
+
declare class Lava {
|
|
198
|
+
private readonly secretKey;
|
|
199
|
+
private readonly baseUrl;
|
|
200
|
+
private readonly apiVersion;
|
|
201
|
+
/**
|
|
202
|
+
* The checkout resource
|
|
203
|
+
*/
|
|
204
|
+
readonly checkout: Resources.CheckoutResource;
|
|
205
|
+
/**
|
|
206
|
+
* The connections resource
|
|
207
|
+
*/
|
|
208
|
+
readonly connections: Resources.ConnectionsResource;
|
|
209
|
+
/**
|
|
210
|
+
* The requests resource
|
|
211
|
+
*/
|
|
212
|
+
readonly requests: Resources.RequestsResource;
|
|
213
|
+
/**
|
|
214
|
+
* The usage resource
|
|
215
|
+
*/
|
|
216
|
+
readonly usage: Resources.UsageResource;
|
|
217
|
+
/**
|
|
218
|
+
* OpenAI base URL for convenience
|
|
219
|
+
*/
|
|
220
|
+
readonly openaiUrl: string;
|
|
221
|
+
/**
|
|
222
|
+
* Anthropic base URL for convenience
|
|
223
|
+
*/
|
|
224
|
+
readonly anthropicUrl: string;
|
|
225
|
+
/**
|
|
226
|
+
* Mistral base URL for convenience
|
|
227
|
+
*/
|
|
228
|
+
readonly mistralUrl: string;
|
|
229
|
+
/**
|
|
230
|
+
* DeepSeek base URL for convenience
|
|
231
|
+
*/
|
|
232
|
+
readonly deepseekUrl: string;
|
|
233
|
+
/**
|
|
234
|
+
* xAI base URL for convenience
|
|
235
|
+
*/
|
|
236
|
+
readonly xaiUrl: string;
|
|
237
|
+
/**
|
|
238
|
+
* Google base URL for convenience
|
|
239
|
+
*/
|
|
240
|
+
readonly googleUrl: string;
|
|
241
|
+
/**
|
|
242
|
+
* Google OpenAI-compatible base URL for convenience
|
|
243
|
+
*/
|
|
244
|
+
readonly googleOpenaiCompatibleUrl: string;
|
|
245
|
+
/**
|
|
246
|
+
* Create a new Lava client
|
|
247
|
+
* @param secretKey Your Lava secret key
|
|
248
|
+
* @param config Configuration options
|
|
249
|
+
*/
|
|
250
|
+
constructor(secretKey: string, config: Config);
|
|
251
|
+
/**
|
|
252
|
+
* Make a request to the Lava API
|
|
253
|
+
* @param method HTTP method
|
|
254
|
+
* @param path API path
|
|
255
|
+
* @param options Request options
|
|
256
|
+
* @returns Response data
|
|
257
|
+
*/
|
|
258
|
+
request<T>(method: string, path: string, { data, query }?: {
|
|
259
|
+
data?: any;
|
|
260
|
+
query?: Record<string, string>;
|
|
261
|
+
}): Promise<T>;
|
|
262
|
+
/**
|
|
263
|
+
* Generate a token for the forward endpoint
|
|
264
|
+
* @param options Token options
|
|
265
|
+
* @returns Base64 encoded token
|
|
266
|
+
*/
|
|
267
|
+
generateForwardToken(options: ForwardTokenOptions): string;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export { type ApiVersion, type CheckoutMode, type CheckoutSession, type Config, type Connection, type ConnectionsListParams, type ConnectionsListResponse, type CreateCheckoutSessionParams, type Fee, type FeeTierBreakdown, type ForwardTokenOptions, type ModelUsage, type Request, type RequestsListParams, type RequestsListResponse, Resources, type ServiceCharge, type Usage, type UsageData, type UsageParams, type Wallet, Lava as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
Resources: () => Resources,
|
|
24
|
+
default: () => Lava
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
|
|
28
|
+
// src/resources.ts
|
|
29
|
+
var Resources;
|
|
30
|
+
((Resources2) => {
|
|
31
|
+
class BaseResource {
|
|
32
|
+
constructor(lava) {
|
|
33
|
+
this.lava = lava;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class CheckoutResource extends BaseResource {
|
|
37
|
+
/**
|
|
38
|
+
* Create a checkout session
|
|
39
|
+
* @param params Checkout session parameters
|
|
40
|
+
* @returns Created checkout session
|
|
41
|
+
*/
|
|
42
|
+
async create(params) {
|
|
43
|
+
return this.lava.request("POST", "checkout_sessions", {
|
|
44
|
+
data: params
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Retrieve a checkout session
|
|
49
|
+
* @param checkoutSessionId Checkout session ID
|
|
50
|
+
* @returns Checkout session details
|
|
51
|
+
*/
|
|
52
|
+
async retrieve(checkoutSessionId) {
|
|
53
|
+
return this.lava.request(
|
|
54
|
+
"GET",
|
|
55
|
+
`checkout_sessions/${checkoutSessionId}`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
Resources2.CheckoutResource = CheckoutResource;
|
|
60
|
+
class ConnectionsResource extends BaseResource {
|
|
61
|
+
/**
|
|
62
|
+
* List connections
|
|
63
|
+
* @param params List parameters
|
|
64
|
+
* @returns Paginated list of connections
|
|
65
|
+
*/
|
|
66
|
+
async list(params) {
|
|
67
|
+
const queryParams = {};
|
|
68
|
+
if (params) {
|
|
69
|
+
if (params.cursor) queryParams.cursor = params.cursor;
|
|
70
|
+
if (params.limit) queryParams.limit = params.limit.toString();
|
|
71
|
+
if (params.reference_id) queryParams.reference_id = params.reference_id;
|
|
72
|
+
}
|
|
73
|
+
return this.lava.request("GET", "connections", {
|
|
74
|
+
query: queryParams
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Retrieve a connection
|
|
79
|
+
* @param connectionId Connection ID
|
|
80
|
+
* @returns Connection details
|
|
81
|
+
*/
|
|
82
|
+
async retrieve(connectionId) {
|
|
83
|
+
return this.lava.request(
|
|
84
|
+
"GET",
|
|
85
|
+
`connections/${connectionId}`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Delete a connection
|
|
90
|
+
* @param connectionId Connection ID
|
|
91
|
+
* @returns Success status
|
|
92
|
+
*/
|
|
93
|
+
async delete(connectionId) {
|
|
94
|
+
return this.lava.request(
|
|
95
|
+
"DELETE",
|
|
96
|
+
`connections/${connectionId}`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
Resources2.ConnectionsResource = ConnectionsResource;
|
|
101
|
+
class RequestsResource extends BaseResource {
|
|
102
|
+
/**
|
|
103
|
+
* List requests
|
|
104
|
+
* @param params List parameters
|
|
105
|
+
* @returns Paginated list of requests
|
|
106
|
+
*/
|
|
107
|
+
async list(params) {
|
|
108
|
+
const queryParams = {};
|
|
109
|
+
if (params) {
|
|
110
|
+
if (params.cursor) queryParams.cursor = params.cursor;
|
|
111
|
+
if (params.limit) queryParams.limit = params.limit.toString();
|
|
112
|
+
if (params.connection_id)
|
|
113
|
+
queryParams.connection_id = params.connection_id;
|
|
114
|
+
if (params.product_id) queryParams.product_id = params.product_id;
|
|
115
|
+
}
|
|
116
|
+
return this.lava.request("GET", "requests", {
|
|
117
|
+
query: queryParams
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Retrieve a request
|
|
122
|
+
* @param requestId Request ID
|
|
123
|
+
* @returns Request details
|
|
124
|
+
*/
|
|
125
|
+
async retrieve(requestId) {
|
|
126
|
+
return this.lava.request("GET", `requests/${requestId}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
Resources2.RequestsResource = RequestsResource;
|
|
130
|
+
class UsageResource extends BaseResource {
|
|
131
|
+
/**
|
|
132
|
+
* Retrieve usage statistics
|
|
133
|
+
* @param params Usage parameters
|
|
134
|
+
* @returns Usage data
|
|
135
|
+
*/
|
|
136
|
+
async retrieve(params) {
|
|
137
|
+
const queryParams = {
|
|
138
|
+
start: params.start
|
|
139
|
+
};
|
|
140
|
+
if (params.end) queryParams.end = params.end;
|
|
141
|
+
if (params.connection_id)
|
|
142
|
+
queryParams.connection_id = params.connection_id;
|
|
143
|
+
if (params.product_id) queryParams.product_id = params.product_id;
|
|
144
|
+
return this.lava.request("GET", "usage", {
|
|
145
|
+
query: queryParams
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
Resources2.UsageResource = UsageResource;
|
|
150
|
+
})(Resources || (Resources = {}));
|
|
151
|
+
|
|
152
|
+
// src/index.ts
|
|
153
|
+
var Lava = class {
|
|
154
|
+
/**
|
|
155
|
+
* Create a new Lava client
|
|
156
|
+
* @param secretKey Your Lava secret key
|
|
157
|
+
* @param config Configuration options
|
|
158
|
+
*/
|
|
159
|
+
constructor(secretKey, config) {
|
|
160
|
+
this.secretKey = secretKey;
|
|
161
|
+
this.apiVersion = config.apiVersion;
|
|
162
|
+
const isTestMode = secretKey.startsWith("test_");
|
|
163
|
+
this.baseUrl = config.baseUrl || (isTestMode ? "https://sandbox-api.lavapayments.com/v1/" : "https://api.lavapayments.com/v1/");
|
|
164
|
+
this.checkout = new Resources.CheckoutResource(this);
|
|
165
|
+
this.connections = new Resources.ConnectionsResource(this);
|
|
166
|
+
this.requests = new Resources.RequestsResource(this);
|
|
167
|
+
this.usage = new Resources.UsageResource(this);
|
|
168
|
+
this.openaiUrl = `${this.baseUrl}forward?u=https://api.openai.com/v1`;
|
|
169
|
+
this.anthropicUrl = `${this.baseUrl}forward?u=https://api.anthropic.com/v1`;
|
|
170
|
+
this.mistralUrl = `${this.baseUrl}forward?u=https://api.mistral.ai/v1`;
|
|
171
|
+
this.deepseekUrl = `${this.baseUrl}forward?u=https://api.deepseek.com/v1`;
|
|
172
|
+
this.xaiUrl = `${this.baseUrl}forward?u=https://api.x.ai/v1`;
|
|
173
|
+
this.googleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta`;
|
|
174
|
+
this.googleOpenaiCompatibleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta/openai`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Make a request to the Lava API
|
|
178
|
+
* @param method HTTP method
|
|
179
|
+
* @param path API path
|
|
180
|
+
* @param options Request options
|
|
181
|
+
* @returns Response data
|
|
182
|
+
*/
|
|
183
|
+
async request(method, path, { data, query } = {}) {
|
|
184
|
+
const url = new URL(path, this.baseUrl);
|
|
185
|
+
if (query) {
|
|
186
|
+
Object.entries(query).forEach(([key, value]) => {
|
|
187
|
+
if (value !== void 0) {
|
|
188
|
+
url.searchParams.append(key, value.toString());
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const headers = {
|
|
193
|
+
Authorization: `Bearer ${this.secretKey}`,
|
|
194
|
+
"Content-Type": "application/json",
|
|
195
|
+
"X-Lava-API-Version": this.apiVersion
|
|
196
|
+
};
|
|
197
|
+
const requestOptions = {
|
|
198
|
+
method,
|
|
199
|
+
headers,
|
|
200
|
+
body: data ? JSON.stringify(data) : void 0
|
|
201
|
+
};
|
|
202
|
+
const response = await fetch(url.toString(), requestOptions);
|
|
203
|
+
if (!response.ok) {
|
|
204
|
+
const errorJson = await response.json().catch(() => ({}));
|
|
205
|
+
throw new Error(
|
|
206
|
+
`Lava API Error: ${response.status} ${response.statusText} - ${errorJson.error || "Unknown error"}`
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
return response.json();
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Generate a token for the forward endpoint
|
|
213
|
+
* @param options Token options
|
|
214
|
+
* @returns Base64 encoded token
|
|
215
|
+
*/
|
|
216
|
+
generateForwardToken(options) {
|
|
217
|
+
const tokenData = {
|
|
218
|
+
secret_key: this.secretKey,
|
|
219
|
+
connection_secret: options.connection_secret,
|
|
220
|
+
product_secret: options.product_secret
|
|
221
|
+
};
|
|
222
|
+
return Buffer.from(JSON.stringify(tokenData)).toString("base64");
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
226
|
+
0 && (module.exports = {
|
|
227
|
+
Resources
|
|
228
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// src/resources.ts
|
|
2
|
+
var Resources;
|
|
3
|
+
((Resources2) => {
|
|
4
|
+
class BaseResource {
|
|
5
|
+
constructor(lava) {
|
|
6
|
+
this.lava = lava;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
class CheckoutResource extends BaseResource {
|
|
10
|
+
/**
|
|
11
|
+
* Create a checkout session
|
|
12
|
+
* @param params Checkout session parameters
|
|
13
|
+
* @returns Created checkout session
|
|
14
|
+
*/
|
|
15
|
+
async create(params) {
|
|
16
|
+
return this.lava.request("POST", "checkout_sessions", {
|
|
17
|
+
data: params
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Retrieve a checkout session
|
|
22
|
+
* @param checkoutSessionId Checkout session ID
|
|
23
|
+
* @returns Checkout session details
|
|
24
|
+
*/
|
|
25
|
+
async retrieve(checkoutSessionId) {
|
|
26
|
+
return this.lava.request(
|
|
27
|
+
"GET",
|
|
28
|
+
`checkout_sessions/${checkoutSessionId}`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
Resources2.CheckoutResource = CheckoutResource;
|
|
33
|
+
class ConnectionsResource extends BaseResource {
|
|
34
|
+
/**
|
|
35
|
+
* List connections
|
|
36
|
+
* @param params List parameters
|
|
37
|
+
* @returns Paginated list of connections
|
|
38
|
+
*/
|
|
39
|
+
async list(params) {
|
|
40
|
+
const queryParams = {};
|
|
41
|
+
if (params) {
|
|
42
|
+
if (params.cursor) queryParams.cursor = params.cursor;
|
|
43
|
+
if (params.limit) queryParams.limit = params.limit.toString();
|
|
44
|
+
if (params.reference_id) queryParams.reference_id = params.reference_id;
|
|
45
|
+
}
|
|
46
|
+
return this.lava.request("GET", "connections", {
|
|
47
|
+
query: queryParams
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Retrieve a connection
|
|
52
|
+
* @param connectionId Connection ID
|
|
53
|
+
* @returns Connection details
|
|
54
|
+
*/
|
|
55
|
+
async retrieve(connectionId) {
|
|
56
|
+
return this.lava.request(
|
|
57
|
+
"GET",
|
|
58
|
+
`connections/${connectionId}`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Delete a connection
|
|
63
|
+
* @param connectionId Connection ID
|
|
64
|
+
* @returns Success status
|
|
65
|
+
*/
|
|
66
|
+
async delete(connectionId) {
|
|
67
|
+
return this.lava.request(
|
|
68
|
+
"DELETE",
|
|
69
|
+
`connections/${connectionId}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
Resources2.ConnectionsResource = ConnectionsResource;
|
|
74
|
+
class RequestsResource extends BaseResource {
|
|
75
|
+
/**
|
|
76
|
+
* List requests
|
|
77
|
+
* @param params List parameters
|
|
78
|
+
* @returns Paginated list of requests
|
|
79
|
+
*/
|
|
80
|
+
async list(params) {
|
|
81
|
+
const queryParams = {};
|
|
82
|
+
if (params) {
|
|
83
|
+
if (params.cursor) queryParams.cursor = params.cursor;
|
|
84
|
+
if (params.limit) queryParams.limit = params.limit.toString();
|
|
85
|
+
if (params.connection_id)
|
|
86
|
+
queryParams.connection_id = params.connection_id;
|
|
87
|
+
if (params.product_id) queryParams.product_id = params.product_id;
|
|
88
|
+
}
|
|
89
|
+
return this.lava.request("GET", "requests", {
|
|
90
|
+
query: queryParams
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Retrieve a request
|
|
95
|
+
* @param requestId Request ID
|
|
96
|
+
* @returns Request details
|
|
97
|
+
*/
|
|
98
|
+
async retrieve(requestId) {
|
|
99
|
+
return this.lava.request("GET", `requests/${requestId}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
Resources2.RequestsResource = RequestsResource;
|
|
103
|
+
class UsageResource extends BaseResource {
|
|
104
|
+
/**
|
|
105
|
+
* Retrieve usage statistics
|
|
106
|
+
* @param params Usage parameters
|
|
107
|
+
* @returns Usage data
|
|
108
|
+
*/
|
|
109
|
+
async retrieve(params) {
|
|
110
|
+
const queryParams = {
|
|
111
|
+
start: params.start
|
|
112
|
+
};
|
|
113
|
+
if (params.end) queryParams.end = params.end;
|
|
114
|
+
if (params.connection_id)
|
|
115
|
+
queryParams.connection_id = params.connection_id;
|
|
116
|
+
if (params.product_id) queryParams.product_id = params.product_id;
|
|
117
|
+
return this.lava.request("GET", "usage", {
|
|
118
|
+
query: queryParams
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
Resources2.UsageResource = UsageResource;
|
|
123
|
+
})(Resources || (Resources = {}));
|
|
124
|
+
|
|
125
|
+
// src/index.ts
|
|
126
|
+
var Lava = class {
|
|
127
|
+
/**
|
|
128
|
+
* Create a new Lava client
|
|
129
|
+
* @param secretKey Your Lava secret key
|
|
130
|
+
* @param config Configuration options
|
|
131
|
+
*/
|
|
132
|
+
constructor(secretKey, config) {
|
|
133
|
+
this.secretKey = secretKey;
|
|
134
|
+
this.apiVersion = config.apiVersion;
|
|
135
|
+
const isTestMode = secretKey.startsWith("test_");
|
|
136
|
+
this.baseUrl = config.baseUrl || (isTestMode ? "https://sandbox-api.lavapayments.com/v1/" : "https://api.lavapayments.com/v1/");
|
|
137
|
+
this.checkout = new Resources.CheckoutResource(this);
|
|
138
|
+
this.connections = new Resources.ConnectionsResource(this);
|
|
139
|
+
this.requests = new Resources.RequestsResource(this);
|
|
140
|
+
this.usage = new Resources.UsageResource(this);
|
|
141
|
+
this.openaiUrl = `${this.baseUrl}forward?u=https://api.openai.com/v1`;
|
|
142
|
+
this.anthropicUrl = `${this.baseUrl}forward?u=https://api.anthropic.com/v1`;
|
|
143
|
+
this.mistralUrl = `${this.baseUrl}forward?u=https://api.mistral.ai/v1`;
|
|
144
|
+
this.deepseekUrl = `${this.baseUrl}forward?u=https://api.deepseek.com/v1`;
|
|
145
|
+
this.xaiUrl = `${this.baseUrl}forward?u=https://api.x.ai/v1`;
|
|
146
|
+
this.googleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta`;
|
|
147
|
+
this.googleOpenaiCompatibleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta/openai`;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Make a request to the Lava API
|
|
151
|
+
* @param method HTTP method
|
|
152
|
+
* @param path API path
|
|
153
|
+
* @param options Request options
|
|
154
|
+
* @returns Response data
|
|
155
|
+
*/
|
|
156
|
+
async request(method, path, { data, query } = {}) {
|
|
157
|
+
const url = new URL(path, this.baseUrl);
|
|
158
|
+
if (query) {
|
|
159
|
+
Object.entries(query).forEach(([key, value]) => {
|
|
160
|
+
if (value !== void 0) {
|
|
161
|
+
url.searchParams.append(key, value.toString());
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
const headers = {
|
|
166
|
+
Authorization: `Bearer ${this.secretKey}`,
|
|
167
|
+
"Content-Type": "application/json",
|
|
168
|
+
"X-Lava-API-Version": this.apiVersion
|
|
169
|
+
};
|
|
170
|
+
const requestOptions = {
|
|
171
|
+
method,
|
|
172
|
+
headers,
|
|
173
|
+
body: data ? JSON.stringify(data) : void 0
|
|
174
|
+
};
|
|
175
|
+
const response = await fetch(url.toString(), requestOptions);
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
const errorJson = await response.json().catch(() => ({}));
|
|
178
|
+
throw new Error(
|
|
179
|
+
`Lava API Error: ${response.status} ${response.statusText} - ${errorJson.error || "Unknown error"}`
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
return response.json();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate a token for the forward endpoint
|
|
186
|
+
* @param options Token options
|
|
187
|
+
* @returns Base64 encoded token
|
|
188
|
+
*/
|
|
189
|
+
generateForwardToken(options) {
|
|
190
|
+
const tokenData = {
|
|
191
|
+
secret_key: this.secretKey,
|
|
192
|
+
connection_secret: options.connection_secret,
|
|
193
|
+
product_secret: options.product_secret
|
|
194
|
+
};
|
|
195
|
+
return Buffer.from(JSON.stringify(tokenData)).toString("base64");
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
export {
|
|
199
|
+
Resources,
|
|
200
|
+
Lava as default
|
|
201
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lavapayments/nodejs",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Backend SDK for Lava Payments API - enabling usage-based billing for AI services",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup --dts --format cjs,esm src/index.ts",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"lint": "eslint src/",
|
|
15
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"clean": "rm -rf dist"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"lava",
|
|
21
|
+
"payments",
|
|
22
|
+
"billing",
|
|
23
|
+
"ai",
|
|
24
|
+
"openai",
|
|
25
|
+
"anthropic",
|
|
26
|
+
"usage-based",
|
|
27
|
+
"proxy"
|
|
28
|
+
],
|
|
29
|
+
"author": "Lava",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.0.0",
|
|
33
|
+
"@types/eslint": "^8.0.0",
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
35
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
36
|
+
"eslint": "^8.0.0",
|
|
37
|
+
"prettier": "^3.0.0",
|
|
38
|
+
"tsup": "^8.0.0",
|
|
39
|
+
"typescript": "^5.0.0"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|