@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.
Files changed (64) hide show
  1. package/README.md +19 -6
  2. package/dist/browser.d.mts +2 -2
  3. package/dist/browser.d.ts +2 -2
  4. package/dist/browser.js +201 -66
  5. package/dist/browser.js.map +1 -1
  6. package/dist/browser.mjs +198 -67
  7. package/dist/browser.mjs.map +1 -1
  8. package/dist/bun.d.mts +5 -5
  9. package/dist/bun.d.ts +5 -5
  10. package/dist/bun.js +275 -66
  11. package/dist/bun.js.map +1 -1
  12. package/dist/bun.mjs +272 -67
  13. package/dist/bun.mjs.map +1 -1
  14. package/dist/{bunSqlite-BMTseLIz.d.ts → bunSqlite-BmXWNc25.d.ts} +1 -1
  15. package/dist/{bunSqlite-D6AreVE2.d.mts → bunSqlite-Bro9efsl.d.mts} +1 -1
  16. package/dist/client/index.d.mts +31 -10
  17. package/dist/client/index.d.ts +31 -10
  18. package/dist/client/index.js +185 -36
  19. package/dist/client/index.js.map +1 -1
  20. package/dist/client/index.mjs +182 -37
  21. package/dist/client/index.mjs.map +1 -1
  22. package/dist/discovery/index.d.mts +3 -3
  23. package/dist/discovery/index.d.ts +3 -3
  24. package/dist/discovery/index.js +12 -20
  25. package/dist/discovery/index.js.map +1 -1
  26. package/dist/discovery/index.mjs +12 -20
  27. package/dist/discovery/index.mjs.map +1 -1
  28. package/dist/index.d.mts +8 -6
  29. package/dist/index.d.ts +8 -6
  30. package/dist/index.js +201 -66
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +198 -67
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/node.d.mts +2 -2
  35. package/dist/node.d.ts +2 -2
  36. package/dist/node.js +276 -66
  37. package/dist/node.js.map +1 -1
  38. package/dist/node.mjs +273 -67
  39. package/dist/node.mjs.map +1 -1
  40. package/dist/storage/bun.d.mts +4 -4
  41. package/dist/storage/bun.d.ts +4 -4
  42. package/dist/storage/bun.js +173 -0
  43. package/dist/storage/bun.js.map +1 -1
  44. package/dist/storage/bun.mjs +173 -0
  45. package/dist/storage/bun.mjs.map +1 -1
  46. package/dist/storage/index.d.mts +2 -2
  47. package/dist/storage/index.d.ts +2 -2
  48. package/dist/storage/index.js +99 -0
  49. package/dist/storage/index.js.map +1 -1
  50. package/dist/storage/index.mjs +99 -0
  51. package/dist/storage/index.mjs.map +1 -1
  52. package/dist/storage/node.d.mts +2 -2
  53. package/dist/storage/node.d.ts +2 -2
  54. package/dist/storage/node.js +174 -0
  55. package/dist/storage/node.js.map +1 -1
  56. package/dist/storage/node.mjs +174 -0
  57. package/dist/storage/node.mjs.map +1 -1
  58. package/dist/{store-C8MZlfuz.d.ts → store-CAQLSbEj.d.ts} +38 -1
  59. package/dist/{store-BiuM2V9N.d.mts → store-CuXwe5Rg.d.mts} +38 -1
  60. package/dist/wallet/index.js +38 -24
  61. package/dist/wallet/index.js.map +1 -1
  62. package/dist/wallet/index.mjs +38 -24
  63. package/dist/wallet/index.mjs.map +1 -1
  64. package/package.json +7 -3
@@ -1,8 +1,8 @@
1
- import { U as UsageTrackingDriver, a as StorageDriver } from '../store-BiuM2V9N.mjs';
2
- export { L as ListUsageTrackingOptions, S as SdkStore, b as UsageTrackingEntry, c as createDiscoveryAdapterFromStore, d as createProviderRegistryFromStore, e as createSdkStore, f as createStorageAdapterFromStore } from '../store-BiuM2V9N.mjs';
1
+ import { c as UsageTrackingDriver, a as StorageDriver } from '../store-CuXwe5Rg.mjs';
2
+ export { A as AggregateUsageOptions, L as ListUsageTrackingOptions, S as SdkStore, U as UsageAggregateRow, b as UsageGroupBy, d as UsageTrackingEntry, e as createDiscoveryAdapterFromStore, f as createProviderRegistryFromStore, g as createSdkStore, h as createStorageAdapterFromStore } from '../store-CuXwe5Rg.mjs';
3
3
  export { SDK_STORAGE_KEYS, ShardedDiscoveryAdapterOptions, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromDiscoveryAdapter, createShardedDiscoveryAdapter, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver, setDefaultUsageTrackingDriver } from './index.mjs';
