@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,223 @@
|
|
|
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
|
+
const PRIMITIVE_RULES = {
|
|
11
|
+
'boolean': '("true" | "false") space',
|
|
12
|
+
'decimal-part': '[0-9]{1,16}',
|
|
13
|
+
'integral-part': '[0] | [1-9] [0-9]{0,15}',
|
|
14
|
+
'number': '("-"? integral-part) ("." decimal-part)? ([eE] [-+]? integral-part)? space',
|
|
15
|
+
'integer': '("-"? integral-part) space',
|
|
16
|
+
'value': 'object | array | string | number | boolean | null',
|
|
17
|
+
'object': '"{" space ( string ":" space value ("," space string ":" space value)* )? "}" space',
|
|
18
|
+
'array': '"[" space ( value ("," space value)* )? "]" space',
|
|
19
|
+
'uuid': '"\\"" [0-9a-fA-F]{8} "-" [0-9a-fA-F]{4} "-" [0-9a-fA-F]{4} "-" [0-9a-fA-F]{4} "-" [0-9a-fA-F]{12} "\\"" space',
|
|
20
|
+
'char': '[^"\\\\\\x7F\\x00-\\x1F] | [\\\\] (["\\\\bfnrt] | "u" [0-9a-fA-F]{4})',
|
|
21
|
+
'string': '"\\"" char* "\\"" space',
|
|
22
|
+
'null': '"null" space',
|
|
23
|
+
};
|
|
24
|
+
/** Which primitive rules another one needs. */
|
|
25
|
+
const PRIMITIVE_DEPS = {
|
|
26
|
+
number: ['integral-part', 'decimal-part'],
|
|
27
|
+
integer: ['integral-part'],
|
|
28
|
+
value: ['object', 'array', 'string', 'number', 'boolean', 'null'],
|
|
29
|
+
object: ['string', 'value'],
|
|
30
|
+
array: ['value'],
|
|
31
|
+
string: ['char'],
|
|
32
|
+
};
|
|
33
|
+
const DATE_RULES = {
|
|
34
|
+
'date': '[0-9]{4} "-" ( "0" [1-9] | "1" [0-2] ) "-" ( "0" [1-9] | [1-2] [0-9] | "3" [0-1] )',
|
|
35
|
+
'time': '([01] [0-9] | "2" [0-3]) ":" [0-5] [0-9] ":" [0-5] [0-9] ( "." [0-9]{3} )? ( "Z" | ( "+" | "-" ) ( [01] [0-9] | "2" [0-3] ) ":" [0-5] [0-9] )',
|
|
36
|
+
'date-time': 'date "T" time',
|
|
37
|
+
'date-string': '"\\"" date "\\"" space',
|
|
38
|
+
'time-string': '"\\"" time "\\"" space',
|
|
39
|
+
'date-time-string': '"\\"" date-time "\\"" space',
|
|
40
|
+
};
|
|
41
|
+
const DATE_DEPS = {
|
|
42
|
+
'date-time': ['date', 'time'],
|
|
43
|
+
'date-string': ['date'],
|
|
44
|
+
'time-string': ['time'],
|
|
45
|
+
'date-time-string': ['date-time'],
|
|
46
|
+
};
|
|
47
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
48
|
+
/** A JSON literal as a GBNF string token. */
|
|
49
|
+
function literal(value) {
|
|
50
|
+
const text = JSON.stringify(value);
|
|
51
|
+
return `"${text.replace(/[\\"]/g, (c) => `\\${c}`).replace(/\n/g, '\\n')}"`;
|
|
52
|
+
}
|
|
53
|
+
/** `{min,max}` after a rule; `*`, `+` and `?` where they say it shorter. */
|
|
54
|
+
function repeat(rule, min, max) {
|
|
55
|
+
if (max === null) {
|
|
56
|
+
if (min === 0)
|
|
57
|
+
return `${rule}*`;
|
|
58
|
+
if (min === 1)
|
|
59
|
+
return `${rule}+`;
|
|
60
|
+
return `${rule}{${min},}`;
|
|
61
|
+
}
|
|
62
|
+
if (min === max && min === 1)
|
|
63
|
+
return rule;
|
|
64
|
+
if (min === 0 && max === 1)
|
|
65
|
+
return `${rule}?`;
|
|
66
|
+
return `${rule}{${min},${max}}`;
|
|
67
|
+
}
|
|
68
|
+
class GrammarBuilder {
|
|
69
|
+
root;
|
|
70
|
+
rules = new Map([['space', '| " " | "\\n"{1,2} [ \\t]{0,20}']]);
|
|
71
|
+
refs;
|
|
72
|
+
constructor(root) {
|
|
73
|
+
this.root = root;
|
|
74
|
+
const defs = {
|
|
75
|
+
...(isRecord(root['definitions']) ? root['definitions'] : {}),
|
|
76
|
+
...(isRecord(root['$defs']) ? root['$defs'] : {}),
|
|
77
|
+
};
|
|
78
|
+
this.refs = defs;
|
|
79
|
+
}
|
|
80
|
+
add(name, rule) {
|
|
81
|
+
const key = name.replace(/[^a-zA-Z0-9-]+/g, '-');
|
|
82
|
+
let unique = key;
|
|
83
|
+
let n = 0;
|
|
84
|
+
while (this.rules.has(unique) && this.rules.get(unique) !== rule)
|
|
85
|
+
unique = `${key}${++n}`;
|
|
86
|
+
this.rules.set(unique, rule);
|
|
87
|
+
return unique;
|
|
88
|
+
}
|
|
89
|
+
primitive(name) {
|
|
90
|
+
const rule = PRIMITIVE_RULES[name] ?? DATE_RULES[name];
|
|
91
|
+
if (!rule)
|
|
92
|
+
throw new Error(`no primitive ${name}`);
|
|
93
|
+
if (this.rules.has(name))
|
|
94
|
+
return name;
|
|
95
|
+
// Registered before its dependencies: `value` and `object` need each other.
|
|
96
|
+
this.rules.set(name, rule);
|
|
97
|
+
for (const dep of PRIMITIVE_DEPS[name] ?? DATE_DEPS[name] ?? [])
|
|
98
|
+
this.primitive(dep);
|
|
99
|
+
return name;
|
|
100
|
+
}
|
|
101
|
+
resolve(ref) {
|
|
102
|
+
const match = /^#\/(?:\$defs|definitions)\/(.+)$/.exec(ref);
|
|
103
|
+
const target = match ? this.refs[match[1]] : undefined;
|
|
104
|
+
if (!isRecord(target))
|
|
105
|
+
throw new Error(`cannot resolve ${ref}`);
|
|
106
|
+
return target;
|
|
107
|
+
}
|
|
108
|
+
visit(schema, name) {
|
|
109
|
+
if (!isRecord(schema))
|
|
110
|
+
return this.primitive('value');
|
|
111
|
+
const ruleName = name || 'root';
|
|
112
|
+
if (typeof schema['$ref'] === 'string')
|
|
113
|
+
return this.visit(this.resolve(schema['$ref']), ruleName);
|
|
114
|
+
const types = Array.isArray(schema['type']) ? schema['type'] : schema['type'];
|
|
115
|
+
const alternatives = (schema['oneOf'] ?? schema['anyOf']);
|
|
116
|
+
if (Array.isArray(alternatives))
|
|
117
|
+
return this.add(ruleName, alternatives.map((alt, i) => this.visit(alt, `${ruleName}-${i}`)).join(' | '));
|
|
118
|
+
if (Array.isArray(types))
|
|
119
|
+
return this.add(ruleName, types.map((type, i) => this.visit({ ...schema, type }, `${ruleName}-${i}`)).join(' | '));
|
|
120
|
+
if ('const' in schema)
|
|
121
|
+
return this.add(ruleName, `${literal(schema['const'])} space`);
|
|
122
|
+
if (Array.isArray(schema['enum']))
|
|
123
|
+
return this.add(ruleName, `(${schema['enum'].map(literal).join(' | ')}) space`);
|
|
124
|
+
if (types === 'object' ||
|
|
125
|
+
(types === undefined &&
|
|
126
|
+
(isRecord(schema['properties']) || schema['additionalProperties'] !== undefined)))
|
|
127
|
+
return this.object(schema, ruleName);
|
|
128
|
+
if (types === 'array' ||
|
|
129
|
+
(types === undefined && (schema['items'] !== undefined || schema['prefixItems'] !== undefined)))
|
|
130
|
+
return this.array(schema, ruleName);
|
|
131
|
+
if (types === 'string')
|
|
132
|
+
return this.string(schema, ruleName);
|
|
133
|
+
if (types === 'number' || types === 'integer' || types === 'boolean' || types === 'null')
|
|
134
|
+
return this.primitive(types);
|
|
135
|
+
return this.primitive('value');
|
|
136
|
+
}
|
|
137
|
+
string(schema, name) {
|
|
138
|
+
const format = schema['format'];
|
|
139
|
+
if (format === 'date' || format === 'time' || format === 'date-time')
|
|
140
|
+
return this.primitive(`${format}-string`);
|
|
141
|
+
if (format === 'uuid')
|
|
142
|
+
return this.primitive('uuid');
|
|
143
|
+
const min = typeof schema['minLength'] === 'number' ? schema['minLength'] : 0;
|
|
144
|
+
const max = typeof schema['maxLength'] === 'number' ? schema['maxLength'] : null;
|
|
145
|
+
if (min === 0 && max === null)
|
|
146
|
+
return this.primitive('string');
|
|
147
|
+
this.primitive('char');
|
|
148
|
+
return this.add(name, `"\\"" ${repeat('char', min, max)} "\\"" space`);
|
|
149
|
+
}
|
|
150
|
+
array(schema, name) {
|
|
151
|
+
const prefix = Array.isArray(schema['prefixItems']) ? schema['prefixItems'] : null;
|
|
152
|
+
if (prefix) {
|
|
153
|
+
const items = prefix.map((item, i) => this.visit(item, `${name}-tuple-${i}`));
|
|
154
|
+
return this.add(name, `"[" space ${items.join(' "," space ')} "]" space`);
|
|
155
|
+
}
|
|
156
|
+
const item = this.visit(schema['items'] ?? {}, `${name}-item`);
|
|
157
|
+
const min = typeof schema['minItems'] === 'number' ? schema['minItems'] : 0;
|
|
158
|
+
const max = typeof schema['maxItems'] === 'number' ? schema['maxItems'] : null;
|
|
159
|
+
const rest = max === null
|
|
160
|
+
? `("," space ${item})*`
|
|
161
|
+
: repeat(`("," space ${item})`, Math.max(0, min - 1), Math.max(0, max - 1));
|
|
162
|
+
const body = max === 0 ? '' : min === 0 ? `(${item} ${rest})?` : `${item} ${rest}`;
|
|
163
|
+
return this.add(name, `"[" space ${body} "]" space`.replace(/\s+/g, ' ').trim());
|
|
164
|
+
}
|
|
165
|
+
object(schema, name) {
|
|
166
|
+
const properties = isRecord(schema['properties']) ? schema['properties'] : {};
|
|
167
|
+
const required = new Set(Array.isArray(schema['required']) ? schema['required'] : []);
|
|
168
|
+
const additional = schema['additionalProperties'];
|
|
169
|
+
const entries = Object.entries(properties);
|
|
170
|
+
const kv = (key, valueRule) => this.add(`${name}-${key}-kv`, `${literal(key)} space ":" space ${valueRule}`);
|
|
171
|
+
const requiredRules = [];
|
|
172
|
+
const optionalRules = [];
|
|
173
|
+
for (const [key, value] of entries) {
|
|
174
|
+
const rule = kv(key, this.visit(value, `${name}-${key}`));
|
|
175
|
+
if (required.has(key))
|
|
176
|
+
requiredRules.push(rule);
|
|
177
|
+
else
|
|
178
|
+
optionalRules.push(rule);
|
|
179
|
+
}
|
|
180
|
+
let additionalRule = null;
|
|
181
|
+
if (additional === true || additional === undefined || isRecord(additional)) {
|
|
182
|
+
// OpenAI structured outputs set it to false; otherwise free keys follow the typed ones.
|
|
183
|
+
const value = isRecord(additional)
|
|
184
|
+
? this.visit(additional, `${name}-additional`)
|
|
185
|
+
: this.primitive('value');
|
|
186
|
+
this.primitive('string');
|
|
187
|
+
additionalRule = this.add(`${name}-additional-kv`, `string ":" space ${value}`);
|
|
188
|
+
}
|
|
189
|
+
const optionals = [...optionalRules, ...(additionalRule ? [additionalRule] : [])];
|
|
190
|
+
let rule = '"{" space ';
|
|
191
|
+
if (requiredRules.length > 0)
|
|
192
|
+
rule += requiredRules.join(' "," space ');
|
|
193
|
+
if (optionals.length > 0) {
|
|
194
|
+
const tail = optionals.map((opt) => additionalRule === opt ? `( "," space ${opt} )*` : `( "," space ${opt} )?`);
|
|
195
|
+
if (requiredRules.length > 0)
|
|
196
|
+
rule += ` ${tail.join(' ')}`;
|
|
197
|
+
else {
|
|
198
|
+
// No required property: the first one present has no leading comma.
|
|
199
|
+
const firsts = optionals.map((opt, i) => {
|
|
200
|
+
const after = optionals
|
|
201
|
+
.slice(i + 1)
|
|
202
|
+
.map((o) => (additionalRule === o ? `( "," space ${o} )*` : `( "," space ${o} )?`));
|
|
203
|
+
const self = additionalRule === opt ? `${opt} ( "," space ${opt} )*` : opt;
|
|
204
|
+
return `${self}${after.length > 0 ? ` ${after.join(' ')}` : ''}`;
|
|
205
|
+
});
|
|
206
|
+
rule += `( ${firsts.join(' | ')} )?`;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
rule += ' "}" space';
|
|
210
|
+
return this.add(name, rule.replace(/\s+/g, ' ').trim());
|
|
211
|
+
}
|
|
212
|
+
format() {
|
|
213
|
+
return [...this.rules.entries()].map(([name, rule]) => `${name} ::= ${rule}`).join('\n') + '\n';
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** The GBNF for a JSON schema; `root` is the schema itself. */
|
|
217
|
+
export function jsonSchemaToGrammar(schema) {
|
|
218
|
+
const builder = new GrammarBuilder(isRecord(schema) ? schema : {});
|
|
219
|
+
const root = builder.visit(schema, 'root');
|
|
220
|
+
const text = builder.format();
|
|
221
|
+
return root === 'root' ? text : `root ::= ${root}\n${text}`;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=grammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/grammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `geniex-host inspect <path>` (openspec change `add-geniex-runtime`, task 5.2): what a model says
|
|
3
|
+
* about itself, read without the library — GenieX has no metadata call short of creating the model.
|
|
4
|
+
* A GGUF file is read by its header (`general.architecture`, `<arch>.context_length`,
|
|
5
|
+
* `general.file_type`, `tokenizer.chat_template`), and an `mmproj*.gguf` beside it means vision; an
|
|
6
|
+
* AI Hub bundle folder is read by the files AI Hub v0.65.0 puts in it (spike S4, 2026-10-28):
|
|
7
|
+
* `genie_config.json` (the dialog config with the context size; what makes a folder a bundle),
|
|
8
|
+
* `metadata.json` (`runtime`, `precision`, tool versions) and `htp_backend_ext_config.json` (the
|
|
9
|
+
* Hexagon generation, which names the chip). The reader leaves `null` for what it cannot find.
|
|
10
|
+
*/
|
|
11
|
+
import type { GeniexBundleMetadata, GeniexChip, GeniexGgufMetadata, GeniexModelMetadata } from '../../../contracts/index.js';
|
|
12
|
+
/** The bundle's dialog config (design "Бандлы AI Hub", as S4 found it): without it, no bundle. */
|
|
13
|
+
export declare const BUNDLE_MANIFEST = "genie_config.json";
|
|
14
|
+
/** The model cannot be read: not a GGUF file, not a bundle folder, or a broken one. */
|
|
15
|
+
export declare class GeniexInspectError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
/** A GGUF file's facts from its header, and whether an `mmproj*.gguf` lies beside it. */
|
|
19
|
+
export declare function inspectGgufFile(file: string): Promise<GeniexGgufMetadata>;
|
|
20
|
+
/** `x-elite` from the spellings AI Hub uses (`qualcomm-snapdragon-x-elite`, `Snapdragon X Elite`, `x-elite`). */
|
|
21
|
+
export declare function bundleChip(value: unknown): GeniexChip | null;
|
|
22
|
+
/** An AI Hub bundle folder's facts from `genie_config.json`, `metadata.json` and the HTP config. */
|
|
23
|
+
export declare function inspectBundle(dir: string): Promise<GeniexBundleMetadata>;
|
|
24
|
+
/** A file is a GGUF; a folder is a bundle. */
|
|
25
|
+
export declare function inspectGeniexModel(path: string): Promise<GeniexModelMetadata>;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `geniex-host inspect <path>` (openspec change `add-geniex-runtime`, task 5.2): what a model says
|
|
3
|
+
* about itself, read without the library — GenieX has no metadata call short of creating the model.
|
|
4
|
+
* A GGUF file is read by its header (`general.architecture`, `<arch>.context_length`,
|
|
5
|
+
* `general.file_type`, `tokenizer.chat_template`), and an `mmproj*.gguf` beside it means vision; an
|
|
6
|
+
* AI Hub bundle folder is read by the files AI Hub v0.65.0 puts in it (spike S4, 2026-10-28):
|
|
7
|
+
* `genie_config.json` (the dialog config with the context size; what makes a folder a bundle),
|
|
8
|
+
* `metadata.json` (`runtime`, `precision`, tool versions) and `htp_backend_ext_config.json` (the
|
|
9
|
+
* Hexagon generation, which names the chip). The reader leaves `null` for what it cannot find.
|
|
10
|
+
*/
|
|
11
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
12
|
+
import { basename, dirname, join } from 'node:path';
|
|
13
|
+
import { GENIEX_CHIPS } from '../../../contracts/index.js';
|
|
14
|
+
import { GgufParseError, readGgufMetadataFromFile } from '../../../models/index.js';
|
|
15
|
+
/** `llama_ftype` of llama.cpp, by `general.file_type`. */
|
|
16
|
+
const FILE_TYPES = {
|
|
17
|
+
0: 'F32',
|
|
18
|
+
1: 'F16',
|
|
19
|
+
2: 'Q4_0',
|
|
20
|
+
3: 'Q4_1',
|
|
21
|
+
7: 'Q8_0',
|
|
22
|
+
8: 'Q5_0',
|
|
23
|
+
9: 'Q5_1',
|
|
24
|
+
10: 'Q2_K',
|
|
25
|
+
11: 'Q3_K_S',
|
|
26
|
+
12: 'Q3_K_M',
|
|
27
|
+
13: 'Q3_K_L',
|
|
28
|
+
14: 'Q4_K_S',
|
|
29
|
+
15: 'Q4_K_M',
|
|
30
|
+
16: 'Q5_K_S',
|
|
31
|
+
17: 'Q5_K_M',
|
|
32
|
+
18: 'Q6_K',
|
|
33
|
+
19: 'IQ2_XXS',
|
|
34
|
+
20: 'IQ2_XS',
|
|
35
|
+
21: 'Q2_K_S',
|
|
36
|
+
22: 'IQ3_XS',
|
|
37
|
+
23: 'IQ3_XXS',
|
|
38
|
+
24: 'IQ1_S',
|
|
39
|
+
25: 'IQ4_NL',
|
|
40
|
+
26: 'IQ3_S',
|
|
41
|
+
27: 'IQ3_M',
|
|
42
|
+
28: 'IQ2_S',
|
|
43
|
+
29: 'IQ2_M',
|
|
44
|
+
30: 'IQ4_XS',
|
|
45
|
+
31: 'IQ1_M',
|
|
46
|
+
32: 'BF16',
|
|
47
|
+
36: 'TQ1_0',
|
|
48
|
+
37: 'TQ2_0',
|
|
49
|
+
38: 'MXFP4_MOE',
|
|
50
|
+
};
|
|
51
|
+
/** The bundle's dialog config (design "Бандлы AI Hub", as S4 found it): without it, no bundle. */
|
|
52
|
+
export const BUNDLE_MANIFEST = 'genie_config.json';
|
|
53
|
+
const BUNDLE_METADATA = 'metadata.json';
|
|
54
|
+
const BUNDLE_HTP_CONFIG = 'htp_backend_ext_config.json';
|
|
55
|
+
/** The `runtime` of `metadata.json` of a bundle the `qairt` plugin runs; `genie` bundles are not. */
|
|
56
|
+
const BUNDLE_RUNTIME = 'geniex_qairt';
|
|
57
|
+
/**
|
|
58
|
+
* Hexagon generation (`devices[].dsp_arch` of `htp_backend_ext_config.json`) → the Snapdragon X it
|
|
59
|
+
* ships in. S4: the x2-elite bundle says `v81`; `v73` is X Elite's Hexagon.
|
|
60
|
+
*/
|
|
61
|
+
const DSP_ARCH_CHIP = { v73: 'x-elite', v81: 'x2-elite' };
|
|
62
|
+
/** `mmproj-F16.gguf` (llama.cpp's spelling) and `gemma-4-E2B-it-mmproj.gguf` (Google's). */
|
|
63
|
+
const MMPROJ_RE = /mmproj.*\.gguf$/i;
|
|
64
|
+
/** The model cannot be read: not a GGUF file, not a bundle folder, or a broken one. */
|
|
65
|
+
export class GeniexInspectError extends Error {
|
|
66
|
+
constructor(message) {
|
|
67
|
+
super(message);
|
|
68
|
+
this.name = 'GeniexInspectError';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const whole = (value) => {
|
|
72
|
+
const n = typeof value === 'string' ? Number(value) : typeof value === 'number' ? value : NaN;
|
|
73
|
+
return Number.isSafeInteger(n) && n > 0 ? n : null;
|
|
74
|
+
};
|
|
75
|
+
/** A GGUF file's facts from its header, and whether an `mmproj*.gguf` lies beside it. */
|
|
76
|
+
export async function inspectGgufFile(file) {
|
|
77
|
+
let metadata;
|
|
78
|
+
try {
|
|
79
|
+
metadata = (await readGgufMetadataFromFile(file)).metadata;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error instanceof GgufParseError)
|
|
83
|
+
throw new GeniexInspectError(`${file} is not a GGUF file: ${error.message}`);
|
|
84
|
+
throw new GeniexInspectError(`${file} cannot be read: ${error instanceof Error ? error.message : String(error)}`);
|
|
85
|
+
}
|
|
86
|
+
const architecture = metadata['general.architecture'] ?? null;
|
|
87
|
+
const fileType = whole(metadata['general.file_type']);
|
|
88
|
+
const siblings = await readdir(dirname(file)).catch(() => []);
|
|
89
|
+
return {
|
|
90
|
+
kind: 'gguf',
|
|
91
|
+
architecture,
|
|
92
|
+
max_context_tokens: architecture ? whole(metadata[`${architecture}.context_length`]) : null,
|
|
93
|
+
quantization: fileType !== null
|
|
94
|
+
? (FILE_TYPES[fileType] ?? null)
|
|
95
|
+
: metadata['general.file_type'] === '0'
|
|
96
|
+
? 'F32'
|
|
97
|
+
: null,
|
|
98
|
+
chat_template: typeof metadata['tokenizer.chat_template'] === 'string',
|
|
99
|
+
vision: siblings.some((name) => MMPROJ_RE.test(name) && name !== basename(file)),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const pick = (record, keys) => {
|
|
103
|
+
for (const key of keys) {
|
|
104
|
+
const value = key
|
|
105
|
+
.split('.')
|
|
106
|
+
.reduce((at, part) => (at && typeof at === 'object' ? at[part] : undefined), record);
|
|
107
|
+
if (value !== undefined && value !== null)
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
};
|
|
112
|
+
/** `x-elite` from the spellings AI Hub uses (`qualcomm-snapdragon-x-elite`, `Snapdragon X Elite`, `x-elite`). */
|
|
113
|
+
export function bundleChip(value) {
|
|
114
|
+
if (typeof value !== 'string')
|
|
115
|
+
return null;
|
|
116
|
+
const flat = value.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
117
|
+
for (const chip of GENIEX_CHIPS)
|
|
118
|
+
if (flat.endsWith(chip) || flat.includes(`-${chip}-`))
|
|
119
|
+
return chip;
|
|
120
|
+
if (/x2-elite|x2e/.test(flat))
|
|
121
|
+
return 'x2-elite';
|
|
122
|
+
if (/x-elite|x1e/.test(flat))
|
|
123
|
+
return 'x-elite';
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/** A JSON object from a bundle file; `null` when the file is absent. */
|
|
127
|
+
async function bundleJson(dir, name) {
|
|
128
|
+
const file = join(dir, name);
|
|
129
|
+
let raw;
|
|
130
|
+
try {
|
|
131
|
+
raw = JSON.parse(await readFile(file, 'utf8'));
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error.code === 'ENOENT')
|
|
135
|
+
return null;
|
|
136
|
+
throw new GeniexInspectError(`${file} cannot be read: ${error instanceof Error ? error.message : String(error)}`);
|
|
137
|
+
}
|
|
138
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
139
|
+
throw new GeniexInspectError(`${file} is not a JSON object`);
|
|
140
|
+
return raw;
|
|
141
|
+
}
|
|
142
|
+
/** An AI Hub bundle folder's facts from `genie_config.json`, `metadata.json` and the HTP config. */
|
|
143
|
+
export async function inspectBundle(dir) {
|
|
144
|
+
const genie = await bundleJson(dir, BUNDLE_MANIFEST);
|
|
145
|
+
if (!genie)
|
|
146
|
+
throw new GeniexInspectError(`${dir} is not an AI Hub bundle: no ${BUNDLE_MANIFEST} in it`);
|
|
147
|
+
const metadata = (await bundleJson(dir, BUNDLE_METADATA)) ?? {};
|
|
148
|
+
const runtime = pick(metadata, ['runtime']);
|
|
149
|
+
if (typeof runtime === 'string' && runtime !== BUNDLE_RUNTIME)
|
|
150
|
+
throw new GeniexInspectError(`${dir} is a ${runtime} bundle, not ${BUNDLE_RUNTIME}`);
|
|
151
|
+
const htp = (await bundleJson(dir, BUNDLE_HTP_CONFIG)) ?? {};
|
|
152
|
+
const devices = pick(htp, ['devices']);
|
|
153
|
+
const dspArch = Array.isArray(devices)
|
|
154
|
+
? pick((devices[0] ?? {}), ['dsp_arch'])
|
|
155
|
+
: undefined;
|
|
156
|
+
const version = pick(metadata, ['min_runtime_version', 'min_geniex_version', 'tool_versions.geniex']);
|
|
157
|
+
const precision = pick(metadata, ['precision']);
|
|
158
|
+
return {
|
|
159
|
+
kind: 'qairt',
|
|
160
|
+
chip: (typeof dspArch === 'string' ? DSP_ARCH_CHIP[dspArch.toLowerCase()] : undefined) ??
|
|
161
|
+
bundleChip(pick(metadata, ['chipset', 'chip'])) ??
|
|
162
|
+
bundleChip(basename(dir)),
|
|
163
|
+
max_context_tokens: whole(pick(genie, ['dialog.context.size', 'context_length'])),
|
|
164
|
+
precision: typeof precision === 'string' && precision !== '' ? precision : null,
|
|
165
|
+
min_runtime_version: typeof version === 'string' && /^\d+\.\d+(\.\d+)?/.test(version)
|
|
166
|
+
? /^\d+\.\d+(\.\d+)?/.exec(version)[0]
|
|
167
|
+
: null,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** A file is a GGUF; a folder is a bundle. */
|
|
171
|
+
export async function inspectGeniexModel(path) {
|
|
172
|
+
const info = await stat(path).catch(() => null);
|
|
173
|
+
if (!info)
|
|
174
|
+
throw new GeniexInspectError(`${path} does not exist`);
|
|
175
|
+
return info.isDirectory() ? inspectBundle(path) : inspectGgufFile(path);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The part of GenieX's C API (`geniex.h` of v0.9.3, the binding's ABI 1) the host uses, as an
|
|
3
|
+
* interface the Worker calls synchronously. `ffi-bun.ts` implements it over `bun:ffi`; the protocol
|
|
4
|
+
* and server tests (tasks 5.2–5.5) run against a fake one. Every call blocks the calling thread —
|
|
5
|
+
* `generate` for the whole answer, calling `onToken` from inside — which is why the Worker, not the
|
|
6
|
+
* host's main thread, owns the library (design D1).
|
|
7
|
+
*/
|
|
8
|
+
import type { GeniexDevice, GeniexPlugin } from '../../../contracts/index.js';
|
|
9
|
+
/** A library call returned an error code (the library's own message) or a null handle. */
|
|
10
|
+
export declare class GeniexLibraryError extends Error {
|
|
11
|
+
readonly operation: string;
|
|
12
|
+
/** `geniex_ErrorCode` when the call returned one. */
|
|
13
|
+
readonly code: number | null;
|
|
14
|
+
constructor(operation: string, message: string,
|
|
15
|
+
/** `geniex_ErrorCode` when the call returned one. */
|
|
16
|
+
code?: number | null);
|
|
17
|
+
}
|
|
18
|
+
/** `GENIEX_ERROR_COMMON_CANCELLED`: the token callback returned `false`. */
|
|
19
|
+
export declare const GENIEX_CANCELLED = -100006;
|
|
20
|
+
/** `geniex_PowerMode`, in the library's order: the index is the enum value. */
|
|
21
|
+
export declare const GENIEX_POWER_MODES: readonly ["low_power_saver", "power_saver", "high_power_saver", "low_balanced", "balanced", "high_performance", "sustained_high_performance", "burst"];
|
|
22
|
+
export type GeniexPowerMode = (typeof GENIEX_POWER_MODES)[number];
|
|
23
|
+
/** One part of a message's content: text, or an image the library reads from a file. */
|
|
24
|
+
export type GeniexContent = {
|
|
25
|
+
type: 'text';
|
|
26
|
+
text: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'image';
|
|
29
|
+
path: string;
|
|
30
|
+
};
|
|
31
|
+
/** One message of `apply_chat_template` (`geniex_LlmChatMessage` / `geniex_VlmChatMessage`). */
|
|
32
|
+
export interface GeniexChatMessage {
|
|
33
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
34
|
+
content: GeniexContent[];
|
|
35
|
+
/** `assistant`: the calls it issued this turn. */
|
|
36
|
+
tool_calls?: Array<{
|
|
37
|
+
id: string | null;
|
|
38
|
+
name: string;
|
|
39
|
+
arguments: string;
|
|
40
|
+
}>;
|
|
41
|
+
/** `tool`: which call this answers. */
|
|
42
|
+
tool_call_id?: string | null;
|
|
43
|
+
tool_name?: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface GeniexTemplateInput {
|
|
46
|
+
messages: GeniexChatMessage[];
|
|
47
|
+
/** OpenAI-shaped `tools` as one JSON string; `null` for none. */
|
|
48
|
+
tools: string | null;
|
|
49
|
+
enableThinking: boolean;
|
|
50
|
+
}
|
|
51
|
+
/** `geniex_SamplerConfig` without the paths; `null` fields keep the plugin's defaults. */
|
|
52
|
+
export interface GeniexSampler {
|
|
53
|
+
temperature?: number;
|
|
54
|
+
topP?: number;
|
|
55
|
+
topK?: number;
|
|
56
|
+
seed?: number;
|
|
57
|
+
/** llama.cpp GBNF; `null` for none. */
|
|
58
|
+
grammar: string | null;
|
|
59
|
+
}
|
|
60
|
+
export interface GeniexGenerationConfig {
|
|
61
|
+
maxTokens: number;
|
|
62
|
+
stop: string[];
|
|
63
|
+
sampler: GeniexSampler;
|
|
64
|
+
/** VLM only: the images of this turn, in the order the content names them. */
|
|
65
|
+
imagePaths: string[];
|
|
66
|
+
}
|
|
67
|
+
/** `geniex_ProfileData.stop_reason`, plus `cancelled` for a callback that said stop. */
|
|
68
|
+
export type GeniexStopReason = 'eos' | 'length' | 'user' | 'stop_sequence' | 'context_length' | 'cancelled' | 'unknown';
|
|
69
|
+
export interface GeniexGenerateResult {
|
|
70
|
+
stopReason: GeniexStopReason;
|
|
71
|
+
promptTokens: number;
|
|
72
|
+
generatedTokens: number;
|
|
73
|
+
}
|
|
74
|
+
export interface GeniexModelSettings {
|
|
75
|
+
plugin: GeniexPlugin;
|
|
76
|
+
/** The alias the library resolves (`geniex_resolve_device`). */
|
|
77
|
+
device: GeniexDevice;
|
|
78
|
+
/** A GGUF file, or an AI Hub bundle folder. */
|
|
79
|
+
model: string;
|
|
80
|
+
/** `llama_cpp` only: creates a VLM instead of an LLM. */
|
|
81
|
+
mmproj: string | null;
|
|
82
|
+
nCtx: number;
|
|
83
|
+
/** Generation and batch threads for `llama_cpp` (spike S3: the plugin's default halves CPU decode). */
|
|
84
|
+
threads: number;
|
|
85
|
+
powerMode: GeniexPowerMode;
|
|
86
|
+
}
|
|
87
|
+
export interface GeniexModel {
|
|
88
|
+
/** Created with a vision projector: takes images. */
|
|
89
|
+
readonly vision: boolean;
|
|
90
|
+
applyChatTemplate(input: GeniexTemplateInput): string;
|
|
91
|
+
/**
|
|
92
|
+
* The whole generation, blocking; `onToken` runs for each token in this thread and ends the
|
|
93
|
+
* generation by returning `false` (the library answers `cancelled`). Throws `GeniexLibraryError`
|
|
94
|
+
* for anything but a clean end or a cancel.
|
|
95
|
+
*/
|
|
96
|
+
generate(prompt: string, config: GeniexGenerationConfig, onToken: (token: string) => boolean): GeniexGenerateResult;
|
|
97
|
+
destroy(): void;
|
|
98
|
+
}
|
|
99
|
+
export interface GeniexLibrary {
|
|
100
|
+
/** `geniex_version()`; `null` where it cannot be read. */
|
|
101
|
+
version: string | null;
|
|
102
|
+
/** The binding's ABI number. */
|
|
103
|
+
abi: number;
|
|
104
|
+
/** `geniex_get_plugin_list`. */
|
|
105
|
+
plugins(): string[];
|
|
106
|
+
/** `geniex_get_device_list` of one plugin: device ids (`HTP0`, `GPUOpenCL`, `CPU`). */
|
|
107
|
+
devices(plugin: string): string[];
|
|
108
|
+
createModel(settings: GeniexModelSettings): GeniexModel;
|
|
109
|
+
/** `geniex_deinit`. */
|
|
110
|
+
close(): void;
|
|
111
|
+
}
|
|
112
|
+
/** Opens the library of one build (`<build>/lib`); throws `GeniexLibraryError` when it does not load. */
|
|
113
|
+
export type LoadGeniexLibrary = (libDir: string) => Promise<GeniexLibrary>;
|
|
114
|
+
/** The ABI number `ffi-bun.ts` binds; see `SUPPORTED_GENIEX_ABI` in engine-builds. */
|
|
115
|
+
export declare const BOUND_GENIEX_ABI = 1;
|
|
116
|
+
/** The plugin whose devices `probe` reports: the GGUF one, which lists the NPU, the GPU and the CPU. */
|
|
117
|
+
export declare const PROBE_PLUGIN = "llama_cpp";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The part of GenieX's C API (`geniex.h` of v0.9.3, the binding's ABI 1) the host uses, as an
|
|
3
|
+
* interface the Worker calls synchronously. `ffi-bun.ts` implements it over `bun:ffi`; the protocol
|
|
4
|
+
* and server tests (tasks 5.2–5.5) run against a fake one. Every call blocks the calling thread —
|
|
5
|
+
* `generate` for the whole answer, calling `onToken` from inside — which is why the Worker, not the
|
|
6
|
+
* host's main thread, owns the library (design D1).
|
|
7
|
+
*/
|
|
8
|
+
/** A library call returned an error code (the library's own message) or a null handle. */
|
|
9
|
+
export class GeniexLibraryError extends Error {
|
|
10
|
+
operation;
|
|
11
|
+
code;
|
|
12
|
+
constructor(operation, message,
|
|
13
|
+
/** `geniex_ErrorCode` when the call returned one. */
|
|
14
|
+
code = null) {
|
|
15
|
+
super(`${operation}: ${message}`);
|
|
16
|
+
this.operation = operation;
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = 'GeniexLibraryError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** `GENIEX_ERROR_COMMON_CANCELLED`: the token callback returned `false`. */
|
|
22
|
+
export const GENIEX_CANCELLED = -100006;
|
|
23
|
+
/** `geniex_PowerMode`, in the library's order: the index is the enum value. */
|
|
24
|
+
export const GENIEX_POWER_MODES = [
|
|
25
|
+
'low_power_saver',
|
|
26
|
+
'power_saver',
|
|
27
|
+
'high_power_saver',
|
|
28
|
+
'low_balanced',
|
|
29
|
+
'balanced',
|
|
30
|
+
'high_performance',
|
|
31
|
+
'sustained_high_performance',
|
|
32
|
+
'burst',
|
|
33
|
+
];
|
|
34
|
+
/** The ABI number `ffi-bun.ts` binds; see `SUPPORTED_GENIEX_ABI` in engine-builds. */
|
|
35
|
+
export const BOUND_GENIEX_ABI = 1;
|
|
36
|
+
/** The plugin whose devices `probe` reports: the GGUF one, which lists the NPU, the GPU and the CPU. */
|
|
37
|
+
export const PROBE_PLUGIN = 'llama_cpp';
|
|
38
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../../../src/runtime/geniex/host/library.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,0FAA0F;AAC1F,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IAGA;IAJX,YACW,SAAiB,EAC1B,OAAe;IACf,qDAAqD;IAC5C,OAAsB,IAAI;QAEnC,KAAK,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAA;QALxB,cAAS,GAAT,SAAS,CAAQ;QAGjB,SAAI,GAAJ,IAAI,CAAsB;QAGnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAA;AAEvC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,aAAa;IACb,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,4BAA4B;IAC5B,OAAO;CACC,CAAA;AAoGV,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAEjC,wGAAwG;AACxG,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAA"}
|