@caldrix-ai/caldrix 0.2.0 → 0.4.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/CHANGELOG.md +28 -0
- package/README.md +65 -19
- package/dist/index.d.ts +67 -17
- package/dist/index.js +1 -1
- package/dist/worker.js +1 -1
- package/host/caldrix_web.d.ts +67 -10
- package/host/caldrix_web.js +1 -1
- package/host/caldrix_web_bg.wasm +0 -0
- package/host/caldrix_web_bg.wasm.d.ts +11 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,34 @@
|
|
|
3
3
|
Format after [Keep a Changelog](https://keepachangelog.com/); versions are independent semver, tagged
|
|
4
4
|
`caldrix-js-v<version>`.
|
|
5
5
|
|
|
6
|
+
## 0.4.0 — 2026-11-04
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- `Caldrix.check(model, opts?)` and its types `CheckOptions` and `CheckResult`: which tier a load of the model would end on in this tab (`{ ok: true, backend }`), or why the load would be refused (`{ ok: false, kind, message }`), without loading it. It takes `load`'s tier-deciding options and `assets` (so it starts the same worker and `.wasm` as the load, under the same fallback rule), runs `load`'s option checks, probe and tier choice, then the load in its worker only until the tier is settled (the Hub listing for a repo id, and for a LoRA adapter repo its `adapter_config.json` and its base's Hub listing; `config.json` and the safetensors index or a GGUF alias's header range; the precheck; and on WebGPU the device open, destroyed again); it fetches no tokenizer file and no weight, and ends its worker on every answer. It never rejects; `kind: "fetch"` (an abort included) leaves the answer unknown. Covered by the unit tests over a scripted worker, and run in headless Chromium against the loopback hub (`inferno/WEB-VERIFICATION.md` entry 20): on a repo id, check and load agreed on the wasm tier and, on Dawn/SwiftShader (a CPU), the WebGPU tier, and the check fetched no tokenizer file and no weight; an index past the wasm ceiling checked as `fit`, an unknown repo id as `fetch`. Not run in a browser: an adapter repo or a GGUF alias through `check`, `signal`, `assets`.
|
|
11
|
+
|
|
12
|
+
## 0.3.0 — 2026-11-02
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- `Caldrix.load` takes a Hugging Face repo id, `owner/name[@revision]`, beside the aliases: resolved once to its canonical id and commit sha through the Hub's model API, every file fetched and cached at that sha, a gated repo is refused by name, a private one reads as not found (the Hub answers it as it answers a missing repo), and the caldrix CLI, which reads `HF_TOKEN`, loads both.
|
|
17
|
+
- `Caldrix.load` loads a PEFT LoRA adapter repo, a bitsandbytes nf4 repo and a LoRA adapter over an nf4 base by repo id, densified at import (run in headless Chromium over a loopback hub on the wasm tier only; the WebGPU tier's densified load has run off-browser only, and `loadWebGpu`'s densified branch in no harness); `doctor().provenance` and `doctor().note`, and `repo`, `revision` and `provenance` on progress events.
|
|
18
|
+
- `Caldrix.load` of a repo that ships a SentencePiece BPE `tokenizer.model` and no `tokenizer.json` (the Llama-2, Mistral and Yi families) converts the tokenizer in the browser and loads; `doctor().source` names `tokenizer.model`; a Unigram model or a foreign tokenizer class is refused by name before any weight byte; run in headless Chromium on double7/vicuna-68m, token-exact at f32 on the wasm tier and on the WebGPU tier on SwiftShader (a CPU) — `inferno/WEB-VERIFICATION.md` entry 18.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- A model's `chat_template.jinja` is fetched beside `tokenizer_config.json` and wins over the config's `chat_template` key, as transformers 5 writes it. With neither, the error reads "the model directory has neither chat_template.jinja nor a chat_template in tokenizer_config.json".
|
|
23
|
+
- The quantized aliases `smollm2-instruct:q4_K_M` and `smollm2-instruct:q8_0` are recognized and both tiers have their kernels: a load reads the GGUF header with a range request, verifies the file against the alias's pinned sha256 before parsing it, and runs the quantized kernels on the tier that serves it; what has actually run is recorded under the README's "What has run, and where". `backend: "auto"` chooses the tier for a quantized alias as for a dense one, and on the WebGPU tier the weights stay in their blocks: `doctor().storage` is `"blocks"`.
|
|
24
|
+
- The README's "What has run, and where" states that the quantized aliases ran on a real adapter: on the operator's Mac through `Caldrix.load` on both tiers, WebGPU on the Mac's own adapter, vendor `apple`, architecture `metal-3`, token-exact (`inferno/WEB-VERIFICATION.md` entry 14).
|
|
25
|
+
|
|
26
|
+
## 0.2.1 — 2026-10-30
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- The doctor's `device` on WebGPU names what the browser gives: the adapter's description, else its
|
|
31
|
+
vendor and architecture, else `webgpu (unnamed adapter)`. A browser that blanks all three (Brave's
|
|
32
|
+
fingerprinting protection does) printed `webgpu ( )`. `adapter` still carries the raw strings.
|
|
33
|
+
|
|
6
34
|
## 0.2.0 — 2026-10-29
|
|
7
35
|
|
|
8
36
|
### Added
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ This page states only what `inferno/WEB-VERIFICATION.md` records (in
|
|
|
8
8
|
the Caldrix repository, which is private, so you cannot open it), what the package's own tests run in
|
|
9
9
|
CI, and what the source does.
|
|
10
10
|
|
|
11
|
-
<!-- host-commit:
|
|
11
|
+
<!-- host-commit: 78d9f0c36868b8e9c44d1fa05f1b5719eaae0876 -->
|
|
12
12
|
|
|
13
13
|
The compiled host in `host/` is built from the `caldrix-web` crate at the commit in the marker above.
|
|
14
14
|
The release workflow overwrites that marker with the commit it builds; the value in a source checkout
|
|
@@ -39,7 +39,8 @@ The API, as the package's declarations have it:
|
|
|
39
39
|
|
|
40
40
|
```ts
|
|
41
41
|
class Caldrix {
|
|
42
|
-
static load(
|
|
42
|
+
static load(model: string, opts?: LoadOptions): Promise<Engine>;
|
|
43
|
+
static check(model: string, opts?: CheckOptions): Promise<CheckResult>;
|
|
43
44
|
}
|
|
44
45
|
class Engine {
|
|
45
46
|
chat(messages: ChatMessage[], opts?: GenerateOptions): AsyncIterable<Delta>;
|
|
@@ -51,6 +52,8 @@ class Engine {
|
|
|
51
52
|
declare function probe(): Promise<Capabilities>;
|
|
52
53
|
```
|
|
53
54
|
|
|
55
|
+
`model` is an alias this build ships (`doctor().aliases`) or a Hugging Face repo id, `owner/name` or `owner/name@<revision>`. A repo id is resolved once through the Hub's model API to its canonical id and commit sha, and every file is fetched and cached at that sha; `doctor().model` and `doctor().revision` are the canonical id and the sha, and the doctor line says `(resolved from <id>)` when the canonical id differs from the one asked (a rename, or a different letter case). The browser build sends no token: a gated repo is refused by name, a private one reads as not found (the Hub answers it as it answers a missing repo), and the caldrix CLI, which reads `HF_TOKEN`, loads both. A repo id loads a dense Llama-family checkpoint, a bitsandbytes nf4 checkpoint (dequantized to the plan dtype at import: it runs at its dense size, not its download size; `doctor().note` says both), a PEFT LoRA adapter repo (its base, named by `adapter_config.json`, resolved once through the Hub's model API, and the adapter folded into it tensor by tensor at import), or a LoRA adapter over an nf4 base. `doctor().provenance` is the caldrix CLI's `model:` line, naming both repos and shas; progress events name the repo each file comes from. Folded weights are never cached: a repeat load fetches nothing new and folds again. A gated base, an adapter over an adapter, a pickle-only adapter and a repo carrying both a model and an adapter are refused by name before any weight byte.
|
|
56
|
+
|
|
54
57
|
A `Delta` is `{ text, token?, done, finishReason?: "stop" | "length" | "abort", usage?, logprobs? }`. Generation
|
|
55
58
|
options are `temperature`, `topK`, `topP`, `minP`, `repetitionPenalty`, `seed`, `maxTokens` and
|
|
56
59
|
`constraint` (see "Constrained decoding"), `logprobs`, plus a `signal` (an `AbortSignal`). Errors are `CaldrixError` with a `kind` of `probe`, `fit`, `architecture`,
|
|
@@ -70,7 +73,7 @@ to each token's delta: up to `n` candidates for that step (fewer under a constra
|
|
|
70
73
|
interface LoadOptions {
|
|
71
74
|
backend?: "auto" | "webgpu" | "wasm" | "webgl";
|
|
72
75
|
offline?: boolean;
|
|
73
|
-
onProgress?: (p: { file: string; loaded: number; total: number | null }) => void;
|
|
76
|
+
onProgress?: (p: { file: string; loaded: number; total: number | null; repo: string; revision: string; provenance?: string }) => void;
|
|
74
77
|
hubBaseUrl?: string;
|
|
75
78
|
dtype?: "f32" | "bf16";
|
|
76
79
|
maxContext?: number;
|
|
@@ -83,21 +86,58 @@ interface LoadOptions {
|
|
|
83
86
|
- **`backend`**: `"auto"` (the default) probes the browser and picks WebGPU when an adapter is present
|
|
84
87
|
and `requestDevice` succeeds, wasm otherwise; a bf16 plan goes to wasm on the page, before the worker starts. `"webgpu"` and `"wasm"` force a tier. `"webgl"` is declared and refused: the backend is
|
|
85
88
|
not built. Under `"auto"`, a load WebGPU then refuses (a larger explicit context, a limit, a
|
|
86
|
-
device that fails to open) is served by the wasm tier, and `doctor().why` says so.
|
|
89
|
+
device that fails to open) is served by the wasm tier, and `doctor().why` says so. A quantized alias
|
|
90
|
+
under `"auto"` is placed as any alias: WebGPU is probed first, and a refusal of the same kinds falls
|
|
91
|
+
back to wasm.
|
|
87
92
|
- **Quantized aliases**: `smollm2-instruct:q4_K_M` and `smollm2-instruct:q8_0` are one GGUF file each.
|
|
88
93
|
A load reads the file's header with a range request first, then verifies the whole file against the
|
|
89
|
-
alias's pinned sha256 before parsing it.
|
|
90
|
-
the WebGPU tier
|
|
91
|
-
says so); an explicit `backend: "webgpu"` is refused by name, a `lowering` error.
|
|
94
|
+
alias's pinned sha256 before parsing it. Both tiers have their kernels (see "What has run, and where");
|
|
95
|
+
on the WebGPU tier the weights stay in their blocks and `doctor().storage` is `"blocks"`.
|
|
92
96
|
- **`storage`**: the WebGPU tier's weight storage. `"auto"` stores the block GEMM weights as f16 when the
|
|
93
|
-
adapter has `shader-f16`; `"f32"` keeps them f32 on any adapter. `
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
adapter has `shader-f16`; `"f32"` keeps them f32 on any adapter. `storage: "f32"` on a quantized alias
|
|
98
|
+
is satisfied: nothing is narrowed, and the weights stay in their blocks. `doctor().storage` reports it
|
|
99
|
+
(`"blocks"` for a quantized alias, `null` on wasm). `storage: "f32"` with `backend: "wasm"` is refused.
|
|
100
|
+
- **`hubBaseUrl`**: where the model files and, for a repo id, the Hub listing (`/api/models/…`) are fetched from (default `https://huggingface.co`); a mirror serving only files loads aliases but not repo ids. `offline`
|
|
96
101
|
uses only the browser's cache and fails with `fetch` for a file it lacks.
|
|
97
102
|
- **`assets`**: where the package's own files come from; see "Network" below.
|
|
98
103
|
- **`doctor()`** reports the tier that runs, `device`, `dtype`, `storage`, `adapter`, on WebGPU only `maxContext` and `contextClamp`, where each model file came from and whether its digest was checked, `assets` (the
|
|
99
104
|
source and URL of the worker and the `.wasm`: `bundle`, `cdn` or `page`), `aliases` (every alias
|
|
100
|
-
this build loads, each with its `format`, `safetensors` or `gguf`), and `why`.
|
|
105
|
+
this build loads, each with its `format`, `safetensors` or `gguf`), `provenance` (a densified load's `model:` line, `null` for a model read as it lies), `note` (an nf4 repo's 4-bit note, `null` otherwise), and `why`.
|
|
106
|
+
|
|
107
|
+
## Checking a model before loading it
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
type CheckOptions = Pick<LoadOptions, "backend" | "dtype" | "maxContext" | "storage" | "hubBaseUrl" | "signal" | "assets">;
|
|
111
|
+
type CheckResult = { ok: true; backend: "webgpu" | "wasm" } | { ok: false; kind: Kind; message: string };
|
|
112
|
+
|
|
113
|
+
const r = await Caldrix.check("smollm2-instruct");
|
|
114
|
+
if (r.ok) console.log(`a load would run on ${r.backend}`);
|
|
115
|
+
else if (r.kind !== "fetch") console.log(`a load would be refused: ${r.message}`);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`Caldrix.check` says which tier a load of the model would end on in this tab, or why the load would
|
|
119
|
+
be refused, without loading it. It takes the same model and the same tier-deciding options as `load`,
|
|
120
|
+
and `assets`, so it starts the same worker and `.wasm` the load would, under the same fallback rule;
|
|
121
|
+
it runs the same option checks, the same probe and the same tier choice. Its worker then runs the
|
|
122
|
+
load only until the tier is settled: for a repo id the Hub listing (for a LoRA adapter repo, its
|
|
123
|
+
`adapter_config.json` and its base's Hub listing too), then `config.json` and the safetensors index
|
|
124
|
+
(for a GGUF alias, the file's header range instead), the same precheck as `load`, and on the WebGPU
|
|
125
|
+
tier the device open, after which the device is destroyed and the worker ends. It never fetches a
|
|
126
|
+
tokenizer file or a weight, sends no `onProgress` events, and is never `offline`.
|
|
127
|
+
|
|
128
|
+
Under `backend: "auto"` the answer is the tier the load would end on: a WebGPU refusal of the kinds
|
|
129
|
+
`load` falls back on (a limit, a larger explicit context, a device that fails to open) answers
|
|
130
|
+
`{ ok: true, backend: "wasm" }`, and a bf16 request answers wasm as `load` places it. An explicit
|
|
131
|
+
`"webgpu"` or `"wasm"` answers that tier or its refusal.
|
|
132
|
+
|
|
133
|
+
`check` never rejects. Every refusal is `{ ok: false, kind, message }`, with the kind and message
|
|
134
|
+
`load` would give: an option it refuses (an unknown backend, a `hubBaseUrl` that is not an absolute
|
|
135
|
+
http(s) URL, an empty model, `storage: "f32"` with `backend: "wasm"`) is `request`, a model past this
|
|
136
|
+
tab's limits is `fit`, and a worker that cannot start or answers out of protocol is `backend`.
|
|
137
|
+
`kind: "fetch"` means the answer is unknown: a file could not be fetched, or the check was aborted
|
|
138
|
+
through `signal` (`checking <model> was aborted`), so a load might still succeed. The CDN fallback
|
|
139
|
+
for the package's own files applies as on a load (off with `assets.fallback: false`), warned once per check on
|
|
140
|
+
the console. The files a check fetches are written to the cache, and a later load reuses them.
|
|
101
141
|
|
|
102
142
|
## Constrained decoding
|
|
103
143
|
|
|
@@ -135,10 +175,12 @@ one of the strings and stops. `{ json: <schema> }` yields a JSON value matching
|
|
|
135
175
|
|
|
136
176
|
## What has run, and where
|
|
137
177
|
|
|
138
|
-
Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9,
|
|
139
|
-
the quantized aliases); nothing
|
|
178
|
+
Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9, entries 10,
|
|
179
|
+
11, 12 and 14 for the quantized aliases, and entries 16 and 17 for the adapter and nf4 repos); nothing
|
|
180
|
+
else is claimed.
|
|
140
181
|
|
|
141
|
-
- **Model:** SmolLM2-135M-Instruct, one prompt, 8 greedy tokens
|
|
182
|
+
- **Model:** SmolLM2-135M-Instruct, one prompt, 8 greedy tokens; the adapter and nf4 repos below add a
|
|
183
|
+
LoRA adapter over it and SmolLM2-360M-Instruct's nf4 repo, on their fixtures' prompt. No other model or prompt.
|
|
142
184
|
- **Browser:** Chromium driven by Playwright, headless only: the headless shell 153.0.8010.12 on Linux and on
|
|
143
185
|
the operator's Apple M1 Max, and on that Mac Playwright's full Chromium (new headless mode, userAgent
|
|
144
186
|
`HeadlessChrome/153.0.0.0`) for the WebGPU tier. No other browser.
|
|
@@ -154,10 +196,14 @@ the quantized aliases); nothing else is claimed.
|
|
|
154
196
|
not a GPU. The f32 plan at f32 weight storage, token-exact, logits worst 5.874168e-4 against the same bound.
|
|
155
197
|
- **Phase 2's exit is closed on the gates** (entry 9), with the run's two process deviations recorded there:
|
|
156
198
|
the browser stages ran outside the sandbox, and the build's first attempt failed at its install step.
|
|
157
|
-
- quantized aliases: off-browser at the desk (`inferno/WEB-VERIFICATION.md`
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
199
|
+
- quantized aliases: off-browser at the desk on both tiers (`inferno/WEB-VERIFICATION.md` entries 10 and 11); in headless Chromium through `Caldrix.load` on both tiers on the pinned files, WebGPU on Dawn/SwiftShader, a CPU (entry 12); on the operator's Mac through `Caldrix.load` on both tiers, WebGPU on the Mac's own adapter, vendor `apple`, architecture `metal-3`, token-exact (entry 14).
|
|
200
|
+
- adapter and nf4 repos by id (a LoRA adapter over SmolLM2-135M-Instruct, and SmolLM2-360M-Instruct's bitsandbytes nf4 repo, each at a pinned sha): off-browser at the desk on both tiers (`inferno/WEB-VERIFICATION.md` entry 16: wasm both pairs and WebGPU the LoRA pair token-exact, the f32 plan at f32 weight storage; the WebGPU nf4 pair stopped at lavapipe's storage-buffer binding limit); in headless Chromium through `Caldrix.load` by repo id on both tiers, both pairs token-exact, the f32 plan at f32 weight storage, WebGPU on Dawn/SwiftShader, a CPU (entry 17).
|
|
201
|
+
- `Caldrix.check`: in headless Chromium against the loopback hub (`inferno/WEB-VERIFICATION.md` entry 20): on a repo id, check and load agreed on the wasm tier and, under `--enable-unsafe-webgpu`, on the WebGPU tier on Dawn/SwiftShader, a CPU, and the check fetched no tokenizer file and no weight; an index past the wasm ceiling checked as `fit`, an unknown repo id as `fetch`.
|
|
202
|
+
- **Not run:** any other WebGPU adapter or GPU; a headed browser; the browser stages inside a sandbox; the scalar
|
|
203
|
+
(non-SIMD) wasm spelling in a browser; real-Hub digest behaviour (the runs used a loopback Hub stand-in); a real Hub listing for a repo id
|
|
204
|
+
(the loopback hub served the pinned snapshots); any browser other than Playwright's headless Chromium; any other model;
|
|
205
|
+
`Caldrix.check` against a real adapter's buffer limit (its unit tests only), against the real Hub, or in any other
|
|
206
|
+
browser or on any other device. No performance figure is recorded
|
|
161
207
|
or claimed.
|
|
162
208
|
|
|
163
209
|
## The WebGPU default context
|
|
@@ -170,7 +216,7 @@ default context loads at 7282; `doctor()` reports the clamp in `contextClamp` an
|
|
|
170
216
|
|
|
171
217
|
## Network
|
|
172
218
|
|
|
173
|
-
No telemetry. The network is the Hub, for the
|
|
219
|
+
No telemetry. The network is the Hub, for the listing (`/api/models/<id>`) and the files of the model you named, and jsdelivr, for the
|
|
174
220
|
package's own assets when the bundle's copy fails.
|
|
175
221
|
|
|
176
222
|
- **When the fallback fires:** the worker falls back if it fails before it is ready (its script, a chunk
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/** The nine error kinds of the caldrix.js API (spec §5.4). */
|
|
2
|
+
type Kind = "probe" | "fit" | "architecture" | "fetch" | "digest" | "validate" | "lowering" | "backend" | "request";
|
|
3
|
+
declare class CaldrixError extends Error {
|
|
4
|
+
readonly kind: Kind;
|
|
5
|
+
/** Set by the Hub fetcher when the file is simply absent: not on the Hub (404) or not cached while offline. */
|
|
6
|
+
readonly missing?: "not-found" | "offline-uncached";
|
|
7
|
+
constructor(kind: Kind, message: string, missing?: "not-found" | "offline-uncached");
|
|
8
|
+
}
|
|
9
|
+
|
|
1
10
|
/**
|
|
2
11
|
* The generation options, passed to the host as its camelCase JSON. Any other key reaches the host
|
|
3
12
|
* and is refused there by name; `signal` is the page's and never leaves the main thread.
|
|
@@ -23,15 +32,6 @@ interface GenerationOptions {
|
|
|
23
32
|
maxTokens?: number;
|
|
24
33
|
}
|
|
25
34
|
|
|
26
|
-
/** The nine error kinds of the caldrix.js API (spec §5.4). */
|
|
27
|
-
type Kind = "probe" | "fit" | "architecture" | "fetch" | "digest" | "validate" | "lowering" | "backend" | "request";
|
|
28
|
-
declare class CaldrixError extends Error {
|
|
29
|
-
readonly kind: Kind;
|
|
30
|
-
/** Set by the Hub fetcher when the file is simply absent: not on the Hub (404) or not cached while offline. */
|
|
31
|
-
readonly missing?: "not-found" | "offline-uncached";
|
|
32
|
-
constructor(kind: Kind, message: string, missing?: "not-found" | "offline-uncached");
|
|
33
|
-
}
|
|
34
|
-
|
|
35
35
|
type ChatMessage = {
|
|
36
36
|
role: "system" | "user" | "assistant";
|
|
37
37
|
content: string;
|
|
@@ -55,19 +55,22 @@ interface HostDoctor {
|
|
|
55
55
|
dtype: string | null;
|
|
56
56
|
simd: boolean;
|
|
57
57
|
threads: number | null;
|
|
58
|
+
/** The repo the files came from: for a Hub repo id, the listing's canonical id (it may differ from the one asked for). */
|
|
58
59
|
model: string | null;
|
|
60
|
+
/** The revision the files were fetched at: for a Hub repo id, the listing's commit sha. */
|
|
59
61
|
revision: string | null;
|
|
60
62
|
source: null;
|
|
61
63
|
line: string;
|
|
62
64
|
/** WebGPU only, the host's: the context the model was loaded at, and the clamp's line when the default was clamped. */
|
|
63
65
|
maxContext?: number;
|
|
64
66
|
contextClamp?: string | null;
|
|
65
|
-
/** The worker's: the weights' storage form on WebGPU (`null` on wasm). */
|
|
66
|
-
storage: "f16" | "f32" | null;
|
|
67
|
+
/** The worker's: the weights' storage form on WebGPU (`blocks` for a quantized model; `null` on wasm). */
|
|
68
|
+
storage: "f16" | "f32" | "blocks" | null;
|
|
67
69
|
/**
|
|
68
70
|
* The worker's: the adapter by its own vendor and architecture strings (`null` on wasm). On
|
|
69
71
|
* WebGPU `device` is the worker's too: `webgpu (<description>)`, with vendor and architecture
|
|
70
|
-
* standing in for the description when the browser leaves it empty
|
|
72
|
+
* standing in for the description when the browser leaves it empty, and `unnamed adapter` when it
|
|
73
|
+
* blanks all three.
|
|
71
74
|
*/
|
|
72
75
|
adapter: {
|
|
73
76
|
vendor: string;
|
|
@@ -78,22 +81,41 @@ interface HostDoctor {
|
|
|
78
81
|
name: string;
|
|
79
82
|
format: "safetensors" | "gguf";
|
|
80
83
|
}[];
|
|
84
|
+
/**
|
|
85
|
+
* The host's: a densified load's `model:` line (an adapter folded into its base, an nf4 repo
|
|
86
|
+
* dequantized), byte for byte the caldrix CLI's; `null` for a model read as it lies.
|
|
87
|
+
*/
|
|
88
|
+
provenance: string | null;
|
|
89
|
+
/** The host's: an nf4 repo's 4-bit note (never a QLoRA adapter's); `null` otherwise. */
|
|
90
|
+
note: string | null;
|
|
81
91
|
}
|
|
82
92
|
|
|
83
93
|
interface LoadOptions {
|
|
84
94
|
backend?: "auto" | "webgpu" | "wasm" | "webgl";
|
|
85
95
|
offline?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Each model file's download progress. `repo` and `revision` are the repo and commit the file is
|
|
98
|
+
* fetched from: for a LoRA adapter, the adapter's for its own files and its base's (by the
|
|
99
|
+
* canonical id the Hub's listing returns) for the base's. `provenance` is the `model:` line of a
|
|
100
|
+
* densified load (an adapter folded into its base, a bitsandbytes nf4 repo dequantized), naming
|
|
101
|
+
* the dtype of the tier that serves; it is set on every event once that tier is settled, and
|
|
102
|
+
* absent before then and for a model read as it lies.
|
|
103
|
+
*/
|
|
86
104
|
onProgress?: (p: {
|
|
87
105
|
file: string;
|
|
88
106
|
loaded: number;
|
|
89
107
|
total: number | null;
|
|
108
|
+
repo: string;
|
|
109
|
+
revision: string;
|
|
110
|
+
provenance?: string;
|
|
90
111
|
}) => void;
|
|
91
112
|
hubBaseUrl?: string;
|
|
92
113
|
dtype?: "f32" | "bf16";
|
|
93
114
|
maxContext?: number;
|
|
94
115
|
/**
|
|
95
116
|
* The WebGPU tier's weight storage: `"auto"` (the default) stores the block GEMM weights f16 when
|
|
96
|
-
* the adapter has `shader-f16`, `"f32"` keeps them f32 on any adapter
|
|
117
|
+
* the adapter has `shader-f16`, `"f32"` keeps them f32 on any adapter; a quantized alias's weights
|
|
118
|
+
* stay in their blocks, so `"f32"` on one is satisfied and nothing is narrowed. Under `backend: "auto"` a
|
|
97
119
|
* load the wasm tier serves ignores it; an explicit `backend: "wasm"` with `"f32"` is refused.
|
|
98
120
|
*/
|
|
99
121
|
storage?: "auto" | "f32";
|
|
@@ -153,7 +175,7 @@ interface Delta {
|
|
|
153
175
|
/**
|
|
154
176
|
* The host's doctor object, with `source` filled per file: where it came from and whether its digest
|
|
155
177
|
* was checked. `backend` is the tier that runs; `why` is how it was chosen (the probe's reason under
|
|
156
|
-
* `"auto"`, so a fallback to wasm says why -- no adapter, a bf16 request,
|
|
178
|
+
* `"auto"`, so a fallback to wasm says why -- no adapter, a bf16 request, or
|
|
157
179
|
* `webgpu refused: …` when the WebGPU precheck or device open refused a load the wasm tier then served).
|
|
158
180
|
* `aliases` is every alias this build loads, each with its file format.
|
|
159
181
|
*/
|
|
@@ -178,9 +200,37 @@ interface AssetSource {
|
|
|
178
200
|
type GenerateOptions = GenerationOptions & {
|
|
179
201
|
signal?: AbortSignal;
|
|
180
202
|
};
|
|
203
|
+
/**
|
|
204
|
+
* What `Caldrix.check` takes: the options that decide the tier and the files the check reads, and
|
|
205
|
+
* `assets`, so the check starts the same worker and `.wasm` (and the same fallback rule) as the load.
|
|
206
|
+
*/
|
|
207
|
+
type CheckOptions = Pick<LoadOptions, "backend" | "dtype" | "maxContext" | "storage" | "hubBaseUrl" | "signal" | "assets">;
|
|
208
|
+
/**
|
|
209
|
+
* `Caldrix.check`'s answer: the tier a load of the model would end on in this tab, or why it would be
|
|
210
|
+
* refused. `kind: "fetch"` (a file could not be fetched, or the check was aborted) leaves it unknown.
|
|
211
|
+
*/
|
|
212
|
+
type CheckResult = {
|
|
213
|
+
ok: true;
|
|
214
|
+
backend: "webgpu" | "wasm";
|
|
215
|
+
} | {
|
|
216
|
+
ok: false;
|
|
217
|
+
kind: Kind;
|
|
218
|
+
message: string;
|
|
219
|
+
};
|
|
181
220
|
declare class Caldrix {
|
|
182
|
-
/** Load a model
|
|
183
|
-
static load(
|
|
221
|
+
/** Load a model, a built-in alias or a Hub repo id (`owner/name[@revision]`), into its own worker. */
|
|
222
|
+
static load(model: string, opts?: LoadOptions): Promise<Engine>;
|
|
223
|
+
/**
|
|
224
|
+
* Which tier a load of `model` would end on in this tab, or why it would be refused, without
|
|
225
|
+
* loading it: the same option checks, probe and tier choice as `load`, then the worker runs the
|
|
226
|
+
* load only until its tier is settled (the Hub listing for a repo id, and for a LoRA adapter repo
|
|
227
|
+
* its `adapter_config.json` and its base's listing; `config.json` and the safetensors index, or a
|
|
228
|
+
* GGUF alias's header range; the precheck; on WebGPU the device open, destroyed again). It fetches
|
|
229
|
+
* no tokenizer file and no weight. `assets` starts the same worker and `.wasm` the load would.
|
|
230
|
+
* Never rejects: every refusal is `{ ok: false, kind, message }`, and an abort is `kind: "fetch"`,
|
|
231
|
+
* the answer unknown.
|
|
232
|
+
*/
|
|
233
|
+
static check(model: string, opts?: CheckOptions): Promise<CheckResult>;
|
|
184
234
|
}
|
|
185
235
|
declare class Engine {
|
|
186
236
|
#private;
|
|
@@ -249,4 +299,4 @@ interface Capabilities {
|
|
|
249
299
|
}
|
|
250
300
|
declare function probe(): Promise<Capabilities>;
|
|
251
301
|
|
|
252
|
-
export { type AssetSource, Caldrix, CaldrixError, type Capabilities, type ChatMessage, type Delta, type DoctorReport, Engine, type GenerateOptions, type GenerationOptions, type Kind, type LoadOptions, probe };
|
|
302
|
+
export { type AssetSource, Caldrix, CaldrixError, type Capabilities, type ChatMessage, type CheckOptions, type CheckResult, type Delta, type DoctorReport, Engine, type GenerateOptions, type GenerationOptions, type Kind, type LoadOptions, probe };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as J,b as i,d as H}from"./chunk-PZGTLL5H.js";function v(e){return typeof e=="object"&&e!==null}function se(e){return v(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>v(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function ae(e){return!v(e)||typeof e.url!="string"?!1:e.failed===void 0||v(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function L(e){if(!v(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return ae(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number");case"loaded":return v(e.doctor)&&v(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>v(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"delta":return se(e.delta);case"result":return"value"in e;case"error":return J(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function m(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var x=(...e)=>new Uint8Array(e),ie={simd:x(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:x(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:x(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:x(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:x(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:x(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:x(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function X(){let e={};for(let[t,r]of Object.entries(ie))e[t]=WebAssembly.validate(r);return e}var le=1e3,E=Symbol("timed out");async function K(e){let t,r=new Promise(n=>{t=setTimeout(()=>n(E),le)});try{return await Promise.race([e,r])}finally{clearTimeout(t)}}var z=e=>e instanceof Error?e.message:String(e);function V(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function D(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ue(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let r=t,n=r.getContext("webgl2"),o=n??r.getContext("webgl");if(!o)return e;let s=D(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(n?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:s,floatColorBuffer:l}}catch{return e}}async function de(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let r={},n=[];if(e.limits)for(let o in e.limits){let s=e.limits[o];typeof s=="number"?(r[o]=s,Number.isSafeInteger(s)||n.push(`${o} = ${s} (not a safe integer)`)):typeof s!="function"&&n.push(`${o} = ${JSON.stringify(s)??String(s)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:r,unrepresentable:n}}async function ce(){let e=V().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let n=await K(e.requestAdapter());if(n===E)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=n}catch(n){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${z(n)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let r=await de(t);try{let n=await K(t.requestDevice());if(n===E)return{webgpu:r,available:!1,reason:"requestDevice timed out"};n.destroy?.()}catch(n){return{webgpu:r,available:!1,reason:`requestDevice refused: ${z(n)}`}}return{webgpu:r,available:!0}}function fe(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function pe(e,t,r){let n=e.webgpu?.unrepresentable??[],o=n.length>0?`; adapter limits ${n.join(", ")}: the host reads them as missing`:"";return be(e,t,r)+o}function be(e,t,r){if(r==="webgpu"){let o=e.webgpu,s=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${s}: webgpu`}let n=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${n}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${n}`}async function G(){let e=V(),t=await ce(),r={wasm:X(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:D(e.hardwareConcurrency)},webgl:ue(),webgpu:t.webgpu,memory:{deviceMemoryGiB:D(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};r.tiers.webgl.available=r.webgl.available;let n=fe(r.tiers);return{...r,chosen:n,why:pe(r,t,n)}}function Q(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,r])=>Number.isSafeInteger(r)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var me="https://huggingface.co";function ge(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var he="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.2.0/";function Y(e){return e instanceof Error?e.message:String(e)}function P(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function we(e,t){let r=I(e,t),n=null,o=()=>{n!==null&&URL.revokeObjectURL(n),n=null};try{return!r&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:r?(n=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(n,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(s){throw o(),s}}function ye(e){return typeof location<"u"&&e.origin!==location.origin}function I(e,t){return ye(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function q(e){return!e.chosen&&!I(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${I(e.url,e.chosen)?" (through a same-origin shim)":""}`}var C=class{constructor(t){this.reason=t}reason};function ke(e,t,r){return new Promise((n,o)=>{let s;try{s=we(e.url,e.chosen)}catch(d){o(new C(`the page could not construct it: ${Y(d)}`));return}let{worker:l,revoke:f}=s,b=()=>u(r()),u=(d,a=e.url)=>{if(f(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",b),d===null)return n({worker:l,url:a});l.terminate(),o(d)};t?.addEventListener("abort",b,{once:!0}),l.onerror=d=>u(new C(d.message||"it did not load")),l.onmessage=d=>{let a=d.data;if(!L(a)||a.id!==0)return u(m(a));if(a.type==="ready")return s.literal?URL.canParse(a.url)?u(null,new URL(a.url)):u(m(a)):u(null);if(a.type==="error")return u(new C(a.message));u(m(a))}})}async function ve(e,t,r,n){let o=[];for(let u of e)try{let{worker:d,url:a}=await ke(u,r,n),g=o[0];return{worker:d,used:u,url:a,...g!==void 0?{failed:{what:q(g.t),reason:g.reason}}:{}}}catch(d){if(!(d instanceof C))throw d;o.push({t:u,reason:d.reason})}let[s,l]=o;if(s!==void 0&&l!==void 0){let u=l.t.url.origin;throw new i("backend",`${q(s.t)} did not start (${s.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${u} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${u} for the modules it imports, connect-src ${u} for the .wasm)`)}let f=s,b=t&&f.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${q(f.t)} did not start: ${f.reason}${b}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function We(e,t,r){let n=r!==void 0?`, and with it the host .wasm from ${r}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${n}`}function xe(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function Z(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function Re(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}var M=class{static async load(t,r={}){let n=r.backend??"auto";if(n==="webgl")throw new i("backend","the webgl backend is not built");if(n!=="auto"&&n!=="webgpu"&&n!=="wasm")throw new i("request",`backend ${JSON.stringify(n)} is not auto, webgpu, wasm or webgl`);if(typeof t!="string"||t==="")throw new i("request","load takes a model alias, a non-empty string");let o=P("worker",r.assets?.worker),s=P("hostWasm",r.assets?.hostWasm),l=r.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let f=P("cdn",r.assets?.cdn)??new URL(he);f.pathname.endsWith("/")||(f.pathname+="/");let b=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ge(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&b.push({url:new URL("dist/worker.js",f),chosen:!0,source:"cdn"});let u=l&&s===void 0?new URL("host/caldrix_web_bg.wasm",f).href:void 0,d=r.storage??"auto";if(d!=="auto"&&d!=="f32")throw new i("request",`storage ${JSON.stringify(d)} is not auto or f32`);if(n==="wasm"&&d==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);let a=()=>new i("fetch",`loading ${t} was aborted`),g=r.signal;if(g?.aborted)throw a();let p=await G(),W,T;if(n==="auto"&&r.dtype==="bf16"&&p.chosen==="webgpu")W="wasm",T=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${p.why}`;else if(n==="auto")W=p.chosen,T=p.why;else if(n==="webgpu"){if(!p.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${p.tiers.webgpu.reason??p.why}`);W="webgpu",T=`backend "webgpu" asked for; ${p.why}`}else W="wasm",T=`backend "wasm" asked for; ${p.why}`;let B=p.webgpu?.unrepresentable??[];if(g?.aborted)throw a();let $=await ve(b,!l,g,a),{worker:y}=$,O=$.url,R=null;$.failed!==void 0&&(R=We($.failed,O.href,s===void 0?u:void 0),Z(R));let F=U=>R===null?U:new i(U.kind,`${U.message} (after a CDN fallback: ${R})`,U.missing);if(g?.aborted)throw y.terminate(),F(a());let _=1,ee={id:_,type:"load",alias:t,probeJson:Q(p),request:{backend:W,...r.dtype!==void 0?{dtype:r.dtype}:{},...r.maxContext!==void 0?{maxContext:r.maxContext}:{},...W==="webgpu"&&d==="f32"?{f16:!1}:{}},...n==="auto"&&W==="webgpu"?{auto:!0}:{},offline:r.offline??!1,hubBaseUrl:r.hubBaseUrl??me,...s!==void 0?{hostWasm:s.href}:{},...u!==void 0?{cdnWasm:u}:{}};return new Promise((U,te)=>{let j=()=>k(a()),N=()=>{y.onmessage=null,y.onerror=null,g?.removeEventListener("abort",j)},k=A=>{N(),y.terminate(),te(F(A))},h=null;g?.addEventListener("abort",j,{once:!0}),y.onerror=A=>k(new i("backend",`the engine's worker from ${O.href} failed: ${A.message||"it did not start"}`)),y.onmessage=A=>{let c=A.data;if(!L(c)||c.id!==_)return k(m(c));switch(c.type){case"host":if(h!==null)return k(m(c));h=c.hostWasm,h.failed!==void 0&&(R=xe({...h,failed:h.failed}),Z(R));return;case"progress":try{r.onProgress?.({file:c.file,loaded:c.loaded,total:c.total})}catch(w){k(w instanceof i?w:new i("request",`onProgress threw: ${Y(w)}`))}return;case"loaded":{if(h===null)return k(m(c));N();let w=$.used.source,re=s!==void 0||w==="page"&&h.failed===void 0?"page":h.failed!==void 0||w==="cdn"?"cdn":"bundle",ne={worker:{source:w,url:O.href},hostWasm:{source:re,url:h.url}},oe={...c.doctor,source:c.sources,why:c.fallback!==void 0?`${c.fallback}; ${p.why}`:T,assets:ne};U(new S(y,oe));return}case"error":{let w=c.kind==="probe"&&B.length>0?`; the browser gave ${B.join(", ")}, which the host reads as missing`:"";return k(new i(c.kind,c.message+w))}default:return k(m(c))}},y.postMessage(ee)})}},S=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,r){this.#r=t,this.#n=r,t.onmessage=n=>this.#d(n.data),t.onerror=n=>this.#a(new i("backend",`the engine's worker failed: ${n.message||"it stopped"}`))}chat(t,r={}){return this.#s(),this.#u({messages:t},r)}complete(t,r={}){this.#s();let n;if(typeof t=="string")n={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");n={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(n,r)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([s,l])=>[s,{...l}])),{worker:r,hostWasm:n}=this.#n.assets,o=this.#n.aliases.map(s=>({...s}));return{...this.#n,source:t,aliases:o,assets:{worker:{...r},hostWasm:{...n}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!L(t))return this.#a(m(t));let r=this.#o;if(r===null||t.id!==r.id)return this.#a(m(t));switch(t.type){case"delta":return r.sink(Re(t.delta));case"error":return t.fatal!==void 0&&(this.#e=H(t.fatal)),r.sink(new i(t.kind,t.message));default:return this.#a(m(t))}}async*#u(t,r){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:n,...o}=r;if(n?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let s=this.#l++,l=[],f=null;this.#o={id:s,sink:a=>{l.push(a),f?.()}};let b=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:s,type:"abort"})},u=!1,d=async()=>{for(;l.length===0;)await new Promise(a=>f=a);return f=null,l.shift()};try{for(this.#r.postMessage({id:s,type:"generate",prompt:t,options:o}),n?.addEventListener("abort",b,{once:!0});;){let a=await d();if(a instanceof i)throw u=!0,a;if(a.done&&(u=!0),yield a,a.done)return}}finally{if(n?.removeEventListener("abort",b),!u)try{for(b();!(this.#t||this.#e);){let a=await d();if(a instanceof i||a.done)break}}catch{}this.#o=null,this.#i=!1}}};export{M as Caldrix,i as CaldrixError,S as Engine,G as probe};
|
|
1
|
+
import{a as F,b as i,d as _}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function V(e){return W(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>W(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function Q(e){return!W(e)||typeof e.url!="string"?!1:e.failed===void 0||W(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function L(e){if(!W(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return Q(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number")&&typeof e.repo=="string"&&typeof e.revision=="string"&&(e.provenance===void 0||typeof e.provenance=="string");case"loaded":return W(e.doctor)&&W(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>W(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"checked":return e.backend==="webgpu"||e.backend==="wasm";case"delta":return V(e.delta);case"result":return"value"in e;case"error":return F(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function w(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var C=(...e)=>new Uint8Array(e),Z={simd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:C(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function j(){let e={};for(let[t,n]of Object.entries(Z))e[t]=WebAssembly.validate(n);return e}var Y=1e3,S=Symbol("timed out");async function N(e){let t,n=new Promise(r=>{t=setTimeout(()=>r(S),Y)});try{return await Promise.race([e,n])}finally{clearTimeout(t)}}var J=e=>e instanceof Error?e.message:String(e);function H(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function E(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ee(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let n=t,r=n.getContext("webgl2"),o=r??n.getContext("webgl");if(!o)return e;let a=E(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(r?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:a,floatColorBuffer:l}}catch{return e}}async function te(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let n={},r=[];if(e.limits)for(let o in e.limits){let a=e.limits[o];typeof a=="number"?(n[o]=a,Number.isSafeInteger(a)||r.push(`${o} = ${a} (not a safe integer)`)):typeof a!="function"&&r.push(`${o} = ${JSON.stringify(a)??String(a)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:n,unrepresentable:r}}async function re(){let e=H().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let r=await N(e.requestAdapter());if(r===S)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=r}catch(r){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${J(r)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let n=await te(t);try{let r=await N(t.requestDevice());if(r===S)return{webgpu:n,available:!1,reason:"requestDevice timed out"};r.destroy?.()}catch(r){return{webgpu:n,available:!1,reason:`requestDevice refused: ${J(r)}`}}return{webgpu:n,available:!0}}function ne(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function oe(e,t,n){let r=e.webgpu?.unrepresentable??[],o=r.length>0?`; adapter limits ${r.join(", ")}: the host reads them as missing`:"";return se(e,t,n)+o}function se(e,t,n){if(n==="webgpu"){let o=e.webgpu,a=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${a}: webgpu`}let r=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${r}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${r}`}async function O(){let e=H(),t=await re(),n={wasm:j(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:E(e.hardwareConcurrency)},webgl:ee(),webgpu:t.webgpu,memory:{deviceMemoryGiB:E(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};n.tiers.webgl.available=n.webgl.available;let r=ne(n.tiers);return{...n,chosen:r,why:oe(n,t,r)}}function K(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,n])=>Number.isSafeInteger(n)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var ae="https://huggingface.co";function ie(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var le="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.4.0/";function I(e){return e instanceof Error?e.message:String(e)}function D(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function ue(e,t){let n=G(e,t),r=null,o=()=>{r!==null&&URL.revokeObjectURL(r),r=null};try{return!n&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:n?(r=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(r,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(a){throw o(),a}}function de(e){return typeof location<"u"&&e.origin!==location.origin}function G(e,t){return de(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function P(e){return!e.chosen&&!G(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${G(e.url,e.chosen)?" (through a same-origin shim)":""}`}var U=class{constructor(t){this.reason=t}reason};function ce(e,t,n){return new Promise((r,o)=>{let a;try{a=ue(e.url,e.chosen)}catch(c){o(new U(`the page could not construct it: ${I(c)}`));return}let{worker:l,revoke:m}=a,u=()=>d(n()),d=(c,s=e.url)=>{if(m(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",u),c===null)return r({worker:l,url:s});l.terminate(),o(c)};t?.addEventListener("abort",u,{once:!0}),l.onerror=c=>d(new U(c.message||"it did not load")),l.onmessage=c=>{let s=c.data;if(!L(s)||s.id!==0)return d(w(s));if(s.type==="ready")return a.literal?URL.canParse(s.url)?d(null,new URL(s.url)):d(w(s)):d(null);if(s.type==="error")return d(new U(s.message));d(w(s))}})}async function fe(e,t,n,r){let o=[];for(let d of e)try{let{worker:c,url:s}=await ce(d,n,r),b=o[0];return{worker:c,used:d,url:s,...b!==void 0?{failed:{what:P(b.t),reason:b.reason}}:{}}}catch(c){if(!(c instanceof U))throw c;o.push({t:d,reason:c.reason})}let[a,l]=o;if(a!==void 0&&l!==void 0){let d=l.t.url.origin;throw new i("backend",`${P(a.t)} did not start (${a.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${d} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${d} for the modules it imports, connect-src ${d} for the .wasm)`)}let m=a,u=t&&m.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${P(m.t)} did not start: ${m.reason}${u}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function pe(e,t,n){let r=n!==void 0?`, and with it the host .wasm from ${n}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${r}`}function be(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function X(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function me(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}async function z(e,t,n){let r=t.backend??"auto";if(r==="webgl")throw new i("backend","the webgl backend is not built");if(r!=="auto"&&r!=="webgpu"&&r!=="wasm")throw new i("request",`backend ${JSON.stringify(r)} is not auto, webgpu, wasm or webgl`);if(typeof e!="string"||e==="")throw new i("request","load takes a model alias or a Hub repo id (owner/name[@revision]), a non-empty string");let o=D("worker",t.assets?.worker),a=D("hostWasm",t.assets?.hostWasm),l=t.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let m=D("cdn",t.assets?.cdn)??new URL(le);m.pathname.endsWith("/")||(m.pathname+="/");let u=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ie(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&u.push({url:new URL("dist/worker.js",m),chosen:!0,source:"cdn"});let d=l&&a===void 0?new URL("host/caldrix_web_bg.wasm",m).href:void 0,c=t.storage??"auto";if(c!=="auto"&&c!=="f32")throw new i("request",`storage ${JSON.stringify(c)} is not auto or f32`);if(r==="wasm"&&c==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);if(t.hubBaseUrl!==void 0){let h=t.hubBaseUrl,x=!1;if(typeof h=="string")try{let M=new URL(h);x=M.protocol==="http:"||M.protocol==="https:"}catch{x=!1}if(!x)throw new i("request",`hubBaseUrl must be an absolute http(s) URL, not ${JSON.stringify(h).slice(0,80)}`)}let s=()=>new i("fetch",`${n?"checking":"loading"} ${e} was aborted`),b=t.signal;if(b?.aborted)throw s();let f=await O(),g,v;if(r==="auto"&&t.dtype==="bf16"&&f.chosen==="webgpu")g="wasm",v=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${f.why}`;else if(r==="auto")g=f.chosen,v=f.why;else if(r==="webgpu"){if(!f.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${f.tiers.webgpu.reason??f.why}`);g="webgpu",v=`backend "webgpu" asked for; ${f.why}`}else g="wasm",v=`backend "wasm" asked for; ${f.why}`;let p=f.webgpu?.unrepresentable??[];if(b?.aborted)throw s();let k=await fe(u,!l,b,s),{worker:R}=k,$=k.url,A={id:1,type:"load",model:e,probeJson:K(f),request:{backend:g,...t.dtype!==void 0?{dtype:t.dtype}:{},...t.maxContext!==void 0?{maxContext:t.maxContext}:{},...g==="webgpu"&&c==="f32"?{f16:!1}:{}},...r==="auto"&&g==="webgpu"?{auto:!0}:{},...n?{check:!0}:{},offline:t.offline??!1,hubBaseUrl:t.hubBaseUrl??ae,...a!==void 0?{hostWasm:a.href}:{},...d!==void 0?{cdnWasm:d}:{}},y={worker:R,used:k.used,workerUrl:$,caps:f,why:v,hostWasm:a,request:A,signal:b,aborted:s,fellBack:null,wasm:null,noted:h=>y.fellBack===null?h:new i(h.kind,`${h.message} (after a CDN fallback: ${y.fellBack})`,h.missing),host:h=>y.wasm!==null?!1:(y.wasm=h,h.failed!==void 0&&(y.fellBack=be({...h,failed:h.failed}),X(y.fellBack)),!0),workerError:h=>{let x=h.kind==="probe"&&p.length>0?`; the browser gave ${p.join(", ")}, which the host reads as missing`:"";return new i(h.kind,h.message+x)}};if(k.failed!==void 0&&(y.fellBack=pe(k.failed,$.href,a===void 0?d:void 0),X(y.fellBack)),b?.aborted)throw R.terminate(),y.noted(s());return y}function B(e){return e instanceof i?{ok:!1,kind:e.kind,message:e.message}:{ok:!1,kind:"backend",message:I(e)}}var q=class{static async load(t,n={}){let r=await z(t,n,!1),{worker:o,workerUrl:a,signal:l,request:m,hostWasm:u,caps:d}=r;return new Promise((c,s)=>{let b=()=>g(r.aborted()),f=()=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",b)},g=v=>{f(),o.terminate(),s(r.noted(v))};if(l?.addEventListener("abort",b,{once:!0}),l?.aborted)return g(r.aborted());o.onerror=v=>g(new i("backend",`the engine's worker from ${a.href} failed: ${v.message||"it did not start"}`)),o.onmessage=v=>{let p=v.data;if(!L(p)||p.id!==m.id)return g(w(p));switch(p.type){case"host":return r.host(p.hostWasm)?void 0:g(w(p));case"progress":try{n.onProgress?.({file:p.file,loaded:p.loaded,total:p.total,repo:p.repo,revision:p.revision,...p.provenance!==void 0?{provenance:p.provenance}:{}})}catch(k){g(k instanceof i?k:new i("request",`onProgress threw: ${I(k)}`))}return;case"loaded":{let k=r.wasm;if(k===null)return g(w(p));f();let R=r.used.source,$=u!==void 0||R==="page"&&k.failed===void 0?"page":k.failed!==void 0||R==="cdn"?"cdn":"bundle",A={worker:{source:R,url:a.href},hostWasm:{source:$,url:k.url}},y={...p.doctor,source:p.sources,why:p.fallback!==void 0?`${p.fallback}; ${d.why}`:r.why,assets:A};c(new T(o,y));return}case"error":return g(r.workerError(p));default:return g(w(p))}},o.postMessage(m)})}static async check(t,n={}){let r;try{let u=n??{};r=await z(t,{...u.backend!==void 0?{backend:u.backend}:{},...u.dtype!==void 0?{dtype:u.dtype}:{},...u.maxContext!==void 0?{maxContext:u.maxContext}:{},...u.storage!==void 0?{storage:u.storage}:{},...u.hubBaseUrl!==void 0?{hubBaseUrl:u.hubBaseUrl}:{},...u.signal!==void 0?{signal:u.signal}:{},...u.assets!==void 0?{assets:u.assets}:{}},!0)}catch(u){return B(u)}let{worker:o,workerUrl:a,signal:l,request:m}=r;return new Promise(u=>{let d=()=>s(r.aborted()),c=b=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",d),o.terminate(),u(b)},s=b=>c(B(r.noted(b)));if(l?.addEventListener("abort",d,{once:!0}),l?.aborted)return s(r.aborted());o.onerror=b=>s(new i("backend",`the engine's worker from ${a.href} failed: ${b.message||"it did not start"}`)),o.onmessage=b=>{let f=b.data;if(!L(f)||f.id!==m.id)return s(w(f));switch(f.type){case"host":return r.host(f.hostWasm)?void 0:s(w(f));case"progress":return;case"checked":return r.wasm===null?s(w(f)):c({ok:!0,backend:f.backend});case"error":return s(r.workerError(f));default:return s(w(f))}};try{o.postMessage(m)}catch(b){c(B(b))}})}},T=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,n){this.#r=t,this.#n=n,t.onmessage=r=>this.#d(r.data),t.onerror=r=>this.#a(new i("backend",`the engine's worker failed: ${r.message||"it stopped"}`))}chat(t,n={}){return this.#s(),this.#u({messages:t},n)}complete(t,n={}){this.#s();let r;if(typeof t=="string")r={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");r={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(r,n)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([a,l])=>[a,{...l}])),{worker:n,hostWasm:r}=this.#n.assets,o=this.#n.aliases.map(a=>({...a}));return{...this.#n,source:t,aliases:o,assets:{worker:{...n},hostWasm:{...r}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!L(t))return this.#a(w(t));let n=this.#o;if(n===null||t.id!==n.id)return this.#a(w(t));switch(t.type){case"delta":return n.sink(me(t.delta));case"error":return t.fatal!==void 0&&(this.#e=_(t.fatal)),n.sink(new i(t.kind,t.message));default:return this.#a(w(t))}}async*#u(t,n){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:r,...o}=n;if(r?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let a=this.#l++,l=[],m=null;this.#o={id:a,sink:s=>{l.push(s),m?.()}};let u=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:a,type:"abort"})},d=!1,c=async()=>{for(;l.length===0;)await new Promise(s=>m=s);return m=null,l.shift()};try{for(this.#r.postMessage({id:a,type:"generate",prompt:t,options:o}),r?.addEventListener("abort",u,{once:!0});;){let s=await c();if(s instanceof i)throw d=!0,s;if(s.done&&(d=!0),yield s,s.done)return}}finally{if(r?.removeEventListener("abort",u),!d)try{for(u();!(this.#t||this.#e);){let s=await c();if(s instanceof i||s.done)break}}catch{}this.#o=null,this.#i=!1}}};export{q as Caldrix,i as CaldrixError,T as Engine,O as probe};
|
package/dist/worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as c,c as E,d as N}from"./chunk-PZGTLL5H.js";var ke="caldrix.js",ee="x-caldrix-verified",J="x-caldrix-absent";function xe(n){return[...new Uint8Array(n)].map(r=>r.toString(16).padStart(2,"0")).join("")}function ve(n){return n.trim().replace(/^W\//,"").replace(/^"|"$/g,"").toLowerCase()}function R(n){return n instanceof Error?n.message:String(n)}function I(n,r){if(r===""||r==="."||r===".."||/[/\\?#]/.test(r)||/%[0-9a-fA-F]{2}/.test(r)||/[\u0000-\u001f\u007f]/.test(r))throw new c("validate",`${n} ${JSON.stringify(r)} is not a single safe path segment`);return encodeURIComponent(r)}function te(n){return new c("backend",`${n} is not available; caldrix.js needs a secure context`)}function re(n,r,s,e){let t=n.split("/").map(u=>I("repo",u)).join("/");return`${e.endsWith("/")?e.slice(0,-1):e}/${t}/resolve/${I("revision",r)}/${I("file",s)}`}async function ne(n){if(typeof caches>"u")throw te("caches");try{return await caches.open(ke)}catch(r){throw new c("backend",`opening the cache for ${n} failed: ${R(r)}`)}}async function z(n){if(typeof crypto>"u"||!crypto.subtle)throw te("crypto.subtle");return xe(await crypto.subtle.digest("SHA-256",n))}function se(n){return new c("fetch",`${n} is not in the cache and offline is set`,"offline-uncached")}async function oe(n,r,s,e){let t=re(n,r,s,e.hubBaseUrl),i=await ne(s),u;try{u=await i.match(t)}catch(w){throw new c("backend",`reading ${s} from the cache failed: ${R(w)}`)}let a=w=>new c("fetch",`fetching ${s} failed: HTTP 404${w}`,"not-found");if(u&&u.headers.get(J)==="1"){if(e.rememberAbsent)throw a(" (remembered from an earlier load)");u=void 0}let l=!1;if(u){let w=new Uint8Array(await u.arrayBuffer());if(e.sha256===void 0)return{bytes:w,source:"cache",verified:u.headers.get(ee)==="1",cached:!0};if(await z(w)===e.sha256)return{bytes:w,source:"cache",verified:!0,cached:!0};l=!0;try{await i.delete(t)}catch{}}if(e.offline&&l)throw new c("fetch",`${s}: the cached copy fails the alias's sha256 pin and offline is set`,"offline-uncached");if(e.offline)throw se(s);let f=(w,S)=>new c("fetch",`fetching ${s} ${w}`,S),y=()=>{if(e.signal?.aborted)throw f("was aborted")},m;try{m=await fetch(t,{signal:e.signal})}catch(w){throw f(e.signal?.aborted?"was aborted":`failed: ${R(w)}`)}if(m.status===404&&e.rememberAbsent){try{await i.put(t,new Response(null,{headers:{[J]:"1"}}))}catch{}throw a("")}if(!m.ok||!m.body)throw f(`failed: HTTP ${m.status}`,m.status===404?"not-found":void 0);let x=m.headers.get("x-linked-etag"),p=m.headers.get("content-length"),o=p!==null&&/^\d+$/.test(p.trim())?Number(p):null,d=[],b=0,h=m.body.getReader();try{for(;;){let w;try{w=await h.read()}catch(S){throw f(e.signal?.aborted?"was aborted":`failed: ${R(S)}`)}if(w.done)break;if(d.push(w.value),b+=w.value.byteLength,e.bytes!==void 0&&b>e.bytes)throw new c("fetch",`${s}: the body passed the alias's ${e.bytes} bytes`);e.onProgress?.({file:s,loaded:b,total:o})}}finally{h.cancel().catch(()=>{})}if(y(),o!==null&&o!==b&&!m.headers.get("content-encoding"))throw f(`failed: Content-Length is ${o} but ${b} bytes arrived`);let g=new Uint8Array(b),W=0;for(let w of d)g.set(w,W),W+=w.byteLength;e.onProgress?.({file:s,loaded:b,total:o});let A=!1,G=null;if(e.sha256!==void 0){if(G=await z(g),G!==e.sha256)throw new c("digest",`${s}: sha256 is ${G} but the alias pins ${e.sha256}`);A=!0}if(x!==null){let w=ve(x);if(G??=await z(g),w!==G)throw new c("digest",`${s}: sha256 is ${G} but the Hub's X-Linked-Etag is ${w}`);A=!0}y();try{await i.put(t,new Response(g,{headers:{[ee]:A?"1":"0"}}))}catch{return{bytes:g,source:"network",verified:A,cached:!1}}return{bytes:g,source:"network",verified:A,cached:!0}}async function ie(n,r,s,e,t){if(!Number.isSafeInteger(e)||e<=0)throw new c("request",`a range of ${e} bytes of ${s} is not a positive integer`);let i=re(n,r,s,t.hubBaseUrl),u=await ne(s),a;try{a=await u.match(i)}catch(p){throw new c("backend",`reading ${s} from the cache failed: ${R(p)}`)}if(a&&a.headers.get(J)!=="1"){let p=new Uint8Array(await a.arrayBuffer());if(p.byteLength>=e)return p.slice(0,e)}if(t.offline)throw se(s);let l=p=>new c("fetch",`fetching the first ${e} bytes of ${s} ${p}`),f;try{f=await fetch(i,{headers:{Range:`bytes=0-${e-1}`},signal:t.signal})}catch(p){throw l(t.signal?.aborted?"was aborted":`failed: ${R(p)}`)}if(f.status!==206&&f.status!==200||!f.body)throw l(`failed: HTTP ${f.status}`);let y=new Uint8Array(e),m=0,x=f.body.getReader();try{for(;;){let p;try{p=await x.read()}catch(d){throw l(t.signal?.aborted?"was aborted":`failed: ${R(d)}`)}if(p.done)break;let o=Math.min(p.value.byteLength,e-m);if(y.set(p.value.subarray(0,o),m),m+=p.value.byteLength,m>e||f.status===200&&m===e)break}}finally{x.cancel().catch(()=>{})}if(t.signal?.aborted)throw l("was aborted");if(m<e)throw l(`failed: the HTTP ${f.status} answer carried ${m} bytes, not the ${e} asked for`);if(f.status===206&&m>e)throw l(`failed: the HTTP 206 answer carried more than the ${e} bytes asked for`);return y}var j=null,T=null;function Y(n){return n instanceof Error?n.message:String(n)}async function K(){return await import("../host/caldrix_web.js")}function Pe(n){let r=globalThis.location?.href;return(r!==void 0?new URL(String(n),r):new URL(String(n))).href}async function ae(n){let r;try{r=await fetch(n)}catch(s){throw new Error(Y(s))}if(!r.ok)throw new Error(`${r.status} ${r.statusText}`.trim());return r}async function Q(n,r){if(j===null){let s=await K(),e=n??Pe(new URL("../host/caldrix_web_bg.wasm",import.meta.url)),t,i;try{t=await ae(e),i={url:e}}catch(u){let a=Y(u);if(r===void 0||r===e)throw new c("backend",`the browser host's .wasm could not be fetched from ${e} (${a}); serve host/ beside dist/ or set assets.hostWasm to where the page serves it`);try{t=await ae(r)}catch(l){let f=new URL(r).origin;throw new c("backend",`the browser host's .wasm could not be fetched from ${e} (${a}) nor from the CDN fallback ${r} (${Y(l)}); serve host/ beside dist/, set assets.hostWasm to where the page serves it, or allow ${f} in the page's Content-Security-Policy (connect-src ${f}, the .wasm is fetched)`)}i={url:r,failed:{url:e,reason:a}}}await s.default({module_or_path:t}),j=s,T=i}return j}async function ue(n,r,s){let e=await Q(r,s);return new e.CaldrixWeb(n)}function le(){if(T===null)throw new c("backend","the browser host is not open");return{...T,...T.failed!==void 0?{failed:{...T.failed}}:{}}}async function ce(){return(await Q()).CaldrixWeb}async function fe(n,r){let s=await Q(),e;try{let{instance:u}=await WebAssembly.instantiate(r,{env:{memory:s.CaldrixWeb.memory()}});e=u.exports}catch(u){throw new c("backend",`instantiating the emitted module failed: ${u instanceof Error?u.message:String(u)}`)}let{step:t,prefill:i}=e;if(typeof t!="function"||typeof i!="function")throw new c("backend","the emitted module does not export step and prefill");if(n.attach(t,i),n.argsPtr()===0)throw new c("backend","the host reports no model loaded after load")}var B={MAP_READ:1,COPY_SRC:4,COPY_DST:8,UNIFORM:64,STORAGE:128},$e=1,We=["maxStorageBufferBindingSize","maxBufferSize","maxComputeWorkgroupsPerDimension","maxStorageBuffersPerShaderStage"],de=(n,r)=>Number.isSafeInteger(n)&&n>=0&&n<r,pe=n=>Number.isSafeInteger(n)&&n>=0;function Ae(n,r){let s=t=>new c("backend",`the host's WebGPU program is malformed: ${t}`),e;try{e=JSON.parse(n)}catch(t){throw s(t instanceof Error?t.message:String(t))}if(typeof e!="object"||e===null||!Array.isArray(e.kernels)||!Array.isArray(e.buffers))throw s("no kernels or buffers");if(e.kernels.forEach((t,i)=>{if(!(typeof t?.symbol=="string"&&typeof t.entry=="string"&&Array.isArray(t.buffers)&&t.buffers.every(a=>a==="f32"||a==="f16")&&pe(t.scalars)))throw s(`kernel ${i}`)}),e.buffers.forEach((t,i)=>{if(!(typeof t?.word=="string"&&pe(t.bytes)&&(t.storage==="f32"||t.storage==="f16")&&typeof t.placed=="boolean"))throw s(`buffer ${i}`)}),!de(e.act,e.buffers.length))throw s("act is no buffer");if(!de(e.logits,e.buffers.length))throw s("logits is no buffer");if(!Array.isArray(r)||r.length!==e.kernels.length||!r.every(t=>typeof t=="string"))throw s(`${e.kernels.length} kernels but ${Array.isArray(r)?r.length:"no"} WGSL sources`);return e}function Ge(n,r){let s=[],e=u=>new c("backend",`the host's launch words are malformed: ${u}`),t=0,i=(u,a)=>{if(t+u>n.length)throw e(`launch ${s.length} ends inside its ${a}`);let l=n.subarray(t,t+u);return t+=u,l};for(;t<n.length;){let u=i(1,"kernel")[0],a=r.kernels[u];if(a===void 0)throw e(`launch ${s.length} names kernel ${u}; the program has ${r.kernels.length}`);let l=Array.from(i(i(1,"buffer count")[0],"buffers"));if(l.length!==a.buffers.length)throw e(`a launch of ${a.symbol} binds ${l.length} buffers; the kernel declares ${a.buffers.length}`);let f=l.find(p=>p>=r.buffers.length);if(f!==void 0)throw e(`a launch of ${a.symbol} binds buffer ${f}; the program has ${r.buffers.length}`);let[y,m]=i(2,"grid"),x=i(i(1,"uniform count")[0],"uniform").slice();if(x.length===0!=(a.scalars===0))throw e(`a launch of ${a.symbol} carries ${x.length} uniform words; the kernel declares ${a.scalars} scalars`);s.push({kernel:u,buffers:l,x:y,y:m,uniform:x})}return s}var D=n=>n instanceof Error?n.message:String(n),V=class{constructor(r,s,e,t,i,u,a,l){this.adapter=r;this.description=s;this.host=e;this.device=t;this.program=i;this.pipelines=u;this.buffers=a;this.staging=l;t.lost.then(f=>{let y=`the WebGPU device was lost: ${f.message||f.reason||"no message"}`;!this.#e&&this.#t===null&&(this.#t=y),this.#r?.(y)})}adapter;description;host;device;program;pipelines;buffers;staging;#t=null;#e=!1;#r=null;#n=new Set;get failure(){return this.#t}get storage(){return this.program.buffers.some(r=>r.storage==="f16")?"f16":"f32"}async run(r,s){if(this.#e)throw new c("request","the WebGPU runtime was destroyed (the engine was disposed)");if(this.failure!==null)throw this.#o(this.failure),N(this.failure);let e;try{e=Ge(r,this.program);let l=this.program.buffers[this.program.act];if(s.byteLength>l.bytes)throw new c("backend",`actIn is ${s.byteLength} bytes; the program's ${l.word} is ${l.bytes}`)}catch(l){throw this.#s(D(l),!1)}let t=this.device,i=[],u,a=new Promise((l,f)=>{this.#r=y=>f(new Error(y))});a.catch(()=>null);try{t.pushErrorScope("validation"),t.pushErrorScope("out-of-memory"),t.pushErrorScope("internal");let l=3,f=async()=>{let o=t.popErrorScope(),d=t.popErrorScope(),b=t.popErrorScope();l=0;let[h,g,W]=await Promise.all([o,d,b]);return g?`out of memory: ${g.message}`:W?`validation: ${W.message}`:h?`an internal error: ${h.message}`:null},y,m;try{s.byteLength>0&&t.queue.writeBuffer(this.buffers[this.program.act],0,s);let o=e.map(g=>{let W=g.buffers.map((A,G)=>({binding:G,resource:{buffer:this.buffers[A]}}));if(g.uniform.length>0){let A=t.createBuffer({size:g.uniform.byteLength,usage:B.UNIFORM|B.COPY_DST});i.push(A),this.#n.add(A),t.queue.writeBuffer(A,0,g.uniform),W.push({binding:g.buffers.length,resource:{buffer:A}})}return t.createBindGroup({layout:this.pipelines[g.kernel].getBindGroupLayout(0),entries:W})}),d=t.createCommandEncoder(),b=d.beginComputePass();e.forEach((g,W)=>{b.setPipeline(this.pipelines[g.kernel]),b.setBindGroup(0,o[W]),b.dispatchWorkgroups(g.x,g.y,1)}),b.end();let h=this.buffers[this.program.logits];d.copyBufferToBuffer(h,0,this.staging,0,h.size),t.queue.submit([d.finish()]),y=f(),m=this.staging.mapAsync($e),y.catch(()=>null),m.catch(()=>null)}finally{for(;l-- >0;)t.popErrorScope().catch(()=>null)}if(this.failure!==null)throw new Error(this.failure);let x=await Promise.race([y,a]);if(this.#e)throw new c("request","the engine was disposed during a WebGPU call");if(x!==null)throw new Error(`the device reported ${x}`);try{await Promise.race([m,a])}catch(o){throw this.#e?new c("request","the engine was disposed during a WebGPU call"):new Error(`mapping the logits readback failed: ${D(o)}`)}if(this.#e)throw new c("request","the engine was disposed during a WebGPU call");let p=this.program.buffers[this.program.logits].bytes;u=new Uint8Array(this.staging.getMappedRange(0,this.staging.size).slice(0,p)),this.staging.unmap()}catch(l){throw l instanceof c&&l.kind==="request"?l:this.#s(D(l))}finally{this.#r=null;for(let l of i)this.#n.delete(l),this.#e||l.destroy()}this.host.writeLogits(u)}#s(r,s=!0){return this.#e?new c("request","the engine was disposed during a WebGPU call"):(s&&(this.#t??=r),this.#o(r)??new c("backend",r))}#o(r){try{this.host.failLaunch(r)}catch(s){let e=E(s);if(e.kind==="backend")return e}return null}destroy(){if(!this.#e){this.#e=!0,this.#r?.("the engine was disposed during a WebGPU call");for(let r of[...this.buffers,this.staging,...this.#n])try{r.destroy()}catch{}this.#n.clear();try{this.device.destroy()}catch{}}}};function Se(n,r){let s=n.limits[r];return typeof s=="number"?s:void 0}function Ee(){return globalThis.navigator?.gpu}async function he(n,r,s=Ee()){let e=f=>new c("backend",f);if(!s)throw e("the worker has no navigator.gpu, though the page's probe found a WebGPU adapter");let t;try{t=await s.requestAdapter()}catch(f){throw e(`the worker's requestAdapter failed: ${D(f)}`)}if(!t)throw e("the worker's requestAdapter returned null, though the page's probe found an adapter");if(r&&!t.features.has("shader-f16"))throw e("the host's precheck chose f16 weight storage, but the worker's adapter has no shader-f16");let i={};for(let f of We){let y=Se(t,f),m=n.webgpu?.limits[f];if(m!==void 0&&(y===void 0||y<m))throw e(`the worker's adapter offers ${f} ${y??"none"}; the host prechecked against the probe's ${m}`);y!==void 0&&(i[f]=y)}let u;try{u=await t.requestDevice({requiredFeatures:r?["shader-f16"]:[],requiredLimits:i})}catch(f){throw e(`requestDevice refused${r?" shader-f16 with":""} the program's limits: ${D(f)}`)}let a=t.info??{};if(!t.info&&typeof t.requestAdapterInfo=="function")try{a=await t.requestAdapterInfo()}catch{a={}}let l=!1;return{device:u,f16:r,adapter:{vendor:a.vendor??"",architecture:a.architecture??""},description:a.description??"",destroy:()=>{if(!l){l=!0;try{u.destroy()}catch{}}}}}async function ge(n,r,s){let e=a=>new c("backend",a),t=r.device,i=[],u=()=>{for(let a of i)a.destroy();r.destroy()};try{let a=Ae(s.program,s.kernels),l=a.buffers.some(x=>x.storage==="f16");if(l!==r.f16)throw e(`the program stores weights ${l?"f16":"f32"}, but the device was opened for ${r.f16?"f16":"f32"} storage`);let f=[];for(let[x,p]of a.kernels.entries()){t.pushErrorScope("validation"),t.pushErrorScope("internal");let o=null,d=null;try{let g=t.createShaderModule({code:s.kernels[x],label:p.symbol});o=t.createComputePipeline({label:p.symbol,layout:"auto",compute:{module:g,entryPoint:p.entry}})}catch(g){d=g}let b=await t.popErrorScope(),h=await t.popErrorScope()??b;if(h)throw e(`kernel ${p.symbol}: creating its pipeline: ${h.message}`);if(o===null)throw e(`kernel ${p.symbol}: creating its pipeline: ${D(d)}`);f.push(o)}for(let[x,p]of a.buffers.entries()){t.pushErrorScope("validation"),t.pushErrorScope("out-of-memory");let o=null;try{let h=t.createBuffer({size:Math.max(4,Math.ceil(p.bytes/4)*4),usage:B.STORAGE|B.COPY_SRC|B.COPY_DST,label:p.word});if(i.push(h),p.placed){let g=n.bufferBytes(x);if(g.byteLength!==p.bytes)throw new c("backend",`buffer ${p.word}: bufferBytes gave ${g.byteLength} bytes; the buffer is ${p.bytes} at ${p.storage} storage`);if(g.byteLength%4!==0)throw new c("backend",`buffer ${p.word}: ${g.byteLength} bytes are not whole 4-byte words`);t.queue.writeBuffer(h,0,g)}}catch(h){o=h}let d=await t.popErrorScope(),b=await t.popErrorScope();if(o!==null)throw o instanceof c?o:E(o);if(d)throw e(`buffer ${p.word} (${p.bytes} bytes): out of memory: ${d.message}`);if(b)throw e(`buffer ${p.word} (${p.bytes} bytes): ${b.message}`)}let y=i[a.logits],m=t.createBuffer({size:y.size,usage:B.MAP_READ|B.COPY_DST,label:"logits readback"});return new V({...r.adapter},r.description,n,t,a,f,i,m)}catch(a){throw u(),a}}var Ce=4194304,Ue="a quantized alias runs on the wasm tier: the WebGPU tier has no quantized kernels in this version",Re=["fit","request","probe"];function be(){return new Promise(n=>{let r=new MessageChannel;r.port1.onmessage=()=>{r.port1.close(),n()},r.port2.postMessage(0)})}async function me(n,r,s){let e,t;try{e=s.kind==="prefill"?n.resolve("prefill",s.n):n.resolve("step",s.pos),t=n.actIn(s.kind==="prefill"?s.n:1)}catch(i){try{n.failLaunch(E(i).message)}catch{}throw i}await r.run(e,t)}async function Be(n,r,s,e){if(await me(n,r,s),!!e.launched())for(n.finishStart();;){if(!await e.between())return;let t=n.beginNext();if("delta"in t){e.delta(JSON.parse(t.delta));return}if(await me(n,r,t.launch),!e.launched())return;let i=JSON.parse(n.finishNext());if(e.delta(i),i.done)return}}function ye(n,r){let s=null,e=null,t=!1,i=null,u=!1,a=[],l=o=>{let d={...o.doctor(),aliases:a.map(A=>({...A}))};if(e===null)return{...d,storage:null,adapter:null};let b=e.adapter,h=`webgpu (${e.description!==""?e.description:`${b.vendor} ${b.architecture}`})`,g=`backend webgpu on ${d.device}`,W=d.line.startsWith(g)?`backend webgpu on ${h}${d.line.slice(g.length)}`:d.line;return{...d,device:h,line:W,storage:e.storage,adapter:{...b}}},f=new c("request","the engine was disposed during its load"),y=()=>{if(u)throw f};async function m(o){if(s!==null||t)throw new c("request","this engine already has a model loaded");t=!0;let d=null;try{d=await n.openHost(o.probeJson,o.hostWasm,o.cdnWasm),r({id:o.id,type:"host",hostWasm:n.wasmUsed()}),y();let b=await n.hostClass(),h=b.resolveAlias(o.alias);a=b.listAliases();let{repo:g,revision:W}=h,A={},G=async(k,v,P)=>{try{let $=await n.fetchFile(g,W,k,{hubBaseUrl:o.hubBaseUrl,offline:o.offline,rememberAbsent:v,...P??{},onProgress:U=>r({id:o.id,type:"progress",file:U.file,loaded:U.loaded,total:U.total})});return y(),A[k]={source:$.source,verified:$.verified},$.bytes}catch($){if(v&&$ instanceof c&&$.missing==="not-found")return null;throw $}},w=async(k,v)=>await G(k,!1,v),S=d,L,q;if(h.format==="gguf"){let k=$=>n.fetchRange(g,W,h.file,$,{hubBaseUrl:o.hubBaseUrl,offline:o.offline}),v=await k(Math.min(Ce,h.bytes));y();for(let $=b.ggufHeaderNeed(v,h.bytes);$!==0;$=b.ggufHeaderNeed(v,h.bytes))v=await k($),y();let P=v;L=$=>S.precheckGguf(P,h.bytes,$),q=async($,U)=>{let H=await w(h.file,{sha256:h.sha256,bytes:h.bytes});return U?S.loadWebGpuGguf(H,$):S.loadGguf(H,$)}}else{let k=await w("config.json"),v=await G("model.safetensors.index.json",!0);L=P=>S.precheck(k,v,P),q=async(P,$)=>{let U=await w("tokenizer.json"),H=await G("tokenizer_config.json",!0),M=[];for(let we of b.weightFiles(v))M.push(await w(we));return $?S.loadWebGpu(k,U,H,M,P):S.load(k,U,H,M,P)}}let C={...o.request,repo:g,revision:W},_,F=null,X=()=>{let k={...C,backend:"wasm"};delete k.f16,C=k},Z=k=>{X();try{L(JSON.stringify(C))}catch(v){let P=E(v);throw new c(P.kind,`${P.message} (backend "auto": WebGPU refused first: ${k.message})`)}_=`webgpu refused: ${k.message}; wasm serves this load`};if(o.auto===!0&&h.format==="gguf")X(),L(JSON.stringify(C)),_=Ue;else if(C.backend==="webgpu"){let k=null;try{k=JSON.parse(L(JSON.stringify(C)))}catch(v){let P=E(v);if(!(o.auto===!0&&Re.includes(P.kind)))throw P;Z(P)}if(k!==null)try{F=await n.openDevice(JSON.parse(o.probeJson),k.f16===!0)}catch(v){let P=E(v);if(o.auto!==!0)throw P;Z(P)}}else L(JSON.stringify(C));try{y();let k=JSON.stringify(C);if(F!==null){let v=await q(k,!0),P=F;F=null,e=await n.openRuntime(S,P,v)}else await n.instantiate(S,await q(k,!1))}finally{F?.destroy()}y(),s=d,r({id:o.id,type:"loaded",doctor:l(d),sources:A,..._!==void 0?{fallback:_}:{}})}catch(b){if(e?.destroy(),e=null,d!==null&&s!==d)try{d.dispose()}catch{}throw b}finally{t=!1}}async function x(o,d,b,h){let g;"messages"in o.prompt?g=d.startChatSplit(JSON.stringify(o.prompt.messages),h):"text"in o.prompt?g=d.startCompleteSplit(o.prompt.text,null,h):g=d.startCompleteSplit(null,Uint32Array.from(o.prompt.ids),h),await Be(d,b,g,{launched:()=>!u,between:async()=>(await be(),!u),delta:W=>r({id:o.id,type:"delta",delta:W})})}async function p(o){if(i!==null)throw new c("request","a generation is already running on this engine");if(s===null)throw new c("request","no model is loaded");let d=s,b=JSON.stringify(o.options);if(e!==null){if(e.failure!==null)throw N(e.failure);i=o.id;try{return await x(o,d,e,b)}catch(h){if(u)return;throw h}finally{i=null}}i=o.id;try{for(("messages"in o.prompt)?d.startChat(JSON.stringify(o.prompt.messages),b):("text"in o.prompt)?d.startComplete(o.prompt.text,null,b):d.startComplete(null,Uint32Array.from(o.prompt.ids),b);;){if(await be(),u)return;let h=JSON.parse(d.next());if(r({id:o.id,type:"delta",delta:h}),h.done)return}}finally{i=null}}return async o=>{try{switch(o.type){case"load":return await m(o);case"generate":return await p(o);case"abort":i===o.id&&s?.abort();return;case"doctor":if(s===null)throw new c("request","no model is loaded");r({id:o.id,type:"result",value:l(s)});return;case"dispose":u=!0,e?.destroy(),e=null,s?.dispose(),s=null,r({id:o.id,type:"result",value:null}),n.close();return}}catch(d){if(u)return;let b=E(d),h=e?.failure??null;r({id:o.id,type:"error",kind:b.kind,message:b.message,...h!==null?{fatal:h}:{}})}}}var O=globalThis,Le=ye({openHost:ue,wasmUsed:le,hostClass:ce,instantiate:fe,openDevice:(n,r)=>he(n,r),openRuntime:ge,fetchFile:oe,fetchRange:ie,close:()=>O.close()},n=>O.postMessage(n));O.onmessage=n=>{Le(n.data)};K().then(()=>O.postMessage({id:0,type:"ready",url:O.location.href}),n=>O.postMessage({id:0,type:"error",kind:"backend",message:`the browser host's glue (host/caldrix_web.js, beside dist/worker.js) did not load (${n instanceof Error?n.message:String(n)})`}));
|
|
1
|
+
import{b as l,c as O,d as te}from"./chunk-PZGTLL5H.js";var Qe="caldrix.js",Se="x-caldrix-verified",he="x-caldrix-absent";function et(t){return[...new Uint8Array(t)].map(r=>r.toString(16).padStart(2,"0")).join("")}function tt(t){return t.trim().replace(/^W\//,"").replace(/^"|"$/g,"").toLowerCase()}function D(t){return t instanceof Error?t.message:String(t)}function Y(t,r){if(r===""||r==="."||r===".."||/[/\\?#]/.test(r)||/%[0-9a-fA-F]{2}/.test(r)||/[\u0000-\u001f\u007f]/.test(r))throw new l("validate",`${t} ${JSON.stringify(r)} is not a single safe path segment`);return encodeURIComponent(r)}function Le(t){return new l("backend",`${t} is not available; caldrix.js needs a secure context`)}function Ue(t,r,s,e){let n=t.split("/").map(c=>Y("repo",c)).join("/");return`${e.endsWith("/")?e.slice(0,-1):e}/${n}/resolve/${Y("revision",r)}/${Y("file",s)}`}function rt(t,r,s){let e=t.split("/").map(c=>Y("repo",c)).join("/"),n=s.endsWith("/")?s.slice(0,-1):s,u=r===null?"":`/revision/${r.split("/").map(c=>Y("revision",c)).join("%2F")}`;return`${n}/api/models/${e}${u}?blobs=true`}async function pe(t){if(typeof caches>"u")throw Le("caches");try{return await caches.open(Qe)}catch(r){throw new l("backend",`opening the cache for ${t} failed: ${D(r)}`)}}async function de(t){if(typeof crypto>"u"||!crypto.subtle)throw Le("crypto.subtle");return et(await crypto.subtle.digest("SHA-256",t))}function Ce(t){return new l("fetch",`${t} is not in the cache and offline is set`,"offline-uncached")}async function Be(t,r,s,e){let n=Ue(t,r,s,e.hubBaseUrl),u=await pe(s),c;try{c=await u.match(n)}catch(x){throw new l("backend",`reading ${s} from the cache failed: ${D(x)}`)}let i=x=>new l("fetch",`fetching ${s} failed: HTTP 404${x}`,"not-found");if(c&&c.headers.get(he)==="1"){if(e.rememberAbsent)throw i(" (remembered from an earlier load)");c=void 0}let d=!1;if(c){let x=new Uint8Array(await c.arrayBuffer());if(e.sha256===void 0)return{bytes:x,source:"cache",verified:c.headers.get(Se)==="1",cached:!0};if(await de(x)===e.sha256)return{bytes:x,source:"cache",verified:!0,cached:!0};d=!0;try{await u.delete(n)}catch{}}if(e.offline&&d)throw new l("fetch",`${s}: the cached copy fails the alias's sha256 pin and offline is set`,"offline-uncached");if(e.offline)throw Ce(s);let p=(x,z)=>new l("fetch",`fetching ${s} ${x}`,z),w=()=>{if(e.signal?.aborted)throw p("was aborted")},y;try{y=await fetch(n,{signal:e.signal})}catch(x){throw p(e.signal?.aborted?"was aborted":`failed: ${D(x)}`)}if(y.status===404&&e.rememberAbsent){try{await u.put(n,new Response(null,{headers:{[he]:"1"}}))}catch{}throw i("")}if(!y.ok||!y.body)throw p(`failed: HTTP ${y.status}`,y.status===404?"not-found":void 0);let W=y.headers.get("x-linked-etag"),b=y.headers.get("content-length"),o=b!==null&&/^\d+$/.test(b.trim())?Number(b):null,a=[],g=0,m=y.body.getReader();try{for(;;){let x;try{x=await m.read()}catch(z){throw p(e.signal?.aborted?"was aborted":`failed: ${D(z)}`)}if(x.done)break;if(a.push(x.value),g+=x.value.byteLength,e.bytes!==void 0&&g>e.bytes)throw new l("fetch",`${s}: the body passed its pinned size, ${e.bytes} bytes`);e.onProgress?.({file:s,loaded:g,total:o})}}finally{m.cancel().catch(()=>{})}if(w(),o!==null&&o!==g&&!y.headers.get("content-encoding"))throw p(`failed: Content-Length is ${o} but ${g} bytes arrived`);let h=new Uint8Array(g),v=0;for(let x of a)h.set(x,v),v+=x.byteLength;e.onProgress?.({file:s,loaded:g,total:o});let E=!1,L=null;if(e.sha256!==void 0){if(L=await de(h),L!==e.sha256)throw new l("digest",`${s}: sha256 is ${L} but the alias pins ${e.sha256}`);E=!0}if(W!==null){let x=tt(W);if(L??=await de(h),x!==L)throw new l("digest",`${s}: sha256 is ${L} but the Hub's X-Linked-Etag is ${x}`);E=!0}w();try{await u.put(n,new Response(h,{headers:{[Se]:E?"1":"0"}}))}catch{return{bytes:h,source:"network",verified:E,cached:!1}}return{bytes:h,source:"network",verified:E,cached:!0}}async function Oe(t,r,s,e,n){if(!Number.isSafeInteger(e)||e<=0)throw new l("request",`a range of ${e} bytes of ${s} is not a positive integer`);let u=Ue(t,r,s,n.hubBaseUrl),c=await pe(s),i;try{i=await c.match(u)}catch(b){throw new l("backend",`reading ${s} from the cache failed: ${D(b)}`)}if(i&&i.headers.get(he)!=="1"){let b=new Uint8Array(await i.arrayBuffer());if(b.byteLength>=e)return b.slice(0,e)}if(n.offline)throw Ce(s);let d=b=>new l("fetch",`fetching the first ${e} bytes of ${s} ${b}`),p;try{p=await fetch(u,{headers:{Range:`bytes=0-${e-1}`},signal:n.signal})}catch(b){throw d(n.signal?.aborted?"was aborted":`failed: ${D(b)}`)}if(p.status!==206&&p.status!==200||!p.body)throw d(`failed: HTTP ${p.status}`);let w=new Uint8Array(e),y=0,W=p.body.getReader();try{for(;;){let b;try{b=await W.read()}catch(a){throw d(n.signal?.aborted?"was aborted":`failed: ${D(a)}`)}if(b.done)break;let o=Math.min(b.value.byteLength,e-y);if(w.set(b.value.subarray(0,o),y),y+=b.value.byteLength,y>e||p.status===200&&y===e)break}}finally{W.cancel().catch(()=>{})}if(n.signal?.aborted)throw d("was aborted");if(y<e)throw d(`failed: the HTTP ${p.status} answer carried ${y} bytes, not the ${e} asked for`);if(p.status===206&&y>e)throw d(`failed: the HTTP 206 answer carried more than the ${e} bytes asked for`);return w}var Ge=262144;async function Te(t,r,s){let e=rt(t,r,s.hubBaseUrl),n=`the Hub listing of ${t}`,u=await pe(n);if(s.offline){let a;try{a=await u.match(e)}catch(g){throw new l("backend",`reading ${n} from the cache failed: ${D(g)}`)}if(!a)throw new l("fetch",`${n} is not in the cache and offline is set`,"offline-uncached");return{bytes:new Uint8Array(await a.arrayBuffer()),source:"cache"}}let c=a=>new l("fetch",`fetching ${n} ${a}`),i;try{i=await fetch(e,{signal:s.signal})}catch(a){throw c(s.signal?.aborted?"was aborted":`failed: ${D(a)}`)}let d=a=>{throw i.body?.cancel().catch(()=>{}),a},p=new URL(s.hubBaseUrl).origin;i.url&&new URL(i.url).origin!==p&&d(new l("fetch",`${n} was redirected off ${p} (to ${i.url})`)),i.status===401&&d(new l("fetch",`${t}: the Hub answered HTTP 401 for its listing: the repo does not exist, or it is private (the browser build sends no token; the caldrix CLI reads HF_TOKEN)`,"not-found")),i.status===404&&d(new l("fetch",`${t}${r?"@"+r:""}: no such repo or revision on the Hub (HTTP 404)`,"not-found")),(!i.ok||!i.body)&&d(c(`failed: HTTP ${i.status}`));let w=[],y=0,W=i.body.getReader();try{for(;;){let a;try{a=await W.read()}catch(g){throw c(s.signal?.aborted?"was aborted":`failed: ${D(g)}`)}if(a.done)break;if(y+=a.value.byteLength,y>Ge)throw new l("validate",`${n} passed the 256 KiB (${Ge}-byte) cap`);w.push(a.value)}}finally{W.cancel().catch(()=>{})}if(s.signal?.aborted)throw c("was aborted");let b=new Uint8Array(y),o=0;for(let a of w)b.set(a,o),o+=a.byteLength;try{await u.put(e,new Response(b))}catch{}return{bytes:b,source:"network"}}var ge=null,V=null;function be(t){return t instanceof Error?t.message:String(t)}async function me(){return await import("../host/caldrix_web.js")}function nt(t){let r=globalThis.location?.href;return(r!==void 0?new URL(String(t),r):new URL(String(t))).href}async function De(t){let r;try{r=await fetch(t)}catch(s){throw new Error(be(s))}if(!r.ok)throw new Error(`${r.status} ${r.statusText}`.trim());return r}async function we(t,r){if(ge===null){let s=await me(),e=t??nt(new URL("../host/caldrix_web_bg.wasm",import.meta.url)),n,u;try{n=await De(e),u={url:e}}catch(c){let i=be(c);if(r===void 0||r===e)throw new l("backend",`the browser host's .wasm could not be fetched from ${e} (${i}); serve host/ beside dist/ or set assets.hostWasm to where the page serves it`);try{n=await De(r)}catch(d){let p=new URL(r).origin;throw new l("backend",`the browser host's .wasm could not be fetched from ${e} (${i}) nor from the CDN fallback ${r} (${be(d)}); serve host/ beside dist/, set assets.hostWasm to where the page serves it, or allow ${p} in the page's Content-Security-Policy (connect-src ${p}, the .wasm is fetched)`)}u={url:r,failed:{url:e,reason:i}}}await s.default({module_or_path:n}),ge=s,V=u}return ge}async function Fe(t,r,s){let e=await we(r,s);return new e.CaldrixWeb(t)}function He(){if(V===null)throw new l("backend","the browser host is not open");return{...V,...V.failed!==void 0?{failed:{...V.failed}}:{}}}async function _e(){return(await we()).CaldrixWeb}async function Ne(t,r){let s=await we(),e;try{let{instance:c}=await WebAssembly.instantiate(r,{env:{memory:s.CaldrixWeb.memory()}});e=c.exports}catch(c){throw new l("backend",`instantiating the emitted module failed: ${c instanceof Error?c.message:String(c)}`)}let{step:n,prefill:u}=e;if(typeof n!="function"||typeof u!="function")throw new l("backend","the emitted module does not export step and prefill");if(t.attach(n,u),t.argsPtr()===0)throw new l("backend","the host reports no model loaded after load")}var M={MAP_READ:1,COPY_SRC:4,COPY_DST:8,UNIFORM:64,STORAGE:128},st=1,ot=["maxStorageBufferBindingSize","maxBufferSize","maxComputeWorkgroupsPerDimension","maxStorageBuffersPerShaderStage"],qe=(t,r)=>Number.isSafeInteger(t)&&t>=0&&t<r,ze=t=>Number.isSafeInteger(t)&&t>=0;function it(t,r){let s=n=>new l("backend",`the host's WebGPU program is malformed: ${n}`),e;try{e=JSON.parse(t)}catch(n){throw s(n instanceof Error?n.message:String(n))}if(typeof e!="object"||e===null||!Array.isArray(e.kernels)||!Array.isArray(e.buffers))throw s("no kernels or buffers");if(e.kernels.forEach((n,u)=>{if(!(typeof n?.symbol=="string"&&typeof n.entry=="string"&&Array.isArray(n.buffers)&&n.buffers.every(i=>i==="f32"||i==="f16"||i==="u32")&&ze(n.scalars)))throw s(`kernel ${u}`)}),e.buffers.forEach((n,u)=>{if(!(typeof n?.word=="string"&&ze(n.bytes)&&(n.storage==="f32"||n.storage==="f16"||n.storage==="blocks")&&typeof n.placed=="boolean"))throw s(`buffer ${u}`)}),!qe(e.act,e.buffers.length))throw s("act is no buffer");if(!qe(e.logits,e.buffers.length))throw s("logits is no buffer");if(!Array.isArray(r)||r.length!==e.kernels.length||!r.every(n=>typeof n=="string"))throw s(`${e.kernels.length} kernels but ${Array.isArray(r)?r.length:"no"} WGSL sources`);return e}function at(t,r){let s=[],e=c=>new l("backend",`the host's launch words are malformed: ${c}`),n=0,u=(c,i)=>{if(n+c>t.length)throw e(`launch ${s.length} ends inside its ${i}`);let d=t.subarray(n,n+c);return n+=c,d};for(;n<t.length;){let c=u(1,"kernel")[0],i=r.kernels[c];if(i===void 0)throw e(`launch ${s.length} names kernel ${c}; the program has ${r.kernels.length}`);let d=Array.from(u(u(1,"buffer count")[0],"buffers"));if(d.length!==i.buffers.length)throw e(`a launch of ${i.symbol} binds ${d.length} buffers; the kernel declares ${i.buffers.length}`);let p=d.find(b=>b>=r.buffers.length);if(p!==void 0)throw e(`a launch of ${i.symbol} binds buffer ${p}; the program has ${r.buffers.length}`);let[w,y]=u(2,"grid"),W=u(u(1,"uniform count")[0],"uniform").slice();if(W.length===0!=(i.scalars===0))throw e(`a launch of ${i.symbol} carries ${W.length} uniform words; the kernel declares ${i.scalars} scalars`);s.push({kernel:c,buffers:d,x:w,y,uniform:W})}return s}var J=t=>t instanceof Error?t.message:String(t),ye=class{constructor(r,s,e,n,u,c,i,d){this.adapter=r;this.description=s;this.host=e;this.device=n;this.program=u;this.pipelines=c;this.buffers=i;this.staging=d;n.lost.then(p=>{let w=`the WebGPU device was lost: ${p.message||p.reason||"no message"}`;!this.#e&&this.#t===null&&(this.#t=w),this.#r?.(w)})}adapter;description;host;device;program;pipelines;buffers;staging;#t=null;#e=!1;#r=null;#n=new Set;get failure(){return this.#t}get storage(){let r=s=>this.program.buffers.some(e=>e.storage===s);return r("f16")?"f16":r("blocks")?"blocks":"f32"}async run(r,s){if(this.#e)throw new l("request","the WebGPU runtime was destroyed (the engine was disposed)");if(this.failure!==null)throw this.#o(this.failure),te(this.failure);let e;try{e=at(r,this.program);let d=this.program.buffers[this.program.act];if(s.byteLength>d.bytes)throw new l("backend",`actIn is ${s.byteLength} bytes; the program's ${d.word} is ${d.bytes}`)}catch(d){throw this.#s(J(d),!1)}let n=this.device,u=[],c,i=new Promise((d,p)=>{this.#r=w=>p(new Error(w))});i.catch(()=>null);try{n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory"),n.pushErrorScope("internal");let d=3,p=async()=>{let o=n.popErrorScope(),a=n.popErrorScope(),g=n.popErrorScope();d=0;let[m,h,v]=await Promise.all([o,a,g]);return h?`out of memory: ${h.message}`:v?`validation: ${v.message}`:m?`an internal error: ${m.message}`:null},w,y;try{s.byteLength>0&&n.queue.writeBuffer(this.buffers[this.program.act],0,s);let o=e.map(h=>{let v=h.buffers.map((E,L)=>({binding:L,resource:{buffer:this.buffers[E]}}));if(h.uniform.length>0){let E=n.createBuffer({size:h.uniform.byteLength,usage:M.UNIFORM|M.COPY_DST});u.push(E),this.#n.add(E),n.queue.writeBuffer(E,0,h.uniform),v.push({binding:h.buffers.length,resource:{buffer:E}})}return n.createBindGroup({layout:this.pipelines[h.kernel].getBindGroupLayout(0),entries:v})}),a=n.createCommandEncoder(),g=a.beginComputePass();e.forEach((h,v)=>{g.setPipeline(this.pipelines[h.kernel]),g.setBindGroup(0,o[v]),g.dispatchWorkgroups(h.x,h.y,1)}),g.end();let m=this.buffers[this.program.logits];a.copyBufferToBuffer(m,0,this.staging,0,m.size),n.queue.submit([a.finish()]),w=p(),y=this.staging.mapAsync(st),w.catch(()=>null),y.catch(()=>null)}finally{for(;d-- >0;)n.popErrorScope().catch(()=>null)}if(this.failure!==null)throw new Error(this.failure);let W=await Promise.race([w,i]);if(this.#e)throw new l("request","the engine was disposed during a WebGPU call");if(W!==null)throw new Error(`the device reported ${W}`);try{await Promise.race([y,i])}catch(o){throw this.#e?new l("request","the engine was disposed during a WebGPU call"):new Error(`mapping the logits readback failed: ${J(o)}`)}if(this.#e)throw new l("request","the engine was disposed during a WebGPU call");let b=this.program.buffers[this.program.logits].bytes;c=new Uint8Array(this.staging.getMappedRange(0,this.staging.size).slice(0,b)),this.staging.unmap()}catch(d){throw d instanceof l&&d.kind==="request"?d:this.#s(J(d))}finally{this.#r=null;for(let d of u)this.#n.delete(d),this.#e||d.destroy()}this.host.writeLogits(c)}#s(r,s=!0){return this.#e?new l("request","the engine was disposed during a WebGPU call"):(s&&(this.#t??=r),this.#o(r)??new l("backend",r))}#o(r){try{this.host.failLaunch(r)}catch(s){let e=O(s);if(e.kind==="backend")return e}return null}destroy(){if(!this.#e){this.#e=!0,this.#r?.("the engine was disposed during a WebGPU call");for(let r of[...this.buffers,this.staging,...this.#n])try{r.destroy()}catch{}this.#n.clear();try{this.device.destroy()}catch{}}}};function lt(t,r){let s=t.limits[r];return typeof s=="number"?s:void 0}function ct(){return globalThis.navigator?.gpu}async function Ie(t,r,s=ct()){let e=p=>new l("backend",p);if(!s)throw e("the worker has no navigator.gpu, though the page's probe found a WebGPU adapter");let n;try{n=await s.requestAdapter()}catch(p){throw e(`the worker's requestAdapter failed: ${J(p)}`)}if(!n)throw e("the worker's requestAdapter returned null, though the page's probe found an adapter");if(r&&!n.features.has("shader-f16"))throw e("the host's precheck chose f16 weight storage, but the worker's adapter has no shader-f16");let u={};for(let p of ot){let w=lt(n,p),y=t.webgpu?.limits[p];if(y!==void 0&&(w===void 0||w<y))throw e(`the worker's adapter offers ${p} ${w??"none"}; the host prechecked against the probe's ${y}`);w!==void 0&&(u[p]=w)}let c;try{c=await n.requestDevice({requiredFeatures:r?["shader-f16"]:[],requiredLimits:u})}catch(p){throw e(`requestDevice refused${r?" shader-f16 with":""} the program's limits: ${J(p)}`)}let i=n.info??{};if(!n.info&&typeof n.requestAdapterInfo=="function")try{i=await n.requestAdapterInfo()}catch{i={}}let d=!1;return{device:c,f16:r,adapter:{vendor:i.vendor??"",architecture:i.architecture??""},description:i.description??"",destroy:()=>{if(!d){d=!0;try{c.destroy()}catch{}}}}}async function je(t,r,s){let e=i=>new l("backend",i),n=r.device,u=[],c=()=>{for(let i of u)i.destroy();r.destroy()};try{let i=it(s.program,s.kernels),d=i.buffers.some(W=>W.storage==="f16");if(d!==r.f16)throw e(`the program stores weights ${d?"f16":"f32"}, but the device was opened for ${r.f16?"f16":"f32"} storage`);let p=[];for(let[W,b]of i.kernels.entries()){n.pushErrorScope("validation"),n.pushErrorScope("internal");let o=null,a=null;try{let h=n.createShaderModule({code:s.kernels[W],label:b.symbol});o=n.createComputePipeline({label:b.symbol,layout:"auto",compute:{module:h,entryPoint:b.entry}})}catch(h){a=h}let g=await n.popErrorScope(),m=await n.popErrorScope()??g;if(m)throw e(`kernel ${b.symbol}: creating its pipeline: ${m.message}`);if(o===null)throw e(`kernel ${b.symbol}: creating its pipeline: ${J(a)}`);p.push(o)}for(let[W,b]of i.buffers.entries()){n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory");let o=null;try{let m=n.createBuffer({size:Math.max(4,Math.ceil(b.bytes/4)*4),usage:M.STORAGE|M.COPY_SRC|M.COPY_DST,label:b.word});if(u.push(m),b.placed){let h=t.bufferBytes(W);if(h.byteLength!==b.bytes)throw new l("backend",`buffer ${b.word}: bufferBytes gave ${h.byteLength} bytes; the buffer is ${b.bytes} at ${b.storage} storage`);if(h.byteLength%4!==0)throw new l("backend",`buffer ${b.word}: ${h.byteLength} bytes are not whole 4-byte words`);n.queue.writeBuffer(m,0,h)}}catch(m){o=m}let a=await n.popErrorScope(),g=await n.popErrorScope();if(o!==null)throw o instanceof l?o:O(o);if(a)throw e(`buffer ${b.word} (${b.bytes} bytes): out of memory: ${a.message}`);if(g)throw e(`buffer ${b.word} (${b.bytes} bytes): ${g.message}`)}let w=u[i.logits],y=n.createBuffer({size:w.size,usage:M.MAP_READ|M.COPY_DST,label:"logits readback"});return new ye({...r.adapter},r.description,t,n,i,p,u,y)}catch(i){throw c(),i}}var ut=4194304,$e=["tokenizer.json","tokenizer.model","added_tokens.json","tokenizer_config.json","chat_template.jinja"],[X,ne,xe,Me,Je]=$e;function re(t,r,s){return r!==null&&!(t===ne||t===xe)&&r.siblings.some(n=>n.name===t)?r:s}var ke=(t,r)=>new l("validate",`${t}@${r} has neither tokenizer.json nor tokenizer.model`),ft="the model has no tokenizer.json, and ";function Ke(t,r,s){let e=O(t);return e.kind!=="validate"||!e.message.startsWith(ft)?t:new l("validate",`${r}@${s}: ${e.message}`,e.missing)}var ve="adapter_model.safetensors",dt=["fit","request","probe"];function Ze(){return new Promise(t=>{let r=new MessageChannel;r.port1.onmessage=()=>{r.port1.close(),t()},r.port2.postMessage(0)})}function ht(t,r,s){if(t!=="")return t;let e=[r,s].filter(n=>n!=="");return e.length>0?e.join(" "):"unnamed adapter"}async function Ye(t,r,s){let e,n;try{e=s.kind==="prefill"?t.resolve("prefill",s.n):t.resolve("step",s.pos),n=t.actIn(s.kind==="prefill"?s.n:1)}catch(u){try{t.failLaunch(O(u).message)}catch{}throw u}await r.run(e,n)}async function pt(t,r,s,e){if(await Ye(t,r,s),!!e.launched())for(t.finishStart();;){if(!await e.between())return;let n=t.beginNext();if("delta"in n){e.delta(JSON.parse(n.delta));return}if(await Ye(t,r,n.launch),!e.launched())return;let u=JSON.parse(t.finishNext());if(e.delta(u),u.done)return}}function Ve(t,r){let s=null,e=null,n=!1,u=null,c=!1,i=[],d=o=>{let a={...o.doctor(),aliases:i.map(E=>({...E}))};if(e===null)return{...a,storage:null,adapter:null};let g=e.adapter,m=`webgpu (${ht(e.description,g.vendor,g.architecture)})`,h=`backend webgpu on ${a.device}`,v=a.line.startsWith(h)?`backend webgpu on ${m}${a.line.slice(h.length)}`:a.line;return{...a,device:m,line:v,storage:e.storage,adapter:{...g}}},p=new l("request","the engine was disposed during its load"),w=()=>{if(c)throw p};async function y(o){if(s!==null||n)throw new l("request","this engine already has a model loaded");n=!0;let a=null;try{a=await t.openHost(o.probeJson,o.hostWasm,o.cdnWasm),r({id:o.id,type:"host",hostWasm:t.wasmUsed()}),w();let g=await t.hostClass(),m=g.resolveModel(o.model);i=g.listAliases();let h=m.kind==="alias"?m:null,v=null;if(m.kind==="repo"){let f=await t.fetchListing(m.repo,m.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});w(),v=JSON.parse(g.parseListing(f.bytes))}let E=v!==null?v.id:m.repo,L;if(v!==null)L=v.sha;else if(h!==null)L=h.revision;else throw new l("backend","internal invariant broken: a repo id reached the file fetches without its Hub listing");let x={},z,se={repo:E,revision:L,listing:v},oe=f=>({repo:f.id,revision:f.sha,listing:f}),ie=(f,$)=>{let k=f.siblings.find(P=>P.name===$);if(k===void 0)throw new l("validate",`${f.id}@${f.sha} has no ${$}`);return k.size},_=async(f,$,k,P)=>{let F;if(f.listing!==null){if(k&&!f.listing.siblings.some(R=>R.name===$))return null;F={bytes:ie(f.listing,$)}}try{let R=await t.fetchFile(f.repo,f.revision,$,{hubBaseUrl:o.hubBaseUrl,offline:o.offline,rememberAbsent:f.listing===null&&k,...F??{},...P??{},onProgress:I=>r({id:o.id,type:"progress",file:I.file,loaded:I.loaded,total:I.total,repo:f.repo,revision:f.revision,...z!==void 0?{provenance:z}:{}})});return w(),x[$]={source:R.source,verified:R.verified},R.bytes}catch(R){if(k&&R instanceof l&&R.missing==="not-found")return null;throw R}},Q=async(f,$,k)=>await _(f,$,!1,k),Pe=(f,$,k)=>_(oe(f),$,k),Ae={},T=a,Z,ee;if(h!==null&&h.format==="gguf"){let f=P=>t.fetchRange(E,L,h.file,P,{hubBaseUrl:o.hubBaseUrl,offline:o.offline}),$=await f(Math.min(ut,h.bytes));w();for(let P=g.ggufHeaderNeed($,h.bytes);P!==0;P=g.ggufHeaderNeed($,h.bytes))$=await f(P),w();let k=$;Z=P=>T.precheckGguf(k,h.bytes,P),ee=async(P,F)=>{let R=await Q(se,h.file,{sha256:h.sha256,bytes:h.bytes});return F?T.loadWebGpuGguf(R,P):T.loadGguf(R,P)}}else{let f=null,$=v;if(v!==null&&v.shape==="adapter"){let G=`${v.id}@${v.sha}`,j=await Pe(v,"adapter_config.json",!1),A=JSON.parse(g.adapterBase(j,G)),C=U=>{let S=O(U);return S===p||S.message.startsWith(G)?S:new l(S.kind,`${G} names base ${A.repo}: ${S.message}`,S.missing)},B=v.siblings.some(U=>U.name===X);try{let U=await t.fetchListing(A.repo,A.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});w(),$=JSON.parse(g.parseBaseListing(U.bytes,G,B))}catch(U){throw C(U)}f={listing:v,config:j,bytes:ie(v,ve)}}let k=$,P=k!==null?oe(k):se,F=G=>k!==null?oe(re(G,f?.listing??null,k)):se,R=await Q(P,"config.json"),I=await _(P,"model.safetensors.index.json",!0),ce=g.weightFiles(I);if(k!==null){let G=re(X,f?.listing??null,k);if(G.tokenizer===null)throw ke(G.id,G.sha);if(f!==null){let A=f.listing,C=new Set(["adapter_config.json",ve,...$e.filter(S=>re(S,A,k)===A)]),U=["config.json",...I!==null?["model.safetensors.index.json"]:[],...ce,...$e.filter(S=>re(S,A,k)===k)].find(S=>C.has(S));if(U!==void 0)throw new l("validate",`${U} is required from both ${A.id}@${A.sha} (the adapter) and ${k.id}@${k.sha} (its base); a file is fetched from one repo only`)}let j=0;for(let A of ce)j+=ie(k,A);Ae={weightBytes:j,...f!==null?{adapterBytes:f.bytes,baseRepo:k.id,baseRevision:k.sha}:{}}}Z=G=>T.precheck(R,I,G,f?.config),ee=async(G,j)=>{let A=F(X),C,B;if(A.listing!==null){let H=A.listing.tokenizer;if(H===null)throw ke(A.repo,A.revision);C=H,B=await Q(A,H)}else if(C=X,B=await _(A,X,!0),B===null&&(C=ne,B=await _(A,ne,!0)),B===null)throw ke(A.repo,A.revision);let U=C===ne?await _(F(xe),xe,!0):null,S=await _(F(Me),Me,!0),ue=await _(F(Je),Je,!0);try{T.checkTokenizer(R,C,B,U,S,ue)}catch(H){throw Ke(H,A.repo,A.revision)}let fe=[];for(let H of ce)fe.push(await Q(P,H));let Ee=f!==null?[await Pe(f.listing,ve,!1)]:void 0,Re=f?.config;try{return j?T.loadWebGpu(R,C,B,U,S,ue,fe,G,Re,Ee):T.load(R,C,B,U,S,ue,fe,G,Re,Ee)}catch(H){throw Ke(H,A.repo,A.revision)}}}let N={...o.request,repo:E,revision:L,...v!==null&&v.id!==m.repo?{resolvedFrom:m.repo}:{},...Ae},ae,q=null,Xe=()=>{let f={...N,backend:"wasm"};delete f.f16,N=f},le=f=>{let $=JSON.parse(f).provenance;z=typeof $=="string"?$:void 0},We=f=>{Xe();try{le(Z(JSON.stringify(N)))}catch($){let k=O($);throw new l(k.kind,`${k.message} (backend "auto": WebGPU refused first: ${f.message})`)}ae=`webgpu refused: ${f.message}; wasm serves this load`};if(N.backend==="webgpu"){let f=null,$=null;try{f=Z(JSON.stringify(N)),$=JSON.parse(f)}catch(k){let P=O(k);if(!(o.auto===!0&&dt.includes(P.kind)))throw P;We(P)}if($!==null){try{q=await t.openDevice(JSON.parse(o.probeJson),$.f16===!0)}catch(k){let P=O(k);if(o.auto!==!0)throw P;We(P)}q!==null&&le(f)}}else le(Z(JSON.stringify(N)));if(o.check===!0){q?.destroy(),q=null,w(),a=null,T.dispose(),r({id:o.id,type:"checked",backend:N.backend}),t.close();return}try{w();let f=JSON.stringify(N);if(q!==null){let $=await ee(f,!0),k=q;q=null,e=await t.openRuntime(T,k,$)}else await t.instantiate(T,await ee(f,!1))}finally{q?.destroy()}w(),s=a,r({id:o.id,type:"loaded",doctor:d(a),sources:x,...ae!==void 0?{fallback:ae}:{}})}catch(g){if(e?.destroy(),e=null,a!==null&&s!==a)try{a.dispose()}catch{}throw g}finally{n=!1}}async function W(o,a,g,m){let h;"messages"in o.prompt?h=a.startChatSplit(JSON.stringify(o.prompt.messages),m):"text"in o.prompt?h=a.startCompleteSplit(o.prompt.text,null,m):h=a.startCompleteSplit(null,Uint32Array.from(o.prompt.ids),m),await pt(a,g,h,{launched:()=>!c,between:async()=>(await Ze(),!c),delta:v=>r({id:o.id,type:"delta",delta:v})})}async function b(o){if(u!==null)throw new l("request","a generation is already running on this engine");if(s===null)throw new l("request","no model is loaded");let a=s,g=JSON.stringify(o.options);if(e!==null){if(e.failure!==null)throw te(e.failure);u=o.id;try{return await W(o,a,e,g)}catch(m){if(c)return;throw m}finally{u=null}}u=o.id;try{for(("messages"in o.prompt)?a.startChat(JSON.stringify(o.prompt.messages),g):("text"in o.prompt)?a.startComplete(o.prompt.text,null,g):a.startComplete(null,Uint32Array.from(o.prompt.ids),g);;){if(await Ze(),c)return;let m=JSON.parse(a.next());if(r({id:o.id,type:"delta",delta:m}),m.done)return}}finally{u=null}}return async o=>{try{switch(o.type){case"load":return await y(o);case"generate":return await b(o);case"abort":u===o.id&&s?.abort();return;case"doctor":if(s===null)throw new l("request","no model is loaded");r({id:o.id,type:"result",value:d(s)});return;case"dispose":c=!0,e?.destroy(),e=null,s?.dispose(),s=null,r({id:o.id,type:"result",value:null}),t.close();return}}catch(a){if(c)return;let g=O(a),m=e?.failure??null;r({id:o.id,type:"error",kind:g.kind,message:g.message,...m!==null?{fatal:m}:{}})}}}var K=globalThis,gt=Ve({openHost:Fe,wasmUsed:He,hostClass:_e,instantiate:Ne,openDevice:(t,r)=>Ie(t,r),openRuntime:je,fetchFile:Be,fetchListing:Te,fetchRange:Oe,close:()=>K.close()},t=>K.postMessage(t));K.onmessage=t=>{gt(t.data)};me().then(()=>K.postMessage({id:0,type:"ready",url:K.location.href}),t=>K.postMessage({id:0,type:"error",kind:"backend",message:`the browser host's glue (host/caldrix_web.js, beside dist/worker.js) did not load (${t instanceof Error?t.message:String(t)})`}));
|
package/host/caldrix_web.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export class CaldrixWeb {
|
|
|
10
10
|
* runtime to write into the program's `act` buffer before a launch.
|
|
11
11
|
*/
|
|
12
12
|
actIn(rows: number): Uint8Array;
|
|
13
|
+
/**
|
|
14
|
+
* The base an `adapter_config.json` declares: `{ repo, revision: string | null }`.
|
|
15
|
+
*/
|
|
16
|
+
static adapterBase(bytes: Uint8Array, adapter_at: string): string;
|
|
13
17
|
argsPtr(): number;
|
|
14
18
|
/**
|
|
15
19
|
* The module's entries: `step(args)` and `prefill(args, n)`, each returning the status code.
|
|
@@ -26,6 +30,12 @@ export class CaldrixWeb {
|
|
|
26
30
|
* tensor).
|
|
27
31
|
*/
|
|
28
32
|
bufferBytes(index: number): Uint8Array;
|
|
33
|
+
/**
|
|
34
|
+
* Builds the tokenizer as [`CaldrixWeb::load`] would from its first six arguments, and drops
|
|
35
|
+
* it: called once the tokenizer files are fetched, before the first weight shard, so a refused
|
|
36
|
+
* tokenizer costs no weight byte. Refuses exactly what `load` refuses for the tokenizer.
|
|
37
|
+
*/
|
|
38
|
+
checkTokenizer(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens?: Uint8Array | null, tokenizer_config?: Uint8Array | null, chat_template?: Uint8Array | null): void;
|
|
29
39
|
/**
|
|
30
40
|
* Releases the host's heap and everything it holds; every later call (but `dispose` and `abort`,
|
|
31
41
|
* no-ops, and `argsPtr`, then `0`) is a `request` refusal rather than a use of a freed
|
|
@@ -33,10 +43,16 @@ export class CaldrixWeb {
|
|
|
33
43
|
*/
|
|
34
44
|
dispose(): void;
|
|
35
45
|
/**
|
|
36
|
-
* What this host is: `{ backend, device, dtype, simd, threads, model, revision,
|
|
37
|
-
*
|
|
46
|
+
* What this host is: `{ backend, device, dtype, simd, threads, model, revision, provenance,
|
|
47
|
+
* note, source, line }`; `provenance` (a densified load's `model:` line) and `note` (an nf4
|
|
48
|
+
* repo's 4-bit note) are `null` otherwise; `source` is the page's to fill.
|
|
38
49
|
*/
|
|
39
50
|
doctor(): any;
|
|
51
|
+
/**
|
|
52
|
+
* The ids `text` encodes to under the loaded model's tokenizer (its special tokens added,
|
|
53
|
+
* as a completion's prompt is), on either tier.
|
|
54
|
+
*/
|
|
55
|
+
encode(text: string): Uint32Array;
|
|
40
56
|
/**
|
|
41
57
|
* The runtime's launch failed (a device loss, a validation or out-of-memory error): the
|
|
42
58
|
* generation ends as `next` does on a failed step -- every later split call is the
|
|
@@ -67,6 +83,11 @@ export class CaldrixWeb {
|
|
|
67
83
|
* `"gguf"` (what `resolveAlias` answers for that name).
|
|
68
84
|
*/
|
|
69
85
|
static listAliases(): any;
|
|
86
|
+
/**
|
|
87
|
+
* [`listing::LISTING_CAP`], the most listing bytes the host parses (the page's `LISTING_CAP`
|
|
88
|
+
* is pinned against it).
|
|
89
|
+
*/
|
|
90
|
+
static listingCap(): number;
|
|
70
91
|
/**
|
|
71
92
|
* [`CaldrixWeb::load`] over a GGUF file the page verified against the alias's sha256: the
|
|
72
93
|
* precheck again on the whole file, the import (the tokenizer from the header), the lowering
|
|
@@ -84,14 +105,21 @@ export class CaldrixWeb {
|
|
|
84
105
|
* again, imports, lowers for WebGPU (plan dtype f32, the block GEMM weights stored f16 when the
|
|
85
106
|
* precheck chose it), places into the host's heap and resolves the program. Returns
|
|
86
107
|
* `{ program, kernels }`: `program` the `WebGpuProgram` JSON (`to_json`), `kernels` the WGSL
|
|
87
|
-
* sources in the same index order. Nothing is attached: the split-phase calls drive it.
|
|
108
|
+
* sources in the same index order. Nothing is attached: the split-phase calls drive it. The
|
|
109
|
+
* adapter arguments and the densified path are [`CaldrixWeb::load`]'s, at the plan dtype f32.
|
|
88
110
|
*/
|
|
89
|
-
loadWebGpu(config_json: Uint8Array,
|
|
111
|
+
loadWebGpu(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens: Uint8Array | null | undefined, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): any;
|
|
90
112
|
/**
|
|
91
113
|
* Prechecks again on the real bytes, imports, lowers and places into the host's heap; returns
|
|
92
|
-
* the module bytes for the page to instantiate over [`memory`].
|
|
114
|
+
* the module bytes for the page to instantiate over [`memory`]. With `adapter_config` and
|
|
115
|
+
* `adapter_files` (a LoRA adapter repo), or a config carrying a `quantization_config` (a
|
|
116
|
+
* bitsandbytes nf4 repo), the model is imported densified at the request's plan dtype, then
|
|
117
|
+
* prechecked over the imported dense descriptor and the files' real lengths, lowered and
|
|
118
|
+
* placed tensor by tensor; the base's files and the adapter's are freed before this returns.
|
|
119
|
+
* `tokenizer_file` names what `tokenizer` holds: `tokenizer.json`, or `tokenizer.model` (with
|
|
120
|
+
* the repo's `added_tokens.json` as `added_tokens`, when it has one), anything else refused.
|
|
93
121
|
*/
|
|
94
|
-
load(config_json: Uint8Array,
|
|
122
|
+
load(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens: Uint8Array | null | undefined, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): Uint8Array;
|
|
95
123
|
/**
|
|
96
124
|
* Where the module writes each logits row: [`Placed::logits`], `0` when nothing is loaded. For
|
|
97
125
|
* a test page that reads the row from [`CaldrixWeb::memory`]; the product never reads it.
|
|
@@ -109,13 +137,34 @@ export class CaldrixWeb {
|
|
|
109
137
|
* `logprobs: [{ token, logprob }, ...]` when the options asked for them and the row has a finite entry.
|
|
110
138
|
*/
|
|
111
139
|
next(): any;
|
|
140
|
+
/**
|
|
141
|
+
* An adapter's base listing bytes, parsed and checked against the adapter (`adapterAt` is
|
|
142
|
+
* `id@sha`); answers `{"id","sha","tokenizer","siblings"}`.
|
|
143
|
+
*/
|
|
144
|
+
static parseBaseListing(bytes: Uint8Array, adapter_at: string, adapter_has_tokenizer: boolean): string;
|
|
145
|
+
/**
|
|
146
|
+
* The Hub's listing bytes, parsed, gated refused and the shape decided; answers the JSON
|
|
147
|
+
* `{"id","sha","shape":"model"|"adapter","tokenizer","siblings":[{"name","size"}]}` (never
|
|
148
|
+
* gated); `tokenizer` is the file a load reads, `"tokenizer.json"`, `"tokenizer.model"` or `null`.
|
|
149
|
+
*/
|
|
150
|
+
static parseListing(bytes: Uint8Array): string;
|
|
112
151
|
/**
|
|
113
152
|
* [`CaldrixWeb::precheck`] over a GGUF file's head: `header` is enough of it for the header
|
|
114
153
|
* to parse ([`CaldrixWeb::gguf_header_need`] answers 0), `file_bytes` the alias's pinned size.
|
|
115
154
|
*/
|
|
116
155
|
precheckGguf(header: Uint8Array, file_bytes: number, request_json: string): any;
|
|
117
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Checks a model before any download. `adapter_config` is an adapter repo's
|
|
158
|
+
* `adapter_config.json` (then the request names `weightBytes` and `adapterBytes`); with it, or
|
|
159
|
+
* with `weightBytes` alone (a repo id's listing), the precheck is over the repo's files.
|
|
160
|
+
*/
|
|
161
|
+
precheck(config_json: Uint8Array, index_json: Uint8Array | null | undefined, request_json: string, adapter_config?: Uint8Array | null): any;
|
|
118
162
|
static resolveAlias(name: string): any;
|
|
163
|
+
/**
|
|
164
|
+
* An alias (`resolveAlias`'s object plus `kind: "alias"`), else a Hub repo id
|
|
165
|
+
* `owner/name[@revision]` as `{ kind: "repo", repo, revision: string | null }`.
|
|
166
|
+
*/
|
|
167
|
+
static resolveModel(name: string): any;
|
|
119
168
|
/**
|
|
120
169
|
* The launches of `kind` (`"prefill"` with `n` rows from the argument block's `Pos` word,
|
|
121
170
|
* `"step"` at position `n_or_pos`) as `launches_to_words`' flat list. A call the program
|
|
@@ -146,30 +195,37 @@ export interface InitOutput {
|
|
|
146
195
|
readonly __wbg_caldrixweb_free: (a: number, b: number) => void;
|
|
147
196
|
readonly caldrixweb_abort: (a: number) => void;
|
|
148
197
|
readonly caldrixweb_actIn: (a: number, b: number, c: number) => void;
|
|
198
|
+
readonly caldrixweb_adapterBase: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
149
199
|
readonly caldrixweb_argsPtr: (a: number) => number;
|
|
150
200
|
readonly caldrixweb_attach: (a: number, b: number, c: number, d: number) => void;
|
|
151
201
|
readonly caldrixweb_beginNext: (a: number, b: number) => void;
|
|
152
202
|
readonly caldrixweb_bufferBytes: (a: number, b: number, c: number) => void;
|
|
203
|
+
readonly caldrixweb_checkTokenizer: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number) => void;
|
|
153
204
|
readonly caldrixweb_dispose: (a: number) => void;
|
|
154
205
|
readonly caldrixweb_doctor: (a: number, b: number) => void;
|
|
206
|
+
readonly caldrixweb_encode: (a: number, b: number, c: number, d: number) => void;
|
|
155
207
|
readonly caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
|
|
156
208
|
readonly caldrixweb_finishNext: (a: number, b: number) => void;
|
|
157
209
|
readonly caldrixweb_finishStart: (a: number, b: number) => void;
|
|
158
210
|
readonly caldrixweb_ggufHeaderFirstRange: () => number;
|
|
159
211
|
readonly caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
|
|
160
212
|
readonly caldrixweb_listAliases: (a: number) => void;
|
|
161
|
-
readonly
|
|
213
|
+
readonly caldrixweb_listingCap: () => number;
|
|
214
|
+
readonly caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
|
|
162
215
|
readonly caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
163
|
-
readonly caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => void;
|
|
216
|
+
readonly caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
|
|
164
217
|
readonly caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
165
218
|
readonly caldrixweb_logitsPtr: (a: number, b: number) => void;
|
|
166
219
|
readonly caldrixweb_memory: () => number;
|
|
167
220
|
readonly caldrixweb_new: (a: number, b: number, c: number) => void;
|
|
168
221
|
readonly caldrixweb_next: (a: number, b: number) => void;
|
|
169
|
-
readonly
|
|
222
|
+
readonly caldrixweb_parseBaseListing: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
223
|
+
readonly caldrixweb_parseListing: (a: number, b: number, c: number) => void;
|
|
224
|
+
readonly caldrixweb_precheck: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => void;
|
|
170
225
|
readonly caldrixweb_precheckGguf: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
171
226
|
readonly caldrixweb_resolve: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
172
227
|
readonly caldrixweb_resolveAlias: (a: number, b: number, c: number) => void;
|
|
228
|
+
readonly caldrixweb_resolveModel: (a: number, b: number, c: number) => void;
|
|
173
229
|
readonly caldrixweb_startChat: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
174
230
|
readonly caldrixweb_startChatSplit: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
175
231
|
readonly caldrixweb_startComplete: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
|
|
@@ -181,6 +237,7 @@ export interface InitOutput {
|
|
|
181
237
|
readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
|
|
182
238
|
readonly __wbindgen_export3: (a: number) => void;
|
|
183
239
|
readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
|
|
240
|
+
readonly __wbindgen_export4: (a: number, b: number, c: number) => void;
|
|
184
241
|
}
|
|
185
242
|
|
|
186
243
|
export type SyncInitInput = BufferSource | WebAssembly.Module;
|
package/host/caldrix_web.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class G{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,N.unregister(this),e}free(){const e=this.__destroy_into_raw();t.__wbg_caldrixweb_free(e,0)}abort(){t.caldrixweb_abort(this.__wbg_ptr)}actIn(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_actIn(s,this.__wbg_ptr,e);var n=a().getInt32(s+0,!0),_=a().getInt32(s+4,!0),r=a().getInt32(s+8,!0);if(r)throw c(_);return c(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}argsPtr(){return t.caldrixweb_argsPtr(this.__wbg_ptr)>>>0}attach(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_attach(s,this.__wbg_ptr,y(e),y(n));var _=a().getInt32(s+0,!0),r=a().getInt32(s+4,!0);if(r)throw c(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}beginNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_beginNext(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}bufferBytes(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_bufferBytes(s,this.__wbg_ptr,e);var n=a().getInt32(s+0,!0),_=a().getInt32(s+4,!0),r=a().getInt32(s+8,!0);if(r)throw c(_);return c(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}dispose(){t.caldrixweb_dispose(this.__wbg_ptr)}doctor(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_doctor(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}failLaunch(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),o=g;t.caldrixweb_failLaunch(r,this.__wbg_ptr,s,o);var n=a().getInt32(r+0,!0),_=a().getInt32(r+4,!0);if(_)throw c(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishNext(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishStart(){try{const _=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishStart(_,this.__wbg_ptr);var e=a().getInt32(_+0,!0),n=a().getInt32(_+4,!0);if(n)throw c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static ggufHeaderFirstRange(){return t.caldrixweb_ggufHeaderFirstRange()}static ggufHeaderNeed(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=h(e,t.__wbindgen_export),b=g;t.caldrixweb_ggufHeaderNeed(o,d,b,n);var _=a().getFloat64(o+0,!0),r=a().getInt32(o+8,!0),s=a().getInt32(o+12,!0);if(s)throw c(r);return _}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listAliases(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_listAliases(r);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadGguf(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=h(e,t.__wbindgen_export),b=g,u=f(n,t.__wbindgen_export,t.__wbindgen_export2),l=g;t.caldrixweb_loadGguf(o,this.__wbg_ptr,d,b,u,l);var _=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),s=a().getInt32(o+8,!0);if(s)throw c(r);return c(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpuGguf(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=h(e,t.__wbindgen_export),b=g,u=f(n,t.__wbindgen_export,t.__wbindgen_export2),l=g;t.caldrixweb_loadWebGpuGguf(o,this.__wbg_ptr,d,b,u,l);var _=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),s=a().getInt32(o+8,!0);if(s)throw c(r);return c(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpu(e,n,_,r,s){try{const w=t.__wbindgen_add_to_stack_pointer(-16),x=h(e,t.__wbindgen_export),I=g,M=h(n,t.__wbindgen_export),T=g;var o=v(_)?0:h(_,t.__wbindgen_export),d=g;const C=f(s,t.__wbindgen_export,t.__wbindgen_export2),j=g;t.caldrixweb_loadWebGpu(w,this.__wbg_ptr,x,I,M,T,o,d,y(r),C,j);var b=a().getInt32(w+0,!0),u=a().getInt32(w+4,!0),l=a().getInt32(w+8,!0);if(l)throw c(u);return c(b)}finally{t.__wbindgen_add_to_stack_pointer(16)}}load(e,n,_,r,s){try{const w=t.__wbindgen_add_to_stack_pointer(-16),x=h(e,t.__wbindgen_export),I=g,M=h(n,t.__wbindgen_export),T=g;var o=v(_)?0:h(_,t.__wbindgen_export),d=g;const C=f(s,t.__wbindgen_export,t.__wbindgen_export2),j=g;t.caldrixweb_load(w,this.__wbg_ptr,x,I,M,T,o,d,y(r),C,j);var b=a().getInt32(w+0,!0),u=a().getInt32(w+4,!0),l=a().getInt32(w+8,!0);if(l)throw c(u);return c(b)}finally{t.__wbindgen_add_to_stack_pointer(16)}}logitsPtr(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_logitsPtr(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static memory(){const e=t.caldrixweb_memory();return c(e)}constructor(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16),o=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=g;t.caldrixweb_new(s,o,d);var n=a().getInt32(s+0,!0),_=a().getInt32(s+4,!0),r=a().getInt32(s+8,!0);if(r)throw c(_);return this.__wbg_ptr=n,N.register(this,this.__wbg_ptr,this),this}finally{t.__wbindgen_add_to_stack_pointer(16)}}next(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_next(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return c(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}precheckGguf(e,n,_){try{const d=t.__wbindgen_add_to_stack_pointer(-16),b=h(e,t.__wbindgen_export),u=g,l=f(_,t.__wbindgen_export,t.__wbindgen_export2),w=g;t.caldrixweb_precheckGguf(d,this.__wbg_ptr,b,u,n,l,w);var r=a().getInt32(d+0,!0),s=a().getInt32(d+4,!0),o=a().getInt32(d+8,!0);if(o)throw c(s);return c(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}precheck(e,n,_){try{const u=t.__wbindgen_add_to_stack_pointer(-16),l=h(e,t.__wbindgen_export),w=g;var r=v(n)?0:h(n,t.__wbindgen_export),s=g;const x=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=g;t.caldrixweb_precheck(u,this.__wbg_ptr,l,w,r,s,x,I);var o=a().getInt32(u+0,!0),d=a().getInt32(u+4,!0),b=a().getInt32(u+8,!0);if(b)throw c(d);return c(o)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveAlias(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16),o=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=g;t.caldrixweb_resolveAlias(s,o,d);var n=a().getInt32(s+0,!0),_=a().getInt32(s+4,!0),r=a().getInt32(s+8,!0);if(r)throw c(_);return c(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}resolve(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),b=g;t.caldrixweb_resolve(o,this.__wbg_ptr,d,b,n);var _=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),s=a().getInt32(o+8,!0);if(s)throw c(r);return c(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChatSplit(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),b=g,u=f(n,t.__wbindgen_export,t.__wbindgen_export2),l=g;t.caldrixweb_startChatSplit(o,this.__wbg_ptr,d,b,u,l);var _=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),s=a().getInt32(o+8,!0);if(s)throw c(r);return c(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChat(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),b=g,u=f(n,t.__wbindgen_export,t.__wbindgen_export2),l=g;t.caldrixweb_startChat(o,this.__wbg_ptr,d,b,u,l);var _=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),s=a().getInt32(o+8,!0);if(s)throw c(r);return _>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}startCompleteSplit(e,n,_){try{const w=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),s=g,o=v(n)?0:V(n,t.__wbindgen_export),d=g;const x=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=g;t.caldrixweb_startCompleteSplit(w,this.__wbg_ptr,r,s,o,d,x,I);var b=a().getInt32(w+0,!0),u=a().getInt32(w+4,!0),l=a().getInt32(w+8,!0);if(l)throw c(u);return c(b)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startComplete(e,n,_){try{const w=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),s=g,o=v(n)?0:V(n,t.__wbindgen_export),d=g;const x=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=g;t.caldrixweb_startComplete(w,this.__wbg_ptr,r,s,o,d,x,I);var b=a().getInt32(w+0,!0),u=a().getInt32(w+4,!0),l=a().getInt32(w+8,!0);if(l)throw c(u);return b>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}vocab(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_vocab(r,this.__wbg_ptr);var e=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0),_=a().getInt32(r+8,!0);if(_)throw c(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static weightFiles(e){try{const d=t.__wbindgen_add_to_stack_pointer(-16);var n=v(e)?0:h(e,t.__wbindgen_export),_=g;t.caldrixweb_weightFiles(d,n,_);var r=a().getInt32(d+0,!0),s=a().getInt32(d+4,!0),o=a().getInt32(d+8,!0);if(o)throw c(s);return c(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}writeLogits(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),s=h(e,t.__wbindgen_export),o=g;t.caldrixweb_writeLogits(r,this.__wbg_ptr,s,o);var n=a().getInt32(r+0,!0),_=a().getInt32(r+4,!0);if(_)throw c(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}}Symbol.dispose&&(G.prototype[Symbol.dispose]=G.prototype.free);function D(){return{__proto__:null,"./caldrix_web_bg.js":{__proto__:null,__wbg___wbindgen_memory_caa4a6165639c8b5:function(){const e=t.memory;return y(e)},__wbg___wbindgen_number_get_2e0e7dee9f701a71:function(e,n){const _=p(n),r=typeof _=="number"?_:void 0;a().setFloat64(e+8,v(r)?0:r,!0),a().setInt32(e+0,!v(r),!0)},__wbg___wbindgen_string_get_0380ccaa2f57f0d9:function(e,n){const _=p(n),r=typeof _=="string"?_:void 0;var s=v(r)?0:f(r,t.__wbindgen_export,t.__wbindgen_export2),o=g;a().setInt32(e+4,o,!0),a().setInt32(e+0,s,!0)},__wbg___wbindgen_throw_41e9ee4f547fc59a:function(e,n){throw new Error(B(e,n))},__wbg_call_1875a20c43a36133:function(){return U(function(e,n,_,r){const s=p(e).call(p(n),p(_),p(r));return y(s)},arguments)},__wbg_call_187d372bd5fdd4aa:function(){return U(function(e,n,_){const r=p(e).call(p(n),p(_));return y(r)},arguments)},__wbg_getRandomValues_a608c4436c19407a:function(){return U(function(e,n){globalThis.crypto.getRandomValues(E(e,n))},arguments)},__wbg_get_unchecked_288889d017702237:function(e,n){const _=p(e)[n>>>0];return y(_)},__wbg_instanceof_Error_80a725f81f2e102d:function(e){let n;try{n=p(e)instanceof Error}catch{n=!1}return n},__wbg_instanceof_Uint8Array_828cef2aaacafc31:function(e){let n;try{n=p(e)instanceof Uint8Array}catch{n=!1}return n},__wbg_length_7f3c00c40364105e:function(e){return p(e).length},__wbg_length_d4bdea10311bd9cf:function(e){return p(e).length},__wbg_message_5f8387f0c32b90a7:function(e){const n=p(e).message;return y(n)},__wbg_new_617a8cdb8bb1130e:function(){const e=new Object;return y(e)},__wbg_new_ee2291f50781bf1d:function(){const e=new Array;return y(e)},__wbg_new_from_slice_37a3c3a194266cb8:function(e,n){const _=new Uint32Array($(e,n));return y(_)},__wbg_new_from_slice_9a868026ffa4208a:function(e,n){const _=new Uint8Array(E(e,n));return y(_)},__wbg_prototypesetcall_bc27214492979395:function(e,n,_){Uint8Array.prototype.set.call(E(e,n),p(_))},__wbg_push_2baf45db356cf468:function(e,n){return p(e).push(p(n))},__wbg_set_145a351398b48c65:function(){return U(function(e,n,_){return Reflect.set(p(e),p(n),p(_))},arguments)},__wbindgen_generic_0000000000000001:function(e){return y(e)},__wbindgen_generic_0000000000000002:function(e,n){const _=B(e,n);return y(_)},__wbindgen_object_drop_ref:function(e){c(e)}}}}const N=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(i=>t.__wbg_caldrixweb_free(i,1));function y(i){S===k.length&&k.push(k.length+1);const e=S;return S=k[e],k[e]=i,e}function z(i){i<1028||(k[i]=S,S=i)}function $(i,e){return i=i>>>0,P().subarray(i/4,i/4+e)}function E(i,e){return i=i>>>0,A().subarray(i/1,i/1+e)}let m=null;function a(){return(m===null||m.buffer.detached===!0||m.buffer.detached===void 0&&m.buffer!==t.memory.buffer)&&(m=new DataView(t.memory.buffer)),m}function B(i,e){return X(i>>>0,e)}let W=null;function P(){return(W===null||W.byteLength===0)&&(W=new Uint32Array(t.memory.buffer)),W}let R=null;function A(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(t.memory.buffer)),R}function p(i){return k[i]}function U(i,e){try{return i.apply(this,e)}catch(n){t.__wbindgen_export3(y(n))}}let k=new Array(1024).fill(void 0);k.push(void 0,null,!0,!1);let S=k.length;function v(i){return i==null}function V(i,e){const n=e(i.length*4,4)>>>0;return P().set(i,n/4),g=i.length,n}function h(i,e){const n=e(i.length*1,1)>>>0;return A().set(i,n/1),g=i.length,n}function f(i,e,n){if(n===void 0){const d=O.encode(i),b=e(d.length,1)>>>0;return A().subarray(b,b+d.length).set(d),g=d.length,b}let _=i.length,r=e(_,1)>>>0;const s=A();let o=0;for(;o<_;o++){const d=i.charCodeAt(o);if(d>127)break;s[r+o]=d}if(o!==_){o!==0&&(i=i.slice(o)),r=n(r,_,_=o+i.length*3,1)>>>0;const d=A().subarray(r+o,r+_),b=O.encodeInto(i,d);o+=b.written,r=n(r,_,o,1)>>>0}return g=o,r}function c(i){const e=p(i);return z(i),e}let F=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});F.decode();const q=2146435072;let L=0;function X(i,e){return L+=e,L>=q&&(F=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),F.decode(),L=e),F.decode(A().subarray(i,i+e))}const O=new TextEncoder;"encodeInto"in O||(O.encodeInto=function(i,e){const n=O.encode(i);return e.set(n),{read:i.length,written:n.length}});let g=0,Y,J,t;function H(i,e){return J=i,t=i.exports,Y=e,m=null,W=null,R=null,t}async function K(i,e){if(typeof Response=="function"&&i instanceof Response){if(!i.ok)throw new Error(`failed to fetch Wasm: ${i.status} ${i.statusText} fetching '${i.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(i,e)}catch(r){if(n(i.type)&&i.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}const _=await i.arrayBuffer();return await WebAssembly.instantiate(_,e)}else{const _=await WebAssembly.instantiate(i,e);return _ instanceof WebAssembly.Instance?{instance:_,module:i}:_}function n(_){switch(_){case"basic":case"cors":case"default":return!0}return!1}}function Q(i){if(t!==void 0)return t;i!==void 0&&(Object.getPrototypeOf(i)===Object.prototype?{module:i}=i:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=D();i instanceof WebAssembly.Module||(i=new WebAssembly.Module(i));const n=new WebAssembly.Instance(i,e);return H(n,i)}async function Z(i){if(t!==void 0)return t;i!==void 0&&(Object.getPrototypeOf(i)===Object.prototype?{module_or_path:i}=i:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),i===void 0&&(i=new URL("caldrix_web_bg.wasm",import.meta.url));const e=D();(typeof i=="string"||typeof Request=="function"&&i instanceof Request||typeof URL=="function"&&i instanceof URL)&&(i=fetch(i));const{instance:n,module:_}=await K(await i,e);return H(n,_)}export{G as CaldrixWeb,Z as default,Q as initSync};
|
|
1
|
+
class Q{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,tt.unregister(this),e}free(){const e=this.__destroy_into_raw();t.__wbg_caldrixweb_free(e,0)}abort(){t.caldrixweb_abort(this.__wbg_ptr)}actIn(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_actIn(o,this.__wbg_ptr,e);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static adapterBase(e,n){let _,r;try{const u=t.__wbindgen_add_to_stack_pointer(-16),y=l(e,t.__wbindgen_export),I=c,m=f(n,t.__wbindgen_export,t.__wbindgen_export2),k=c;t.caldrixweb_adapterBase(u,y,I,m,k);var o=i().getInt32(u+0,!0),s=i().getInt32(u+4,!0),d=i().getInt32(u+8,!0),w=i().getInt32(u+12,!0),p=o,b=s;if(w)throw p=0,b=0,g(d);return _=p,r=b,L(p,b)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(_,r,1)}}argsPtr(){return t.caldrixweb_argsPtr(this.__wbg_ptr)>>>0}attach(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_attach(o,this.__wbg_ptr,h(e),h(n));var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0);if(r)throw g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}beginNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_beginNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}bufferBytes(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_bufferBytes(o,this.__wbg_ptr,e);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}checkTokenizer(e,n,_,r,o,s){try{const k=t.__wbindgen_add_to_stack_pointer(-16),A=l(e,t.__wbindgen_export),T=c,C=f(n,t.__wbindgen_export,t.__wbindgen_export2),O=c,U=l(_,t.__wbindgen_export),F=c;var d=v(r)?0:l(r,t.__wbindgen_export),w=c,p=v(o)?0:l(o,t.__wbindgen_export),b=c,u=v(s)?0:l(s,t.__wbindgen_export),y=c;t.caldrixweb_checkTokenizer(k,this.__wbg_ptr,A,T,C,O,U,F,d,w,p,b,u,y);var I=i().getInt32(k+0,!0),m=i().getInt32(k+4,!0);if(m)throw g(I)}finally{t.__wbindgen_add_to_stack_pointer(16)}}dispose(){t.caldrixweb_dispose(this.__wbg_ptr)}doctor(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_doctor(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}encode(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_encode(o,this.__wbg_ptr,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}failLaunch(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),o=f(e,t.__wbindgen_export,t.__wbindgen_export2),s=c;t.caldrixweb_failLaunch(r,this.__wbg_ptr,o,s);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishStart(){try{const _=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishStart(_,this.__wbg_ptr);var e=i().getInt32(_+0,!0),n=i().getInt32(_+4,!0);if(n)throw g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static ggufHeaderFirstRange(){return t.caldrixweb_ggufHeaderFirstRange()}static ggufHeaderNeed(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c;t.caldrixweb_ggufHeaderNeed(s,d,w,n);var _=i().getFloat64(s+0,!0),r=i().getInt32(s+8,!0),o=i().getInt32(s+12,!0);if(o)throw g(r);return _}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listAliases(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_listAliases(r);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listingCap(){return t.caldrixweb_listingCap()}loadGguf(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_loadGguf(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpuGguf(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_loadWebGpuGguf(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpu(e,n,_,r,o,s,d,w,p,b){try{const W=t.__wbindgen_add_to_stack_pointer(-16),P=l(e,t.__wbindgen_export),V=c,H=f(n,t.__wbindgen_export,t.__wbindgen_export2),z=c,$=l(_,t.__wbindgen_export),q=c;var u=v(r)?0:l(r,t.__wbindgen_export),y=c,I=v(o)?0:l(o,t.__wbindgen_export),m=c,k=v(s)?0:l(s,t.__wbindgen_export),A=c;const X=f(w,t.__wbindgen_export,t.__wbindgen_export2),Y=c;var T=v(p)?0:l(p,t.__wbindgen_export),C=c;t.caldrixweb_loadWebGpu(W,this.__wbg_ptr,P,V,H,z,$,q,u,y,I,m,k,A,h(d),X,Y,T,C,v(b)?0:h(b));var O=i().getInt32(W+0,!0),U=i().getInt32(W+4,!0),F=i().getInt32(W+8,!0);if(F)throw g(U);return g(O)}finally{t.__wbindgen_add_to_stack_pointer(16)}}load(e,n,_,r,o,s,d,w,p,b){try{const W=t.__wbindgen_add_to_stack_pointer(-16),P=l(e,t.__wbindgen_export),V=c,H=f(n,t.__wbindgen_export,t.__wbindgen_export2),z=c,$=l(_,t.__wbindgen_export),q=c;var u=v(r)?0:l(r,t.__wbindgen_export),y=c,I=v(o)?0:l(o,t.__wbindgen_export),m=c,k=v(s)?0:l(s,t.__wbindgen_export),A=c;const X=f(w,t.__wbindgen_export,t.__wbindgen_export2),Y=c;var T=v(p)?0:l(p,t.__wbindgen_export),C=c;t.caldrixweb_load(W,this.__wbg_ptr,P,V,H,z,$,q,u,y,I,m,k,A,h(d),X,Y,T,C,v(b)?0:h(b));var O=i().getInt32(W+0,!0),U=i().getInt32(W+4,!0),F=i().getInt32(W+8,!0);if(F)throw g(U);return g(O)}finally{t.__wbindgen_add_to_stack_pointer(16)}}logitsPtr(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_logitsPtr(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static memory(){const e=t.caldrixweb_memory();return g(e)}constructor(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_new(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return this.__wbg_ptr=n,tt.register(this,this.__wbg_ptr,this),this}finally{t.__wbindgen_add_to_stack_pointer(16)}}next(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_next(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static parseBaseListing(e,n,_){let r,o;try{const y=t.__wbindgen_add_to_stack_pointer(-16),I=l(e,t.__wbindgen_export),m=c,k=f(n,t.__wbindgen_export,t.__wbindgen_export2),A=c;t.caldrixweb_parseBaseListing(y,I,m,k,A,_);var s=i().getInt32(y+0,!0),d=i().getInt32(y+4,!0),w=i().getInt32(y+8,!0),p=i().getInt32(y+12,!0),b=s,u=d;if(p)throw b=0,u=0,g(w);return r=b,o=u,L(b,u)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(r,o,1)}}static parseListing(e){let n,_;try{const b=t.__wbindgen_add_to_stack_pointer(-16),u=l(e,t.__wbindgen_export),y=c;t.caldrixweb_parseListing(b,u,y);var r=i().getInt32(b+0,!0),o=i().getInt32(b+4,!0),s=i().getInt32(b+8,!0),d=i().getInt32(b+12,!0),w=r,p=o;if(d)throw w=0,p=0,g(s);return n=w,_=p,L(w,p)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(n,_,1)}}precheckGguf(e,n,_){try{const d=t.__wbindgen_add_to_stack_pointer(-16),w=l(e,t.__wbindgen_export),p=c,b=f(_,t.__wbindgen_export,t.__wbindgen_export2),u=c;t.caldrixweb_precheckGguf(d,this.__wbg_ptr,w,p,n,b,u);var r=i().getInt32(d+0,!0),o=i().getInt32(d+4,!0),s=i().getInt32(d+8,!0);if(s)throw g(o);return g(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}precheck(e,n,_,r){try{const y=t.__wbindgen_add_to_stack_pointer(-16),I=l(e,t.__wbindgen_export),m=c;var o=v(n)?0:l(n,t.__wbindgen_export),s=c;const k=f(_,t.__wbindgen_export,t.__wbindgen_export2),A=c;var d=v(r)?0:l(r,t.__wbindgen_export),w=c;t.caldrixweb_precheck(y,this.__wbg_ptr,I,m,o,s,k,A,d,w);var p=i().getInt32(y+0,!0),b=i().getInt32(y+4,!0),u=i().getInt32(y+8,!0);if(u)throw g(b);return g(p)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveAlias(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_resolveAlias(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveModel(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_resolveModel(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}resolve(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c;t.caldrixweb_resolve(s,this.__wbg_ptr,d,w,n);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChatSplit(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_startChatSplit(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChat(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_startChat(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return _>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}startCompleteSplit(e,n,_){try{const u=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),o=c,s=v(n)?0:nt(n,t.__wbindgen_export),d=c;const y=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=c;t.caldrixweb_startCompleteSplit(u,this.__wbg_ptr,r,o,s,d,y,I);var w=i().getInt32(u+0,!0),p=i().getInt32(u+4,!0),b=i().getInt32(u+8,!0);if(b)throw g(p);return g(w)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startComplete(e,n,_){try{const u=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),o=c,s=v(n)?0:nt(n,t.__wbindgen_export),d=c;const y=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=c;t.caldrixweb_startComplete(u,this.__wbg_ptr,r,o,s,d,y,I);var w=i().getInt32(u+0,!0),p=i().getInt32(u+4,!0),b=i().getInt32(u+8,!0);if(b)throw g(p);return w>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}vocab(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_vocab(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static weightFiles(e){try{const d=t.__wbindgen_add_to_stack_pointer(-16);var n=v(e)?0:l(e,t.__wbindgen_export),_=c;t.caldrixweb_weightFiles(d,n,_);var r=i().getInt32(d+0,!0),o=i().getInt32(d+4,!0),s=i().getInt32(d+8,!0);if(s)throw g(o);return g(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}writeLogits(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),o=l(e,t.__wbindgen_export),s=c;t.caldrixweb_writeLogits(r,this.__wbg_ptr,o,s);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}}Symbol.dispose&&(Q.prototype[Symbol.dispose]=Q.prototype.free);function Z(){return{__proto__:null,"./caldrix_web_bg.js":{__proto__:null,__wbg___wbindgen_memory_caa4a6165639c8b5:function(){const e=t.memory;return h(e)},__wbg___wbindgen_number_get_2e0e7dee9f701a71:function(e,n){const _=x(n),r=typeof _=="number"?_:void 0;i().setFloat64(e+8,v(r)?0:r,!0),i().setInt32(e+0,!v(r),!0)},__wbg___wbindgen_string_get_0380ccaa2f57f0d9:function(e,n){const _=x(n),r=typeof _=="string"?_:void 0;var o=v(r)?0:f(r,t.__wbindgen_export,t.__wbindgen_export2),s=c;i().setInt32(e+4,s,!0),i().setInt32(e+0,o,!0)},__wbg___wbindgen_throw_41e9ee4f547fc59a:function(e,n){throw new Error(L(e,n))},__wbg_call_1875a20c43a36133:function(){return D(function(e,n,_,r){const o=x(e).call(x(n),x(_),x(r));return h(o)},arguments)},__wbg_call_187d372bd5fdd4aa:function(){return D(function(e,n,_){const r=x(e).call(x(n),x(_));return h(r)},arguments)},__wbg_getRandomValues_a608c4436c19407a:function(){return D(function(e,n){globalThis.crypto.getRandomValues(J(e,n))},arguments)},__wbg_get_unchecked_288889d017702237:function(e,n){const _=x(e)[n>>>0];return h(_)},__wbg_instanceof_Error_80a725f81f2e102d:function(e){let n;try{n=x(e)instanceof Error}catch{n=!1}return n},__wbg_instanceof_Uint8Array_828cef2aaacafc31:function(e){let n;try{n=x(e)instanceof Uint8Array}catch{n=!1}return n},__wbg_length_7f3c00c40364105e:function(e){return x(e).length},__wbg_length_d4bdea10311bd9cf:function(e){return x(e).length},__wbg_message_5f8387f0c32b90a7:function(e){const n=x(e).message;return h(n)},__wbg_new_617a8cdb8bb1130e:function(){const e=new Object;return h(e)},__wbg_new_ee2291f50781bf1d:function(){const e=new Array;return h(e)},__wbg_new_from_slice_37a3c3a194266cb8:function(e,n){const _=new Uint32Array(it(e,n));return h(_)},__wbg_new_from_slice_9a868026ffa4208a:function(e,n){const _=new Uint8Array(J(e,n));return h(_)},__wbg_prototypesetcall_bc27214492979395:function(e,n,_){Uint8Array.prototype.set.call(J(e,n),x(_))},__wbg_push_2baf45db356cf468:function(e,n){return x(e).push(x(n))},__wbg_set_145a351398b48c65:function(){return D(function(e,n,_){return Reflect.set(x(e),x(n),x(_))},arguments)},__wbindgen_generic_0000000000000001:function(e){return h(e)},__wbindgen_generic_0000000000000002:function(e,n){const _=L(e,n);return h(_)},__wbindgen_object_drop_ref:function(e){g(e)}}}}const tt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(a=>t.__wbg_caldrixweb_free(a,1));function h(a){B===R.length&&R.push(R.length+1);const e=B;return B=R[e],R[e]=a,e}function _t(a){a<1028||(R[a]=B,B=a)}function it(a,e){return a=a>>>0,et().subarray(a/4,a/4+e)}function J(a,e){return a=a>>>0,M().subarray(a/1,a/1+e)}let S=null;function i(){return(S===null||S.buffer.detached===!0||S.buffer.detached===void 0&&S.buffer!==t.memory.buffer)&&(S=new DataView(t.memory.buffer)),S}function L(a,e){return ot(a>>>0,e)}let j=null;function et(){return(j===null||j.byteLength===0)&&(j=new Uint32Array(t.memory.buffer)),j}let E=null;function M(){return(E===null||E.byteLength===0)&&(E=new Uint8Array(t.memory.buffer)),E}function x(a){return R[a]}function D(a,e){try{return a.apply(this,e)}catch(n){t.__wbindgen_export3(h(n))}}let R=new Array(1024).fill(void 0);R.push(void 0,null,!0,!1);let B=R.length;function v(a){return a==null}function nt(a,e){const n=e(a.length*4,4)>>>0;return et().set(a,n/4),c=a.length,n}function l(a,e){const n=e(a.length*1,1)>>>0;return M().set(a,n/1),c=a.length,n}function f(a,e,n){if(n===void 0){const d=G.encode(a),w=e(d.length,1)>>>0;return M().subarray(w,w+d.length).set(d),c=d.length,w}let _=a.length,r=e(_,1)>>>0;const o=M();let s=0;for(;s<_;s++){const d=a.charCodeAt(s);if(d>127)break;o[r+s]=d}if(s!==_){s!==0&&(a=a.slice(s)),r=n(r,_,_=s+a.length*3,1)>>>0;const d=M().subarray(r+s,r+_),w=G.encodeInto(a,d);s+=w.written,r=n(r,_,s,1)>>>0}return c=s,r}function g(a){const e=x(a);return _t(a),e}let N=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});N.decode();const at=2146435072;let K=0;function ot(a,e){return K+=e,K>=at&&(N=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),N.decode(),K=e),N.decode(M().subarray(a,a+e))}const G=new TextEncoder;"encodeInto"in G||(G.encodeInto=function(a,e){const n=G.encode(a);return e.set(n),{read:a.length,written:n.length}});let c=0,st,ct,t;function rt(a,e){return ct=a,t=a.exports,st=e,S=null,j=null,E=null,t}async function dt(a,e){if(typeof Response=="function"&&a instanceof Response){if(!a.ok)throw new Error(`failed to fetch Wasm: ${a.status} ${a.statusText} fetching '${a.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(a,e)}catch(r){if(n(a.type)&&a.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}const _=await a.arrayBuffer();return await WebAssembly.instantiate(_,e)}else{const _=await WebAssembly.instantiate(a,e);return _ instanceof WebAssembly.Instance?{instance:_,module:a}:_}function n(_){switch(_){case"basic":case"cors":case"default":return!0}return!1}}function gt(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module:a}=a:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=Z();a instanceof WebAssembly.Module||(a=new WebAssembly.Module(a));const n=new WebAssembly.Instance(a,e);return rt(n,a)}async function wt(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module_or_path:a}=a:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),a===void 0&&(a=new URL("caldrix_web_bg.wasm",import.meta.url));const e=Z();(typeof a=="string"||typeof Request=="function"&&a instanceof Request||typeof URL=="function"&&a instanceof URL)&&(a=fetch(a));const{instance:n,module:_}=await dt(await a,e);return rt(n,_)}export{Q as CaldrixWeb,wt as default,gt as initSync};
|
package/host/caldrix_web_bg.wasm
CHANGED
|
Binary file
|
|
@@ -4,30 +4,37 @@ export const memory: WebAssembly.Memory;
|
|
|
4
4
|
export const __wbg_caldrixweb_free: (a: number, b: number) => void;
|
|
5
5
|
export const caldrixweb_abort: (a: number) => void;
|
|
6
6
|
export const caldrixweb_actIn: (a: number, b: number, c: number) => void;
|
|
7
|
+
export const caldrixweb_adapterBase: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
7
8
|
export const caldrixweb_argsPtr: (a: number) => number;
|
|
8
9
|
export const caldrixweb_attach: (a: number, b: number, c: number, d: number) => void;
|
|
9
10
|
export const caldrixweb_beginNext: (a: number, b: number) => void;
|
|
10
11
|
export const caldrixweb_bufferBytes: (a: number, b: number, c: number) => void;
|
|
12
|
+
export const caldrixweb_checkTokenizer: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number) => void;
|
|
11
13
|
export const caldrixweb_dispose: (a: number) => void;
|
|
12
14
|
export const caldrixweb_doctor: (a: number, b: number) => void;
|
|
15
|
+
export const caldrixweb_encode: (a: number, b: number, c: number, d: number) => void;
|
|
13
16
|
export const caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
|
|
14
17
|
export const caldrixweb_finishNext: (a: number, b: number) => void;
|
|
15
18
|
export const caldrixweb_finishStart: (a: number, b: number) => void;
|
|
16
19
|
export const caldrixweb_ggufHeaderFirstRange: () => number;
|
|
17
20
|
export const caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
|
|
18
21
|
export const caldrixweb_listAliases: (a: number) => void;
|
|
19
|
-
export const
|
|
22
|
+
export const caldrixweb_listingCap: () => number;
|
|
23
|
+
export const caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
|
|
20
24
|
export const caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
21
|
-
export const caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => void;
|
|
25
|
+
export const caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
|
|
22
26
|
export const caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
23
27
|
export const caldrixweb_logitsPtr: (a: number, b: number) => void;
|
|
24
28
|
export const caldrixweb_memory: () => number;
|
|
25
29
|
export const caldrixweb_new: (a: number, b: number, c: number) => void;
|
|
26
30
|
export const caldrixweb_next: (a: number, b: number) => void;
|
|
27
|
-
export const
|
|
31
|
+
export const caldrixweb_parseBaseListing: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
32
|
+
export const caldrixweb_parseListing: (a: number, b: number, c: number) => void;
|
|
33
|
+
export const caldrixweb_precheck: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => void;
|
|
28
34
|
export const caldrixweb_precheckGguf: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
29
35
|
export const caldrixweb_resolve: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
30
36
|
export const caldrixweb_resolveAlias: (a: number, b: number, c: number) => void;
|
|
37
|
+
export const caldrixweb_resolveModel: (a: number, b: number, c: number) => void;
|
|
31
38
|
export const caldrixweb_startChat: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
32
39
|
export const caldrixweb_startChatSplit: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
33
40
|
export const caldrixweb_startComplete: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
|
|
@@ -39,3 +46,4 @@ export const __wbindgen_export: (a: number, b: number) => number;
|
|
|
39
46
|
export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
|
|
40
47
|
export const __wbindgen_export3: (a: number) => void;
|
|
41
48
|
export const __wbindgen_add_to_stack_pointer: (a: number) => number;
|
|
49
|
+
export const __wbindgen_export4: (a: number, b: number, c: number) => void;
|
package/package.json
CHANGED