4
- import { B as BunSqliteUsageTrackingDriverOptions } from '../bunSqlite-D6AreVE2.mjs';
5
- export { c as createBunSqliteDriver, a as createBunSqliteUsageTrackingDriverWithDatabase } from '../bunSqlite-D6AreVE2.mjs';
4
+ import { B as BunSqliteUsageTrackingDriverOptions } from '../bunSqlite-Bro9efsl.mjs';
5
+ export { c as createBunSqliteDriver, a as createBunSqliteUsageTrackingDriverWithDatabase } from '../bunSqlite-Bro9efsl.mjs';
6
6
  import { S as SdkLogger } from '../types-_21yYFZG.mjs';
7
7
  export { D as DiscoveryAdapter } from '../interfaces-Cv1k2EUK.mjs';
8
8
  export { P as ProviderRegistry, S as StorageAdapter, X as XCashuTokenEntry } from '../interfaces-Csn8Uq04.mjs';
@@ -1,8 +1,8 @@
1
- import { U as UsageTrackingDriver, a as StorageDriver } from '../store-C8MZlfuz.js';
2
- export { L as ListUsageTrackingOptions, S as SdkStore, b as UsageTrackingEntry, c as createDiscoveryAdapterFromStore, d as createProviderRegistryFromStore, e as createSdkStore, f as createStorageAdapterFromStore } from '../store-C8MZlfuz.js';
1
+ import { c as UsageTrackingDriver, a as StorageDriver } from '../store-CAQLSbEj.js';
2
+ export { A as AggregateUsageOptions, L as ListUsageTrackingOptions, S as SdkStore, U as UsageAggregateRow, b as UsageGroupBy, d as UsageTrackingEntry, e as createDiscoveryAdapterFromStore, f as createProviderRegistryFromStore, g as createSdkStore, h as createStorageAdapterFromStore } from '../store-CAQLSbEj.js';
3
3
  export { SDK_STORAGE_KEYS, ShardedDiscoveryAdapterOptions, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromDiscoveryAdapter, createShardedDiscoveryAdapter, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver, setDefaultUsageTrackingDriver } from './index.js';
4
- import { B as BunSqliteUsageTrackingDriverOptions } from '../bunSqlite-BMTseLIz.js';
5
- export { c as createBunSqliteDriver, a as createBunSqliteUsageTrackingDriverWithDatabase } from '../bunSqlite-BMTseLIz.js';
4
+ import { B as BunSqliteUsageTrackingDriverOptions } from '../bunSqlite-BmXWNc25.js';
5
+ export { c as createBunSqliteDriver, a as createBunSqliteUsageTrackingDriverWithDatabase } from '../bunSqlite-BmXWNc25.js';
6
6
  import { S as SdkLogger } from '../types-_21yYFZG.js';
7
7
  export { D as DiscoveryAdapter } from '../interfaces-iL7CWeG5.js';
8
8
  export { P as ProviderRegistry, S as StorageAdapter, X as XCashuTokenEntry } from '../interfaces-C-DYd9Jy.js';
@@ -244,6 +244,149 @@ var SDK_STORAGE_KEYS = {
244
244
  PROVIDERS_ON_COOLDOWN: "providers_on_cooldown"
245
245
  };
246
246
 
