@flaxia/node 0.3.6 → 0.5.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 +51 -15
- package/dist/__tests__/consent-policy.test.d.ts +2 -0
- package/dist/__tests__/consent-policy.test.d.ts.map +1 -0
- package/dist/__tests__/public-api.test.d.ts +2 -0
- package/dist/__tests__/public-api.test.d.ts.map +1 -0
- package/dist/assets/VectorStoreEngine.js +140 -85
- package/dist/assets/ai-inference.js +173 -33
- package/dist/assets/container.js +368 -260
- package/dist/assets/dist.js +209 -0
- package/dist/assets/egress-guard.js +174 -0
- package/dist/assets/image-process.js +184 -19
- package/dist/assets/nudenet.js +2 -2
- package/dist/client/SignalingClient.d.ts +6 -0
- package/dist/client/SignalingClient.d.ts.map +1 -1
- package/dist/consent/ConsentUI.d.ts +44 -5
- package/dist/consent/ConsentUI.d.ts.map +1 -1
- package/dist/consent/notice.d.ts +29 -0
- package/dist/consent/notice.d.ts.map +1 -0
- package/dist/consent/storage.d.ts +91 -7
- package/dist/consent/storage.d.ts.map +1 -1
- package/dist/executor/WorkerPool.d.ts +35 -1
- package/dist/executor/WorkerPool.d.ts.map +1 -1
- package/dist/executor/__tests__/WorkerPool.swarm.test.d.ts +13 -0
- package/dist/executor/__tests__/WorkerPool.swarm.test.d.ts.map +1 -0
- package/dist/executor/__tests__/container-executor.test.d.ts +2 -0
- package/dist/executor/__tests__/container-executor.test.d.ts.map +1 -0
- package/dist/executor/__tests__/egress-guard.test.d.ts +2 -0
- package/dist/executor/__tests__/egress-guard.test.d.ts.map +1 -0
- package/dist/executor/__tests__/webgpuProbe.test.d.ts +2 -0
- package/dist/executor/__tests__/webgpuProbe.test.d.ts.map +1 -0
- package/dist/executor/container-executor.d.ts +49 -1
- package/dist/executor/container-executor.d.ts.map +1 -1
- package/dist/executor/egress-guard.d.ts +105 -0
- package/dist/executor/egress-guard.d.ts.map +1 -0
- package/dist/executor/memoryProbe.d.ts +25 -0
- package/dist/executor/memoryProbe.d.ts.map +1 -1
- package/dist/executor/throttle.d.ts +62 -4
- package/dist/executor/throttle.d.ts.map +1 -1
- package/dist/executor/webgpuProbe.d.ts +9 -0
- package/dist/executor/webgpuProbe.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +766 -230
- package/dist/swarm/__tests__/adapter.test.d.ts +2 -0
- package/dist/swarm/__tests__/adapter.test.d.ts.map +1 -0
- package/dist/swarm/__tests__/controller.test.d.ts +2 -0
- package/dist/swarm/__tests__/controller.test.d.ts.map +1 -0
- package/dist/swarm/__tests__/defects.test.d.ts +16 -0
- package/dist/swarm/__tests__/defects.test.d.ts.map +1 -0
- package/dist/swarm/__tests__/hardening.test.d.ts +2 -0
- package/dist/swarm/__tests__/hardening.test.d.ts.map +1 -0
- package/dist/swarm/__tests__/runtime.test.d.ts +2 -0
- package/dist/swarm/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/swarm/__tests__/session.test.d.ts +2 -0
- package/dist/swarm/__tests__/session.test.d.ts.map +1 -0
- package/dist/swarm/adapter.d.ts +115 -0
- package/dist/swarm/adapter.d.ts.map +1 -0
- package/dist/swarm/controller.d.ts +87 -0
- package/dist/swarm/controller.d.ts.map +1 -0
- package/dist/swarm/messages.d.ts +41 -0
- package/dist/swarm/messages.d.ts.map +1 -0
- package/dist/swarm/runtime.d.ts +16 -0
- package/dist/swarm/runtime.d.ts.map +1 -0
- package/dist/swarm/session.d.ts +73 -0
- package/dist/swarm/session.d.ts.map +1 -0
- package/dist/swarm-engine.js +7477 -0
- package/dist/vector-store/HNSWIndex.d.ts +30 -0
- package/dist/vector-store/HNSWIndex.d.ts.map +1 -1
- package/dist/vector-store/VectorStoreEngine.d.ts +43 -0
- package/dist/vector-store/VectorStoreEngine.d.ts.map +1 -1
- package/dist/vector-store/__tests__/HNSWIndex.test.d.ts +2 -0
- package/dist/vector-store/__tests__/HNSWIndex.test.d.ts.map +1 -0
- package/dist/vector-store/__tests__/VectorStoreEngine.test.d.ts +2 -0
- package/dist/vector-store/__tests__/VectorStoreEngine.test.d.ts.map +1 -0
- package/dist/worker/__tests__/main.worker.abort.test.d.ts +2 -0
- package/dist/worker/__tests__/main.worker.abort.test.d.ts.map +1 -0
- package/dist/worker/__tests__/main.worker.control.test.d.ts +2 -0
- package/dist/worker/__tests__/main.worker.control.test.d.ts.map +1 -0
- package/dist/worker.js +643 -67
- package/dist/workloads/__tests__/nudenet.test.d.ts +2 -0
- package/dist/workloads/__tests__/nudenet.test.d.ts.map +1 -0
- package/dist/workloads/ai-inference.d.ts +2 -1
- package/dist/workloads/ai-inference.d.ts.map +1 -1
- package/dist/workloads/ai-model-registry.d.ts +72 -0
- package/dist/workloads/ai-model-registry.d.ts.map +1 -0
- package/dist/workloads/container.d.ts +1 -1
- package/dist/workloads/container.d.ts.map +1 -1
- package/dist/workloads/image-process.d.ts +27 -0
- package/dist/workloads/image-process.d.ts.map +1 -1
- package/dist/workloads/nudenet.d.ts +8 -0
- package/dist/workloads/nudenet.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/assets/memoryProbe.js +0 -28
- package/dist/client/WebRTCPeer.d.ts +0 -8
- package/dist/client/WebRTCPeer.d.ts.map +0 -1
|
@@ -1,6 +1,107 @@
|
|
|
1
1
|
import { TextStreamer as e, env as t, pipeline as n } from "./transformers.web.js";
|
|
2
|
+
//#region src/workloads/ai-model-registry.ts
|
|
3
|
+
var r = 512 * 1024 * 1024, i = 4 * 1024 ** 3, a = new Map(Object.entries({
|
|
4
|
+
"Xenova/bert-base-multilingual-uncased-sentiment": {
|
|
5
|
+
repo: "Xenova/bert-base-multilingual-uncased-sentiment",
|
|
6
|
+
revision: "main",
|
|
7
|
+
maxBytes: r
|
|
8
|
+
},
|
|
9
|
+
"onnx-community/Qwen3-Embedding-0.6B-ONNX": {
|
|
10
|
+
repo: "onnx-community/Qwen3-Embedding-0.6B-ONNX",
|
|
11
|
+
revision: "main",
|
|
12
|
+
maxBytes: r
|
|
13
|
+
}
|
|
14
|
+
}).map(([e, t]) => [e, { ...t }])), o = [
|
|
15
|
+
"wasm",
|
|
16
|
+
"cpu",
|
|
17
|
+
"webgpu"
|
|
18
|
+
], s = [
|
|
19
|
+
"q4",
|
|
20
|
+
"q4f16",
|
|
21
|
+
"q8",
|
|
22
|
+
"int8",
|
|
23
|
+
"uint8"
|
|
24
|
+
], c = {
|
|
25
|
+
max_new_tokens: {
|
|
26
|
+
min: 1,
|
|
27
|
+
max: 1024
|
|
28
|
+
},
|
|
29
|
+
temperature: {
|
|
30
|
+
min: 0,
|
|
31
|
+
max: 4
|
|
32
|
+
},
|
|
33
|
+
top_p: {
|
|
34
|
+
min: 0,
|
|
35
|
+
max: 1
|
|
36
|
+
},
|
|
37
|
+
top_k: {
|
|
38
|
+
min: 0,
|
|
39
|
+
max: 1e3
|
|
40
|
+
},
|
|
41
|
+
repetition_penalty: {
|
|
42
|
+
min: 0,
|
|
43
|
+
max: 4
|
|
44
|
+
}
|
|
45
|
+
}, l = 1e5;
|
|
46
|
+
function u() {
|
|
47
|
+
return [...a.keys()];
|
|
48
|
+
}
|
|
49
|
+
function d(e) {
|
|
50
|
+
if (typeof e != "string" || !e) throw Error(`ai-inference: model must be a non-empty string, got ${JSON.stringify(e)}`);
|
|
51
|
+
let t = a.get(e);
|
|
52
|
+
if (!t) throw Error(`ai-inference: model not allowed: ${e} (allowed: ${u().join(", ") || "none"})`);
|
|
53
|
+
return t;
|
|
54
|
+
}
|
|
55
|
+
function f(e) {
|
|
56
|
+
if (e != null) {
|
|
57
|
+
if (typeof e != "string" || !o.includes(e)) throw Error(`ai-inference: device not allowed: ${JSON.stringify(e)} (allowed: ${o.join(", ")})`);
|
|
58
|
+
return e;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function p(e) {
|
|
62
|
+
if (e != null) {
|
|
63
|
+
if (typeof e != "string" || !s.includes(e)) throw Error(`ai-inference: dtype not allowed: ${JSON.stringify(e)} (allowed: ${s.join(", ")})`);
|
|
64
|
+
return e;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function m(e) {
|
|
68
|
+
if (typeof e == "string") {
|
|
69
|
+
if (e.length > 1e5) throw Error(`ai-inference: input exceeds ${l} characters`);
|
|
70
|
+
return e;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(e)) {
|
|
73
|
+
if (e.length === 0 || e.length > 64) throw Error("ai-inference: input array must hold 1..64 items");
|
|
74
|
+
for (let t of e) {
|
|
75
|
+
if (typeof t != "string") throw Error("ai-inference: input array items must be strings");
|
|
76
|
+
if (t.length > 1e5) throw Error(`ai-inference: input exceeds ${l} characters`);
|
|
77
|
+
}
|
|
78
|
+
return e;
|
|
79
|
+
}
|
|
80
|
+
throw Error("ai-inference: input must be a string or an array of strings");
|
|
81
|
+
}
|
|
82
|
+
function h(e, t) {
|
|
83
|
+
for (let [n, r] of Object.entries(c)) {
|
|
84
|
+
let i = t[n];
|
|
85
|
+
if (i != null) {
|
|
86
|
+
if (typeof i != "number" || !Number.isFinite(i) || i < r.min || i > r.max) throw Error(`ai-inference: option ${n} must be a number within ${r.min}..${r.max}, got ${JSON.stringify(i)}`);
|
|
87
|
+
e[n] = i;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (t.do_sample !== void 0) {
|
|
91
|
+
if (typeof t.do_sample != "boolean") throw Error("ai-inference: option do_sample must be a boolean");
|
|
92
|
+
e.do_sample = t.do_sample;
|
|
93
|
+
}
|
|
94
|
+
for (let n of ["src_lang", "tgt_lang"]) {
|
|
95
|
+
let r = t[n];
|
|
96
|
+
if (r != null) {
|
|
97
|
+
if (typeof r != "string" || !/^[a-z]{2,3}(_[A-Za-z0-9]{2,8})?$/.test(r)) throw Error(`ai-inference: option ${n} must be a language code like 'en_XX'`);
|
|
98
|
+
e[n] = r;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
2
103
|
//#region src/workloads/ai-inference.ts
|
|
3
|
-
var
|
|
104
|
+
var g = [
|
|
4
105
|
"text-classification",
|
|
5
106
|
"token-classification",
|
|
6
107
|
"question-answering",
|
|
@@ -26,51 +127,90 @@ var r = [
|
|
|
26
127
|
"depth-estimation",
|
|
27
128
|
"feature-extraction",
|
|
28
129
|
"image-feature-extraction"
|
|
29
|
-
],
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
130
|
+
], _ = /* @__PURE__ */ new Map(), v = 2, y = () => {
|
|
131
|
+
_.clear();
|
|
132
|
+
}, b = (e, t) => {
|
|
133
|
+
let n = "", r = null, i = Promise.resolve(), a, o = !1, s = !1, c = (t) => {
|
|
134
|
+
i = i.then(() => {
|
|
135
|
+
if (!o) return e(t);
|
|
136
|
+
}).then(() => void 0, (e) => {
|
|
137
|
+
o = !0, a = e;
|
|
138
|
+
});
|
|
139
|
+
}, l = () => {
|
|
140
|
+
r !== null && clearTimeout(r), r = null;
|
|
141
|
+
let e = n;
|
|
142
|
+
n = "", e && !o && c(e);
|
|
143
|
+
}, u = (e) => {
|
|
144
|
+
if (!s) {
|
|
145
|
+
if (o) throw a;
|
|
146
|
+
if (!t.tokenBuffer) {
|
|
147
|
+
c(e);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
n += e, r === null && (r = setTimeout(l, t.tokenBufferIntervalMs ?? 50));
|
|
151
|
+
}
|
|
152
|
+
}, d = async (e) => {
|
|
153
|
+
if (s = !0, r !== null && clearTimeout(r), r = null, e && !o ? l() : n = "", await i, o) throw a;
|
|
35
154
|
};
|
|
36
|
-
return
|
|
37
|
-
|
|
155
|
+
return {
|
|
156
|
+
callback: u,
|
|
157
|
+
finish: () => d(!0),
|
|
158
|
+
cancel: () => d(!1)
|
|
38
159
|
};
|
|
39
160
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
|
|
161
|
+
function x() {
|
|
162
|
+
let e = globalThis.fetch.bind(globalThis);
|
|
163
|
+
t.fetch = async (t, n) => {
|
|
164
|
+
let r = new URL(String(t));
|
|
165
|
+
if (!/(^|\.)huggingface\.co$/.test(r.hostname) && !/(^|\.)hf\.co$/.test(r.hostname)) throw Error(`ai-inference: model download blocked from ${r.hostname}`);
|
|
166
|
+
let a = await e(r, n), o = Number(a.headers.get("content-length"));
|
|
167
|
+
if (Number.isFinite(o) && o > i) throw Error(`ai-inference: model file too large (${o} bytes > ${i})`);
|
|
168
|
+
return a;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
x(), t.backends?.onnx?.wasm && (t.backends.onnx.wasm.numThreads = 1, t.backends.onnx.wasm.proxy = !1);
|
|
172
|
+
var S = async (t, r) => {
|
|
173
|
+
let { task: i, model: a, input: o, options: s = {} } = t;
|
|
174
|
+
if (!g.includes(i)) throw Error(`Invalid or unsupported task: ${i}. Supported tasks are: ${g.join(", ")}`);
|
|
175
|
+
let c = d(a), l = f(s.device), u = p(s.dtype), y = m(o), x = {};
|
|
176
|
+
h(x, s);
|
|
177
|
+
let S = `${i}:${c.repo}:${u ?? "q4f16"}:${l ?? "wasm"}`, C = _.get(S);
|
|
178
|
+
if (!C) {
|
|
179
|
+
if (_.size >= v) {
|
|
180
|
+
let e = _.keys().next().value;
|
|
181
|
+
_.delete(e);
|
|
49
182
|
}
|
|
50
183
|
let e = {
|
|
51
|
-
dtype:
|
|
52
|
-
device:
|
|
184
|
+
dtype: u ?? "q4f16",
|
|
185
|
+
device: l
|
|
53
186
|
}, t = performance.now();
|
|
54
|
-
console.log(`[flaxia-node] ai-inference: loading pipeline task=${
|
|
187
|
+
console.log(`[flaxia-node] ai-inference: loading pipeline task=${i} model=${c.repo} revision=${c.revision} dtype=${e.dtype} device=${l ?? "wasm"}`);
|
|
55
188
|
try {
|
|
56
|
-
|
|
189
|
+
C = await n(i, c.repo, e);
|
|
57
190
|
} catch (t) {
|
|
58
|
-
if (
|
|
59
|
-
else throw console.error(`[flaxia-node] ai-inference: pipeline load FAILED task=${
|
|
191
|
+
if (l && l !== "wasm") console.warn(`[AiInference] ${l} failed, falling back to wasm:`, t), e.device = "wasm", C = await n(i, c.repo, e);
|
|
192
|
+
else throw console.error(`[flaxia-node] ai-inference: pipeline load FAILED task=${i} model=${c.repo} error=${t instanceof Error ? t.message : String(t)}`), t;
|
|
60
193
|
}
|
|
61
|
-
console.log(`[flaxia-node] ai-inference: pipeline ready task=${
|
|
194
|
+
console.log(`[flaxia-node] ai-inference: pipeline ready task=${i} model=${c.repo} loadMs=${Math.round(performance.now() - t)}`), _.set(S, C);
|
|
62
195
|
}
|
|
63
|
-
let
|
|
64
|
-
max_new_tokens:
|
|
65
|
-
do_sample:
|
|
196
|
+
let w = {
|
|
197
|
+
max_new_tokens: x.max_new_tokens ?? 128,
|
|
198
|
+
do_sample: x.do_sample ?? !1
|
|
66
199
|
};
|
|
67
|
-
|
|
200
|
+
for (let [e, t] of Object.entries(x)) e === "max_new_tokens" || e === "do_sample" || (w[e] = t);
|
|
201
|
+
let T = r && C.tokenizer ? b(r, s) : null;
|
|
202
|
+
T && (w.streamer = new e(C.tokenizer, {
|
|
68
203
|
skip_prompt: !0,
|
|
69
204
|
skip_special_tokens: !0,
|
|
70
|
-
callback_function:
|
|
205
|
+
callback_function: T.callback
|
|
71
206
|
}));
|
|
72
|
-
let
|
|
73
|
-
|
|
207
|
+
let E = performance.now(), D;
|
|
208
|
+
try {
|
|
209
|
+
D = await C(y, w);
|
|
210
|
+
} catch (e) {
|
|
211
|
+
throw T && await T.cancel(), e;
|
|
212
|
+
}
|
|
213
|
+
return await T?.finish(), console.log(`[flaxia-node] ai-inference: done task=${i} model=${c.repo} execMs=${Math.round(performance.now() - E)} inputLen=${String(y).length}`), { output: D };
|
|
74
214
|
};
|
|
75
215
|
//#endregion
|
|
76
|
-
export {
|
|
216
|
+
export { S as handleAiInference, y as releaseCache };
|