@routstr/sdk 0.3.10 → 0.3.12
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 +19 -6
- package/dist/browser.d.mts +2 -2
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +201 -66
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +198 -67
- package/dist/browser.mjs.map +1 -1
- package/dist/bun.d.mts +5 -5
- package/dist/bun.d.ts +5 -5
- package/dist/bun.js +275 -66
- package/dist/bun.js.map +1 -1
- package/dist/bun.mjs +272 -67
- package/dist/bun.mjs.map +1 -1
- package/dist/{bunSqlite-BMTseLIz.d.ts → bunSqlite-BmXWNc25.d.ts} +1 -1
- package/dist/{bunSqlite-D6AreVE2.d.mts → bunSqlite-Bro9efsl.d.mts} +1 -1
- package/dist/client/index.d.mts +31 -10
- package/dist/client/index.d.ts +31 -10
- package/dist/client/index.js +185 -36
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +182 -37
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +3 -3
- package/dist/discovery/index.d.ts +3 -3
- package/dist/discovery/index.js +12 -20
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +12 -20
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +201 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +198 -67
- package/dist/index.mjs.map +1 -1
- package/dist/node.d.mts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +276 -66
- package/dist/node.js.map +1 -1
- package/dist/node.mjs +273 -67
- package/dist/node.mjs.map +1 -1
- package/dist/storage/bun.d.mts +4 -4
- package/dist/storage/bun.d.ts +4 -4
- package/dist/storage/bun.js +173 -0
- package/dist/storage/bun.js.map +1 -1
- package/dist/storage/bun.mjs +173 -0
- package/dist/storage/bun.mjs.map +1 -1
- package/dist/storage/index.d.mts +2 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/storage/index.js +99 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +99 -0
- package/dist/storage/index.mjs.map +1 -1
- package/dist/storage/node.d.mts +2 -2
- package/dist/storage/node.d.ts +2 -2
- package/dist/storage/node.js +174 -0
- package/dist/storage/node.js.map +1 -1
- package/dist/storage/node.mjs +174 -0
- package/dist/storage/node.mjs.map +1 -1
- package/dist/{store-C8MZlfuz.d.ts → store-CAQLSbEj.d.ts} +38 -1
- package/dist/{store-BiuM2V9N.d.mts → store-CuXwe5Rg.d.mts} +38 -1
- package/dist/wallet/index.js +38 -24
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +38 -24
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +7 -3
package/dist/storage/bun.mjs
CHANGED
|
@@ -242,6 +242,149 @@ var SDK_STORAGE_KEYS = {
|
|
|
242
242
|
PROVIDERS_ON_COOLDOWN: "providers_on_cooldown"
|
|
243
243
|
};
|
|
244
244
|
|
|
245
|
+
// storage/usageTracking/aggregate.ts
|
|
246
|
+
var pad2 = (n) => String(n).padStart(2, "0");
|
|
247
|
+
var aggregateColumns = "COUNT(*) AS requests, COALESCE(SUM(prompt_tokens), 0) AS promptTokens, COALESCE(SUM(completion_tokens), 0) AS completionTokens, COALESCE(SUM(total_tokens), 0) AS totalTokens, COALESCE(SUM(cost), 0) AS cost, COALESCE(SUM(sats_cost), 0) AS satsCost, COALESCE(SUM(base_msats), 0) AS baseMsats, COALESCE(SUM(input_msats), 0) AS inputMsats, COALESCE(SUM(output_msats), 0) AS outputMsats, COALESCE(SUM(total_msats), 0) AS totalMsats, COALESCE(SUM(total_usd), 0) AS totalUsd, COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadInputTokens, COALESCE(SUM(cache_creation_input_tokens), 0) AS cacheCreationInputTokens, COALESCE(SUM(cache_read_msats), 0) AS cacheReadMsats, COALESCE(SUM(cache_creation_msats), 0) AS cacheCreationMsats";
|
|
248
|
+
var sqlGroupExpr = (groupBy) => {
|
|
249
|
+
switch (groupBy) {
|
|
250
|
+
case "modelId":
|
|
251
|
+
return { expr: "model_id", usesTz: false };
|
|
252
|
+
case "baseUrl":
|
|
253
|
+
return { expr: "base_url", usesTz: false };
|
|
254
|
+
case "client":
|
|
255
|
+
return { expr: "client", usesTz: false };
|
|
256
|
+
case "sessionId":
|
|
257
|
+
return { expr: "session_id", usesTz: false };
|
|
258
|
+
case "provider":
|
|
259
|
+
return { expr: "provider", usesTz: false };
|
|
260
|
+
case "day":
|
|
261
|
+
return {
|
|
262
|
+
expr: "strftime('%Y-%m-%d', (timestamp - ? * 60000) / 1000, 'unixepoch')",
|
|
263
|
+
usesTz: true
|
|
264
|
+
};
|
|
265
|
+
case "hour":
|
|
266
|
+
return {
|
|
267
|
+
expr: "strftime('%H', (timestamp - ? * 60000) / 1000, 'unixepoch')",
|
|
268
|
+
usesTz: true
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
var buildAggregateSql = (tableName, where, options = {}) => {
|
|
273
|
+
if (!options.groupBy) {
|
|
274
|
+
return {
|
|
275
|
+
sql: `SELECT NULL AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql}`,
|
|
276
|
+
params: where.params
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const { expr, usesTz } = sqlGroupExpr(options.groupBy);
|
|
280
|
+
const tzParams = usesTz ? [options.tzOffsetMinutes ?? 0] : [];
|
|
281
|
+
const orderBy = options.groupBy === "day" || options.groupBy === "hour" ? "ORDER BY grp ASC" : "ORDER BY satsCost DESC";
|
|
282
|
+
return {
|
|
283
|
+
sql: `SELECT ${expr} AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql} GROUP BY grp ${orderBy}`,
|
|
284
|
+
params: [...tzParams, ...where.params]
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
var mapAggregateRow = (row) => ({
|
|
288
|
+
group: row.grp == null ? null : String(row.grp),
|
|
289
|
+
requests: Number(row.requests ?? 0),
|
|
290
|
+
promptTokens: Number(row.promptTokens ?? 0),
|
|
291
|
+
completionTokens: Number(row.completionTokens ?? 0),
|
|
292
|
+
totalTokens: Number(row.totalTokens ?? 0),
|
|
293
|
+
cost: Number(row.cost ?? 0),
|
|
294
|
+
satsCost: Number(row.satsCost ?? 0),
|
|
295
|
+
baseMsats: Number(row.baseMsats ?? 0),
|
|
296
|
+
inputMsats: Number(row.inputMsats ?? 0),
|
|
297
|
+
outputMsats: Number(row.outputMsats ?? 0),
|
|
298
|
+
totalMsats: Number(row.totalMsats ?? 0),
|
|
299
|
+
totalUsd: Number(row.totalUsd ?? 0),
|
|
300
|
+
cacheReadInputTokens: Number(row.cacheReadInputTokens ?? 0),
|
|
301
|
+
cacheCreationInputTokens: Number(row.cacheCreationInputTokens ?? 0),
|
|
302
|
+
cacheReadMsats: Number(row.cacheReadMsats ?? 0),
|
|
303
|
+
cacheCreationMsats: Number(row.cacheCreationMsats ?? 0)
|
|
304
|
+
});
|
|
305
|
+
var jsGroupKey = (entry, groupBy, tzOffsetMinutes) => {
|
|
306
|
+
switch (groupBy) {
|
|
307
|
+
case "modelId":
|
|
308
|
+
return entry.modelId ?? null;
|
|
309
|
+
case "baseUrl":
|
|
310
|
+
return entry.baseUrl ?? null;
|
|
311
|
+
case "client":
|
|
312
|
+
return entry.client ?? null;
|
|
313
|
+
case "sessionId":
|
|
314
|
+
return entry.sessionId ?? null;
|
|
315
|
+
case "provider":
|
|
316
|
+
return entry.provider ?? null;
|
|
317
|
+
case "day": {
|
|
318
|
+
const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
|
|
319
|
+
return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;
|
|
320
|
+
}
|
|
321
|
+
case "hour": {
|
|
322
|
+
const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
|
|
323
|
+
return pad2(d.getUTCHours());
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
var reduceAggregate = (entries, options = {}) => {
|
|
328
|
+
const emptyRow = (group) => ({
|
|
329
|
+
group,
|
|
330
|
+
requests: 0,
|
|
331
|
+
promptTokens: 0,
|
|
332
|
+
completionTokens: 0,
|
|
333
|
+
totalTokens: 0,
|
|
334
|
+
cost: 0,
|
|
335
|
+
satsCost: 0,
|
|
336
|
+
baseMsats: 0,
|
|
337
|
+
inputMsats: 0,
|
|
338
|
+
outputMsats: 0,
|
|
339
|
+
totalMsats: 0,
|
|
340
|
+
totalUsd: 0,
|
|
341
|
+
cacheReadInputTokens: 0,
|
|
342
|
+
cacheCreationInputTokens: 0,
|
|
343
|
+
cacheReadMsats: 0,
|
|
344
|
+
cacheCreationMsats: 0
|
|
345
|
+
});
|
|
346
|
+
const accumulate = (row, entry) => {
|
|
347
|
+
row.requests += 1;
|
|
348
|
+
row.promptTokens += entry.promptTokens;
|
|
349
|
+
row.completionTokens += entry.completionTokens;
|
|
350
|
+
row.totalTokens += entry.totalTokens;
|
|
351
|
+
row.cost += entry.cost;
|
|
352
|
+
row.satsCost += entry.satsCost;
|
|
353
|
+
row.baseMsats += entry.baseMsats ?? 0;
|
|
354
|
+
row.inputMsats += entry.inputMsats ?? 0;
|
|
355
|
+
row.outputMsats += entry.outputMsats ?? 0;
|
|
356
|
+
row.totalMsats += entry.totalMsats ?? 0;
|
|
357
|
+
row.totalUsd += entry.totalUsd ?? 0;
|
|
358
|
+
row.cacheReadInputTokens += entry.cacheReadInputTokens ?? 0;
|
|
359
|
+
row.cacheCreationInputTokens += entry.cacheCreationInputTokens ?? 0;
|
|
360
|
+
row.cacheReadMsats += entry.cacheReadMsats ?? 0;
|
|
361
|
+
row.cacheCreationMsats += entry.cacheCreationMsats ?? 0;
|
|
362
|
+
};
|
|
363
|
+
if (!options.groupBy) {
|
|
364
|
+
const total = emptyRow(null);
|
|
365
|
+
for (const entry of entries) accumulate(total, entry);
|
|
366
|
+
return [total];
|
|
367
|
+
}
|
|
368
|
+
const tz = options.tzOffsetMinutes ?? 0;
|
|
369
|
+
const groups = /* @__PURE__ */ new Map();
|
|
370
|
+
for (const entry of entries) {
|
|
371
|
+
const key = jsGroupKey(entry, options.groupBy, tz);
|
|
372
|
+
let row = groups.get(key);
|
|
373
|
+
if (!row) {
|
|
374
|
+
row = emptyRow(key);
|
|
375
|
+
groups.set(key, row);
|
|
376
|
+
}
|
|
377
|
+
accumulate(row, entry);
|
|
378
|
+
}
|
|
379
|
+
const rows = [...groups.values()];
|
|
380
|
+
if (options.groupBy === "day" || options.groupBy === "hour") {
|
|
381
|
+
rows.sort((a, b) => (a.group ?? "").localeCompare(b.group ?? ""));
|
|
382
|
+
} else {
|
|
383
|
+
rows.sort((a, b) => b.satsCost - a.satsCost);
|
|
384
|
+
}
|
|
385
|
+
return rows;
|
|
386
|
+
};
|
|
387
|
+
|
|
245
388
|
// storage/usageTracking/indexedDB.ts
|
|
246
389
|
var DEFAULT_DB_NAME = "routstr-sdk";
|
|
247
390
|
var DEFAULT_STORE_NAME = "usage_tracking";
|
|
@@ -304,6 +447,9 @@ var matchesFilters = (entry, options = {}) => {
|
|
|
304
447
|
if (options.client && entry.client !== options.client) {
|
|
305
448
|
return false;
|
|
306
449
|
}
|
|
450
|
+
if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
307
453
|
if (options.provider && entry.provider !== options.provider) {
|
|
308
454
|
return false;
|
|
309
455
|
}
|
|
@@ -402,6 +548,10 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
|
402
548
|
const results = await this.list(options2);
|
|
403
549
|
return results.length;
|
|
404
550
|
},
|
|
551
|
+
async aggregate(options2 = {}) {
|
|
552
|
+
const entries = await this.list(options2);
|
|
553
|
+
return reduceAggregate(entries, options2);
|
|
554
|
+
},
|
|
405
555
|
async deleteOlderThan(timestamp) {
|
|
406
556
|
await ensureMigrated();
|
|
407
557
|
const db = await getDb();
|
|
@@ -459,6 +609,9 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
459
609
|
if (options.client && entry.client !== options.client) {
|
|
460
610
|
return false;
|
|
461
611
|
}
|
|
612
|
+
if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
|
|
613
|
+
return false;
|
|
614
|
+
}
|
|
462
615
|
if (options.provider && entry.provider !== options.provider) {
|
|
463
616
|
return false;
|
|
464
617
|
}
|
|
@@ -491,6 +644,10 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
|
491
644
|
async count(options = {}) {
|
|
492
645
|
return (await this.list(options)).length;
|
|
493
646
|
},
|
|
647
|
+
async aggregate(options = {}) {
|
|
648
|
+
const entries = [...store.values()].filter((entry) => matchesFilters2(entry, options));
|
|
649
|
+
return reduceAggregate(entries, options);
|
|
650
|
+
},
|
|
494
651
|
async deleteOlderThan(timestamp) {
|
|
495
652
|
let deleted = 0;
|
|
496
653
|
for (const [id, entry] of store.entries()) {
|
|
@@ -1488,6 +1645,8 @@ async function createBunSqliteDriver(dbPath, options) {
|
|
|
1488
1645
|
const logger = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
|
|
1489
1646
|
const SQLite = (await import('bun:sqlite')).default;
|
|
1490
1647
|
const db = new SQLite(dbPath);
|
|
1648
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
1649
|
+
db.run("PRAGMA busy_timeout = 5000");
|
|
1491
1650
|
db.run(`
|
|
1492
1651
|
CREATE TABLE IF NOT EXISTS sdk_storage (
|
|
1493
1652
|
key TEXT PRIMARY KEY,
|
|
@@ -1574,6 +1733,11 @@ var buildWhereClause = (options = {}) => {
|
|
|
1574
1733
|
clauses.push("client = ?");
|
|
1575
1734
|
params.push(options.client);
|
|
1576
1735
|
}
|
|
1736
|
+
if (options.clients && options.clients.length > 0) {
|
|
1737
|
+
const placeholders = options.clients.map(() => "?").join(", ");
|
|
1738
|
+
clauses.push(`client IN (${placeholders})`);
|
|
1739
|
+
params.push(...options.clients);
|
|
1740
|
+
}
|
|
1577
1741
|
if (options.provider) {
|
|
1578
1742
|
clauses.push("provider = ?");
|
|
1579
1743
|
params.push(options.provider);
|
|
@@ -1595,6 +1759,8 @@ var createBunSqliteUsageTrackingDriver = (options = {}) => {
|
|
|
1595
1759
|
);
|
|
1596
1760
|
}
|
|
1597
1761
|
const db = new SQLiteDatabase(dbPath);
|
|
1762
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
1763
|
+
db.run("PRAGMA busy_timeout = 5000");
|
|
1598
1764
|
db.run(`
|
|
1599
1765
|
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
1600
1766
|
id TEXT PRIMARY KEY,
|
|
@@ -1747,6 +1913,13 @@ var createBunSqliteUsageTrackingDriver = (options = {}) => {
|
|
|
1747
1913
|
const row = db.query(query).get(...params);
|
|
1748
1914
|
return Number(row?.count ?? 0);
|
|
1749
1915
|
},
|
|
1916
|
+
async aggregate(options2 = {}) {
|
|
1917
|
+
await ensureMigrated();
|
|
1918
|
+
const where = buildWhereClause(options2);
|
|
1919
|
+
const { sql, params } = buildAggregateSql(tableName, where, options2);
|
|
1920
|
+
const rows = db.query(sql).all(...params);
|
|
1921
|
+
return rows.map(mapAggregateRow);
|
|
1922
|
+
},
|
|
1750
1923
|
async deleteOlderThan(timestamp) {
|
|
1751
1924
|
await ensureMigrated();
|
|
1752
1925
|
const before = timestamp;
|