247
+ // storage/usageTracking/aggregate.ts
248
+ var pad2 = (n) => String(n).padStart(2, "0");
249
+ 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";
250
+ var sqlGroupExpr = (groupBy) => {
251
+ switch (groupBy) {
252
+ case "modelId":
253
+ return { expr: "model_id", usesTz: false };
254
+ case "baseUrl":
255
+ return { expr: "base_url", usesTz: false };
256
+ case "client":
257
+ return { expr: "client", usesTz: false };
258
+ case "sessionId":
259
+ return { expr: "session_id", usesTz: false };
260
+ case "provider":
261
+ return { expr: "provider", usesTz: false };
262
+ case "day":
263
+ return {
264
+ expr: "strftime('%Y-%m-%d', (timestamp - ? * 60000) / 1000, 'unixepoch')",
265
+ usesTz: true
266
+ };
267
+ case "hour":
268
+ return {
269
+ expr: "strftime('%H', (timestamp - ? * 60000) / 1000, 'unixepoch')",
270
+ usesTz: true
271
+ };
272
+ }
273
+ };
274
+ var buildAggregateSql = (tableName, where, options = {}) => {
275
+ if (!options.groupBy) {
276
+ return {
277
+ sql: `SELECT NULL AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql}`,
278
+ params: where.params
279
+ };
280
+ }
281
+ const { expr, usesTz } = sqlGroupExpr(options.groupBy);
282
+ const tzParams = usesTz ? [options.tzOffsetMinutes ?? 0] : [];
283
+ const orderBy = options.groupBy === "day" || options.groupBy === "hour" ? "ORDER BY grp ASC" : "ORDER BY satsCost DESC";
284
+ return {
285
+ sql: `SELECT ${expr} AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql} GROUP BY grp ${orderBy}`,
286
+ params: [...tzParams, ...where.params]
287
+ };
288
+ };
289
+ var mapAggregateRow = (row) => ({
290
+ group: row.grp == null ? null : String(row.grp),
291
+ requests: Number(row.requests ?? 0),
292
+ promptTokens: Number(row.promptTokens ?? 0),
293
+ completionTokens: Number(row.completionTokens ?? 0),
294
+ totalTokens: Number(row.totalTokens ?? 0),
295
+ cost: Number(row.cost ?? 0),
296
+ satsCost: Number(row.satsCost ?? 0),
297
+ baseMsats: Number(row.baseMsats ?? 0),
298
+ inputMsats: Number(row.inputMsats ?? 0),
299
+ outputMsats: Number(row.outputMsats ?? 0),
300
+ totalMsats: Number(row.totalMsats ?? 0),
301
+ totalUsd: Number(row.totalUsd ?? 0),
302
+ cacheReadInputTokens: Number(row.cacheReadInputTokens ?? 0),
303
+ cacheCreationInputTokens: Number(row.cacheCreationInputTokens ?? 0),
304
+ cacheReadMsats: Number(row.cacheReadMsats ?? 0),
305
+ cacheCreationMsats: Number(row.cacheCreationMsats ?? 0)
306
+ });
307
+ var jsGroupKey = (entry, groupBy, tzOffsetMinutes) => {
308
+ switch (groupBy) {
309
+ case "modelId":
310
+ return entry.modelId ?? null;
311
+ case "baseUrl":
312
+ return entry.baseUrl ?? null;
313
+ case "client":
314
+ return entry.client ?? null;
315
+ case "sessionId":
316
+ return entry.sessionId ?? null;
317
+ case "provider":
318
+ return entry.provider ?? null;
319
+ case "day": {
320
+ const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
321
+ return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;
322
+ }
323
+ case "hour": {
324
+ const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
325
+ return pad2(d.getUTCHours());
326
+ }
327
+ }
328
+ };
329
+ var reduceAggregate = (entries, options = {}) => {
330
+ const emptyRow = (group) => ({
331
+ group,
332
+ requests: 0,
333
+ promptTokens: 0,
334
+ completionTokens: 0,
335
+ totalTokens: 0,
336
+ cost: 0,
337
+ satsCost: 0,
338
+ baseMsats: 0,
339
+ inputMsats: 0,
340
+ outputMsats: 0,
341
+ totalMsats: 0,
342
+ totalUsd: 0,
343
+ cacheReadInputTokens: 0,
344
+ cacheCreationInputTokens: 0,
345
+ cacheReadMsats: 0,
346
+ cacheCreationMsats: 0
347
+ });
348
+ const accumulate = (row, entry) => {
349
+ row.requests += 1;
350
+ row.promptTokens += entry.promptTokens;
351
+ row.completionTokens += entry.completionTokens;
352
+ row.totalTokens += entry.totalTokens;
353
+ row.cost += entry.cost;
354
+ row.satsCost += entry.satsCost;
355
+ row.baseMsats += entry.baseMsats ?? 0;
356
+ row.inputMsats += entry.inputMsats ?? 0;
357
+ row.outputMsats += entry.outputMsats ?? 0;
358
+ row.totalMsats += entry.totalMsats ?? 0;
359
+ row.totalUsd += entry.totalUsd ?? 0;
360
+ row.cacheReadInputTokens += entry.cacheReadInputTokens ?? 0;
361
+ row.cacheCreationInputTokens += entry.cacheCreationInputTokens ?? 0;
362
+ row.cacheReadMsats += entry.cacheReadMsats ?? 0;
363
+ row.cacheCreationMsats += entry.cacheCreationMsats ?? 0;
364
+ };
365
+ if (!options.groupBy) {
366
+ const total = emptyRow(null);
367
+ for (const entry of entries) accumulate(total, entry);
368
+ return [total];
369
+ }
370
+ const tz = options.tzOffsetMinutes ?? 0;
371
+ const groups = /* @__PURE__ */ new Map();
372
+ for (const entry of entries) {
373
+ const key = jsGroupKey(entry, options.groupBy, tz);
374
+ let row = groups.get(key);
375
+ if (!row) {
376
+ row = emptyRow(key);
377
+ groups.set(key, row);
378
+ }
379
+ accumulate(row, entry);
380
+ }
381
+ const rows = [...groups.values()];
382
+ if (options.groupBy === "day" || options.groupBy === "hour") {
383
+ rows.sort((a, b) => (a.group ?? "").localeCompare(b.group ?? ""));
384
+ } else {
385
+ rows.sort((a, b) => b.satsCost - a.satsCost);
386
+ }
387
+ return rows;
388
+ };
389
+
247
390
  // storage/usageTracking/indexedDB.ts
