@routstr/sdk 0.3.10 → 0.3.11

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 (63) hide show
  1. package/dist/browser.d.mts +2 -2
  2. package/dist/browser.d.ts +2 -2
  3. package/dist/browser.js +201 -66
  4. package/dist/browser.js.map +1 -1
  5. package/dist/browser.mjs +198 -67
  6. package/dist/browser.mjs.map +1 -1
  7. package/dist/bun.d.mts +5 -5
  8. package/dist/bun.d.ts +5 -5
  9. package/dist/bun.js +271 -66
  10. package/dist/bun.js.map +1 -1
  11. package/dist/bun.mjs +268 -67
  12. package/dist/bun.mjs.map +1 -1
  13. package/dist/{bunSqlite-BMTseLIz.d.ts → bunSqlite-BmXWNc25.d.ts} +1 -1
  14. package/dist/{bunSqlite-D6AreVE2.d.mts → bunSqlite-Bro9efsl.d.mts} +1 -1
  15. package/dist/client/index.d.mts +31 -10
  16. package/dist/client/index.d.ts +31 -10
  17. package/dist/client/index.js +185 -36
  18. package/dist/client/index.js.map +1 -1
  19. package/dist/client/index.mjs +182 -37
  20. package/dist/client/index.mjs.map +1 -1
  21. package/dist/discovery/index.d.mts +3 -3
  22. package/dist/discovery/index.d.ts +3 -3
  23. package/dist/discovery/index.js +12 -20
  24. package/dist/discovery/index.js.map +1 -1
  25. package/dist/discovery/index.mjs +12 -20
  26. package/dist/discovery/index.mjs.map +1 -1
  27. package/dist/index.d.mts +8 -6
  28. package/dist/index.d.ts +8 -6
  29. package/dist/index.js +201 -66
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +198 -67
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/node.d.mts +2 -2
  34. package/dist/node.d.ts +2 -2
  35. package/dist/node.js +272 -66
  36. package/dist/node.js.map +1 -1
  37. package/dist/node.mjs +269 -67
  38. package/dist/node.mjs.map +1 -1
  39. package/dist/storage/bun.d.mts +4 -4
  40. package/dist/storage/bun.d.ts +4 -4
  41. package/dist/storage/bun.js +169 -0
  42. package/dist/storage/bun.js.map +1 -1
  43. package/dist/storage/bun.mjs +169 -0
  44. package/dist/storage/bun.mjs.map +1 -1
  45. package/dist/storage/index.d.mts +2 -2
  46. package/dist/storage/index.d.ts +2 -2
  47. package/dist/storage/index.js +99 -0
  48. package/dist/storage/index.js.map +1 -1
  49. package/dist/storage/index.mjs +99 -0
  50. package/dist/storage/index.mjs.map +1 -1
  51. package/dist/storage/node.d.mts +2 -2
  52. package/dist/storage/node.d.ts +2 -2
  53. package/dist/storage/node.js +170 -0
  54. package/dist/storage/node.js.map +1 -1
  55. package/dist/storage/node.mjs +170 -0
  56. package/dist/storage/node.mjs.map +1 -1
  57. package/dist/{store-C8MZlfuz.d.ts → store-CAQLSbEj.d.ts} +38 -1
  58. package/dist/{store-BiuM2V9N.d.mts → store-CuXwe5Rg.d.mts} +38 -1
  59. package/dist/wallet/index.js +38 -24
  60. package/dist/wallet/index.js.map +1 -1
  61. package/dist/wallet/index.mjs +38 -24
  62. package/dist/wallet/index.mjs.map +1 -1
  63. package/package.json +1 -1
@@ -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()) {
@@ -1633,6 +1790,11 @@ var buildWhereClause = (options = {}) => {
1633
1790
  clauses.push("client = ?");
1634
1791
  params.push(options.client);
1635
1792
  }
1793
+ if (options.clients && options.clients.length > 0) {
1794
+ const placeholders = options.clients.map(() => "?").join(", ");
1795
+ clauses.push(`client IN (${placeholders})`);
1796
+ params.push(...options.clients);
1797
+ }
1636
1798
  if (options.provider) {
1637
1799
  clauses.push("provider = ?");
1638
1800
  params.push(options.provider);
@@ -1822,6 +1984,14 @@ var createSqliteUsageTrackingDriver = (options = {}) => {
1822
1984
  const row = stmt.get(...params);
1823
1985
  return Number(row?.count ?? 0);
1824
1986
  },
1987
+ async aggregate(options2 = {}) {
1988
+ await ensureInit();
1989
+ await ensureMigrated();
1990
+ const where = buildWhereClause(options2);
1991
+ const { sql, params } = buildAggregateSql(tableName, where, options2);
1992
+ const rows = db.prepare(sql).all(...params);
1993
+ return rows.map(mapAggregateRow);
1994
+ },
1825
1995
  async deleteOlderThan(timestamp) {
1826
1996
  await ensureInit();
1827
1997
  await ensureMigrated();