@lavapayments/nodejs
Version:
Backend SDK for Lava Payments API - enabling usage-based billing for AI services
297 lines (295 loc) • 9.26 kB
JavaScript
// src/resources.ts
var Resources;
((Resources2) => {
class BaseResource {
constructor(lava) {
this.lava = lava;
}
}
class CheckoutSessionsResource extends BaseResource {
/**
* Create a checkout session
* @param params Checkout session parameters
* @returns Created checkout session
*/
create(params) {
return this.lava.request(
"POST",
"checkout_sessions",
{
data: params
}
);
}
/**
* List checkout sessions
* @param params List parameters
* @returns Paginated list of checkout sessions
*/
list(params) {
const queryParams = {};
if (params) {
if (params.cursor) {
queryParams.cursor = params.cursor;
}
if (params.limit) {
queryParams.limit = params.limit.toString();
}
if (params.reference_id) {
queryParams.reference_id = params.reference_id;
}
}
return this.lava.request(
"GET",
"checkout_sessions",
{
query: queryParams
}
);
}
/**
* Retrieve a checkout session
* @param checkoutSessionId Checkout session ID
* @returns Checkout session details
*/
retrieve(checkoutSessionId) {
return this.lava.request(
"GET",
`checkout_sessions/${checkoutSessionId}`
);
}
}
Resources2.CheckoutSessionsResource = CheckoutSessionsResource;
class ConnectionsResource extends BaseResource {
/**
* List connections
* @param params List parameters
* @returns Paginated list of connections
*/
list(params) {
const queryParams = {};
if (params) {
if (params.cursor) {
queryParams.cursor = params.cursor;
}
if (params.limit) {
queryParams.limit = params.limit.toString();
}
if (params.reference_id) {
queryParams.reference_id = params.reference_id;
}
}
return this.lava.request(
"GET",
"connections",
{
query: queryParams
}
);
}
/**
* Retrieve a connection
* @param connectionId Connection ID
* @returns Connection details
*/
retrieve(connectionId) {
return this.lava.request(
"GET",
`connections/${connectionId}`
);
}
/**
* Delete a connection
* @param connectionId Connection ID
* @returns Success status
*/
delete(connectionId) {
return this.lava.request(
"DELETE",
`connections/${connectionId}`
);
}
}
Resources2.ConnectionsResource = ConnectionsResource;
class RequestsResource extends BaseResource {
/**
* List requests
* @param params List parameters
* @returns Paginated list of requests
*/
list(params) {
const queryParams = {};
if (params) {
if (params.cursor) {
queryParams.cursor = params.cursor;
}
if (params.limit) {
queryParams.limit = params.limit.toString();
}
if (params.connection_id) {
queryParams.connection_id = params.connection_id;
}
if (params.product_id) {
queryParams.product_id = params.product_id;
}
if (params.metadata_filters) {
queryParams.metadata_filters = JSON.stringify(
Object.entries(params.metadata_filters)
);
}
}
return this.lava.request("GET", "requests", {
query: queryParams
});
}
/**
* Create a request
* @param params Request parameters
* @returns Created request details
*/
create(params) {
return this.lava.request("POST", "requests", {
data: params
});
}
/**
* Retrieve a request
* @param requestId Request ID
* @returns Request details
*/
retrieve(requestId) {
return this.lava.request("GET", `requests/${requestId}`);
}
}
Resources2.RequestsResource = RequestsResource;
class UsageResource extends BaseResource {
/**
* Retrieve usage statistics
* @param params Usage parameters
* @returns Usage data
*/
retrieve(params) {
const queryParams = {
start: params.start
};
if (params.end) {
queryParams.end = params.end;
}
if (params.connection_id) {
queryParams.connection_id = params.connection_id;
}
if (params.product_id) {
queryParams.product_id = params.product_id;
}
if (params.metadata_filters) {
queryParams.metadata_filters = JSON.stringify(
Object.entries(params.metadata_filters)
);
}
return this.lava.request("GET", "usage", {
query: queryParams
});
}
}
Resources2.UsageResource = UsageResource;
})(Resources || (Resources = {}));
// src/client.ts
var Lava = class {
/**
* Create a new Lava client
* @param secretKey Your Lava secret key
* @param config Configuration options
*/
constructor(secretKey, config) {
this.secretKey = secretKey;
this.apiVersion = config.apiVersion;
const isTestMode = secretKey.startsWith("aks_test_");
this.baseUrl = config.baseUrl || (isTestMode ? "https://sandbox-api.lavapayments.com/v1/" : "https://api.lavapayments.com/v1/");
this.checkoutSessions = new Resources.CheckoutSessionsResource(this);
this.connections = new Resources.ConnectionsResource(this);
this.requests = new Resources.RequestsResource(this);
this.usage = new Resources.UsageResource(this);
this.providers = {
openai: `${this.baseUrl}forward?u=https://api.openai.com/v1`,
anthropic: `${this.baseUrl}forward?u=https://api.anthropic.com/v1`,
mistral: `${this.baseUrl}forward?u=https://api.mistral.ai/v1`,
deepseek: `${this.baseUrl}forward?u=https://api.deepseek.com/v1`,
xai: `${this.baseUrl}forward?u=https://api.x.ai/v1`,
google: `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta`,
googleOpenaiCompatible: `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta/openai`,
kluster: `${this.baseUrl}forward?u=https://api.kluster.ai/v1`,
inference: `${this.baseUrl}forward?u=https://api.inference.net/v1`,
groq: `${this.baseUrl}forward?u=https://api.groq.com/openai/v1`,
novita: `${this.baseUrl}forward?u=https://api.novita.ai/v3/openai`,
vercel: `${this.baseUrl}forward?u=https://api.v0.dev/v1`,
together: `${this.baseUrl}forward?u=https://api.together.xyz/v1`,
hyperbolic: `${this.baseUrl}forward?u=https://api.hyperbolic.xyz/v1`,
elevenlabs: `${this.baseUrl}forward?u=https://api.elevenlabs.io/v1`,
sambanova: `${this.baseUrl}forward?u=https://api.sambanova.ai/v1`,
deepinfra: `${this.baseUrl}forward?u=https://api.deepinfra.com/v1/openai`,
cohere: `${this.baseUrl}forward?u=https://api.cohere.ai/compatibility/v1`,
parasail: `${this.baseUrl}forward?u=https://api.parasail.io/v1`,
nebius: `${this.baseUrl}forward?u=https://api.studio.nebius.com/v1`,
fireworks: `${this.baseUrl}forward?u=https://api.fireworks.ai/inference/v1`,
cerebras: `${this.baseUrl}forward?u=https://api.cerebras.ai/v1`,
targon: `${this.baseUrl}forward?u=https://api.targon.com/v1`,
gmicloud: `${this.baseUrl}forward?u=https://api.gmi-serving.com/v1`,
chutes: `${this.baseUrl}forward?u=https://llm.chutes.ai/v1`,
baseten: `${this.baseUrl}forward?u=https://inference.baseten.co/v1`
};
}
/**
* Make a request to the Lava API
* @param method HTTP method
* @param path API path
* @param options Request options
* @returns Response data
*/
async request(method, path, { data, query } = {}) {
const url = new URL(path, this.baseUrl);
if (query) {
Object.entries(query).forEach(([key, value]) => {
if (value !== void 0) {
url.searchParams.append(key, value.toString());
}
});
}
const headers = {
Authorization: `Bearer ${this.secretKey}`,
"Content-Type": "application/json",
"X-Lava-API-Version": this.apiVersion
};
const requestOptions = {
method,
headers,
body: data ? JSON.stringify(data) : void 0
};
const response = await fetch(url.toString(), requestOptions);
if (!response.ok) {
const errorJson = await response.json().catch(() => ({}));
const errorMessage = typeof errorJson.error === "object" ? JSON.stringify(errorJson.error) : errorJson.error || "Unknown error";
throw new Error(
`Lava API Error: ${response.status} ${response.statusText} - ${errorMessage}`
);
}
return response.json();
}
/**
* Generate a token for the forward endpoint
* @param options Token options
* @returns Base64 encoded token
*/
generateForwardToken(options) {
const tokenData = {
secret_key: this.secretKey,
connection_secret: options.connection_secret,
product_secret: options.product_secret,
provider_key: options.provider_key
};
return Buffer.from(JSON.stringify(tokenData)).toString("base64");
}
};
export {
Lava,
Resources
};