@antseed/node 0.1.1 → 0.1.3
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/LICENSE +674 -0
- package/README.md +7 -5
- package/dist/discovery/announcer.d.ts +11 -0
- package/dist/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +103 -70
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/discovery/http-metadata-resolver.d.ts +6 -0
- package/dist/discovery/http-metadata-resolver.d.ts.map +1 -1
- package/dist/discovery/http-metadata-resolver.js +32 -4
- package/dist/discovery/http-metadata-resolver.js.map +1 -1
- package/dist/discovery/index.d.ts +1 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +1 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/metadata-codec.d.ts +4 -0
- package/dist/discovery/metadata-codec.d.ts.map +1 -1
- package/dist/discovery/metadata-codec.js +89 -0
- package/dist/discovery/metadata-codec.js.map +1 -1
- package/dist/discovery/metadata-validator.d.ts +3 -0
- package/dist/discovery/metadata-validator.d.ts.map +1 -1
- package/dist/discovery/metadata-validator.js +72 -0
- package/dist/discovery/metadata-validator.js.map +1 -1
- package/dist/discovery/peer-lookup.d.ts +1 -0
- package/dist/discovery/peer-lookup.d.ts.map +1 -1
- package/dist/discovery/peer-lookup.js +10 -25
- package/dist/discovery/peer-lookup.js.map +1 -1
- package/dist/discovery/peer-metadata.d.ts +4 -1
- package/dist/discovery/peer-metadata.d.ts.map +1 -1
- package/dist/discovery/peer-metadata.js +9 -1
- package/dist/discovery/peer-metadata.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/seller-provider.d.ts +2 -0
- package/dist/interfaces/seller-provider.d.ts.map +1 -1
- package/dist/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +177 -69
- package/dist/node.js.map +1 -1
- package/dist/p2p/message-protocol.js +3 -3
- package/dist/p2p/message-protocol.js.map +1 -1
- package/dist/types/peer.d.ts +5 -0
- package/dist/types/peer.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/node.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export interface NodePaymentsConfig {
|
|
|
33
33
|
}
|
|
34
34
|
export interface NodeConfig {
|
|
35
35
|
role: 'seller' | 'buyer';
|
|
36
|
+
displayName?: string;
|
|
36
37
|
dataDir?: string;
|
|
37
38
|
dhtPort?: number;
|
|
38
39
|
signalingPort?: number;
|
|
@@ -41,6 +42,10 @@ export interface NodeConfig {
|
|
|
41
42
|
port: number;
|
|
42
43
|
}>;
|
|
43
44
|
requestTimeoutMs?: number;
|
|
45
|
+
/** Maximum buffered body size (bytes) while reconstructing streaming responses. Default: 16 MiB. */
|
|
46
|
+
maxStreamBufferBytes?: number;
|
|
47
|
+
/** Maximum wall time allowed for a streaming response. Default: 5 minutes. */
|
|
48
|
+
maxStreamDurationMs?: number;
|
|
44
49
|
/** Allow private/loopback IPs in DHT lookups. Default: false. Set true for local testing. */
|
|
45
50
|
allowPrivateIPs?: boolean;
|
|
46
51
|
/** Optional seller-side payment runtime wiring. */
|
|
@@ -69,6 +74,7 @@ export interface RequestStreamCallbacks {
|
|
|
69
74
|
onResponseChunk?: (chunk: SerializedHttpResponseChunk) => void;
|
|
70
75
|
}
|
|
71
76
|
export declare class AntseedNode extends EventEmitter {
|
|
77
|
+
private static readonly _METADATA_REFRESH_DEBOUNCE_MS;
|
|
72
78
|
private _config;
|
|
73
79
|
private _identity;
|
|
74
80
|
private _dht;
|
|
@@ -86,6 +92,8 @@ export declare class AntseedNode extends EventEmitter {
|
|
|
86
92
|
private _balanceManager;
|
|
87
93
|
private _escrowClient;
|
|
88
94
|
private _paymentMuxes;
|
|
95
|
+
private _providerLoadCounts;
|
|
96
|
+
private _metadataRefreshTimer;
|
|
89
97
|
/** Per-buyer session tracking: buyerPeerId → seller session state */
|
|
90
98
|
private _sessions;
|
|
91
99
|
private _settlementTimers;
|
|
@@ -185,5 +193,8 @@ export declare class AntseedNode extends EventEmitter {
|
|
|
185
193
|
*/
|
|
186
194
|
private _endAllBuyerSessions;
|
|
187
195
|
private _lookupResultToPeerInfo;
|
|
196
|
+
private _adjustProviderLoad;
|
|
197
|
+
private _scheduleMetadataRefresh;
|
|
198
|
+
private _unrefTimer;
|
|
188
199
|
}
|
|
189
200
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/dist/node.js
CHANGED
|
@@ -25,6 +25,7 @@ import { debugLog, debugWarn } from "./utils/debug.js";
|
|
|
25
25
|
import { BuyerPaymentManager } from "./payments/buyer-payment-manager.js";
|
|
26
26
|
import { identityToEvmAddress } from "./payments/evm/keypair.js";
|
|
27
27
|
export class AntseedNode extends EventEmitter {
|
|
28
|
+
static _METADATA_REFRESH_DEBOUNCE_MS = 200;
|
|
28
29
|
_config;
|
|
29
30
|
_identity = null;
|
|
30
31
|
_dht = null;
|
|
@@ -42,6 +43,8 @@ export class AntseedNode extends EventEmitter {
|
|
|
42
43
|
_balanceManager = null;
|
|
43
44
|
_escrowClient = null;
|
|
44
45
|
_paymentMuxes = new Map();
|
|
46
|
+
_providerLoadCounts = new Map();
|
|
47
|
+
_metadataRefreshTimer = null;
|
|
45
48
|
/** Per-buyer session tracking: buyerPeerId → seller session state */
|
|
46
49
|
_sessions = new Map();
|
|
47
50
|
_settlementTimers = new Map();
|
|
@@ -147,6 +150,11 @@ export class AntseedNode extends EventEmitter {
|
|
|
147
150
|
clearTimeout(timer);
|
|
148
151
|
}
|
|
149
152
|
this._settlementTimers.clear();
|
|
153
|
+
if (this._metadataRefreshTimer) {
|
|
154
|
+
clearTimeout(this._metadataRefreshTimer);
|
|
155
|
+
this._metadataRefreshTimer = null;
|
|
156
|
+
}
|
|
157
|
+
this._providerLoadCounts.clear();
|
|
150
158
|
// Remove NAT port mappings
|
|
151
159
|
if (this._nat) {
|
|
152
160
|
await this._nat.cleanup();
|
|
@@ -266,23 +274,39 @@ export class AntseedNode extends EventEmitter {
|
|
|
266
274
|
const startTime = Date.now();
|
|
267
275
|
return new Promise((resolve, reject) => {
|
|
268
276
|
const timeoutMs = this._config.requestTimeoutMs ?? 30_000;
|
|
277
|
+
const maxStreamBufferBytes = Math.max(1, this._config.maxStreamBufferBytes ?? 16 * 1024 * 1024);
|
|
278
|
+
const maxStreamDurationMs = Math.max(1, this._config.maxStreamDurationMs ?? 5 * 60_000);
|
|
279
|
+
// Idle timeout for streaming: resets on each chunk so long-running
|
|
280
|
+
// streams (thinking models, large outputs) stay alive as long as
|
|
281
|
+
// data keeps flowing.
|
|
282
|
+
const streamIdleTimeoutMs = Math.max(timeoutMs, 60_000);
|
|
269
283
|
let settled = false;
|
|
270
284
|
let streamStarted = false;
|
|
285
|
+
let streamStartedAtMs = 0;
|
|
286
|
+
let streamBufferedBytes = 0;
|
|
271
287
|
let streamStartResponse = null;
|
|
272
288
|
const streamChunks = [];
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
289
|
+
let activeTimeout = null;
|
|
290
|
+
const resetTimeout = (ms) => {
|
|
291
|
+
if (activeTimeout)
|
|
292
|
+
clearTimeout(activeTimeout);
|
|
293
|
+
activeTimeout = setTimeout(() => {
|
|
294
|
+
if (settled)
|
|
295
|
+
return;
|
|
296
|
+
settled = true;
|
|
297
|
+
debugWarn(`[Node] Request ${req.requestId.slice(0, 8)} timed out after ${Date.now() - startTime}ms`);
|
|
298
|
+
mux.cancelProxyRequest(req.requestId);
|
|
299
|
+
reject(new Error(`Request ${req.requestId} timed out`));
|
|
300
|
+
}, ms);
|
|
301
|
+
};
|
|
302
|
+
// Initial timeout: wait for the first response frame.
|
|
303
|
+
resetTimeout(timeoutMs);
|
|
281
304
|
const finish = (response) => {
|
|
282
305
|
if (settled)
|
|
283
306
|
return;
|
|
284
307
|
settled = true;
|
|
285
|
-
|
|
308
|
+
if (activeTimeout)
|
|
309
|
+
clearTimeout(activeTimeout);
|
|
286
310
|
const cleaned = this._stripStreamingHeader(response);
|
|
287
311
|
debugLog(`[Node] Response for ${req.requestId.slice(0, 8)}: status=${cleaned.statusCode} (${Date.now() - startTime}ms, ${cleaned.body.length}b)`);
|
|
288
312
|
resolve(cleaned);
|
|
@@ -291,21 +315,46 @@ export class AntseedNode extends EventEmitter {
|
|
|
291
315
|
if (settled)
|
|
292
316
|
return;
|
|
293
317
|
settled = true;
|
|
294
|
-
|
|
318
|
+
if (activeTimeout)
|
|
319
|
+
clearTimeout(activeTimeout);
|
|
295
320
|
reject(error);
|
|
296
321
|
};
|
|
297
322
|
mux.sendProxyRequest(req, (response, metadata) => {
|
|
323
|
+
if (settled)
|
|
324
|
+
return;
|
|
298
325
|
if (metadata.streamingStart) {
|
|
299
326
|
streamStarted = true;
|
|
327
|
+
streamStartedAtMs = Date.now();
|
|
328
|
+
streamBufferedBytes = 0;
|
|
300
329
|
streamStartResponse = this._stripStreamingHeader(response);
|
|
330
|
+
// Switch to streaming idle timeout: resets on each chunk.
|
|
331
|
+
resetTimeout(streamIdleTimeoutMs);
|
|
301
332
|
callbacks?.onResponseStart?.(streamStartResponse, { streaming: true });
|
|
302
333
|
return;
|
|
303
334
|
}
|
|
304
335
|
callbacks?.onResponseStart?.(this._stripStreamingHeader(response), { streaming: false });
|
|
305
336
|
finish(response);
|
|
306
337
|
}, (chunk) => {
|
|
338
|
+
if (settled)
|
|
339
|
+
return;
|
|
307
340
|
if (!streamStarted)
|
|
308
341
|
return;
|
|
342
|
+
// Reset idle timeout on each chunk so streaming stays alive.
|
|
343
|
+
resetTimeout(streamIdleTimeoutMs);
|
|
344
|
+
if (Date.now() - streamStartedAtMs > maxStreamDurationMs) {
|
|
345
|
+
mux.cancelProxyRequest(req.requestId);
|
|
346
|
+
fail(new Error(`Stream ${req.requestId} exceeded max duration (${maxStreamDurationMs}ms)`));
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if (chunk.data.length > 0) {
|
|
350
|
+
const nextBufferedBytes = streamBufferedBytes + chunk.data.length;
|
|
351
|
+
if (nextBufferedBytes > maxStreamBufferBytes) {
|
|
352
|
+
mux.cancelProxyRequest(req.requestId);
|
|
353
|
+
fail(new Error(`Stream ${req.requestId} exceeded max buffered size (${maxStreamBufferBytes} bytes)`));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
streamBufferedBytes = nextBufferedBytes;
|
|
357
|
+
}
|
|
309
358
|
callbacks?.onResponseChunk?.(chunk);
|
|
310
359
|
if (chunk.data.length > 0) {
|
|
311
360
|
streamChunks.push(chunk.data);
|
|
@@ -374,7 +423,16 @@ export class AntseedNode extends EventEmitter {
|
|
|
374
423
|
_wireConnection(conn, peerId) {
|
|
375
424
|
const decoder = new FrameDecoder();
|
|
376
425
|
conn.on("message", (data) => {
|
|
377
|
-
|
|
426
|
+
let frames;
|
|
427
|
+
try {
|
|
428
|
+
frames = decoder.feed(data);
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
432
|
+
debugWarn(`[Node] Failed to decode frame from ${peerId.slice(0, 12)}...: ${message}`);
|
|
433
|
+
conn.fail(err instanceof Error ? err : new Error(message));
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
378
436
|
const proxyMux = this._muxes.get(peerId);
|
|
379
437
|
const paymentMux = this._paymentMuxes.get(peerId);
|
|
380
438
|
for (const frame of frames) {
|
|
@@ -461,8 +519,10 @@ export class AntseedNode extends EventEmitter {
|
|
|
461
519
|
providers: this._providers.map((p) => ({
|
|
462
520
|
provider: p.name,
|
|
463
521
|
models: p.models,
|
|
522
|
+
...(p.modelCategories ? { modelCategories: { ...p.modelCategories } } : {}),
|
|
464
523
|
maxConcurrency: p.maxConcurrency,
|
|
465
524
|
})),
|
|
525
|
+
...(this._config.displayName ? { displayName: this._config.displayName } : {}),
|
|
466
526
|
region: "unknown",
|
|
467
527
|
pricing: new Map(this._providers.map((p) => [
|
|
468
528
|
p.name,
|
|
@@ -557,7 +617,10 @@ export class AntseedNode extends EventEmitter {
|
|
|
557
617
|
});
|
|
558
618
|
return;
|
|
559
619
|
}
|
|
560
|
-
const
|
|
620
|
+
const requestedModel = this._extractRequestedModel(request);
|
|
621
|
+
const provider = this._providers.find((p) => p.models.length === 0
|
|
622
|
+
|| (requestedModel && p.models.includes(requestedModel))
|
|
623
|
+
|| this._providers.length === 1);
|
|
561
624
|
if (!provider) {
|
|
562
625
|
debugWarn(`[Node] No matching provider for ${request.path}`);
|
|
563
626
|
mux.sendProxyResponse({
|
|
@@ -576,60 +639,66 @@ export class AntseedNode extends EventEmitter {
|
|
|
576
639
|
let statusCode = 500;
|
|
577
640
|
let responseBody = new Uint8Array(0);
|
|
578
641
|
let streamedResponseStarted = false;
|
|
642
|
+
this._adjustProviderLoad(provider.name, 1);
|
|
579
643
|
try {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
statusCode = response.statusCode;
|
|
593
|
-
responseBody = response.body;
|
|
594
|
-
debugLog(`[Node] Provider responded: status=${statusCode} (${Date.now() - startTime}ms, ${responseBody.length}b)`);
|
|
595
|
-
if (!streamedResponseStarted) {
|
|
596
|
-
mux.sendProxyResponse(response);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
catch (err) {
|
|
600
|
-
const message = err instanceof Error ? err.message : "Internal error";
|
|
601
|
-
debugWarn(`[Node] Provider error after ${Date.now() - startTime}ms: ${message}`);
|
|
602
|
-
responseBody = new TextEncoder().encode(message);
|
|
603
|
-
if (streamedResponseStarted) {
|
|
604
|
-
mux.sendProxyChunk({
|
|
605
|
-
requestId: request.requestId,
|
|
606
|
-
data: new TextEncoder().encode(`event: error\ndata: ${message}\n\n`),
|
|
607
|
-
done: false,
|
|
608
|
-
});
|
|
609
|
-
mux.sendProxyChunk({
|
|
610
|
-
requestId: request.requestId,
|
|
611
|
-
data: new Uint8Array(0),
|
|
612
|
-
done: true,
|
|
644
|
+
try {
|
|
645
|
+
const response = await this._executeProviderRequest(provider, request, {
|
|
646
|
+
onResponseStart: (streamResponseStart) => {
|
|
647
|
+
streamedResponseStarted = true;
|
|
648
|
+
statusCode = streamResponseStart.statusCode;
|
|
649
|
+
mux.sendProxyResponse(streamResponseStart);
|
|
650
|
+
},
|
|
651
|
+
onResponseChunk: (chunk) => {
|
|
652
|
+
if (!streamedResponseStarted)
|
|
653
|
+
return;
|
|
654
|
+
mux.sendProxyChunk(chunk);
|
|
655
|
+
},
|
|
613
656
|
});
|
|
657
|
+
statusCode = response.statusCode;
|
|
658
|
+
responseBody = response.body;
|
|
659
|
+
debugLog(`[Node] Provider responded: status=${statusCode} (${Date.now() - startTime}ms, ${responseBody.length}b)`);
|
|
660
|
+
if (!streamedResponseStarted) {
|
|
661
|
+
mux.sendProxyResponse(response);
|
|
662
|
+
}
|
|
614
663
|
}
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
664
|
+
catch (err) {
|
|
665
|
+
const message = err instanceof Error ? err.message : "Internal error";
|
|
666
|
+
debugWarn(`[Node] Provider error after ${Date.now() - startTime}ms: ${message}`);
|
|
667
|
+
responseBody = new TextEncoder().encode(message);
|
|
668
|
+
if (streamedResponseStarted) {
|
|
669
|
+
mux.sendProxyChunk({
|
|
670
|
+
requestId: request.requestId,
|
|
671
|
+
data: new TextEncoder().encode(`event: error\ndata: ${message}\n\n`),
|
|
672
|
+
done: false,
|
|
673
|
+
});
|
|
674
|
+
mux.sendProxyChunk({
|
|
675
|
+
requestId: request.requestId,
|
|
676
|
+
data: new Uint8Array(0),
|
|
677
|
+
done: true,
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
statusCode = 500;
|
|
682
|
+
mux.sendProxyResponse({
|
|
683
|
+
requestId: request.requestId,
|
|
684
|
+
statusCode: 500,
|
|
685
|
+
headers: { "content-type": "text/plain" },
|
|
686
|
+
body: responseBody,
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
// Record metering
|
|
691
|
+
const latencyMs = Date.now() - startTime;
|
|
692
|
+
const requestPricing = this._resolveProviderPricing(provider, request);
|
|
693
|
+
await this._recordMetering(buyerPeerId, provider.name, requestPricing, request, statusCode, latencyMs, request.body.length, responseBody.length);
|
|
694
|
+
// Generate bilateral receipt after each request if lock committed (Task 3)
|
|
695
|
+
const currentSession = this._sessions.get(buyerPeerId);
|
|
696
|
+
if (currentSession?.lockCommitted) {
|
|
697
|
+
await this._sendBilateralReceipt(buyerPeerId, currentSession, requestPricing, responseBody, paymentMux);
|
|
623
698
|
}
|
|
624
699
|
}
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
const requestPricing = this._resolveProviderPricing(provider, request);
|
|
628
|
-
await this._recordMetering(buyerPeerId, provider.name, requestPricing, request, statusCode, latencyMs, request.body.length, responseBody.length);
|
|
629
|
-
// Generate bilateral receipt after each request if lock committed (Task 3)
|
|
630
|
-
const currentSession = this._sessions.get(buyerPeerId);
|
|
631
|
-
if (currentSession?.lockCommitted) {
|
|
632
|
-
await this._sendBilateralReceipt(buyerPeerId, currentSession, requestPricing, responseBody, paymentMux);
|
|
700
|
+
finally {
|
|
701
|
+
this._adjustProviderLoad(provider.name, -1);
|
|
633
702
|
}
|
|
634
703
|
});
|
|
635
704
|
this._muxes.set(buyerPeerId, mux);
|
|
@@ -1390,23 +1459,33 @@ export class AntseedNode extends EventEmitter {
|
|
|
1390
1459
|
_lookupResultToPeerInfo(result) {
|
|
1391
1460
|
const providers = result.metadata.providers.map((p) => p.provider);
|
|
1392
1461
|
const firstProvider = result.metadata.providers[0];
|
|
1393
|
-
const providerPricingEntries =
|
|
1394
|
-
|
|
1395
|
-
|
|
1462
|
+
const providerPricingEntries = {};
|
|
1463
|
+
const providerModelCategoryEntries = {};
|
|
1464
|
+
for (const providerAnnouncement of result.metadata.providers) {
|
|
1465
|
+
providerPricingEntries[providerAnnouncement.provider] = {
|
|
1396
1466
|
defaults: {
|
|
1397
|
-
inputUsdPerMillion:
|
|
1398
|
-
outputUsdPerMillion:
|
|
1467
|
+
inputUsdPerMillion: providerAnnouncement.defaultPricing.inputUsdPerMillion,
|
|
1468
|
+
outputUsdPerMillion: providerAnnouncement.defaultPricing.outputUsdPerMillion,
|
|
1399
1469
|
},
|
|
1400
|
-
...(
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1470
|
+
...(providerAnnouncement.modelPricing ? { models: { ...providerAnnouncement.modelPricing } } : {}),
|
|
1471
|
+
};
|
|
1472
|
+
if (providerAnnouncement.modelCategories && Object.keys(providerAnnouncement.modelCategories).length > 0) {
|
|
1473
|
+
providerModelCategoryEntries[providerAnnouncement.provider] = {
|
|
1474
|
+
models: Object.fromEntries(Object.entries(providerAnnouncement.modelCategories)
|
|
1475
|
+
.map(([model, categories]) => [model, [...categories]])),
|
|
1476
|
+
};
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1403
1479
|
const hasProviderPricing = Object.keys(providerPricingEntries).length > 0;
|
|
1480
|
+
const hasProviderModelCategories = Object.keys(providerModelCategoryEntries).length > 0;
|
|
1404
1481
|
return {
|
|
1405
1482
|
peerId: result.metadata.peerId,
|
|
1483
|
+
displayName: result.metadata.displayName,
|
|
1406
1484
|
lastSeen: result.metadata.timestamp,
|
|
1407
1485
|
providers,
|
|
1408
1486
|
publicAddress: `${result.host}:${result.port}`,
|
|
1409
1487
|
...(hasProviderPricing ? { providerPricing: providerPricingEntries } : {}),
|
|
1488
|
+
...(hasProviderModelCategories ? { providerModelCategories: providerModelCategoryEntries } : {}),
|
|
1410
1489
|
defaultInputUsdPerMillion: firstProvider?.defaultPricing.inputUsdPerMillion,
|
|
1411
1490
|
defaultOutputUsdPerMillion: firstProvider?.defaultPricing.outputUsdPerMillion,
|
|
1412
1491
|
maxConcurrency: firstProvider?.maxConcurrency,
|
|
@@ -1418,6 +1497,35 @@ export class AntseedNode extends EventEmitter {
|
|
|
1418
1497
|
trustScore: result.metadata.onChainReputation,
|
|
1419
1498
|
};
|
|
1420
1499
|
}
|
|
1500
|
+
_adjustProviderLoad(providerName, delta) {
|
|
1501
|
+
const nextLoad = Math.max(0, (this._providerLoadCounts.get(providerName) ?? 0) + delta);
|
|
1502
|
+
this._providerLoadCounts.set(providerName, nextLoad);
|
|
1503
|
+
if (!this._announcer)
|
|
1504
|
+
return;
|
|
1505
|
+
this._announcer.updateLoad(providerName, nextLoad);
|
|
1506
|
+
this._scheduleMetadataRefresh();
|
|
1507
|
+
}
|
|
1508
|
+
_scheduleMetadataRefresh() {
|
|
1509
|
+
if (!this._announcer || this._metadataRefreshTimer) {
|
|
1510
|
+
return;
|
|
1511
|
+
}
|
|
1512
|
+
const timer = setTimeout(() => {
|
|
1513
|
+
this._metadataRefreshTimer = null;
|
|
1514
|
+
const announcer = this._announcer;
|
|
1515
|
+
if (!announcer)
|
|
1516
|
+
return;
|
|
1517
|
+
void announcer.refreshMetadata().catch((err) => {
|
|
1518
|
+
debugWarn(`[Node] Failed to refresh metadata snapshot: ${err instanceof Error ? err.message : err}`);
|
|
1519
|
+
});
|
|
1520
|
+
}, AntseedNode._METADATA_REFRESH_DEBOUNCE_MS);
|
|
1521
|
+
this._metadataRefreshTimer = timer;
|
|
1522
|
+
this._unrefTimer(timer);
|
|
1523
|
+
}
|
|
1524
|
+
_unrefTimer(timer) {
|
|
1525
|
+
if (typeof timer.unref === "function") {
|
|
1526
|
+
timer.unref();
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1421
1529
|
}
|
|
1422
1530
|
function concatChunks(chunks) {
|
|
1423
1531
|
if (chunks.length === 0)
|