@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,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The main thread's handle on the Worker that owns the library (openspec change `add-geniex-runtime`,
|
|
3
|
+
* design D1): one request at a time, each answered by the Worker's messages, tokens of a generation
|
|
4
|
+
* delivered as they arrive. The Worker is the web-standard one of the Bun runtime; the tests drive
|
|
5
|
+
* `WorkerEngine` with an in-process stand-in that runs the Worker's handler on a fake library.
|
|
6
|
+
*/
|
|
7
|
+
import { GeniexLibraryError } from './library.js';
|
|
8
|
+
/** The Worker stopped before answering: a crash of the native library takes the Worker with it. */
|
|
9
|
+
export class GeniexWorkerGone extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'GeniexWorkerGone';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class WorkerEngine {
|
|
16
|
+
worker;
|
|
17
|
+
tail = Promise.resolve();
|
|
18
|
+
pending = null;
|
|
19
|
+
onToken = null;
|
|
20
|
+
nextId = 1;
|
|
21
|
+
gone = null;
|
|
22
|
+
constructor(worker) {
|
|
23
|
+
this.worker = worker;
|
|
24
|
+
worker.onmessage = (event) => this.receive(event.data);
|
|
25
|
+
worker.onerror = (event) => {
|
|
26
|
+
this.gone = new GeniexWorkerGone(`the GenieX worker failed: ${event.message ?? 'unknown error'}`);
|
|
27
|
+
this.pending?.reject(this.gone);
|
|
28
|
+
this.pending = null;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
receive(answer) {
|
|
32
|
+
if (answer.type === 'token') {
|
|
33
|
+
this.onToken?.(answer.text);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const pending = this.pending;
|
|
37
|
+
this.pending = null;
|
|
38
|
+
pending?.resolve(answer);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* One request, answered by the next non-token message; requests queue behind each other. `before`
|
|
42
|
+
* runs when the request's turn comes, not when it is queued: a generate's token handler must not
|
|
43
|
+
* replace the one of a generation still streaming.
|
|
44
|
+
*/
|
|
45
|
+
ask(request, before) {
|
|
46
|
+
const run = this.tail.then(() => new Promise((resolve, reject) => {
|
|
47
|
+
if (this.gone)
|
|
48
|
+
return reject(this.gone);
|
|
49
|
+
before?.();
|
|
50
|
+
this.pending = { resolve, reject };
|
|
51
|
+
this.worker.postMessage(request);
|
|
52
|
+
}));
|
|
53
|
+
this.tail = run.catch(() => { });
|
|
54
|
+
return run;
|
|
55
|
+
}
|
|
56
|
+
static refused(answer, what) {
|
|
57
|
+
if (answer.type === 'failed' || answer.type === 'error')
|
|
58
|
+
throw new GeniexLibraryError(answer.type === 'failed' ? answer.stage : what, answer.message, answer.code);
|
|
59
|
+
throw new GeniexLibraryError(what, `unexpected answer ${answer.type}`);
|
|
60
|
+
}
|
|
61
|
+
async probe(libDir) {
|
|
62
|
+
const answer = await this.ask({ type: 'probe', libDir });
|
|
63
|
+
if (answer.type !== 'probed')
|
|
64
|
+
WorkerEngine.refused(answer, 'probe');
|
|
65
|
+
return { version: answer.version, abi: answer.abi, plugins: answer.plugins, devices: answer.devices };
|
|
66
|
+
}
|
|
67
|
+
async create(libDir, settings) {
|
|
68
|
+
const answer = await this.ask({ type: 'create', libDir, settings });
|
|
69
|
+
if (answer.type !== 'created')
|
|
70
|
+
WorkerEngine.refused(answer, 'create');
|
|
71
|
+
return { vision: answer.vision };
|
|
72
|
+
}
|
|
73
|
+
async applyChatTemplate(input) {
|
|
74
|
+
const answer = await this.ask({ type: 'template', id: this.nextId++, input });
|
|
75
|
+
if (answer.type !== 'templated')
|
|
76
|
+
WorkerEngine.refused(answer, 'apply_chat_template');
|
|
77
|
+
return answer.prompt;
|
|
78
|
+
}
|
|
79
|
+
async generate(prompt, config, onToken, cancel) {
|
|
80
|
+
const buffer = cancel.buffer;
|
|
81
|
+
if (!(buffer instanceof SharedArrayBuffer))
|
|
82
|
+
throw new GeniexLibraryError('generate', 'the cancel flag must live in a SharedArrayBuffer');
|
|
83
|
+
try {
|
|
84
|
+
const answer = await this.ask({ type: 'generate', id: this.nextId++, prompt, config, cancel: buffer }, () => {
|
|
85
|
+
this.onToken = onToken;
|
|
86
|
+
});
|
|
87
|
+
if (answer.type !== 'done')
|
|
88
|
+
WorkerEngine.refused(answer, 'generate');
|
|
89
|
+
return answer.result;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
if (this.onToken === onToken)
|
|
93
|
+
this.onToken = null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async destroy() {
|
|
97
|
+
try {
|
|
98
|
+
if (!this.gone)
|
|
99
|
+
await this.ask({ type: 'destroy' });
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.worker.terminate();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The Worker of the compiled binaries, started from a `blob:` URL over the script that
|
|
108
|
+
* `scripts/build-geniex-worker.mjs` bundles out of `worker.ts` into `worker-source.generated.ts`.
|
|
109
|
+
* Not from a path: inside a compiled Windows binary the Bun that CI pins (1.3.10) reads a Worker's
|
|
110
|
+
* `B:\~BUN\root\worker.js` from the real disk (ENOENT; oven-sh/bun#16869, #29124, fixed in 1.4.1),
|
|
111
|
+
* and a bare `./worker.js` is resolved against the working directory. The generated module is imported
|
|
112
|
+
* here and only here, so a checkout without a build still loads this file; under Node there is no
|
|
113
|
+
* `Worker` global, and no host either.
|
|
114
|
+
*/
|
|
115
|
+
export async function spawnGeniexWorker() {
|
|
116
|
+
const ctor = globalThis.Worker;
|
|
117
|
+
if (!ctor)
|
|
118
|
+
throw new GeniexLibraryError('load', 'geniex-host runs only inside a compiled binary (no Worker)');
|
|
119
|
+
const { GENIEX_WORKER_SOURCE } = await import(/* @vite-ignore */ './worker-source.generated.js');
|
|
120
|
+
return new ctor(URL.createObjectURL(new Blob([GENIEX_WORKER_SOURCE], { type: 'application/javascript' })));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GeniexLibrary` over `bun:ffi` — the third file in `src/` that may import `bun:*` (change
|
|
3
|
+
* `add-geniex-runtime`, design D1; allow-listed in both runtime-agnostic gates with `worker.ts`). It
|
|
4
|
+
* is imported by the Worker alone, so the npm package still loads under Node.
|
|
5
|
+
*
|
|
6
|
+
* The binding follows `sdk/include/geniex.h` of GenieX v0.9.3 (ABI 1 of conf's manifest). Structs
|
|
7
|
+
* are laid out by hand for a 64-bit little-endian target with natural alignment (Windows arm64 is
|
|
8
|
+
* the only one); each layout names its offsets next to the C declaration it mirrors. The token
|
|
9
|
+
* callback is a plain `JSCallback`: the library calls it synchronously on this very thread, from
|
|
10
|
+
* inside `geniex_llm_generate`, which is why the whole binding lives in the Worker (design D1).
|
|
11
|
+
*
|
|
12
|
+
* Unverified against the real library until the spike on a Snapdragon X laptop (rulings/core.md).
|
|
13
|
+
*/
|
|
14
|
+
import type { LoadGeniexLibrary } from './library.js';
|
|
15
|
+
export declare const loadBunGeniexLibrary: LoadGeniexLibrary;
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GeniexLibrary` over `bun:ffi` — the third file in `src/` that may import `bun:*` (change
|
|
3
|
+
* `add-geniex-runtime`, design D1; allow-listed in both runtime-agnostic gates with `worker.ts`). It
|
|
4
|
+
* is imported by the Worker alone, so the npm package still loads under Node.
|
|
5
|
+
*
|
|
6
|
+
* The binding follows `sdk/include/geniex.h` of GenieX v0.9.3 (ABI 1 of conf's manifest). Structs
|
|
7
|
+
* are laid out by hand for a 64-bit little-endian target with natural alignment (Windows arm64 is
|
|
8
|
+
* the only one); each layout names its offsets next to the C declaration it mirrors. The token
|
|
9
|
+
* callback is a plain `JSCallback`: the library calls it synchronously on this very thread, from
|
|
10
|
+
* inside `geniex_llm_generate`, which is why the whole binding lives in the Worker (design D1).
|
|
11
|
+
*
|
|
12
|
+
* Unverified against the real library until the spike on a Snapdragon X laptop (rulings/core.md).
|
|
13
|
+
*/
|
|
14
|
+
import { dlopen, FFIType, JSCallback, ptr, read, CString } from 'bun:ffi';
|
|
15
|
+
import { existsSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { BOUND_GENIEX_ABI, GENIEX_CANCELLED, GENIEX_POWER_MODES, GeniexLibraryError } from './library.js';
|
|
18
|
+
const T = FFIType;
|
|
19
|
+
const LIBRARY_FILE = 'geniex.dll';
|
|
20
|
+
/** The QAIRT runtime inside a build; told to the library so the `qairt` plugin finds it. */
|
|
21
|
+
const QAIRT_DIR = 'qairt';
|
|
22
|
+
const LOG_LEVEL_ERROR = 4;
|
|
23
|
+
const STOP_REASONS = ['eos', 'length', 'user', 'stop_sequence', 'context_length'];
|
|
24
|
+
const SYMBOLS = {
|
|
25
|
+
geniex_get_error_message: { args: [T.i32], returns: T.cstring },
|
|
26
|
+
geniex_init: { args: [], returns: T.i32 },
|
|
27
|
+
geniex_deinit: { args: [], returns: T.i32 },
|
|
28
|
+
geniex_set_log_level: { args: [T.i32], returns: T.i32 },
|
|
29
|
+
geniex_set_qairt_runtime_path: { args: [T.ptr], returns: T.i32 },
|
|
30
|
+
geniex_free: { args: [T.ptr], returns: T.void },
|
|
31
|
+
geniex_version: { args: [], returns: T.cstring },
|
|
32
|
+
geniex_get_plugin_list: { args: [T.ptr], returns: T.i32 },
|
|
33
|
+
geniex_get_device_list: { args: [T.ptr, T.ptr], returns: T.i32 },
|
|
34
|
+
geniex_resolve_device: { args: [T.ptr, T.ptr], returns: T.i32 },
|
|
35
|
+
geniex_llm_create: { args: [T.ptr, T.ptr], returns: T.i32 },
|
|
36
|
+
geniex_llm_destroy: { args: [T.ptr], returns: T.i32 },
|
|
37
|
+
geniex_llm_apply_chat_template: { args: [T.ptr, T.ptr, T.ptr], returns: T.i32 },
|
|
38
|
+
geniex_llm_generate: { args: [T.ptr, T.ptr, T.ptr], returns: T.i32 },
|
|
39
|
+
geniex_vlm_create: { args: [T.ptr, T.ptr], returns: T.i32 },
|
|
40
|
+
geniex_vlm_destroy: { args: [T.ptr], returns: T.i32 },
|
|
41
|
+
geniex_vlm_apply_chat_template: { args: [T.ptr, T.ptr, T.ptr], returns: T.i32 },
|
|
42
|
+
geniex_vlm_generate: { args: [T.ptr, T.ptr, T.ptr], returns: T.i32 },
|
|
43
|
+
geniex_vlm_reset: { args: [T.ptr], returns: T.i32 },
|
|
44
|
+
};
|
|
45
|
+
const cstr = (value) => Buffer.from(`${value}\0`, 'utf8');
|
|
46
|
+
const wide = (value) => Buffer.from(`${value}\0`, 'utf16le');
|
|
47
|
+
const text = (value) => {
|
|
48
|
+
const s = value == null ? '' : String(value);
|
|
49
|
+
return s === '' ? null : s;
|
|
50
|
+
};
|
|
51
|
+
/** Keeps every buffer a struct points at alive for the length of one library call. */
|
|
52
|
+
class Arena {
|
|
53
|
+
kept = [];
|
|
54
|
+
str(value) {
|
|
55
|
+
if (value === null)
|
|
56
|
+
return null;
|
|
57
|
+
const buffer = cstr(value);
|
|
58
|
+
this.kept.push(buffer);
|
|
59
|
+
return ptr(buffer);
|
|
60
|
+
}
|
|
61
|
+
/** A NUL-terminated array of C strings; `null` for an empty list. */
|
|
62
|
+
strings(values) {
|
|
63
|
+
if (values.length === 0)
|
|
64
|
+
return null;
|
|
65
|
+
const table = Buffer.alloc(8 * values.length);
|
|
66
|
+
values.forEach((value, index) => table.writeBigUInt64LE(BigInt(this.str(value) ?? 0), index * 8));
|
|
67
|
+
this.kept.push(table);
|
|
68
|
+
return ptr(table);
|
|
69
|
+
}
|
|
70
|
+
struct(size) {
|
|
71
|
+
const buffer = Buffer.alloc(size);
|
|
72
|
+
this.kept.push(buffer);
|
|
73
|
+
return buffer;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const writePtr = (buffer, offset, value) => buffer.writeBigUInt64LE(BigInt(value ?? 0), offset);
|
|
77
|
+
const readPtr = (buffer, offset) => {
|
|
78
|
+
const value = buffer.readBigUInt64LE(offset);
|
|
79
|
+
return value === 0n ? null : Number(value);
|
|
80
|
+
};
|
|
81
|
+
/** Windows searches the library's own folder for its DLLs only when told to. */
|
|
82
|
+
function prepareWindowsSearch(libDir) {
|
|
83
|
+
const k32 = dlopen('kernel32.dll', { SetDllDirectoryW: { args: [T.ptr], returns: T.i32 } }).symbols;
|
|
84
|
+
k32.SetDllDirectoryW(ptr(wide(libDir)));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Windows: out of EcoQoS, as `litert-lm/host/ffi-bun.ts` does. A process with no window counts as
|
|
88
|
+
* background work and runs on efficiency cores at low clocks; a failure only costs speed.
|
|
89
|
+
*/
|
|
90
|
+
function leaveEcoQos() {
|
|
91
|
+
const k32 = dlopen('kernel32.dll', {
|
|
92
|
+
SetProcessInformation: { args: [T.i64, T.i32, T.ptr, T.u32], returns: T.i32 },
|
|
93
|
+
}).symbols;
|
|
94
|
+
const PROCESS_POWER_THROTTLING = 4;
|
|
95
|
+
const state = new Uint32Array([1, 1, 0]);
|
|
96
|
+
k32.SetProcessInformation(-1n, PROCESS_POWER_THROTTLING, ptr(state), state.byteLength);
|
|
97
|
+
}
|
|
98
|
+
export const loadBunGeniexLibrary = async (libDir) => {
|
|
99
|
+
const path = join(libDir, LIBRARY_FILE);
|
|
100
|
+
if (!existsSync(path))
|
|
101
|
+
throw new GeniexLibraryError('load', `${path} not found: no ${LIBRARY_FILE} in this build`);
|
|
102
|
+
if (process.platform === 'win32') {
|
|
103
|
+
prepareWindowsSearch(libDir);
|
|
104
|
+
leaveEcoQos();
|
|
105
|
+
}
|
|
106
|
+
let L;
|
|
107
|
+
try {
|
|
108
|
+
L = dlopen(path, SYMBOLS).symbols;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new GeniexLibraryError('load', error instanceof Error ? error.message : String(error));
|
|
112
|
+
}
|
|
113
|
+
const check = (operation, code) => {
|
|
114
|
+
const value = Number(code);
|
|
115
|
+
if (value === 0)
|
|
116
|
+
return;
|
|
117
|
+
throw new GeniexLibraryError(operation, text(L.geniex_get_error_message(value)) ?? `error ${value}`, value);
|
|
118
|
+
};
|
|
119
|
+
// The QAIRT runtime the plugin needs (QnnHtp.dll, QnnSystem.dll, the HTP stubs and skels) ships in
|
|
120
|
+
// the SDK under `lib/qairt/htp-files` (spike S4); pinning it there keeps a `GENIEX_QAIRT_LIB` in the
|
|
121
|
+
// user's environment from swapping it. `lib/qairt` itself holds only the plugin's DLLs.
|
|
122
|
+
const qairt = join(libDir, QAIRT_DIR, 'htp-files');
|
|
123
|
+
if (existsSync(join(qairt, 'QnnHtp.dll'))) {
|
|
124
|
+
const keep = cstr(qairt);
|
|
125
|
+
check('set_qairt_runtime_path', L.geniex_set_qairt_runtime_path(ptr(keep)));
|
|
126
|
+
}
|
|
127
|
+
// Before `geniex_init`, as the header says: the default is TRACE, and the plugin scan at init logs
|
|
128
|
+
// at that level to stderr (spike S1). The level also sets QNN's in the qairt plugin.
|
|
129
|
+
L.geniex_set_log_level(LOG_LEVEL_ERROR);
|
|
130
|
+
check('init', L.geniex_init());
|
|
131
|
+
return bindLibrary(L, check);
|
|
132
|
+
};
|
|
133
|
+
/** A `const char**` of `count` strings the library allocated; freed after reading. */
|
|
134
|
+
function takeStrings(L, table, count) {
|
|
135
|
+
if (!table || count <= 0)
|
|
136
|
+
return [];
|
|
137
|
+
const out = [];
|
|
138
|
+
for (let i = 0; i < count; i++) {
|
|
139
|
+
const at = read.ptr(table, i * 8);
|
|
140
|
+
out.push(at ? new CString(at).toString() : '');
|
|
141
|
+
}
|
|
142
|
+
L.geniex_free(table);
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function bindLibrary(L, check) {
|
|
146
|
+
// The library says `v0.9.3` (spike S1, 2026-10-28): the `v` is not part of the version.
|
|
147
|
+
const version = /^\d+\.\d+\.\d+/.exec((text(L.geniex_version()) ?? '').replace(/^v/i, ''))?.[0] ?? null;
|
|
148
|
+
function plugins() {
|
|
149
|
+
// geniex_GetPluginListOutput { const char** plugin_ids @0; int32 plugin_count @8 } = 16
|
|
150
|
+
const out = Buffer.alloc(16);
|
|
151
|
+
check('get_plugin_list', L.geniex_get_plugin_list(ptr(out)));
|
|
152
|
+
return takeStrings(L, readPtr(out, 0), out.readInt32LE(8));
|
|
153
|
+
}
|
|
154
|
+
function devices(plugin) {
|
|
155
|
+
const arena = new Arena();
|
|
156
|
+
// geniex_GetDeviceListInput { const char* plugin_id @0 } = 8
|
|
157
|
+
const input = arena.struct(8);
|
|
158
|
+
writePtr(input, 0, arena.str(plugin));
|
|
159
|
+
// geniex_GetDeviceListOutput { const char** device_ids @0; const char** device_names @8; int32 device_count @16 } = 24
|
|
160
|
+
const out = arena.struct(24);
|
|
161
|
+
check('get_device_list', L.geniex_get_device_list(ptr(input), ptr(out)));
|
|
162
|
+
const count = out.readInt32LE(16);
|
|
163
|
+
const ids = takeStrings(L, readPtr(out, 0), count);
|
|
164
|
+
takeStrings(L, readPtr(out, 8), count);
|
|
165
|
+
return ids;
|
|
166
|
+
}
|
|
167
|
+
function resolveDevice(plugin, mode) {
|
|
168
|
+
const arena = new Arena();
|
|
169
|
+
// geniex_ResolveDeviceInput { plugin_id @0; model_name @8; mode @16; int32 ngl_default @24 } = 32
|
|
170
|
+
const input = arena.struct(32);
|
|
171
|
+
writePtr(input, 0, arena.str(plugin));
|
|
172
|
+
writePtr(input, 8, null);
|
|
173
|
+
writePtr(input, 16, arena.str(mode));
|
|
174
|
+
input.writeInt32LE(999, 24);
|
|
175
|
+
// geniex_ResolveDeviceOutput { char* device_id @0; int32 ngl @8; char* warning @16 } = 24
|
|
176
|
+
const out = arena.struct(24);
|
|
177
|
+
check('resolve_device', L.geniex_resolve_device(ptr(input), ptr(out)));
|
|
178
|
+
const idPtr = readPtr(out, 0);
|
|
179
|
+
const warningPtr = readPtr(out, 16);
|
|
180
|
+
const deviceId = idPtr ? new CString(idPtr).toString() : null;
|
|
181
|
+
if (idPtr)
|
|
182
|
+
L.geniex_free(idPtr);
|
|
183
|
+
if (warningPtr)
|
|
184
|
+
L.geniex_free(warningPtr);
|
|
185
|
+
return { deviceId, ngl: out.readInt32LE(8) };
|
|
186
|
+
}
|
|
187
|
+
/** geniex_ModelConfig, 80 bytes, written into `buffer` at `at`. */
|
|
188
|
+
function writeModelConfig(buffer, at, arena, settings, ngl) {
|
|
189
|
+
// The qairt plugin refuses any n_ctx (S4: `--nctx (n_ctx) is not supported by the qairt plugin`);
|
|
190
|
+
// the bundle fixes its context, and 0 means "from the model".
|
|
191
|
+
buffer.writeInt32LE(settings.plugin === 'qairt' ? 0 : settings.nCtx, at + 0); // n_ctx
|
|
192
|
+
buffer.writeInt32LE(settings.threads, at + 4); // n_threads
|
|
193
|
+
buffer.writeInt32LE(settings.threads, at + 8); // n_threads_batch
|
|
194
|
+
buffer.writeInt32LE(0, at + 12); // n_batch
|
|
195
|
+
buffer.writeInt32LE(0, at + 16); // n_ubatch
|
|
196
|
+
buffer.writeInt32LE(0, at + 20); // n_seq_max
|
|
197
|
+
buffer.writeInt32LE(ngl, at + 24); // n_gpu_layers, as resolve_device said
|
|
198
|
+
writePtr(buffer, at + 32, null); // chat_template_path
|
|
199
|
+
writePtr(buffer, at + 40, null); // chat_template_content
|
|
200
|
+
writePtr(buffer, at + 48, arena.str('')); // spec_type: disabled
|
|
201
|
+
writePtr(buffer, at + 56, arena.str('')); // spec_draft_model
|
|
202
|
+
buffer.writeInt32LE(0, at + 64); // spec_n_max
|
|
203
|
+
buffer.writeInt32LE(0, at + 68); // spec_n_min
|
|
204
|
+
buffer.writeFloatLE(0, at + 72); // spec_p_min
|
|
205
|
+
buffer.writeInt32LE(GENIEX_POWER_MODES.indexOf(settings.powerMode), at + 76); // power_mode
|
|
206
|
+
}
|
|
207
|
+
function createModel(settings) {
|
|
208
|
+
const { deviceId, ngl } = resolveDevice(settings.plugin, settings.device);
|
|
209
|
+
const vision = settings.mmproj !== null;
|
|
210
|
+
// The qairt plugin resolves a bundle from the folder of the FILE it is given (spike S4: handed the
|
|
211
|
+
// folder, it looked for tokenizer.json in the parent); `genie_config.json` is the file every bundle has.
|
|
212
|
+
const modelPath = settings.plugin === 'qairt' ? join(settings.model, 'genie_config.json') : settings.model;
|
|
213
|
+
const arena = new Arena();
|
|
214
|
+
const handleOut = arena.struct(8);
|
|
215
|
+
if (vision) {
|
|
216
|
+
// geniex_VlmCreateInput { model_path @0; mmproj_path @8; config @16 (80); plugin_id @96; device_id @104; vit_device_id @112; tokenizer_path @120 } = 128
|
|
217
|
+
const input = arena.struct(128);
|
|
218
|
+
writePtr(input, 0, arena.str(modelPath));
|
|
219
|
+
writePtr(input, 8, arena.str(settings.mmproj));
|
|
220
|
+
writeModelConfig(input, 16, arena, settings, ngl);
|
|
221
|
+
writePtr(input, 96, arena.str(settings.plugin));
|
|
222
|
+
writePtr(input, 104, arena.str(deviceId));
|
|
223
|
+
writePtr(input, 112, null);
|
|
224
|
+
writePtr(input, 120, null);
|
|
225
|
+
check('vlm_create', L.geniex_vlm_create(ptr(input), ptr(handleOut)));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// geniex_LlmCreateInput { model_path @0; tokenizer_path @8; config @16 (80); plugin_id @96; device_id @104 } = 112
|
|
229
|
+
const input = arena.struct(112);
|
|
230
|
+
writePtr(input, 0, arena.str(modelPath));
|
|
231
|
+
writePtr(input, 8, null);
|
|
232
|
+
writeModelConfig(input, 16, arena, settings, ngl);
|
|
233
|
+
writePtr(input, 96, arena.str(settings.plugin));
|
|
234
|
+
writePtr(input, 104, arena.str(deviceId));
|
|
235
|
+
check('llm_create', L.geniex_llm_create(ptr(input), ptr(handleOut)));
|
|
236
|
+
}
|
|
237
|
+
const handle = readPtr(handleOut, 0);
|
|
238
|
+
if (!handle)
|
|
239
|
+
throw new GeniexLibraryError(vision ? 'vlm_create' : 'llm_create', 'the library returned no handle');
|
|
240
|
+
return bindModel(L, check, handle, vision);
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
version,
|
|
244
|
+
abi: BOUND_GENIEX_ABI,
|
|
245
|
+
plugins,
|
|
246
|
+
devices,
|
|
247
|
+
createModel,
|
|
248
|
+
close: () => {
|
|
249
|
+
L.geniex_deinit();
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** geniex_ToolCall[] { id @0; name @8; arguments @16 } = 24 each. */
|
|
254
|
+
function writeToolCalls(arena, calls) {
|
|
255
|
+
if (calls.length === 0)
|
|
256
|
+
return null;
|
|
257
|
+
const table = arena.struct(24 * calls.length);
|
|
258
|
+
calls.forEach((call, index) => {
|
|
259
|
+
writePtr(table, index * 24, arena.str(call.id));
|
|
260
|
+
writePtr(table, index * 24 + 8, arena.str(call.name));
|
|
261
|
+
writePtr(table, index * 24 + 16, arena.str(call.arguments));
|
|
262
|
+
});
|
|
263
|
+
return ptr(table);
|
|
264
|
+
}
|
|
265
|
+
function bindModel(L, check, handle, vision) {
|
|
266
|
+
function applyChatTemplate(input) {
|
|
267
|
+
const arena = new Arena();
|
|
268
|
+
const count = input.messages.length;
|
|
269
|
+
let messages;
|
|
270
|
+
if (vision) {
|
|
271
|
+
// geniex_VlmChatMessage { role @0; contents @8; int64 content_count @16; tool_calls @24; int32 tool_call_count @32; tool_call_id @40; tool_name @48 } = 56
|
|
272
|
+
messages = arena.struct(56 * count);
|
|
273
|
+
input.messages.forEach((message, index) => {
|
|
274
|
+
const at = index * 56;
|
|
275
|
+
// geniex_VlmContent[] { type @0; text @8 } = 16 each
|
|
276
|
+
const contents = arena.struct(16 * Math.max(1, message.content.length));
|
|
277
|
+
message.content.forEach((part, j) => {
|
|
278
|
+
writePtr(contents, j * 16, arena.str(part.type));
|
|
279
|
+
writePtr(contents, j * 16 + 8, arena.str(part.type === 'text' ? part.text : part.path));
|
|
280
|
+
});
|
|
281
|
+
writePtr(messages, at, arena.str(message.role));
|
|
282
|
+
writePtr(messages, at + 8, message.content.length > 0 ? ptr(contents) : null);
|
|
283
|
+
messages.writeBigInt64LE(BigInt(message.content.length), at + 16);
|
|
284
|
+
writePtr(messages, at + 24, writeToolCalls(arena, message.tool_calls ?? []));
|
|
285
|
+
messages.writeInt32LE(message.tool_calls?.length ?? 0, at + 32);
|
|
286
|
+
writePtr(messages, at + 40, arena.str(message.tool_call_id ?? null));
|
|
287
|
+
writePtr(messages, at + 48, arena.str(message.tool_name ?? null));
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// geniex_LlmChatMessage { role @0; content @8; tool_calls @16; int32 tool_call_count @24; tool_call_id @32; tool_name @40 } = 48
|
|
292
|
+
messages = arena.struct(48 * count);
|
|
293
|
+
input.messages.forEach((message, index) => {
|
|
294
|
+
const at = index * 48;
|
|
295
|
+
const content = message.content.map((part) => (part.type === 'text' ? part.text : '')).join('');
|
|
296
|
+
writePtr(messages, at, arena.str(message.role));
|
|
297
|
+
writePtr(messages, at + 8, arena.str(content));
|
|
298
|
+
writePtr(messages, at + 16, writeToolCalls(arena, message.tool_calls ?? []));
|
|
299
|
+
messages.writeInt32LE(message.tool_calls?.length ?? 0, at + 24);
|
|
300
|
+
writePtr(messages, at + 32, arena.str(message.tool_call_id ?? null));
|
|
301
|
+
writePtr(messages, at + 40, arena.str(message.tool_name ?? null));
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
// Llm: { messages @0; int32 message_count @8; tools @16; bool enable_thinking @24; bool add_generation_prompt @25 } = 32
|
|
305
|
+
// Vlm: { messages @0; int32 message_count @8; tools @16; bool enable_thinking @24; bool grounding @25 } = 32
|
|
306
|
+
const request = arena.struct(32);
|
|
307
|
+
writePtr(request, 0, count > 0 ? ptr(messages) : null);
|
|
308
|
+
request.writeInt32LE(count, 8);
|
|
309
|
+
writePtr(request, 16, arena.str(input.tools));
|
|
310
|
+
request.writeUInt8(input.enableThinking ? 1 : 0, 24);
|
|
311
|
+
request.writeUInt8(vision ? 0 : 1, 25);
|
|
312
|
+
// Output { char* formatted_text @0 } = 8
|
|
313
|
+
const out = arena.struct(8);
|
|
314
|
+
check(vision ? 'vlm_apply_chat_template' : 'llm_apply_chat_template', vision
|
|
315
|
+
? L.geniex_vlm_apply_chat_template(handle, ptr(request), ptr(out))
|
|
316
|
+
: L.geniex_llm_apply_chat_template(handle, ptr(request), ptr(out)));
|
|
317
|
+
const formatted = readPtr(out, 0);
|
|
318
|
+
if (!formatted)
|
|
319
|
+
return '';
|
|
320
|
+
const prompt = new CString(formatted).toString();
|
|
321
|
+
L.geniex_free(formatted);
|
|
322
|
+
return prompt;
|
|
323
|
+
}
|
|
324
|
+
function generate(prompt, config, onToken) {
|
|
325
|
+
const arena = new Arena();
|
|
326
|
+
// geniex_SamplerConfig { f32 temperature @0; f32 top_p @4; i32 top_k @8; f32 min_p @12; f32 repetition_penalty @16;
|
|
327
|
+
// f32 presence_penalty @20; f32 frequency_penalty @24; i32 seed @28; grammar_path @32; grammar_string @40; bool ignore_eos @48 } = 56
|
|
328
|
+
const sampler = arena.struct(56);
|
|
329
|
+
const s = config.sampler;
|
|
330
|
+
sampler.writeFloatLE(s.temperature ?? 0.8, 0);
|
|
331
|
+
sampler.writeFloatLE(s.topP ?? 0.95, 4);
|
|
332
|
+
sampler.writeInt32LE(s.topK ?? 40, 8);
|
|
333
|
+
sampler.writeFloatLE(0.05, 12);
|
|
334
|
+
sampler.writeFloatLE(1.0, 16);
|
|
335
|
+
sampler.writeFloatLE(0, 20);
|
|
336
|
+
sampler.writeFloatLE(0, 24);
|
|
337
|
+
sampler.writeInt32LE(s.seed ?? -1, 28);
|
|
338
|
+
writePtr(sampler, 32, null);
|
|
339
|
+
writePtr(sampler, 40, arena.str(s.grammar));
|
|
340
|
+
sampler.writeUInt8(0, 48);
|
|
341
|
+
// geniex_GenerationConfig { i32 max_tokens @0; stop @8; i32 stop_count @16; sampler_config @24; image_paths @32;
|
|
342
|
+
// i32 image_count @40; audio_paths @48; i32 audio_count @56; bool sliding_window @60; i32 sliding_window_n_keep @64 } = 72
|
|
343
|
+
const generation = arena.struct(72);
|
|
344
|
+
generation.writeInt32LE(config.maxTokens, 0);
|
|
345
|
+
writePtr(generation, 8, arena.strings(config.stop));
|
|
346
|
+
generation.writeInt32LE(config.stop.length, 16);
|
|
347
|
+
writePtr(generation, 24, ptr(sampler));
|
|
348
|
+
writePtr(generation, 32, arena.strings(config.imagePaths));
|
|
349
|
+
generation.writeInt32LE(config.imagePaths.length, 40);
|
|
350
|
+
writePtr(generation, 48, null);
|
|
351
|
+
generation.writeInt32LE(0, 56);
|
|
352
|
+
generation.writeUInt8(0, 60);
|
|
353
|
+
generation.writeInt32LE(0, 64);
|
|
354
|
+
let callbackError = null;
|
|
355
|
+
const callback = new JSCallback((tokenPtr) => {
|
|
356
|
+
try {
|
|
357
|
+
return onToken(tokenPtr ? new CString(tokenPtr).toString() : '');
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
callbackError = error;
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
}, { args: [T.ptr, T.ptr], returns: T.bool });
|
|
364
|
+
try {
|
|
365
|
+
// Llm: { prompt_utf8 @0; config @8; on_token @16; user_data @24; input_ids @32; i32 input_ids_count @40; input_embd @48; i32 count @56; i32 dim @60 } = 64
|
|
366
|
+
// Vlm: { prompt_utf8 @0; config @8; on_token @16; user_data @24 } = 32 (the Llm layout is a superset, zero beyond)
|
|
367
|
+
const input = arena.struct(64);
|
|
368
|
+
writePtr(input, 0, arena.str(prompt));
|
|
369
|
+
writePtr(input, 8, ptr(generation));
|
|
370
|
+
writePtr(input, 16, callback.ptr);
|
|
371
|
+
writePtr(input, 24, null);
|
|
372
|
+
// Output { char* full_text @0; geniex_ProfileData @8: i64 ttft @8, media_time @16, prompt_time @24, decode_time @32,
|
|
373
|
+
// prompt_tokens @40, generated_tokens @48, f64 prefill_speed @56, decoding_speed @64, i64 draft_n_total @72, draft_n_accepted @80, stop_reason @88 } = 96
|
|
374
|
+
const out = arena.struct(96);
|
|
375
|
+
// The llama_cpp VLM keeps the last generation's prefix and refuses a prompt that diverges from it
|
|
376
|
+
// (S2 on Gemma 4: `VLM prefix reuse failed: prompt[12:18] does not match last generation`);
|
|
377
|
+
// every request here is a full prompt, so the state is cleared first.
|
|
378
|
+
if (vision)
|
|
379
|
+
check('vlm_reset', L.geniex_vlm_reset(handle));
|
|
380
|
+
const code = Number(vision
|
|
381
|
+
? L.geniex_vlm_generate(handle, ptr(input), ptr(out))
|
|
382
|
+
: L.geniex_llm_generate(handle, ptr(input), ptr(out)));
|
|
383
|
+
if (callbackError)
|
|
384
|
+
throw callbackError;
|
|
385
|
+
if (code === GENIEX_CANCELLED)
|
|
386
|
+
throw new GeniexLibraryError(vision ? 'vlm_generate' : 'llm_generate', 'Operation cancelled by caller', code);
|
|
387
|
+
check(vision ? 'vlm_generate' : 'llm_generate', code);
|
|
388
|
+
const fullText = readPtr(out, 0);
|
|
389
|
+
if (fullText)
|
|
390
|
+
L.geniex_free(fullText);
|
|
391
|
+
const stopPtr = readPtr(out, 88);
|
|
392
|
+
const stop = stopPtr ? new CString(stopPtr).toString() : '';
|
|
393
|
+
return {
|
|
394
|
+
stopReason: STOP_REASONS.find((reason) => reason === stop) ?? 'unknown',
|
|
395
|
+
promptTokens: Number(out.readBigInt64LE(40)),
|
|
396
|
+
generatedTokens: Number(out.readBigInt64LE(48)),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
finally {
|
|
400
|
+
callback.close();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
vision,
|
|
405
|
+
applyChatTemplate,
|
|
406
|
+
generate,
|
|
407
|
+
destroy: () => {
|
|
408
|
+
if (vision)
|
|
409
|
+
L.geniex_vlm_destroy(handle);
|
|
410
|
+
else
|
|
411
|
+
L.geniex_llm_destroy(handle);
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=ffi-bun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffi-bun.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/ffi-bun.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A JSON schema as a llama.cpp GBNF grammar (openspec change `add-geniex-runtime`, design D6): GenieX's
|
|
3
|
+
* sampler takes `grammar_string`, and its C API offers no converter, so `response_format` is turned
|
|
4
|
+
* into one here — a TypeScript rendering of llama.cpp's `json_schema_to_grammar` (MIT), kept to what
|
|
5
|
+
* OpenAI structured outputs use: objects with required and optional properties, arrays with bounds,
|
|
6
|
+
* strings with enums, lengths and the date/time/uuid formats, numbers, integers, booleans, null,
|
|
7
|
+
* `anyOf`/`oneOf`, `const`, `enum`, local `$ref`s. A schema it cannot express falls back to a looser
|
|
8
|
+
* rule rather than failing the request (`unknown` → any JSON value; a `pattern` → any string).
|
|
9
|
+
*/
|
|
10
|
+
/** The GBNF for a JSON schema; `root` is the schema itself. */
|
|
11
|
+
export declare function jsonSchemaToGrammar(schema: unknown): string;
|