@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.
- 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 +271 -66
- package/dist/bun.js.map +1 -1
- package/dist/bun.mjs +268 -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 +272 -66
- package/dist/node.js.map +1 -1
- package/dist/node.mjs +269 -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 +169 -0
- package/dist/storage/bun.js.map +1 -1
- package/dist/storage/bun.mjs +169 -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 +170 -0
- package/dist/storage/node.js.map +1 -1
- package/dist/storage/node.mjs +170 -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 +1 -1
package/dist/index.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
|
|
334
|
-
* Returns user-configured relays if set, otherwise the
|
|
338
|
+
* Resolve Nostr relay URLs.
|
|
339
|
+
* Returns user-configured relays if set, otherwise the shared defaults.
|
|
335
340
|
*/
|
|
336
|
-
getNostrRelays(
|
|
337
|
-
return this.nostrRelays && this.nostrRelays.length > 0 ? this.nostrRelays :
|
|
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 <
|
|
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
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
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:
|
|
2157
|
-
apiKey:
|
|
2158
|
-
forceRefund
|
|
2149
|
+
baseUrl: candidate.baseUrl,
|
|
2150
|
+
apiKey: candidate.key,
|
|
2151
|
+
forceRefund: true
|
|
2159
2152
|
});
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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(
|
|
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=index.mjs.map
|
|
6230
6361
|
//# sourceMappingURL=index.mjs.map
|