dpth 0.3.0 → 0.4.0
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/README.md +101 -148
- package/dist/adapter-sqlite.d.ts +17 -2
- package/dist/adapter-sqlite.d.ts.map +1 -1
- package/dist/adapter-sqlite.js +127 -16
- package/dist/adapter-sqlite.js.map +1 -1
- package/dist/dpth.d.ts +35 -2
- package/dist/dpth.d.ts.map +1 -1
- package/dist/dpth.js +157 -49
- package/dist/dpth.js.map +1 -1
- package/dist/entity.d.ts +1 -0
- package/dist/entity.d.ts.map +1 -1
- package/dist/entity.js +21 -5
- package/dist/entity.js.map +1 -1
- package/dist/errors.d.ts +43 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +63 -0
- package/dist/errors.js.map +1 -0
- package/dist/experimental/agent-sdk.d.ts +157 -0
- package/dist/experimental/agent-sdk.d.ts.map +1 -0
- package/dist/experimental/agent-sdk.js +367 -0
- package/dist/experimental/agent-sdk.js.map +1 -0
- package/dist/experimental/economics.d.ts +203 -0
- package/dist/experimental/economics.d.ts.map +1 -0
- package/dist/experimental/economics.js +510 -0
- package/dist/experimental/economics.js.map +1 -0
- package/dist/experimental/fallback.d.ts +104 -0
- package/dist/experimental/fallback.d.ts.map +1 -0
- package/dist/experimental/fallback.js +359 -0
- package/dist/experimental/fallback.js.map +1 -0
- package/dist/experimental/federation.d.ts +224 -0
- package/dist/experimental/federation.d.ts.map +1 -0
- package/dist/experimental/federation.js +377 -0
- package/dist/experimental/federation.js.map +1 -0
- package/dist/experimental/index.d.ts +20 -0
- package/dist/experimental/index.d.ts.map +1 -0
- package/dist/experimental/index.js +20 -0
- package/dist/experimental/index.js.map +1 -0
- package/dist/index.d.ts +14 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -14
- package/dist/index.js.map +1 -1
- package/dist/storage.d.ts +10 -11
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +4 -11
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +20 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +28 -0
- package/dist/util.js.map +1 -0
- package/package.json +13 -25
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dpth.io Centralized Inference Fallback
|
|
3
|
+
*
|
|
4
|
+
* When no agents are available to serve a model, routes to centralized
|
|
5
|
+
* API providers (OpenAI, Anthropic, etc.) as a fallback.
|
|
6
|
+
*
|
|
7
|
+
* Priority:
|
|
8
|
+
* 1. Distributed network (free, agent-served)
|
|
9
|
+
* 2. Centralized fallback (costs money, but always available)
|
|
10
|
+
*
|
|
11
|
+
* The fallback is transparent to clients — same API, same format.
|
|
12
|
+
*/
|
|
13
|
+
// ─── Provider Registry ───────────────────────────────
|
|
14
|
+
const PROVIDERS = [
|
|
15
|
+
{
|
|
16
|
+
id: 'openai',
|
|
17
|
+
name: 'OpenAI',
|
|
18
|
+
baseUrl: 'https://api.openai.com/v1',
|
|
19
|
+
apiKeyEnv: 'OPENAI_API_KEY',
|
|
20
|
+
configured: false,
|
|
21
|
+
models: [
|
|
22
|
+
{ pattern: 'gpt-4o', providerModel: 'gpt-4o', inputCostPer1M: 2.5, outputCostPer1M: 10 },
|
|
23
|
+
{ pattern: 'gpt-4o-mini', providerModel: 'gpt-4o-mini', inputCostPer1M: 0.15, outputCostPer1M: 0.6 },
|
|
24
|
+
{ pattern: 'gpt-4-turbo', providerModel: 'gpt-4-turbo', inputCostPer1M: 10, outputCostPer1M: 30 },
|
|
25
|
+
{ pattern: 'o1', providerModel: 'o1', inputCostPer1M: 15, outputCostPer1M: 60 },
|
|
26
|
+
{ pattern: 'o3-mini', providerModel: 'o3-mini', inputCostPer1M: 1.1, outputCostPer1M: 4.4 },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'anthropic',
|
|
31
|
+
name: 'Anthropic',
|
|
32
|
+
baseUrl: 'https://api.anthropic.com/v1',
|
|
33
|
+
apiKeyEnv: 'ANTHROPIC_API_KEY',
|
|
34
|
+
configured: false,
|
|
35
|
+
headers: { 'anthropic-version': '2023-06-01' },
|
|
36
|
+
models: [
|
|
37
|
+
{ pattern: 'claude-.*sonnet', providerModel: 'claude-sonnet-4-20250514', inputCostPer1M: 3, outputCostPer1M: 15 },
|
|
38
|
+
{ pattern: 'claude-.*haiku', providerModel: 'claude-3-5-haiku-20241022', inputCostPer1M: 0.8, outputCostPer1M: 4 },
|
|
39
|
+
{ pattern: 'claude-.*opus', providerModel: 'claude-3-opus-20240229', inputCostPer1M: 15, outputCostPer1M: 75 },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'groq',
|
|
44
|
+
name: 'Groq',
|
|
45
|
+
baseUrl: 'https://api.groq.com/openai/v1',
|
|
46
|
+
apiKeyEnv: 'GROQ_API_KEY',
|
|
47
|
+
configured: false,
|
|
48
|
+
models: [
|
|
49
|
+
{ pattern: 'llama-3\\.3-70b', providerModel: 'llama-3.3-70b-versatile', inputCostPer1M: 0.59, outputCostPer1M: 0.79 },
|
|
50
|
+
{ pattern: 'llama-3\\.1-8b', providerModel: 'llama-3.1-8b-instant', inputCostPer1M: 0.05, outputCostPer1M: 0.08 },
|
|
51
|
+
{ pattern: 'mixtral', providerModel: 'mixtral-8x7b-32768', inputCostPer1M: 0.24, outputCostPer1M: 0.24 },
|
|
52
|
+
{ pattern: 'gemma-2-9b', providerModel: 'gemma2-9b-it', inputCostPer1M: 0.2, outputCostPer1M: 0.2 },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'together',
|
|
57
|
+
name: 'Together AI',
|
|
58
|
+
baseUrl: 'https://api.together.xyz/v1',
|
|
59
|
+
apiKeyEnv: 'TOGETHER_API_KEY',
|
|
60
|
+
configured: false,
|
|
61
|
+
models: [
|
|
62
|
+
{ pattern: 'llama-3\\.3-70b', providerModel: 'meta-llama/Llama-3.3-70B-Instruct-Turbo', inputCostPer1M: 0.88, outputCostPer1M: 0.88 },
|
|
63
|
+
{ pattern: 'qwen-2\\.5.*72b', providerModel: 'Qwen/Qwen2.5-72B-Instruct-Turbo', inputCostPer1M: 1.2, outputCostPer1M: 1.2 },
|
|
64
|
+
{ pattern: 'deepseek-v3', providerModel: 'deepseek-ai/DeepSeek-V3', inputCostPer1M: 0.9, outputCostPer1M: 0.9 },
|
|
65
|
+
{ pattern: 'qwen-2\\.5-coder-32b', providerModel: 'Qwen/Qwen2.5-Coder-32B-Instruct', inputCostPer1M: 0.8, outputCostPer1M: 0.8 },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// ─── Core Functions ──────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Check which fallback providers are configured (have API keys)
|
|
72
|
+
*/
|
|
73
|
+
export function getConfiguredProviders() {
|
|
74
|
+
return PROVIDERS.map(p => ({
|
|
75
|
+
...p,
|
|
76
|
+
configured: !!process.env[p.apiKeyEnv],
|
|
77
|
+
})).filter(p => p.configured);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find the best fallback provider for a model
|
|
81
|
+
*/
|
|
82
|
+
export function findFallbackProvider(modelId) {
|
|
83
|
+
const configured = getConfiguredProviders();
|
|
84
|
+
for (const provider of configured) {
|
|
85
|
+
for (const mapping of provider.models) {
|
|
86
|
+
const regex = new RegExp(mapping.pattern, 'i');
|
|
87
|
+
if (regex.test(modelId)) {
|
|
88
|
+
return {
|
|
89
|
+
provider,
|
|
90
|
+
providerModel: mapping.providerModel,
|
|
91
|
+
cost: {
|
|
92
|
+
inputCostPer1M: mapping.inputCostPer1M || 0,
|
|
93
|
+
outputCostPer1M: mapping.outputCostPer1M || 0,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Execute a fallback inference request (non-streaming)
|
|
103
|
+
*/
|
|
104
|
+
export async function fallbackInference(request) {
|
|
105
|
+
const match = findFallbackProvider(request.modelId);
|
|
106
|
+
if (!match) {
|
|
107
|
+
throw new Error(`No fallback provider available for model: ${request.modelId}`);
|
|
108
|
+
}
|
|
109
|
+
const { provider, providerModel, cost } = match;
|
|
110
|
+
const apiKey = process.env[provider.apiKeyEnv];
|
|
111
|
+
const startTime = Date.now();
|
|
112
|
+
// Build request based on provider
|
|
113
|
+
if (provider.id === 'anthropic') {
|
|
114
|
+
return executeAnthropicRequest(provider, apiKey, providerModel, request, cost, startTime);
|
|
115
|
+
}
|
|
116
|
+
// OpenAI-compatible providers (OpenAI, Groq, Together)
|
|
117
|
+
return executeOpenAIRequest(provider, apiKey, providerModel, request, cost, startTime);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Execute a streaming fallback inference request
|
|
121
|
+
* Returns an async generator of text chunks
|
|
122
|
+
*/
|
|
123
|
+
export async function* fallbackInferenceStream(request) {
|
|
124
|
+
const match = findFallbackProvider(request.modelId);
|
|
125
|
+
if (!match) {
|
|
126
|
+
throw new Error(`No fallback provider available for model: ${request.modelId}`);
|
|
127
|
+
}
|
|
128
|
+
const { provider, providerModel } = match;
|
|
129
|
+
const apiKey = process.env[provider.apiKeyEnv];
|
|
130
|
+
if (provider.id === 'anthropic') {
|
|
131
|
+
yield* streamAnthropicRequest(provider, apiKey, providerModel, request);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
yield* streamOpenAIRequest(provider, apiKey, providerModel, request);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ─── Provider Implementations ────────────────────────
|
|
138
|
+
async function executeOpenAIRequest(provider, apiKey, model, request, cost, startTime) {
|
|
139
|
+
const messages = request.messages || [
|
|
140
|
+
...(request.system ? [{ role: 'system', content: request.system }] : []),
|
|
141
|
+
{ role: 'user', content: request.prompt || '' },
|
|
142
|
+
];
|
|
143
|
+
const response = await fetch(`${provider.baseUrl}/chat/completions`, {
|
|
144
|
+
method: 'POST',
|
|
145
|
+
headers: {
|
|
146
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
...(provider.headers || {}),
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify({
|
|
151
|
+
model,
|
|
152
|
+
messages,
|
|
153
|
+
max_tokens: request.maxTokens || 4096,
|
|
154
|
+
temperature: request.temperature ?? 0.7,
|
|
155
|
+
top_p: request.topP,
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
if (!response.ok) {
|
|
159
|
+
const error = await response.text();
|
|
160
|
+
throw new Error(`${provider.name} API error (${response.status}): ${error}`);
|
|
161
|
+
}
|
|
162
|
+
const data = await response.json();
|
|
163
|
+
const latencyMs = Date.now() - startTime;
|
|
164
|
+
const text = data.choices?.[0]?.message?.content || '';
|
|
165
|
+
const inputTokens = data.usage?.prompt_tokens || 0;
|
|
166
|
+
const outputTokens = data.usage?.completion_tokens || 0;
|
|
167
|
+
return {
|
|
168
|
+
text,
|
|
169
|
+
tokensGenerated: outputTokens,
|
|
170
|
+
tokensPerSecond: outputTokens / (latencyMs / 1000),
|
|
171
|
+
latencyMs,
|
|
172
|
+
provider: provider.id,
|
|
173
|
+
providerModel: model,
|
|
174
|
+
cost: {
|
|
175
|
+
inputTokens,
|
|
176
|
+
outputTokens,
|
|
177
|
+
totalUsd: (inputTokens * cost.inputCostPer1M + outputTokens * cost.outputCostPer1M) / 1_000_000,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
async function executeAnthropicRequest(provider, apiKey, model, request, cost, startTime) {
|
|
182
|
+
const messages = request.messages?.filter(m => m.role !== 'system') || [
|
|
183
|
+
{ role: 'user', content: request.prompt || '' },
|
|
184
|
+
];
|
|
185
|
+
const system = request.system || request.messages?.find(m => m.role === 'system')?.content;
|
|
186
|
+
const response = await fetch(`${provider.baseUrl}/messages`, {
|
|
187
|
+
method: 'POST',
|
|
188
|
+
headers: {
|
|
189
|
+
'x-api-key': apiKey,
|
|
190
|
+
'Content-Type': 'application/json',
|
|
191
|
+
...(provider.headers || {}),
|
|
192
|
+
},
|
|
193
|
+
body: JSON.stringify({
|
|
194
|
+
model,
|
|
195
|
+
messages,
|
|
196
|
+
system,
|
|
197
|
+
max_tokens: request.maxTokens || 4096,
|
|
198
|
+
temperature: request.temperature ?? 0.7,
|
|
199
|
+
}),
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
const error = await response.text();
|
|
203
|
+
throw new Error(`${provider.name} API error (${response.status}): ${error}`);
|
|
204
|
+
}
|
|
205
|
+
const data = await response.json();
|
|
206
|
+
const latencyMs = Date.now() - startTime;
|
|
207
|
+
const text = data.content?.map((c) => c.text).join('') || '';
|
|
208
|
+
const inputTokens = data.usage?.input_tokens || 0;
|
|
209
|
+
const outputTokens = data.usage?.output_tokens || 0;
|
|
210
|
+
return {
|
|
211
|
+
text,
|
|
212
|
+
tokensGenerated: outputTokens,
|
|
213
|
+
tokensPerSecond: outputTokens / (latencyMs / 1000),
|
|
214
|
+
latencyMs,
|
|
215
|
+
provider: provider.id,
|
|
216
|
+
providerModel: model,
|
|
217
|
+
cost: {
|
|
218
|
+
inputTokens,
|
|
219
|
+
outputTokens,
|
|
220
|
+
totalUsd: (inputTokens * cost.inputCostPer1M + outputTokens * cost.outputCostPer1M) / 1_000_000,
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async function* streamOpenAIRequest(provider, apiKey, model, request) {
|
|
225
|
+
const messages = request.messages || [
|
|
226
|
+
...(request.system ? [{ role: 'system', content: request.system }] : []),
|
|
227
|
+
{ role: 'user', content: request.prompt || '' },
|
|
228
|
+
];
|
|
229
|
+
const response = await fetch(`${provider.baseUrl}/chat/completions`, {
|
|
230
|
+
method: 'POST',
|
|
231
|
+
headers: {
|
|
232
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
233
|
+
'Content-Type': 'application/json',
|
|
234
|
+
...(provider.headers || {}),
|
|
235
|
+
},
|
|
236
|
+
body: JSON.stringify({
|
|
237
|
+
model,
|
|
238
|
+
messages,
|
|
239
|
+
max_tokens: request.maxTokens || 4096,
|
|
240
|
+
temperature: request.temperature ?? 0.7,
|
|
241
|
+
stream: true,
|
|
242
|
+
}),
|
|
243
|
+
});
|
|
244
|
+
if (!response.ok) {
|
|
245
|
+
const error = await response.text();
|
|
246
|
+
throw new Error(`${provider.name} streaming error (${response.status}): ${error}`);
|
|
247
|
+
}
|
|
248
|
+
const reader = response.body?.getReader();
|
|
249
|
+
if (!reader)
|
|
250
|
+
throw new Error('No response body');
|
|
251
|
+
const decoder = new TextDecoder();
|
|
252
|
+
let buffer = '';
|
|
253
|
+
while (true) {
|
|
254
|
+
const { done, value } = await reader.read();
|
|
255
|
+
if (done)
|
|
256
|
+
break;
|
|
257
|
+
buffer += decoder.decode(value, { stream: true });
|
|
258
|
+
const lines = buffer.split('\n');
|
|
259
|
+
buffer = lines.pop() || '';
|
|
260
|
+
for (const line of lines) {
|
|
261
|
+
if (!line.startsWith('data: '))
|
|
262
|
+
continue;
|
|
263
|
+
const data = line.slice(6).trim();
|
|
264
|
+
if (data === '[DONE]') {
|
|
265
|
+
yield { text: '', done: true };
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const parsed = JSON.parse(data);
|
|
270
|
+
const text = parsed.choices?.[0]?.delta?.content || '';
|
|
271
|
+
if (text) {
|
|
272
|
+
yield { text, done: false };
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Skip malformed chunks
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
yield { text: '', done: true };
|
|
281
|
+
}
|
|
282
|
+
async function* streamAnthropicRequest(provider, apiKey, model, request) {
|
|
283
|
+
const messages = request.messages?.filter(m => m.role !== 'system') || [
|
|
284
|
+
{ role: 'user', content: request.prompt || '' },
|
|
285
|
+
];
|
|
286
|
+
const system = request.system || request.messages?.find(m => m.role === 'system')?.content;
|
|
287
|
+
const response = await fetch(`${provider.baseUrl}/messages`, {
|
|
288
|
+
method: 'POST',
|
|
289
|
+
headers: {
|
|
290
|
+
'x-api-key': apiKey,
|
|
291
|
+
'Content-Type': 'application/json',
|
|
292
|
+
...(provider.headers || {}),
|
|
293
|
+
},
|
|
294
|
+
body: JSON.stringify({
|
|
295
|
+
model,
|
|
296
|
+
messages,
|
|
297
|
+
system,
|
|
298
|
+
max_tokens: request.maxTokens || 4096,
|
|
299
|
+
temperature: request.temperature ?? 0.7,
|
|
300
|
+
stream: true,
|
|
301
|
+
}),
|
|
302
|
+
});
|
|
303
|
+
if (!response.ok) {
|
|
304
|
+
const error = await response.text();
|
|
305
|
+
throw new Error(`${provider.name} streaming error (${response.status}): ${error}`);
|
|
306
|
+
}
|
|
307
|
+
const reader = response.body?.getReader();
|
|
308
|
+
if (!reader)
|
|
309
|
+
throw new Error('No response body');
|
|
310
|
+
const decoder = new TextDecoder();
|
|
311
|
+
let buffer = '';
|
|
312
|
+
while (true) {
|
|
313
|
+
const { done, value } = await reader.read();
|
|
314
|
+
if (done)
|
|
315
|
+
break;
|
|
316
|
+
buffer += decoder.decode(value, { stream: true });
|
|
317
|
+
const lines = buffer.split('\n');
|
|
318
|
+
buffer = lines.pop() || '';
|
|
319
|
+
for (const line of lines) {
|
|
320
|
+
if (!line.startsWith('data: '))
|
|
321
|
+
continue;
|
|
322
|
+
const data = line.slice(6).trim();
|
|
323
|
+
try {
|
|
324
|
+
const parsed = JSON.parse(data);
|
|
325
|
+
if (parsed.type === 'content_block_delta') {
|
|
326
|
+
const text = parsed.delta?.text || '';
|
|
327
|
+
if (text) {
|
|
328
|
+
yield { text, done: false };
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (parsed.type === 'message_stop') {
|
|
332
|
+
yield { text: '', done: true };
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Skip malformed chunks
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
yield { text: '', done: true };
|
|
342
|
+
}
|
|
343
|
+
// ─── Status ──────────────────────────────────────────
|
|
344
|
+
/**
|
|
345
|
+
* Get fallback status — which providers are available
|
|
346
|
+
*/
|
|
347
|
+
export function getFallbackStatus() {
|
|
348
|
+
const providers = PROVIDERS.map(p => ({
|
|
349
|
+
id: p.id,
|
|
350
|
+
name: p.name,
|
|
351
|
+
configured: !!process.env[p.apiKeyEnv],
|
|
352
|
+
modelCount: p.models.length,
|
|
353
|
+
}));
|
|
354
|
+
return {
|
|
355
|
+
available: providers.some(p => p.configured),
|
|
356
|
+
providers,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/experimental/fallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dpth.io Federated Learning Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Network-trained models as public goods. Agents fine-tune locally,
|
|
5
|
+
* share only weight deltas (LoRA adapters), and the network aggregates
|
|
6
|
+
* them into models that couldn't exist outside dpth.io.
|
|
7
|
+
*
|
|
8
|
+
* How it works:
|
|
9
|
+
* 1. Coordinator publishes a training round with base model CID
|
|
10
|
+
* 2. Eligible agents (trusted tier+) claim the round
|
|
11
|
+
* 3. Each agent fine-tunes on local data, uploads weight delta
|
|
12
|
+
* 4. Coordinator aggregates deltas (federated averaging)
|
|
13
|
+
* 5. New model version published to network via CAS
|
|
14
|
+
* 6. Agents earn credits for training contributions
|
|
15
|
+
*
|
|
16
|
+
* Security:
|
|
17
|
+
* - Only trusted+ agents can participate (reputation gate)
|
|
18
|
+
* - Weight deltas are validated (norm clipping, anomaly detection)
|
|
19
|
+
* - Differential privacy noise added before aggregation
|
|
20
|
+
* - Byzantine-tolerant: median aggregation, not mean
|
|
21
|
+
*/
|
|
22
|
+
export type TrainingStatus = 'pending' | 'active' | 'aggregating' | 'complete' | 'failed';
|
|
23
|
+
export type ParticipantStatus = 'claimed' | 'training' | 'uploaded' | 'validated' | 'rejected';
|
|
24
|
+
export interface ModelVersion {
|
|
25
|
+
id: string;
|
|
26
|
+
modelFamily: string;
|
|
27
|
+
version: number;
|
|
28
|
+
/** CID of the base model weights */
|
|
29
|
+
baseModelCid: string;
|
|
30
|
+
/** CID of the aggregated LoRA adapter (null for base) */
|
|
31
|
+
adapterCid: string | null;
|
|
32
|
+
/** Training rounds that produced this version */
|
|
33
|
+
trainingRoundIds: string[];
|
|
34
|
+
/** Performance metrics */
|
|
35
|
+
metrics: ModelMetrics;
|
|
36
|
+
/** When this version was created */
|
|
37
|
+
createdAt: string;
|
|
38
|
+
/** Parent version (null for initial) */
|
|
39
|
+
parentVersionId: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface ModelMetrics {
|
|
42
|
+
/** Loss on validation set */
|
|
43
|
+
validationLoss?: number;
|
|
44
|
+
/** Task-specific accuracy */
|
|
45
|
+
taskAccuracy?: Record<string, number>;
|
|
46
|
+
/** Number of training examples across all participants */
|
|
47
|
+
totalTrainingExamples: number;
|
|
48
|
+
/** Number of participants who contributed */
|
|
49
|
+
participantCount: number;
|
|
50
|
+
/** Improvement over parent version (percentage) */
|
|
51
|
+
improvementOverParent?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface TrainingRound {
|
|
54
|
+
id: string;
|
|
55
|
+
/** Which model family (e.g., 'dpth-entity-8b', 'dpth-anomaly-3b') */
|
|
56
|
+
modelFamily: string;
|
|
57
|
+
/** Current model version being improved */
|
|
58
|
+
baseVersionId: string;
|
|
59
|
+
/** CID of training config (hyperparameters, dataset spec) */
|
|
60
|
+
configCid: string;
|
|
61
|
+
status: TrainingStatus;
|
|
62
|
+
/** Training configuration */
|
|
63
|
+
config: TrainingConfig;
|
|
64
|
+
/** Participating agents */
|
|
65
|
+
participants: TrainingParticipant[];
|
|
66
|
+
/** Minimum participants needed to aggregate */
|
|
67
|
+
minParticipants: number;
|
|
68
|
+
/** Maximum participants (prevent over-contribution) */
|
|
69
|
+
maxParticipants: number;
|
|
70
|
+
/** Deadline for submissions */
|
|
71
|
+
deadline: string;
|
|
72
|
+
/** Resulting model version (after aggregation) */
|
|
73
|
+
resultVersionId?: string;
|
|
74
|
+
/** Aggregation stats */
|
|
75
|
+
aggregationStats?: AggregationStats;
|
|
76
|
+
createdAt: string;
|
|
77
|
+
updatedAt: string;
|
|
78
|
+
}
|
|
79
|
+
export interface TrainingConfig {
|
|
80
|
+
/** Learning rate */
|
|
81
|
+
learningRate: number;
|
|
82
|
+
/** Epochs per participant */
|
|
83
|
+
localEpochs: number;
|
|
84
|
+
/** Batch size */
|
|
85
|
+
batchSize: number;
|
|
86
|
+
/** LoRA rank */
|
|
87
|
+
loraRank: number;
|
|
88
|
+
/** LoRA alpha */
|
|
89
|
+
loraAlpha: number;
|
|
90
|
+
/** Target modules for LoRA */
|
|
91
|
+
targetModules: string[];
|
|
92
|
+
/** Max gradient norm for clipping */
|
|
93
|
+
maxGradNorm: number;
|
|
94
|
+
/** Differential privacy epsilon (lower = more private) */
|
|
95
|
+
dpEpsilon?: number;
|
|
96
|
+
/** Task types to train on */
|
|
97
|
+
taskTypes: string[];
|
|
98
|
+
/** Minimum local examples required to participate */
|
|
99
|
+
minLocalExamples: number;
|
|
100
|
+
}
|
|
101
|
+
export interface TrainingParticipant {
|
|
102
|
+
agentId: string;
|
|
103
|
+
status: ParticipantStatus;
|
|
104
|
+
claimedAt: string;
|
|
105
|
+
/** CID of uploaded weight delta */
|
|
106
|
+
deltaCid?: string;
|
|
107
|
+
uploadedAt?: string;
|
|
108
|
+
/** Local training stats */
|
|
109
|
+
localStats?: {
|
|
110
|
+
examples: number;
|
|
111
|
+
epochs: number;
|
|
112
|
+
finalLoss: number;
|
|
113
|
+
trainingTimeMs: number;
|
|
114
|
+
gpuModel?: string;
|
|
115
|
+
vramUsedMb?: number;
|
|
116
|
+
};
|
|
117
|
+
/** Validation result from coordinator */
|
|
118
|
+
validation?: {
|
|
119
|
+
valid: boolean;
|
|
120
|
+
deltaL2Norm: number;
|
|
121
|
+
anomalyScore: number;
|
|
122
|
+
reason?: string;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export interface AggregationStats {
|
|
126
|
+
method: 'fedavg' | 'fedmedian' | 'trimmed_mean';
|
|
127
|
+
participantsUsed: number;
|
|
128
|
+
participantsRejected: number;
|
|
129
|
+
/** Aggregate delta L2 norm */
|
|
130
|
+
aggregateDeltaNorm: number;
|
|
131
|
+
/** Total training examples across all participants */
|
|
132
|
+
totalExamples: number;
|
|
133
|
+
/** Time to aggregate */
|
|
134
|
+
aggregationTimeMs: number;
|
|
135
|
+
/** Differential privacy noise added */
|
|
136
|
+
dpNoiseScale?: number;
|
|
137
|
+
}
|
|
138
|
+
export interface WeightDelta {
|
|
139
|
+
/** CID of this delta */
|
|
140
|
+
cid: string;
|
|
141
|
+
/** Agent who produced it */
|
|
142
|
+
agentId: string;
|
|
143
|
+
/** Training round it belongs to */
|
|
144
|
+
roundId: string;
|
|
145
|
+
/** LoRA adapter format info */
|
|
146
|
+
format: {
|
|
147
|
+
rank: number;
|
|
148
|
+
alpha: number;
|
|
149
|
+
targetModules: string[];
|
|
150
|
+
dtype: 'float16' | 'float32' | 'bfloat16';
|
|
151
|
+
};
|
|
152
|
+
/** Size in bytes */
|
|
153
|
+
sizeBytes: number;
|
|
154
|
+
/** L2 norm of the delta (for anomaly detection) */
|
|
155
|
+
l2Norm: number;
|
|
156
|
+
/** Number of local examples used */
|
|
157
|
+
trainingExamples: number;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Register an initial base model version.
|
|
161
|
+
*/
|
|
162
|
+
export declare function registerBaseModel(modelFamily: string, baseModelCid: string, metrics?: Partial<ModelMetrics>): ModelVersion;
|
|
163
|
+
/**
|
|
164
|
+
* Get the latest version of a model family.
|
|
165
|
+
*/
|
|
166
|
+
export declare function getLatestVersion(modelFamily: string): ModelVersion | undefined;
|
|
167
|
+
/**
|
|
168
|
+
* Get full version history for a model family.
|
|
169
|
+
*/
|
|
170
|
+
export declare function getVersionHistory(modelFamily: string): ModelVersion[];
|
|
171
|
+
/**
|
|
172
|
+
* Create a new training round for a model family.
|
|
173
|
+
*/
|
|
174
|
+
export declare function createTrainingRound(modelFamily: string, config: TrainingConfig, options?: {
|
|
175
|
+
minParticipants?: number;
|
|
176
|
+
maxParticipants?: number;
|
|
177
|
+
deadlineHours?: number;
|
|
178
|
+
configCid?: string;
|
|
179
|
+
}): TrainingRound;
|
|
180
|
+
/**
|
|
181
|
+
* Agent claims a training round.
|
|
182
|
+
*/
|
|
183
|
+
export declare function claimTrainingRound(roundId: string, agentId: string): TrainingParticipant;
|
|
184
|
+
/**
|
|
185
|
+
* Agent uploads a weight delta for a training round.
|
|
186
|
+
*/
|
|
187
|
+
export declare function submitWeightDelta(roundId: string, agentId: string, delta: Omit<WeightDelta, 'roundId' | 'agentId'>): WeightDelta;
|
|
188
|
+
/**
|
|
189
|
+
* Aggregate weight deltas from a training round into a new model version.
|
|
190
|
+
* Uses federated median (Byzantine-tolerant) by default.
|
|
191
|
+
*/
|
|
192
|
+
export declare function aggregateRound(roundId: string, method?: 'fedavg' | 'fedmedian' | 'trimmed_mean'): ModelVersion;
|
|
193
|
+
export declare function getTrainingRound(roundId: string): TrainingRound | undefined;
|
|
194
|
+
export declare function getModelVersion(versionId: string): ModelVersion | undefined;
|
|
195
|
+
/**
|
|
196
|
+
* Get active training rounds an agent can join.
|
|
197
|
+
*/
|
|
198
|
+
export declare function getAvailableRounds(agentId?: string): TrainingRound[];
|
|
199
|
+
/**
|
|
200
|
+
* Get all rounds an agent has participated in.
|
|
201
|
+
*/
|
|
202
|
+
export declare function getAgentTrainingHistory(agentId: string): TrainingRound[];
|
|
203
|
+
/**
|
|
204
|
+
* Get network-wide training stats.
|
|
205
|
+
*/
|
|
206
|
+
export declare function getTrainingStats(): {
|
|
207
|
+
totalRounds: number;
|
|
208
|
+
completedRounds: number;
|
|
209
|
+
activeRounds: number;
|
|
210
|
+
totalParticipations: number;
|
|
211
|
+
totalExamplesProcessed: number;
|
|
212
|
+
modelFamilies: string[];
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* List all registered model families with their latest versions.
|
|
216
|
+
*/
|
|
217
|
+
export declare function listModelFamilies(): Array<{
|
|
218
|
+
family: string;
|
|
219
|
+
latestVersion: number;
|
|
220
|
+
latestVersionId: string;
|
|
221
|
+
totalRounds: number;
|
|
222
|
+
}>;
|
|
223
|
+
export declare function clearFederation(): void;
|
|
224
|
+
//# sourceMappingURL=federation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/experimental/federation.ts"],"names":[],"mappings":"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"}
|