amp-robotics's picture
Demo 2026-10-20 18:30
fbc5cb3
Raw History Blame Contribute Delete
2.13 kB
var l=new URL("./",self.location.href).href,s,w,i,u="wasm";function h(e){let n=i.instructions[e];if(!n)throw new Error(`AMP Tadpole only reads canonical clauses; got "${e}"`);let t=new BigInt64Array(i.length).fill(BigInt(i.pad)),o=new Uint8Array(i.length);return n.forEach((r,a)=>{t[a]=BigInt(r),o[a]=1}),{tokens:t,mask:o}}async function m(e){let n=await fetch(e),t=+(n.headers.get("content-length")||0);if(!n.body||!t)return n.arrayBuffer();let o=new Uint8Array(t),r=n.body.getReader(),a=0,c=0;for(;;){let{done:p,value:f}=await r.read();if(p)break;o.set(f,a),a+=f.length,(a-c>t/50||a===t)&&(c=a,self.postMessage({type:"progress",what:"AMP Tadpole",got:a,total:t}))}return o.buffer}async function y(e){let n=e!=="wasm"&&"gpu"in navigator&&!!await navigator.gpu.requestAdapter().catch(()=>null);s=n?await import("./chunks/ort.webgpu.bundle.min-FVH2HNYL.js"):await import("./chunks/ort.wasm.bundle.min-MQ5VRXJ2.js"),s.env.wasm.wasmPaths=`${l}ort/`,s.env.wasm.numThreads=self.crossOriginIsolated?Math.min(4,navigator.hardwareConcurrency||1):1;let[t,o]=await Promise.all([m(`${l}models/amp-tadpole/amp-tadpole.onnx`),fetch(`${l}models/amp-tadpole/instructions.json`).then(a=>a.json())]);i=o;let r=n?["webgpu","wasm"]:["wasm"];for(let a of r)try{w=await s.InferenceSession.create(new Uint8Array(t),{executionProviders:[a]}),u=a;break}catch(c){if(a===r[r.length-1])throw c}return{provider:u,threads:s.env.wasm.numThreads}}async function b(e,n,t){let{tokens:o,mask:r}=h(t);return(await w.run({images:new s.Tensor("uint8",e,[1,3,3,512,512]),tokens:new s.Tensor("int64",o,[1,i.length]),token_mask:new s.Tensor("bool",r,[1,i.length]),state:new s.Tensor("float32",n,[1,7])})).chunk.data.slice()}var d;async function g(e,n){try{if(e.type==="load")n({id:e.id,ok:await y(e.provider||"auto")});else if(e.type==="chunk"){let t=performance.now(),o=await b(e.images,e.state,e.clause);n({id:e.id,ok:o,ms:performance.now()-t},[o.buffer])}}catch(t){n({id:e.id,error:String(t?.message||t)})}}self.onmessage=e=>{e.data?.type==="port"?(d=e.data.port,d.onmessage=n=>g(n.data,(t,o)=>d.postMessage(t,o||[]))):g(e.data,(n,t)=>self.postMessage(n,t||[]))};