@seanhogg/builderforce-memory-engine 2026.9.33 → 2026.10.1
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/dist/evermind/delta_wire.d.ts +10 -1
- package/dist/evermind/delta_wire.d.ts.map +1 -1
- package/dist/evermind/delta_wire.js +25 -3
- package/dist/evermind/delta_wire.js.map +1 -1
- package/dist/evermind/index.d.ts +4 -4
- package/dist/evermind/index.d.ts.map +1 -1
- package/dist/evermind/index.js +2 -2
- package/dist/evermind/index.js.map +1 -1
- package/dist/evermind/merge.d.ts +25 -0
- package/dist/evermind/merge.d.ts.map +1 -1
- package/dist/evermind/merge.js +30 -0
- package/dist/evermind/merge.js.map +1 -1
- package/dist/evermind/package.d.ts +9 -0
- package/dist/evermind/package.d.ts.map +1 -1
- package/dist/evermind/package.js +20 -0
- package/dist/evermind/package.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/limbic/index.d.ts +3 -0
- package/dist/limbic/index.d.ts.map +1 -1
- package/dist/limbic/index.js +3 -0
- package/dist/limbic/index.js.map +1 -1
- package/dist/limbic/limbic_task.d.ts +22 -0
- package/dist/limbic/limbic_task.d.ts.map +1 -0
- package/dist/limbic/limbic_task.js +45 -0
- package/dist/limbic/limbic_task.js.map +1 -0
- package/dist/limbic/limbic_trainer.d.ts +17 -30
- package/dist/limbic/limbic_trainer.d.ts.map +1 -1
- package/dist/limbic/limbic_trainer.js +38 -144
- package/dist/limbic/limbic_trainer.js.map +1 -1
- package/dist/ml/classical/ewma.d.ts +32 -0
- package/dist/ml/classical/ewma.d.ts.map +1 -0
- package/dist/ml/classical/ewma.js +46 -0
- package/dist/ml/classical/ewma.js.map +1 -0
- package/dist/ml/classical/gbm.d.ts +42 -0
- package/dist/ml/classical/gbm.d.ts.map +1 -0
- package/dist/ml/classical/gbm.js +116 -0
- package/dist/ml/classical/gbm.js.map +1 -0
- package/dist/ml/classical/index.d.ts +48 -0
- package/dist/ml/classical/index.d.ts.map +1 -0
- package/dist/ml/classical/index.js +45 -0
- package/dist/ml/classical/index.js.map +1 -0
- package/dist/ml/classical/isolation_forest.d.ts +37 -0
- package/dist/ml/classical/isolation_forest.d.ts.map +1 -0
- package/dist/ml/classical/isolation_forest.js +72 -0
- package/dist/ml/classical/isolation_forest.js.map +1 -0
- package/dist/ml/classical/kmeans.d.ts +31 -0
- package/dist/ml/classical/kmeans.d.ts.map +1 -0
- package/dist/ml/classical/kmeans.js +93 -0
- package/dist/ml/classical/kmeans.js.map +1 -0
- package/dist/ml/classical/knn.d.ts +48 -0
- package/dist/ml/classical/knn.d.ts.map +1 -0
- package/dist/ml/classical/knn.js +68 -0
- package/dist/ml/classical/knn.js.map +1 -0
- package/dist/ml/classical/linear.d.ts +29 -0
- package/dist/ml/classical/linear.d.ts.map +1 -0
- package/dist/ml/classical/linear.js +114 -0
- package/dist/ml/classical/linear.js.map +1 -0
- package/dist/ml/classical/logistic.d.ts +39 -0
- package/dist/ml/classical/logistic.d.ts.map +1 -0
- package/dist/ml/classical/logistic.js +103 -0
- package/dist/ml/classical/logistic.js.map +1 -0
- package/dist/ml/classical/math.d.ts +26 -0
- package/dist/ml/classical/math.d.ts.map +1 -0
- package/dist/ml/classical/math.js +90 -0
- package/dist/ml/classical/math.js.map +1 -0
- package/dist/ml/classical/naive_bayes.d.ts +24 -0
- package/dist/ml/classical/naive_bayes.d.ts.map +1 -0
- package/dist/ml/classical/naive_bayes.js +67 -0
- package/dist/ml/classical/naive_bayes.js.map +1 -0
- package/dist/ml/classical/robust_z.d.ts +30 -0
- package/dist/ml/classical/robust_z.d.ts.map +1 -0
- package/dist/ml/classical/robust_z.js +46 -0
- package/dist/ml/classical/robust_z.js.map +1 -0
- package/dist/ml/dense_head.d.ts +33 -0
- package/dist/ml/dense_head.d.ts.map +1 -0
- package/dist/ml/dense_head.js +140 -0
- package/dist/ml/dense_head.js.map +1 -0
- package/dist/ml/features.d.ts +25 -0
- package/dist/ml/features.d.ts.map +1 -0
- package/dist/ml/features.js +46 -0
- package/dist/ml/features.js.map +1 -0
- package/dist/ml/federate.d.ts +70 -0
- package/dist/ml/federate.d.ts.map +1 -0
- package/dist/ml/federate.js +122 -0
- package/dist/ml/federate.js.map +1 -0
- package/dist/ml/head_trainer.d.ts +76 -0
- package/dist/ml/head_trainer.d.ts.map +1 -0
- package/dist/ml/head_trainer.js +182 -0
- package/dist/ml/head_trainer.js.map +1 -0
- package/dist/ml/index.d.ts +23 -0
- package/dist/ml/index.d.ts.map +1 -0
- package/dist/ml/index.js +11 -0
- package/dist/ml/index.js.map +1 -0
- package/dist/ml/registry.d.ts +20 -0
- package/dist/ml/registry.d.ts.map +1 -0
- package/dist/ml/registry.js +43 -0
- package/dist/ml/registry.js.map +1 -0
- package/dist/ml/run.d.ts +94 -0
- package/dist/ml/run.d.ts.map +1 -0
- package/dist/ml/run.js +130 -0
- package/dist/ml/run.js.map +1 -0
- package/dist/ml/tasks/experience.d.ts +90 -0
- package/dist/ml/tasks/experience.d.ts.map +1 -0
- package/dist/ml/tasks/experience.js +156 -0
- package/dist/ml/tasks/experience.js.map +1 -0
- package/dist/ml/tasks/index.d.ts +10 -0
- package/dist/ml/tasks/index.d.ts.map +1 -0
- package/dist/ml/tasks/index.js +28 -0
- package/dist/ml/tasks/index.js.map +1 -0
- package/dist/ml/tasks/local_success.d.ts +55 -0
- package/dist/ml/tasks/local_success.d.ts.map +1 -0
- package/dist/ml/tasks/local_success.js +77 -0
- package/dist/ml/tasks/local_success.js.map +1 -0
- package/dist/ml/tasks/run_anomaly.d.ts +51 -0
- package/dist/ml/tasks/run_anomaly.d.ts.map +1 -0
- package/dist/ml/tasks/run_anomaly.js +60 -0
- package/dist/ml/tasks/run_anomaly.js.map +1 -0
- package/dist/ml/train.d.ts +64 -0
- package/dist/ml/train.d.ts.map +1 -0
- package/dist/ml/train.js +101 -0
- package/dist/ml/train.js.map +1 -0
- package/dist/ml/types.d.ts +112 -0
- package/dist/ml/types.d.ts.map +1 -0
- package/dist/ml/types.js +23 -0
- package/dist/ml/types.js.map +1 -0
- package/dist/moe/moe_model.d.ts.map +1 -1
- package/dist/moe/moe_model.js +1 -16
- package/dist/moe/moe_model.js.map +1 -1
- package/dist/training/cpu_ops.d.ts +2 -0
- package/dist/training/cpu_ops.d.ts.map +1 -1
- package/dist/training/cpu_ops.js +16 -0
- package/dist/training/cpu_ops.js.map +1 -1
- package/package.json +1 -1
- package/src/evermind/delta_wire.ts +148 -114
- package/src/evermind/index.ts +35 -32
- package/src/evermind/merge.ts +53 -0
- package/src/evermind/package.ts +488 -464
- package/src/index.ts +15 -1
- package/src/limbic/index.ts +5 -0
- package/src/limbic/limbic_task.ts +62 -0
- package/src/limbic/limbic_trainer.ts +91 -258
- package/src/ml/classical/ewma.ts +68 -0
- package/src/ml/classical/gbm.ts +143 -0
- package/src/ml/classical/index.ts +76 -0
- package/src/ml/classical/isolation_forest.ts +88 -0
- package/src/ml/classical/kmeans.ts +102 -0
- package/src/ml/classical/knn.ts +98 -0
- package/src/ml/classical/linear.ts +119 -0
- package/src/ml/classical/logistic.ts +125 -0
- package/src/ml/classical/math.ts +93 -0
- package/src/ml/classical/naive_bayes.ts +77 -0
- package/src/ml/classical/robust_z.ts +65 -0
- package/src/ml/dense_head.ts +157 -0
- package/src/ml/features.ts +61 -0
- package/src/ml/federate.ts +160 -0
- package/src/ml/head_trainer.ts +268 -0
- package/src/ml/index.ts +57 -0
- package/src/ml/registry.ts +44 -0
- package/src/ml/run.ts +178 -0
- package/src/ml/tasks/experience.ts +214 -0
- package/src/ml/tasks/index.ts +30 -0
- package/src/ml/tasks/local_success.ts +118 -0
- package/src/ml/tasks/run_anomaly.ts +90 -0
- package/src/ml/train.ts +136 -0
- package/src/ml/types.ts +132 -0
- package/src/moe/moe_model.ts +1 -13
- package/src/training/cpu_ops.ts +141 -127
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/head_trainer.ts — HeadTrainer: the ONE gradient trainer for a small head over
|
|
3
|
+
* an embedding (extracted from the limbic affect trainer, which is now a thin
|
|
4
|
+
* registration over it).
|
|
5
|
+
*
|
|
6
|
+
* Full-batch gradient descent with AdamW. When a GPUDevice is supplied the
|
|
7
|
+
* optimiser step runs on the GPU via the shared WEIGHT_UPDATE_WGSL kernel; with
|
|
8
|
+
* no device it uses a numerically-equivalent CPU AdamW, so training works
|
|
9
|
+
* everywhere (CI, Node without @webgpu/node, a laptop with no GPU).
|
|
10
|
+
*
|
|
11
|
+
* The head owns its forward/backward and its loss (MSE for regression, BCE /
|
|
12
|
+
* softmax cross-entropy for classification); this file owns only the loop:
|
|
13
|
+
* zero → accumulate per sample → average → clip → AdamW step.
|
|
14
|
+
*/
|
|
15
|
+
import { createUniformBuffer, createStorageBuffer, createComputePipeline, createBindGroup, dispatchKernel, readBuffer, cdiv, } from "../utils/gpu_utils.js";
|
|
16
|
+
import { WEIGHT_UPDATE_WGSL } from "../kernels/weight_update.js";
|
|
17
|
+
function packAdamParams(numElements, lr, beta1, beta2, eps, weightDecay, beta1_t, beta2_t) {
|
|
18
|
+
const buf = new ArrayBuffer(32);
|
|
19
|
+
new Uint32Array(buf, 0, 1).set([numElements]);
|
|
20
|
+
new Float32Array(buf, 4, 7).set([lr, beta1, beta2, eps, weightDecay, beta1_t, beta2_t]);
|
|
21
|
+
return buf;
|
|
22
|
+
}
|
|
23
|
+
export class HeadTrainer {
|
|
24
|
+
label;
|
|
25
|
+
head;
|
|
26
|
+
device;
|
|
27
|
+
_moments = null;
|
|
28
|
+
_step = 0;
|
|
29
|
+
_adamwPipeline;
|
|
30
|
+
constructor(head, device = null,
|
|
31
|
+
/** Name used in error messages (the registration that owns this trainer). */
|
|
32
|
+
label = "HeadTrainer") {
|
|
33
|
+
this.label = label;
|
|
34
|
+
this.head = head;
|
|
35
|
+
this.device = device;
|
|
36
|
+
this._adamwPipeline = device
|
|
37
|
+
? createComputePipeline(device, WEIGHT_UPDATE_WGSL, "adamw_update")
|
|
38
|
+
: null;
|
|
39
|
+
}
|
|
40
|
+
/** Whether the optimiser step runs on the GPU. */
|
|
41
|
+
get gpuTraining() {
|
|
42
|
+
return this.device != null && this._adamwPipeline != null;
|
|
43
|
+
}
|
|
44
|
+
_initMoments() {
|
|
45
|
+
if (this._moments)
|
|
46
|
+
return;
|
|
47
|
+
this._moments = this.head.parameters().map((p) => ({
|
|
48
|
+
m: new Float32Array(p.numel),
|
|
49
|
+
v: new Float32Array(p.numel),
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Train on `samples` for `epochs` passes; returns the per-epoch mean loss.
|
|
54
|
+
* Full-batch: grads accumulate over every sample, are averaged, clipped, then
|
|
55
|
+
* applied once per epoch.
|
|
56
|
+
*/
|
|
57
|
+
async train(samples, opts = {}) {
|
|
58
|
+
if (samples.length === 0)
|
|
59
|
+
throw new Error(`${this.label}.train: no samples`);
|
|
60
|
+
const { learningRate = 0.05, epochs = 50, weightDecay = 0.0, beta1 = 0.9, beta2 = 0.999, eps = 1e-8, maxGradNorm = 1.0, onEpochEnd = null, } = opts;
|
|
61
|
+
this._initMoments();
|
|
62
|
+
const losses = [];
|
|
63
|
+
for (let epoch = 0; epoch < epochs; epoch++) {
|
|
64
|
+
this.head.zeroGrad();
|
|
65
|
+
let epochLoss = 0;
|
|
66
|
+
for (const s of samples)
|
|
67
|
+
epochLoss += this.head.accumulate(s);
|
|
68
|
+
const grads = this.head.gradients();
|
|
69
|
+
const invN = 1 / samples.length;
|
|
70
|
+
for (const g of grads) {
|
|
71
|
+
for (let i = 0; i < g.data.length; i++)
|
|
72
|
+
g.data[i] *= invN;
|
|
73
|
+
}
|
|
74
|
+
const gradNorm = clipGradients(grads, maxGradNorm);
|
|
75
|
+
this._step++;
|
|
76
|
+
const beta1_t = Math.pow(beta1, this._step);
|
|
77
|
+
const beta2_t = Math.pow(beta2, this._step);
|
|
78
|
+
const hp = { learningRate, weightDecay, beta1, beta2, eps, beta1_t, beta2_t };
|
|
79
|
+
if (this.gpuTraining) {
|
|
80
|
+
await this._adamwStepGpu(grads, hp);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this._adamwStepCpu(grads, hp);
|
|
84
|
+
}
|
|
85
|
+
const avg = epochLoss / samples.length;
|
|
86
|
+
losses.push(avg);
|
|
87
|
+
if (onEpochEnd)
|
|
88
|
+
onEpochEnd(epoch + 1, avg, gradNorm);
|
|
89
|
+
}
|
|
90
|
+
return losses;
|
|
91
|
+
}
|
|
92
|
+
/** Mean loss over samples (no weight update). 0 for an empty set. */
|
|
93
|
+
evaluate(samples) {
|
|
94
|
+
if (samples.length === 0)
|
|
95
|
+
return 0;
|
|
96
|
+
let total = 0;
|
|
97
|
+
for (const s of samples)
|
|
98
|
+
total += this.head.loss(s);
|
|
99
|
+
return total / samples.length;
|
|
100
|
+
}
|
|
101
|
+
_adamwStepCpu(grads, hp) {
|
|
102
|
+
const params = this.head.parameters();
|
|
103
|
+
const { learningRate: lr, weightDecay: wd, beta1, beta2, eps, beta1_t, beta2_t } = hp;
|
|
104
|
+
for (let pi = 0; pi < params.length; pi++) {
|
|
105
|
+
const p = params[pi].data;
|
|
106
|
+
const g = grads[pi].data;
|
|
107
|
+
const mom = this._moments[pi];
|
|
108
|
+
for (let i = 0; i < p.length; i++) {
|
|
109
|
+
const gi = g[i];
|
|
110
|
+
mom.m[i] = beta1 * mom.m[i] + (1 - beta1) * gi;
|
|
111
|
+
mom.v[i] = beta2 * mom.v[i] + (1 - beta2) * gi * gi;
|
|
112
|
+
const mHat = mom.m[i] / (1 - beta1_t);
|
|
113
|
+
const vHat = mom.v[i] / (1 - beta2_t);
|
|
114
|
+
p[i] = p[i] * (1 - lr * wd) - (lr * mHat) / (Math.sqrt(vHat) + eps);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** AdamW on the GPU via the shared WEIGHT_UPDATE_WGSL kernel. Awaited per step. */
|
|
119
|
+
async _adamwStepGpu(grads, hp) {
|
|
120
|
+
const device = this.device;
|
|
121
|
+
const pipeline = this._adamwPipeline;
|
|
122
|
+
const params = this.head.parameters();
|
|
123
|
+
const { learningRate: lr, weightDecay: wd, beta1, beta2, eps, beta1_t, beta2_t } = hp;
|
|
124
|
+
for (let pi = 0; pi < params.length; pi++) {
|
|
125
|
+
const p = params[pi];
|
|
126
|
+
const mom = this._moments[pi];
|
|
127
|
+
const paramBuf = createStorageBuffer(device, p.data, true);
|
|
128
|
+
const gradBuf = createStorageBuffer(device, grads[pi].data, false);
|
|
129
|
+
const mBuf = createStorageBuffer(device, mom.m, true);
|
|
130
|
+
const vBuf = createStorageBuffer(device, mom.v, true);
|
|
131
|
+
const uni = createUniformBuffer(device, packAdamParams(p.numel, lr, beta1, beta2, eps, wd, beta1_t, beta2_t));
|
|
132
|
+
const bg = createBindGroup(device, pipeline, [uni, paramBuf, gradBuf, mBuf, vBuf]);
|
|
133
|
+
dispatchKernel(device, pipeline, bg, [cdiv(p.numel, 256), 1, 1]);
|
|
134
|
+
p.data.set((await readBuffer(device, paramBuf, p.numel * 4)).subarray(0, p.numel));
|
|
135
|
+
mom.m.set((await readBuffer(device, mBuf, p.numel * 4)).subarray(0, p.numel));
|
|
136
|
+
mom.v.set((await readBuffer(device, vBuf, p.numel * 4)).subarray(0, p.numel));
|
|
137
|
+
paramBuf.destroy();
|
|
138
|
+
gradBuf.destroy();
|
|
139
|
+
mBuf.destroy();
|
|
140
|
+
vBuf.destroy();
|
|
141
|
+
uni.destroy();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Clip grads to `maxNorm` in place; returns the PRE-clip L2 norm (the signal). */
|
|
146
|
+
function clipGradients(grads, maxNorm) {
|
|
147
|
+
let normSq = 0;
|
|
148
|
+
for (const g of grads)
|
|
149
|
+
for (let i = 0; i < g.data.length; i++)
|
|
150
|
+
normSq += g.data[i] * g.data[i];
|
|
151
|
+
const norm = Math.sqrt(normSq);
|
|
152
|
+
if (norm > maxNorm && norm > 0) {
|
|
153
|
+
const scale = maxNorm / norm;
|
|
154
|
+
for (const g of grads)
|
|
155
|
+
for (let i = 0; i < g.data.length; i++)
|
|
156
|
+
g.data[i] *= scale;
|
|
157
|
+
}
|
|
158
|
+
return norm;
|
|
159
|
+
}
|
|
160
|
+
/** Concatenate a head's parameters into one flat vector (the federation unit). */
|
|
161
|
+
export function flattenParams(params) {
|
|
162
|
+
const out = new Float32Array(params.reduce((n, p) => n + p.numel, 0));
|
|
163
|
+
let o = 0;
|
|
164
|
+
for (const p of params) {
|
|
165
|
+
out.set(p.data, o);
|
|
166
|
+
o += p.numel;
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
/** Write a flat vector back into a head's parameters (inverse of {@link flattenParams}). */
|
|
171
|
+
export function assignParams(params, flat) {
|
|
172
|
+
const total = params.reduce((n, p) => n + p.numel, 0);
|
|
173
|
+
if (flat.length !== total)
|
|
174
|
+
throw new Error(`assignParams: expected ${total} values, got ${flat.length}`);
|
|
175
|
+
let o = 0;
|
|
176
|
+
for (const p of params) {
|
|
177
|
+
for (let i = 0; i < p.numel; i++)
|
|
178
|
+
p.data[i] = flat[o + i];
|
|
179
|
+
o += p.numel;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=head_trainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"head_trainer.js","sourceRoot":"","sources":["../../src/ml/head_trainer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml — the ML task catalog (docs/ml-task-catalog.md): small, purpose-built models
|
|
3
|
+
* for bounded questions, answered on the person's own machine without a GPU or an
|
|
4
|
+
* LLM call. ONE registry, ONE runner, ONE trainer seam; trained heads federate on
|
|
5
|
+
* the existing delta wire. Pure and portable: no vscode, no DOM, no network.
|
|
6
|
+
*/
|
|
7
|
+
export type { MlTask, MlTaskKind, MlEngineRef, ClassicalAlgorithm, InferenceMode, MlPrediction, MlPredictor, FeatureSpec, MlSample, TrainSpec, OutputSpec, } from "./types.js";
|
|
8
|
+
export { engineKey, ML_TASK_ID_RE } from "./types.js";
|
|
9
|
+
export { MlTaskRegistry } from "./registry.js";
|
|
10
|
+
export { runMlTask, candidateEngines, InMemoryMlModels, MlDecisionLog, MlEngineUnavailableError, } from "./run.js";
|
|
11
|
+
export type { MlRunContext, MlResult, MlModelStore, MlCloudPort, MlDecision, MlDecisionSink, MlSkipReason } from "./run.js";
|
|
12
|
+
export { trainMlTask, mlEvalLoss } from "./train.js";
|
|
13
|
+
export type { MlTrainExample, MlTrainOptions, MlTrainResult } from "./train.js";
|
|
14
|
+
export { HeadTrainer, flattenParams, assignParams } from "./head_trainer.js";
|
|
15
|
+
export type { HeadParam, TrainableHead, HeadTrainOptions } from "./head_trainer.js";
|
|
16
|
+
export { DenseHead } from "./dense_head.js";
|
|
17
|
+
export type { DenseHeadConfig } from "./dense_head.js";
|
|
18
|
+
export { extractFeatures, extractFeatureMatrix, logScale, clampRatio } from "./features.js";
|
|
19
|
+
export * from "./classical/index.js";
|
|
20
|
+
export { headCheckpoint, headParams, mlHeadEntry, mlHeadParams, mlHeadUnusableReason, packageMlHead, withPackageMlHead, buildMlHeadDelta, mergeMlHeadDeltas, } from "./federate.js";
|
|
21
|
+
export type { EvermindMlHead, MlHeadMergeOutcome } from "./federate.js";
|
|
22
|
+
export * from "./tasks/index.js";
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ml/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,YAAY,EACV,MAAM,EACN,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE5H,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7E,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5F,cAAc,sBAAsB,CAAC;AAErC,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExE,cAAc,kBAAkB,CAAC"}
|
package/dist/ml/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { engineKey, ML_TASK_ID_RE } from "./types.js";
|
|
2
|
+
export { MlTaskRegistry } from "./registry.js";
|
|
3
|
+
export { runMlTask, candidateEngines, InMemoryMlModels, MlDecisionLog, MlEngineUnavailableError, } from "./run.js";
|
|
4
|
+
export { trainMlTask, mlEvalLoss } from "./train.js";
|
|
5
|
+
export { HeadTrainer, flattenParams, assignParams } from "./head_trainer.js";
|
|
6
|
+
export { DenseHead } from "./dense_head.js";
|
|
7
|
+
export { extractFeatures, extractFeatureMatrix, logScale, clampRatio } from "./features.js";
|
|
8
|
+
export * from "./classical/index.js";
|
|
9
|
+
export { headCheckpoint, headParams, mlHeadEntry, mlHeadParams, mlHeadUnusableReason, packageMlHead, withPackageMlHead, buildMlHeadDelta, mergeMlHeadDeltas, } from "./federate.js";
|
|
10
|
+
export * from "./tasks/index.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ml/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5F,cAAc,sBAAsB,CAAC;AAErC,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/registry.ts — the ONE registry of ML tasks, keyed by task id.
|
|
3
|
+
*
|
|
4
|
+
* A new task is a new row, not a new module. The registry only stores and looks
|
|
5
|
+
* up rows; running lives in `run.ts`, training in `train.ts`.
|
|
6
|
+
*/
|
|
7
|
+
import { type MlTask } from "./types.js";
|
|
8
|
+
export declare class MlTaskRegistry {
|
|
9
|
+
private readonly _tasks;
|
|
10
|
+
/** Register a row. Throws on a malformed id, a duplicate id, or a row with no engine. */
|
|
11
|
+
register<I, O>(task: MlTask<I, O>): MlTask<I, O>;
|
|
12
|
+
/** The row for `id`, or undefined. */
|
|
13
|
+
get<I = unknown, O = unknown>(id: string): MlTask<I, O> | undefined;
|
|
14
|
+
/** The row for `id`; throws when it is not registered. */
|
|
15
|
+
require<I = unknown, O = unknown>(id: string): MlTask<I, O>;
|
|
16
|
+
has(id: string): boolean;
|
|
17
|
+
/** Every row, in registration order. */
|
|
18
|
+
list(): MlTask<any, any>[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/ml/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,yFAAyF;IACzF,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAWhD,sCAAsC;IACtC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAInE,0DAA0D;IAC1D,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAM3D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,wCAAwC;IACxC,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;CAG3B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/registry.ts — the ONE registry of ML tasks, keyed by task id.
|
|
3
|
+
*
|
|
4
|
+
* A new task is a new row, not a new module. The registry only stores and looks
|
|
5
|
+
* up rows; running lives in `run.ts`, training in `train.ts`.
|
|
6
|
+
*/
|
|
7
|
+
import { ML_TASK_ID_RE } from "./types.js";
|
|
8
|
+
export class MlTaskRegistry {
|
|
9
|
+
_tasks = new Map();
|
|
10
|
+
/** Register a row. Throws on a malformed id, a duplicate id, or a row with no engine. */
|
|
11
|
+
register(task) {
|
|
12
|
+
if (!ML_TASK_ID_RE.test(task.id))
|
|
13
|
+
throw new Error(`MlTaskRegistry: malformed task id '${task.id}'`);
|
|
14
|
+
if (this._tasks.has(task.id))
|
|
15
|
+
throw new Error(`MlTaskRegistry: task '${task.id}' is already registered`);
|
|
16
|
+
if (task.engines.length === 0)
|
|
17
|
+
throw new Error(`MlTaskRegistry: task '${task.id}' lists no engine`);
|
|
18
|
+
if (task.kind === "classify" && !(task.output.labels && task.output.labels.length >= 2)) {
|
|
19
|
+
throw new Error(`MlTaskRegistry: classify task '${task.id}' needs at least two output labels`);
|
|
20
|
+
}
|
|
21
|
+
this._tasks.set(task.id, task);
|
|
22
|
+
return task;
|
|
23
|
+
}
|
|
24
|
+
/** The row for `id`, or undefined. */
|
|
25
|
+
get(id) {
|
|
26
|
+
return this._tasks.get(id);
|
|
27
|
+
}
|
|
28
|
+
/** The row for `id`; throws when it is not registered. */
|
|
29
|
+
require(id) {
|
|
30
|
+
const t = this.get(id);
|
|
31
|
+
if (!t)
|
|
32
|
+
throw new Error(`MlTaskRegistry: unknown task '${id}'`);
|
|
33
|
+
return t;
|
|
34
|
+
}
|
|
35
|
+
has(id) {
|
|
36
|
+
return this._tasks.has(id);
|
|
37
|
+
}
|
|
38
|
+
/** Every row, in registration order. */
|
|
39
|
+
list() {
|
|
40
|
+
return [...this._tasks.values()];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/ml/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAExD,MAAM,OAAO,cAAc;IACR,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE9D,yFAAyF;IACzF,QAAQ,CAAO,IAAkB;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACpG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACzG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACpG,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,GAAG,CAA2B,EAAU;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAA6B,CAAC;IACzD,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAA2B,EAAU;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,wCAAwC;IACxC,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
|
package/dist/ml/run.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/run.ts — the ONE runner: `runMlTask(id, input, ctx)`.
|
|
3
|
+
*
|
|
4
|
+
* Picks the first engine the inference mode allows that can answer (Local only:
|
|
5
|
+
* local tiers; Hybrid: local first, then the host's cloud port; Specific: exactly
|
|
6
|
+
* the named engine), returns `{ output, confidence, engine }`, and records the
|
|
7
|
+
* decision so routing can be evaluated later. The cloud is a PORT the host
|
|
8
|
+
* supplies — nothing here touches the network.
|
|
9
|
+
*/
|
|
10
|
+
import { type TextEmbedder } from "./features.js";
|
|
11
|
+
import type { MlTaskRegistry } from "./registry.js";
|
|
12
|
+
import { type InferenceMode, type MlEngineRef, type MlPrediction, type MlPredictor, type MlTask } from "./types.js";
|
|
13
|
+
/** Fitted local models, per (task id, engine key). */
|
|
14
|
+
export interface MlModelStore {
|
|
15
|
+
get(taskId: string, engine: string): MlPredictor | undefined;
|
|
16
|
+
set(taskId: string, engine: string, predictor: MlPredictor): void;
|
|
17
|
+
}
|
|
18
|
+
/** The plain in-process store. */
|
|
19
|
+
export declare class InMemoryMlModels implements MlModelStore {
|
|
20
|
+
private readonly _m;
|
|
21
|
+
get(taskId: string, engine: string): MlPredictor | undefined;
|
|
22
|
+
set(taskId: string, engine: string, predictor: MlPredictor): void;
|
|
23
|
+
}
|
|
24
|
+
/** A cloud engine, supplied by the host (Builderforce.ai passes its gateway client). */
|
|
25
|
+
export interface MlCloudPort {
|
|
26
|
+
run(request: {
|
|
27
|
+
taskId: string;
|
|
28
|
+
engine: MlEngineRef;
|
|
29
|
+
input: unknown;
|
|
30
|
+
}): Promise<MlPrediction>;
|
|
31
|
+
}
|
|
32
|
+
/** Why the runner moved past an engine. */
|
|
33
|
+
export type MlSkipReason = "unavailable" | "low-confidence" | "error";
|
|
34
|
+
/** One routing decision, recorded for eval. */
|
|
35
|
+
export interface MlDecision {
|
|
36
|
+
taskId: string;
|
|
37
|
+
mode: InferenceMode;
|
|
38
|
+
/** The engine that answered (key), or null when none could. */
|
|
39
|
+
engine: string | null;
|
|
40
|
+
tier: "local" | "cloud" | null;
|
|
41
|
+
confidence: number | null;
|
|
42
|
+
/** Engines passed over before the answer, with why. */
|
|
43
|
+
skipped: {
|
|
44
|
+
engine: string;
|
|
45
|
+
reason: MlSkipReason;
|
|
46
|
+
detail?: string;
|
|
47
|
+
}[];
|
|
48
|
+
}
|
|
49
|
+
export interface MlDecisionSink {
|
|
50
|
+
record(decision: MlDecision): void;
|
|
51
|
+
}
|
|
52
|
+
/** A bounded in-memory decision log with a per-task summary. */
|
|
53
|
+
export declare class MlDecisionLog implements MlDecisionSink {
|
|
54
|
+
readonly capacity: number;
|
|
55
|
+
private readonly _d;
|
|
56
|
+
constructor(capacity?: number);
|
|
57
|
+
record(decision: MlDecision): void;
|
|
58
|
+
list(): readonly MlDecision[];
|
|
59
|
+
/** Per task: how many runs, which engines answered, mean confidence, unanswered count. */
|
|
60
|
+
summary(): Record<string, {
|
|
61
|
+
runs: number;
|
|
62
|
+
byEngine: Record<string, number>;
|
|
63
|
+
unanswered: number;
|
|
64
|
+
meanConfidence: number | null;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
export interface MlRunContext {
|
|
68
|
+
registry: MlTaskRegistry;
|
|
69
|
+
mode: InferenceMode;
|
|
70
|
+
/** For `specific`: the engine (ref or key) to use. */
|
|
71
|
+
engine?: MlEngineRef | string;
|
|
72
|
+
models?: MlModelStore;
|
|
73
|
+
embedder?: TextEmbedder;
|
|
74
|
+
cloud?: MlCloudPort;
|
|
75
|
+
/** Hybrid only: a local answer below this confidence defers to the cloud when it can answer. */
|
|
76
|
+
minConfidence?: number;
|
|
77
|
+
decisions?: MlDecisionSink;
|
|
78
|
+
}
|
|
79
|
+
export interface MlResult<O> {
|
|
80
|
+
output: O;
|
|
81
|
+
confidence: number;
|
|
82
|
+
engine: MlEngineRef;
|
|
83
|
+
}
|
|
84
|
+
/** No engine allowed by the mode could answer. */
|
|
85
|
+
export declare class MlEngineUnavailableError extends Error {
|
|
86
|
+
readonly taskId: string;
|
|
87
|
+
readonly decision: MlDecision;
|
|
88
|
+
constructor(taskId: string, decision: MlDecision);
|
|
89
|
+
}
|
|
90
|
+
/** The task's engines the mode allows, in the order the runner tries them. */
|
|
91
|
+
export declare function candidateEngines(task: MlTask<any, any>, mode: InferenceMode, specific?: MlEngineRef | string): MlEngineRef[];
|
|
92
|
+
/** Answer task `id` for `input` with the first engine the mode allows that can. */
|
|
93
|
+
export declare function runMlTask<O = unknown, I = unknown>(id: string, input: I, ctx: MlRunContext): Promise<MlResult<O>>;
|
|
94
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/ml/run.ts"],"names":[],"mappings":"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"}
|
package/dist/ml/run.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ml/run.ts — the ONE runner: `runMlTask(id, input, ctx)`.
|
|
3
|
+
*
|
|
4
|
+
* Picks the first engine the inference mode allows that can answer (Local only:
|
|
5
|
+
* local tiers; Hybrid: local first, then the host's cloud port; Specific: exactly
|
|
6
|
+
* the named engine), returns `{ output, confidence, engine }`, and records the
|
|
7
|
+
* decision so routing can be evaluated later. The cloud is a PORT the host
|
|
8
|
+
* supplies — nothing here touches the network.
|
|
9
|
+
*/
|
|
10
|
+
import { extractFeatures } from "./features.js";
|
|
11
|
+
import { engineKey } from "./types.js";
|
|
12
|
+
/** The plain in-process store. */
|
|
13
|
+
export class InMemoryMlModels {
|
|
14
|
+
_m = new Map();
|
|
15
|
+
get(taskId, engine) {
|
|
16
|
+
return this._m.get(`${taskId}|${engine}`);
|
|
17
|
+
}
|
|
18
|
+
set(taskId, engine, predictor) {
|
|
19
|
+
this._m.set(`${taskId}|${engine}`, predictor);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** A bounded in-memory decision log with a per-task summary. */
|
|
23
|
+
export class MlDecisionLog {
|
|
24
|
+
capacity;
|
|
25
|
+
_d = [];
|
|
26
|
+
constructor(capacity = 500) {
|
|
27
|
+
this.capacity = capacity;
|
|
28
|
+
}
|
|
29
|
+
record(decision) {
|
|
30
|
+
this._d.push(decision);
|
|
31
|
+
if (this._d.length > this.capacity)
|
|
32
|
+
this._d.splice(0, this._d.length - this.capacity);
|
|
33
|
+
}
|
|
34
|
+
list() {
|
|
35
|
+
return this._d;
|
|
36
|
+
}
|
|
37
|
+
/** Per task: how many runs, which engines answered, mean confidence, unanswered count. */
|
|
38
|
+
summary() {
|
|
39
|
+
const out = {};
|
|
40
|
+
const sums = {};
|
|
41
|
+
for (const d of this._d) {
|
|
42
|
+
const t = (out[d.taskId] ??= { runs: 0, byEngine: {}, unanswered: 0, meanConfidence: null });
|
|
43
|
+
t.runs++;
|
|
44
|
+
if (d.engine == null) {
|
|
45
|
+
t.unanswered++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
t.byEngine[d.engine] = (t.byEngine[d.engine] ?? 0) + 1;
|
|
49
|
+
const c = (sums[d.taskId] ??= { s: 0, n: 0 });
|
|
50
|
+
c.s += d.confidence ?? 0;
|
|
51
|
+
c.n++;
|
|
52
|
+
t.meanConfidence = c.s / c.n;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** No engine allowed by the mode could answer. */
|
|
58
|
+
export class MlEngineUnavailableError extends Error {
|
|
59
|
+
taskId;
|
|
60
|
+
decision;
|
|
61
|
+
constructor(taskId, decision) {
|
|
62
|
+
super(`runMlTask(${taskId}): no engine could answer in '${decision.mode}' mode (${decision.skipped.map((s) => `${s.engine}: ${s.reason}`).join(", ") || "none allowed"})`);
|
|
63
|
+
this.taskId = taskId;
|
|
64
|
+
this.decision = decision;
|
|
65
|
+
this.name = "MlEngineUnavailableError";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** The task's engines the mode allows, in the order the runner tries them. */
|
|
69
|
+
export function candidateEngines(task, mode, specific) {
|
|
70
|
+
if (mode === "local-only")
|
|
71
|
+
return task.engines.filter((e) => e.tier === "local");
|
|
72
|
+
if (mode === "hybrid")
|
|
73
|
+
return [...task.engines.filter((e) => e.tier === "local"), ...task.engines.filter((e) => e.tier === "cloud")];
|
|
74
|
+
if (specific == null)
|
|
75
|
+
throw new Error(`runMlTask(${task.id}): 'specific' mode needs ctx.engine`);
|
|
76
|
+
const key = typeof specific === "string" ? specific : engineKey(specific);
|
|
77
|
+
const match = task.engines.filter((e) => engineKey(e) === key);
|
|
78
|
+
if (match.length === 0)
|
|
79
|
+
throw new Error(`runMlTask(${task.id}): engine '${key}' is not one of this task's engines`);
|
|
80
|
+
return match;
|
|
81
|
+
}
|
|
82
|
+
/** Answer task `id` for `input` with the first engine the mode allows that can. */
|
|
83
|
+
export async function runMlTask(id, input, ctx) {
|
|
84
|
+
const task = ctx.registry.require(id);
|
|
85
|
+
const engines = candidateEngines(task, ctx.mode, ctx.engine);
|
|
86
|
+
const skipped = [];
|
|
87
|
+
let features = null;
|
|
88
|
+
let deferred = null;
|
|
89
|
+
const finish = (ref, p) => {
|
|
90
|
+
ctx.decisions?.record({ taskId: id, mode: ctx.mode, engine: engineKey(ref), tier: ref.tier, confidence: p.confidence, skipped });
|
|
91
|
+
return { output: task.output.decode(p), confidence: p.confidence, engine: ref };
|
|
92
|
+
};
|
|
93
|
+
for (let i = 0; i < engines.length; i++) {
|
|
94
|
+
const ref = engines[i];
|
|
95
|
+
const key = engineKey(ref);
|
|
96
|
+
if (ref.tier === "local") {
|
|
97
|
+
const predictor = ctx.models?.get(id, key);
|
|
98
|
+
if (!predictor) {
|
|
99
|
+
skipped.push({ engine: key, reason: "unavailable" });
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
features ??= await extractFeatures(task.features, input, ctx.embedder);
|
|
103
|
+
const p = predictor.predict(features);
|
|
104
|
+
const cloudLater = ctx.mode === "hybrid" && !!ctx.cloud && engines.slice(i + 1).some((e) => e.tier === "cloud");
|
|
105
|
+
if (ctx.minConfidence != null && p.confidence < ctx.minConfidence && cloudLater) {
|
|
106
|
+
skipped.push({ engine: key, reason: "low-confidence", detail: p.confidence.toFixed(3) });
|
|
107
|
+
deferred ??= { ref, p };
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
return finish(ref, p);
|
|
111
|
+
}
|
|
112
|
+
if (!ctx.cloud) {
|
|
113
|
+
skipped.push({ engine: key, reason: "unavailable" });
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
return finish(ref, await ctx.cloud.run({ taskId: id, engine: ref, input }));
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
skipped.push({ engine: key, reason: "error", detail: error instanceof Error ? error.message : String(error) });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// The cloud could not answer after a low-confidence local one: the local answer stands.
|
|
124
|
+
if (deferred)
|
|
125
|
+
return finish(deferred.ref, deferred.p);
|
|
126
|
+
const decision = { taskId: id, mode: ctx.mode, engine: null, tier: null, confidence: null, skipped };
|
|
127
|
+
ctx.decisions?.record(decision);
|
|
128
|
+
throw new MlEngineUnavailableError(id, decision);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/ml/run.ts"],"names":[],"mappings":"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"}
|