@vorionsys/atsf-core 0.2.1 → 0.2.2
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/CHANGELOG.md +67 -0
- package/LICENSE +190 -0
- package/README.md +300 -176
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +82 -0
- package/dist/api/server.js.map +1 -1
- package/dist/basis/parser.d.ts +26 -26
- package/dist/common/config.d.ts +63 -63
- package/dist/common/types.d.ts +3 -0
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js.map +1 -1
- package/dist/governance/index.d.ts +2 -0
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +1 -0
- package/dist/governance/index.js.map +1 -1
- package/dist/governance/proof-bridge.d.ts +86 -0
- package/dist/governance/proof-bridge.d.ts.map +1 -0
- package/dist/governance/proof-bridge.js +139 -0
- package/dist/governance/proof-bridge.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/phase6/index.d.ts +1 -1
- package/dist/phase6/index.d.ts.map +1 -1
- package/dist/phase6/index.js +2 -2
- package/dist/phase6/index.js.map +1 -1
- package/dist/phase6/presets.d.ts +13 -13
- package/dist/phase6/presets.d.ts.map +1 -1
- package/dist/phase6/presets.js +35 -35
- package/dist/phase6/presets.js.map +1 -1
- package/dist/phase6/types.d.ts +199 -197
- package/dist/phase6/types.d.ts.map +1 -1
- package/dist/phase6/types.js +19 -17
- package/dist/phase6/types.js.map +1 -1
- package/dist/proof/index.d.ts +4 -0
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +32 -6
- package/dist/proof/index.js.map +1 -1
- package/dist/sandbox-training/challenges.d.ts +16 -0
- package/dist/sandbox-training/challenges.d.ts.map +1 -0
- package/dist/sandbox-training/challenges.js +561 -0
- package/dist/sandbox-training/challenges.js.map +1 -0
- package/dist/sandbox-training/graduation.d.ts +25 -0
- package/dist/sandbox-training/graduation.d.ts.map +1 -0
- package/dist/sandbox-training/graduation.js +143 -0
- package/dist/sandbox-training/graduation.js.map +1 -0
- package/dist/sandbox-training/index.d.ts +19 -0
- package/dist/sandbox-training/index.d.ts.map +1 -0
- package/dist/sandbox-training/index.js +22 -0
- package/dist/sandbox-training/index.js.map +1 -0
- package/dist/sandbox-training/promotion-service.d.ts +76 -0
- package/dist/sandbox-training/promotion-service.d.ts.map +1 -0
- package/dist/sandbox-training/promotion-service.js +117 -0
- package/dist/sandbox-training/promotion-service.js.map +1 -0
- package/dist/sandbox-training/runner.d.ts +58 -0
- package/dist/sandbox-training/runner.d.ts.map +1 -0
- package/dist/sandbox-training/runner.js +388 -0
- package/dist/sandbox-training/runner.js.map +1 -0
- package/dist/sandbox-training/scorer.d.ts +40 -0
- package/dist/sandbox-training/scorer.d.ts.map +1 -0
- package/dist/sandbox-training/scorer.js +79 -0
- package/dist/sandbox-training/scorer.js.map +1 -0
- package/dist/sandbox-training/types.d.ts +162 -0
- package/dist/sandbox-training/types.d.ts.map +1 -0
- package/dist/sandbox-training/types.js +32 -0
- package/dist/sandbox-training/types.js.map +1 -0
- package/package.json +25 -7
- package/dist/audit/key-manager.d.ts +0 -118
- package/dist/audit/key-manager.d.ts.map +0 -1
- package/dist/audit/key-manager.js +0 -565
- package/dist/audit/key-manager.js.map +0 -1
- package/dist/carbon-aware/carbon-metrics.d.ts +0 -151
- package/dist/carbon-aware/carbon-metrics.d.ts.map +0 -1
- package/dist/carbon-aware/carbon-metrics.js +0 -370
- package/dist/carbon-aware/carbon-metrics.js.map +0 -1
- package/dist/carbon-aware/carbon-router.d.ts +0 -101
- package/dist/carbon-aware/carbon-router.d.ts.map +0 -1
- package/dist/carbon-aware/carbon-router.js +0 -400
- package/dist/carbon-aware/carbon-router.js.map +0 -1
|
@@ -1,400 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Carbon-Aware Router
|
|
3
|
-
*
|
|
4
|
-
* Routes AI requests to lower-carbon regions when possible, considering
|
|
5
|
-
* provider availability, latency requirements, and cost constraints.
|
|
6
|
-
*
|
|
7
|
-
* @packageDocumentation
|
|
8
|
-
*/
|
|
9
|
-
import { EventEmitter } from 'events';
|
|
10
|
-
import { createLogger } from '../common/logger.js';
|
|
11
|
-
import { createCarbonIntensityClient } from './carbon-intensity-client.js';
|
|
12
|
-
import { createCarbonMetrics } from './carbon-metrics.js';
|
|
13
|
-
import { DEFAULT_PROVIDER_AVAILABILITY, DEFAULT_REGION_LATENCIES, DEFAULT_COST_MULTIPLIERS, ENERGY_PER_1000_TOKENS_KWH, } from './types.js';
|
|
14
|
-
const logger = createLogger({ component: 'carbon-router' });
|
|
15
|
-
/**
|
|
16
|
-
* Default routing constraints
|
|
17
|
-
*/
|
|
18
|
-
const DEFAULT_CONSTRAINTS = {
|
|
19
|
-
maxLatencyMs: 500,
|
|
20
|
-
maxCostMultiplier: 1.5,
|
|
21
|
-
preferGreen: true,
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Carbon-Aware Router
|
|
25
|
-
*
|
|
26
|
-
* Intelligently routes AI requests to minimize carbon footprint while
|
|
27
|
-
* respecting performance and cost constraints.
|
|
28
|
-
*/
|
|
29
|
-
export class CarbonRouter extends EventEmitter {
|
|
30
|
-
_client;
|
|
31
|
-
_metrics;
|
|
32
|
-
_defaultConstraints;
|
|
33
|
-
_providerAvailability;
|
|
34
|
-
_regionLatencies;
|
|
35
|
-
_costMultipliers;
|
|
36
|
-
_enableMetrics;
|
|
37
|
-
constructor(config = {}) {
|
|
38
|
-
super();
|
|
39
|
-
this._client = config.clientConfig
|
|
40
|
-
? createCarbonIntensityClient(config.clientConfig)
|
|
41
|
-
: createCarbonIntensityClient({ useMockData: true });
|
|
42
|
-
this._metrics = createCarbonMetrics();
|
|
43
|
-
this._defaultConstraints = { ...DEFAULT_CONSTRAINTS, ...config.defaultConstraints };
|
|
44
|
-
this._enableMetrics = config.enableMetrics ?? true;
|
|
45
|
-
// Initialize provider configuration
|
|
46
|
-
this._providerAvailability = config.providerConfig?.availability ?? this.createDefaultAvailability();
|
|
47
|
-
this._regionLatencies = config.providerConfig?.defaultLatencies ?? new Map(Object.entries(DEFAULT_REGION_LATENCIES));
|
|
48
|
-
this._costMultipliers = config.providerConfig?.costMultipliers ?? new Map(Object.entries(DEFAULT_COST_MULTIPLIERS));
|
|
49
|
-
// Forward client events to metrics
|
|
50
|
-
if (this._enableMetrics) {
|
|
51
|
-
this._client.on('carbon:*', (event) => this._metrics.emit(event.type, event));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Get the carbon intensity client
|
|
56
|
-
*/
|
|
57
|
-
get client() {
|
|
58
|
-
return this._client;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Get the metrics collector
|
|
62
|
-
*/
|
|
63
|
-
get metrics() {
|
|
64
|
-
return this._metrics;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Route a request to the optimal region based on carbon intensity
|
|
68
|
-
*/
|
|
69
|
-
async route(request) {
|
|
70
|
-
const constraints = { ...this._defaultConstraints, ...request.constraints };
|
|
71
|
-
const startTime = Date.now();
|
|
72
|
-
logger.debug({ requestId: request.requestId, constraints }, 'Routing request');
|
|
73
|
-
// If required region is specified, use it directly
|
|
74
|
-
if (constraints.requiredRegion) {
|
|
75
|
-
return this.routeToRequired(request, constraints);
|
|
76
|
-
}
|
|
77
|
-
// Get carbon intensities for all regions
|
|
78
|
-
const intensities = await this._client.getAllIntensities();
|
|
79
|
-
// Get eligible routes (filtered by constraints)
|
|
80
|
-
const eligibleRoutes = this.getEligibleRoutes(intensities, constraints);
|
|
81
|
-
if (eligibleRoutes.length === 0) {
|
|
82
|
-
logger.warn({ requestId: request.requestId }, 'No eligible routes found, using fallback');
|
|
83
|
-
return this.routeFallback(request, intensities);
|
|
84
|
-
}
|
|
85
|
-
// Sort by carbon intensity (lowest first)
|
|
86
|
-
eligibleRoutes.sort((a, b) => a.carbonIntensity - b.carbonIntensity);
|
|
87
|
-
// Select the best route
|
|
88
|
-
const bestRoute = eligibleRoutes[0];
|
|
89
|
-
const alternatives = eligibleRoutes.slice(1, 4).map(r => this.toAlternativeRoute(r));
|
|
90
|
-
// Calculate CO2 savings
|
|
91
|
-
const highestIntensity = Math.max(...Array.from(intensities.values()).map(i => i.intensity));
|
|
92
|
-
const estimatedCO2Grams = this.calculateCO2(bestRoute.carbonIntensity, request.estimatedTokens ?? 1000);
|
|
93
|
-
const baselineCO2Grams = this.calculateCO2(highestIntensity, request.estimatedTokens ?? 1000);
|
|
94
|
-
const savingsGrams = baselineCO2Grams - estimatedCO2Grams;
|
|
95
|
-
const decision = {
|
|
96
|
-
id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
|
|
97
|
-
provider: bestRoute.provider,
|
|
98
|
-
region: bestRoute.region,
|
|
99
|
-
carbonIntensity: intensities.get(bestRoute.region),
|
|
100
|
-
estimatedLatencyMs: bestRoute.latencyMs,
|
|
101
|
-
costMultiplier: bestRoute.costMultiplier,
|
|
102
|
-
reason: this.determineReason(bestRoute, constraints),
|
|
103
|
-
alternatives,
|
|
104
|
-
estimatedCO2SavingsGrams: Math.max(0, savingsGrams),
|
|
105
|
-
decidedAt: new Date().toISOString(),
|
|
106
|
-
};
|
|
107
|
-
// Record metrics
|
|
108
|
-
if (this._enableMetrics) {
|
|
109
|
-
this.emitRoutedEvent(request, decision);
|
|
110
|
-
this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
|
|
111
|
-
}
|
|
112
|
-
const routingTimeMs = Date.now() - startTime;
|
|
113
|
-
logger.info({
|
|
114
|
-
requestId: request.requestId,
|
|
115
|
-
region: decision.region,
|
|
116
|
-
provider: decision.provider,
|
|
117
|
-
carbonIntensity: decision.carbonIntensity.intensity,
|
|
118
|
-
savingsGrams: decision.estimatedCO2SavingsGrams,
|
|
119
|
-
routingTimeMs,
|
|
120
|
-
}, 'Request routed');
|
|
121
|
-
return decision;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Get the best provider for a specific region
|
|
125
|
-
*/
|
|
126
|
-
async getProviderForRegion(region, preferredProviders) {
|
|
127
|
-
const availability = this._providerAvailability.get(region);
|
|
128
|
-
if (!availability || availability.length === 0) {
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
|
-
// Filter to available providers
|
|
132
|
-
const available = availability.filter(a => a.available);
|
|
133
|
-
if (available.length === 0) {
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
// If preferred providers specified, try them first
|
|
137
|
-
if (preferredProviders && preferredProviders.length > 0) {
|
|
138
|
-
for (const preferred of preferredProviders) {
|
|
139
|
-
const match = available.find(a => a.provider === preferred);
|
|
140
|
-
if (match) {
|
|
141
|
-
return match.provider;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Return first available
|
|
146
|
-
return available[0].provider;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get carbon intensity for all regions
|
|
150
|
-
*/
|
|
151
|
-
async getRegionIntensities() {
|
|
152
|
-
return this._client.getAllIntensities();
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get the lowest carbon regions
|
|
156
|
-
*/
|
|
157
|
-
async getGreenRegions(count = 3) {
|
|
158
|
-
return this._client.getLowestCarbonRegions(count);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Check if a region meets carbon constraints
|
|
162
|
-
*/
|
|
163
|
-
async isGreenRegion(region, maxIntensity) {
|
|
164
|
-
const intensity = await this._client.getIntensity(region);
|
|
165
|
-
const threshold = maxIntensity ?? 150; // Default to "low" carbon threshold
|
|
166
|
-
return intensity.intensity <= threshold;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Update provider availability
|
|
170
|
-
*/
|
|
171
|
-
updateProviderAvailability(region, provider, available) {
|
|
172
|
-
const existing = this._providerAvailability.get(region);
|
|
173
|
-
if (existing) {
|
|
174
|
-
const providerEntry = existing.find(p => p.provider === provider);
|
|
175
|
-
if (providerEntry) {
|
|
176
|
-
providerEntry.available = available;
|
|
177
|
-
logger.info({ region, provider, available }, 'Provider availability updated');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Calculate estimated CO2 for a request
|
|
183
|
-
*/
|
|
184
|
-
calculateCO2(intensityGCO2, tokens) {
|
|
185
|
-
// Energy (kWh) = tokens / 1000 * ENERGY_PER_1000_TOKENS_KWH
|
|
186
|
-
// CO2 (grams) = Energy * intensity (gCO2/kWh)
|
|
187
|
-
const energyKWh = (tokens / 1000) * ENERGY_PER_1000_TOKENS_KWH;
|
|
188
|
-
return energyKWh * intensityGCO2;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Close the router and release resources
|
|
192
|
-
*/
|
|
193
|
-
async close() {
|
|
194
|
-
this._client.removeAllListeners();
|
|
195
|
-
this._metrics.removeAllListeners();
|
|
196
|
-
this.removeAllListeners();
|
|
197
|
-
logger.info('Carbon router closed');
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Route to a required region
|
|
201
|
-
*/
|
|
202
|
-
async routeToRequired(request, constraints) {
|
|
203
|
-
const region = constraints.requiredRegion;
|
|
204
|
-
const intensity = await this._client.getIntensity(region);
|
|
205
|
-
const provider = await this.getProviderForRegion(region, constraints.preferredProviders);
|
|
206
|
-
if (!provider) {
|
|
207
|
-
throw new Error(`No provider available in required region: ${region}`);
|
|
208
|
-
}
|
|
209
|
-
const decision = {
|
|
210
|
-
id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
|
|
211
|
-
provider,
|
|
212
|
-
region,
|
|
213
|
-
carbonIntensity: intensity,
|
|
214
|
-
estimatedLatencyMs: this._regionLatencies.get(region) ?? 100,
|
|
215
|
-
costMultiplier: this._costMultipliers.get(region) ?? 1.0,
|
|
216
|
-
reason: 'required_region',
|
|
217
|
-
alternatives: [],
|
|
218
|
-
estimatedCO2SavingsGrams: 0,
|
|
219
|
-
decidedAt: new Date().toISOString(),
|
|
220
|
-
};
|
|
221
|
-
if (this._enableMetrics) {
|
|
222
|
-
this.emitRoutedEvent(request, decision);
|
|
223
|
-
this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
|
|
224
|
-
}
|
|
225
|
-
return decision;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Route using fallback when no eligible routes found
|
|
229
|
-
*/
|
|
230
|
-
async routeFallback(request, intensities) {
|
|
231
|
-
// Find any available region/provider combination
|
|
232
|
-
const providerEntries = Array.from(this._providerAvailability.entries());
|
|
233
|
-
for (const [region, availability] of providerEntries) {
|
|
234
|
-
const available = availability.find(a => a.available);
|
|
235
|
-
if (available) {
|
|
236
|
-
const intensity = intensities.get(region) ?? await this._client.getIntensity(region);
|
|
237
|
-
const decision = {
|
|
238
|
-
id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
|
|
239
|
-
provider: available.provider,
|
|
240
|
-
region,
|
|
241
|
-
carbonIntensity: intensity,
|
|
242
|
-
estimatedLatencyMs: this._regionLatencies.get(region) ?? 100,
|
|
243
|
-
costMultiplier: this._costMultipliers.get(region) ?? 1.0,
|
|
244
|
-
reason: 'fallback',
|
|
245
|
-
alternatives: [],
|
|
246
|
-
estimatedCO2SavingsGrams: 0,
|
|
247
|
-
decidedAt: new Date().toISOString(),
|
|
248
|
-
};
|
|
249
|
-
if (this._enableMetrics) {
|
|
250
|
-
this.emitRoutedEvent(request, decision);
|
|
251
|
-
this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
|
|
252
|
-
}
|
|
253
|
-
return decision;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
throw new Error('No providers available in any region');
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Get eligible routes based on constraints
|
|
260
|
-
*/
|
|
261
|
-
getEligibleRoutes(intensities, constraints) {
|
|
262
|
-
const routes = [];
|
|
263
|
-
const intensityEntries = Array.from(intensities.entries());
|
|
264
|
-
for (const [region, intensity] of intensityEntries) {
|
|
265
|
-
// Check carbon intensity constraint
|
|
266
|
-
if (constraints.maxCarbonIntensity && intensity.intensity > constraints.maxCarbonIntensity) {
|
|
267
|
-
continue;
|
|
268
|
-
}
|
|
269
|
-
// Check renewable percentage constraint
|
|
270
|
-
if (constraints.minRenewablePercentage && intensity.renewablePercentage !== undefined) {
|
|
271
|
-
if (intensity.renewablePercentage < constraints.minRenewablePercentage) {
|
|
272
|
-
continue;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
// Check latency constraint
|
|
276
|
-
const latency = this._regionLatencies.get(region) ?? 200;
|
|
277
|
-
if (constraints.maxLatencyMs && latency > constraints.maxLatencyMs) {
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
// Check cost constraint
|
|
281
|
-
const cost = this._costMultipliers.get(region) ?? 1.0;
|
|
282
|
-
if (constraints.maxCostMultiplier && cost > constraints.maxCostMultiplier) {
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
// Get available providers
|
|
286
|
-
const availability = this._providerAvailability.get(region);
|
|
287
|
-
if (!availability)
|
|
288
|
-
continue;
|
|
289
|
-
const availableProviders = availability.filter(a => a.available);
|
|
290
|
-
if (availableProviders.length === 0)
|
|
291
|
-
continue;
|
|
292
|
-
// Filter by preferred providers if specified
|
|
293
|
-
let selectedProvider;
|
|
294
|
-
if (constraints.preferredProviders && constraints.preferredProviders.length > 0) {
|
|
295
|
-
for (const preferred of constraints.preferredProviders) {
|
|
296
|
-
selectedProvider = availableProviders.find(a => a.provider === preferred);
|
|
297
|
-
if (selectedProvider)
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
// Skip this region if no preferred provider is available
|
|
301
|
-
if (!selectedProvider) {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
// Use first available if no preferred providers specified
|
|
307
|
-
selectedProvider = availableProviders[0];
|
|
308
|
-
}
|
|
309
|
-
if (selectedProvider) {
|
|
310
|
-
routes.push({
|
|
311
|
-
region,
|
|
312
|
-
provider: selectedProvider.provider,
|
|
313
|
-
carbonIntensity: intensity.intensity,
|
|
314
|
-
latencyMs: selectedProvider.latencyMs ?? latency,
|
|
315
|
-
costMultiplier: selectedProvider.costMultiplier ?? cost,
|
|
316
|
-
renewablePercentage: intensity.renewablePercentage,
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
return routes;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Determine routing reason
|
|
324
|
-
*/
|
|
325
|
-
determineReason(route, constraints) {
|
|
326
|
-
// Check if this is the lowest carbon option
|
|
327
|
-
if (route.carbonIntensity <= 50) {
|
|
328
|
-
return 'lowest_carbon';
|
|
329
|
-
}
|
|
330
|
-
// Check if renewable preference was a factor
|
|
331
|
-
if (constraints.minRenewablePercentage && route.renewablePercentage) {
|
|
332
|
-
if (route.renewablePercentage >= constraints.minRenewablePercentage) {
|
|
333
|
-
return 'renewable_preference';
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// Check if latency was the primary factor
|
|
337
|
-
if (constraints.maxLatencyMs && route.latencyMs <= constraints.maxLatencyMs * 0.5) {
|
|
338
|
-
return 'latency_constraint';
|
|
339
|
-
}
|
|
340
|
-
// Check if cost was the primary factor
|
|
341
|
-
if (constraints.maxCostMultiplier && route.costMultiplier <= 1.0) {
|
|
342
|
-
return 'cost_constraint';
|
|
343
|
-
}
|
|
344
|
-
return 'lowest_carbon';
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Convert eligible route to alternative route format
|
|
348
|
-
*/
|
|
349
|
-
toAlternativeRoute(route) {
|
|
350
|
-
return {
|
|
351
|
-
provider: route.provider,
|
|
352
|
-
region: route.region,
|
|
353
|
-
carbonIntensity: route.carbonIntensity,
|
|
354
|
-
estimatedLatencyMs: route.latencyMs,
|
|
355
|
-
costMultiplier: route.costMultiplier,
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Create default provider availability map
|
|
360
|
-
*/
|
|
361
|
-
createDefaultAvailability() {
|
|
362
|
-
const map = new Map();
|
|
363
|
-
for (const [region, providers] of Object.entries(DEFAULT_PROVIDER_AVAILABILITY)) {
|
|
364
|
-
const availability = providers.map(provider => ({
|
|
365
|
-
provider,
|
|
366
|
-
region,
|
|
367
|
-
available: true,
|
|
368
|
-
latencyMs: DEFAULT_REGION_LATENCIES[region] ?? 100,
|
|
369
|
-
costMultiplier: DEFAULT_COST_MULTIPLIERS[region] ?? 1.0,
|
|
370
|
-
}));
|
|
371
|
-
map.set(region, availability);
|
|
372
|
-
}
|
|
373
|
-
return map;
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Emit request routed event
|
|
377
|
-
*/
|
|
378
|
-
emitRoutedEvent(request, decision) {
|
|
379
|
-
const event = {
|
|
380
|
-
type: 'carbon:request_routed',
|
|
381
|
-
timestamp: new Date().toISOString(),
|
|
382
|
-
requestId: request.requestId,
|
|
383
|
-
selectedRegion: decision.region,
|
|
384
|
-
selectedProvider: decision.provider,
|
|
385
|
-
carbonIntensity: decision.carbonIntensity.intensity,
|
|
386
|
-
estimatedCO2Grams: this.calculateCO2(decision.carbonIntensity.intensity, request.estimatedTokens ?? 1000),
|
|
387
|
-
routingReason: decision.reason,
|
|
388
|
-
latencyMs: decision.estimatedLatencyMs,
|
|
389
|
-
};
|
|
390
|
-
this.emit(event.type, event);
|
|
391
|
-
this.emit('carbon:*', event);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Create a carbon-aware router
|
|
396
|
-
*/
|
|
397
|
-
export function createCarbonRouter(config) {
|
|
398
|
-
return new CarbonRouter(config);
|
|
399
|
-
}
|
|
400
|
-
//# sourceMappingURL=carbon-router.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"carbon-router.js","sourceRoot":"","sources":["../../src/carbon-aware/carbon-router.ts"],"names":[],"mappings":"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"}
|