@qvac/llm-llamacpp 0.54.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,6 +16,7 @@ This native C++ addon, built using the `Bare` Runtime, simplifies running Large
16
16
  - [6. Run Inference](#6-run-inference)
17
17
  - [7. Release Resources](#7-release-resources)
18
18
  - [API behavior by state](#api-behavior-by-state)
19
+ - [Assessing fit](#assessing-fit)
19
20
  - [Fine-tuning](#fine-tuning)
20
21
  - [Quickstart Example](#quickstart-example)
21
22
  - [Other Examples](#other-examples)
@@ -44,7 +45,7 @@ BitNet models require special backend handling on Adreno GPUs. When a BitNet mod
44
45
 
45
46
  **Dependencies:**
46
47
  - inference-addon-cpp (≥1.3.3): C++ addon framework (multi-job scheduler)
47
- - @qvac/fabric (^0.16.1): Shared llama.cpp/ggml/mtmd inference engine. Installed from npm; it carries the prebuilt runtime in its own tarball, so it must be present before `bare-make generate`/`build` and must not be pruned at runtime
48
+ - @qvac/fabric (^0.18.0): Shared llama.cpp/ggml/mtmd inference engine. The desktop runtime ships in the `@qvac/fabric-<host>` platform package that `@qvac/fabric` installs as an optional dependency, so install without `--omit=optional` and keep both present before `bare-make generate`/`build`. Android and iOS apps add `@qvac/fabric` and `@qvac/fabric-android-arm64` or `@qvac/fabric-ios` as direct dependencies at the same exact version.
48
49
  - Bare Runtime (≥1.24.0): JavaScript runtime
49
50
  - Linux requires Clang/LLVM 22 with libc++
50
51
  ## Installation
@@ -360,6 +361,35 @@ So a cancelled batch that contained queued prompts rejects with `Cancelled`; cal
360
361
  Cancelling a queued job resolves immediately, whether or not the slots it was waiting for are held by an unrelated run — you never wait out someone else's generation to cancel your own queued work.
361
362
 
362
363
 
364
+ ## Assessing fit
365
+
366
+ `assessFit` projects a load against the memory free right now. It reads GGUF metadata and never weight data, so the registry's weightless copy of a model answers the same as the model itself and the projection can run before anything is downloaded.
367
+
368
+ ```js
369
+ const LlmLlamacpp = require('@qvac/llm-llamacpp')
370
+
371
+ const fit = LlmLlamacpp.assessFit({
372
+ modelPath: '/models/model.gguf',
373
+ params: { 'ctx-size': '4096' }
374
+ })
375
+
376
+ fit.status // 'fits' | 'does-not-fit' | 'error'
377
+ fit.reason // 'fits', 'does-not-fit', 'model-unreadable', 'no-backend-device' or 'unsupported-config'
378
+ fit.gpuLayers // what fits, which is not always what the request asked for
379
+ fit.ctxSize
380
+ fit.devices // one row per device the model was assigned to, then a `host` row
381
+ fit.deviceBytes // model, context and compute summed across the devices, host excluded
382
+ fit.hostBytes // the same, for the trailing host row
383
+ ```
384
+
385
+ `params` takes the load in llama's own CLI spelling without the leading `--`, exactly as the loader takes it: `ctx-size`, `tensor-split`, `override-tensor`, `cpu-moe`, `no-kv-offload` and the rest. Each is dispatched through llama's argument table, so a placement pinned there reaches the projection. A setting llama does not recognise, or a flag asked to be off that can only assert itself, is `status: "error"` with `unsupported-config`.
386
+
387
+ Pinning `gpu-layers` fixes the placement: the fitter refuses to move layers off a device the load claimed, so the answer is whether that exact placement fits, never a reduced one. Leave it unset for a projection that can place the model itself.
388
+
389
+ `minCtxSize` sets a floor the fitter may not reduce the context below, defaulting to llama's own `fit-ctx` of 4096. `marginBytes` is the memory to leave free on every device, defaulting to llama's `fit-target` of 1 GiB per device. `backendsDir` is where the dynamically-loaded ggml backends live.
390
+
391
+ A model the fitter cannot read is `status: "error"`; only a broken request throws.
392
+
363
393
  ## Fine-tuning
364
394
 
365
395
  The library supports **LoRA finetuning** of GGUF models: train small adapter weights on top of a base model, then save the adapter and load it at inference time via the `lora` config option. You can pause and resume training from checkpoints.
package/addon.d.ts CHANGED
@@ -88,6 +88,7 @@ export type MappedAddonEvent = {
88
88
  * `FinetuneProgress`, or `null` to drop it.
89
89
  */
90
90
  export declare function mapAddonEvent(rawEvent: unknown, rawData: unknown, rawError: unknown): MappedAddonEvent | null;
91
+ export declare function resolveBackendsDir(): string;
91
92
  /**
92
93
  * An interface between Bare addon in C++ and JS runtime.
93
94
  */
package/addon.js CHANGED
@@ -2,9 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LlamaInterface = void 0;
4
4
  exports.mapAddonEvent = mapAddonEvent;
5
+ exports.resolveBackendsDir = resolveBackendsDir;
5
6
  /* eslint-disable @typescript-eslint/no-require-imports -- Bare modules expose CommonJS export shapes. */
6
7
  const fs = require("bare-fs");
7
8
  const path = require("bare-path");
9
+ const fabricBackends = require("@qvac/fabric/backends");
8
10
  // Index-matched to the C++ GenerationStopReason enum (SequenceDriver.hpp).
9
11
  const STOP_REASONS = [
10
12
  "none",
@@ -70,24 +72,20 @@ function mapAddonEvent(rawEvent, rawData, rawError) {
70
72
  }
71
73
  return { type: type, data: rawData, error: rawError };
72
74
  }
73
- // The ggml compute backends ship with the @qvac/fabric dependency
74
- // (prebuilds/<host>/qvac__fabric). We deliberately do not copy them into this
75
+ // The ggml compute backends ship next to the @qvac/fabric runtime
76
+ // (<root>/<host>/qvac__fabric). We deliberately do not copy them into this
75
77
  // addon to avoid duplicating tens of MB per fabric consumer. On desktop,
76
- // resolve the single @qvac/fabric install and load the backends from there. On
77
- // mobile the package tree isn't resolvable at runtime (the worklet runs from a
78
- // packed bundle), so fall back to this addon's own prebuilds, where the mobile
79
- // packaging stages the backends. The native side appends BACKENDS_SUBDIR
80
- // ("<host>/qvac__fabric") to whichever root we return.
78
+ // @qvac/fabric/backends resolves that root in whichever package holds the
79
+ // runtime. On mobile the package tree isn't resolvable at runtime (the worklet
80
+ // runs from a packed bundle), so fall back to this addon's own prebuilds, where
81
+ // the mobile packaging stages the backends. The native side appends
82
+ // BACKENDS_SUBDIR ("<host>/qvac__fabric") to whichever root we return.
81
83
  function resolveBackendsDir() {
82
- try {
83
- const fabricPkg = require.resolve("@qvac/fabric/package");
84
- const fabricPrebuilds = path.join(path.dirname(fabricPkg), "prebuilds");
85
- if (fs.existsSync(fabricPrebuilds))
86
- return fabricPrebuilds;
87
- }
88
- catch {
89
- // Mobile worklets cannot resolve the @qvac/fabric package tree.
90
- }
84
+ // fabric's resolver only checks that the platform package resolves, not that
85
+ // its prebuilds are on disk.
86
+ const fabricRoot = fabricBackends.resolveBackendsDir();
87
+ if (fabricRoot !== null && fs.existsSync(fabricRoot))
88
+ return fabricRoot;
91
89
  return path.join(__dirname, "prebuilds");
92
90
  }
93
91
  /**
@@ -192,4 +190,5 @@ exports.LlamaInterface = LlamaInterface;
192
190
  module.exports = {
193
191
  LlamaInterface,
194
192
  mapAddonEvent,
193
+ resolveBackendsDir,
195
194
  };
package/fit.d.ts ADDED
@@ -0,0 +1,63 @@
1
+ export interface LlamaFitRequest {
2
+ /** Absolute path to the GGUF, or to the registry's weightless copy. */
3
+ modelPath: string;
4
+ /**
5
+ * The load, in llama's own CLI spelling without the leading `--`, exactly as
6
+ * the loader takes it: `ctx-size`, `tensor-split`, `override-tensor`,
7
+ * `cpu-moe`, `no-kv-offload` and the rest. Each is dispatched through llama's
8
+ * argument table, so a placement pinned here reaches the projection.
9
+ *
10
+ * A setting llama does not recognise, or a flag asked to be off that can only
11
+ * assert itself, is `status: "error"` with `unsupported-config`.
12
+ */
13
+ params?: Record<string, string>;
14
+ /** Floor the fitter may not reduce the context below. */
15
+ minCtxSize?: number;
16
+ /** Memory to leave free on every device. */
17
+ marginBytes?: number;
18
+ /** Where the dynamically-loaded ggml backends live. */
19
+ backendsDir?: string;
20
+ }
21
+ export type LlamaFitStatus = 'fits' | 'does-not-fit' | 'error';
22
+ export type LlamaFitReason = 'fits' | 'does-not-fit' | 'model-unreadable' | 'no-backend-device' | 'unsupported-config';
23
+ export interface LlamaFitDevice {
24
+ name: string;
25
+ totalBytes: number;
26
+ freeBytes: number;
27
+ modelBytes: number;
28
+ contextBytes: number;
29
+ computeBytes: number;
30
+ }
31
+ export interface LlamaFitResult {
32
+ status: LlamaFitStatus;
33
+ reason: LlamaFitReason;
34
+ /** The layer count the placement resolved to. */
35
+ gpuLayers: number;
36
+ ctxSize: number;
37
+ /** One row per device the model was assigned to, then a `host` row. */
38
+ devices: LlamaFitDevice[];
39
+ /** Model, context and compute summed across the devices, host excluded. */
40
+ deviceBytes: number;
41
+ /** The same, for the trailing host row. */
42
+ hostBytes: number;
43
+ trainCtxSize: number;
44
+ expertCount: number;
45
+ }
46
+ /**
47
+ * Projects one model against the memory free right now, reading GGUF metadata
48
+ * and never weight data. The registry's weightless copy of a model answers the
49
+ * same as the model itself, so this can run before anything is downloaded.
50
+ *
51
+ * A model the fitter cannot read comes back as `status: "error"`; only a broken
52
+ * request throws.
53
+ *
54
+ * Runs synchronously on the calling thread and builds the model twice without
55
+ * allocating weights, so a caller that must stay responsive runs it off its
56
+ * own loop.
57
+ *
58
+ * The projection reads the model's vocabulary, and llama asserts on a
59
+ * vocabulary it finds inconsistent. An assert aborts rather than throwing, so
60
+ * a corrupt file ends the process instead of returning a status: take the
61
+ * model from a source you trust, or call this behind a process boundary.
62
+ */
63
+ export declare function assessFit(request: LlamaFitRequest): LlamaFitResult;
package/fit.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assessFit = assessFit;
4
+ const addon_1 = require("./addon");
5
+ /**
6
+ * Projects one model against the memory free right now, reading GGUF metadata
7
+ * and never weight data. The registry's weightless copy of a model answers the
8
+ * same as the model itself, so this can run before anything is downloaded.
9
+ *
10
+ * A model the fitter cannot read comes back as `status: "error"`; only a broken
11
+ * request throws.
12
+ *
13
+ * Runs synchronously on the calling thread and builds the model twice without
14
+ * allocating weights, so a caller that must stay responsive runs it off its
15
+ * own loop.
16
+ *
17
+ * The projection reads the model's vocabulary, and llama asserts on a
18
+ * vocabulary it finds inconsistent. An assert aborts rather than throwing, so
19
+ * a corrupt file ends the process instead of returning a status: take the
20
+ * model from a source you trust, or call this behind a process boundary.
21
+ */
22
+ function assessFit(request) {
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- native binding is resolved lazily from package prebuilds.
24
+ const binding = require('./binding.js');
25
+ return binding.assessFit({
26
+ ...request,
27
+ backendsDir: typeof request.backendsDir === 'string' && request.backendsDir.length > 0
28
+ ? request.backendsDir
29
+ : (0, addon_1.resolveBackendsDir)()
30
+ });
31
+ }
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import QvacLogger = require("@qvac/logging");
2
2
  import { QvacResponse } from "@qvac/infer-base";
3
+ import { assessFit as assessFitImpl, type LlamaFitDevice, type LlamaFitRequest, type LlamaFitResult, type LlamaFitStatus } from "./fit";
3
4
  import type * as AddonModule from "./addon";
4
5
  type BareEventMap = Record<string | symbol, unknown[]>;
5
6
  /** Aliases: inside the namespace, `QvacResponse` resolves to its own member. */
@@ -63,6 +64,7 @@ interface LlmLlamacppConstructor {
63
64
  readonly prototype: LlmLlamacpp;
64
65
  /** Returns the first shard (matching `-NNNNN-of-MMMMM.gguf`) or the sole entry for single-file models. */
65
66
  readonly pickPrimaryGgufPath: typeof pickPrimaryGgufPath;
67
+ readonly assessFit: typeof assessFitImpl;
66
68
  }
67
69
  /** LLM client wrapping the native LlamaInterface for inference, finetuning, and pause/resume. */
68
70
  declare const LlmLlamacpp: LlmLlamacppConstructor;
@@ -133,7 +135,8 @@ declare namespace LlmLlamacpp {
133
135
  verbosity?: NumericLike;
134
136
  "main-gpu"?: NumericLike | string;
135
137
  /**
136
- * How to split the model across GPUs.
138
+ * How to split the model across devices: local GPUs, plus remote ones
139
+ * registered with `rpc-servers`.
137
140
  *
138
141
  * - 'none' (default) — pin the whole model to a single GPU.
139
142
  * - 'layer' — pipeline parallelism; each GPU holds a contiguous slice of
@@ -188,6 +191,35 @@ declare namespace LlmLlamacpp {
188
191
  "flash-attn"?: "on" | "off" | "auto" | "enabled" | "disabled" | "true" | "false" | "0" | "1";
189
192
  /** Proportions for distributing layers/rows across GPUs (e.g. '1,1' for equal split, '3,1' for 75/25). */
190
193
  "tensor-split"?: string;
194
+ /**
195
+ * Comma-separated `host:port` endpoints of remote `ggml-rpc-server`
196
+ * processes, e.g. `'10.0.0.1:50052,10.0.0.2:50052'`. Their devices join the
197
+ * local ones and can then be selected with `devices`, letting a single
198
+ * model run split across several machines.
199
+ *
200
+ * Only the machine loading the model needs the model file. Every endpoint
201
+ * must be reachable at load time — an unreachable one fails the load rather
202
+ * than being skipped. Endpoints must run a server built from the same
203
+ * qvac-fabric revision as this addon, since the RPC wire protocol is
204
+ * versioned and mismatched builds refuse to connect.
205
+ * With the default `split-mode: 'none'`, `devices` must name one device;
206
+ * automatic single-device selection never picks an RPC device.
207
+ * A load also fails if its final device selection uses none of the devices
208
+ * registered by these endpoints.
209
+ *
210
+ * The channel is unauthenticated: use it only on a trusted private network.
211
+ */
212
+ "rpc-servers"?: string;
213
+ /**
214
+ * Explicit ggml device list, e.g. `'RPC0,RPC1'`. Overrides automatic
215
+ * placement, including the multi-GPU behaviour of spreading across every
216
+ * visible device — which is rarely what you want once remote devices are
217
+ * registered, since the list then mixes local and remote. Names come from
218
+ * the ggml registry (`RPC0`, `RPC1`, … for remote devices, in the order
219
+ * given to `rpc-servers`). Multiple names require `split-mode: 'layer'`
220
+ * or `'tensor'`; the default `'none'` accepts only one device.
221
+ */
222
+ devices?: string;
191
223
  "cache-type-k"?: string;
192
224
  "cache-type-v"?: string;
193
225
  /**
@@ -646,5 +678,9 @@ declare namespace LlmLlamacpp {
646
678
  stats?: FinetuneStats;
647
679
  }
648
680
  type QvacResponse<Output = any> = InferQvacResponseOf<Output>;
681
+ type FitRequest = LlamaFitRequest;
682
+ type FitResult = LlamaFitResult;
683
+ type FitStatus = LlamaFitStatus;
684
+ type FitDevice = LlamaFitDevice;
649
685
  }
650
686
  export = LlmLlamacpp;
package/index.js CHANGED
@@ -7,6 +7,7 @@ const BatchHandler = require("./batchHandler");
7
7
  /* eslint-enable @typescript-eslint/no-require-imports */
8
8
  const infer_base_1 = require("@qvac/infer-base");
9
9
  const addon_1 = require("./addon");
10
+ const fit_1 = require("./fit");
10
11
  const { runBusyError } = BatchHandler;
11
12
  function normalizeRunOptions(runOptions) {
12
13
  if (runOptions === undefined) {
@@ -257,6 +258,7 @@ function sanitizePromptForLog(prompt) {
257
258
  /** LLM client wrapping the native LlamaInterface for inference, finetuning, and pause/resume. */
258
259
  const LlmLlamacpp = class LlmLlamacpp {
259
260
  static pickPrimaryGgufPath = pickPrimaryGgufPath;
261
+ static assessFit = fit_1.assessFit;
260
262
  // Attached for tests; untyped because `typeof QvacResponse` is not nameable by consumers.
261
263
  static QvacResponse = infer_base_1.QvacResponse;
262
264
  addon;
@@ -786,6 +788,7 @@ const LlmLlamacpp = class LlmLlamacpp {
786
788
  // Runtime-redundant: ESM named imports need the top-level `module.exports.X =` form.
787
789
  /* eslint-disable @typescript-eslint/no-unsafe-member-access -- `module.exports` is untyped CommonJS surface. */
788
790
  module.exports.pickPrimaryGgufPath = pickPrimaryGgufPath;
791
+ module.exports.assessFit = fit_1.assessFit;
789
792
  module.exports.QvacResponse = infer_base_1.QvacResponse;
790
793
  module.exports = LlmLlamacpp;
791
794
  /* eslint-enable @typescript-eslint/no-unsafe-member-access */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qvac/llm-llamacpp",
3
- "version": "0.54.0",
3
+ "version": "0.55.0",
4
4
  "description": "llama addon for qvac",
5
5
  "addon": true,
6
6
  "scripts": {
@@ -22,7 +22,7 @@
22
22
  "test:mobile:generate": "npm run generate:benchmark-shards && bare ./scripts/generate-mobile-integration-tests.js",
23
23
  "test:mobile:validate": "npm run generate:benchmark-shards && node scripts/validate-mobile-tests.js && node scripts/validate-mobile-manifest.js",
24
24
  "typecheck": "tsc --noEmit -p tsconfig.json",
25
- "check:generated": "npm run build:ts && out=$(git status --porcelain --untracked-files=all -- index.js addon.js batchHandler.js addonLogging.js index.d.ts addon.d.ts batchHandler.d.ts addonLogging.d.ts) && { [ -z \"$out\" ] || { echo \"$out\"; exit 1; }; }",
25
+ "check:generated": "npm run build:ts && out=$(git status --porcelain --untracked-files=all -- index.js addon.js batchHandler.js addonLogging.js fit.js index.d.ts addon.d.ts batchHandler.d.ts addonLogging.d.ts fit.d.ts) && { [ -z \"$out\" ] || { echo \"$out\"; exit 1; }; }",
26
26
  "test:types": "npm run typecheck && npm run check:generated && npm run test:types:consumer",
27
27
  "test:types:consumer": "tsc --noEmit -p test/types/tsconfig.cjs.json && tsc --noEmit -p test/types/tsconfig.esm.json",
28
28
  "test:dts": "tsc -p tsconfig.dts.json",
@@ -56,6 +56,8 @@
56
56
  "addonLogging.js",
57
57
  "addonLogging.d.ts",
58
58
  "addon.d.ts",
59
+ "fit.js",
60
+ "fit.d.ts",
59
61
  "prebuilds",
60
62
  "index.d.ts",
61
63
  "LICENSE",
@@ -71,6 +73,8 @@
71
73
  "bugs": "https://github.com/tetherto/qvac/issues",
72
74
  "homepage": "https://qvac.tether.io",
73
75
  "devDependencies": {
76
+ "@qvac/fabric-android-arm64": "^0.18.0",
77
+ "@qvac/fabric-ios": "^0.18.0",
74
78
  "@types/node": "^24.2.1",
75
79
  "bare-crypto": "^1.15.3",
76
80
  "bare-process": "^4.2.2",
@@ -92,7 +96,7 @@
92
96
  "typescript-eslint": "^8.63.0"
93
97
  },
94
98
  "dependencies": {
95
- "@qvac/fabric": "^0.17.0",
99
+ "@qvac/fabric": "^0.18.0",
96
100
  "@qvac/infer-base": "^0.6.2",
97
101
  "@qvac/logging": "^0.1.0",
98
102
  "bare-fs": "^4.5.1",
@@ -7,7 +7,7 @@
7
7
  ],
8
8
  "current_versions": [
9
9
  {
10
- "version": "0.54"
10
+ "version": "0.55"
11
11
  }
12
12
  ],
13
13
  "exported_symbols": [
@@ -47,8 +47,10 @@
47
47
  "__ZNSt3__119piecewise_constructE",
48
48
  "__ZN8picojson12last_error_tIbE1sE",
49
49
  "__ZGVN28qvac_lib_inference_addon_cpp11JsInterface10instances_E",
50
+ "__ZGVZN30qvac_lib_inference_addon_llama9assessFitEP8js_env_sP18js_callback_info_sE8fitMutex",
50
51
  "__ZNSt3__19__any_imp17__unique_typeinfoINS_6vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_7variantIJdxEEEEENS7_ISC_EEEEE4__idE",
51
52
  "__ZN28qvac_lib_inference_addon_cpp6logger8JsLogger13logger_async_E",
53
+ "__ZGVZN30qvac_lib_inference_addon_llama21isProcessScopedOptionERK10common_argE8excluded",
52
54
  "__ZGVN28qvac_lib_inference_addon_cpp6logger8JsLogger10log_queue_E",
53
55
  "__ZGVN8picojson12last_error_tIbE1sE",
54
56
  "__ZGVN28qvac_lib_inference_addon_cpp6logger8JsLogger12queue_mutex_E",
@@ -64,11 +66,13 @@
64
66
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface13instancesMtx_E",
65
67
  "__ZN30qvac_lib_inference_addon_llama22BATCH_OUTPUT_TYPE_NAMEE",
66
68
  "__ZN28qvac_lib_inference_addon_cpp6logger8JsLogger10log_queue_E",
69
+ "__ZZN30qvac_lib_inference_addon_llama21isProcessScopedOptionERK10common_argE8excluded",
67
70
  "__ZNSt3__19__any_imp17__unique_typeinfoINS_6vectorIN10LlamaModel6PromptENS_9allocatorIS4_EEEEE4__idE",
68
71
  "__ZNSt3__16ranges5__cpo4findE",
69
72
  "__ZN30qvac_lib_inference_addon_llama10JsBatchIds11kMintPrefixE",
70
73
  "__ZGVN28qvac_lib_inference_addon_cpp11JsInterface13instancesMtx_E",
71
74
  "__ZZN30qvac_lib_inference_addon_llama10JsBatchIds4mintEvE4next",
75
+ "__ZZN30qvac_lib_inference_addon_llama9assessFitEP8js_env_sP18js_callback_info_sE8fitMutex",
72
76
  "__ZNSt3__19__any_imp17__unique_typeinfoIN28qvac_lib_inference_addon_cpp6Output5ErrorEE4__idE",
73
77
  "__ZNSt3__19__any_imp17__unique_typeinfoINS_6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS6_IS8_EEEEE4__idE"
74
78
  ]
@@ -111,9 +115,9 @@
111
115
  "__ZN30qvac_lib_inference_addon_llama5utils21restoreRecurrentStateEP13llama_contextiRKNS0_22RecurrentStateSnapshotE",
112
116
  "__ZN14LlamaFinetuner8finetuneERKN30qvac_lib_inference_addon_llama21LlamaFinetuningParamsEPN22FinetuneTerminalResult5StatsENSt3__18functionIFvRKN24llama_finetuning_helpers21FinetuneProgressStatsEEEE",
113
117
  "__ZN30qvac_lib_inference_addon_llama5utils25selectReasoningBudgetTagsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_RKNS1_6vectorIS7_NS5_IS7_EEEERKNS1_8optionalINS0_13ReasoningTagsEEE",
118
+ "__ZThn16_N14MtmdLlmContext12syncPositionEi",
114
119
  "__ZN30qvac_lib_inference_addon_llama8batching7Request20isOptHasTokensToFeedERKNSt3__18optionalIS1_EE",
115
120
  "__ZThn16_NK14TextLlmContext24getThinkingBlockDiscardsEv",
116
- "__ZThn16_N14MtmdLlmContext12syncPositionEi",
117
121
  "__ZN12CacheManager14writeCacheFileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
118
122
  "__ZN30qvac_lib_inference_addon_llama5utils22ReasoningRollbackState19restorePrefillEntryEP13llama_contexti",
119
123
  "__ZN30qvac_lib_inference_addon_llama5utils24isDeepSeekV4ArchitectureENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE",
@@ -222,8 +226,8 @@
222
226
  "__ZN24llama_finetuning_helpers25setCurrentCheckpointStateEPNS_23TrainingCheckpointStateE",
223
227
  "__ZN10LlamaModel17processConcurrentERKNS_6PromptEy",
224
228
  "__ZN14TextLlmContext26captureReasoningBoundaryAtEi",
225
- "__ZN24llama_finetuning_helpers12readTextFileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
226
229
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler26completeGroupRequestLockedERKNSt3__110shared_ptrINS1_10BatchGroupEEE",
230
+ "__ZN24llama_finetuning_helpers12readTextFileERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
227
231
  "__ZNK30qvac_lib_inference_addon_llama8batching19MultiRequestBatcher9requestAtEj",
228
232
  "__ZN26LlamaLazyInitializeBackend17incrementRefCountEv",
229
233
  "__ZN30qvac_lib_inference_addon_llama5utils23getChatTemplateForModelEPK11llama_modelRKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE",
@@ -380,19 +384,20 @@
380
384
  "__ZN14TextLlmContext8setNPastEi",
381
385
  "__ZN19LlamaBackendsHandleD1Ev",
382
386
  "__ZN30qvac_lib_inference_addon_llama7parsers31validateReasoningBudgetOverrideEd",
387
+ "__ZN22load_fit_normalization23collectRpcRegistrationsERKNSt3__16vectorINS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS5_IS7_EEEERKNS1_IhNS5_IhEEEEbRKNS0_8functionIFP16ggml_backend_regPKcEEE",
383
388
  "__ZN30qvac_lib_inference_addon_llama5utils18validateToolChoiceERKNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEERKNS1_6vectorI16common_chat_toolNS6_ISD_EEEE",
384
389
  "__ZN30qvac_lib_inference_addon_llama23ReasoningBlockCompactor26recordCloseMarkerForReplayEi",
385
- "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler10stepLockedEPNSt3__111unique_lockINS2_5mutexEEE",
386
390
  "__ZN30qvac_lib_inference_addon_llama5utils22ReasoningRollbackState19capturePrefillEntryEP13llama_contextii",
387
- "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchSchedulerD2Ev",
388
391
  "__ZN30qvac_lib_inference_addon_llama5utils22ReasoningRollbackState5resetEv",
392
+ "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler10stepLockedEPNSt3__111unique_lockINS2_5mutexEEE",
393
+ "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchSchedulerD2Ev",
394
+ "__ZNK14TextLlmContext8getNPastEv",
389
395
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler27applyDeferredTeardownLockedEv",
390
396
  "__ZN14TextLlmContext32recordPostReasoningTokenIfActiveEi",
391
397
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler15StepUnlockGuardD2Ev",
392
398
  "__ZN30qvac_lib_inference_addon_llama8batching7RequestC2EjO11PrefillPlanji",
393
399
  "__ZN10LlamaModel18initBatchSchedulerERNS_15ReloadableStateE",
394
400
  "__ZN30qvac_lib_inference_addon_llama5utils22RecurrentStateSnapshotC2EOS1_",
395
- "__ZNK14TextLlmContext8getNPastEv",
396
401
  "__ZN12CacheManager17isFileInitializedERKNSt3__14__fs10filesystem4pathE",
397
402
  "__ZN10LlamaModelC2EONSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES7_ONS0_13unordered_mapIS6_S6_NS0_4hashIS6_EENS0_8equal_toIS6_EENS4_INS0_4pairIKS6_S6_EEEEEE",
398
403
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler12submitLockedEONS1_13QueuedRequestE",
@@ -441,6 +446,7 @@
441
446
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler29serviceNextMediaSegmentLockedEPNSt3__111unique_lockINS2_5mutexEEE",
442
447
  "__ZN30qvac_lib_inference_addon_llama5utils13isGemma4ModelEPK11llama_model",
443
448
  "__ZN14TextLlmContext16generateResponseERKNSt3__18functionIFvRKNS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEEEE",
449
+ "__ZN22load_fit_normalization31validateMobileMultiDeviceConfigERKNSt3__113unordered_mapINS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEES7_NS0_4hashIS7_EENS0_8equal_toIS7_EENS5_INS0_4pairIKS7_S7_EEEEEE16llama_split_mode",
444
450
  "__ZN24llama_finetuning_helpers24schedulerOptimizerParamsEPv",
445
451
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler19cancelPendingLockedEv",
446
452
  "__ZN24llama_finetuning_helpers21tryHandlePauseRequestEP16ggml_opt_contextPNS_23TrainingCheckpointStateEbxx",
@@ -519,7 +525,6 @@
519
525
  "__ZN14MtmdLlmContext27resetToolDefinitionsDroppedEv",
520
526
  "__ZNK30qvac_lib_inference_addon_llama8batching19MultiRequestBatcher12chunkSizeForEj",
521
527
  "__ZNK14LlamaFinetuner30getPausedCheckpointStateSharedEv",
522
- "_bare_get_module_name_v0",
523
528
  "__ZN14LlamaFinetuner22prepareTrainingDatasetERKN30qvac_lib_inference_addon_llama21LlamaFinetuningParamsE",
524
529
  "__ZNK30qvac_lib_inference_addon_llama8batching20RuntimeStatsSnapshot9elapsedMsEv",
525
530
  "__ZN14TextLlmContext13resetStopFlagEv",
@@ -532,6 +537,7 @@
532
537
  "__ZNK13ModelMetaData16checkInitializedEv",
533
538
  "__ZN14TextLlmContext13onLogitsReadyEijRKNSt3__18functionIFvRKNS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEEEEP10LlamaBatch",
534
539
  "__ZN30qvac_lib_inference_addon_llama7parsers26parseReasoningBudgetConfigENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE",
540
+ "_bare_get_module_name_v0",
535
541
  "__ZNK14TextLlmContext9saveCacheERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE",
536
542
  "__ZN30qvac_lib_inference_addon_llama5utils36replayTokensThroughDecoderForTestingEP13llama_contextiRKNSt3__16vectorIiNS3_9allocatorIiEEEEibiNS3_8functionIFiS2_11llama_batchEEE",
537
543
  "__ZN30qvac_lib_inference_addon_llama8batching24ContinuousBatchScheduler18notifyDoneNoexceptEj",
@@ -561,18 +567,11 @@
561
567
  "__ZN14MtmdLlmContext9loadCacheERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE"
562
568
  ],
563
569
  "weak": [
564
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm2ELm2EEE10__dispatchB8ne190102IOZNS0_12__assignmentINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE16__generic_assignB8ne190102IRKNS0_17__copy_assignmentISE_LNS0_6_TraitE1EEEEEvOT_EUlRSM_OT0_E_JRNS0_6__baseILSI_1EJxdbSD_EEERKSU_EEEDcSM_DpT0_",
565
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm3EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102IRKNS0_18__copy_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSO_E_JRKNS0_6__baseILSI_1EJxdbSD_EEEEEEDcSN_DpT0_",
566
570
  "__ZZZN28qvac_lib_inference_addon_cpp16OutputCallBackJs26initializeProcessingThreadENSt3__110shared_ptrINS_11OutputQueueEEEENKUlvE_clEvENUlP11uv_handle_sE_8__invokeES7_",
567
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm3EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102INS0_18__move_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSM_E_JONS0_6__baseILSI_1EJxdbSD_EEEEEEDcSL_DpT0_",
571
+ "__ZN30qvac_lib_inference_addon_llama9assessFitEP8js_env_sP18js_callback_info_s",
568
572
  "__ZN30qvac_lib_inference_addon_llama6cancelEP8js_env_sP18js_callback_info_s",
569
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm2EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102IRKNS0_18__copy_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSO_E_JRKNS0_6__baseILSI_1EJxdbSD_EEEEEEDcSN_DpT0_",
570
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm0EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102INS0_18__move_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSM_E_JONS0_6__baseILSI_1EJxdbSD_EEEEEEDcSL_DpT0_",
571
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm1ELm1EEE10__dispatchB8ne190102IOZNS0_12__assignmentINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE16__generic_assignB8ne190102IRKNS0_17__copy_assignmentISE_LNS0_6_TraitE1EEEEEvOT_EUlRSM_OT0_E_JRNS0_6__baseILSI_1EJxdbSD_EEERKSU_EEEDcSM_DpT0_",
572
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm0EEE10__dispatchB8ne190102IONS1_9__variant15__value_visitorIZZN28qvac_lib_inference_addon_cpp9out_handl27JsRuntimeStatsOutputHandlerC1EvENKUlRKNS_6vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_7variantIJdxEEEEENSG_ISL_EEEEE_clESP_EUlOT_E_EEJRKNS0_6__baseILNS0_6_TraitE0EJdxEEEEEEDcSR_DpT0_",
573
573
  "__ZZN28qvac_lib_inference_addon_cpp2js11JsAsyncTask3runEP8js_env_sNSt3__18functionIFvvEEEENUlP11uv_handle_sE_8__invokeES9_",
574
574
  "__ZN30qvac_lib_inference_addon_llama11activeSlotsEP8js_env_sP18js_callback_info_s",
575
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm1EEE10__dispatchB8ne190102IONS1_9__variant15__value_visitorIZZN28qvac_lib_inference_addon_cpp9out_handl27JsRuntimeStatsOutputHandlerC1EvENKUlRKNS_6vectorINS_4pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_7variantIJdxEEEEENSG_ISL_EEEEE_clESP_EUlOT_E_EEJRKNS0_6__baseILNS0_6_TraitE0EJdxEEEEEEDcSR_DpT0_",
576
575
  "__ZN28qvac_lib_inference_addon_cpp6logger8JsLogger13asyncCallbackEP10uv_async_s",
577
576
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface6cancelEP8js_env_sP18js_callback_info_s",
578
577
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface10activeJobsEP8js_env_sP18js_callback_info_s",
@@ -580,20 +579,15 @@
580
579
  "__ZN30qvac_lib_inference_addon_llama8finetuneEP8js_env_sP18js_callback_info_s",
581
580
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface13releaseLoggerEP8js_env_sP18js_callback_info_s",
582
581
  "__ZZN28qvac_lib_inference_addon_cpp16OutputCallBackJs16drainAndTeardownEPNS0_5StateEbbENUlP11uv_handle_sE_8__invokeES4_",
583
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm1EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102INS0_18__move_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSM_E_JONS0_6__baseILSI_1EJxdbSD_EEEEEEDcSL_DpT0_",
584
582
  "__ZN30qvac_lib_inference_addon_llama14createInstanceEP8js_env_sP18js_callback_info_s",
585
583
  "__ZZN28qvac_lib_inference_addon_cpp6logger8JsLogger22closeAsyncHandleLockedEvENUlP11uv_handle_sE_8__invokeES3_",
586
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm0ELm0EEE10__dispatchB8ne190102IOZNS0_12__assignmentINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE16__generic_assignB8ne190102IRKNS0_17__copy_assignmentISE_LNS0_6_TraitE1EEEEEvOT_EUlRSM_OT0_E_JRNS0_6__baseILSI_1EJxdbSD_EEERKSU_EEEDcSM_DpT0_",
587
584
  "__ZN30qvac_lib_inference_addon_llama6runJobEP8js_env_sP18js_callback_info_s",
588
585
  "__ZN28qvac_lib_inference_addon_cpp2js11JsAsyncTask10onCompleteEP10uv_async_s",
589
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm3ELm3EEE10__dispatchB8ne190102IOZNS0_12__assignmentINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE16__generic_assignB8ne190102IRKNS0_17__copy_assignmentISE_LNS0_6_TraitE1EEEEEvOT_EUlRSM_OT0_E_JRNS0_6__baseILSI_1EJxdbSD_EEERKSU_EEEDcSM_DpT0_",
590
586
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface15destroyInstanceEP8js_env_sP18js_callback_info_s",
591
587
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface8activateEP8js_env_sP18js_callback_info_s",
592
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm0EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102IRKNS0_18__copy_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSO_E_JRKNS0_6__baseILSI_1EJxdbSD_EEEEEEDcSN_DpT0_",
593
588
  "__ZN28qvac_lib_inference_addon_cpp6logger8JsLogger13onEnvTeardownEPv",
594
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm1EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102IRKNS0_18__copy_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSO_E_JRKNS0_6__baseILSI_1EJxdbSD_EEEEEEDcSN_DpT0_",
595
589
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface9setLoggerEP8js_env_sP18js_callback_info_s",
596
- "__ZNSt3__116__variant_detail12__visitation6__base12__dispatcherIJLm2EEE10__dispatchB8ne190102IOZNS0_6__ctorINS0_8__traitsIJxdbNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEE19__generic_constructB8ne190102INS0_18__move_constructorISE_LNS0_6_TraitE1EEEEEvRSF_OT_EUlSM_E_JONS0_6__baseILSI_1EJxdbSD_EEEEEEDcSL_DpT0_",
590
+ "__ZZN30qvac_lib_inference_addon_llama20applyLlamaLoadParamsEP8js_env_sN28qvac_lib_inference_addon_cpp2js6ObjectER13common_paramsENUliPPcE_8__invokeEiS8_",
597
591
  "__ZN28qvac_lib_inference_addon_cpp11JsInterface11loadWeightsEP8js_env_sP18js_callback_info_s",
598
592
  "__ZN28qvac_lib_inference_addon_cpp16OutputCallBackJs13onEnvTeardownEPv",
599
593
  "__ZN28qvac_lib_inference_addon_cpp2js11JsAsyncTask13onEnvTeardownEP22js_deferred_teardown_sPv",