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,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dpth.io Economics Engine
|
|
3
|
+
*
|
|
4
|
+
* The credit system that makes agents want to contribute.
|
|
5
|
+
* Every contribution earns credits, every query costs credits.
|
|
6
|
+
* Designed for future token migration without rebuilding.
|
|
7
|
+
*
|
|
8
|
+
* Core concepts:
|
|
9
|
+
* - Credits are minted on contribution (storage, compute, GPU)
|
|
10
|
+
* - Credits are burned on consumption (queries, inference)
|
|
11
|
+
* - Tier multipliers reward long-term contributors
|
|
12
|
+
* - Rate limits prevent abuse without killing free access
|
|
13
|
+
* - Migration snapshots enable future token claims
|
|
14
|
+
*/
|
|
15
|
+
import { randomUUID } from 'crypto';
|
|
16
|
+
// ─── Default Configuration ───────────────────────────
|
|
17
|
+
export const DEFAULT_RATES = {
|
|
18
|
+
// Earning
|
|
19
|
+
storagePerMbPerDay: 1,
|
|
20
|
+
computePerTask: 10,
|
|
21
|
+
gpuPerInferenceTask: 25,
|
|
22
|
+
gpuPer1kTokens: 5,
|
|
23
|
+
gpuPerImage: 15,
|
|
24
|
+
storageProofBonus: 5,
|
|
25
|
+
trainingRoundBonus: 50,
|
|
26
|
+
// Spending
|
|
27
|
+
queryBaseCost: 1,
|
|
28
|
+
inferenceBaseCost: 10,
|
|
29
|
+
inferencePer1kTokens: 2,
|
|
30
|
+
// Tier multipliers
|
|
31
|
+
tierMultipliers: {
|
|
32
|
+
newcomer: 1.0,
|
|
33
|
+
contributor: 1.2,
|
|
34
|
+
trusted: 1.5,
|
|
35
|
+
elite: 2.0,
|
|
36
|
+
legendary: 3.0,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
export const TIER_LIMITS = {
|
|
40
|
+
newcomer: {
|
|
41
|
+
queriesPerHour: 10,
|
|
42
|
+
inferencePerHour: 5,
|
|
43
|
+
maxTransactionSize: 100,
|
|
44
|
+
canTrain: false,
|
|
45
|
+
canTransfer: false,
|
|
46
|
+
},
|
|
47
|
+
contributor: {
|
|
48
|
+
queriesPerHour: 50,
|
|
49
|
+
inferencePerHour: 20,
|
|
50
|
+
maxTransactionSize: 500,
|
|
51
|
+
canTrain: false,
|
|
52
|
+
canTransfer: false,
|
|
53
|
+
},
|
|
54
|
+
trusted: {
|
|
55
|
+
queriesPerHour: 200,
|
|
56
|
+
inferencePerHour: 100,
|
|
57
|
+
maxTransactionSize: 2000,
|
|
58
|
+
canTrain: true,
|
|
59
|
+
canTransfer: true,
|
|
60
|
+
},
|
|
61
|
+
elite: {
|
|
62
|
+
queriesPerHour: 1000,
|
|
63
|
+
inferencePerHour: 500,
|
|
64
|
+
maxTransactionSize: 10000,
|
|
65
|
+
canTrain: true,
|
|
66
|
+
canTransfer: true,
|
|
67
|
+
},
|
|
68
|
+
legendary: {
|
|
69
|
+
queriesPerHour: Infinity,
|
|
70
|
+
inferencePerHour: Infinity,
|
|
71
|
+
maxTransactionSize: Infinity,
|
|
72
|
+
canTrain: true,
|
|
73
|
+
canTransfer: true,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
const ledger = {
|
|
77
|
+
transactions: [],
|
|
78
|
+
balances: new Map(),
|
|
79
|
+
supply: {
|
|
80
|
+
totalMinted: 0,
|
|
81
|
+
totalBurned: 0,
|
|
82
|
+
totalCirculating: 0,
|
|
83
|
+
totalTransactions: 0,
|
|
84
|
+
velocity24h: 0,
|
|
85
|
+
giniCoefficient: 0,
|
|
86
|
+
},
|
|
87
|
+
rates: { ...DEFAULT_RATES },
|
|
88
|
+
recentTimestamps: [],
|
|
89
|
+
};
|
|
90
|
+
// ─── Balance Management ──────────────────────────────
|
|
91
|
+
function ensureBalance(agentId) {
|
|
92
|
+
let balance = ledger.balances.get(agentId);
|
|
93
|
+
if (!balance) {
|
|
94
|
+
const now = new Date().toISOString();
|
|
95
|
+
balance = {
|
|
96
|
+
agentId,
|
|
97
|
+
balance: 0,
|
|
98
|
+
totalEarned: 0,
|
|
99
|
+
totalSpent: 0,
|
|
100
|
+
earningsByCategory: {},
|
|
101
|
+
spendingByCategory: {},
|
|
102
|
+
transactionCount: 0,
|
|
103
|
+
claimableCredits: 0,
|
|
104
|
+
rateLimit: {
|
|
105
|
+
queriesRemaining: TIER_LIMITS.newcomer.queriesPerHour,
|
|
106
|
+
inferenceRemaining: TIER_LIMITS.newcomer.inferencePerHour,
|
|
107
|
+
windowResetAt: new Date(Date.now() + 3600000).toISOString(),
|
|
108
|
+
tier: 'newcomer',
|
|
109
|
+
},
|
|
110
|
+
lastActivity: now,
|
|
111
|
+
createdAt: now,
|
|
112
|
+
};
|
|
113
|
+
ledger.balances.set(agentId, balance);
|
|
114
|
+
}
|
|
115
|
+
return balance;
|
|
116
|
+
}
|
|
117
|
+
function updateVelocity() {
|
|
118
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
119
|
+
ledger.recentTimestamps = ledger.recentTimestamps.filter(t => t > cutoff);
|
|
120
|
+
ledger.supply.velocity24h = ledger.recentTimestamps.length;
|
|
121
|
+
}
|
|
122
|
+
function updateGini() {
|
|
123
|
+
const balances = Array.from(ledger.balances.values())
|
|
124
|
+
.map(b => b.balance)
|
|
125
|
+
.sort((a, b) => a - b);
|
|
126
|
+
const n = balances.length;
|
|
127
|
+
if (n === 0) {
|
|
128
|
+
ledger.supply.giniCoefficient = 0;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const sum = balances.reduce((a, b) => a + b, 0);
|
|
132
|
+
if (sum === 0) {
|
|
133
|
+
ledger.supply.giniCoefficient = 0;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let cumulativeSum = 0;
|
|
137
|
+
let giniNumerator = 0;
|
|
138
|
+
for (let i = 0; i < n; i++) {
|
|
139
|
+
cumulativeSum += balances[i];
|
|
140
|
+
giniNumerator += (2 * (i + 1) - n - 1) * balances[i];
|
|
141
|
+
}
|
|
142
|
+
ledger.supply.giniCoefficient = Math.round((giniNumerator / (n * sum)) * 1000) / 1000;
|
|
143
|
+
}
|
|
144
|
+
// ─── Core Operations ─────────────────────────────────
|
|
145
|
+
/**
|
|
146
|
+
* Earn credits for a contribution.
|
|
147
|
+
* Amount is multiplied by the agent's tier multiplier.
|
|
148
|
+
*/
|
|
149
|
+
export function earnCredits(agentId, amount, reason, category, options) {
|
|
150
|
+
if (amount <= 0)
|
|
151
|
+
throw new Error('Earn amount must be positive');
|
|
152
|
+
const balance = ensureBalance(agentId);
|
|
153
|
+
const multiplier = options?.tier
|
|
154
|
+
? (ledger.rates.tierMultipliers[options.tier] || 1)
|
|
155
|
+
: 1;
|
|
156
|
+
const finalAmount = Math.round(amount * multiplier * 100) / 100;
|
|
157
|
+
balance.balance += finalAmount;
|
|
158
|
+
balance.totalEarned += finalAmount;
|
|
159
|
+
balance.claimableCredits += finalAmount;
|
|
160
|
+
balance.earningsByCategory[category] = (balance.earningsByCategory[category] || 0) + finalAmount;
|
|
161
|
+
balance.transactionCount++;
|
|
162
|
+
balance.lastActivity = new Date().toISOString();
|
|
163
|
+
ledger.supply.totalMinted += finalAmount;
|
|
164
|
+
ledger.supply.totalCirculating += finalAmount;
|
|
165
|
+
const tx = {
|
|
166
|
+
id: randomUUID(),
|
|
167
|
+
agentId,
|
|
168
|
+
action: 'earn',
|
|
169
|
+
amount: finalAmount,
|
|
170
|
+
reason,
|
|
171
|
+
category,
|
|
172
|
+
reference: options?.reference,
|
|
173
|
+
balanceAfter: balance.balance,
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
};
|
|
176
|
+
ledger.transactions.push(tx);
|
|
177
|
+
ledger.supply.totalTransactions++;
|
|
178
|
+
ledger.recentTimestamps.push(Date.now());
|
|
179
|
+
return tx;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Spend credits for a service (query, inference, etc).
|
|
183
|
+
* Throws if insufficient balance.
|
|
184
|
+
*/
|
|
185
|
+
export function spendCredits(agentId, amount, reason, category, options) {
|
|
186
|
+
if (amount <= 0)
|
|
187
|
+
throw new Error('Spend amount must be positive');
|
|
188
|
+
const balance = ensureBalance(agentId);
|
|
189
|
+
if (balance.balance < amount) {
|
|
190
|
+
throw new InsufficientCreditsError(agentId, balance.balance, amount);
|
|
191
|
+
}
|
|
192
|
+
balance.balance -= amount;
|
|
193
|
+
balance.totalSpent += amount;
|
|
194
|
+
balance.spendingByCategory[category] = (balance.spendingByCategory[category] || 0) + amount;
|
|
195
|
+
balance.transactionCount++;
|
|
196
|
+
balance.lastActivity = new Date().toISOString();
|
|
197
|
+
ledger.supply.totalBurned += amount;
|
|
198
|
+
ledger.supply.totalCirculating -= amount;
|
|
199
|
+
const tx = {
|
|
200
|
+
id: randomUUID(),
|
|
201
|
+
agentId,
|
|
202
|
+
action: 'spend',
|
|
203
|
+
amount,
|
|
204
|
+
reason,
|
|
205
|
+
category,
|
|
206
|
+
reference: options?.reference,
|
|
207
|
+
balanceAfter: balance.balance,
|
|
208
|
+
timestamp: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
ledger.transactions.push(tx);
|
|
211
|
+
ledger.supply.totalTransactions++;
|
|
212
|
+
ledger.recentTimestamps.push(Date.now());
|
|
213
|
+
return tx;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Transfer credits between agents.
|
|
217
|
+
* Requires trusted tier or above.
|
|
218
|
+
*/
|
|
219
|
+
export function transferCredits(fromAgentId, toAgentId, amount, reason, fromTier = 'newcomer') {
|
|
220
|
+
const limits = TIER_LIMITS[fromTier] || TIER_LIMITS.newcomer;
|
|
221
|
+
if (!limits.canTransfer) {
|
|
222
|
+
throw new Error(`Tier '${fromTier}' cannot transfer credits. Requires trusted or above.`);
|
|
223
|
+
}
|
|
224
|
+
if (amount > limits.maxTransactionSize) {
|
|
225
|
+
throw new Error(`Transfer exceeds max transaction size for tier '${fromTier}': ${limits.maxTransactionSize}`);
|
|
226
|
+
}
|
|
227
|
+
const fromBalance = ensureBalance(fromAgentId);
|
|
228
|
+
if (fromBalance.balance < amount) {
|
|
229
|
+
throw new InsufficientCreditsError(fromAgentId, fromBalance.balance, amount);
|
|
230
|
+
}
|
|
231
|
+
// Debit sender
|
|
232
|
+
fromBalance.balance -= amount;
|
|
233
|
+
fromBalance.totalSpent += amount;
|
|
234
|
+
fromBalance.spendingByCategory['transfer'] = (fromBalance.spendingByCategory['transfer'] || 0) + amount;
|
|
235
|
+
fromBalance.transactionCount++;
|
|
236
|
+
fromBalance.lastActivity = new Date().toISOString();
|
|
237
|
+
const fromTx = {
|
|
238
|
+
id: randomUUID(),
|
|
239
|
+
agentId: fromAgentId,
|
|
240
|
+
action: 'transfer',
|
|
241
|
+
amount,
|
|
242
|
+
reason,
|
|
243
|
+
category: 'transfer',
|
|
244
|
+
toAgentId,
|
|
245
|
+
balanceAfter: fromBalance.balance,
|
|
246
|
+
timestamp: new Date().toISOString(),
|
|
247
|
+
};
|
|
248
|
+
// Credit receiver
|
|
249
|
+
const toBalance = ensureBalance(toAgentId);
|
|
250
|
+
toBalance.balance += amount;
|
|
251
|
+
toBalance.totalEarned += amount;
|
|
252
|
+
toBalance.earningsByCategory['transfer'] = (toBalance.earningsByCategory['transfer'] || 0) + amount;
|
|
253
|
+
toBalance.transactionCount++;
|
|
254
|
+
toBalance.lastActivity = new Date().toISOString();
|
|
255
|
+
const toTx = {
|
|
256
|
+
id: randomUUID(),
|
|
257
|
+
agentId: toAgentId,
|
|
258
|
+
action: 'earn',
|
|
259
|
+
amount,
|
|
260
|
+
reason: `Transfer from ${fromAgentId}: ${reason}`,
|
|
261
|
+
category: 'transfer',
|
|
262
|
+
reference: fromTx.id,
|
|
263
|
+
balanceAfter: toBalance.balance,
|
|
264
|
+
timestamp: new Date().toISOString(),
|
|
265
|
+
};
|
|
266
|
+
ledger.transactions.push(fromTx, toTx);
|
|
267
|
+
ledger.supply.totalTransactions += 2;
|
|
268
|
+
ledger.recentTimestamps.push(Date.now(), Date.now());
|
|
269
|
+
return { fromTx, toTx };
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Apply a penalty (bad behavior, failed proofs, etc).
|
|
273
|
+
*/
|
|
274
|
+
export function penalizeAgent(agentId, amount, reason, reference) {
|
|
275
|
+
const balance = ensureBalance(agentId);
|
|
276
|
+
const actualPenalty = Math.min(amount, balance.balance);
|
|
277
|
+
balance.balance -= actualPenalty;
|
|
278
|
+
balance.claimableCredits = Math.max(0, balance.claimableCredits - amount);
|
|
279
|
+
balance.transactionCount++;
|
|
280
|
+
balance.lastActivity = new Date().toISOString();
|
|
281
|
+
ledger.supply.totalBurned += actualPenalty;
|
|
282
|
+
ledger.supply.totalCirculating -= actualPenalty;
|
|
283
|
+
const tx = {
|
|
284
|
+
id: randomUUID(),
|
|
285
|
+
agentId,
|
|
286
|
+
action: 'penalty',
|
|
287
|
+
amount,
|
|
288
|
+
reason,
|
|
289
|
+
category: 'penalty',
|
|
290
|
+
reference,
|
|
291
|
+
balanceAfter: balance.balance,
|
|
292
|
+
timestamp: new Date().toISOString(),
|
|
293
|
+
};
|
|
294
|
+
ledger.transactions.push(tx);
|
|
295
|
+
ledger.supply.totalTransactions++;
|
|
296
|
+
return tx;
|
|
297
|
+
}
|
|
298
|
+
// ─── Rate Limiting ───────────────────────────────────
|
|
299
|
+
/**
|
|
300
|
+
* Check if an agent can perform an action under rate limits.
|
|
301
|
+
* Automatically resets windows and adjusts by tier.
|
|
302
|
+
*/
|
|
303
|
+
export function checkRateLimit(agentId, action, tier = 'newcomer') {
|
|
304
|
+
const balance = ensureBalance(agentId);
|
|
305
|
+
const limits = TIER_LIMITS[tier] || TIER_LIMITS.newcomer;
|
|
306
|
+
const rl = balance.rateLimit;
|
|
307
|
+
// Reset window if expired
|
|
308
|
+
if (new Date(rl.windowResetAt).getTime() <= Date.now()) {
|
|
309
|
+
rl.queriesRemaining = limits.queriesPerHour;
|
|
310
|
+
rl.inferenceRemaining = limits.inferencePerHour;
|
|
311
|
+
rl.windowResetAt = new Date(Date.now() + 3600000).toISOString();
|
|
312
|
+
rl.tier = tier;
|
|
313
|
+
}
|
|
314
|
+
// Update tier if changed
|
|
315
|
+
if (rl.tier !== tier) {
|
|
316
|
+
rl.queriesRemaining = limits.queriesPerHour;
|
|
317
|
+
rl.inferenceRemaining = limits.inferencePerHour;
|
|
318
|
+
rl.tier = tier;
|
|
319
|
+
}
|
|
320
|
+
if (action === 'query') {
|
|
321
|
+
const allowed = rl.queriesRemaining > 0;
|
|
322
|
+
if (allowed)
|
|
323
|
+
rl.queriesRemaining--;
|
|
324
|
+
return { allowed, remaining: rl.queriesRemaining, resetAt: rl.windowResetAt };
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
const allowed = rl.inferenceRemaining > 0;
|
|
328
|
+
if (allowed)
|
|
329
|
+
rl.inferenceRemaining--;
|
|
330
|
+
return { allowed, remaining: rl.inferenceRemaining, resetAt: rl.windowResetAt };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// ─── Dynamic Pricing ─────────────────────────────────
|
|
334
|
+
/**
|
|
335
|
+
* Calculate current pricing based on network conditions.
|
|
336
|
+
* High demand → higher prices → incentivizes more supply.
|
|
337
|
+
* Low demand → lower prices → encourages usage.
|
|
338
|
+
*/
|
|
339
|
+
export function getPricingSignal() {
|
|
340
|
+
updateVelocity();
|
|
341
|
+
const agentCount = ledger.balances.size;
|
|
342
|
+
if (agentCount === 0) {
|
|
343
|
+
return {
|
|
344
|
+
demandMultiplier: 1,
|
|
345
|
+
utilization: 0,
|
|
346
|
+
queryPrice: ledger.rates.queryBaseCost,
|
|
347
|
+
inferencePrice: ledger.rates.inferenceBaseCost,
|
|
348
|
+
timestamp: new Date().toISOString(),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// Utilization: ratio of transactions to agent capacity
|
|
352
|
+
// Assume each agent can handle ~100 requests/hour
|
|
353
|
+
const maxCapacity = agentCount * 100 * 24;
|
|
354
|
+
const utilization = Math.min(1, ledger.supply.velocity24h / maxCapacity);
|
|
355
|
+
// Demand curve: sigmoid around 0.7 utilization
|
|
356
|
+
// Below 0.5 → discount (0.5x-1x)
|
|
357
|
+
// 0.5-0.8 → normal (1x)
|
|
358
|
+
// Above 0.8 → premium (1x-3x)
|
|
359
|
+
let demandMultiplier;
|
|
360
|
+
if (utilization < 0.5) {
|
|
361
|
+
demandMultiplier = 0.5 + utilization;
|
|
362
|
+
}
|
|
363
|
+
else if (utilization < 0.8) {
|
|
364
|
+
demandMultiplier = 1;
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
demandMultiplier = 1 + (utilization - 0.8) * 10; // Up to 3x at 100%
|
|
368
|
+
}
|
|
369
|
+
demandMultiplier = Math.round(demandMultiplier * 100) / 100;
|
|
370
|
+
return {
|
|
371
|
+
demandMultiplier,
|
|
372
|
+
utilization: Math.round(utilization * 1000) / 1000,
|
|
373
|
+
queryPrice: Math.round(ledger.rates.queryBaseCost * demandMultiplier * 100) / 100,
|
|
374
|
+
inferencePrice: Math.round(ledger.rates.inferenceBaseCost * demandMultiplier * 100) / 100,
|
|
375
|
+
timestamp: new Date().toISOString(),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// ─── Auto-Earn Hooks ─────────────────────────────────
|
|
379
|
+
/**
|
|
380
|
+
* Auto-calculate and award credits for a storage contribution.
|
|
381
|
+
*/
|
|
382
|
+
export function rewardStorage(agentId, megabytes, tier) {
|
|
383
|
+
const amount = megabytes * ledger.rates.storagePerMbPerDay;
|
|
384
|
+
return earnCredits(agentId, amount, `Storage contribution: ${megabytes}MB`, 'storage', { tier });
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Auto-calculate and award credits for a compute task.
|
|
388
|
+
*/
|
|
389
|
+
export function rewardCompute(agentId, taskId, tier) {
|
|
390
|
+
return earnCredits(agentId, ledger.rates.computePerTask, `Compute task: ${taskId}`, 'compute', { reference: taskId, tier });
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Auto-calculate and award credits for GPU inference.
|
|
394
|
+
*/
|
|
395
|
+
export function rewardGpuInference(agentId, tokensGenerated, taskId, tier) {
|
|
396
|
+
const baseReward = ledger.rates.gpuPerInferenceTask;
|
|
397
|
+
const tokenReward = (tokensGenerated / 1000) * ledger.rates.gpuPer1kTokens;
|
|
398
|
+
const total = baseReward + tokenReward;
|
|
399
|
+
return earnCredits(agentId, total, `GPU inference: ${tokensGenerated} tokens`, 'gpu', { reference: taskId, tier });
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Auto-calculate and award credits for a training round.
|
|
403
|
+
*/
|
|
404
|
+
export function rewardTraining(agentId, roundId, tier) {
|
|
405
|
+
return earnCredits(agentId, ledger.rates.trainingRoundBonus, `Training round: ${roundId}`, 'training', { reference: roundId, tier });
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Charge for an inference request based on token count.
|
|
409
|
+
*/
|
|
410
|
+
export function chargeInference(agentId, tokensUsed, requestId) {
|
|
411
|
+
const cost = ledger.rates.inferenceBaseCost + (tokensUsed / 1000) * ledger.rates.inferencePer1kTokens;
|
|
412
|
+
return spendCredits(agentId, Math.round(cost * 100) / 100, `Inference: ${tokensUsed} tokens`, 'inference', { reference: requestId });
|
|
413
|
+
}
|
|
414
|
+
// ─── Migration ───────────────────────────────────────
|
|
415
|
+
/**
|
|
416
|
+
* Create a migration snapshot of all balances.
|
|
417
|
+
* Used when transitioning from credits to tokens.
|
|
418
|
+
* Returns snapshot metadata.
|
|
419
|
+
*/
|
|
420
|
+
export function createMigrationSnapshot() {
|
|
421
|
+
const snapshotId = randomUUID();
|
|
422
|
+
const timestamp = new Date().toISOString();
|
|
423
|
+
let totalClaimable = 0;
|
|
424
|
+
for (const balance of ledger.balances.values()) {
|
|
425
|
+
balance.migrationSnapshot = {
|
|
426
|
+
balance: balance.claimableCredits,
|
|
427
|
+
timestamp,
|
|
428
|
+
snapshotId,
|
|
429
|
+
};
|
|
430
|
+
totalClaimable += balance.claimableCredits;
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
snapshotId,
|
|
434
|
+
timestamp,
|
|
435
|
+
agentsSnapshotted: ledger.balances.size,
|
|
436
|
+
totalClaimable,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
// ─── Queries ─────────────────────────────────────────
|
|
440
|
+
export function getBalance(agentId) {
|
|
441
|
+
return ledger.balances.get(agentId);
|
|
442
|
+
}
|
|
443
|
+
export function getSupply() {
|
|
444
|
+
updateVelocity();
|
|
445
|
+
updateGini();
|
|
446
|
+
return { ...ledger.supply };
|
|
447
|
+
}
|
|
448
|
+
export function getLeaderboard(limit = 10, sortBy = 'earned') {
|
|
449
|
+
return Array.from(ledger.balances.values())
|
|
450
|
+
.sort((a, b) => {
|
|
451
|
+
if (sortBy === 'balance')
|
|
452
|
+
return b.balance - a.balance;
|
|
453
|
+
if (sortBy === 'spent')
|
|
454
|
+
return b.totalSpent - a.totalSpent;
|
|
455
|
+
return b.totalEarned - a.totalEarned;
|
|
456
|
+
})
|
|
457
|
+
.slice(0, limit)
|
|
458
|
+
.map((b, i) => ({
|
|
459
|
+
rank: i + 1,
|
|
460
|
+
agentId: b.agentId,
|
|
461
|
+
balance: b.balance,
|
|
462
|
+
totalEarned: b.totalEarned,
|
|
463
|
+
totalSpent: b.totalSpent,
|
|
464
|
+
}));
|
|
465
|
+
}
|
|
466
|
+
export function getTransactionHistory(agentId, limit = 20) {
|
|
467
|
+
return ledger.transactions
|
|
468
|
+
.filter(tx => tx.agentId === agentId)
|
|
469
|
+
.slice(-limit)
|
|
470
|
+
.reverse();
|
|
471
|
+
}
|
|
472
|
+
export function getRates() {
|
|
473
|
+
return { ...ledger.rates };
|
|
474
|
+
}
|
|
475
|
+
export function updateRates(updates) {
|
|
476
|
+
Object.assign(ledger.rates, updates);
|
|
477
|
+
return { ...ledger.rates };
|
|
478
|
+
}
|
|
479
|
+
export function getTierLimits(tier) {
|
|
480
|
+
return TIER_LIMITS[tier] || TIER_LIMITS.newcomer;
|
|
481
|
+
}
|
|
482
|
+
// ─── Reset (Testing) ────────────────────────────────
|
|
483
|
+
export function clearEconomics() {
|
|
484
|
+
ledger.transactions = [];
|
|
485
|
+
ledger.balances.clear();
|
|
486
|
+
ledger.supply = {
|
|
487
|
+
totalMinted: 0,
|
|
488
|
+
totalBurned: 0,
|
|
489
|
+
totalCirculating: 0,
|
|
490
|
+
totalTransactions: 0,
|
|
491
|
+
velocity24h: 0,
|
|
492
|
+
giniCoefficient: 0,
|
|
493
|
+
};
|
|
494
|
+
ledger.rates = { ...DEFAULT_RATES };
|
|
495
|
+
ledger.recentTimestamps = [];
|
|
496
|
+
}
|
|
497
|
+
// ─── Error Types ─────────────────────────────────────
|
|
498
|
+
export class InsufficientCreditsError extends Error {
|
|
499
|
+
agentId;
|
|
500
|
+
balance;
|
|
501
|
+
required;
|
|
502
|
+
constructor(agentId, balance, required) {
|
|
503
|
+
super(`Insufficient credits for agent '${agentId}': have ${balance}, need ${required}`);
|
|
504
|
+
this.name = 'InsufficientCreditsError';
|
|
505
|
+
this.agentId = agentId;
|
|
506
|
+
this.balance = balance;
|
|
507
|
+
this.required = required;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=economics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"economics.js","sourceRoot":"","sources":["../../src/experimental/economics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
export interface FallbackProvider {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
/** Base URL for API */
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
/** API key env var name */
|
|
19
|
+
apiKeyEnv: string;
|
|
20
|
+
/** Models this provider supports */
|
|
21
|
+
models: FallbackModelMap[];
|
|
22
|
+
/** Is this provider configured (has API key) */
|
|
23
|
+
configured: boolean;
|
|
24
|
+
/** Provider-specific headers */
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
}
|
|
27
|
+
interface FallbackModelMap {
|
|
28
|
+
/** dpth.io model pattern (regex) */
|
|
29
|
+
pattern: string;
|
|
30
|
+
/** Provider's model ID */
|
|
31
|
+
providerModel: string;
|
|
32
|
+
/** Cost per 1M input tokens (USD) */
|
|
33
|
+
inputCostPer1M?: number;
|
|
34
|
+
/** Cost per 1M output tokens (USD) */
|
|
35
|
+
outputCostPer1M?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface FallbackRequest {
|
|
38
|
+
modelId: string;
|
|
39
|
+
messages?: Array<{
|
|
40
|
+
role: string;
|
|
41
|
+
content: string;
|
|
42
|
+
}>;
|
|
43
|
+
prompt?: string;
|
|
44
|
+
system?: string;
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
temperature?: number;
|
|
47
|
+
topP?: number;
|
|
48
|
+
stream?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface FallbackResponse {
|
|
51
|
+
text: string;
|
|
52
|
+
tokensGenerated: number;
|
|
53
|
+
tokensPerSecond: number;
|
|
54
|
+
latencyMs: number;
|
|
55
|
+
provider: string;
|
|
56
|
+
providerModel: string;
|
|
57
|
+
cost?: {
|
|
58
|
+
inputTokens: number;
|
|
59
|
+
outputTokens: number;
|
|
60
|
+
totalUsd: number;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export interface FallbackStreamChunk {
|
|
64
|
+
text: string;
|
|
65
|
+
done: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check which fallback providers are configured (have API keys)
|
|
69
|
+
*/
|
|
70
|
+
export declare function getConfiguredProviders(): FallbackProvider[];
|
|
71
|
+
/**
|
|
72
|
+
* Find the best fallback provider for a model
|
|
73
|
+
*/
|
|
74
|
+
export declare function findFallbackProvider(modelId: string): {
|
|
75
|
+
provider: FallbackProvider;
|
|
76
|
+
providerModel: string;
|
|
77
|
+
cost: {
|
|
78
|
+
inputCostPer1M: number;
|
|
79
|
+
outputCostPer1M: number;
|
|
80
|
+
};
|
|
81
|
+
} | null;
|
|
82
|
+
/**
|
|
83
|
+
* Execute a fallback inference request (non-streaming)
|
|
84
|
+
*/
|
|
85
|
+
export declare function fallbackInference(request: FallbackRequest): Promise<FallbackResponse>;
|
|
86
|
+
/**
|
|
87
|
+
* Execute a streaming fallback inference request
|
|
88
|
+
* Returns an async generator of text chunks
|
|
89
|
+
*/
|
|
90
|
+
export declare function fallbackInferenceStream(request: FallbackRequest): AsyncGenerator<FallbackStreamChunk>;
|
|
91
|
+
/**
|
|
92
|
+
* Get fallback status — which providers are available
|
|
93
|
+
*/
|
|
94
|
+
export declare function getFallbackStatus(): {
|
|
95
|
+
available: boolean;
|
|
96
|
+
providers: Array<{
|
|
97
|
+
id: string;
|
|
98
|
+
name: string;
|
|
99
|
+
configured: boolean;
|
|
100
|
+
modelCount: number;
|
|
101
|
+
}>;
|
|
102
|
+
};
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/experimental/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,UAAU,gBAAgB;IACxB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AA8DD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAK3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D,GAAG,IAAI,CAoBP;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkB3F;AAED;;;GAGG;AACH,wBAAuB,uBAAuB,CAC5C,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,mBAAmB,CAAC,CAerC;AAqQD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ,CAYA"}
|