@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
package/dist/browser.mjs CHANGED
@@ -137,6 +137,11 @@ var MintDiscoveryError = class extends Error {
137
137
  }
138
138
  baseUrl;
139
139
  };
140
+ var DEFAULT_NOSTR_RELAYS = [
141
+ "wss://relay.damus.io",
142
+ "wss://nos.lol",
143
+ "wss://relay.routstr.com"
144
+ ];
140
145
  var ModelManager = class _ModelManager {
141
146
  constructor(adapter, config = {}) {
142
147
  this.adapter = adapter;
@@ -330,11 +335,11 @@ var ModelManager = class _ModelManager {
330
335
  return this.bootstrapFromHttp(torMode, forceRefresh);
331
336
  }
332
337
  /**
333
- * Resolve Nostr relay URLs for a given use case.
334
- * Returns user-configured relays if set, otherwise the provided defaults.
338
+ * Resolve Nostr relay URLs.
339
+ * Returns user-configured relays if set, otherwise the shared defaults.
335
340
  */
336
- getNostrRelays(defaults) {
337
- return this.nostrRelays && this.nostrRelays.length > 0 ? this.nostrRelays : defaults;
341
+ getNostrRelays() {
342
+ return this.nostrRelays && this.nostrRelays.length > 0 ? this.nostrRelays : DEFAULT_NOSTR_RELAYS;
338
343
  }
339
344
  /**
340
345
  * Bootstrap providers from Nostr network (kind 38421)
@@ -343,11 +348,7 @@ var ModelManager = class _ModelManager {
343
348
  * @returns Array of provider base URLs
344
349
  */
345
350
  async bootstrapFromNostr(kind, torMode, forceRefresh = false) {
346
- const relays = this.getNostrRelays([
347
- "wss://relay.primal.net",
348
- "wss://nos.lol",
349
- "wss://relay.damus.io"
350
- ]);
351
+ const relays = this.getNostrRelays();
351
352
  const cached = await this.getCachedNostrEvents(
352
353
  { kinds: [kind] },
353
354
  this.cacheTTL,
@@ -530,12 +531,7 @@ var ModelManager = class _ModelManager {
530
531
  );
531
532
  let sessionEvents = cached;
532
533
  if (cached.length === 0) {
533
- const lgtmRelays = this.getNostrRelays([
534
- "wss://relay.primal.net",
535
- "wss://nos.lol",
536
- "wss://relay.damus.io",
537
- "wss://relay.routstr.com"
538
- ]);
534
+ const lgtmRelays = this.getNostrRelays();
539
535
  const pool = new RelayPool();
540
536
  const timeoutMs = 5e3;
541
537
  await new Promise((resolve) => {
@@ -781,11 +777,7 @@ var ModelManager = class _ModelManager {
781
777
  return cachedModels;
782
778
  }
783
779
  }
784
- const relays = this.getNostrRelays([
785
- "wss://relay.damus.io",
786
- "wss://nos.lol",
787
- "wss://relay.routstr.com"
788
- ]);
780
+ const relays = this.getNostrRelays();
789
781
  const cached = await this.getCachedNostrEvents(
790
782
  { kinds: [38423], "#d": ["routstr-21-models"], authors: [this.routstrPubkey] },
791
783
  this.cacheTTL,
@@ -1997,8 +1989,8 @@ var BalanceManager = class _BalanceManager {
1997
1989
  const refundableProviderBalance = Object.entries(
1998
1990
  balanceState.providerBalances
1999
1991
  ).filter(([providerBaseUrl]) => providerBaseUrl !== baseUrl).reduce((sum, [, value]) => sum + value, 0);
2000
- if (totalMintBalance + targetProviderBalance < adjustedAmount && totalMintBalance + targetProviderBalance + refundableProviderBalance >= adjustedAmount && retryCount < 2) {
2001
- await this._refundOtherProvidersForTopUp(baseUrl, mintUrl, retryCount);
1992
+ if (totalMintBalance + targetProviderBalance < adjustedAmount && totalMintBalance + targetProviderBalance + refundableProviderBalance >= adjustedAmount && retryCount < 3) {
1993
+ await this._refundOtherProvidersForTopUp(baseUrl, mintUrl, retryCount, adjustedAmount);
2002
1994
  return this.createProviderToken({
2003
1995
  ...options,
2004
1996
  retryCount: retryCount + 1
@@ -2137,33 +2129,47 @@ var BalanceManager = class _BalanceManager {
2137
2129
  }
2138
2130
  return candidates;
2139
2131
  }
2140
- async _refundOtherProvidersForTopUp(baseUrl, mintUrl, retryCount) {
2132
+ async _refundOtherProvidersForTopUp(baseUrl, mintUrl, retryCount, requiredAmount) {
2141
2133
  const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();
2142
2134
  const forceRefund = retryCount >= 2;
2143
- const apiKeysToRefund = apiKeyDistribution.filter(
2144
- (apiKey) => apiKey.baseUrl !== baseUrl && apiKey.amount > 0
2145
- );
2146
- const apiKeyRefundResults = await Promise.allSettled(
2147
- apiKeysToRefund.map(async (apiKeyEntry) => {
2148
- const fullApiKeyEntry = this.storageAdapter.getApiKey(
2149
- apiKeyEntry.baseUrl
2150
- );
2151
- if (!fullApiKeyEntry) {
2152
- return { baseUrl: apiKeyEntry.baseUrl, success: false };
2153
- }
2154
- const result = await this.refundApiKey({
2135
+ const candidates = apiKeyDistribution.filter((apiKey) => apiKey.baseUrl !== baseUrl && apiKey.amount > 0).map((apiKey) => {
2136
+ const full = this.storageAdapter.getApiKey(apiKey.baseUrl);
2137
+ return {
2138
+ baseUrl: apiKey.baseUrl,
2139
+ amount: apiKey.amount,
2140
+ lastUsed: full?.lastUsed ?? 0,
2141
+ key: full?.key
2142
+ };
2143
+ }).filter((c) => c.key != null).sort((a, b) => a.lastUsed - b.lastUsed);
2144
+ if (candidates.length === 0) return;
2145
+ if (forceRefund) {
2146
+ for (const candidate of candidates) {
2147
+ await this.refundApiKey({
2155
2148
  mintUrl,
2156
- baseUrl: apiKeyEntry.baseUrl,
2157
- apiKey: fullApiKeyEntry.key,
2158
- forceRefund
2149
+ baseUrl: candidate.baseUrl,
2150
+ apiKey: candidate.key,
2151
+ forceRefund: true
2159
2152
  });
2160
- return { baseUrl: apiKeyEntry.baseUrl, success: result.success };
2161
- })
2162
- );
2163
- for (const result of apiKeyRefundResults) {
2164
- if (result.status === "fulfilled" && result.value.success) {
2165
- this.storageAdapter.updateApiKeyBalance(result.value.baseUrl, 0);
2153
+ const newState = await this.getBalanceState();
2154
+ const newAvailable = (newState.mintBalances[mintUrl] || 0) + (newState.providerBalances[baseUrl] || 0);
2155
+ if (newAvailable >= requiredAmount) {
2156
+ this.logger.log(
2157
+ `_refundOtherProvidersForTopUp: freed enough balance (${newAvailable} >= ${requiredAmount}), stopping early`
2158
+ );
2159
+ return;
2160
+ }
2166
2161
  }
2162
+ } else {
2163
+ await Promise.allSettled(
2164
+ candidates.map(
2165
+ (candidate) => this.refundApiKey({
2166
+ mintUrl,
2167
+ baseUrl: candidate.baseUrl,
2168
+ apiKey: candidate.key,
2169
+ forceRefund: false
2170
+ })
2171
+ )
2172
+ );
2167
2173
  }
2168
2174
  }
2169
2175
  /**
@@ -3160,6 +3166,91 @@ var SDK_STORAGE_KEYS = {
3160
3166
  PROVIDERS_ON_COOLDOWN: "providers_on_cooldown"
3161
3167
  };
3162
3168
 
3169
+ // storage/usageTracking/aggregate.ts
3170
+ var pad2 = (n) => String(n).padStart(2, "0");
3171
+ var jsGroupKey = (entry, groupBy, tzOffsetMinutes) => {
3172
+ switch (groupBy) {
3173
+ case "modelId":
3174
+ return entry.modelId ?? null;
3175
+ case "baseUrl":
3176
+ return entry.baseUrl ?? null;
3177
+ case "client":
3178
+ return entry.client ?? null;
3179
+ case "sessionId":
3180
+ return entry.sessionId ?? null;
3181
+ case "provider":
3182
+ return entry.provider ?? null;
3183
+ case "day": {
3184
+ const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
3185
+ return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;
3186
+ }
3187
+ case "hour": {
3188
+ const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
3189
+ return pad2(d.getUTCHours());
3190
+ }
3191
+ }
3192
+ };
3193
+ var reduceAggregate = (entries, options = {}) => {
3194
+ const emptyRow = (group) => ({
3195
+ group,
3196
+ requests: 0,
3197
+ promptTokens: 0,
3198
+ completionTokens: 0,
3199
+ totalTokens: 0,
3200
+ cost: 0,
3201
+ satsCost: 0,
3202
+ baseMsats: 0,
3203
+ inputMsats: 0,
3204
+ outputMsats: 0,
3205
+ totalMsats: 0,
3206
+ totalUsd: 0,
3207
+ cacheReadInputTokens: 0,
3208
+ cacheCreationInputTokens: 0,
3209
+ cacheReadMsats: 0,
3210
+ cacheCreationMsats: 0
3211
+ });
3212
+ const accumulate = (row, entry) => {
3213
+ row.requests += 1;
3214
+ row.promptTokens += entry.promptTokens;
3215
+ row.completionTokens += entry.completionTokens;
3216
+ row.totalTokens += entry.totalTokens;
3217
+ row.cost += entry.cost;
3218
+ row.satsCost += entry.satsCost;
3219
+ row.baseMsats += entry.baseMsats ?? 0;
3220
+ row.inputMsats += entry.inputMsats ?? 0;
3221
+ row.outputMsats += entry.outputMsats ?? 0;
3222
+ row.totalMsats += entry.totalMsats ?? 0;
3223
+ row.totalUsd += entry.totalUsd ?? 0;
3224
+ row.cacheReadInputTokens += entry.cacheReadInputTokens ?? 0;
3225
+ row.cacheCreationInputTokens += entry.cacheCreationInputTokens ?? 0;
3226
+ row.cacheReadMsats += entry.cacheReadMsats ?? 0;
3227
+ row.cacheCreationMsats += entry.cacheCreationMsats ?? 0;
3228
+ };
3229
+ if (!options.groupBy) {
3230
+ const total = emptyRow(null);
3231
+ for (const entry of entries) accumulate(total, entry);
3232
+ return [total];
3233
+ }
3234
+ const tz = options.tzOffsetMinutes ?? 0;
3235
+ const groups = /* @__PURE__ */ new Map();
3236
+ for (const entry of entries) {
3237
+ const key = jsGroupKey(entry, options.groupBy, tz);
3238
+ let row = groups.get(key);
3239
+ if (!row) {
3240
+ row = emptyRow(key);
3241
+ groups.set(key, row);
3242
+ }
3243
+ accumulate(row, entry);
3244
+ }
3245
+ const rows = [...groups.values()];
3246
+ if (options.groupBy === "day" || options.groupBy === "hour") {
3247
+ rows.sort((a, b) => (a.group ?? "").localeCompare(b.group ?? ""));
3248
+ } else {
3249
+ rows.sort((a, b) => b.satsCost - a.satsCost);
3250
+ }
3251
+ return rows;
3252
+ };
3253
+
3163
3254
  // storage/usageTracking/indexedDB.ts
3164
3255
  var DEFAULT_DB_NAME = "routstr-sdk";
3165
3256
  var DEFAULT_STORE_NAME = "usage_tracking";
@@ -3222,6 +3313,9 @@ var matchesFilters = (entry, options = {}) => {
3222
3313
  if (options.client && entry.client !== options.client) {
3223
3314
  return false;
3224
3315
  }
3316
+ if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
3317
+ return false;
3318
+ }
3225
3319
  if (options.provider && entry.provider !== options.provider) {
3226
3320
  return false;
3227
3321
  }
@@ -3320,6 +3414,10 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
3320
3414
  const results = await this.list(options2);
3321
3415
  return results.length;
3322
3416
  },
3417
+ async aggregate(options2 = {}) {
3418
+ const entries = await this.list(options2);
3419
+ return reduceAggregate(entries, options2);
3420
+ },
3323
3421
  async deleteOlderThan(timestamp) {
3324
3422
  await ensureMigrated();
3325
3423
  const db = await getDb();
@@ -3377,6 +3475,9 @@ var matchesFilters2 = (entry, options = {}) => {
3377
3475
  if (options.client && entry.client !== options.client) {
3378
3476
  return false;
3379
3477
  }
3478
+ if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
3479
+ return false;
3480
+ }
3380
3481
  if (options.provider && entry.provider !== options.provider) {
3381
3482
  return false;
3382
3483
  }
@@ -3409,6 +3510,10 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
3409
3510
  async count(options = {}) {
3410
3511
  return (await this.list(options)).length;
3411
3512
  },
3513
+ async aggregate(options = {}) {
3514
+ const entries = [...store.values()].filter((entry) => matchesFilters2(entry, options));
3515
+ return reduceAggregate(entries, options);
3516
+ },
3412
3517
  async deleteOlderThan(timestamp) {
3413
3518
  let deleted = 0;
3414
3519
  for (const [id, entry] of store.entries()) {
@@ -4560,13 +4665,14 @@ function hasUsageChanged(previous, next) {
4560
4665
  function isInspectionComplete(responseIdCaptured, usage) {
4561
4666
  return responseIdCaptured && !!usage && usage.totalTokens > 0 && typeof usage.totalMsats === "number" && !!usage.provider;
4562
4667
  }
4563
- async function inspectSSEWebStream(stream, onUsage, onResponseId) {
4668
+ async function inspectSSEWebStream(stream, onUsage, onResponseId, options) {
4564
4669
  const reader = stream.getReader();
4565
4670
  const decoder = new TextDecoder("utf-8");
4566
4671
  let buffer = "";
4567
4672
  let capturedUsage = null;
4568
4673
  let capturedResponseId;
4569
4674
  let responseIdCaptured = false;
4675
+ let rawChunkSequence = 0;
4570
4676
  const inspectDataPayload = (jsonText) => {
4571
4677
  const trimmed = jsonText.trim();
4572
4678
  if (!trimmed || trimmed === "[DONE]") {
@@ -4637,7 +4743,9 @@ async function inspectSSEWebStream(stream, onUsage, onResponseId) {
4637
4743
  const { value, done } = await reader.read();
4638
4744
  if (done) break;
4639
4745
  if (value && value.byteLength > 0) {
4640
- buffer += decoder.decode(value, { stream: true });
4746
+ const text = decoder.decode(value, { stream: true });
4747
+ void options?.onRawChunk?.(value, rawChunkSequence++, text);
4748
+ buffer += text;
4641
4749
  drainBufferedEvents();
4642
4750
  }
4643
4751
  }
@@ -4782,6 +4890,7 @@ var RoutstrClient = class {
4782
4890
  this.mode = mode;
4783
4891
  this.usageTrackingDriver = options.usageTrackingDriver;
4784
4892
  this.sdkStore = options.sdkStore;
4893
+ this.requestResponseLogSink = options.requestResponseLogSink;
4785
4894
  this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
4786
4895
  }
4787
4896
  walletAdapter;
@@ -4796,6 +4905,7 @@ var RoutstrClient = class {
4796
4905
  usageTrackingDriver;
4797
4906
  sdkStore;
4798
4907
  logger;
4908
+ requestResponseLogSink;
4799
4909
  /**
4800
4910
  * Get the current client mode
4801
4911
  */
@@ -4986,6 +5096,7 @@ var RoutstrClient = class {
4986
5096
  let usagePromise = Promise.resolve({});
4987
5097
  if (contentType.includes("text/event-stream") && response.body) {
4988
5098
  const [clientStream, inspectStream] = response.body.tee();
5099
+ const requestResponseLogId = response.requestResponseLogId;
4989
5100
  processedResponse = new Response(clientStream, {
4990
5101
  status: response.status,
4991
5102
  statusText: response.statusText,
@@ -4993,6 +5104,7 @@ var RoutstrClient = class {
4993
5104
  });
4994
5105
  processedResponse.baseUrl = response.baseUrl;
4995
5106
  processedResponse.token = response.token;
5107
+ processedResponse.requestResponseLogId = requestResponseLogId;
4996
5108
  usagePromise = inspectSSEWebStream(
4997
5109
  inspectStream,
4998
5110
  (usage) => {
@@ -5002,8 +5114,23 @@ var RoutstrClient = class {
5002
5114
  (responseId) => {
5003
5115
  capturedResponseId = responseId;
5004
5116
  processedResponse.requestId = responseId;
5117
+ },
5118
+ {
5119
+ onRawChunk: (_chunk, sequence, text) => {
5120
+ void this.requestResponseLogSink?.logResponseChunk?.(
5121
+ requestResponseLogId,
5122
+ sequence,
5123
+ text
5124
+ );
5125
+ }
5005
5126
  }
5006
- );
5127
+ ).then(async (result) => {
5128
+ await this.requestResponseLogSink?.logResponseEnd?.(requestResponseLogId);
5129
+ return result;
5130
+ }).catch(async (error) => {
5131
+ await this.requestResponseLogSink?.logResponseError?.(requestResponseLogId, error);
5132
+ throw error;
5133
+ });
5007
5134
  processedResponse.usagePromise = usagePromise;
5008
5135
  }
5009
5136
  return {
@@ -5037,16 +5164,30 @@ var RoutstrClient = class {
5037
5164
  const { path, method, body, baseUrl, token, headers } = params;
5038
5165
  try {
5039
5166
  const url = `${baseUrl.replace(/\/$/, "")}${path}`;
5167
+ const requestBodyText = body === void 0 || method === "GET" ? void 0 : JSON.stringify(body);
5168
+ const requestLogId = await this.requestResponseLogSink?.logRequest?.({
5169
+ method,
5170
+ url,
5171
+ path,
5172
+ baseUrl,
5173
+ headers,
5174
+ body,
5175
+ rawBody: requestBodyText
5176
+ });
5040
5177
  if (this.mode === "xcashu") this._log("DEBUG", "HEADERS,", headers);
5041
5178
  const response = await fetch(url, {
5042
5179
  method,
5043
5180
  headers,
5044
- body: body === void 0 || method === "GET" ? void 0 : JSON.stringify(body)
5181
+ body: requestBodyText
5045
5182
  });
5046
5183
  if (this.mode === "xcashu") this._log("DEBUG", "response,", response);
5047
5184
  response.baseUrl = baseUrl;
5048
5185
  response.token = token;
5186
+ response.requestResponseLogId = requestLogId;
5187
+ await this.requestResponseLogSink?.logResponseStart?.(requestLogId, response);
5188
+ const contentType = response.headers.get("content-type") || "";
5049
5189
  if (!response.ok) {
5190
+ void this.requestResponseLogSink?.logResponseBody?.(requestLogId, response.clone());
5050
5191
  const requestId = response.headers.get("x-routstr-request-id") || void 0;
5051
5192
  let bodyText;
5052
5193
  try {
@@ -5064,6 +5205,9 @@ var RoutstrClient = class {
5064
5205
  params.retryCount ?? 0
5065
5206
  );
5066
5207
  }
5208
+ if (!contentType.includes("text/event-stream")) {
5209
+ void this.requestResponseLogSink?.logResponseBody?.(requestLogId, response.clone());
5210
+ }
5067
5211
  return response;
5068
5212
  } catch (error) {
5069
5213
  if (isNetworkErrorMessage(error?.message || "")) {
@@ -5953,15 +6097,8 @@ async function fetchAIResponse(options, callbacks, deps) {
5953
6097
  const apiMessages = await convertMessages(messageHistory);
5954
6098
  callbacks.onPaymentProcessing?.(true);
5955
6099
  callbacks.onTokenCreated?.(deps.getPendingCashuTokenAmount?.() ?? 0);
5956
- const providerInfo = await deps.providerRegistry.getProviderInfo(baseUrl);
5957
- const providerVersion = providerInfo?.version ?? "";
5958
- let modelIdForRequest = selectedModel.id;
5959
- if (/^0\.1\./.test(providerVersion)) {
5960
- const newModel = await deps.client.getProviderManager().getModelForProvider(baseUrl, selectedModel.id);
5961
- modelIdForRequest = newModel?.id ?? selectedModel.id;
5962
- }
5963
6100
  const body = {
5964
- model: modelIdForRequest,
6101
+ model: selectedModel.id,
5965
6102
  messages: apiMessages,
5966
6103
  stream: true
5967
6104
  };
@@ -6096,7 +6233,8 @@ async function resolveRouteRequestContext(options) {
6096
6233
  usageTrackingDriver,
6097
6234
  sdkStore,
6098
6235
  providerManager: providedProviderManager,
6099
- logger
6236
+ logger,
6237
+ requestResponseLogSink
6100
6238
  } = options;
6101
6239
  let modelManager;
6102
6240
  let providers;
@@ -6145,15 +6283,8 @@ async function resolveRouteRequestContext(options) {
6145
6283
  baseUrl = cheapest.baseUrl;
6146
6284
  selectedModel = cheapest.model;
6147
6285
  }
6148
- const balances = await walletAdapter.getBalances();
6149
- const totalBalance = Object.values(balances).reduce((sum, v) => sum + v, 0);
6150
- if (totalBalance <= 0) {
6151
- throw new Error(
6152
- "Wallet balance is empty. Add a mint and fund it before making requests."
6153
- );
6154
- }
6155
6286
  const providerMints = providerRegistry.getProviderMints(baseUrl);
6156
- const mintUrl = walletAdapter.getActiveMintUrl() || providerMints[0] || Object.keys(balances)[0];
6287
+ const mintUrl = walletAdapter.getActiveMintUrl() || providerMints[0] || Object.keys(await walletAdapter.getBalances())[0];
6157
6288
  if (!mintUrl) {
6158
6289
  throw new Error("No mint configured in wallet");
6159
6290
  }
@@ -6163,7 +6294,7 @@ async function resolveRouteRequestContext(options) {
6163
6294
  providerRegistry,
6164
6295
  "min",
6165
6296
  mode,
6166
- { usageTrackingDriver, sdkStore, providerManager, logger }
6297
+ { usageTrackingDriver, sdkStore, providerManager, logger, requestResponseLogSink }
6167
6298
  );
6168
6299
  const maxTokens = extractMaxTokens(requestBody);
6169
6300
  const stream = extractStream(requestBody);
@@ -6225,6 +6356,6 @@ function extractStream(requestBody) {
6225
6356
  return typeof stream === "boolean" ? stream : void 0;
6226
6357
  }
6227
6358
 
6228
- export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, consoleLogger, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromDiscoveryAdapter, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createShardedDiscoveryAdapter, createStorageAdapterFromStore, fetchAIResponse, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, noopLogger, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver };
6359
+ export { BalanceManager, CashuSpender, FailoverError, InsufficientBalanceError, MintDiscovery, MintDiscoveryError, MintUnreachableError, ModelManager, ModelNotFoundError, NoProvidersAvailableError, ProviderBootstrapError, ProviderError, ProviderManager, RoutstrClient, SDK_STORAGE_KEYS, StreamProcessor, StreamingError, TokenOperationError, consoleLogger, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromDiscoveryAdapter, createProviderRegistryFromStore, createSSEParserTransform, createSdkStore, createShardedDiscoveryAdapter, createStorageAdapterFromStore, extractResponseId, extractUsageFromResponseBody, extractUsageFromSSEJson, fetchAIResponse, filterBaseUrlsForTor, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, getProviderEndpoints, inspectSSEWebStream, isOnionUrl, isTorContext, localStorageDriver, noopLogger, normalizeProviderUrl, routeRequests, setDefaultUsageTrackingDriver, toUsageStats };
6229
6360
  //# sourceMappingURL=browser.mjs.map
6230
6361
  //# sourceMappingURL=browser.mjs.map