@caldrix-ai/caldrix 0.1.0 → 0.2.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 +20 -0
- package/README.md +62 -8
- package/dist/index.d.ts +26 -2
- package/dist/index.js +1 -1
- package/dist/worker.js +1 -1
- package/host/caldrix_web.d.ts +45 -4
- package/host/caldrix_web.js +1 -1
- package/host/caldrix_web_bg.wasm +0 -0
- package/host/caldrix_web_bg.wasm.d.ts +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,26 @@
|
|
|
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.2.0 — 2026-10-29
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- The `constraint` generation option: `{ json: <schema> }` restricts the text to a JSON value matching a
|
|
11
|
+
schema from a documented subset, `{ oneOf: [<string>, ...] }` to exactly one of the strings. Both
|
|
12
|
+
tiers. A refusal (an unsupported schema keyword, an empty `oneOf`) is a `CaldrixError` of kind
|
|
13
|
+
`request`. See "Constrained decoding" in the README.
|
|
14
|
+
- Prefix reuse: a generation starts from the context the previous one on the same engine left when the
|
|
15
|
+
new prompt begins with the same tokens, and `usage.cachedTokens` on the last delta reports how many
|
|
16
|
+
prompt tokens were reused.
|
|
17
|
+
- The `logprobs` generation option (at most 20) and `Delta.logprobs`: the top candidates, as
|
|
18
|
+
`{ token, logprob }`, for each token.
|
|
19
|
+
- `doctor().aliases`: every alias this build loads, each with its `format` (`safetensors` or `gguf`).
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- The quantized aliases `smollm2-instruct:q4_K_M` and `smollm2-instruct:q8_0` are recognized and the wasm tier has 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 wasm tier; what has actually run is recorded under the README's "What has run, and where". The WebGPU tier has no quantized kernels in this version: `backend: "auto"` runs a quantized alias on the wasm tier and an explicit `backend: "webgpu"` is refused by name.
|
|
24
|
+
- A GGUF alias's file download is capped at the alias's pinned size: a longer body is refused by name before the sha256 check and nothing is cached. Offline, a cached copy that fails the pin is refused naming the pin.
|
|
25
|
+
|
|
6
26
|
## 0.1.0 — 2026-10-27
|
|
7
27
|
|
|
8
28
|
### 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: b22cc6f84423684354e4d7eabaea3a8f339ed4ea -->
|
|
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
|
|
@@ -51,11 +51,19 @@ class Engine {
|
|
|
51
51
|
declare function probe(): Promise<Capabilities>;
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
A `Delta` is `{ text, token?, done, finishReason?: "stop" | "length" | "abort", usage? }`. Generation
|
|
55
|
-
options are `temperature`, `topK`, `topP`, `minP`, `repetitionPenalty`, `seed
|
|
56
|
-
`signal` (an `AbortSignal`). Errors are `CaldrixError` with a `kind` of `probe`, `fit`, `architecture`,
|
|
54
|
+
A `Delta` is `{ text, token?, done, finishReason?: "stop" | "length" | "abort", usage?, logprobs? }`. Generation
|
|
55
|
+
options are `temperature`, `topK`, `topP`, `minP`, `repetitionPenalty`, `seed`, `maxTokens` and
|
|
56
|
+
`constraint` (see "Constrained decoding"), `logprobs`, plus a `signal` (an `AbortSignal`). Errors are `CaldrixError` with a `kind` of `probe`, `fit`, `architecture`,
|
|
57
57
|
`fetch`, `digest`, `validate`, `lowering`, `backend` or `request`.
|
|
58
58
|
|
|
59
|
+
Prefix reuse: a generation starts from the context the previous one on the same engine left whenever
|
|
60
|
+
the new prompt begins with the same tokens, so only the rest is prefilled (a chat that appends a turn,
|
|
61
|
+
when its rendered prompt begins with the same tokens). The last delta's `usage.cachedTokens` is the number of prompt tokens
|
|
62
|
+
that were reused, 0 when none were.
|
|
63
|
+
|
|
64
|
+
`logprobs: n` (an integer, at most 20; more is a `request` error) adds `logprobs: { token, logprob }[]`
|
|
65
|
+
to each token's delta: up to `n` candidates for that step (fewer under a constraint).
|
|
66
|
+
|
|
59
67
|
## Options
|
|
60
68
|
|
|
61
69
|
```ts
|
|
@@ -76,6 +84,11 @@ interface LoadOptions {
|
|
|
76
84
|
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
|
|
77
85
|
not built. Under `"auto"`, a load WebGPU then refuses (a larger explicit context, a limit, a
|
|
78
86
|
device that fails to open) is served by the wasm tier, and `doctor().why` says so.
|
|
87
|
+
- **Quantized aliases**: `smollm2-instruct:q4_K_M` and `smollm2-instruct:q8_0` are one GGUF file each.
|
|
88
|
+
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. The wasm tier has their kernels (see "What has run, and where");
|
|
90
|
+
the WebGPU tier refuses them by name in this version. `"auto"` runs them on wasm (and `doctor().why`
|
|
91
|
+
says so); an explicit `backend: "webgpu"` is refused by name, a `lowering` error.
|
|
79
92
|
- **`storage`**: the WebGPU tier's weight storage. `"auto"` stores the block GEMM weights as f16 when the
|
|
80
93
|
adapter has `shader-f16`; `"f32"` keeps them f32 on any adapter. `doctor().storage` reports it (`null`
|
|
81
94
|
on wasm). `storage: "f32"` with `backend: "wasm"` is refused.
|
|
@@ -83,11 +96,47 @@ interface LoadOptions {
|
|
|
83
96
|
uses only the browser's cache and fails with `fetch` for a file it lacks.
|
|
84
97
|
- **`assets`**: where the package's own files come from; see "Network" below.
|
|
85
98
|
- **`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
|
|
86
|
-
source and URL of the worker and the `.wasm`: `bundle`, `cdn` or `page`),
|
|
99
|
+
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`.
|
|
101
|
+
|
|
102
|
+
## Constrained decoding
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
interface GenerationOptions {
|
|
106
|
+
// temperature, topK, topP, minP, repetitionPenalty, seed, maxTokens as above
|
|
107
|
+
constraint?: { json: Record<string, unknown> } | { oneOf: string[] };
|
|
108
|
+
logprobs?: number;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`constraint` limits what the model may write, on both tiers. `{ oneOf: ["yes", "no"] }` yields exactly
|
|
113
|
+
one of the strings and stops. `{ json: <schema> }` yields a JSON value matching the schema.
|
|
114
|
+
|
|
115
|
+
- **Reachable options.** A `oneOf` option is guaranteed reachable only when it is ASCII.
|
|
116
|
+
- **The schema subset.** `type` is `object` (with `properties`, `required`, and `additionalProperties:
|
|
117
|
+
false`), `array` (`items`), `string` (`maxLength`), `number`, `integer`, `boolean` or `null`; `enum`
|
|
118
|
+
works on any type; `oneOf` and `anyOf` of those mean "any branch may match". The annotation keywords
|
|
119
|
+
`description`, `title`, `default`, `$schema`, `$comment` and `examples` are accepted and ignored. `$ref`
|
|
120
|
+
and every other keyword are refused by name, as is a schema with no `type`, `enum`, `oneOf` or
|
|
121
|
+
`anyOf`, and a schema that is not an object (a bare `true` or `false`). When `additionalProperties` is
|
|
122
|
+
absent, any other key is allowed and its value may be any JSON value; an array with no `items` holds
|
|
123
|
+
any JSON values. `integer` refuses a `.` or an exponent. Keys and `enum` members are matched by their
|
|
124
|
+
JSON text, so an escaped spelling of a key is not that key.
|
|
125
|
+
- **A refusal** (an unsupported keyword, an empty `oneOf`) is a `CaldrixError` of kind `request`
|
|
126
|
+
whose message starts `constraint: `.
|
|
127
|
+
- **The vocabulary** the masks read is built on the first constrained generation per loaded model, so
|
|
128
|
+
that request pays for it.
|
|
129
|
+
- **Stopping.** A JSON value stops when it is complete. Nothing forces a model to finish one: a
|
|
130
|
+
generation can end at `maxTokens` with `finishReason: "length"` and an incomplete value.
|
|
131
|
+
- There is no grammar constraint.
|
|
132
|
+
- What has run: the package's own tests, on a tiny character-vocabulary test model whose output is
|
|
133
|
+
noise, so they check the mask (`oneOf`, an `enum`, a small object schema, a refusal) and not the quality
|
|
134
|
+
of any model's text. `oneOf` also runs in the e2e's `chromium-webgpu` project (SwiftShader in CI).
|
|
87
135
|
|
|
88
136
|
## What has run, and where
|
|
89
137
|
|
|
90
|
-
Only these runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9
|
|
138
|
+
Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9, and entry 10 for
|
|
139
|
+
the quantized aliases); nothing else is claimed.
|
|
91
140
|
|
|
92
141
|
- **Model:** SmolLM2-135M-Instruct, one prompt, 8 greedy tokens. No other model or prompt.
|
|
93
142
|
- **Browser:** Chromium driven by Playwright, headless only: the headless shell 153.0.8010.12 on Linux and on
|
|
@@ -105,6 +154,7 @@ Only these runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9)
|
|
|
105
154
|
not a GPU. The f32 plan at f32 weight storage, token-exact, logits worst 5.874168e-4 against the same bound.
|
|
106
155
|
- **Phase 2's exit is closed on the gates** (entry 9), with the run's two process deviations recorded there:
|
|
107
156
|
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` entry 10); in headless Chromium the host's `loadGguf` on the tiny test fixture only — no browser run has loaded the pinned files; nothing on a real adapter.
|
|
108
158
|
- **Not run:** any other adapter or GPU; a headed browser; the browser stages inside a sandbox; the scalar
|
|
109
159
|
(non-SIMD) wasm spelling in a browser; real-Hub digest behaviour (the runs used a loopback Hub stand-in);
|
|
110
160
|
any browser other than Playwright's headless Chromium; any other model. No performance figure is recorded
|
|
@@ -136,8 +186,12 @@ package's own assets when the bundle's copy fails.
|
|
|
136
186
|
worker can fetch your origin with its credentials and read its IndexedDB and caches), and no integrity
|
|
137
187
|
check is possible for a worker's module import, so a page that cannot accept that sets
|
|
138
188
|
`assets.fallback: false`.
|
|
139
|
-
- **
|
|
140
|
-
|
|
189
|
+
- **What has been checked:** jsdelivr serves the published package's worker, glue and WebAssembly files
|
|
190
|
+
byte-identical to the npm tarball, with CORS open to any origin. After the first release was published,
|
|
191
|
+
the browser fallback ran once against jsdelivr itself in headless Chromium, with the default `cdn`: a
|
|
192
|
+
page whose bundle lacked the worker, and one whose bundle lacked the `.wasm`, each chatted to done
|
|
193
|
+
with `doctor()` naming the jsdelivr URLs and one warning on the console. That was a one-off check at
|
|
194
|
+
the desk; the committed tests point `assets.cdn` at a loopback origin and never reach jsdelivr.
|
|
141
195
|
- **Content-Security-Policy:** a page that uses the fallback needs `worker-src blob:` (a cross-origin
|
|
142
196
|
worker starts through a same-origin module shim), `script-src` and `connect-src` for the CDN origin,
|
|
143
197
|
and `'wasm-unsafe-eval'` for any WebAssembly.
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
* and is refused there by name; `signal` is the page's and never leaves the main thread.
|
|
4
4
|
*/
|
|
5
5
|
interface GenerationOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Restricts the text to a JSON value matching a schema (a documented subset; see the README) or to
|
|
8
|
+
* exactly one of some strings. A refusal is a `CaldrixError` of kind `request`.
|
|
9
|
+
*/
|
|
10
|
+
constraint?: {
|
|
11
|
+
json: Record<string, unknown>;
|
|
12
|
+
} | {
|
|
13
|
+
oneOf: string[];
|
|
14
|
+
};
|
|
15
|
+
/** The number of top logprobs to return with each token, at most 20. */
|
|
16
|
+
logprobs?: number;
|
|
6
17
|
temperature?: number;
|
|
7
18
|
topK?: number;
|
|
8
19
|
topP?: number;
|
|
@@ -62,6 +73,11 @@ interface HostDoctor {
|
|
|
62
73
|
vendor: string;
|
|
63
74
|
architecture: string;
|
|
64
75
|
} | null;
|
|
76
|
+
/** The worker's, from the host's `listAliases`: every alias this build loads, by name and file format. */
|
|
77
|
+
aliases: {
|
|
78
|
+
name: string;
|
|
79
|
+
format: "safetensors" | "gguf";
|
|
80
|
+
}[];
|
|
65
81
|
}
|
|
66
82
|
|
|
67
83
|
interface LoadOptions {
|
|
@@ -122,16 +138,24 @@ interface Delta {
|
|
|
122
138
|
token?: number;
|
|
123
139
|
done: boolean;
|
|
124
140
|
finishReason?: "stop" | "length" | "abort";
|
|
141
|
+
/** Prompt tokens, generated tokens, and the prompt tokens served from the previous generation's context. */
|
|
125
142
|
usage?: {
|
|
126
143
|
promptTokens: number;
|
|
127
144
|
completionTokens: number;
|
|
145
|
+
cachedTokens: number;
|
|
128
146
|
};
|
|
147
|
+
/** The top logprobs for this token; present only when `logprobs` was asked for. */
|
|
148
|
+
logprobs?: {
|
|
149
|
+
token: number;
|
|
150
|
+
logprob: number;
|
|
151
|
+
}[];
|
|
129
152
|
}
|
|
130
153
|
/**
|
|
131
154
|
* The host's doctor object, with `source` filled per file: where it came from and whether its digest
|
|
132
155
|
* was checked. `backend` is the tier that runs; `why` is how it was chosen (the probe's reason under
|
|
133
|
-
* `"auto"`, so a fallback to wasm says why -- no adapter, a bf16 request,
|
|
134
|
-
* when the WebGPU precheck or device open refused a load the wasm tier then served).
|
|
156
|
+
* `"auto"`, so a fallback to wasm says why -- no adapter, a bf16 request, a quantized alias, or
|
|
157
|
+
* `webgpu refused: …` when the WebGPU precheck or device open refused a load the wasm tier then served).
|
|
158
|
+
* `aliases` is every alias this build loads, each with its file format.
|
|
135
159
|
*/
|
|
136
160
|
interface DoctorReport extends Omit<HostDoctor, "source"> {
|
|
137
161
|
source: Record<string, FileSource>;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as J,b as i,d as H}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function se(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"}function ae(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 T(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 ae(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number");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"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)),u=o.getExtension(n?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:s,floatColorBuffer:u}}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.1.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:u,revoke:f}=s,b=()=>l(r()),l=(d,a=e.url)=>{if(f(),u.onmessage=null,u.onerror=null,t?.removeEventListener("abort",b),d===null)return n({worker:u,url:a});u.terminate(),o(d)};t?.addEventListener("abort",b,{once:!0}),u.onerror=d=>l(new C(d.message||"it did not load")),u.onmessage=d=>{let a=d.data;if(!T(a)||a.id!==0)return l(m(a));if(a.type==="ready")return s.literal?URL.canParse(a.url)?l(null,new URL(a.url)):l(m(a)):l(null);if(a.type==="error")return l(new C(a.message));l(m(a))}})}async function ve(e,t,r,n){let o=[];for(let l of e)try{let{worker:d,url:a}=await ke(l,r,n),g=o[0];return{worker:d,used:l,url:a,...g!==void 0?{failed:{what:q(g.t),reason:g.reason}}:{}}}catch(d){if(!(d instanceof C))throw d;o.push({t:l,reason:d.reason})}let[s,u]=o;if(s!==void 0&&u!==void 0){let l=u.t.url.origin;throw new i("backend",`${q(s.t)} did not start (${s.reason}), nor from the CDN fallback ${u.t.url.href} (${u.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${l} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${l} for the modules it imports, connect-src ${l} 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.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens}),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),u=r.assets?.fallback??!0;if(typeof u!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(u)}`);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"}];u&&o===void 0&&b.push({url:new URL("dist/worker.js",f),chosen:!0,source:"cdn"});let l=u&&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(),v,$;if(n==="auto"&&r.dtype==="bf16"&&p.chosen==="webgpu")v="wasm",$=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${p.why}`;else if(n==="auto")v=p.chosen,$=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}`);v="webgpu",$=`backend "webgpu" asked for; ${p.why}`}else v="wasm",$=`backend "wasm" asked for; ${p.why}`;let B=p.webgpu?.unrepresentable??[];if(g?.aborted)throw a();let L=await ve(b,!u,g,a),{worker:y}=L,O=L.url,R=null;L.failed!==void 0&&(R=We(L.failed,O.href,s===void 0?l: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:v,...r.dtype!==void 0?{dtype:r.dtype}:{},...r.maxContext!==void 0?{maxContext:r.maxContext}:{},...v==="webgpu"&&d==="f32"?{f16:!1}:{}},...n==="auto"&&v==="webgpu"?{auto:!0}:{},offline:r.offline??!1,hubBaseUrl:r.hubBaseUrl??me,...s!==void 0?{hostWasm:s.href}:{},...l!==void 0?{cdnWasm:l}:{}};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(!T(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=L.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}`:$,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;#o;#l=2;#t=!1;#e=null;#i=!1;#n=null;constructor(t,r){this.#r=t,this.#o=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.#o.source).map(([o,s])=>[o,{...s}])),{worker:r,hostWasm:n}=this.#o.assets;return{...this.#o,source:t,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.#n?.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.#n?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!T(t))return this.#a(m(t));let r=this.#n;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}};return}this.#i=!0;let s=this.#l++,u=[],f=null;this.#n={id:s,sink:a=>{u.push(a),f?.()}};let b=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:s,type:"abort"})},l=!1,d=async()=>{for(;u.length===0;)await new Promise(a=>f=a);return f=null,u.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 l=!0,a;if(a.done&&(l=!0),yield a,a.done)return}}finally{if(n?.removeEventListener("abort",b),!l)try{for(b();!(this.#t||this.#e);){let a=await d();if(a instanceof i||a.done)break}}catch{}this.#n=null,this.#i=!1}}};export{M as Caldrix,i as CaldrixError,S as Engine,G as probe};
|
|
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};
|
package/dist/worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as f,c as C,d as F}from"./chunk-PZGTLL5H.js";var ce="caldrix.js",J="x-caldrix-verified",Y="x-caldrix-absent";function fe(t){return[...new Uint8Array(t)].map(e=>e.toString(16).padStart(2,"0")).join("")}function de(t){return t.trim().replace(/^W\//,"").replace(/^"|"$/g,"").toLowerCase()}function q(t){return t instanceof Error?t.message:String(t)}function T(t,e){if(e===""||e==="."||e===".."||/[/\\?#]/.test(e)||/%[0-9a-fA-F]{2}/.test(e)||/[\u0000-\u001f\u007f]/.test(e))throw new f("validate",`${t} ${JSON.stringify(e)} is not a single safe path segment`);return encodeURIComponent(e)}function K(t){return new f("backend",`${t} is not available; caldrix.js needs a secure context`)}async function V(t,e,o,r){let n=t.split("/").map(b=>T("repo",b)).join("/"),c=`${r.hubBaseUrl.endsWith("/")?r.hubBaseUrl.slice(0,-1):r.hubBaseUrl}/${n}/resolve/${T("revision",e)}/${T("file",o)}`;if(typeof caches>"u")throw K("caches");let i;try{i=await caches.open(ce)}catch(b){throw new f("backend",`opening the cache for ${o} failed: ${q(b)}`)}let u;try{u=await i.match(c)}catch(b){throw new f("backend",`reading ${o} from the cache failed: ${q(b)}`)}let p=b=>new f("fetch",`fetching ${o} failed: HTTP 404${b}`,"not-found");if(u&&u.headers.get(Y)==="1"){if(r.rememberAbsent)throw p(" (remembered from an earlier load)");u=void 0}if(u)return{bytes:new Uint8Array(await u.arrayBuffer()),source:"cache",verified:u.headers.get(J)==="1",cached:!0};if(r.offline)throw new f("fetch",`${o} is not in the cache and offline is set`,"offline-uncached");let y=(b,P)=>new f("fetch",`fetching ${o} ${b}`,P),v=()=>{if(r.signal?.aborted)throw y("was aborted")},w;try{w=await fetch(c,{signal:r.signal})}catch(b){throw y(r.signal?.aborted?"was aborted":`failed: ${q(b)}`)}if(w.status===404&&r.rememberAbsent){try{await i.put(c,new Response(null,{headers:{[Y]:"1"}}))}catch{}throw p("")}if(!w.ok||!w.body)throw y(`failed: HTTP ${w.status}`,w.status===404?"not-found":void 0);let s=w.headers.get("x-linked-etag"),a=w.headers.get("content-length"),d=a!==null&&/^\d+$/.test(a.trim())?Number(a):null,g=[],m=0,h=w.body.getReader();try{for(;;){let b;try{b=await h.read()}catch(P){throw y(r.signal?.aborted?"was aborted":`failed: ${q(P)}`)}if(b.done)break;g.push(b.value),m+=b.value.byteLength,r.onProgress?.({file:o,loaded:m,total:d})}}finally{h.cancel().catch(()=>{})}if(v(),d!==null&&d!==m&&!w.headers.get("content-encoding"))throw y(`failed: Content-Length is ${d} but ${m} bytes arrived`);let x=new Uint8Array(m),$=0;for(let b of g)x.set(b,$),$+=b.byteLength;r.onProgress?.({file:o,loaded:m,total:d});let A=!1;if(s!==null){if(typeof crypto>"u"||!crypto.subtle)throw K("crypto.subtle");let b=de(s),P=fe(await crypto.subtle.digest("SHA-256",x));if(b!==P)throw new f("digest",`${o}: sha256 is ${P} but the Hub's X-Linked-Etag is ${b}`);A=!0}v();try{await i.put(c,new Response(x,{headers:{[J]:A?"1":"0"}}))}catch{return{bytes:x,source:"network",verified:A,cached:!1}}return{bytes:x,source:"network",verified:A,cached:!0}}var _=null,O=null;function N(t){return t instanceof Error?t.message:String(t)}async function M(){return await import("../host/caldrix_web.js")}function pe(t){let e=globalThis.location?.href;return(e!==void 0?new URL(String(t),e):new URL(String(t))).href}async function X(t){let e;try{e=await fetch(t)}catch(o){throw new Error(N(o))}if(!e.ok)throw new Error(`${e.status} ${e.statusText}`.trim());return e}async function I(t,e){if(_===null){let o=await M(),r=t??pe(new URL("../host/caldrix_web_bg.wasm",import.meta.url)),n,l;try{n=await X(r),l={url:r}}catch(c){let i=N(c);if(e===void 0||e===r)throw new f("backend",`the browser host's .wasm could not be fetched from ${r} (${i}); serve host/ beside dist/ or set assets.hostWasm to where the page serves it`);try{n=await X(e)}catch(u){let p=new URL(e).origin;throw new f("backend",`the browser host's .wasm could not be fetched from ${r} (${i}) nor from the CDN fallback ${e} (${N(u)}); 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)`)}l={url:e,failed:{url:r,reason:i}}}await o.default({module_or_path:n}),_=o,O=l}return _}async function Q(t,e,o){let r=await I(e,o);return new r.CaldrixWeb(t)}function Z(){if(O===null)throw new f("backend","the browser host is not open");return{...O,...O.failed!==void 0?{failed:{...O.failed}}:{}}}async function ee(){return(await I()).CaldrixWeb}async function re(t,e){let o=await I(),r;try{let{instance:c}=await WebAssembly.instantiate(e,{env:{memory:o.CaldrixWeb.memory()}});r=c.exports}catch(c){throw new f("backend",`instantiating the emitted module failed: ${c instanceof Error?c.message:String(c)}`)}let{step:n,prefill:l}=r;if(typeof n!="function"||typeof l!="function")throw new f("backend","the emitted module does not export step and prefill");if(t.attach(n,l),t.argsPtr()===0)throw new f("backend","the host reports no model loaded after load")}var U={MAP_READ:1,COPY_SRC:4,COPY_DST:8,UNIFORM:64,STORAGE:128},he=1,ge=["maxStorageBufferBindingSize","maxBufferSize","maxComputeWorkgroupsPerDimension","maxStorageBuffersPerShaderStage"],te=(t,e)=>Number.isSafeInteger(t)&&t>=0&&t<e,ne=t=>Number.isSafeInteger(t)&&t>=0;function me(t,e){let o=n=>new f("backend",`the host's WebGPU program is malformed: ${n}`),r;try{r=JSON.parse(t)}catch(n){throw o(n instanceof Error?n.message:String(n))}if(typeof r!="object"||r===null||!Array.isArray(r.kernels)||!Array.isArray(r.buffers))throw o("no kernels or buffers");if(r.kernels.forEach((n,l)=>{if(!(typeof n?.symbol=="string"&&typeof n.entry=="string"&&Array.isArray(n.buffers)&&n.buffers.every(i=>i==="f32"||i==="f16")&&ne(n.scalars)))throw o(`kernel ${l}`)}),r.buffers.forEach((n,l)=>{if(!(typeof n?.word=="string"&&ne(n.bytes)&&(n.storage==="f32"||n.storage==="f16")&&typeof n.placed=="boolean"))throw o(`buffer ${l}`)}),!te(r.act,r.buffers.length))throw o("act is no buffer");if(!te(r.logits,r.buffers.length))throw o("logits is no buffer");if(!Array.isArray(e)||e.length!==r.kernels.length||!e.every(n=>typeof n=="string"))throw o(`${r.kernels.length} kernels but ${Array.isArray(e)?e.length:"no"} WGSL sources`);return r}function be(t,e){let o=[],r=c=>new f("backend",`the host's launch words are malformed: ${c}`),n=0,l=(c,i)=>{if(n+c>t.length)throw r(`launch ${o.length} ends inside its ${i}`);let u=t.subarray(n,n+c);return n+=c,u};for(;n<t.length;){let c=l(1,"kernel")[0],i=e.kernels[c];if(i===void 0)throw r(`launch ${o.length} names kernel ${c}; the program has ${e.kernels.length}`);let u=Array.from(l(l(1,"buffer count")[0],"buffers"));if(u.length!==i.buffers.length)throw r(`a launch of ${i.symbol} binds ${u.length} buffers; the kernel declares ${i.buffers.length}`);let p=u.find(s=>s>=e.buffers.length);if(p!==void 0)throw r(`a launch of ${i.symbol} binds buffer ${p}; the program has ${e.buffers.length}`);let[y,v]=l(2,"grid"),w=l(l(1,"uniform count")[0],"uniform").slice();if(w.length===0!=(i.scalars===0))throw r(`a launch of ${i.symbol} carries ${w.length} uniform words; the kernel declares ${i.scalars} scalars`);o.push({kernel:c,buffers:u,x:y,y:v,uniform:w})}return o}var B=t=>t instanceof Error?t.message:String(t),z=class{constructor(e,o,r,n,l,c,i,u){this.adapter=e;this.description=o;this.host=r;this.device=n;this.program=l;this.pipelines=c;this.buffers=i;this.staging=u;n.lost.then(p=>{let y=`the WebGPU device was lost: ${p.message||p.reason||"no message"}`;!this.#e&&this.#r===null&&(this.#r=y),this.#t?.(y)})}adapter;description;host;device;program;pipelines;buffers;staging;#r=null;#e=!1;#t=null;#n=new Set;get failure(){return this.#r}get storage(){return this.program.buffers.some(e=>e.storage==="f16")?"f16":"f32"}async run(e,o){if(this.#e)throw new f("request","the WebGPU runtime was destroyed (the engine was disposed)");if(this.failure!==null)throw this.#s(this.failure),F(this.failure);let r;try{r=be(e,this.program);let u=this.program.buffers[this.program.act];if(o.byteLength>u.bytes)throw new f("backend",`actIn is ${o.byteLength} bytes; the program's ${u.word} is ${u.bytes}`)}catch(u){throw this.#o(B(u),!1)}let n=this.device,l=[],c,i=new Promise((u,p)=>{this.#t=y=>p(new Error(y))});i.catch(()=>null);try{n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory"),n.pushErrorScope("internal");let u=3,p=async()=>{let a=n.popErrorScope(),d=n.popErrorScope(),g=n.popErrorScope();u=0;let[m,h,x]=await Promise.all([a,d,g]);return h?`out of memory: ${h.message}`:x?`validation: ${x.message}`:m?`an internal error: ${m.message}`:null},y,v;try{o.byteLength>0&&n.queue.writeBuffer(this.buffers[this.program.act],0,o);let a=r.map(h=>{let x=h.buffers.map(($,A)=>({binding:A,resource:{buffer:this.buffers[$]}}));if(h.uniform.length>0){let $=n.createBuffer({size:h.uniform.byteLength,usage:U.UNIFORM|U.COPY_DST});l.push($),this.#n.add($),n.queue.writeBuffer($,0,h.uniform),x.push({binding:h.buffers.length,resource:{buffer:$}})}return n.createBindGroup({layout:this.pipelines[h.kernel].getBindGroupLayout(0),entries:x})}),d=n.createCommandEncoder(),g=d.beginComputePass();r.forEach((h,x)=>{g.setPipeline(this.pipelines[h.kernel]),g.setBindGroup(0,a[x]),g.dispatchWorkgroups(h.x,h.y,1)}),g.end();let m=this.buffers[this.program.logits];d.copyBufferToBuffer(m,0,this.staging,0,m.size),n.queue.submit([d.finish()]),y=p(),v=this.staging.mapAsync(he),y.catch(()=>null),v.catch(()=>null)}finally{for(;u-- >0;)n.popErrorScope().catch(()=>null)}if(this.failure!==null)throw new Error(this.failure);let w=await Promise.race([y,i]);if(this.#e)throw new f("request","the engine was disposed during a WebGPU call");if(w!==null)throw new Error(`the device reported ${w}`);try{await Promise.race([v,i])}catch(a){throw this.#e?new f("request","the engine was disposed during a WebGPU call"):new Error(`mapping the logits readback failed: ${B(a)}`)}if(this.#e)throw new f("request","the engine was disposed during a WebGPU call");let s=this.program.buffers[this.program.logits].bytes;c=new Uint8Array(this.staging.getMappedRange(0,this.staging.size).slice(0,s)),this.staging.unmap()}catch(u){throw u instanceof f&&u.kind==="request"?u:this.#o(B(u))}finally{this.#t=null;for(let u of l)this.#n.delete(u),this.#e||u.destroy()}this.host.writeLogits(c)}#o(e,o=!0){return this.#e?new f("request","the engine was disposed during a WebGPU call"):(o&&(this.#r??=e),this.#s(e)??new f("backend",e))}#s(e){try{this.host.failLaunch(e)}catch(o){let r=C(o);if(r.kind==="backend")return r}return null}destroy(){if(!this.#e){this.#e=!0,this.#t?.("the engine was disposed during a WebGPU call");for(let e of[...this.buffers,this.staging,...this.#n])try{e.destroy()}catch{}this.#n.clear();try{this.device.destroy()}catch{}}}};function ye(t,e){let o=t.limits[e];return typeof o=="number"?o:void 0}function we(){return globalThis.navigator?.gpu}async function oe(t,e,o=we()){let r=p=>new f("backend",p);if(!o)throw r("the worker has no navigator.gpu, though the page's probe found a WebGPU adapter");let n;try{n=await o.requestAdapter()}catch(p){throw r(`the worker's requestAdapter failed: ${B(p)}`)}if(!n)throw r("the worker's requestAdapter returned null, though the page's probe found an adapter");if(e&&!n.features.has("shader-f16"))throw r("the host's precheck chose f16 weight storage, but the worker's adapter has no shader-f16");let l={};for(let p of ge){let y=ye(n,p),v=t.webgpu?.limits[p];if(v!==void 0&&(y===void 0||y<v))throw r(`the worker's adapter offers ${p} ${y??"none"}; the host prechecked against the probe's ${v}`);y!==void 0&&(l[p]=y)}let c;try{c=await n.requestDevice({requiredFeatures:e?["shader-f16"]:[],requiredLimits:l})}catch(p){throw r(`requestDevice refused${e?" shader-f16 with":""} the program's limits: ${B(p)}`)}let i=n.info??{};if(!n.info&&typeof n.requestAdapterInfo=="function")try{i=await n.requestAdapterInfo()}catch{i={}}let u=!1;return{device:c,f16:e,adapter:{vendor:i.vendor??"",architecture:i.architecture??""},description:i.description??"",destroy:()=>{if(!u){u=!0;try{c.destroy()}catch{}}}}}async function se(t,e,o){let r=i=>new f("backend",i),n=e.device,l=[],c=()=>{for(let i of l)i.destroy();e.destroy()};try{let i=me(o.program,o.kernels),u=i.buffers.some(w=>w.storage==="f16");if(u!==e.f16)throw r(`the program stores weights ${u?"f16":"f32"}, but the device was opened for ${e.f16?"f16":"f32"} storage`);let p=[];for(let[w,s]of i.kernels.entries()){n.pushErrorScope("validation"),n.pushErrorScope("internal");let a=null,d=null;try{let h=n.createShaderModule({code:o.kernels[w],label:s.symbol});a=n.createComputePipeline({label:s.symbol,layout:"auto",compute:{module:h,entryPoint:s.entry}})}catch(h){d=h}let g=await n.popErrorScope(),m=await n.popErrorScope()??g;if(m)throw r(`kernel ${s.symbol}: creating its pipeline: ${m.message}`);if(a===null)throw r(`kernel ${s.symbol}: creating its pipeline: ${B(d)}`);p.push(a)}for(let[w,s]of i.buffers.entries()){n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory");let a=null;try{let m=n.createBuffer({size:Math.max(4,Math.ceil(s.bytes/4)*4),usage:U.STORAGE|U.COPY_SRC|U.COPY_DST,label:s.word});if(l.push(m),s.placed){let h=t.bufferBytes(w);if(h.byteLength!==s.bytes)throw new f("backend",`buffer ${s.word}: bufferBytes gave ${h.byteLength} bytes; the buffer is ${s.bytes} at ${s.storage} storage`);if(h.byteLength%4!==0)throw new f("backend",`buffer ${s.word}: ${h.byteLength} bytes are not whole 4-byte words`);n.queue.writeBuffer(m,0,h)}}catch(m){a=m}let d=await n.popErrorScope(),g=await n.popErrorScope();if(a!==null)throw a instanceof f?a:C(a);if(d)throw r(`buffer ${s.word} (${s.bytes} bytes): out of memory: ${d.message}`);if(g)throw r(`buffer ${s.word} (${s.bytes} bytes): ${g.message}`)}let y=l[i.logits],v=n.createBuffer({size:y.size,usage:U.MAP_READ|U.COPY_DST,label:"logits readback"});return new z({...e.adapter},e.description,t,n,i,p,l,v)}catch(i){throw c(),i}}var ke=["fit","request","probe"];function ie(){return new Promise(t=>{let e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),t()},e.port2.postMessage(0)})}async function ae(t,e,o){let r,n;try{r=o.kind==="prefill"?t.resolve("prefill",o.n):t.resolve("step",o.pos),n=t.actIn(o.kind==="prefill"?o.n:1)}catch(l){try{t.failLaunch(C(l).message)}catch{}throw l}await e.run(r,n)}async function xe(t,e,o,r){if(await ae(t,e,o),!!r.launched())for(t.finishStart();;){if(!await r.between())return;let n=t.beginNext();if("delta"in n){r.delta(JSON.parse(n.delta));return}if(await ae(t,e,n.launch),!r.launched())return;let l=JSON.parse(t.finishNext());if(r.delta(l),l.done)return}}function le(t,e){let o=null,r=null,n=!1,l=null,c=!1,i=s=>{let a=s.doctor();if(r===null)return{...a,storage:null,adapter:null};let d=r.adapter,g=`webgpu (${r.description!==""?r.description:`${d.vendor} ${d.architecture}`})`,m=`backend webgpu on ${a.device}`,h=a.line.startsWith(m)?`backend webgpu on ${g}${a.line.slice(m.length)}`:a.line;return{...a,device:g,line:h,storage:r.storage,adapter:{...d}}},u=new f("request","the engine was disposed during its load"),p=()=>{if(c)throw u};async function y(s){if(o!==null||n)throw new f("request","this engine already has a model loaded");n=!0;let a=null;try{a=await t.openHost(s.probeJson,s.hostWasm,s.cdnWasm),e({id:s.id,type:"host",hostWasm:t.wasmUsed()}),p();let d=await t.hostClass(),{repo:g,revision:m}=d.resolveAlias(s.alias),h={},x=async(W,G)=>{try{let k=await t.fetchFile(g,m,W,{hubBaseUrl:s.hubBaseUrl,offline:s.offline,rememberAbsent:G,onProgress:S=>e({id:s.id,type:"progress",file:S.file,loaded:S.loaded,total:S.total})});return p(),h[W]={source:k.source,verified:k.verified},k.bytes}catch(k){if(G&&k instanceof f&&k.missing==="not-found")return null;throw k}},$=async W=>await x(W,!1),A=await $("config.json"),b=await x("model.safetensors.index.json",!0),P=a,E={...s.request,repo:g,revision:m},H,D=null,j=W=>{let G={...E,backend:"wasm"};delete G.f16,E=G;try{P.precheck(A,b,JSON.stringify(E))}catch(k){let S=C(k);throw new f(S.kind,`${S.message} (backend "auto": WebGPU refused first: ${W.message})`)}H=`webgpu refused: ${W.message}; wasm serves this load`};if(E.backend==="webgpu"){let W=null;try{W=JSON.parse(P.precheck(A,b,JSON.stringify(E)))}catch(G){let k=C(G);if(!(s.auto===!0&&ke.includes(k.kind)))throw k;j(k)}if(W!==null)try{D=await t.openDevice(JSON.parse(s.probeJson),W.f16===!0)}catch(G){let k=C(G);if(s.auto!==!0)throw k;j(k)}}else P.precheck(A,b,JSON.stringify(E));try{p();let W=JSON.stringify(E),G=await $("tokenizer.json"),k=await x("tokenizer_config.json",!0),S=[];for(let L of d.weightFiles(b))S.push(await $(L));if(D!==null){let L=P.loadWebGpu(A,G,k,S,W);S.length=0;let ue=D;D=null,r=await t.openRuntime(P,ue,L)}else{let L=P.load(A,G,k,S,W);S.length=0,await t.instantiate(P,L)}}finally{D?.destroy()}p(),o=a,e({id:s.id,type:"loaded",doctor:i(a),sources:h,...H!==void 0?{fallback:H}:{}})}catch(d){if(r?.destroy(),r=null,a!==null&&o!==a)try{a.dispose()}catch{}throw d}finally{n=!1}}async function v(s,a,d,g){let m;"messages"in s.prompt?m=a.startChatSplit(JSON.stringify(s.prompt.messages),g):"text"in s.prompt?m=a.startCompleteSplit(s.prompt.text,null,g):m=a.startCompleteSplit(null,Uint32Array.from(s.prompt.ids),g),await xe(a,d,m,{launched:()=>!c,between:async()=>(await ie(),!c),delta:h=>e({id:s.id,type:"delta",delta:h})})}async function w(s){if(l!==null)throw new f("request","a generation is already running on this engine");if(o===null)throw new f("request","no model is loaded");let a=o,d=JSON.stringify(s.options);if(r!==null){if(r.failure!==null)throw F(r.failure);l=s.id;try{return await v(s,a,r,d)}catch(g){if(c)return;throw g}finally{l=null}}l=s.id;try{for(("messages"in s.prompt)?a.startChat(JSON.stringify(s.prompt.messages),d):("text"in s.prompt)?a.startComplete(s.prompt.text,null,d):a.startComplete(null,Uint32Array.from(s.prompt.ids),d);;){if(await ie(),c)return;let g=JSON.parse(a.next());if(e({id:s.id,type:"delta",delta:g}),g.done)return}}finally{l=null}}return async s=>{try{switch(s.type){case"load":return await y(s);case"generate":return await w(s);case"abort":l===s.id&&o?.abort();return;case"doctor":if(o===null)throw new f("request","no model is loaded");e({id:s.id,type:"result",value:i(o)});return;case"dispose":c=!0,r?.destroy(),r=null,o?.dispose(),o=null,e({id:s.id,type:"result",value:null}),t.close();return}}catch(a){if(c)return;let d=C(a),g=r?.failure??null;e({id:s.id,type:"error",kind:d.kind,message:d.message,...g!==null?{fatal:g}:{}})}}}var R=globalThis,ve=le({openHost:Q,wasmUsed:Z,hostClass:ee,instantiate:re,openDevice:(t,e)=>oe(t,e),openRuntime:se,fetchFile:V,close:()=>R.close()},t=>R.postMessage(t));R.onmessage=t=>{ve(t.data)};M().then(()=>R.postMessage({id:0,type:"ready",url:R.location.href}),t=>R.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)})`}));
|
|
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)})`}));
|
package/host/caldrix_web.d.ts
CHANGED
|
@@ -51,6 +51,34 @@ export class CaldrixWeb {
|
|
|
51
51
|
* After the first launch ran and `writeLogits` wrote its row: picks the first token.
|
|
52
52
|
*/
|
|
53
53
|
finishStart(): void;
|
|
54
|
+
/**
|
|
55
|
+
* [`HEADER_FIRST_RANGE`], the page's first range of a GGUF file (the worker's
|
|
56
|
+
* `GGUF_HEADER_FIRST_RANGE` is pinned against it).
|
|
57
|
+
*/
|
|
58
|
+
static ggufHeaderFirstRange(): number;
|
|
59
|
+
/**
|
|
60
|
+
* How much of a GGUF file's head the page reads next: `0` when `prefix` holds the whole
|
|
61
|
+
* header, else the next range's length (doubling, capped at `file_bytes`). The page's first
|
|
62
|
+
* range is `HEADER_FIRST_RANGE` (4 MiB) or the whole file when smaller.
|
|
63
|
+
*/
|
|
64
|
+
static ggufHeaderNeed(prefix: Uint8Array, file_bytes: number): number;
|
|
65
|
+
/**
|
|
66
|
+
* Every alias the browser build knows: `[{ name, format }]`, `format` `"safetensors"` or
|
|
67
|
+
* `"gguf"` (what `resolveAlias` answers for that name).
|
|
68
|
+
*/
|
|
69
|
+
static listAliases(): any;
|
|
70
|
+
/**
|
|
71
|
+
* [`CaldrixWeb::load`] over a GGUF file the page verified against the alias's sha256: the
|
|
72
|
+
* precheck again on the whole file, the import (the tokenizer from the header), the lowering
|
|
73
|
+
* with the file's per-layer kinds (a quantized file lowers to the wasm tier's quantized
|
|
74
|
+
* kernels), and the placement.
|
|
75
|
+
*/
|
|
76
|
+
loadGguf(file: Uint8Array, request_json: string): Uint8Array;
|
|
77
|
+
/**
|
|
78
|
+
* [`CaldrixWeb::load_webgpu`] over a GGUF file the page verified (see
|
|
79
|
+
* [`CaldrixWeb::load_gguf`]); returns `{ program, kernels }`.
|
|
80
|
+
*/
|
|
81
|
+
loadWebGpuGguf(file: Uint8Array, request_json: string): any;
|
|
54
82
|
/**
|
|
55
83
|
* The WebGPU tier's `load`: prechecks the request (`backend: "webgpu"`) against the adapter
|
|
56
84
|
* again, imports, lowers for WebGPU (plan dtype f32, the block GEMM weights stored f16 when the
|
|
@@ -77,15 +105,22 @@ export class CaldrixWeb {
|
|
|
77
105
|
static memory(): any;
|
|
78
106
|
constructor(probe_json: string);
|
|
79
107
|
/**
|
|
80
|
-
* The next token as JSON: `{ token, text, done, finishReason, promptTokens, completionTokens }
|
|
108
|
+
* The next token as JSON: `{ token, text, done, finishReason, promptTokens, cachedTokens, completionTokens }`, plus
|
|
109
|
+
* `logprobs: [{ token, logprob }, ...]` when the options asked for them and the row has a finite entry.
|
|
81
110
|
*/
|
|
82
111
|
next(): any;
|
|
112
|
+
/**
|
|
113
|
+
* [`CaldrixWeb::precheck`] over a GGUF file's head: `header` is enough of it for the header
|
|
114
|
+
* to parse ([`CaldrixWeb::gguf_header_need`] answers 0), `file_bytes` the alias's pinned size.
|
|
115
|
+
*/
|
|
116
|
+
precheckGguf(header: Uint8Array, file_bytes: number, request_json: string): any;
|
|
83
117
|
precheck(config_json: Uint8Array, index_json: Uint8Array | null | undefined, request_json: string): any;
|
|
84
118
|
static resolveAlias(name: string): any;
|
|
85
119
|
/**
|
|
86
|
-
* The launches of `kind` (`"prefill"` with `n` rows
|
|
87
|
-
* `launches_to_words`' flat list. A call the program
|
|
88
|
-
* `backend` error ("prefill returned status 2", "step
|
|
120
|
+
* The launches of `kind` (`"prefill"` with `n` rows from the argument block's `Pos` word,
|
|
121
|
+
* `"step"` at position `n_or_pos`) as `launches_to_words`' flat list. A call the program
|
|
122
|
+
* refuses is the wasm entry's status as a `backend` error ("prefill returned status 2", "step
|
|
123
|
+
* returned status 1").
|
|
89
124
|
*/
|
|
90
125
|
resolve(kind: string, n_or_pos: number): Uint32Array;
|
|
91
126
|
startChatSplit(messages_json: string, options_json: string): any;
|
|
@@ -120,13 +155,19 @@ export interface InitOutput {
|
|
|
120
155
|
readonly caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
|
|
121
156
|
readonly caldrixweb_finishNext: (a: number, b: number) => void;
|
|
122
157
|
readonly caldrixweb_finishStart: (a: number, b: number) => void;
|
|
158
|
+
readonly caldrixweb_ggufHeaderFirstRange: () => number;
|
|
159
|
+
readonly caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
|
|
160
|
+
readonly caldrixweb_listAliases: (a: number) => void;
|
|
123
161
|
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) => void;
|
|
162
|
+
readonly caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
124
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;
|
|
164
|
+
readonly caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
125
165
|
readonly caldrixweb_logitsPtr: (a: number, b: number) => void;
|
|
126
166
|
readonly caldrixweb_memory: () => number;
|
|
127
167
|
readonly caldrixweb_new: (a: number, b: number, c: number) => void;
|
|
128
168
|
readonly caldrixweb_next: (a: number, b: number) => void;
|
|
129
169
|
readonly caldrixweb_precheck: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
|
|
170
|
+
readonly caldrixweb_precheckGguf: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
130
171
|
readonly caldrixweb_resolve: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
131
172
|
readonly caldrixweb_resolveAlias: (a: number, b: number, c: number) => void;
|
|
132
173
|
readonly caldrixweb_startChat: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
package/host/caldrix_web.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class D{__destroy_into_raw(){const t=this.__wbg_ptr;return this.__wbg_ptr=0,N.unregister(this),t}free(){const t=this.__destroy_into_raw();e.__wbg_caldrixweb_free(t,0)}abort(){e.caldrixweb_abort(this.__wbg_ptr)}actIn(t){try{const o=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_actIn(o,this.__wbg_ptr,t);var n=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),i=a().getInt32(o+8,!0);if(i)throw c(r);return c(n)}finally{e.__wbindgen_add_to_stack_pointer(16)}}argsPtr(){return e.caldrixweb_argsPtr(this.__wbg_ptr)>>>0}attach(t,n){try{const o=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_attach(o,this.__wbg_ptr,p(t),p(n));var r=a().getInt32(o+0,!0),i=a().getInt32(o+4,!0);if(i)throw c(r)}finally{e.__wbindgen_add_to_stack_pointer(16)}}beginNext(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_beginNext(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return c(t)}finally{e.__wbindgen_add_to_stack_pointer(16)}}bufferBytes(t){try{const o=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_bufferBytes(o,this.__wbg_ptr,t);var n=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),i=a().getInt32(o+8,!0);if(i)throw c(r);return c(n)}finally{e.__wbindgen_add_to_stack_pointer(16)}}dispose(){e.caldrixweb_dispose(this.__wbg_ptr)}doctor(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_doctor(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return c(t)}finally{e.__wbindgen_add_to_stack_pointer(16)}}failLaunch(t){try{const i=e.__wbindgen_add_to_stack_pointer(-16),o=l(t,e.__wbindgen_export,e.__wbindgen_export2),s=g;e.caldrixweb_failLaunch(i,this.__wbg_ptr,o,s);var n=a().getInt32(i+0,!0),r=a().getInt32(i+4,!0);if(r)throw c(n)}finally{e.__wbindgen_add_to_stack_pointer(16)}}finishNext(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_finishNext(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return c(t)}finally{e.__wbindgen_add_to_stack_pointer(16)}}finishStart(){try{const r=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_finishStart(r,this.__wbg_ptr);var t=a().getInt32(r+0,!0),n=a().getInt32(r+4,!0);if(n)throw c(t)}finally{e.__wbindgen_add_to_stack_pointer(16)}}loadWebGpu(t,n,r,i,o){try{const u=e.__wbindgen_add_to_stack_pointer(-16),x=v(t,e.__wbindgen_export),I=g,T=v(n,e.__wbindgen_export),C=g;var s=h(r)?0:v(r,e.__wbindgen_export),d=g;const j=l(o,e.__wbindgen_export,e.__wbindgen_export2),E=g;e.caldrixweb_loadWebGpu(u,this.__wbg_ptr,x,I,T,C,s,d,p(i),j,E);var w=a().getInt32(u+0,!0),f=a().getInt32(u+4,!0),y=a().getInt32(u+8,!0);if(y)throw c(f);return c(w)}finally{e.__wbindgen_add_to_stack_pointer(16)}}load(t,n,r,i,o){try{const u=e.__wbindgen_add_to_stack_pointer(-16),x=v(t,e.__wbindgen_export),I=g,T=v(n,e.__wbindgen_export),C=g;var s=h(r)?0:v(r,e.__wbindgen_export),d=g;const j=l(o,e.__wbindgen_export,e.__wbindgen_export2),E=g;e.caldrixweb_load(u,this.__wbg_ptr,x,I,T,C,s,d,p(i),j,E);var w=a().getInt32(u+0,!0),f=a().getInt32(u+4,!0),y=a().getInt32(u+8,!0);if(y)throw c(f);return c(w)}finally{e.__wbindgen_add_to_stack_pointer(16)}}logitsPtr(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_logitsPtr(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return t>>>0}finally{e.__wbindgen_add_to_stack_pointer(16)}}static memory(){const t=e.caldrixweb_memory();return c(t)}constructor(t){try{const o=e.__wbindgen_add_to_stack_pointer(-16),s=l(t,e.__wbindgen_export,e.__wbindgen_export2),d=g;e.caldrixweb_new(o,s,d);var n=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),i=a().getInt32(o+8,!0);if(i)throw c(r);return this.__wbg_ptr=n,N.register(this,this.__wbg_ptr,this),this}finally{e.__wbindgen_add_to_stack_pointer(16)}}next(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_next(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return c(t)}finally{e.__wbindgen_add_to_stack_pointer(16)}}precheck(t,n,r){try{const f=e.__wbindgen_add_to_stack_pointer(-16),y=v(t,e.__wbindgen_export),u=g;var i=h(n)?0:v(n,e.__wbindgen_export),o=g;const x=l(r,e.__wbindgen_export,e.__wbindgen_export2),I=g;e.caldrixweb_precheck(f,this.__wbg_ptr,y,u,i,o,x,I);var s=a().getInt32(f+0,!0),d=a().getInt32(f+4,!0),w=a().getInt32(f+8,!0);if(w)throw c(d);return c(s)}finally{e.__wbindgen_add_to_stack_pointer(16)}}static resolveAlias(t){try{const o=e.__wbindgen_add_to_stack_pointer(-16),s=l(t,e.__wbindgen_export,e.__wbindgen_export2),d=g;e.caldrixweb_resolveAlias(o,s,d);var n=a().getInt32(o+0,!0),r=a().getInt32(o+4,!0),i=a().getInt32(o+8,!0);if(i)throw c(r);return c(n)}finally{e.__wbindgen_add_to_stack_pointer(16)}}resolve(t,n){try{const s=e.__wbindgen_add_to_stack_pointer(-16),d=l(t,e.__wbindgen_export,e.__wbindgen_export2),w=g;e.caldrixweb_resolve(s,this.__wbg_ptr,d,w,n);var r=a().getInt32(s+0,!0),i=a().getInt32(s+4,!0),o=a().getInt32(s+8,!0);if(o)throw c(i);return c(r)}finally{e.__wbindgen_add_to_stack_pointer(16)}}startChatSplit(t,n){try{const s=e.__wbindgen_add_to_stack_pointer(-16),d=l(t,e.__wbindgen_export,e.__wbindgen_export2),w=g,f=l(n,e.__wbindgen_export,e.__wbindgen_export2),y=g;e.caldrixweb_startChatSplit(s,this.__wbg_ptr,d,w,f,y);var r=a().getInt32(s+0,!0),i=a().getInt32(s+4,!0),o=a().getInt32(s+8,!0);if(o)throw c(i);return c(r)}finally{e.__wbindgen_add_to_stack_pointer(16)}}startChat(t,n){try{const s=e.__wbindgen_add_to_stack_pointer(-16),d=l(t,e.__wbindgen_export,e.__wbindgen_export2),w=g,f=l(n,e.__wbindgen_export,e.__wbindgen_export2),y=g;e.caldrixweb_startChat(s,this.__wbg_ptr,d,w,f,y);var r=a().getInt32(s+0,!0),i=a().getInt32(s+4,!0),o=a().getInt32(s+8,!0);if(o)throw c(i);return r>>>0}finally{e.__wbindgen_add_to_stack_pointer(16)}}startCompleteSplit(t,n,r){try{const u=e.__wbindgen_add_to_stack_pointer(-16);var i=h(t)?0:l(t,e.__wbindgen_export,e.__wbindgen_export2),o=g,s=h(n)?0:z(n,e.__wbindgen_export),d=g;const x=l(r,e.__wbindgen_export,e.__wbindgen_export2),I=g;e.caldrixweb_startCompleteSplit(u,this.__wbg_ptr,i,o,s,d,x,I);var w=a().getInt32(u+0,!0),f=a().getInt32(u+4,!0),y=a().getInt32(u+8,!0);if(y)throw c(f);return c(w)}finally{e.__wbindgen_add_to_stack_pointer(16)}}startComplete(t,n,r){try{const u=e.__wbindgen_add_to_stack_pointer(-16);var i=h(t)?0:l(t,e.__wbindgen_export,e.__wbindgen_export2),o=g,s=h(n)?0:z(n,e.__wbindgen_export),d=g;const x=l(r,e.__wbindgen_export,e.__wbindgen_export2),I=g;e.caldrixweb_startComplete(u,this.__wbg_ptr,i,o,s,d,x,I);var w=a().getInt32(u+0,!0),f=a().getInt32(u+4,!0),y=a().getInt32(u+8,!0);if(y)throw c(f);return w>>>0}finally{e.__wbindgen_add_to_stack_pointer(16)}}vocab(){try{const i=e.__wbindgen_add_to_stack_pointer(-16);e.caldrixweb_vocab(i,this.__wbg_ptr);var t=a().getInt32(i+0,!0),n=a().getInt32(i+4,!0),r=a().getInt32(i+8,!0);if(r)throw c(n);return t>>>0}finally{e.__wbindgen_add_to_stack_pointer(16)}}static weightFiles(t){try{const d=e.__wbindgen_add_to_stack_pointer(-16);var n=h(t)?0:v(t,e.__wbindgen_export),r=g;e.caldrixweb_weightFiles(d,n,r);var i=a().getInt32(d+0,!0),o=a().getInt32(d+4,!0),s=a().getInt32(d+8,!0);if(s)throw c(o);return c(i)}finally{e.__wbindgen_add_to_stack_pointer(16)}}writeLogits(t){try{const i=e.__wbindgen_add_to_stack_pointer(-16),o=v(t,e.__wbindgen_export),s=g;e.caldrixweb_writeLogits(i,this.__wbg_ptr,o,s);var n=a().getInt32(i+0,!0),r=a().getInt32(i+4,!0);if(r)throw c(n)}finally{e.__wbindgen_add_to_stack_pointer(16)}}}Symbol.dispose&&(D.prototype[Symbol.dispose]=D.prototype.free);function B(){return{__proto__:null,"./caldrix_web_bg.js":{__proto__:null,__wbg___wbindgen_memory_caa4a6165639c8b5:function(){const t=e.memory;return p(t)},__wbg___wbindgen_number_get_2e0e7dee9f701a71:function(t,n){const r=b(n),i=typeof r=="number"?r:void 0;a().setFloat64(t+8,h(i)?0:i,!0),a().setInt32(t+0,!h(i),!0)},__wbg___wbindgen_string_get_0380ccaa2f57f0d9:function(t,n){const r=b(n),i=typeof r=="string"?r:void 0;var o=h(i)?0:l(i,e.__wbindgen_export,e.__wbindgen_export2),s=g;a().setInt32(t+4,s,!0),a().setInt32(t+0,o,!0)},__wbg___wbindgen_throw_41e9ee4f547fc59a:function(t,n){throw new Error(P(t,n))},__wbg_call_1875a20c43a36133:function(){return U(function(t,n,r,i){const o=b(t).call(b(n),b(r),b(i));return p(o)},arguments)},__wbg_call_187d372bd5fdd4aa:function(){return U(function(t,n,r){const i=b(t).call(b(n),b(r));return p(i)},arguments)},__wbg_getRandomValues_a608c4436c19407a:function(){return U(function(t,n){globalThis.crypto.getRandomValues(F(t,n))},arguments)},__wbg_get_unchecked_288889d017702237:function(t,n){const r=b(t)[n>>>0];return p(r)},__wbg_instanceof_Error_80a725f81f2e102d:function(t){let n;try{n=b(t)instanceof Error}catch{n=!1}return n},__wbg_instanceof_Uint8Array_828cef2aaacafc31:function(t){let n;try{n=b(t)instanceof Uint8Array}catch{n=!1}return n},__wbg_length_7f3c00c40364105e:function(t){return b(t).length},__wbg_length_d4bdea10311bd9cf:function(t){return b(t).length},__wbg_message_5f8387f0c32b90a7:function(t){const n=b(t).message;return p(n)},__wbg_new_617a8cdb8bb1130e:function(){const t=new Object;return p(t)},__wbg_new_ee2291f50781bf1d:function(){const t=new Array;return p(t)},__wbg_new_from_slice_37a3c3a194266cb8:function(t,n){const r=new Uint32Array(G(t,n));return p(r)},__wbg_new_from_slice_9a868026ffa4208a:function(t,n){const r=new Uint8Array(F(t,n));return p(r)},__wbg_prototypesetcall_bc27214492979395:function(t,n,r){Uint8Array.prototype.set.call(F(t,n),b(r))},__wbg_push_2baf45db356cf468:function(t,n){return b(t).push(b(n))},__wbg_set_145a351398b48c65:function(){return U(function(t,n,r){return Reflect.set(b(t),b(n),b(r))},arguments)},__wbindgen_generic_0000000000000001:function(t){return p(t)},__wbindgen_generic_0000000000000002:function(t,n){const r=P(t,n);return p(r)},__wbindgen_object_drop_ref:function(t){c(t)}}}}const N=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(_=>e.__wbg_caldrixweb_free(_,1));function p(_){R===k.length&&k.push(k.length+1);const t=R;return R=k[t],k[t]=_,t}function q(_){_<1028||(k[_]=R,R=_)}function G(_,t){return _=_>>>0,V().subarray(_/4,_/4+t)}function F(_,t){return _=_>>>0,A().subarray(_/1,_/1+t)}let m=null;function a(){return(m===null||m.buffer.detached===!0||m.buffer.detached===void 0&&m.buffer!==e.memory.buffer)&&(m=new DataView(e.memory.buffer)),m}function P(_,t){return X(_>>>0,t)}let W=null;function V(){return(W===null||W.byteLength===0)&&(W=new Uint32Array(e.memory.buffer)),W}let S=null;function A(){return(S===null||S.byteLength===0)&&(S=new Uint8Array(e.memory.buffer)),S}function b(_){return k[_]}function U(_,t){try{return _.apply(this,t)}catch(n){e.__wbindgen_export3(p(n))}}let k=new Array(1024).fill(void 0);k.push(void 0,null,!0,!1);let R=k.length;function h(_){return _==null}function z(_,t){const n=t(_.length*4,4)>>>0;return V().set(_,n/4),g=_.length,n}function v(_,t){const n=t(_.length*1,1)>>>0;return A().set(_,n/1),g=_.length,n}function l(_,t,n){if(n===void 0){const d=O.encode(_),w=t(d.length,1)>>>0;return A().subarray(w,w+d.length).set(d),g=d.length,w}let r=_.length,i=t(r,1)>>>0;const o=A();let s=0;for(;s<r;s++){const d=_.charCodeAt(s);if(d>127)break;o[i+s]=d}if(s!==r){s!==0&&(_=_.slice(s)),i=n(i,r,r=s+_.length*3,1)>>>0;const d=A().subarray(i+s,i+r),w=O.encodeInto(_,d);s+=w.written,i=n(i,r,s,1)>>>0}return g=s,i}function c(_){const t=b(_);return q(_),t}let M=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});M.decode();const H=2146435072;let L=0;function X(_,t){return L+=t,L>=H&&(M=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),M.decode(),L=t),M.decode(A().subarray(_,_+t))}const O=new TextEncoder;"encodeInto"in O||(O.encodeInto=function(_,t){const n=O.encode(_);return t.set(n),{read:_.length,written:n.length}});let g=0,Y,J,e;function $(_,t){return J=_,e=_.exports,Y=t,m=null,W=null,S=null,e}async function K(_,t){if(typeof Response=="function"&&_ instanceof Response){if(!_.ok)throw new Error(`failed to fetch Wasm: ${_.status} ${_.statusText} fetching '${_.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(_,t)}catch(i){if(n(_.type)&&_.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",i);else throw i}const r=await _.arrayBuffer();return await WebAssembly.instantiate(r,t)}else{const r=await WebAssembly.instantiate(_,t);return r instanceof WebAssembly.Instance?{instance:r,module:_}:r}function n(r){switch(r){case"basic":case"cors":case"default":return!0}return!1}}function Q(_){if(e!==void 0)return e;_!==void 0&&(Object.getPrototypeOf(_)===Object.prototype?{module:_}=_:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const t=B();_ instanceof WebAssembly.Module||(_=new WebAssembly.Module(_));const n=new WebAssembly.Instance(_,t);return $(n,_)}async function Z(_){if(e!==void 0)return e;_!==void 0&&(Object.getPrototypeOf(_)===Object.prototype?{module_or_path:_}=_:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),_===void 0&&(_=new URL("caldrix_web_bg.wasm",import.meta.url));const t=B();(typeof _=="string"||typeof Request=="function"&&_ instanceof Request||typeof URL=="function"&&_ instanceof URL)&&(_=fetch(_));const{instance:n,module:r}=await K(await _,t);return $(n,r)}export{D as CaldrixWeb,Z as default,Q as initSync};
|
|
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};
|
package/host/caldrix_web_bg.wasm
CHANGED
|
Binary file
|
|
@@ -13,13 +13,19 @@ export const caldrixweb_doctor: (a: number, b: number) => void;
|
|
|
13
13
|
export const caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
|
|
14
14
|
export const caldrixweb_finishNext: (a: number, b: number) => void;
|
|
15
15
|
export const caldrixweb_finishStart: (a: number, b: number) => void;
|
|
16
|
+
export const caldrixweb_ggufHeaderFirstRange: () => number;
|
|
17
|
+
export const caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
|
|
18
|
+
export const caldrixweb_listAliases: (a: number) => void;
|
|
16
19
|
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) => void;
|
|
20
|
+
export const caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
17
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;
|
|
22
|
+
export const caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
18
23
|
export const caldrixweb_logitsPtr: (a: number, b: number) => void;
|
|
19
24
|
export const caldrixweb_memory: () => number;
|
|
20
25
|
export const caldrixweb_new: (a: number, b: number, c: number) => void;
|
|
21
26
|
export const caldrixweb_next: (a: number, b: number) => void;
|
|
22
27
|
export const caldrixweb_precheck: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
|
|
28
|
+
export const caldrixweb_precheckGguf: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
23
29
|
export const caldrixweb_resolve: (a: number, b: number, c: number, d: number, e: number) => void;
|
|
24
30
|
export const caldrixweb_resolveAlias: (a: number, b: number, c: number) => void;
|
|
25
31
|
export const caldrixweb_startChat: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
package/package.json
CHANGED