@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/README.md
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
[](https://nodejs.org/)
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
|
|
7
|
-
Core protocol SDK for AntSeed
|
|
7
|
+
Core protocol SDK for AntSeed — a peer-to-peer AI services network. Providers offer AI services, buyers discover providers via DHT and send requests over encrypted P2P connections.
|
|
8
|
+
|
|
9
|
+
> **Important:** AntSeed is designed for providers who build differentiated services on top of AI APIs — such as TEE-secured inference, domain-specific skills and agents, fine-tuned models, or managed product experiences. Simply reselling raw API access or subscription credentials is not the intended use and may violate your upstream provider's terms of service.
|
|
8
10
|
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
@@ -14,9 +16,9 @@ npm install @antseed/node
|
|
|
14
16
|
|
|
15
17
|
## Quick Start
|
|
16
18
|
|
|
17
|
-
###
|
|
19
|
+
### Provider Mode
|
|
18
20
|
|
|
19
|
-
A
|
|
21
|
+
A provider node announces its capacity on the DHT and serves inference requests from buyers.
|
|
20
22
|
|
|
21
23
|
```ts
|
|
22
24
|
import { AntseedNode } from '@antseed/node';
|
|
@@ -207,7 +209,7 @@ import { BalanceManager } from '@antseed/node/payments';
|
|
|
207
209
|
|
|
208
210
|
## Provider Interface
|
|
209
211
|
|
|
210
|
-
Implement `Provider` to expose any LLM backend as a
|
|
212
|
+
Implement `Provider` to expose any LLM backend as a provider on the network.
|
|
211
213
|
|
|
212
214
|
```ts
|
|
213
215
|
interface Provider {
|
|
@@ -321,7 +323,7 @@ const plugin: AntseedProviderPlugin = {
|
|
|
321
323
|
displayName: 'My Provider',
|
|
322
324
|
version: '1.0.0',
|
|
323
325
|
type: 'provider',
|
|
324
|
-
description: '
|
|
326
|
+
description: 'Provides My LLM capacity on the Antseed Network',
|
|
325
327
|
configSchema: [
|
|
326
328
|
{ key: 'MY_API_KEY', label: 'API Key', type: 'secret', required: true, description: 'API key for My LLM' },
|
|
327
329
|
{ key: 'MY_MODELS', label: 'Models', type: 'string[]', required: false, description: 'Comma-separated model list' },
|
|
@@ -9,8 +9,10 @@ export interface AnnouncerConfig {
|
|
|
9
9
|
providers: Array<{
|
|
10
10
|
provider: string;
|
|
11
11
|
models: string[];
|
|
12
|
+
modelCategories?: Record<string, string[]>;
|
|
12
13
|
maxConcurrency: number;
|
|
13
14
|
}>;
|
|
15
|
+
displayName?: string;
|
|
14
16
|
region: string;
|
|
15
17
|
pricing: Map<string, {
|
|
16
18
|
defaults: {
|
|
@@ -36,9 +38,18 @@ export declare class PeerAnnouncer {
|
|
|
36
38
|
private _latestMetadata;
|
|
37
39
|
constructor(config: AnnouncerConfig);
|
|
38
40
|
announce(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Refresh signed metadata snapshot without announcing to DHT.
|
|
43
|
+
* Useful for high-frequency fields like current provider load.
|
|
44
|
+
*/
|
|
45
|
+
refreshMetadata(): Promise<void>;
|
|
39
46
|
startPeriodicAnnounce(): void;
|
|
40
47
|
stopPeriodicAnnounce(): void;
|
|
41
48
|
updateLoad(providerName: string, currentLoad: number): void;
|
|
42
49
|
getLatestMetadata(): PeerMetadata | null;
|
|
50
|
+
private _buildSignedMetadata;
|
|
51
|
+
private _announceTopics;
|
|
52
|
+
private _tryAnnounceTopic;
|
|
53
|
+
private _normalizeModelCategories;
|
|
43
54
|
}
|
|
44
55
|
//# sourceMappingURL=announcer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../src/discovery/announcer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAK7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CACV,MAAM,EACN;QACE,QAAQ,EAAE;YAAE,kBAAkB,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC;QACtE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,kBAAkB,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtF,CACF,CAAC;IACF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,eAAe,CAA6B;gBAExC,MAAM,EAAE,eAAe;IAI7B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../src/discovery/announcer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAK7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CACV,MAAM,EACN;QACE,QAAQ,EAAE;YAAE,kBAAkB,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC;QACtE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,kBAAkB,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtF,CACF,CAAC;IACF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,eAAe,CAA6B;gBAExC,MAAM,EAAE,eAAe;IAI7B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,qBAAqB,IAAI,IAAI;IAe7B,oBAAoB,IAAI,IAAI;IAO5B,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAI3D,iBAAiB,IAAI,YAAY,GAAG,IAAI;YAI1B,oBAAoB;YAsEpB,eAAe;YAcf,iBAAiB;IAS/B,OAAO,CAAC,yBAAyB;CA6BlC"}
|
|
@@ -14,6 +14,44 @@ export class PeerAnnouncer {
|
|
|
14
14
|
this.config = config;
|
|
15
15
|
}
|
|
16
16
|
async announce() {
|
|
17
|
+
const metadata = await this._buildSignedMetadata(true);
|
|
18
|
+
this._latestMetadata = metadata;
|
|
19
|
+
await this._announceTopics(metadata.providers);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Refresh signed metadata snapshot without announcing to DHT.
|
|
23
|
+
* Useful for high-frequency fields like current provider load.
|
|
24
|
+
*/
|
|
25
|
+
async refreshMetadata() {
|
|
26
|
+
this._latestMetadata = await this._buildSignedMetadata(false);
|
|
27
|
+
}
|
|
28
|
+
startPeriodicAnnounce() {
|
|
29
|
+
if (this.intervalHandle) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Announce immediately, then on interval
|
|
33
|
+
void this.announce().catch((err) => {
|
|
34
|
+
debugWarn(`[Announcer] Initial announce failed: ${err instanceof Error ? err.message : err}`);
|
|
35
|
+
});
|
|
36
|
+
this.intervalHandle = setInterval(() => {
|
|
37
|
+
void this.announce().catch((err) => {
|
|
38
|
+
debugWarn(`[Announcer] Periodic announce failed: ${err instanceof Error ? err.message : err}`);
|
|
39
|
+
});
|
|
40
|
+
}, this.config.reannounceIntervalMs);
|
|
41
|
+
}
|
|
42
|
+
stopPeriodicAnnounce() {
|
|
43
|
+
if (this.intervalHandle) {
|
|
44
|
+
clearInterval(this.intervalHandle);
|
|
45
|
+
this.intervalHandle = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
updateLoad(providerName, currentLoad) {
|
|
49
|
+
this.loadMap.set(providerName, currentLoad);
|
|
50
|
+
}
|
|
51
|
+
getLatestMetadata() {
|
|
52
|
+
return this._latestMetadata;
|
|
53
|
+
}
|
|
54
|
+
async _buildSignedMetadata(includeOnChainReputation = true) {
|
|
17
55
|
const providers = this.config.providers.map((p) => {
|
|
18
56
|
const pricing = this.config.pricing.get(p.provider) ?? {
|
|
19
57
|
defaults: {
|
|
@@ -21,109 +59,104 @@ export class PeerAnnouncer {
|
|
|
21
59
|
outputUsdPerMillion: 0,
|
|
22
60
|
},
|
|
23
61
|
};
|
|
24
|
-
|
|
62
|
+
const providerAnnouncement = {
|
|
25
63
|
provider: p.provider,
|
|
26
64
|
models: p.models,
|
|
27
65
|
defaultPricing: pricing.defaults,
|
|
28
|
-
...(pricing.models ? { modelPricing: pricing.models } : {}),
|
|
29
66
|
maxConcurrency: p.maxConcurrency,
|
|
30
67
|
currentLoad: this.loadMap.get(p.provider) ?? 0,
|
|
31
68
|
};
|
|
69
|
+
if (pricing.models) {
|
|
70
|
+
providerAnnouncement.modelPricing = pricing.models;
|
|
71
|
+
}
|
|
72
|
+
const normalizedModelCategories = this._normalizeModelCategories(p.modelCategories, p.models);
|
|
73
|
+
if (normalizedModelCategories) {
|
|
74
|
+
providerAnnouncement.modelCategories = normalizedModelCategories;
|
|
75
|
+
}
|
|
76
|
+
return providerAnnouncement;
|
|
32
77
|
});
|
|
33
78
|
const metadata = {
|
|
34
79
|
peerId: this.config.identity.peerId,
|
|
35
80
|
version: METADATA_VERSION,
|
|
81
|
+
...(this.config.displayName ? { displayName: this.config.displayName } : {}),
|
|
36
82
|
providers,
|
|
37
|
-
...(this.config.offerings && this.config.offerings.length > 0
|
|
38
|
-
? { offerings: this.config.offerings }
|
|
39
|
-
: {}),
|
|
40
|
-
...(this.config.stakeAmountUSDC != null
|
|
41
|
-
? { stakeAmountUSDC: this.config.stakeAmountUSDC }
|
|
42
|
-
: {}),
|
|
43
|
-
...(this.config.trustScore != null
|
|
44
|
-
? { trustScore: this.config.trustScore }
|
|
45
|
-
: {}),
|
|
46
83
|
region: this.config.region,
|
|
47
84
|
timestamp: Date.now(),
|
|
48
85
|
signature: "",
|
|
49
86
|
};
|
|
50
|
-
|
|
87
|
+
if (this.config.offerings && this.config.offerings.length > 0) {
|
|
88
|
+
metadata.offerings = this.config.offerings;
|
|
89
|
+
}
|
|
90
|
+
if (this.config.stakeAmountUSDC != null) {
|
|
91
|
+
metadata.stakeAmountUSDC = this.config.stakeAmountUSDC;
|
|
92
|
+
}
|
|
93
|
+
if (this.config.trustScore != null) {
|
|
94
|
+
metadata.trustScore = this.config.trustScore;
|
|
95
|
+
}
|
|
51
96
|
if (this.config.escrowClient) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
97
|
+
const evmAddress = identityToEvmAddress(this.config.identity);
|
|
98
|
+
metadata.evmAddress = evmAddress;
|
|
99
|
+
if (includeOnChainReputation) {
|
|
100
|
+
try {
|
|
101
|
+
const reputation = await this.config.escrowClient.getReputation(evmAddress);
|
|
102
|
+
metadata.onChainReputation = reputation.weightedAverage;
|
|
103
|
+
metadata.onChainSessionCount = reputation.sessionCount;
|
|
104
|
+
metadata.onChainDisputeCount = reputation.disputeCount;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Silently continue without reputation data
|
|
108
|
+
}
|
|
59
109
|
}
|
|
60
|
-
|
|
61
|
-
|
|
110
|
+
else if (this._latestMetadata) {
|
|
111
|
+
metadata.onChainReputation = this._latestMetadata.onChainReputation;
|
|
112
|
+
metadata.onChainSessionCount = this._latestMetadata.onChainSessionCount;
|
|
113
|
+
metadata.onChainDisputeCount = this._latestMetadata.onChainDisputeCount;
|
|
62
114
|
}
|
|
63
115
|
}
|
|
64
|
-
// Sign metadata
|
|
65
116
|
const dataToSign = encodeMetadataForSigning(metadata);
|
|
66
117
|
const signature = await signData(this.config.identity.privateKey, dataToSign);
|
|
67
118
|
metadata.signature = bytesToHex(signature);
|
|
68
|
-
|
|
69
|
-
|
|
119
|
+
return metadata;
|
|
120
|
+
}
|
|
121
|
+
async _announceTopics(providers) {
|
|
70
122
|
for (const p of providers) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// DHT may not have peers yet — will retry on next cycle
|
|
123
|
+
await this._tryAnnounceTopic(providerTopic(p.provider));
|
|
124
|
+
}
|
|
125
|
+
await this._tryAnnounceTopic(providerTopic("*"));
|
|
126
|
+
if (this.config.offerings) {
|
|
127
|
+
for (const offering of this.config.offerings) {
|
|
128
|
+
await this._tryAnnounceTopic(capabilityTopic(offering.capability, offering.name));
|
|
78
129
|
}
|
|
79
130
|
}
|
|
80
|
-
|
|
131
|
+
}
|
|
132
|
+
async _tryAnnounceTopic(topic) {
|
|
81
133
|
try {
|
|
82
|
-
const
|
|
83
|
-
await this.config.dht.announce(
|
|
134
|
+
const infoHash = topicToInfoHash(topic);
|
|
135
|
+
await this.config.dht.announce(infoHash, this.config.signalingPort);
|
|
84
136
|
}
|
|
85
137
|
catch {
|
|
86
138
|
// DHT may not have peers yet — will retry on next cycle
|
|
87
139
|
}
|
|
88
|
-
// Announce under each capability topic
|
|
89
|
-
if (this.config.offerings) {
|
|
90
|
-
for (const offering of this.config.offerings) {
|
|
91
|
-
try {
|
|
92
|
-
const topic = capabilityTopic(offering.capability, offering.name);
|
|
93
|
-
const infoHash = topicToInfoHash(topic);
|
|
94
|
-
await this.config.dht.announce(infoHash, this.config.signalingPort);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// DHT may not have peers yet — will retry on next cycle
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
140
|
}
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
return;
|
|
141
|
+
_normalizeModelCategories(modelCategories, supportedModels) {
|
|
142
|
+
if (!modelCategories) {
|
|
143
|
+
return undefined;
|
|
105
144
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
this.intervalHandle = null;
|
|
145
|
+
const supportedModelSet = new Set(supportedModels);
|
|
146
|
+
const normalized = {};
|
|
147
|
+
for (const [model, categories] of Object.entries(modelCategories)) {
|
|
148
|
+
if (!supportedModelSet.has(model)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const deduped = Array.from(new Set(categories
|
|
152
|
+
.map((category) => category.trim().toLowerCase())
|
|
153
|
+
.filter((category) => category.length > 0)));
|
|
154
|
+
if (deduped.length === 0) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
normalized[model] = deduped;
|
|
120
158
|
}
|
|
121
|
-
|
|
122
|
-
updateLoad(providerName, currentLoad) {
|
|
123
|
-
this.loadMap.set(providerName, currentLoad);
|
|
124
|
-
}
|
|
125
|
-
getLatestMetadata() {
|
|
126
|
-
return this._latestMetadata;
|
|
159
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
127
160
|
}
|
|
128
161
|
}
|
|
129
162
|
//# sourceMappingURL=announcer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcer.js","sourceRoot":"","sources":["../../src/discovery/announcer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"announcer.js","sourceRoot":"","sources":["../../src/discovery/announcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,17 @@ export interface HttpMetadataResolverConfig {
|
|
|
5
5
|
timeoutMs?: number;
|
|
6
6
|
/** Port offset from the signaling port to the metadata HTTP port. Default: 0 (same port) */
|
|
7
7
|
metadataPortOffset?: number;
|
|
8
|
+
/** Cooldown in ms before retrying an endpoint that recently failed. Default: 30000 */
|
|
9
|
+
failureCooldownMs?: number;
|
|
8
10
|
}
|
|
9
11
|
export declare class HttpMetadataResolver implements MetadataResolver {
|
|
10
12
|
private readonly timeoutMs;
|
|
11
13
|
private readonly metadataPortOffset;
|
|
14
|
+
private readonly failureCooldownMs;
|
|
15
|
+
private readonly failedEndpoints;
|
|
12
16
|
constructor(config?: HttpMetadataResolverConfig);
|
|
13
17
|
resolve(peer: PeerEndpoint): Promise<PeerMetadata | null>;
|
|
18
|
+
private markEndpointFailure;
|
|
19
|
+
private getEndpointKey;
|
|
14
20
|
}
|
|
15
21
|
//# sourceMappingURL=http-metadata-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-metadata-resolver.d.ts","sourceRoot":"","sources":["../../src/discovery/http-metadata-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,0BAA0B;IACzC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"http-metadata-resolver.d.ts","sourceRoot":"","sources":["../../src/discovery/http-metadata-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,0BAA0B;IACzC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,MAAM,CAAC,EAAE,0BAA0B;IAOzC,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyC/D,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,cAAc;CAGvB"}
|
|
@@ -2,24 +2,40 @@ import { debugWarn } from '../utils/debug.js';
|
|
|
2
2
|
export class HttpMetadataResolver {
|
|
3
3
|
timeoutMs;
|
|
4
4
|
metadataPortOffset;
|
|
5
|
+
failureCooldownMs;
|
|
6
|
+
failedEndpoints;
|
|
5
7
|
constructor(config) {
|
|
6
8
|
this.timeoutMs = config?.timeoutMs ?? 5000;
|
|
7
9
|
this.metadataPortOffset = config?.metadataPortOffset ?? 0;
|
|
10
|
+
this.failureCooldownMs = Math.max(0, config?.failureCooldownMs ?? 30_000);
|
|
11
|
+
this.failedEndpoints = new Map();
|
|
8
12
|
}
|
|
9
13
|
async resolve(peer) {
|
|
10
14
|
const metadataPort = peer.port + this.metadataPortOffset;
|
|
15
|
+
const endpointKey = this.getEndpointKey(peer.host, metadataPort);
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
const failedUntil = this.failedEndpoints.get(endpointKey);
|
|
18
|
+
if (failedUntil !== undefined) {
|
|
19
|
+
if (failedUntil > now) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
this.failedEndpoints.delete(endpointKey);
|
|
23
|
+
}
|
|
11
24
|
const url = `http://${peer.host}:${metadataPort}/metadata`;
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
12
27
|
try {
|
|
13
|
-
const controller = new AbortController();
|
|
14
|
-
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
15
28
|
const response = await fetch(url, { signal: controller.signal });
|
|
16
|
-
clearTimeout(timeout);
|
|
17
29
|
if (!response.ok) {
|
|
30
|
+
this.markEndpointFailure(endpointKey);
|
|
18
31
|
return null;
|
|
19
32
|
}
|
|
20
|
-
|
|
33
|
+
const metadata = (await response.json());
|
|
34
|
+
this.failedEndpoints.delete(endpointKey);
|
|
35
|
+
return metadata;
|
|
21
36
|
}
|
|
22
37
|
catch (err) {
|
|
38
|
+
this.markEndpointFailure(endpointKey);
|
|
23
39
|
const reason = err instanceof DOMException && err.name === 'AbortError'
|
|
24
40
|
? 'timeout'
|
|
25
41
|
: err instanceof SyntaxError
|
|
@@ -28,6 +44,18 @@ export class HttpMetadataResolver {
|
|
|
28
44
|
debugWarn(`[MetadataResolver] Failed to resolve ${url}: ${reason}`);
|
|
29
45
|
return null;
|
|
30
46
|
}
|
|
47
|
+
finally {
|
|
48
|
+
clearTimeout(timeout);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
markEndpointFailure(endpointKey) {
|
|
52
|
+
if (this.failureCooldownMs <= 0) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.failedEndpoints.set(endpointKey, Date.now() + this.failureCooldownMs);
|
|
56
|
+
}
|
|
57
|
+
getEndpointKey(host, port) {
|
|
58
|
+
return `${host.toLowerCase()}:${port}`;
|
|
31
59
|
}
|
|
32
60
|
}
|
|
33
61
|
//# sourceMappingURL=http-metadata-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-metadata-resolver.js","sourceRoot":"","sources":["../../src/discovery/http-metadata-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-metadata-resolver.js","sourceRoot":"","sources":["../../src/discovery/http-metadata-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export { scorePeer, rankPeers, selectBestPeer, selectDiversePeers, DEFAULT_SCORI
|
|
|
5
5
|
export { OFFICIAL_BOOTSTRAP_NODES, parseBootstrapList, mergeBootstrapNodes, toBootstrapConfig, type BootstrapNode } from './bootstrap.js';
|
|
6
6
|
export { encodeMetadata, encodeMetadataForSigning, decodeMetadata } from './metadata-codec.js';
|
|
7
7
|
export { validateMetadata, MAX_METADATA_SIZE, MAX_PROVIDERS, type ValidationError } from './metadata-validator.js';
|
|
8
|
-
export { METADATA_VERSION, type PeerMetadata, type ProviderAnnouncement } from './peer-metadata.js';
|
|
8
|
+
export { METADATA_VERSION, WELL_KNOWN_MODEL_CATEGORIES, type PeerMetadata, type ProviderAnnouncement } from './peer-metadata.js';
|
|
9
9
|
export { type MetadataResolver, type PeerEndpoint } from './metadata-resolver.js';
|
|
10
10
|
export { DefaultMetadataResolver } from './default-metadata-resolver.js';
|
|
11
11
|
export { HttpMetadataResolver, type HttpMetadataResolverConfig } from './http-metadata-resolver.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjL,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjL,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjI,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,KAAK,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7H,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/discovery/index.js
CHANGED
|
@@ -5,7 +5,7 @@ export { scorePeer, rankPeers, selectBestPeer, selectDiversePeers, DEFAULT_SCORI
|
|
|
5
5
|
export { OFFICIAL_BOOTSTRAP_NODES, parseBootstrapList, mergeBootstrapNodes, toBootstrapConfig } from './bootstrap.js';
|
|
6
6
|
export { encodeMetadata, encodeMetadataForSigning, decodeMetadata } from './metadata-codec.js';
|
|
7
7
|
export { validateMetadata, MAX_METADATA_SIZE, MAX_PROVIDERS } from './metadata-validator.js';
|
|
8
|
-
export { METADATA_VERSION } from './peer-metadata.js';
|
|
8
|
+
export { METADATA_VERSION, WELL_KNOWN_MODEL_CATEGORIES } from './peer-metadata.js';
|
|
9
9
|
export { DefaultMetadataResolver } from './default-metadata-resolver.js';
|
|
10
10
|
export { HttpMetadataResolver } from './http-metadata-resolver.js';
|
|
11
11
|
export { DHTHealthMonitor, DEFAULT_HEALTH_THRESHOLDS } from './dht-health.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAsB,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAwC,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,uBAAuB,EAA4D,MAAM,oBAAoB,CAAC;AACjL,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAsB,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAgD,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAsB,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAwC,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,EAAE,uBAAuB,EAA4D,MAAM,oBAAoB,CAAC;AACjL,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAsB,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAgD,MAAM,oBAAoB,CAAC;AAEjI,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAmC,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAiD,MAAM,iBAAiB,CAAC;AAC7H,OAAO,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAqD,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAA+B,MAAM,0BAA0B,CAAC"}
|
|
@@ -6,8 +6,12 @@ import type { PeerMetadata } from "./peer-metadata.js";
|
|
|
6
6
|
* [providerLen:1][provider:N][modelCount:1][models...]
|
|
7
7
|
* [defaultInputPrice:4][defaultOutputPrice:4]
|
|
8
8
|
* [modelPricingCount:1][modelPricingEntries...]
|
|
9
|
+
* [modelCategoryCount:1][modelCategoryEntries...] (v3+ only)
|
|
9
10
|
* [maxConcurrency:2][currentLoad:2]
|
|
10
11
|
* modelPricingEntry: [modelLen:1][model:N][inputPrice:4][outputPrice:4]
|
|
12
|
+
* modelCategoryEntry(v3+): [modelLen:1][model:N][categoryCount:1][categories...]
|
|
13
|
+
* category(v3+): [categoryLen:1][category:N]
|
|
14
|
+
* [displayNameFlag:1][displayNameLen:1][displayName:N] (v3+ only)
|
|
11
15
|
* [signature:64]
|
|
12
16
|
*/
|
|
13
17
|
export declare function encodeMetadata(metadata: PeerMetadata): Uint8Array;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-codec.d.ts","sourceRoot":"","sources":["../../src/discovery/metadata-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata-codec.d.ts","sourceRoot":"","sources":["../../src/discovery/metadata-codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,CAQjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,CAE3E;AA4MD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAmT7D"}
|