@caldrix-ai/caldrix 0.4.0 → 0.5.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 +6 -0
- package/README.md +1 -1
- package/dist/index.js +1 -1
- package/host/caldrix_web_bg.wasm +0 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
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.5.0 — 2026-11-04
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- `Caldrix.load` of a repo that ships a SentencePiece Unigram `tokenizer.model` and no `tokenizer.json` (sarashina2.2 and kin) converts the tokenizer in the browser and loads; a Unigram model whose normalizer or options inferno cannot reproduce exactly is still refused by name before any weight byte; run in headless Chromium on a synthetic Unigram tiny model through the loopback hub on the wasm tier and on the WebGPU tier on SwiftShader (a CPU); no real Unigram model has run in a browser — sarashina2.2-0.5b does not fit the wasm32 ceiling (read from its config) (`inferno/WEB-VERIFICATION.md` records nothing for it).
|
|
11
|
+
|
|
6
12
|
## 0.4.0 — 2026-11-04
|
|
7
13
|
|
|
8
14
|
### 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: f98830098511cd54cb12de1f25c9b55469b5a532 -->
|
|
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
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as F,b as i,d as _}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function V(e){return W(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>W(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function Q(e){return!W(e)||typeof e.url!="string"?!1:e.failed===void 0||W(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function L(e){if(!W(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return Q(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number")&&typeof e.repo=="string"&&typeof e.revision=="string"&&(e.provenance===void 0||typeof e.provenance=="string");case"loaded":return W(e.doctor)&&W(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>W(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"checked":return e.backend==="webgpu"||e.backend==="wasm";case"delta":return V(e.delta);case"result":return"value"in e;case"error":return F(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function w(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var C=(...e)=>new Uint8Array(e),Z={simd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:C(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function j(){let e={};for(let[t,n]of Object.entries(Z))e[t]=WebAssembly.validate(n);return e}var Y=1e3,S=Symbol("timed out");async function N(e){let t,n=new Promise(r=>{t=setTimeout(()=>r(S),Y)});try{return await Promise.race([e,n])}finally{clearTimeout(t)}}var J=e=>e instanceof Error?e.message:String(e);function H(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function E(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ee(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let n=t,r=n.getContext("webgl2"),o=r??n.getContext("webgl");if(!o)return e;let a=E(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(r?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:a,floatColorBuffer:l}}catch{return e}}async function te(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let n={},r=[];if(e.limits)for(let o in e.limits){let a=e.limits[o];typeof a=="number"?(n[o]=a,Number.isSafeInteger(a)||r.push(`${o} = ${a} (not a safe integer)`)):typeof a!="function"&&r.push(`${o} = ${JSON.stringify(a)??String(a)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:n,unrepresentable:r}}async function re(){let e=H().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let r=await N(e.requestAdapter());if(r===S)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=r}catch(r){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${J(r)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let n=await te(t);try{let r=await N(t.requestDevice());if(r===S)return{webgpu:n,available:!1,reason:"requestDevice timed out"};r.destroy?.()}catch(r){return{webgpu:n,available:!1,reason:`requestDevice refused: ${J(r)}`}}return{webgpu:n,available:!0}}function ne(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function oe(e,t,n){let r=e.webgpu?.unrepresentable??[],o=r.length>0?`; adapter limits ${r.join(", ")}: the host reads them as missing`:"";return se(e,t,n)+o}function se(e,t,n){if(n==="webgpu"){let o=e.webgpu,a=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${a}: webgpu`}let r=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${r}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${r}`}async function O(){let e=H(),t=await re(),n={wasm:j(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:E(e.hardwareConcurrency)},webgl:ee(),webgpu:t.webgpu,memory:{deviceMemoryGiB:E(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};n.tiers.webgl.available=n.webgl.available;let r=ne(n.tiers);return{...n,chosen:r,why:oe(n,t,r)}}function K(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,n])=>Number.isSafeInteger(n)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var ae="https://huggingface.co";function ie(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var le="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.4.0/";function I(e){return e instanceof Error?e.message:String(e)}function D(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function ue(e,t){let n=G(e,t),r=null,o=()=>{r!==null&&URL.revokeObjectURL(r),r=null};try{return!n&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:n?(r=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(r,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(a){throw o(),a}}function de(e){return typeof location<"u"&&e.origin!==location.origin}function G(e,t){return de(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function P(e){return!e.chosen&&!G(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${G(e.url,e.chosen)?" (through a same-origin shim)":""}`}var U=class{constructor(t){this.reason=t}reason};function ce(e,t,n){return new Promise((r,o)=>{let a;try{a=ue(e.url,e.chosen)}catch(c){o(new U(`the page could not construct it: ${I(c)}`));return}let{worker:l,revoke:m}=a,u=()=>d(n()),d=(c,s=e.url)=>{if(m(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",u),c===null)return r({worker:l,url:s});l.terminate(),o(c)};t?.addEventListener("abort",u,{once:!0}),l.onerror=c=>d(new U(c.message||"it did not load")),l.onmessage=c=>{let s=c.data;if(!L(s)||s.id!==0)return d(w(s));if(s.type==="ready")return a.literal?URL.canParse(s.url)?d(null,new URL(s.url)):d(w(s)):d(null);if(s.type==="error")return d(new U(s.message));d(w(s))}})}async function fe(e,t,n,r){let o=[];for(let d of e)try{let{worker:c,url:s}=await ce(d,n,r),b=o[0];return{worker:c,used:d,url:s,...b!==void 0?{failed:{what:P(b.t),reason:b.reason}}:{}}}catch(c){if(!(c instanceof U))throw c;o.push({t:d,reason:c.reason})}let[a,l]=o;if(a!==void 0&&l!==void 0){let d=l.t.url.origin;throw new i("backend",`${P(a.t)} did not start (${a.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${d} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${d} for the modules it imports, connect-src ${d} for the .wasm)`)}let m=a,u=t&&m.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${P(m.t)} did not start: ${m.reason}${u}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function pe(e,t,n){let r=n!==void 0?`, and with it the host .wasm from ${n}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${r}`}function be(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function X(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function me(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}async function z(e,t,n){let r=t.backend??"auto";if(r==="webgl")throw new i("backend","the webgl backend is not built");if(r!=="auto"&&r!=="webgpu"&&r!=="wasm")throw new i("request",`backend ${JSON.stringify(r)} is not auto, webgpu, wasm or webgl`);if(typeof e!="string"||e==="")throw new i("request","load takes a model alias or a Hub repo id (owner/name[@revision]), a non-empty string");let o=D("worker",t.assets?.worker),a=D("hostWasm",t.assets?.hostWasm),l=t.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let m=D("cdn",t.assets?.cdn)??new URL(le);m.pathname.endsWith("/")||(m.pathname+="/");let u=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ie(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&u.push({url:new URL("dist/worker.js",m),chosen:!0,source:"cdn"});let d=l&&a===void 0?new URL("host/caldrix_web_bg.wasm",m).href:void 0,c=t.storage??"auto";if(c!=="auto"&&c!=="f32")throw new i("request",`storage ${JSON.stringify(c)} is not auto or f32`);if(r==="wasm"&&c==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);if(t.hubBaseUrl!==void 0){let h=t.hubBaseUrl,x=!1;if(typeof h=="string")try{let M=new URL(h);x=M.protocol==="http:"||M.protocol==="https:"}catch{x=!1}if(!x)throw new i("request",`hubBaseUrl must be an absolute http(s) URL, not ${JSON.stringify(h).slice(0,80)}`)}let s=()=>new i("fetch",`${n?"checking":"loading"} ${e} was aborted`),b=t.signal;if(b?.aborted)throw s();let f=await O(),g,v;if(r==="auto"&&t.dtype==="bf16"&&f.chosen==="webgpu")g="wasm",v=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${f.why}`;else if(r==="auto")g=f.chosen,v=f.why;else if(r==="webgpu"){if(!f.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${f.tiers.webgpu.reason??f.why}`);g="webgpu",v=`backend "webgpu" asked for; ${f.why}`}else g="wasm",v=`backend "wasm" asked for; ${f.why}`;let p=f.webgpu?.unrepresentable??[];if(b?.aborted)throw s();let k=await fe(u,!l,b,s),{worker:R}=k,$=k.url,A={id:1,type:"load",model:e,probeJson:K(f),request:{backend:g,...t.dtype!==void 0?{dtype:t.dtype}:{},...t.maxContext!==void 0?{maxContext:t.maxContext}:{},...g==="webgpu"&&c==="f32"?{f16:!1}:{}},...r==="auto"&&g==="webgpu"?{auto:!0}:{},...n?{check:!0}:{},offline:t.offline??!1,hubBaseUrl:t.hubBaseUrl??ae,...a!==void 0?{hostWasm:a.href}:{},...d!==void 0?{cdnWasm:d}:{}},y={worker:R,used:k.used,workerUrl:$,caps:f,why:v,hostWasm:a,request:A,signal:b,aborted:s,fellBack:null,wasm:null,noted:h=>y.fellBack===null?h:new i(h.kind,`${h.message} (after a CDN fallback: ${y.fellBack})`,h.missing),host:h=>y.wasm!==null?!1:(y.wasm=h,h.failed!==void 0&&(y.fellBack=be({...h,failed:h.failed}),X(y.fellBack)),!0),workerError:h=>{let x=h.kind==="probe"&&p.length>0?`; the browser gave ${p.join(", ")}, which the host reads as missing`:"";return new i(h.kind,h.message+x)}};if(k.failed!==void 0&&(y.fellBack=pe(k.failed,$.href,a===void 0?d:void 0),X(y.fellBack)),b?.aborted)throw R.terminate(),y.noted(s());return y}function B(e){return e instanceof i?{ok:!1,kind:e.kind,message:e.message}:{ok:!1,kind:"backend",message:I(e)}}var q=class{static async load(t,n={}){let r=await z(t,n,!1),{worker:o,workerUrl:a,signal:l,request:m,hostWasm:u,caps:d}=r;return new Promise((c,s)=>{let b=()=>g(r.aborted()),f=()=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",b)},g=v=>{f(),o.terminate(),s(r.noted(v))};if(l?.addEventListener("abort",b,{once:!0}),l?.aborted)return g(r.aborted());o.onerror=v=>g(new i("backend",`the engine's worker from ${a.href} failed: ${v.message||"it did not start"}`)),o.onmessage=v=>{let p=v.data;if(!L(p)||p.id!==m.id)return g(w(p));switch(p.type){case"host":return r.host(p.hostWasm)?void 0:g(w(p));case"progress":try{n.onProgress?.({file:p.file,loaded:p.loaded,total:p.total,repo:p.repo,revision:p.revision,...p.provenance!==void 0?{provenance:p.provenance}:{}})}catch(k){g(k instanceof i?k:new i("request",`onProgress threw: ${I(k)}`))}return;case"loaded":{let k=r.wasm;if(k===null)return g(w(p));f();let R=r.used.source,$=u!==void 0||R==="page"&&k.failed===void 0?"page":k.failed!==void 0||R==="cdn"?"cdn":"bundle",A={worker:{source:R,url:a.href},hostWasm:{source:$,url:k.url}},y={...p.doctor,source:p.sources,why:p.fallback!==void 0?`${p.fallback}; ${d.why}`:r.why,assets:A};c(new T(o,y));return}case"error":return g(r.workerError(p));default:return g(w(p))}},o.postMessage(m)})}static async check(t,n={}){let r;try{let u=n??{};r=await z(t,{...u.backend!==void 0?{backend:u.backend}:{},...u.dtype!==void 0?{dtype:u.dtype}:{},...u.maxContext!==void 0?{maxContext:u.maxContext}:{},...u.storage!==void 0?{storage:u.storage}:{},...u.hubBaseUrl!==void 0?{hubBaseUrl:u.hubBaseUrl}:{},...u.signal!==void 0?{signal:u.signal}:{},...u.assets!==void 0?{assets:u.assets}:{}},!0)}catch(u){return B(u)}let{worker:o,workerUrl:a,signal:l,request:m}=r;return new Promise(u=>{let d=()=>s(r.aborted()),c=b=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",d),o.terminate(),u(b)},s=b=>c(B(r.noted(b)));if(l?.addEventListener("abort",d,{once:!0}),l?.aborted)return s(r.aborted());o.onerror=b=>s(new i("backend",`the engine's worker from ${a.href} failed: ${b.message||"it did not start"}`)),o.onmessage=b=>{let f=b.data;if(!L(f)||f.id!==m.id)return s(w(f));switch(f.type){case"host":return r.host(f.hostWasm)?void 0:s(w(f));case"progress":return;case"checked":return r.wasm===null?s(w(f)):c({ok:!0,backend:f.backend});case"error":return s(r.workerError(f));default:return s(w(f))}};try{o.postMessage(m)}catch(b){c(B(b))}})}},T=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,n){this.#r=t,this.#n=n,t.onmessage=r=>this.#d(r.data),t.onerror=r=>this.#a(new i("backend",`the engine's worker failed: ${r.message||"it stopped"}`))}chat(t,n={}){return this.#s(),this.#u({messages:t},n)}complete(t,n={}){this.#s();let r;if(typeof t=="string")r={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");r={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(r,n)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([a,l])=>[a,{...l}])),{worker:n,hostWasm:r}=this.#n.assets,o=this.#n.aliases.map(a=>({...a}));return{...this.#n,source:t,aliases:o,assets:{worker:{...n},hostWasm:{...r}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!L(t))return this.#a(w(t));let n=this.#o;if(n===null||t.id!==n.id)return this.#a(w(t));switch(t.type){case"delta":return n.sink(me(t.delta));case"error":return t.fatal!==void 0&&(this.#e=_(t.fatal)),n.sink(new i(t.kind,t.message));default:return this.#a(w(t))}}async*#u(t,n){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:r,...o}=n;if(r?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let a=this.#l++,l=[],m=null;this.#o={id:a,sink:s=>{l.push(s),m?.()}};let u=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:a,type:"abort"})},d=!1,c=async()=>{for(;l.length===0;)await new Promise(s=>m=s);return m=null,l.shift()};try{for(this.#r.postMessage({id:a,type:"generate",prompt:t,options:o}),r?.addEventListener("abort",u,{once:!0});;){let s=await c();if(s instanceof i)throw d=!0,s;if(s.done&&(d=!0),yield s,s.done)return}}finally{if(r?.removeEventListener("abort",u),!d)try{for(u();!(this.#t||this.#e);){let s=await c();if(s instanceof i||s.done)break}}catch{}this.#o=null,this.#i=!1}}};export{q as Caldrix,i as CaldrixError,T as Engine,O as probe};
|
|
1
|
+
import{a as F,b as i,d as _}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function V(e){return W(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>W(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function Q(e){return!W(e)||typeof e.url!="string"?!1:e.failed===void 0||W(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function L(e){if(!W(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return Q(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number")&&typeof e.repo=="string"&&typeof e.revision=="string"&&(e.provenance===void 0||typeof e.provenance=="string");case"loaded":return W(e.doctor)&&W(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>W(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"checked":return e.backend==="webgpu"||e.backend==="wasm";case"delta":return V(e.delta);case"result":return"value"in e;case"error":return F(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function w(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var C=(...e)=>new Uint8Array(e),Z={simd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:C(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function j(){let e={};for(let[t,n]of Object.entries(Z))e[t]=WebAssembly.validate(n);return e}var Y=1e3,S=Symbol("timed out");async function N(e){let t,n=new Promise(r=>{t=setTimeout(()=>r(S),Y)});try{return await Promise.race([e,n])}finally{clearTimeout(t)}}var J=e=>e instanceof Error?e.message:String(e);function H(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function E(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ee(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let n=t,r=n.getContext("webgl2"),o=r??n.getContext("webgl");if(!o)return e;let a=E(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(r?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:a,floatColorBuffer:l}}catch{return e}}async function te(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let n={},r=[];if(e.limits)for(let o in e.limits){let a=e.limits[o];typeof a=="number"?(n[o]=a,Number.isSafeInteger(a)||r.push(`${o} = ${a} (not a safe integer)`)):typeof a!="function"&&r.push(`${o} = ${JSON.stringify(a)??String(a)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:n,unrepresentable:r}}async function re(){let e=H().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let r=await N(e.requestAdapter());if(r===S)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=r}catch(r){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${J(r)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let n=await te(t);try{let r=await N(t.requestDevice());if(r===S)return{webgpu:n,available:!1,reason:"requestDevice timed out"};r.destroy?.()}catch(r){return{webgpu:n,available:!1,reason:`requestDevice refused: ${J(r)}`}}return{webgpu:n,available:!0}}function ne(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function oe(e,t,n){let r=e.webgpu?.unrepresentable??[],o=r.length>0?`; adapter limits ${r.join(", ")}: the host reads them as missing`:"";return se(e,t,n)+o}function se(e,t,n){if(n==="webgpu"){let o=e.webgpu,a=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${a}: webgpu`}let r=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${r}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${r}`}async function O(){let e=H(),t=await re(),n={wasm:j(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:E(e.hardwareConcurrency)},webgl:ee(),webgpu:t.webgpu,memory:{deviceMemoryGiB:E(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};n.tiers.webgl.available=n.webgl.available;let r=ne(n.tiers);return{...n,chosen:r,why:oe(n,t,r)}}function K(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,n])=>Number.isSafeInteger(n)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var ae="https://huggingface.co";function ie(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var le="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.5.0/";function I(e){return e instanceof Error?e.message:String(e)}function D(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function ue(e,t){let n=G(e,t),r=null,o=()=>{r!==null&&URL.revokeObjectURL(r),r=null};try{return!n&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:n?(r=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(r,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(a){throw o(),a}}function de(e){return typeof location<"u"&&e.origin!==location.origin}function G(e,t){return de(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function P(e){return!e.chosen&&!G(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${G(e.url,e.chosen)?" (through a same-origin shim)":""}`}var U=class{constructor(t){this.reason=t}reason};function ce(e,t,n){return new Promise((r,o)=>{let a;try{a=ue(e.url,e.chosen)}catch(c){o(new U(`the page could not construct it: ${I(c)}`));return}let{worker:l,revoke:m}=a,u=()=>d(n()),d=(c,s=e.url)=>{if(m(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",u),c===null)return r({worker:l,url:s});l.terminate(),o(c)};t?.addEventListener("abort",u,{once:!0}),l.onerror=c=>d(new U(c.message||"it did not load")),l.onmessage=c=>{let s=c.data;if(!L(s)||s.id!==0)return d(w(s));if(s.type==="ready")return a.literal?URL.canParse(s.url)?d(null,new URL(s.url)):d(w(s)):d(null);if(s.type==="error")return d(new U(s.message));d(w(s))}})}async function fe(e,t,n,r){let o=[];for(let d of e)try{let{worker:c,url:s}=await ce(d,n,r),b=o[0];return{worker:c,used:d,url:s,...b!==void 0?{failed:{what:P(b.t),reason:b.reason}}:{}}}catch(c){if(!(c instanceof U))throw c;o.push({t:d,reason:c.reason})}let[a,l]=o;if(a!==void 0&&l!==void 0){let d=l.t.url.origin;throw new i("backend",`${P(a.t)} did not start (${a.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${d} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${d} for the modules it imports, connect-src ${d} for the .wasm)`)}let m=a,u=t&&m.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${P(m.t)} did not start: ${m.reason}${u}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function pe(e,t,n){let r=n!==void 0?`, and with it the host .wasm from ${n}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${r}`}function be(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function X(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function me(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}async function z(e,t,n){let r=t.backend??"auto";if(r==="webgl")throw new i("backend","the webgl backend is not built");if(r!=="auto"&&r!=="webgpu"&&r!=="wasm")throw new i("request",`backend ${JSON.stringify(r)} is not auto, webgpu, wasm or webgl`);if(typeof e!="string"||e==="")throw new i("request","load takes a model alias or a Hub repo id (owner/name[@revision]), a non-empty string");let o=D("worker",t.assets?.worker),a=D("hostWasm",t.assets?.hostWasm),l=t.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let m=D("cdn",t.assets?.cdn)??new URL(le);m.pathname.endsWith("/")||(m.pathname+="/");let u=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ie(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&u.push({url:new URL("dist/worker.js",m),chosen:!0,source:"cdn"});let d=l&&a===void 0?new URL("host/caldrix_web_bg.wasm",m).href:void 0,c=t.storage??"auto";if(c!=="auto"&&c!=="f32")throw new i("request",`storage ${JSON.stringify(c)} is not auto or f32`);if(r==="wasm"&&c==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);if(t.hubBaseUrl!==void 0){let h=t.hubBaseUrl,x=!1;if(typeof h=="string")try{let M=new URL(h);x=M.protocol==="http:"||M.protocol==="https:"}catch{x=!1}if(!x)throw new i("request",`hubBaseUrl must be an absolute http(s) URL, not ${JSON.stringify(h).slice(0,80)}`)}let s=()=>new i("fetch",`${n?"checking":"loading"} ${e} was aborted`),b=t.signal;if(b?.aborted)throw s();let f=await O(),g,v;if(r==="auto"&&t.dtype==="bf16"&&f.chosen==="webgpu")g="wasm",v=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${f.why}`;else if(r==="auto")g=f.chosen,v=f.why;else if(r==="webgpu"){if(!f.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${f.tiers.webgpu.reason??f.why}`);g="webgpu",v=`backend "webgpu" asked for; ${f.why}`}else g="wasm",v=`backend "wasm" asked for; ${f.why}`;let p=f.webgpu?.unrepresentable??[];if(b?.aborted)throw s();let k=await fe(u,!l,b,s),{worker:R}=k,$=k.url,A={id:1,type:"load",model:e,probeJson:K(f),request:{backend:g,...t.dtype!==void 0?{dtype:t.dtype}:{},...t.maxContext!==void 0?{maxContext:t.maxContext}:{},...g==="webgpu"&&c==="f32"?{f16:!1}:{}},...r==="auto"&&g==="webgpu"?{auto:!0}:{},...n?{check:!0}:{},offline:t.offline??!1,hubBaseUrl:t.hubBaseUrl??ae,...a!==void 0?{hostWasm:a.href}:{},...d!==void 0?{cdnWasm:d}:{}},y={worker:R,used:k.used,workerUrl:$,caps:f,why:v,hostWasm:a,request:A,signal:b,aborted:s,fellBack:null,wasm:null,noted:h=>y.fellBack===null?h:new i(h.kind,`${h.message} (after a CDN fallback: ${y.fellBack})`,h.missing),host:h=>y.wasm!==null?!1:(y.wasm=h,h.failed!==void 0&&(y.fellBack=be({...h,failed:h.failed}),X(y.fellBack)),!0),workerError:h=>{let x=h.kind==="probe"&&p.length>0?`; the browser gave ${p.join(", ")}, which the host reads as missing`:"";return new i(h.kind,h.message+x)}};if(k.failed!==void 0&&(y.fellBack=pe(k.failed,$.href,a===void 0?d:void 0),X(y.fellBack)),b?.aborted)throw R.terminate(),y.noted(s());return y}function B(e){return e instanceof i?{ok:!1,kind:e.kind,message:e.message}:{ok:!1,kind:"backend",message:I(e)}}var q=class{static async load(t,n={}){let r=await z(t,n,!1),{worker:o,workerUrl:a,signal:l,request:m,hostWasm:u,caps:d}=r;return new Promise((c,s)=>{let b=()=>g(r.aborted()),f=()=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",b)},g=v=>{f(),o.terminate(),s(r.noted(v))};if(l?.addEventListener("abort",b,{once:!0}),l?.aborted)return g(r.aborted());o.onerror=v=>g(new i("backend",`the engine's worker from ${a.href} failed: ${v.message||"it did not start"}`)),o.onmessage=v=>{let p=v.data;if(!L(p)||p.id!==m.id)return g(w(p));switch(p.type){case"host":return r.host(p.hostWasm)?void 0:g(w(p));case"progress":try{n.onProgress?.({file:p.file,loaded:p.loaded,total:p.total,repo:p.repo,revision:p.revision,...p.provenance!==void 0?{provenance:p.provenance}:{}})}catch(k){g(k instanceof i?k:new i("request",`onProgress threw: ${I(k)}`))}return;case"loaded":{let k=r.wasm;if(k===null)return g(w(p));f();let R=r.used.source,$=u!==void 0||R==="page"&&k.failed===void 0?"page":k.failed!==void 0||R==="cdn"?"cdn":"bundle",A={worker:{source:R,url:a.href},hostWasm:{source:$,url:k.url}},y={...p.doctor,source:p.sources,why:p.fallback!==void 0?`${p.fallback}; ${d.why}`:r.why,assets:A};c(new T(o,y));return}case"error":return g(r.workerError(p));default:return g(w(p))}},o.postMessage(m)})}static async check(t,n={}){let r;try{let u=n??{};r=await z(t,{...u.backend!==void 0?{backend:u.backend}:{},...u.dtype!==void 0?{dtype:u.dtype}:{},...u.maxContext!==void 0?{maxContext:u.maxContext}:{},...u.storage!==void 0?{storage:u.storage}:{},...u.hubBaseUrl!==void 0?{hubBaseUrl:u.hubBaseUrl}:{},...u.signal!==void 0?{signal:u.signal}:{},...u.assets!==void 0?{assets:u.assets}:{}},!0)}catch(u){return B(u)}let{worker:o,workerUrl:a,signal:l,request:m}=r;return new Promise(u=>{let d=()=>s(r.aborted()),c=b=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",d),o.terminate(),u(b)},s=b=>c(B(r.noted(b)));if(l?.addEventListener("abort",d,{once:!0}),l?.aborted)return s(r.aborted());o.onerror=b=>s(new i("backend",`the engine's worker from ${a.href} failed: ${b.message||"it did not start"}`)),o.onmessage=b=>{let f=b.data;if(!L(f)||f.id!==m.id)return s(w(f));switch(f.type){case"host":return r.host(f.hostWasm)?void 0:s(w(f));case"progress":return;case"checked":return r.wasm===null?s(w(f)):c({ok:!0,backend:f.backend});case"error":return s(r.workerError(f));default:return s(w(f))}};try{o.postMessage(m)}catch(b){c(B(b))}})}},T=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,n){this.#r=t,this.#n=n,t.onmessage=r=>this.#d(r.data),t.onerror=r=>this.#a(new i("backend",`the engine's worker failed: ${r.message||"it stopped"}`))}chat(t,n={}){return this.#s(),this.#u({messages:t},n)}complete(t,n={}){this.#s();let r;if(typeof t=="string")r={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");r={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(r,n)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([a,l])=>[a,{...l}])),{worker:n,hostWasm:r}=this.#n.assets,o=this.#n.aliases.map(a=>({...a}));return{...this.#n,source:t,aliases:o,assets:{worker:{...n},hostWasm:{...r}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!L(t))return this.#a(w(t));let n=this.#o;if(n===null||t.id!==n.id)return this.#a(w(t));switch(t.type){case"delta":return n.sink(me(t.delta));case"error":return t.fatal!==void 0&&(this.#e=_(t.fatal)),n.sink(new i(t.kind,t.message));default:return this.#a(w(t))}}async*#u(t,n){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:r,...o}=n;if(r?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let a=this.#l++,l=[],m=null;this.#o={id:a,sink:s=>{l.push(s),m?.()}};let u=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:a,type:"abort"})},d=!1,c=async()=>{for(;l.length===0;)await new Promise(s=>m=s);return m=null,l.shift()};try{for(this.#r.postMessage({id:a,type:"generate",prompt:t,options:o}),r?.addEventListener("abort",u,{once:!0});;){let s=await c();if(s instanceof i)throw d=!0,s;if(s.done&&(d=!0),yield s,s.done)return}}finally{if(r?.removeEventListener("abort",u),!d)try{for(u();!(this.#t||this.#e);){let s=await c();if(s instanceof i||s.done)break}}catch{}this.#o=null,this.#i=!1}}};export{q as Caldrix,i as CaldrixError,T as Engine,O as probe};
|
package/host/caldrix_web_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED