@atomic-chat/core 0.19.1 → 0.20.6
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/app-daemon.js +5 -0
- package/dist/app-daemon.js.map +1 -1
- package/dist/audio/args.d.ts +19 -0
- package/dist/audio/args.js +39 -0
- package/dist/audio/args.js.map +1 -0
- package/dist/audio/capabilities.d.ts +24 -0
- package/dist/audio/capabilities.js +96 -0
- package/dist/audio/capabilities.js.map +1 -0
- package/dist/audio/config.d.ts +40 -0
- package/dist/audio/config.js +57 -0
- package/dist/audio/config.js.map +1 -0
- package/dist/audio/errors.d.ts +23 -0
- package/dist/audio/errors.js +52 -0
- package/dist/audio/errors.js.map +1 -0
- package/dist/audio/gallery.d.ts +30 -0
- package/dist/audio/gallery.js +152 -0
- package/dist/audio/gallery.js.map +1 -0
- package/dist/audio/http.d.ts +26 -0
- package/dist/audio/http.js +56 -0
- package/dist/audio/http.js.map +1 -0
- package/dist/audio/idle.d.ts +22 -0
- package/dist/audio/idle.js +44 -0
- package/dist/audio/idle.js.map +1 -0
- package/dist/audio/index.d.ts +26 -0
- package/dist/audio/index.js +27 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/install.d.ts +57 -0
- package/dist/audio/install.js +196 -0
- package/dist/audio/install.js.map +1 -0
- package/dist/audio/jobs.d.ts +77 -0
- package/dist/audio/jobs.js +340 -0
- package/dist/audio/jobs.js.map +1 -0
- package/dist/audio/model-files.d.ts +12 -0
- package/dist/audio/model-files.js +42 -0
- package/dist/audio/model-files.js.map +1 -0
- package/dist/audio/output.d.ts +32 -0
- package/dist/audio/output.js +93 -0
- package/dist/audio/output.js.map +1 -0
- package/dist/audio/parse.d.ts +15 -0
- package/dist/audio/parse.js +149 -0
- package/dist/audio/parse.js.map +1 -0
- package/dist/audio/recipe.d.ts +22 -0
- package/dist/audio/recipe.js +92 -0
- package/dist/audio/recipe.js.map +1 -0
- package/dist/audio/request.d.ts +24 -0
- package/dist/audio/request.js +86 -0
- package/dist/audio/request.js.map +1 -0
- package/dist/audio/server-process.d.ts +51 -0
- package/dist/audio/server-process.js +202 -0
- package/dist/audio/server-process.js.map +1 -0
- package/dist/audio/service.d.ts +107 -0
- package/dist/audio/service.js +402 -0
- package/dist/audio/service.js.map +1 -0
- package/dist/audio/session.d.ts +73 -0
- package/dist/audio/session.js +216 -0
- package/dist/audio/session.js.map +1 -0
- package/dist/audio/state.d.ts +68 -0
- package/dist/audio/state.js +88 -0
- package/dist/audio/state.js.map +1 -0
- package/dist/audio/types.d.ts +52 -0
- package/dist/audio/types.js +8 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/audio/wav.d.ts +22 -0
- package/dist/audio/wav.js +56 -0
- package/dist/audio/wav.js.map +1 -0
- package/dist/audio/wiring.d.ts +31 -0
- package/dist/audio/wiring.js +41 -0
- package/dist/audio/wiring.js.map +1 -0
- package/dist/backend/install/service.js +4 -2
- package/dist/backend/install/service.js.map +1 -1
- package/dist/cli/launch.js +2 -0
- package/dist/cli/launch.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +5 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +21 -1
- package/dist/client/control-client.js +50 -0
- package/dist/client/control-client.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/model-catalog.d.ts +40 -0
- package/dist/client/model-catalog.js +149 -0
- package/dist/client/model-catalog.js.map +1 -0
- package/dist/cloud/registry.js +1 -0
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +22 -1
- package/dist/config/paths.js +24 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/audio.d.ts +290 -0
- package/dist/contracts/audio.js +24 -0
- package/dist/contracts/audio.js.map +1 -0
- package/dist/contracts/embedding.js +1 -0
- package/dist/contracts/embedding.js.map +1 -1
- package/dist/contracts/engine-builds.d.ts +10 -4
- package/dist/contracts/engine-builds.js +10 -2
- package/dist/contracts/engine-builds.js.map +1 -1
- package/dist/contracts/engines.d.ts +1 -1
- package/dist/contracts/engines.js +4 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +14 -2
- package/dist/contracts/errors.js +29 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +10 -0
- package/dist/contracts/geniex.d.ts +98 -0
- package/dist/contracts/geniex.js +15 -0
- package/dist/contracts/geniex.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/model-yml.d.ts +40 -0
- package/dist/contracts/model-yml.js +7 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +6 -1
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +12 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +6 -1
- package/dist/core/atomic-core.js +7 -1
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +105 -6
- package/dist/core/create.js.map +1 -1
- package/dist/core/gpu-residency.d.ts +8 -2
- package/dist/core/gpu-residency.js +9 -1
- package/dist/core/gpu-residency.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.js.map +1 -1
- package/dist/diffusion/install.d.ts +6 -3
- package/dist/diffusion/install.js +5 -4
- package/dist/diffusion/install.js.map +1 -1
- package/dist/embedding/index.js +1 -0
- package/dist/embedding/index.js.map +1 -1
- package/dist/engine-builds/engines.d.ts +31 -8
- package/dist/engine-builds/engines.js +118 -14
- package/dist/engine-builds/engines.js.map +1 -1
- package/dist/engine-builds/geniex.d.ts +35 -0
- package/dist/engine-builds/geniex.js +111 -0
- package/dist/engine-builds/geniex.js.map +1 -0
- package/dist/engine-builds/index.d.ts +3 -2
- package/dist/engine-builds/index.js +3 -2
- package/dist/engine-builds/index.js.map +1 -1
- package/dist/engine-builds/manifest.d.ts +95 -5
- package/dist/engine-builds/manifest.js +152 -9
- package/dist/engine-builds/manifest.js.map +1 -1
- package/dist/engine-builds/order.d.ts +7 -1
- package/dist/engine-builds/order.js +13 -0
- package/dist/engine-builds/order.js.map +1 -1
- package/dist/engine-builds/select.d.ts +43 -11
- package/dist/engine-builds/select.js +64 -16
- package/dist/engine-builds/select.js.map +1 -1
- package/dist/engine-builds/service.d.ts +19 -11
- package/dist/engine-builds/service.js +31 -9
- package/dist/engine-builds/service.js.map +1 -1
- package/dist/engines/service.d.ts +4 -3
- package/dist/engines/service.js +5 -3
- package/dist/engines/service.js.map +1 -1
- package/dist/engines/versions.js +3 -0
- package/dist/engines/versions.js.map +1 -1
- package/dist/integrations/catalog.d.ts +3 -1
- package/dist/integrations/catalog.js +8 -2
- package/dist/integrations/catalog.js.map +1 -1
- package/dist/integrations/config-io.d.ts +45 -4
- package/dist/integrations/config-io.js +91 -6
- package/dist/integrations/config-io.js.map +1 -1
- package/dist/integrations/configure/codex-repair.d.ts +75 -0
- package/dist/integrations/configure/codex-repair.js +254 -0
- package/dist/integrations/configure/codex-repair.js.map +1 -0
- package/dist/integrations/configure/codex.d.ts +48 -10
- package/dist/integrations/configure/codex.js +126 -32
- package/dist/integrations/configure/codex.js.map +1 -1
- package/dist/integrations/configure/registry.d.ts +4 -1
- package/dist/integrations/configure/registry.js +1 -0
- package/dist/integrations/configure/registry.js.map +1 -1
- package/dist/lock/process-journal.d.ts +3 -3
- package/dist/models/compatibility/rules-baseline.js +1 -0
- package/dist/models/compatibility/rules-baseline.js.map +1 -1
- package/dist/models/compatibility/rules.js +1 -0
- package/dist/models/compatibility/rules.js.map +1 -1
- package/dist/models/gguf/kv-cache.d.ts +5 -0
- package/dist/models/gguf/kv-cache.js +35 -2
- package/dist/models/gguf/kv-cache.js.map +1 -1
- package/dist/models/gguf/reader.d.ts +5 -0
- package/dist/models/gguf/reader.js +15 -3
- package/dist/models/gguf/reader.js.map +1 -1
- package/dist/models/hf.d.ts +3 -0
- package/dist/models/hf.js +11 -4
- package/dist/models/hf.js.map +1 -1
- package/dist/router/resolve.d.ts +3 -2
- package/dist/router/resolve.js +3 -1
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/geniex/accelerators.d.ts +20 -0
- package/dist/runtime/geniex/accelerators.js +53 -0
- package/dist/runtime/geniex/accelerators.js.map +1 -0
- package/dist/runtime/geniex/check.d.ts +34 -0
- package/dist/runtime/geniex/check.js +117 -0
- package/dist/runtime/geniex/check.js.map +1 -0
- package/dist/runtime/geniex/chip.d.ts +29 -0
- package/dist/runtime/geniex/chip.js +35 -0
- package/dist/runtime/geniex/chip.js.map +1 -0
- package/dist/runtime/geniex/devices.d.ts +13 -0
- package/dist/runtime/geniex/devices.js +32 -0
- package/dist/runtime/geniex/devices.js.map +1 -0
- package/dist/runtime/geniex/geniex-host.d.ts +17 -0
- package/dist/runtime/geniex/geniex-host.js +26 -0
- package/dist/runtime/geniex/geniex-host.js.map +1 -0
- package/dist/runtime/geniex/host/args.d.ts +56 -0
- package/dist/runtime/geniex/host/args.js +115 -0
- package/dist/runtime/geniex/host/args.js.map +1 -0
- package/dist/runtime/geniex/host/engine.d.ts +76 -0
- package/dist/runtime/geniex/host/engine.js +122 -0
- package/dist/runtime/geniex/host/engine.js.map +1 -0
- package/dist/runtime/geniex/host/ffi-bun.d.ts +15 -0
- package/dist/runtime/geniex/host/ffi-bun.js +415 -0
- package/dist/runtime/geniex/host/ffi-bun.js.map +1 -0
- package/dist/runtime/geniex/host/grammar.d.ts +11 -0
- package/dist/runtime/geniex/host/grammar.js +223 -0
- package/dist/runtime/geniex/host/grammar.js.map +1 -0
- package/dist/runtime/geniex/host/inspect.d.ts +25 -0
- package/dist/runtime/geniex/host/inspect.js +177 -0
- package/dist/runtime/geniex/host/inspect.js.map +1 -0
- package/dist/runtime/geniex/host/library.d.ts +117 -0
- package/dist/runtime/geniex/host/library.js +38 -0
- package/dist/runtime/geniex/host/library.js.map +1 -0
- package/dist/runtime/geniex/host/openai.d.ts +62 -0
- package/dist/runtime/geniex/host/openai.js +458 -0
- package/dist/runtime/geniex/host/openai.js.map +1 -0
- package/dist/runtime/geniex/host/run.d.ts +48 -0
- package/dist/runtime/geniex/host/run.js +208 -0
- package/dist/runtime/geniex/host/run.js.map +1 -0
- package/dist/runtime/geniex/host/server.d.ts +39 -0
- package/dist/runtime/geniex/host/server.js +232 -0
- package/dist/runtime/geniex/host/server.js.map +1 -0
- package/dist/runtime/geniex/host/worker-protocol.d.ts +76 -0
- package/dist/runtime/geniex/host/worker-protocol.js +116 -0
- package/dist/runtime/geniex/host/worker-protocol.js.map +1 -0
- package/dist/runtime/geniex/host/worker-source.generated.d.ts +1 -0
- package/dist/runtime/geniex/host/worker-source.generated.js +4 -0
- package/dist/runtime/geniex/host/worker-source.generated.js.map +1 -0
- package/dist/runtime/geniex/host/worker.d.ts +7 -0
- package/dist/runtime/geniex/host/worker.js +19 -0
- package/dist/runtime/geniex/host/worker.js.map +1 -0
- package/dist/runtime/geniex/host-process.d.ts +48 -0
- package/dist/runtime/geniex/host-process.js +104 -0
- package/dist/runtime/geniex/host-process.js.map +1 -0
- package/dist/runtime/geniex/index.d.ts +11 -0
- package/dist/runtime/geniex/index.js +12 -0
- package/dist/runtime/geniex/index.js.map +1 -0
- package/dist/runtime/geniex/model-yml.d.ts +8 -0
- package/dist/runtime/geniex/model-yml.js +98 -0
- package/dist/runtime/geniex/model-yml.js.map +1 -0
- package/dist/runtime/geniex/runtime.d.ts +94 -0
- package/dist/runtime/geniex/runtime.js +366 -0
- package/dist/runtime/geniex/runtime.js.map +1 -0
- package/dist/runtime/litert-lm/host/openai.d.ts +4 -37
- package/dist/runtime/litert-lm/host/openai.js +11 -96
- package/dist/runtime/litert-lm/host/openai.js.map +1 -1
- package/dist/runtime/litert-lm/host/pool.d.ts +1 -7
- package/dist/runtime/litert-lm/host/pool.js +1 -17
- package/dist/runtime/litert-lm/host/pool.js.map +1 -1
- package/dist/runtime/litert-lm/host/server.js +11 -53
- package/dist/runtime/litert-lm/host/server.js.map +1 -1
- package/dist/runtime/llamacpp/args.d.ts +5 -0
- package/dist/runtime/llamacpp/args.js +2 -0
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/fit-margin.d.ts +44 -0
- package/dist/runtime/llamacpp/fit-margin.js +50 -0
- package/dist/runtime/llamacpp/fit-margin.js.map +1 -1
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +57 -22
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +2 -1
- package/dist/runtime/llamacpp/runtime.js +3 -1
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/shared/external-sessions.js +1 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/runtime/shared/fifo-lock.d.ts +10 -0
- package/dist/runtime/shared/fifo-lock.js +21 -0
- package/dist/runtime/shared/fifo-lock.js.map +1 -0
- package/dist/runtime/shared/index.d.ts +2 -0
- package/dist/runtime/shared/index.js +2 -0
- package/dist/runtime/shared/index.js.map +1 -1
- package/dist/runtime/shared/openai-sse.d.ts +112 -0
- package/dist/runtime/shared/openai-sse.js +178 -0
- package/dist/runtime/shared/openai-sse.js.map +1 -0
- package/dist/server/control/index.d.ts +1 -1
- package/dist/server/control/router.js +4 -0
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/audio.d.ts +15 -0
- package/dist/server/control/routes/audio.js +59 -0
- package/dist/server/control/routes/audio.js.map +1 -0
- package/dist/server/control/routes/geniex.d.ts +7 -0
- package/dist/server/control/routes/geniex.js +22 -0
- package/dist/server/control/routes/geniex.js.map +1 -0
- package/dist/server/control/types.d.ts +36 -2
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +4 -0
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/audio-speech-params.d.ts +47 -0
- package/dist/server/public/audio-speech-params.js +177 -0
- package/dist/server/public/audio-speech-params.js.map +1 -0
- package/dist/server/public/audio-speech.d.ts +14 -0
- package/dist/server/public/audio-speech.js +118 -0
- package/dist/server/public/audio-speech.js.map +1 -0
- package/dist/server/public/embedding.d.ts +8 -7
- package/dist/server/public/embedding.js +15 -7
- package/dist/server/public/embedding.js.map +1 -1
- package/dist/server/public/forward.js +15 -1
- package/dist/server/public/forward.js.map +1 -1
- package/dist/server/public/index.d.ts +1 -1
- package/dist/server/public/index.js +7 -0
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.js +1 -0
- package/dist/server/public/listing.js.map +1 -1
- package/dist/server/public/responses.js +9 -0
- package/dist/server/public/responses.js.map +1 -1
- package/dist/server/public/trace.js +2 -0
- package/dist/server/public/trace.js.map +1 -1
- package/dist/server/public/types.d.ts +29 -1
- package/dist/server/public/validate.d.ts +32 -0
- package/dist/server/public/validate.js +146 -0
- package/dist/server/public/validate.js.map +1 -0
- package/dist/settings/schema/geniex.json +63 -0
- package/dist/settings/schema/mlx.json +1 -1
- package/dist/settings/schema.js +11 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/telemetry/reports.d.ts +12 -0
- package/dist/telemetry/reports.js +38 -0
- package/dist/telemetry/reports.js.map +1 -1
- package/dist/telemetry/subscribe.d.ts +3 -3
- package/dist/telemetry/subscribe.js +8 -3
- package/dist/telemetry/subscribe.js.map +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -2
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the Worker of `geniex-host` does with each message of the main thread (openspec change
|
|
3
|
+
* `add-geniex-runtime`, design D1), apart from the thread it runs on: `worker.ts` is the Bun entry
|
|
4
|
+
* that binds this to `self.onmessage` with the `bun:ffi` library, and the tests drive it in-process
|
|
5
|
+
* with a fake library.
|
|
6
|
+
*
|
|
7
|
+
* The library is single-threaded and `generate` blocks: the Worker handles one message at a time,
|
|
8
|
+
* and while a generation runs it reads nothing — the main thread cancels through the shared flag the
|
|
9
|
+
* generate message carries, which the token callback checks on every token.
|
|
10
|
+
*/
|
|
11
|
+
import { GENIEX_CANCELLED, GeniexLibraryError, PROBE_PLUGIN } from './library.js';
|
|
12
|
+
const failure = (error) => ({
|
|
13
|
+
message: error instanceof Error ? error.message : String(error),
|
|
14
|
+
code: error instanceof GeniexLibraryError ? error.code : null,
|
|
15
|
+
});
|
|
16
|
+
/** One Worker's state machine: a library once loaded, a model once created. */
|
|
17
|
+
export function createGeniexWorkerHandler(deps) {
|
|
18
|
+
let library = null;
|
|
19
|
+
let model = null;
|
|
20
|
+
const load = async (libDir) => {
|
|
21
|
+
if (library)
|
|
22
|
+
return library;
|
|
23
|
+
try {
|
|
24
|
+
library = await deps.loadLibrary(libDir);
|
|
25
|
+
return library;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
deps.post({ type: 'failed', stage: 'load', ...failure(error) });
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return async (request) => {
|
|
33
|
+
switch (request.type) {
|
|
34
|
+
case 'probe': {
|
|
35
|
+
const lib = await load(request.libDir);
|
|
36
|
+
if (!lib)
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
deps.post({
|
|
40
|
+
type: 'probed',
|
|
41
|
+
version: lib.version,
|
|
42
|
+
abi: lib.abi,
|
|
43
|
+
plugins: lib.plugins(),
|
|
44
|
+
devices: lib.devices(PROBE_PLUGIN),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
deps.post({ type: 'failed', stage: 'call', ...failure(error) });
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
case 'create': {
|
|
53
|
+
const lib = await load(request.libDir);
|
|
54
|
+
if (!lib)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
model = lib.createModel(request.settings);
|
|
58
|
+
deps.post({ type: 'created', vision: model.vision });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
deps.post({ type: 'failed', stage: 'call', ...failure(error) });
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
case 'template': {
|
|
66
|
+
if (!model)
|
|
67
|
+
return deps.post({ type: 'error', id: request.id, message: 'no model', code: null });
|
|
68
|
+
try {
|
|
69
|
+
deps.post({ type: 'templated', id: request.id, prompt: model.applyChatTemplate(request.input) });
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
deps.post({ type: 'error', id: request.id, ...failure(error) });
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
case 'generate': {
|
|
77
|
+
if (!model)
|
|
78
|
+
return deps.post({ type: 'error', id: request.id, message: 'no model', code: null });
|
|
79
|
+
const flag = new Int32Array(request.cancel);
|
|
80
|
+
try {
|
|
81
|
+
const result = model.generate(request.prompt, request.config, (token) => {
|
|
82
|
+
if (Atomics.load(flag, 0) !== 0)
|
|
83
|
+
return false;
|
|
84
|
+
deps.post({ type: 'token', id: request.id, text: token });
|
|
85
|
+
return true;
|
|
86
|
+
});
|
|
87
|
+
deps.post({ type: 'done', id: request.id, result });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error instanceof GeniexLibraryError && error.code === GENIEX_CANCELLED)
|
|
91
|
+
deps.post({
|
|
92
|
+
type: 'done',
|
|
93
|
+
id: request.id,
|
|
94
|
+
result: { stopReason: 'cancelled', promptTokens: 0, generatedTokens: 0 },
|
|
95
|
+
});
|
|
96
|
+
else
|
|
97
|
+
deps.post({ type: 'error', id: request.id, ...failure(error) });
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
case 'destroy': {
|
|
102
|
+
try {
|
|
103
|
+
model?.destroy();
|
|
104
|
+
model = null;
|
|
105
|
+
library?.close();
|
|
106
|
+
library = null;
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
deps.post({ type: 'destroyed' });
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=worker-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AA2CjF,MAAM,OAAO,GAAG,CAAC,KAAc,EAA4C,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/D,IAAI,EAAE,KAAK,YAAY,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;CAC9D,CAAC,CAAA;AAEF,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,IAAsB;IAEtB,IAAI,OAAO,GAAyB,IAAI,CAAA;IACxC,IAAI,KAAK,GAAuB,IAAI,CAAA;IAEpC,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAiC,EAAE;QACnE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YACxC,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IAED,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACtC,IAAI,CAAC,GAAG;oBAAE,OAAM;gBAChB,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,GAAG,EAAE,GAAG,CAAC,GAAG;wBACZ,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;wBACtB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;qBACnC,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjE,CAAC;gBACD,OAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACtC,IAAI,CAAC,GAAG;oBAAE,OAAM;gBAChB,IAAI,CAAC;oBACH,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;oBACzC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;gBACtD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjE,CAAC;gBACD,OAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChG,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBAClG,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjE,CAAC;gBACD,OAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChG,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBAC3C,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;wBACtE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;4BAAE,OAAO,KAAK,CAAA;wBAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;wBACzD,OAAO,IAAI,CAAA;oBACb,CAAC,CAAC,CAAA;oBACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBACrD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;wBACxE,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;yBACzE,CAAC,CAAA;;wBACC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACtE,CAAC;gBACD,OAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,CAAC;oBACH,KAAK,EAAE,OAAO,EAAE,CAAA;oBAChB,KAAK,GAAG,IAAI,CAAA;oBACZ,OAAO,EAAE,KAAK,EAAE,CAAA;oBAChB,OAAO,GAAG,IAAI,CAAA;gBAChB,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBAClC,CAAC;gBACD,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GENIEX_WORKER_SOURCE: string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Generated by scripts/build-geniex-worker.mjs from src/runtime/geniex/host/worker.ts — not committed,
|
|
2
|
+
// not edited by hand. The GenieX host starts this script as a blob: Worker (host/engine.ts).
|
|
3
|
+
export const GENIEX_WORKER_SOURCE = "// @bun\nimport{dlopen,FFIType,JSCallback,ptr,read,CString}from\"bun:ffi\";import{existsSync}from\"fs\";import{join}from\"path\";class GeniexLibraryError extends Error{operation;code;constructor(operation,message,code=null){super(`${operation}: ${message}`);this.operation=operation;this.code=code;this.name=\"GeniexLibraryError\"}}var GENIEX_CANCELLED=-100006,GENIEX_POWER_MODES=[\"low_power_saver\",\"power_saver\",\"high_power_saver\",\"low_balanced\",\"balanced\",\"high_performance\",\"sustained_high_performance\",\"burst\"],BOUND_GENIEX_ABI=1,PROBE_PLUGIN=\"llama_cpp\";var T=FFIType,LIBRARY_FILE=\"geniex.dll\",QAIRT_DIR=\"qairt\",LOG_LEVEL_ERROR=4,STOP_REASONS=[\"eos\",\"length\",\"user\",\"stop_sequence\",\"context_length\"],SYMBOLS={geniex_get_error_message:{args:[T.i32],returns:T.cstring},geniex_init:{args:[],returns:T.i32},geniex_deinit:{args:[],returns:T.i32},geniex_set_log_level:{args:[T.i32],returns:T.i32},geniex_set_qairt_runtime_path:{args:[T.ptr],returns:T.i32},geniex_free:{args:[T.ptr],returns:T.void},geniex_version:{args:[],returns:T.cstring},geniex_get_plugin_list:{args:[T.ptr],returns:T.i32},geniex_get_device_list:{args:[T.ptr,T.ptr],returns:T.i32},geniex_resolve_device:{args:[T.ptr,T.ptr],returns:T.i32},geniex_llm_create:{args:[T.ptr,T.ptr],returns:T.i32},geniex_llm_destroy:{args:[T.ptr],returns:T.i32},geniex_llm_apply_chat_template:{args:[T.ptr,T.ptr,T.ptr],returns:T.i32},geniex_llm_generate:{args:[T.ptr,T.ptr,T.ptr],returns:T.i32},geniex_vlm_create:{args:[T.ptr,T.ptr],returns:T.i32},geniex_vlm_destroy:{args:[T.ptr],returns:T.i32},geniex_vlm_apply_chat_template:{args:[T.ptr,T.ptr,T.ptr],returns:T.i32},geniex_vlm_generate:{args:[T.ptr,T.ptr,T.ptr],returns:T.i32},geniex_vlm_reset:{args:[T.ptr],returns:T.i32}},cstr=(value)=>Buffer.from(`${value}\\x00`,\"utf8\"),wide=(value)=>Buffer.from(`${value}\\x00`,\"utf16le\"),text=(value)=>{let s=value==null?\"\":String(value);return s===\"\"?null:s};class Arena{kept=[];str(value){if(value===null)return null;let buffer=cstr(value);return this.kept.push(buffer),ptr(buffer)}strings(values){if(values.length===0)return null;let table=Buffer.alloc(8*values.length);return values.forEach((value,index)=>table.writeBigUInt64LE(BigInt(this.str(value)??0),index*8)),this.kept.push(table),ptr(table)}struct(size){let buffer=Buffer.alloc(size);return this.kept.push(buffer),buffer}}var writePtr=(buffer,offset,value)=>buffer.writeBigUInt64LE(BigInt(value??0),offset),readPtr=(buffer,offset)=>{let value=buffer.readBigUInt64LE(offset);return value===0n?null:Number(value)};function prepareWindowsSearch(libDir){dlopen(\"kernel32.dll\",{SetDllDirectoryW:{args:[T.ptr],returns:T.i32}}).symbols.SetDllDirectoryW(ptr(wide(libDir)))}function leaveEcoQos(){let k32=dlopen(\"kernel32.dll\",{SetProcessInformation:{args:[T.i64,T.i32,T.ptr,T.u32],returns:T.i32}}).symbols,PROCESS_POWER_THROTTLING=4,state=new Uint32Array([1,1,0]);k32.SetProcessInformation(-1n,4,ptr(state),state.byteLength)}var loadBunGeniexLibrary=async(libDir)=>{let path=join(libDir,LIBRARY_FILE);if(!existsSync(path))throw new GeniexLibraryError(\"load\",`${path} not found: no ${LIBRARY_FILE} in this build`);if(process.platform===\"win32\")prepareWindowsSearch(libDir),leaveEcoQos();let L;try{L=dlopen(path,SYMBOLS).symbols}catch(error){throw new GeniexLibraryError(\"load\",error instanceof Error?error.message:String(error))}let check=(operation,code)=>{let value=Number(code);if(value===0)return;throw new GeniexLibraryError(operation,text(L.geniex_get_error_message(value))??`error ${value}`,value)},qairt=join(libDir,QAIRT_DIR,\"htp-files\");if(existsSync(join(qairt,\"QnnHtp.dll\"))){let keep=cstr(qairt);check(\"set_qairt_runtime_path\",L.geniex_set_qairt_runtime_path(ptr(keep)))}return L.geniex_set_log_level(LOG_LEVEL_ERROR),check(\"init\",L.geniex_init()),bindLibrary(L,check)};function takeStrings(L,table,count){if(!table||count<=0)return[];let out=[];for(let i=0;i<count;i++){let at=read.ptr(table,i*8);out.push(at?new CString(at).toString():\"\")}return L.geniex_free(table),out}function bindLibrary(L,check){let version=/^\\d+\\.\\d+\\.\\d+/.exec((text(L.geniex_version())??\"\").replace(/^v/i,\"\"))?.[0]??null;function plugins(){let out=Buffer.alloc(16);return check(\"get_plugin_list\",L.geniex_get_plugin_list(ptr(out))),takeStrings(L,readPtr(out,0),out.readInt32LE(8))}function devices(plugin){let arena=new Arena,input=arena.struct(8);writePtr(input,0,arena.str(plugin));let out=arena.struct(24);check(\"get_device_list\",L.geniex_get_device_list(ptr(input),ptr(out)));let count=out.readInt32LE(16),ids=takeStrings(L,readPtr(out,0),count);return takeStrings(L,readPtr(out,8),count),ids}function resolveDevice(plugin,mode){let arena=new Arena,input=arena.struct(32);writePtr(input,0,arena.str(plugin)),writePtr(input,8,null),writePtr(input,16,arena.str(mode)),input.writeInt32LE(999,24);let out=arena.struct(24);check(\"resolve_device\",L.geniex_resolve_device(ptr(input),ptr(out)));let idPtr=readPtr(out,0),warningPtr=readPtr(out,16),deviceId=idPtr?new CString(idPtr).toString():null;if(idPtr)L.geniex_free(idPtr);if(warningPtr)L.geniex_free(warningPtr);return{deviceId,ngl:out.readInt32LE(8)}}function writeModelConfig(buffer,at,arena,settings,ngl){buffer.writeInt32LE(settings.plugin===\"qairt\"?0:settings.nCtx,at+0),buffer.writeInt32LE(settings.threads,at+4),buffer.writeInt32LE(settings.threads,at+8),buffer.writeInt32LE(0,at+12),buffer.writeInt32LE(0,at+16),buffer.writeInt32LE(0,at+20),buffer.writeInt32LE(ngl,at+24),writePtr(buffer,at+32,null),writePtr(buffer,at+40,null),writePtr(buffer,at+48,arena.str(\"\")),writePtr(buffer,at+56,arena.str(\"\")),buffer.writeInt32LE(0,at+64),buffer.writeInt32LE(0,at+68),buffer.writeFloatLE(0,at+72),buffer.writeInt32LE(GENIEX_POWER_MODES.indexOf(settings.powerMode),at+76)}function createModel(settings){let{deviceId,ngl}=resolveDevice(settings.plugin,settings.device),vision=settings.mmproj!==null,modelPath=settings.plugin===\"qairt\"?join(settings.model,\"genie_config.json\"):settings.model,arena=new Arena,handleOut=arena.struct(8);if(vision){let input=arena.struct(128);writePtr(input,0,arena.str(modelPath)),writePtr(input,8,arena.str(settings.mmproj)),writeModelConfig(input,16,arena,settings,ngl),writePtr(input,96,arena.str(settings.plugin)),writePtr(input,104,arena.str(deviceId)),writePtr(input,112,null),writePtr(input,120,null),check(\"vlm_create\",L.geniex_vlm_create(ptr(input),ptr(handleOut)))}else{let input=arena.struct(112);writePtr(input,0,arena.str(modelPath)),writePtr(input,8,null),writeModelConfig(input,16,arena,settings,ngl),writePtr(input,96,arena.str(settings.plugin)),writePtr(input,104,arena.str(deviceId)),check(\"llm_create\",L.geniex_llm_create(ptr(input),ptr(handleOut)))}let handle=readPtr(handleOut,0);if(!handle)throw new GeniexLibraryError(vision?\"vlm_create\":\"llm_create\",\"the library returned no handle\");return bindModel(L,check,handle,vision)}return{version,abi:BOUND_GENIEX_ABI,plugins,devices,createModel,close:()=>{L.geniex_deinit()}}}function writeToolCalls(arena,calls){if(calls.length===0)return null;let table=arena.struct(24*calls.length);return calls.forEach((call,index)=>{writePtr(table,index*24,arena.str(call.id)),writePtr(table,index*24+8,arena.str(call.name)),writePtr(table,index*24+16,arena.str(call.arguments))}),ptr(table)}function bindModel(L,check,handle,vision){function applyChatTemplate(input){let arena=new Arena,count=input.messages.length,messages;if(vision)messages=arena.struct(56*count),input.messages.forEach((message,index)=>{let at=index*56,contents=arena.struct(16*Math.max(1,message.content.length));message.content.forEach((part,j)=>{writePtr(contents,j*16,arena.str(part.type)),writePtr(contents,j*16+8,arena.str(part.type===\"text\"?part.text:part.path))}),writePtr(messages,at,arena.str(message.role)),writePtr(messages,at+8,message.content.length>0?ptr(contents):null),messages.writeBigInt64LE(BigInt(message.content.length),at+16),writePtr(messages,at+24,writeToolCalls(arena,message.tool_calls??[])),messages.writeInt32LE(message.tool_calls?.length??0,at+32),writePtr(messages,at+40,arena.str(message.tool_call_id??null)),writePtr(messages,at+48,arena.str(message.tool_name??null))});else messages=arena.struct(48*count),input.messages.forEach((message,index)=>{let at=index*48,content=message.content.map((part)=>part.type===\"text\"?part.text:\"\").join(\"\");writePtr(messages,at,arena.str(message.role)),writePtr(messages,at+8,arena.str(content)),writePtr(messages,at+16,writeToolCalls(arena,message.tool_calls??[])),messages.writeInt32LE(message.tool_calls?.length??0,at+24),writePtr(messages,at+32,arena.str(message.tool_call_id??null)),writePtr(messages,at+40,arena.str(message.tool_name??null))});let request=arena.struct(32);writePtr(request,0,count>0?ptr(messages):null),request.writeInt32LE(count,8),writePtr(request,16,arena.str(input.tools)),request.writeUInt8(input.enableThinking?1:0,24),request.writeUInt8(vision?0:1,25);let out=arena.struct(8);check(vision?\"vlm_apply_chat_template\":\"llm_apply_chat_template\",vision?L.geniex_vlm_apply_chat_template(handle,ptr(request),ptr(out)):L.geniex_llm_apply_chat_template(handle,ptr(request),ptr(out)));let formatted=readPtr(out,0);if(!formatted)return\"\";let prompt=new CString(formatted).toString();return L.geniex_free(formatted),prompt}function generate(prompt,config,onToken){let arena=new Arena,sampler=arena.struct(56),s=config.sampler;sampler.writeFloatLE(s.temperature??0.8,0),sampler.writeFloatLE(s.topP??0.95,4),sampler.writeInt32LE(s.topK??40,8),sampler.writeFloatLE(0.05,12),sampler.writeFloatLE(1,16),sampler.writeFloatLE(0,20),sampler.writeFloatLE(0,24),sampler.writeInt32LE(s.seed??-1,28),writePtr(sampler,32,null),writePtr(sampler,40,arena.str(s.grammar)),sampler.writeUInt8(0,48);let generation=arena.struct(72);generation.writeInt32LE(config.maxTokens,0),writePtr(generation,8,arena.strings(config.stop)),generation.writeInt32LE(config.stop.length,16),writePtr(generation,24,ptr(sampler)),writePtr(generation,32,arena.strings(config.imagePaths)),generation.writeInt32LE(config.imagePaths.length,40),writePtr(generation,48,null),generation.writeInt32LE(0,56),generation.writeUInt8(0,60),generation.writeInt32LE(0,64);let callbackError=null,callback=new JSCallback((tokenPtr)=>{try{return onToken(tokenPtr?new CString(tokenPtr).toString():\"\")}catch(error){return callbackError=error,!1}},{args:[T.ptr,T.ptr],returns:T.bool});try{let input=arena.struct(64);writePtr(input,0,arena.str(prompt)),writePtr(input,8,ptr(generation)),writePtr(input,16,callback.ptr),writePtr(input,24,null);let out=arena.struct(96);if(vision)check(\"vlm_reset\",L.geniex_vlm_reset(handle));let code=Number(vision?L.geniex_vlm_generate(handle,ptr(input),ptr(out)):L.geniex_llm_generate(handle,ptr(input),ptr(out)));if(callbackError)throw callbackError;if(code===GENIEX_CANCELLED)throw new GeniexLibraryError(vision?\"vlm_generate\":\"llm_generate\",\"Operation cancelled by caller\",code);check(vision?\"vlm_generate\":\"llm_generate\",code);let fullText=readPtr(out,0);if(fullText)L.geniex_free(fullText);let stopPtr=readPtr(out,88),stop=stopPtr?new CString(stopPtr).toString():\"\";return{stopReason:STOP_REASONS.find((reason)=>reason===stop)??\"unknown\",promptTokens:Number(out.readBigInt64LE(40)),generatedTokens:Number(out.readBigInt64LE(48))}}finally{callback.close()}}return{vision,applyChatTemplate,generate,destroy:()=>{if(vision)L.geniex_vlm_destroy(handle);else L.geniex_llm_destroy(handle)}}}var failure=(error)=>({message:error instanceof Error?error.message:String(error),code:error instanceof GeniexLibraryError?error.code:null});function createGeniexWorkerHandler(deps){let library=null,model=null,load=async(libDir)=>{if(library)return library;try{return library=await deps.loadLibrary(libDir),library}catch(error){return deps.post({type:\"failed\",stage:\"load\",...failure(error)}),null}};return async(request)=>{switch(request.type){case\"probe\":{let lib=await load(request.libDir);if(!lib)return;try{deps.post({type:\"probed\",version:lib.version,abi:lib.abi,plugins:lib.plugins(),devices:lib.devices(PROBE_PLUGIN)})}catch(error){deps.post({type:\"failed\",stage:\"call\",...failure(error)})}return}case\"create\":{let lib=await load(request.libDir);if(!lib)return;try{model=lib.createModel(request.settings),deps.post({type:\"created\",vision:model.vision})}catch(error){deps.post({type:\"failed\",stage:\"call\",...failure(error)})}return}case\"template\":{if(!model)return deps.post({type:\"error\",id:request.id,message:\"no model\",code:null});try{deps.post({type:\"templated\",id:request.id,prompt:model.applyChatTemplate(request.input)})}catch(error){deps.post({type:\"error\",id:request.id,...failure(error)})}return}case\"generate\":{if(!model)return deps.post({type:\"error\",id:request.id,message:\"no model\",code:null});let flag=new Int32Array(request.cancel);try{let result=model.generate(request.prompt,request.config,(token)=>{if(Atomics.load(flag,0)!==0)return!1;return deps.post({type:\"token\",id:request.id,text:token}),!0});deps.post({type:\"done\",id:request.id,result})}catch(error){if(error instanceof GeniexLibraryError&&error.code===GENIEX_CANCELLED)deps.post({type:\"done\",id:request.id,result:{stopReason:\"cancelled\",promptTokens:0,generatedTokens:0}});else deps.post({type:\"error\",id:request.id,...failure(error)})}return}case\"destroy\":{try{model?.destroy(),model=null,library?.close(),library=null}finally{deps.post({type:\"destroyed\"})}return}}}}var handle=createGeniexWorkerHandler({loadLibrary:loadBunGeniexLibrary,post:(answer)=>self.postMessage(answer)}),tail=Promise.resolve();self.onmessage=(event)=>{let request=event.data;tail=tail.then(()=>handle(request)).catch(()=>{})};\n";
|
|
4
|
+
//# sourceMappingURL=worker-source.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-source.generated.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/worker-source.generated.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,oBAAoB,GAAW,u4aAAu4a,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Worker of `geniex-host` (openspec change `add-geniex-runtime`, design D1): the one thread that
|
|
3
|
+
* calls Qualcomm's library. Bundled by `scripts/build-geniex-worker.mjs` into the script `engine.ts`
|
|
4
|
+
* starts as a `blob:` Worker; allow-listed with `ffi-bun.ts` in the runtime-agnostic gates, since the
|
|
5
|
+
* Worker globals and `bun:ffi` are Bun's.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Worker of `geniex-host` (openspec change `add-geniex-runtime`, design D1): the one thread that
|
|
3
|
+
* calls Qualcomm's library. Bundled by `scripts/build-geniex-worker.mjs` into the script `engine.ts`
|
|
4
|
+
* starts as a `blob:` Worker; allow-listed with `ffi-bun.ts` in the runtime-agnostic gates, since the
|
|
5
|
+
* Worker globals and `bun:ffi` are Bun's.
|
|
6
|
+
*/
|
|
7
|
+
import { loadBunGeniexLibrary } from './ffi-bun.js';
|
|
8
|
+
import { createGeniexWorkerHandler } from './worker-protocol.js';
|
|
9
|
+
const handle = createGeniexWorkerHandler({
|
|
10
|
+
loadLibrary: loadBunGeniexLibrary,
|
|
11
|
+
post: (answer) => self.postMessage(answer),
|
|
12
|
+
});
|
|
13
|
+
// One message at a time: `generate` blocks this thread anyway, and the library is not thread-safe.
|
|
14
|
+
let tail = Promise.resolve();
|
|
15
|
+
self.onmessage = (event) => {
|
|
16
|
+
const request = event.data;
|
|
17
|
+
tail = tail.then(() => handle(request)).catch(() => { });
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAQhE,MAAM,MAAM,GAAG,yBAAyB,CAAC;IACvC,WAAW,EAAE,oBAAoB;IACjC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;CAC3C,CAAC,CAAA;AAEF,mGAAmG;AACnG,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;AAC3C,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAA2B,CAAA;IACjD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACzD,CAAC,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The core's side of the `geniex-host` protocol (openspec change `add-geniex-runtime`, design D1):
|
|
3
|
+
* the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
|
|
4
|
+
* Qualcomm's native library never takes the core down. `probe` opens the library of one build and
|
|
5
|
+
* prints one JSON line: its version, our ABI number, the plugins and the devices it found;
|
|
6
|
+
* `inspect <path>` prints what a GGUF file or an AI Hub bundle says about itself.
|
|
7
|
+
*/
|
|
8
|
+
import type { ErrorCode, GeniexModelMetadata } from '../../contracts/index.js';
|
|
9
|
+
import type { EngineProbeFacts } from '../../engine-builds/engines.js';
|
|
10
|
+
/** How to start `geniex-host`: `[execPath, script?]` + `geniex-host`, or a test stand-in. */
|
|
11
|
+
export interface GeniexHostCommand {
|
|
12
|
+
exe: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
}
|
|
15
|
+
/** A program that speaks `geniex-host` in place of this binary: the e2e tests' stand-in. */
|
|
16
|
+
export declare const GENIEX_HOST_TEST_COMMAND_ENV = "ATOMIC_GENIEX_HOST_TEST_COMMAND";
|
|
17
|
+
export declare function geniexHostCommand(env: Record<string, string | undefined>, argv?: readonly string[], execPath?: string): GeniexHostCommand;
|
|
18
|
+
export interface GeniexHostProbeResult {
|
|
19
|
+
/** `geniex_version()`; `null` where the host cannot read it. */
|
|
20
|
+
version: string | null;
|
|
21
|
+
/** The ABI number of this host's binding. */
|
|
22
|
+
abi: number;
|
|
23
|
+
/** `geniex_get_plugin_list`: `llama_cpp`, `qairt`. */
|
|
24
|
+
plugins: string[];
|
|
25
|
+
/** `geniex_get_device_list` of the `llama_cpp` plugin: `HTP0`, `GPUOpenCL`, `CPU`, … */
|
|
26
|
+
devices: string[];
|
|
27
|
+
}
|
|
28
|
+
/** The first run of a freshly unpacked library is scanned by Defender; QAIRT loads on first use. */
|
|
29
|
+
export declare const GENIEX_HOST_PROBE_TIMEOUT_MS = 60000;
|
|
30
|
+
export interface GeniexHostRunOptions {
|
|
31
|
+
env?: NodeJS.ProcessEnv;
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run one short `geniex-host` mode and read the last JSON line it prints that `parse` accepts.
|
|
36
|
+
* Throws `code` with what the host printed when it exits non-zero, prints no answer or does not
|
|
37
|
+
* answer in time.
|
|
38
|
+
*/
|
|
39
|
+
export declare function runGeniexHostJson<T>(command: GeniexHostCommand, args: string[], parse: (raw: unknown) => T | null, failure: {
|
|
40
|
+
code: ErrorCode;
|
|
41
|
+
what: string;
|
|
42
|
+
}, options?: GeniexHostRunOptions): Promise<T>;
|
|
43
|
+
/** `geniex-host probe --lib <buildDir>`: the build's library loads in this core's host, and what it sees. */
|
|
44
|
+
export declare function runGeniexHostProbe(command: GeniexHostCommand, buildDir: string, options?: GeniexHostRunOptions): Promise<GeniexHostProbeResult>;
|
|
45
|
+
/** `geniex-host inspect <path>`: a GGUF file's or a bundle's metadata, read without a model. */
|
|
46
|
+
export declare function runGeniexHostInspect(command: GeniexHostCommand, path: string, options?: GeniexHostRunOptions): Promise<GeniexModelMetadata>;
|
|
47
|
+
/** The engine-builds probe of a GenieX build: `geniex-host probe`, its devices and version kept. */
|
|
48
|
+
export declare function geniexHostProber(command: GeniexHostCommand, env: NodeJS.ProcessEnv): (buildDir: string) => Promise<EngineProbeFacts>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The core's side of the `geniex-host` protocol (openspec change `add-geniex-runtime`, design D1):
|
|
3
|
+
* the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
|
|
4
|
+
* Qualcomm's native library never takes the core down. `probe` opens the library of one build and
|
|
5
|
+
* prints one JSON line: its version, our ABI number, the plugins and the devices it found;
|
|
6
|
+
* `inspect <path>` prints what a GGUF file or an AI Hub bundle says about itself.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
import { AtomicCoreError } from '../../contracts/index.js';
|
|
10
|
+
/** A program that speaks `geniex-host` in place of this binary: the e2e tests' stand-in. */
|
|
11
|
+
export const GENIEX_HOST_TEST_COMMAND_ENV = 'ATOMIC_GENIEX_HOST_TEST_COMMAND';
|
|
12
|
+
export function geniexHostCommand(env, argv = process.argv, execPath = process.execPath) {
|
|
13
|
+
const stand = env[GENIEX_HOST_TEST_COMMAND_ENV]?.trim();
|
|
14
|
+
if (stand)
|
|
15
|
+
return { exe: stand, args: [] };
|
|
16
|
+
const script = argv[1];
|
|
17
|
+
const viaRuntime = script !== undefined && /\.(c|m)?[jt]s$/.test(script);
|
|
18
|
+
return { exe: execPath, args: [...(viaRuntime ? [script] : []), 'geniex-host'] };
|
|
19
|
+
}
|
|
20
|
+
/** The first run of a freshly unpacked library is scanned by Defender; QAIRT loads on first use. */
|
|
21
|
+
export const GENIEX_HOST_PROBE_TIMEOUT_MS = 60_000;
|
|
22
|
+
const OUTPUT_LIMIT = 64 * 1024;
|
|
23
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
24
|
+
const strings = (value) => Array.isArray(value) && value.every((item) => typeof item === 'string') ? value : null;
|
|
25
|
+
function parseProbe(raw) {
|
|
26
|
+
if (!isRecord(raw))
|
|
27
|
+
return null;
|
|
28
|
+
const { version, abi } = raw;
|
|
29
|
+
const plugins = strings(raw['plugins']);
|
|
30
|
+
const devices = strings(raw['devices']);
|
|
31
|
+
if (typeof abi !== 'number' || !plugins || !devices)
|
|
32
|
+
return null;
|
|
33
|
+
return { version: typeof version === 'string' ? version : null, abi, plugins, devices };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Run one short `geniex-host` mode and read the last JSON line it prints that `parse` accepts.
|
|
37
|
+
* Throws `code` with what the host printed when it exits non-zero, prints no answer or does not
|
|
38
|
+
* answer in time.
|
|
39
|
+
*/
|
|
40
|
+
export function runGeniexHostJson(command, args, parse, failure, options = {}) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const child = spawn(command.exe, [...command.args, ...args], {
|
|
43
|
+
env: options.env ?? process.env,
|
|
44
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
45
|
+
windowsHide: true,
|
|
46
|
+
});
|
|
47
|
+
let stdout = '';
|
|
48
|
+
let stderr = '';
|
|
49
|
+
const keep = (buffer, chunk) => (buffer + chunk.toString('utf8')).slice(-OUTPUT_LIMIT);
|
|
50
|
+
child.stdout.on('data', (chunk) => (stdout = keep(stdout, chunk)));
|
|
51
|
+
child.stderr.on('data', (chunk) => (stderr = keep(stderr, chunk)));
|
|
52
|
+
const timeoutMs = options.timeoutMs ?? GENIEX_HOST_PROBE_TIMEOUT_MS;
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
child.kill('SIGKILL');
|
|
55
|
+
reject(new AtomicCoreError(failure.code, `${failure.what}: the GenieX host did not answer.`, `${args.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s`));
|
|
56
|
+
}, timeoutMs);
|
|
57
|
+
child.on('error', (error) => {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
reject(new AtomicCoreError(failure.code, `${failure.what}: the GenieX host could not be started.`, String(error)));
|
|
60
|
+
});
|
|
61
|
+
child.on('close', (code, signal) => {
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
const answer = stdout
|
|
64
|
+
.split(/\r?\n/)
|
|
65
|
+
.reverse()
|
|
66
|
+
.map((line) => line.trim())
|
|
67
|
+
.filter(Boolean)
|
|
68
|
+
.map((line) => {
|
|
69
|
+
try {
|
|
70
|
+
return parse(JSON.parse(line));
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
.find((parsed) => parsed !== null);
|
|
77
|
+
if (code === 0 && answer != null)
|
|
78
|
+
return resolve(answer);
|
|
79
|
+
const status = code !== null ? `exit code ${code}` : `signal ${String(signal)}`;
|
|
80
|
+
reject(new AtomicCoreError(failure.code, `${failure.what}: the GenieX host failed (${status}).`, (stderr.trim() || stdout.trim() || status).slice(-4096)));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** `geniex-host probe --lib <buildDir>`: the build's library loads in this core's host, and what it sees. */
|
|
85
|
+
export function runGeniexHostProbe(command, buildDir, options = {}) {
|
|
86
|
+
return runGeniexHostJson(command, ['probe', '--lib', buildDir], parseProbe, { code: 'ENGINE_INSTALL_FAILED', what: 'The GenieX build does not load' }, options);
|
|
87
|
+
}
|
|
88
|
+
function parseInspect(raw) {
|
|
89
|
+
if (!isRecord(raw) || (raw['kind'] !== 'gguf' && raw['kind'] !== 'qairt'))
|
|
90
|
+
return null;
|
|
91
|
+
return raw;
|
|
92
|
+
}
|
|
93
|
+
/** `geniex-host inspect <path>`: a GGUF file's or a bundle's metadata, read without a model. */
|
|
94
|
+
export function runGeniexHostInspect(command, path, options = {}) {
|
|
95
|
+
return runGeniexHostJson(command, ['inspect', path], parseInspect, { code: 'GENIEX_HOST_ERROR', what: 'The GenieX model cannot be read' }, options);
|
|
96
|
+
}
|
|
97
|
+
/** The engine-builds probe of a GenieX build: `geniex-host probe`, its devices and version kept. */
|
|
98
|
+
export function geniexHostProber(command, env) {
|
|
99
|
+
return async (buildDir) => {
|
|
100
|
+
const answer = await runGeniexHostProbe(command, buildDir, { env });
|
|
101
|
+
return { libraryVersion: answer.version, devices: answer.devices };
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=host-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-process.js","sourceRoot":"","sources":["../../../src/runtime/geniex/host-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `geniex` provider (openspec change `add-geniex-runtime`): the chip table, the core's side of
|
|
3
|
+
* the `geniex-host` protocol; the host mode, the runtime and the check follow.
|
|
4
|
+
*/
|
|
5
|
+
export * from './chip.js';
|
|
6
|
+
export * from './host-process.js';
|
|
7
|
+
export * from './model-yml.js';
|
|
8
|
+
export * from './devices.js';
|
|
9
|
+
export * from './runtime.js';
|
|
10
|
+
export * from './accelerators.js';
|
|
11
|
+
export * from './check.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `geniex` provider (openspec change `add-geniex-runtime`): the chip table, the core's side of
|
|
3
|
+
* the `geniex-host` protocol; the host mode, the runtime and the check follow.
|
|
4
|
+
*/
|
|
5
|
+
export * from './chip.js';
|
|
6
|
+
export * from './host-process.js';
|
|
7
|
+
export * from './model-yml.js';
|
|
8
|
+
export * from './devices.js';
|
|
9
|
+
export * from './runtime.js';
|
|
10
|
+
export * from './accelerators.js';
|
|
11
|
+
export * from './check.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/geniex/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `geniex` block of a GenieX model's `model.yml` (openspec change `add-geniex-runtime`, task 6.2).
|
|
3
|
+
* The core never writes it — the app and `atc` do — and reads it strictly: a plugin, device or chip
|
|
4
|
+
* this core does not know is a model it cannot run (`GENIEX_VARIANT_UNSUPPORTED`), anything else
|
|
5
|
+
* malformed is a broken file (`MODEL_LOAD_FAILED`).
|
|
6
|
+
*/
|
|
7
|
+
import type { ModelYmlGeniex } from '../../contracts/index.js';
|
|
8
|
+
export declare function readGeniexBlock(doc: Record<string, unknown>): ModelYmlGeniex;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `geniex` block of a GenieX model's `model.yml` (openspec change `add-geniex-runtime`, task 6.2).
|
|
3
|
+
* The core never writes it — the app and `atc` do — and reads it strictly: a plugin, device or chip
|
|
4
|
+
* this core does not know is a model it cannot run (`GENIEX_VARIANT_UNSUPPORTED`), anything else
|
|
5
|
+
* malformed is a broken file (`MODEL_LOAD_FAILED`).
|
|
6
|
+
*/
|
|
7
|
+
import { AtomicCoreError, GENIEX_CHIPS, GENIEX_DEVICES, GENIEX_PLUGINS } from '../../contracts/index.js';
|
|
8
|
+
const broken = (why) => new AtomicCoreError('MODEL_LOAD_FAILED', `model.yml: geniex ${why}.`);
|
|
9
|
+
const unsupported = (why) => new AtomicCoreError('GENIEX_VARIANT_UNSUPPORTED', `This core does not run GenieX models ${why}.`);
|
|
10
|
+
const text = (block, key) => {
|
|
11
|
+
const value = block[key];
|
|
12
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
13
|
+
throw broken(`has no ${key}`);
|
|
14
|
+
return value;
|
|
15
|
+
};
|
|
16
|
+
const optionalText = (block, key) => {
|
|
17
|
+
const value = block[key];
|
|
18
|
+
if (value === undefined || value === null)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
21
|
+
throw broken(`has a ${key} that is not text`);
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
const flag = (block, key) => {
|
|
25
|
+
const value = block[key];
|
|
26
|
+
if (value === undefined)
|
|
27
|
+
return false;
|
|
28
|
+
if (typeof value !== 'boolean')
|
|
29
|
+
throw broken(`has a ${key} that is not true or false`);
|
|
30
|
+
return value;
|
|
31
|
+
};
|
|
32
|
+
/** A bare file name, as the model folder holds it. */
|
|
33
|
+
const FILE_NAME_RE = /^[^/\\]+$/;
|
|
34
|
+
const fileName = (block, key, required) => {
|
|
35
|
+
const value = required ? text(block, key) : optionalText(block, key);
|
|
36
|
+
if (value === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
const name = value.split('/').at(-1) ?? '';
|
|
39
|
+
if (!FILE_NAME_RE.test(name) || name === '..' || value.split('/').includes('..'))
|
|
40
|
+
throw broken(`has a ${key} that is not a file of the repository`);
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
export function readGeniexBlock(doc) {
|
|
44
|
+
const raw = doc['geniex'];
|
|
45
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
46
|
+
throw broken('is missing');
|
|
47
|
+
const block = raw;
|
|
48
|
+
const plugin = text(block, 'plugin');
|
|
49
|
+
if (!GENIEX_PLUGINS.some((known) => known === plugin))
|
|
50
|
+
throw unsupported(`with the "${plugin}" plugin`);
|
|
51
|
+
const backend = text(block, 'backend');
|
|
52
|
+
if (!GENIEX_DEVICES.some((known) => known === backend))
|
|
53
|
+
throw unsupported(`on the "${backend}" device`);
|
|
54
|
+
const chip = optionalText(block, 'chip');
|
|
55
|
+
if (plugin === 'qairt') {
|
|
56
|
+
if (chip === undefined)
|
|
57
|
+
throw broken('names no chip for an AI Hub bundle');
|
|
58
|
+
if (!GENIEX_CHIPS.some((known) => known === chip))
|
|
59
|
+
throw unsupported(`for the "${chip}" chip`);
|
|
60
|
+
if (backend !== 'npu')
|
|
61
|
+
throw unsupported(`that run an AI Hub bundle on the "${backend}" device: bundles run on the NPU only`);
|
|
62
|
+
}
|
|
63
|
+
else if (chip !== undefined)
|
|
64
|
+
throw broken('names a chip for a GGUF model');
|
|
65
|
+
const context = block['context_length'];
|
|
66
|
+
if (typeof context !== 'number' || !Number.isSafeInteger(context) || context < 1)
|
|
67
|
+
throw broken('has a context_length that is not a positive whole number');
|
|
68
|
+
const source = block['source'];
|
|
69
|
+
if (source !== 'curated' && source !== 'huggingface')
|
|
70
|
+
throw broken('has a source that is not curated or huggingface');
|
|
71
|
+
const file = fileName(block, 'file', plugin === 'llama_cpp');
|
|
72
|
+
const mmproj = fileName(block, 'mmproj', false);
|
|
73
|
+
const repo = optionalText(block, 'repo');
|
|
74
|
+
const revision = optionalText(block, 'revision');
|
|
75
|
+
const bundleUrl = optionalText(block, 'bundle_url');
|
|
76
|
+
const precision = optionalText(block, 'precision');
|
|
77
|
+
if (bundleUrl !== undefined && !/^https:\/\/\S+$/.test(bundleUrl))
|
|
78
|
+
throw broken('has a bundle_url that is not https://');
|
|
79
|
+
return {
|
|
80
|
+
model_id: text(block, 'model_id'),
|
|
81
|
+
variant_id: text(block, 'variant_id'),
|
|
82
|
+
plugin: plugin,
|
|
83
|
+
backend: backend,
|
|
84
|
+
...(chip !== undefined ? { chip: chip } : {}),
|
|
85
|
+
...(repo !== undefined ? { repo } : {}),
|
|
86
|
+
...(revision !== undefined ? { revision } : {}),
|
|
87
|
+
...(file !== undefined ? { file } : {}),
|
|
88
|
+
...(mmproj !== undefined ? { mmproj } : {}),
|
|
89
|
+
...(bundleUrl !== undefined ? { bundle_url: bundleUrl } : {}),
|
|
90
|
+
...(precision !== undefined ? { precision } : {}),
|
|
91
|
+
context_length: context,
|
|
92
|
+
tools: flag(block, 'tools'),
|
|
93
|
+
reasoning: flag(block, 'reasoning'),
|
|
94
|
+
vision: flag(block, 'vision'),
|
|
95
|
+
source,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=model-yml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-yml.js","sourceRoot":"","sources":["../../../src/runtime/geniex/model-yml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `geniex` provider's sessions (openspec change `add-geniex-runtime`, task 6.3, design D4–D7):
|
|
3
|
+
* one `geniex-host serve` process per model — this very binary in its hidden mode — on the sidecar
|
|
4
|
+
* table Foundry Local and LiteRT-LM use, behind the session gateway the managed engines use.
|
|
5
|
+
*
|
|
6
|
+
* load = model.yml → a bundle is for this chip → the device (settings, else model.yml; a bundle on
|
|
7
|
+
* the NPU only) → the active build → the device is one the build's probe found → the model's
|
|
8
|
+
* facts (`inspect`, cached by path and mtime): a bundle for a newer GenieX? context cut to
|
|
9
|
+
* the model → [GPU claim, for gpu] → host on a random loopback port → readiness line →
|
|
10
|
+
* gateway (key + Host) → session on the gateway's port
|
|
11
|
+
*
|
|
12
|
+
* The host's server has no authentication; the gateway holds the key and lets through only
|
|
13
|
+
* `/v1/chat/completions` and `/v1/models`. The host serves the model under core's id (`--id`).
|
|
14
|
+
*/
|
|
15
|
+
import type { GeniexChip, GeniexDevice, GeniexModelMetadata, ModelYmlGeniex, SessionInfo, UnloadResult } from '../../contracts/index.js';
|
|
16
|
+
import type { DataLayout } from '../../config/index.js';
|
|
17
|
+
import type { EngineHost } from '../../engine-builds/service.js';
|
|
18
|
+
import type { ProcessJournal } from '../../lock/index.js';
|
|
19
|
+
import type { ModelRegistry } from '../../models/index.js';
|
|
20
|
+
import type { ManagedRoute } from '../managed-text/index.js';
|
|
21
|
+
import type { CtxIncreaseResult, EmitFn, GpuClaimHook, GpuOccupancy, LocalLoadOptions, LocalRuntime, RecreateResult, SessionRoutePolicy } from '../shared/index.js';
|
|
22
|
+
import { spawnAndAwaitReady } from '../shared/index.js';
|
|
23
|
+
import type { BackendOutputSink } from '../shared/index.js';
|
|
24
|
+
import type { GeniexHostCommand } from './host-process.js';
|
|
25
|
+
/** The settings' `timeout` default, in seconds: opening the file, compiling for the NPU, the server. */
|
|
26
|
+
export declare const GENIEX_DEFAULT_TIMEOUT_SECS = 600;
|
|
27
|
+
/** What a GenieX session serves (design D6); anything else is refused before it reaches the host. */
|
|
28
|
+
export declare const GENIEX_ROUTES: readonly ManagedRoute[];
|
|
29
|
+
/** The active build as the runtime needs it: its folder, GenieX version and the devices its probe found. */
|
|
30
|
+
export interface GeniexBuild {
|
|
31
|
+
dir: string;
|
|
32
|
+
version: string;
|
|
33
|
+
devices: string[];
|
|
34
|
+
}
|
|
35
|
+
/** `device` of the settings when it names one, else `model.yml`'s default. */
|
|
36
|
+
export declare function launchDevice(settingDevice: unknown, block: ModelYmlGeniex): GeniexDevice;
|
|
37
|
+
/** `ctx_len` of the settings (0: the model's own), else `model.yml`'s, cut to the model's maximum. */
|
|
38
|
+
export declare function engineContext(settingCtx: unknown, block: ModelYmlGeniex, modelMax: number | null): number;
|
|
39
|
+
export interface GeniexRuntimeOptions {
|
|
40
|
+
layout: DataLayout;
|
|
41
|
+
registry: ModelRegistry;
|
|
42
|
+
instanceId: string;
|
|
43
|
+
/** This machine's chip (`geniexHostPlatform`); the runtime exists only where there is one. */
|
|
44
|
+
chip: GeniexChip;
|
|
45
|
+
/** This binary in its `geniex-host` mode (`geniexHostCommand`). */
|
|
46
|
+
hostCommand: GeniexHostCommand;
|
|
47
|
+
/** The active build (engine-builds); `undefined` with nothing installed. */
|
|
48
|
+
resolveBuild: () => Promise<GeniexBuild | undefined>;
|
|
49
|
+
/** The same live trusted-hosts list `:1337` and the managed gateways use. */
|
|
50
|
+
trustedHosts: string[];
|
|
51
|
+
/** The `geniex` provider settings, re-read per load. */
|
|
52
|
+
readSettings: () => Promise<Record<string, unknown>>;
|
|
53
|
+
journal?: ProcessJournal | undefined;
|
|
54
|
+
emit?: EmitFn;
|
|
55
|
+
baseEnv?: NodeJS.ProcessEnv;
|
|
56
|
+
backendOutput?: BackendOutputSink;
|
|
57
|
+
log?: (level: 'debug' | 'info' | 'warn' | 'error', message: string) => void;
|
|
58
|
+
/** GPU residency (spec `gpu-residency`): a `gpu` session holds every card. */
|
|
59
|
+
claimGpu?: GpuClaimHook | undefined;
|
|
60
|
+
/** Test seams. */
|
|
61
|
+
spawn?: typeof spawnAndAwaitReady;
|
|
62
|
+
inspectModel?: (path: string) => Promise<GeniexModelMetadata>;
|
|
63
|
+
}
|
|
64
|
+
export declare class GeniexRuntime implements LocalRuntime {
|
|
65
|
+
private readonly options;
|
|
66
|
+
private readonly table;
|
|
67
|
+
private readonly emit;
|
|
68
|
+
/** Loads past their GPU claim and not yet a session. */
|
|
69
|
+
private readonly claimed;
|
|
70
|
+
/** `inspect` answers by `<path>|<mtime>`: a model that changed is read again. */
|
|
71
|
+
private readonly facts;
|
|
72
|
+
get registry(): ModelRegistry;
|
|
73
|
+
constructor(options: GeniexRuntimeOptions);
|
|
74
|
+
list(): SessionInfo[];
|
|
75
|
+
findSession(modelId: string): SessionInfo | undefined;
|
|
76
|
+
getLoadedModels(): string[];
|
|
77
|
+
isLoading(modelId: string): boolean;
|
|
78
|
+
/** A `gpu` session holds every card (the library picks one we cannot name); `npu`, `cpu` and `hybrid` none (design D7). */
|
|
79
|
+
gpuOccupancy(): GpuOccupancy[];
|
|
80
|
+
/** What the engine-builds module needs: the load queue, and the builds sessions run from (design D2). */
|
|
81
|
+
engineHost(): EngineHost;
|
|
82
|
+
routePolicy(modelId: string): SessionRoutePolicy | undefined;
|
|
83
|
+
/** The model's facts, read by this binary's host once per path and modification time. */
|
|
84
|
+
inspect(path: string): Promise<GeniexModelMetadata>;
|
|
85
|
+
load(modelId: string, opts?: LocalLoadOptions): Promise<SessionInfo>;
|
|
86
|
+
private start;
|
|
87
|
+
private startHost;
|
|
88
|
+
/** Waits for the host to exit; the gateway goes with it. */
|
|
89
|
+
unload(modelId: string): Promise<UnloadResult>;
|
|
90
|
+
/** The context is fixed when the model is created: nothing to grow. */
|
|
91
|
+
autoIncreaseCtx(modelId: string): Promise<CtxIncreaseResult>;
|
|
92
|
+
recreateSession(modelId: string): Promise<RecreateResult>;
|
|
93
|
+
shutdown(): Promise<void>;
|
|
94
|
+
}
|