248
391
  var DEFAULT_DB_NAME = "routstr-sdk";
249
392
  var DEFAULT_STORE_NAME = "usage_tracking";
@@ -306,6 +449,9 @@ var matchesFilters = (entry, options = {}) => {
306
449
  if (options.client && entry.client !== options.client) {
307
450
  return false;
308
451
  }
452
+ if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
453
+ return false;
454
+ }
309
455
  if (options.provider && entry.provider !== options.provider) {
310
456
  return false;
311
457
  }
@@ -404,6 +550,10 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
404
550
  const results = await this.list(options2);
405
551
  return results.length;
406
552
  },
553
+ async aggregate(options2 = {}) {
554
+ const entries = await this.list(options2);
555
+ return reduceAggregate(entries, options2);
556
+ },
407
557
  async deleteOlderThan(timestamp) {
408
558
  await ensureMigrated();
409
559
  const db = await getDb();
@@ -461,6 +611,9 @@ var matchesFilters2 = (entry, options = {}) => {
461
611
  if (options.client && entry.client !== options.client) {
462
612
  return false;
463
613
  }
614
+ if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
615
+ return false;
616
+ }
464
617
  if (options.provider && entry.provider !== options.provider) {
465
618
  return false;
466
619
  }
@@ -493,6 +646,10 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
493
646
  async count(options = {}) {
494
647
  return (await this.list(options)).length;
495
648
  },
649
+ async aggregate(options = {}) {
650
+ const entries = [...store.values()].filter((entry) => matchesFilters2(entry, options));
651
+ return reduceAggregate(entries, options);
652
+ },
496
653
  async deleteOlderThan(timestamp) {
497
654
  let deleted = 0;
498
655
  for (const [id, entry] of store.entries()) {
@@ -1490,6 +1647,8 @@ async function createBunSqliteDriver(dbPath, options) {
1490
1647
  const logger = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
1491
1648
  const SQLite = (await import('bun:sqlite')).default;
1492
1649
  const db = new SQLite(dbPath);
1650
+ db.run("PRAGMA journal_mode = WAL");
1651
+ db.run("PRAGMA busy_timeout = 5000");
1493
1652
  db.run(`
1494
1653
  CREATE TABLE IF NOT EXISTS sdk_storage (
1495
1654
  key TEXT PRIMARY KEY,
@@ -1576,6 +1735,11 @@ var buildWhereClause = (options = {}) => {
1576
1735
  clauses.push("client = ?");
1577
1736
  params.push(options.client);
1578
1737
  }
1738
+ if (options.clients && options.clients.length > 0) {
1739
+ const placeholders = options.clients.map(() => "?").join(", ");
1740
+ clauses.push(`client IN (${placeholders})`);
1741
+ params.push(...options.clients);
1742
+ }
1579
1743
  if (options.provider) {
1580
1744
  clauses.push("provider = ?");
1581
1745
  params.push(options.provider);
@@ -1597,6 +1761,8 @@ var createBunSqliteUsageTrackingDriver = (options = {}) => {
1597
1761
  );
1598
1762
  }
1599
1763
  const db = new SQLiteDatabase(dbPath);
1764
+ db.run("PRAGMA journal_mode = WAL");
1765
+ db.run("PRAGMA busy_timeout = 5000");
1600
1766
  db.run(`
1601
1767
  CREATE TABLE IF NOT EXISTS ${tableName} (
1602
1768
  id TEXT PRIMARY KEY,
@@ -1749,6 +1915,13 @@ var createBunSqliteUsageTrackingDriver = (options = {}) => {
1749
1915
  const row = db.query(query).get(...params);
1750
1916
  return Number(row?.count ?? 0);
1751
1917
  },
1918
+ async aggregate(options2 = {}) {
1919
+ await ensureMigrated();
1920
+ const where = buildWhereClause(options2);
1921
+ const { sql, params } = buildAggregateSql(tableName, where, options2);
1922
+ const rows = db.query(sql).all(...params);
1923
+ return rows.map(mapAggregateRow);
1924
+ },
1752
1925
  async deleteOlderThan(timestamp) {
1753
1926
  await ensureMigrated();
1754
1927
  const before = timestamp;