Spaces:
Running
Running
Upload index.html
Browse files- index.html +1 -1
index.html
CHANGED
|
@@ -5426,7 +5426,7 @@ answer`;if(!Un(e2,t,[n,{role:"assistant",content:$r({visibleText:`reasoning
|
|
| 5426 |
answer`,rawText:i,templateArgs:r})}],false,r).startsWith(a+i))return;let l="unfinished reasoning";if(!Un(e2,t,[n,{role:"assistant",content:$r({visibleText:l,rawText:l,templateArgs:r})}],false,r).startsWith(a+l))return;let d="answer";return Un(e2,t,[n,{role:"assistant",content:$r({visibleText:d,rawText:d,templateArgs:s})}],false,s).startsWith(o+d)?kh:void 0}catch{return}}function Rl(e2,t){return ql(e2,t)}async function Kl(e2,t){let n=Math.max(1,Math.floor(t.baseDepth)),r=Math.max(n,Math.floor(t.maxDepth)),s=Ml(t.minSampleTokens,24,2),a=Number.isFinite(t.saturationRatio)?Math.max(.5,Math.min(1,t.saturationRatio)):.97,o=Ml(t.maxProbes,5,1),i=[n];for(;i.length<o&&i.at(-1)<r;){let d=i.at(-1);i.push(Math.min(r,d*2))}let u=[],l=null,c=0;for(let d of i){let f=Math.max(s,d+1),p=await e2(d,f);if(!Number.isFinite(p.tokensPerSecond)||p.tokensPerSecond<=0)throw new Error(`decode calibration at depth ${d} returned invalid throughput`);if(p.tokenIds.length!==f)throw new Error(`decode calibration at depth ${d} produced ${p.tokenIds.length}/${f} tokens`);let g=l===null||vh(l,p.tokenIds);if(u.push({depth:d,sampleTokens:f,tokensPerSecond:p.tokensPerSecond,outputMatchesReference:g}),!g)return Ka(u,a,"output-mismatch");if((l===null||p.tokenIds.length>l.length)&&(l=p.tokenIds),c>0&&p.tokensPerSecond<=c/a)return Ka(u,a,"saturated");c=p.tokensPerSecond}return Ka(u,a,"max-depth")}function Ka(e2,t,n){let r=e2.filter(o=>o.outputMatchesReference),s=Math.max(...r.map(o=>o.tokensPerSecond));return{depth:r.find(o=>o.tokensPerSecond>=s*t)?.depth??r[0]?.depth??1,samples:e2,totalSampleTokens:e2.reduce((o,i)=>o+i.sampleTokens,0),stoppedBecause:n}}function vh(e2,t){let n=Math.min(e2.length,t.length);for(let r=0;r<n;++r)if(e2[r]!==t[r])return false;return true}function Ml(e2,t,n){return Number.isFinite(e2)?Math.max(n,Math.floor(e2)):t}async function Ol(e2,t=6){let n=Math.max(1,Math.floor(t)),r=e2.tensorFromTypedArray("uint32",[1,1],new Uint32Array([0]));try{await e2.readTensor(r);let s=[];for(let a=0;a<n;++a){let o=performance.now();await e2.readTensor(r),s.push(performance.now()-o)}return s.sort((a,o)=>a-o),s[s.length>>1]}finally{r.destroy?.()}}var Nr=class{#t;#e;model;tokenizer;#n;#r;#a;#s;eosTokenIds;#l;generationState;#o=null;#u=false;destroyed=false;chatTemplateArgs={};constructor(t){this.#t=t.runtime,this.#e=t.ownsRuntime,this.model=t.model,this.tokenizer=t.tokenizer,this.#n=t.chatTemplate,this.#r=t.tokenizerConfig,this.#a=t.chatTemplatePolicy===null?void 0:t.chatTemplatePolicy??Rl(t.chatTemplate,t.tokenizerConfig),this.#s=new Fr(t.tokenizer),this.eosTokenIds=t.eosTokenIds,this.generationState=t.generationState,this.#l=t.defaultMaxNewTokens}get runtime(){return this.#t}acquireGenerationLease(){if(this.destroyed)throw new Error(`${this.constructor.name} has been disposed`);if(this.#u)throw new Error(`${this.constructor.name} is already generating`);this.#u=true;let t=true;return()=>{t&&(t=false,this.#u=false)}}get lastAssistantContent(){return this.#o}get contextLength(){return this.generationState.cache.maxLength}get contextFull(){return this.generationState.cache.get_seq_length()>=this.generationState.cache.maxLength}#i(){return Object.freeze({...this.#a?.templateArgs??{},...this.chatTemplateArgs})}#d(t,n,r){return this.#n.render({...r,messages:t,tools:null,bos_token:this.#r.bos_token,eos_token:this.#r.eos_token,add_generation_prompt:n})}renderPrompt(t,n=true){return this.#d(t,n,this.#i())}encodePrompt(t){return this.tokenizer.encode(this.renderPrompt(t),{add_special_tokens:false}).ids}async*generate(t,n={}){let r=this.acquireGenerationLease();this.#o=null;let s=this.#i(),a=[],o="",i=false;try{this.generationState.cache.get_seq_length()!==this.#s.cacheLength&&this.resetCache();let u=n.maxNewTokens??this.#l,l=n.eosTokenId??this.eosTokenIds,c=this.#d(t,true,s),d=this.#s.prepare(c),{inputIds:f,prefixLength:p}=d;p!==this.#s.cacheLength&&(this.resetCache(),p=0,f=d.fullyEncodedIds);let g=f.slice(p);g.length===0&&(this.resetCache(),f=d.fullyEncodedIds,g=f.slice());let m=this.generationState.cache.maxLength-this.generationState.cache.get_seq_length()-g.length;if(m<1)throw new Error(g.length>=this.generationState.cache.maxLength?`message is too long for the context window (${g.length} tokens; window is ${this.generationState.cache.maxLength})`:`context window is full (${this.generationState.cache.maxLength} tokens) — clear the chat to continue`);let A=Math.min(u,m),h=Dl(R=>this.tokenizer.decode(R,{skip_special_tokens:true}));for await(let R of this.streamTokens({suffixIds:g,maxNewTokens:A,eosTokenId:l,stopOnEos:true},n)){if(n.signal?.aborted)return;a.push(R);let F=h.push(R);o=h.text,yield{token:R,delta:F,text:o}}let C=h.flush();C!==""&&(o=h.text,yield{token:null,delta:C,text:o});let E=Ur(this.tokenizer,a,{skip_special_tokens:false});this.#o=Ql(this.#a,{visibleText:o,rawText:E,templateArgs:s}),this.#s.commit(f,a,this.generationState.cache.get_seq_length()),i=true}finally{i||this.resetCache(),r()}}async complete(t,n={}){let r="";for await(let s of this.generate(t,n))r=s.text;return r}async benchmarkFixedTokenIds(t,n,r){let s=this.acquireGenerationLease();try{return await this.#c(t,n,r)}finally{s()}}async calibrateDecodePipeline(t,n,r=[0]){let s=this.acquireGenerationLease();try{return await Kl(async(a,o)=>{let i=await this.#c(r,o,n(a));return{tokensPerSecond:i.decodeTps,tokenIds:i.ids}},t)}finally{s()}}async#c(t,n,r){this.resetCache();let s=[],a=0,o=0,i=performance.now();try{for await(let u of this.streamTokens({suffixIds:[...t],maxNewTokens:n,eosTokenId:r.eosTokenId??this.eosTokenIds,stopOnEos:false},r))s.length===0&&(a=performance.now()),s.push(u);o=performance.now()}finally{this.resetCache()}return{ttftMs:s.length>0?a-i:NaN,decodeTps:s.length>1?(s.length-1)/((o-a)/1e3):0,tokens:s.length,ids:s}}deviceInfo(){let t=this.#t.device,n=t.adapterInfo,r=s=>{try{return t.features.has(s)}catch{return false}};return{vendor:n.vendor??"",architecture:n.architecture??"",device:n.device??"",description:n.description??"",isFallbackAdapter:n.isFallbackAdapter===true,subgroupMinSize:n.subgroupMinSize,subgroupMaxSize:n.subgroupMaxSize,features:{shaderF16:r("shader-f16"),subgroups:r("subgroups"),subgroupMatrix:r("chromium-experimental-subgroup-matrix"),timestampQuery:r("timestamp-query")}}}reset(){this.resetCache()}resetCache(){this.generationState.cache.truncate(0),this.#s.clear(),this.#o=null}dispose(){this.destroyed||(this.destroyed=true,this.model.dispose(),this.#e&&this.#t.destroy())}};var Ch="(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",Sh=`{% for message in messages %}<|im_start|>{{ message['role'] }}
|
| 5427 |
{{ message['content'] }}<|im_end|>
|
| 5428 |
{% endfor %}{% if add_generation_prompt %}<|im_start|>assistant
|
| 5429 |
-
{% endif %}`;function zl(e2){let t=Ul(e2,"tokenizer.ggml.tokens"),n=e2["tokenizer.ggml.merges"]??[],r={};return t.forEach((s,a)=>{r[s]=a}),Bh(e2)?{version:"1.0",truncation:null,padding:null,added_tokens:Oa(e2,t),normalizer:{type:"Replace",pattern:{String:" "},content:"▁"},pre_tokenizer:{type:"Split",pattern:{String:" "},behavior:"MergedWithPrevious",invert:false},post_processor:null,decoder:{type:"Sequence",decoders:[{type:"Replace",pattern:{String:"▁"},content:" "},{type:"ByteFallback"},{type:"Fuse"}]},model:{type:"BPE",dropout:null,unk_token:on(t,e2["tokenizer.ggml.unknown_token_id"])??null,continuing_subword_prefix:null,end_of_word_suffix:null,fuse_unk:true,byte_fallback:true,ignore_merges:false,vocab:r,merges:Wl(n)}}:{version:"1.0",truncation:null,padding:null,added_tokens:Oa(e2,t),normalizer:{type:"NFC"},pre_tokenizer:Ih(e2),post_processor:Eh(),decoder:Th(),model:{type:"BPE",dropout:null,unk_token:on(t,e2["tokenizer.ggml.unknown_token_id"])??null,continuing_subword_prefix:null,end_of_word_suffix:null,fuse_unk:false,byte_fallback:!!e2["tokenizer.ggml.byte_fallback"],ignore_merges:false,vocab:r,merges:Wl(n)}}}function Bh(e2){let t=e2["tokenizer.ggml.model"];return typeof t!="string"?false:t==="llama"||t==="spm"||t.startsWith("gemma")||t.startsWith("llama")}function Hl(e2){let t=Ul(e2,"tokenizer.ggml.tokens"),n=e2["tokenizer.ggml.bos_token_id"],r=e2["tokenizer.ggml.eos_token_id"],s=e2["tokenizer.ggml.unknown_token_id"],a=e2["tokenizer.ggml.padding_token_id"],o=Object.fromEntries(Oa(e2,t).map(i=>[i.id,{content:i.content,single_word:i.single_word,lstrip:i.lstrip,rstrip:i.rstrip,normalized:i.normalized,special:i.special}]));return{tokenizer_class:"Qwen2Tokenizer",model_max_length:e2["qwen3.context_length"]??e2["general.context_length"]??32768,bos_token:on(t,n),eos_token:on(t,r),unk_token:on(t,s),pad_token:on(t,a),bos_token_id:Number.isInteger(n)?n:void 0,eos_token_id:Number.isInteger(r)?r:void 0,unk_token_id:Number.isInteger(s)?s:void 0,pad_token_id:Number.isInteger(a)?a:void 0,chat_template:Wa(e2,t),added_tokens_decoder:o}}function Wa(e2,t=xh(e2)){let n=e2["tokenizer.chat_template"];if(typeof n=="string")return n;let r=e2["tokenizer.ggml.chat_template"];return typeof r=="string"?r:t.includes("<|im_start|>")&&t.includes("<|im_end|>")?Sh:null}function Ih(e2){let t=e2["tokenizer.ggml.pre"];return t==="qwen2"||t==="qwen3"||e2["general.architecture"]==="qwen3"?{type:"Sequence",pretokenizers:[{type:"Split",pattern:{Regex:Ch},behavior:"Isolated",invert:false},{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}]}:{type:"ByteLevel",add_prefix_space:false,trim_offsets:true,use_regex:true}}function Th(){return{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}}function Eh(){return{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}}function Oa(e2,t){let n=Array.isArray(e2["tokenizer.ggml.token_type"])?e2["tokenizer.ggml.token_type"]:[],r=new Set;for(let s of[e2["tokenizer.ggml.bos_token_id"],e2["tokenizer.ggml.eos_token_id"],e2["tokenizer.ggml.unknown_token_id"],e2["tokenizer.ggml.padding_token_id"]])Number.isInteger(s)&&r.add(s);for(let s=0;s<n.length;++s)Gh(n[s])&&r.add(s);return[...r].filter(s=>s>=0&&s<t.length).sort((s,a)=>s-a).map(s=>({id:s,content:t[s],single_word:false,lstrip:false,rstrip:false,normalized:false,special:true}))}function Gh(e2){return Number.isInteger(e2)&&e2!==1&&e2!==6}function Wl(e2){return Array.isArray(e2)?e2.map(t=>Array.isArray(t)?t.join(" "):String(t)):[]}function on(e2,t){return typeof t=="number"&&Number.isInteger(t)&&t>=0&&t<e2.length?e2[t]:void 0}function Ul(e2,t){let n=e2[t];if(!Array.isArray(n)||n.some(r=>typeof r!="string"))throw new Error(`GGUF metadata ${t} must be a string array`);return n}function xh(e2){let t=e2["tokenizer.ggml.tokens"];return Array.isArray(t)&&t.every(n=>typeof n=="string")?t:[]}ri();ni();Eo();Yo();var Id="prism-ml/Bonsai-27B-gguf",Bw="Bonsai-27B-Q1_0.gguf",wn=4,Sd=4096;function Bd(e2,t,n="main"){let r=e2??Id;return r.toLowerCase().endsWith(".gguf")?!/^https?:/i.test(r)&&typeof location<"u"?new URL(r,location.href).href:r:xl(r,{revision:n,file:t??Bw})}var ai=class e extends Nr{static DEFAULT_MODEL_ID=Id;#t;#e;#n;#r=wn;#a=0;constructor(t){let n=_s(t.model),r=Math.max(1,Math.min(t.maxLength??Math.min(n,Sd),n)),s=t.model.createGenerationState({maxLength:r});super({...t,generationState:s,defaultMaxNewTokens:Sd}),this.#t=s,this.#e=t.tokenizer.token_to_id("<think>")??null,this.#n=t.tokenizer.token_to_id("</think>")??null}get thinkOpenTokenId(){return this.#e}get thinkCloseTokenId(){return this.#n}streamTokens(t,n){return this.model.streamTokenIdsFromCache({input_ids:[t.suffixIds],generation_state:this.#t,max_new_tokens:t.maxNewTokens,eos_token_id:t.eosTokenId,stop_on_eos:t.stopOnEos,decode_pipeline_depth:n.decodePipelineDepth??this.#r})}get contextLength(){return this.#t.cache.maxLength}static async checkAvailability(t=null,n={}){let r=globalThis.navigator?.gpu;if(!r)return{ok:false,reason:"WebGPU isn't available in this browser. Try a recent Chrome or Edge."};let s=null;try{s=await r.requestAdapter({powerPreference:"high-performance"})}catch{}if(!s)return{ok:false,reason:"No WebGPU adapter is available on this device."};let a=Bd(t,n.file,n.revision??"main"),o=n.fetch??(n.accessToken?Ma(n.accessToken):void 0);try{let i=await kl(a,{fetch:o,signal:n.signal}),u=xs(ar(i),s,i);return u?{ok:false,reason:u}:{ok:true}}catch{return{ok:true}}}static async load(t=null,n={}){let r=n.onProgress??(()=>{}),s=Bd(t,n.file,n.revision??"main"),a=n.fetch??(n.accessToken?Ma(n.accessToken):void 0);r({status:"init",message:"Requesting WebGPU device"});let o=n.runtime??await ju(n.runtimeOptions??{}),i=!n.runtime;o.captureShaders=true;let u=async()=>{};try{r({status:"init",message:"Checking device support"});let l=await an.open(s,{fetch:a,signal:n.signal,cache:n.cache,force:n.force,cacheName:n.cacheName});u=()=>l.close();let c=xs(ar(l),o.device,l);if(c)throw new Error(c);r({status:"tokenizer",message:"Loading tokenizer"}),await si();let{tokenizer:d,chatTemplate:f,tokenizerConfig:p,eosTokenIds:g}=Iw(l);await si();let m=l.names().reduce((E,R)=>E+l.info(R).byteLength,0),A=0;l.onByteProgress=E=>{A+=E,r({status:"weights",kind:"bytes",loaded:A,total:m||null,fraction:m?Math.min(1,A/m):void 0,message:"Streaming weights"})};let h=await $t.loadGGUF(o,{gguf:l,onProgress:E=>{!Zr(E.total)||E.total<=0||r({status:"weights",kind:"tensors",loaded:E.processed,total:E.total,message:"Uploading to GPU"})}});await u();let C=new e({runtime:o,ownsRuntime:i,model:h,tokenizer:d,chatTemplate:f,tokenizerConfig:p,eosTokenIds:g,maxLength:n.maxLength});return r({status:"weights",kind:"tensors",message:"Compiling kernels (warmup)"}),await si(),await h.warmup(C.#t.cache),C.#a=await Ol(o),n.decodePipelineDepth!==void 0?C.#r=nr({decode_pipeline_depth:n.decodePipelineDepth},wn,Ft):(r({status:"weights",kind:"tensors",message:"Tuning decode pipeline"}),C.#r=await C.#s()),r({status:"ready",message:"Ready",fraction:1}),C}catch(l){throw await u().catch(()=>{}),i&&await o.destroy(),l}}get decodePipelineDepth(){return this.#r}get readbackLatencyMs(){return this.#a}async#s(){let t=Math.min(Ft,this.contextLength-1);return t<=wn?wn:(await this.calibrateDecodePipeline({baseDepth:wn,maxDepth:t,minSampleTokens:Math.min(24,this.contextLength)},r=>({decodePipelineDepth:r}))).depth}async benchmark(t,n={}){let r=n.maxNewTokens??64,s=nr({decode_pipeline_depth:n.decodePipelineDepth??this.#r},wn,Ft);return{...await this.benchmarkFixedTokenIds(this.encodePrompt(t),r,{decodePipelineDepth:s}),depth:s}}};function si(){return typeof requestAnimationFrame=="function"?new Promise(e2=>requestAnimationFrame(()=>e2())):new Promise(e2=>setTimeout(e2,0))}function Iw(e2){let t=e2.metadata,n=Hl(t),r=zl(t),s=new Di(r,n),a=typeof n.chat_template=="string"?n.chat_template:Wa(t);if(!a)throw new Error("Bonsai GGUF metadata is missing a chat_template");let o=Tw(n,s);return{tokenizer:s,chatTemplate:new pr(a),tokenizerConfig:n,eosTokenIds:o}}function Tw(e2,t){let n=new Set,r=e2.eos_token_id;if(Zr(r)&&n.add(r),typeof e2.eos_token=="string"){let s=t.token_to_id(e2.eos_token);Zr(s)&&n.add(s)}if(n.size===0)throw new Error("Bonsai GGUF metadata has no eos token id");return[...n]}var $I=ai;export{ai as Bonsai27B,Bw as DEFAULT_GGUF_FILE,Id as DEFAULT_MODEL_ID,$I as default,Bd as resolveGGUFUrl};const Bonsai27B=ai;const DEFAULT_GGUF_FILE=Bw;const $=id2=>document.getElementById(id2);const QSA=new URLSearchParams(location.search);const REQUIRE_HF_TOKEN=window.BONSAI_REQUIRE_HF_TOKEN===true;const MODEL_ID="prism-ml/Bonsai-27B-gguf";const MODEL_SRC=QSA.get("src")||MODEL_ID;const TOKEN_KEY="bonsai27b_hf_token_v1";const TOTAL_BYTES_FALLBACK=38e8;let chat=null;let loadState="idle";let loadBlocked=false;let accessToken=null;let messages=[];let isGenerating=false;let contextExhausted=false;let abortController=null;let reauthAfterGate=false;const SEED_EXAMPLES=[{label:"LOGIC PUZZLE",prompt:"You have three boxes labeled Apples, Oranges, and Mixed. Every label is wrong.\n\nYou may take one fruit from one box without looking inside. How can you correctly relabel all three boxes?"},{label:"GENERATE CODE",prompt:"Write a "},{label:"WRITE A HAIKU",prompt:"Write a haiku about a bonsai tree."}];const gate=$("gate"),gateInput=$("gateInput"),gateError=$("gateError");const gateContinue=$("gateContinue"),gateField=$("gateField"),veil=$("veil");async function validateToken(token){const trimmed=(token||"").trim();if(!trimmed)return{valid:false,error:"A token is required."};try{const res=await fetch(`https://huggingface.co/api/models/${MODEL_ID}`,{headers:{Authorization:`Bearer ${trimmed}`}});if(res.ok)return{valid:true};if(res.status===401)return{valid:false,error:"Invalid token."};let body=null;try{body=await res.json()}catch{}const errText=body?.error?String(body.error):"";if(res.status===404||errText.toLowerCase().includes("repository not found")){return{valid:false,error:"This token can't access the model. Request access on the model page, then try again."}}if(res.status===403)return{valid:false,error:"Access forbidden — the token needs read permission."};return{valid:false,error:errText||`Validation failed (HTTP ${res.status}).`}}catch{return{valid:null,error:"Couldn't reach huggingface.co to verify the token."}}}function showGate(prefill=""){veil.hidden=true;gate.hidden=false;gate.classList.remove("leave");if(prefill)gateInput.value=prefill;requestAnimationFrame(()=>requestAnimationFrame(()=>{gate.classList.add("show");gateInput.focus()}))}function showGateError(message){gateError.textContent=message;gateError.hidden=false;gateField.classList.add("error")}function clearGateError(){gateError.hidden=true;gateField.classList.remove("error")}function grant(token){accessToken=token;try{localStorage.setItem(TOKEN_KEY,token)}catch{}gate.classList.add("leave");setTimeout(()=>{gate.hidden=true;gate.classList.remove("show","leave")},550);if(veil.hidden===false){veil.classList.add("leave");setTimeout(()=>{veil.hidden=true;veil.classList.remove("leave")},850)}window.App?.bootLanding?.();runAvailabilityCheck();if(reauthAfterGate){reauthAfterGate=false;hideLoadError();startLoad()}}async function submitGate(){if(gateContinue.classList.contains("busy"))return;const token=gateInput.value.trim();if(!token){showGateError("A token is required.");return}clearGateError();gateContinue.classList.add("busy");gateContinue.textContent="VALIDATING …";const result=await validateToken(token);gateContinue.classList.remove("busy");gateContinue.innerHTML="CONTINUE →";if(result.valid===false){showGateError(result.error);return}grant(token)}gateContinue.addEventListener("click",e2=>{e2.preventDefault();submitGate()});gateInput.addEventListener("keydown",e2=>{if(e2.key==="Enter"){e2.preventDefault();submitGate()}});gateInput.addEventListener("input",clearGateError);$("gateShow").addEventListener("click",()=>{const hidden=gateInput.type==="password";gateInput.type=hidden?"text":"password";$("gateShow").textContent=hidden?"HIDE":"SHOW"});async function initAccess(){if(!REQUIRE_HF_TOKEN){runAvailabilityCheck();return}let stored=null;try{stored=localStorage.getItem(TOKEN_KEY)}catch{}if(!stored){showGate();return}veil.hidden=false;const result=await validateToken(stored);if(result.valid===false){try{localStorage.removeItem(TOKEN_KEY)}catch{}showGate(stored);showGateError(result.error+" Enter a current token to continue.");return}grant(stored)}async function runAvailabilityCheck(){if(!navigator.gpu){blockLoad("WebGPU isn't available in this browser. Try a recent Chrome or Edge.");return}try{const res=await Bonsai27B.checkAvailability(MODEL_SRC,{file:MODEL_SRC===MODEL_ID?DEFAULT_GGUF_FILE:void 0,accessToken:accessToken??void 0});if(res&&!res.ok&&res.reason&&loadState==="idle")blockLoad(res.reason)}catch{}}function blockLoad(reason){loadBlocked=true;const cta=$("loadCta");cta.textContent="UNAVAILABLE ON THIS DEVICE";cta.style.opacity="0.45";cta.style.pointerEvents="none";$("ctaNote").textContent=reason;$("ctaNote").hidden=false}$("loadCta").addEventListener("click",e2=>{if(loadBlocked){e2.preventDefault();e2.stopImmediatePropagation()}},true);window.BonsaiApp={startLoad,enterChat};async function startLoad(){if(loadState==="loading"||loadState==="ready"||loadBlocked)return;loadState="loading";hideLoadError();BonsaiLoader.set(0,TOTAL_BYTES_FALLBACK);BonsaiLoader.phase("REQUESTING WEBGPU DEVICE");if(document.body.classList.contains("stage-loading")){await new Promise(resolve=>setTimeout(resolve,1150))}try{chat=await Bonsai27B.load(MODEL_SRC,{file:MODEL_SRC===MODEL_ID?DEFAULT_GGUF_FILE:void 0,accessToken:accessToken??void 0,cache:QSA.has("nocache")?false:void 0,maxLength:Number.parseInt(QSA.get("ctx")??"",10)||void 0,onProgress:onLoadProgress});loadState="ready";window.__bonsaiChat=chat;prepChatUi();BonsaiLoader.done()}catch(error){console.error(error);loadState="failed";showLoadError(error)}}function onLoadProgress(event){if(event.status==="init"){BonsaiLoader.phase((event.message||"INITIALIZING").toUpperCase())}else if(event.status==="tokenizer"){BonsaiLoader.phase("PARSING TOKENIZER — 248K VOCAB")}else if(event.status==="weights"){if(event.kind==="bytes"&&Number.isFinite(event.loaded)){BonsaiLoader.phase(null);BonsaiLoader.set(event.loaded,Number.isFinite(event.total)&&event.total>0?event.total:TOTAL_BYTES_FALLBACK)}else if(event.kind==="tensors"){if(/warmup/i.test(event.message||"")){BonsaiLoader.phase("COMPILING WEBGPU KERNELS · WARMUP")}else if(Number.isFinite(event.total)&&event.total>0){BonsaiLoader.info({tensors:event.loaded,tensorsTotal:event.total})}}}}function showLoadError(error){const message=String(error?.message??error);document.body.classList.add("load-failed");BonsaiLoader.phase("LOAD FAILED");$("loadErrorMsg").textContent=message;$("loadError").hidden=false;const authish=REQUIRE_HF_TOKEN&&/\b40[134]\b|unauthorized|forbidden|invalid token|\btoken\b|repository not found|access (denied|restricted|to model)/i.test(message);$("changeTokenBtn").hidden=!authish}function hideLoadError(){document.body.classList.remove("load-failed");$("loadError").hidden=true;BonsaiLoader.phase(null)}$("retryBtn").addEventListener("click",e2=>{e2.preventDefault();if(loadState==="failed"){hideLoadError();startLoad()}});$("changeTokenBtn").addEventListener("click",e2=>{e2.preventDefault();try{localStorage.removeItem(TOKEN_KEY)}catch{}reauthAfterGate=true;showGate(accessToken??"")});if(document.body.classList.contains("stage-loading")&&!QSA.has("demo")&&!QSA.has("p"))startLoad();const chatx=$("chatx"),cScroll=$("cScroll"),cThread=$("cThread");const cInput=$("cInput"),cSend=$("cSend"),cStop=$("cStop");const cStatus=$("cStatus"),cStatusText=$("cStatusText"),cLive=$("cLive");BonsaiLoader.onReady(()=>setTimeout(enterChat,1800));function enterChat(){if(loadState!=="ready"||document.body.classList.contains("stage-chat"))return;document.body.classList.add("stage-chat");chatx.classList.add("show");setStatus("","READY");setTimeout(()=>cInput.focus(),450)}function prepChatUi(){cInput.disabled=false;$("clearBtn").disabled=false;$("thinkToggle").disabled=false;renderSeeds();refreshSend()}function setStatus(mode,text){cStatus.className="c-status"+(mode?" "+mode:"");if(text!==void 0)cStatusText.textContent=text}function renderSeeds(){const wrap=$("cSeeds");if(!wrap)return;wrap.replaceChildren(...SEED_EXAMPLES.map(seed=>{const b=document.createElement("button");b.className="c-seed";b.type="button";b.dataset.prompt=seed.prompt;b.textContent=seed.label;return b}))}document.addEventListener("click",e2=>{const seed=e2.target.closest(".c-seed");if(!seed||seed.disabled||!chat||isGenerating)return;cInput.value=seed.dataset.prompt||"";send()});cSend.addEventListener("click",send);cStop.addEventListener("click",()=>abortController?.abort());$("clearBtn").addEventListener("click",clearChat);cInput.addEventListener("input",()=>{autoGrow();refreshSend()});cInput.addEventListener("keydown",e2=>{if(e2.key==="Enter"&&!e2.shiftKey){e2.preventDefault();if(!cSend.disabled)send()}});function refreshSend(){cSend.disabled=isGenerating||contextExhausted||!chat||cInput.value.trim()===""}function autoGrow(){cInput.style.height="auto";cInput.style.height=`${Math.min(cInput.scrollHeight,180)}px`}function scrollDown(force=false){const nearBottom=cScroll.scrollHeight-cScroll.scrollTop-cScroll.clientHeight<90;if(force||nearBottom)cScroll.scrollTop=cScroll.scrollHeight}function setGenerating(on2){isGenerating=on2;cInput.disabled=on2;$("clearBtn").disabled=on2;$("thinkToggle").disabled=on2;cSend.style.display=on2?"none":"";cStop.style.display=on2?"grid":"none";document.querySelectorAll(".c-seed").forEach(s=>{s.disabled=on2});setStatus(on2?"busy":"",on2?thinkingEnabled?"REASONING …":"WRITING …":"READY");refreshSend()}let thinkingEnabled=false;const thinkToggle=$("thinkToggle");thinkToggle.addEventListener("click",()=>{thinkingEnabled=!thinkingEnabled;thinkToggle.classList.toggle("on",thinkingEnabled);thinkToggle.setAttribute("aria-pressed",String(thinkingEnabled));$("thinkTip").textContent=`THINKING ${thinkingEnabled?"ON":"OFF"}`});const welcomeTemplate=$("cWelcome").cloneNode(true);function removeWelcome(){$("cWelcome")?.remove()}function clearChat(){if(isGenerating)return;messages=[];chat?.reset();contextExhausted=false;cInput.disabled=false;cInput.placeholder="Ask anything…";setStatus("","READY");cThread.replaceChildren(welcomeTemplate.cloneNode(true));renderSeeds();cInput.focus()}function appendUser(text){const msg=document.createElement("div");msg.className="c-msg user";const role=document.createElement("div");role.className="c-role";role.textContent="YOU";const bubble=document.createElement("div");bubble.className="u-bubble";bubble.textContent=text;msg.append(role,bubble);cThread.appendChild(msg);scrollDown(true)}function appendAssistant(withThinking){const msg=document.createElement("div");msg.className="c-msg bot";msg.innerHTML=`
|
| 5430 |
<div class="c-role">BONSAI</div>
|
| 5431 |
${withThinking?`
|
| 5432 |
<div class="t-block live open">
|
|
|
|
| 5426 |
answer`,rawText:i,templateArgs:r})}],false,r).startsWith(a+i))return;let l="unfinished reasoning";if(!Un(e2,t,[n,{role:"assistant",content:$r({visibleText:l,rawText:l,templateArgs:r})}],false,r).startsWith(a+l))return;let d="answer";return Un(e2,t,[n,{role:"assistant",content:$r({visibleText:d,rawText:d,templateArgs:s})}],false,s).startsWith(o+d)?kh:void 0}catch{return}}function Rl(e2,t){return ql(e2,t)}async function Kl(e2,t){let n=Math.max(1,Math.floor(t.baseDepth)),r=Math.max(n,Math.floor(t.maxDepth)),s=Ml(t.minSampleTokens,24,2),a=Number.isFinite(t.saturationRatio)?Math.max(.5,Math.min(1,t.saturationRatio)):.97,o=Ml(t.maxProbes,5,1),i=[n];for(;i.length<o&&i.at(-1)<r;){let d=i.at(-1);i.push(Math.min(r,d*2))}let u=[],l=null,c=0;for(let d of i){let f=Math.max(s,d+1),p=await e2(d,f);if(!Number.isFinite(p.tokensPerSecond)||p.tokensPerSecond<=0)throw new Error(`decode calibration at depth ${d} returned invalid throughput`);if(p.tokenIds.length!==f)throw new Error(`decode calibration at depth ${d} produced ${p.tokenIds.length}/${f} tokens`);let g=l===null||vh(l,p.tokenIds);if(u.push({depth:d,sampleTokens:f,tokensPerSecond:p.tokensPerSecond,outputMatchesReference:g}),!g)return Ka(u,a,"output-mismatch");if((l===null||p.tokenIds.length>l.length)&&(l=p.tokenIds),c>0&&p.tokensPerSecond<=c/a)return Ka(u,a,"saturated");c=p.tokensPerSecond}return Ka(u,a,"max-depth")}function Ka(e2,t,n){let r=e2.filter(o=>o.outputMatchesReference),s=Math.max(...r.map(o=>o.tokensPerSecond));return{depth:r.find(o=>o.tokensPerSecond>=s*t)?.depth??r[0]?.depth??1,samples:e2,totalSampleTokens:e2.reduce((o,i)=>o+i.sampleTokens,0),stoppedBecause:n}}function vh(e2,t){let n=Math.min(e2.length,t.length);for(let r=0;r<n;++r)if(e2[r]!==t[r])return false;return true}function Ml(e2,t,n){return Number.isFinite(e2)?Math.max(n,Math.floor(e2)):t}async function Ol(e2,t=6){let n=Math.max(1,Math.floor(t)),r=e2.tensorFromTypedArray("uint32",[1,1],new Uint32Array([0]));try{await e2.readTensor(r);let s=[];for(let a=0;a<n;++a){let o=performance.now();await e2.readTensor(r),s.push(performance.now()-o)}return s.sort((a,o)=>a-o),s[s.length>>1]}finally{r.destroy?.()}}var Nr=class{#t;#e;model;tokenizer;#n;#r;#a;#s;eosTokenIds;#l;generationState;#o=null;#u=false;destroyed=false;chatTemplateArgs={};constructor(t){this.#t=t.runtime,this.#e=t.ownsRuntime,this.model=t.model,this.tokenizer=t.tokenizer,this.#n=t.chatTemplate,this.#r=t.tokenizerConfig,this.#a=t.chatTemplatePolicy===null?void 0:t.chatTemplatePolicy??Rl(t.chatTemplate,t.tokenizerConfig),this.#s=new Fr(t.tokenizer),this.eosTokenIds=t.eosTokenIds,this.generationState=t.generationState,this.#l=t.defaultMaxNewTokens}get runtime(){return this.#t}acquireGenerationLease(){if(this.destroyed)throw new Error(`${this.constructor.name} has been disposed`);if(this.#u)throw new Error(`${this.constructor.name} is already generating`);this.#u=true;let t=true;return()=>{t&&(t=false,this.#u=false)}}get lastAssistantContent(){return this.#o}get contextLength(){return this.generationState.cache.maxLength}get contextFull(){return this.generationState.cache.get_seq_length()>=this.generationState.cache.maxLength}#i(){return Object.freeze({...this.#a?.templateArgs??{},...this.chatTemplateArgs})}#d(t,n,r){return this.#n.render({...r,messages:t,tools:null,bos_token:this.#r.bos_token,eos_token:this.#r.eos_token,add_generation_prompt:n})}renderPrompt(t,n=true){return this.#d(t,n,this.#i())}encodePrompt(t){return this.tokenizer.encode(this.renderPrompt(t),{add_special_tokens:false}).ids}async*generate(t,n={}){let r=this.acquireGenerationLease();this.#o=null;let s=this.#i(),a=[],o="",i=false;try{this.generationState.cache.get_seq_length()!==this.#s.cacheLength&&this.resetCache();let u=n.maxNewTokens??this.#l,l=n.eosTokenId??this.eosTokenIds,c=this.#d(t,true,s),d=this.#s.prepare(c),{inputIds:f,prefixLength:p}=d;p!==this.#s.cacheLength&&(this.resetCache(),p=0,f=d.fullyEncodedIds);let g=f.slice(p);g.length===0&&(this.resetCache(),f=d.fullyEncodedIds,g=f.slice());let m=this.generationState.cache.maxLength-this.generationState.cache.get_seq_length()-g.length;if(m<1)throw new Error(g.length>=this.generationState.cache.maxLength?`message is too long for the context window (${g.length} tokens; window is ${this.generationState.cache.maxLength})`:`context window is full (${this.generationState.cache.maxLength} tokens) — clear the chat to continue`);let A=Math.min(u,m),h=Dl(R=>this.tokenizer.decode(R,{skip_special_tokens:true}));for await(let R of this.streamTokens({suffixIds:g,maxNewTokens:A,eosTokenId:l,stopOnEos:true},n)){if(n.signal?.aborted)return;a.push(R);let F=h.push(R);o=h.text,yield{token:R,delta:F,text:o}}let C=h.flush();C!==""&&(o=h.text,yield{token:null,delta:C,text:o});let E=Ur(this.tokenizer,a,{skip_special_tokens:false});this.#o=Ql(this.#a,{visibleText:o,rawText:E,templateArgs:s}),this.#s.commit(f,a,this.generationState.cache.get_seq_length()),i=true}finally{i||this.resetCache(),r()}}async complete(t,n={}){let r="";for await(let s of this.generate(t,n))r=s.text;return r}async benchmarkFixedTokenIds(t,n,r){let s=this.acquireGenerationLease();try{return await this.#c(t,n,r)}finally{s()}}async calibrateDecodePipeline(t,n,r=[0]){let s=this.acquireGenerationLease();try{return await Kl(async(a,o)=>{let i=await this.#c(r,o,n(a));return{tokensPerSecond:i.decodeTps,tokenIds:i.ids}},t)}finally{s()}}async#c(t,n,r){this.resetCache();let s=[],a=0,o=0,i=performance.now();try{for await(let u of this.streamTokens({suffixIds:[...t],maxNewTokens:n,eosTokenId:r.eosTokenId??this.eosTokenIds,stopOnEos:false},r))s.length===0&&(a=performance.now()),s.push(u);o=performance.now()}finally{this.resetCache()}return{ttftMs:s.length>0?a-i:NaN,decodeTps:s.length>1?(s.length-1)/((o-a)/1e3):0,tokens:s.length,ids:s}}deviceInfo(){let t=this.#t.device,n=t.adapterInfo,r=s=>{try{return t.features.has(s)}catch{return false}};return{vendor:n.vendor??"",architecture:n.architecture??"",device:n.device??"",description:n.description??"",isFallbackAdapter:n.isFallbackAdapter===true,subgroupMinSize:n.subgroupMinSize,subgroupMaxSize:n.subgroupMaxSize,features:{shaderF16:r("shader-f16"),subgroups:r("subgroups"),subgroupMatrix:r("chromium-experimental-subgroup-matrix"),timestampQuery:r("timestamp-query")}}}reset(){this.resetCache()}resetCache(){this.generationState.cache.truncate(0),this.#s.clear(),this.#o=null}dispose(){this.destroyed||(this.destroyed=true,this.model.dispose(),this.#e&&this.#t.destroy())}};var Ch="(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",Sh=`{% for message in messages %}<|im_start|>{{ message['role'] }}
|
| 5427 |
{{ message['content'] }}<|im_end|>
|
| 5428 |
{% endfor %}{% if add_generation_prompt %}<|im_start|>assistant
|
| 5429 |
+
{% endif %}`;function zl(e2){let t=Ul(e2,"tokenizer.ggml.tokens"),n=e2["tokenizer.ggml.merges"]??[],r={};return t.forEach((s,a)=>{r[s]=a}),Bh(e2)?{version:"1.0",truncation:null,padding:null,added_tokens:Oa(e2,t),normalizer:{type:"Replace",pattern:{String:" "},content:"▁"},pre_tokenizer:{type:"Split",pattern:{String:" "},behavior:"MergedWithPrevious",invert:false},post_processor:null,decoder:{type:"Sequence",decoders:[{type:"Replace",pattern:{String:"▁"},content:" "},{type:"ByteFallback"},{type:"Fuse"}]},model:{type:"BPE",dropout:null,unk_token:on(t,e2["tokenizer.ggml.unknown_token_id"])??null,continuing_subword_prefix:null,end_of_word_suffix:null,fuse_unk:true,byte_fallback:true,ignore_merges:false,vocab:r,merges:Wl(n)}}:{version:"1.0",truncation:null,padding:null,added_tokens:Oa(e2,t),normalizer:{type:"NFC"},pre_tokenizer:Ih(e2),post_processor:Eh(),decoder:Th(),model:{type:"BPE",dropout:null,unk_token:on(t,e2["tokenizer.ggml.unknown_token_id"])??null,continuing_subword_prefix:null,end_of_word_suffix:null,fuse_unk:false,byte_fallback:!!e2["tokenizer.ggml.byte_fallback"],ignore_merges:false,vocab:r,merges:Wl(n)}}}function Bh(e2){let t=e2["tokenizer.ggml.model"];return typeof t!="string"?false:t==="llama"||t==="spm"||t.startsWith("gemma")||t.startsWith("llama")}function Hl(e2){let t=Ul(e2,"tokenizer.ggml.tokens"),n=e2["tokenizer.ggml.bos_token_id"],r=e2["tokenizer.ggml.eos_token_id"],s=e2["tokenizer.ggml.unknown_token_id"],a=e2["tokenizer.ggml.padding_token_id"],o=Object.fromEntries(Oa(e2,t).map(i=>[i.id,{content:i.content,single_word:i.single_word,lstrip:i.lstrip,rstrip:i.rstrip,normalized:i.normalized,special:i.special}]));return{tokenizer_class:"Qwen2Tokenizer",model_max_length:e2["qwen3.context_length"]??e2["general.context_length"]??32768,bos_token:on(t,n),eos_token:on(t,r),unk_token:on(t,s),pad_token:on(t,a),bos_token_id:Number.isInteger(n)?n:void 0,eos_token_id:Number.isInteger(r)?r:void 0,unk_token_id:Number.isInteger(s)?s:void 0,pad_token_id:Number.isInteger(a)?a:void 0,chat_template:Wa(e2,t),added_tokens_decoder:o}}function Wa(e2,t=xh(e2)){let n=e2["tokenizer.chat_template"];if(typeof n=="string")return n;let r=e2["tokenizer.ggml.chat_template"];return typeof r=="string"?r:t.includes("<|im_start|>")&&t.includes("<|im_end|>")?Sh:null}function Ih(e2){let t=e2["tokenizer.ggml.pre"];return t==="qwen2"||t==="qwen3"||e2["general.architecture"]==="qwen3"?{type:"Sequence",pretokenizers:[{type:"Split",pattern:{Regex:Ch},behavior:"Isolated",invert:false},{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}]}:{type:"ByteLevel",add_prefix_space:false,trim_offsets:true,use_regex:true}}function Th(){return{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}}function Eh(){return{type:"ByteLevel",add_prefix_space:false,trim_offsets:false,use_regex:false}}function Oa(e2,t){let n=Array.isArray(e2["tokenizer.ggml.token_type"])?e2["tokenizer.ggml.token_type"]:[],r=new Set;for(let s of[e2["tokenizer.ggml.bos_token_id"],e2["tokenizer.ggml.eos_token_id"],e2["tokenizer.ggml.unknown_token_id"],e2["tokenizer.ggml.padding_token_id"]])Number.isInteger(s)&&r.add(s);for(let s=0;s<n.length;++s)Gh(n[s])&&r.add(s);return[...r].filter(s=>s>=0&&s<t.length).sort((s,a)=>s-a).map(s=>({id:s,content:t[s],single_word:false,lstrip:false,rstrip:false,normalized:false,special:true}))}function Gh(e2){return Number.isInteger(e2)&&e2!==1&&e2!==6}function Wl(e2){return Array.isArray(e2)?e2.map(t=>Array.isArray(t)?t.join(" "):String(t)):[]}function on(e2,t){return typeof t=="number"&&Number.isInteger(t)&&t>=0&&t<e2.length?e2[t]:void 0}function Ul(e2,t){let n=e2[t];if(!Array.isArray(n)||n.some(r=>typeof r!="string"))throw new Error(`GGUF metadata ${t} must be a string array`);return n}function xh(e2){let t=e2["tokenizer.ggml.tokens"];return Array.isArray(t)&&t.every(n=>typeof n=="string")?t:[]}ri();ni();Eo();Yo();var Id="prism-ml/Bonsai-27B-gguf",Bw="Bonsai-27B-Q1_0.gguf",wn=4,Sd=4096;function Bd(e2,t,n="main"){let r=e2??Id;return r.toLowerCase().endsWith(".gguf")?!/^https?:/i.test(r)&&typeof location<"u"?new URL(r,location.href).href:r:xl(r,{revision:n,file:t??Bw})}var ai=class e extends Nr{static DEFAULT_MODEL_ID=Id;#t;#e;#n;#r=wn;#a=0;constructor(t){let n=_s(t.model),r=Math.max(1,Math.min(t.maxLength??Math.min(n,Sd),n)),s=t.model.createGenerationState({maxLength:r});super({...t,generationState:s,defaultMaxNewTokens:Sd}),this.#t=s,this.#e=t.tokenizer.token_to_id("<think>")??null,this.#n=t.tokenizer.token_to_id("</think>")??null}get thinkOpenTokenId(){return this.#e}get thinkCloseTokenId(){return this.#n}streamTokens(t,n){return this.model.streamTokenIdsFromCache({input_ids:[t.suffixIds],generation_state:this.#t,max_new_tokens:t.maxNewTokens,eos_token_id:t.eosTokenId,stop_on_eos:t.stopOnEos,decode_pipeline_depth:n.decodePipelineDepth??this.#r})}get contextLength(){return this.#t.cache.maxLength}static async checkAvailability(t=null,n={}){let r=globalThis.navigator?.gpu;if(!r)return{ok:false,reason:"WebGPU isn't available in this browser. Try a recent Chrome or Edge."};let s=null;try{s=await r.requestAdapter({powerPreference:"high-performance"})}catch{}if(!s)return{ok:false,reason:"No WebGPU adapter is available on this device."};let a=Bd(t,n.file,n.revision??"main"),o=n.fetch??(n.accessToken?Ma(n.accessToken):void 0);try{let i=await kl(a,{fetch:o,signal:n.signal}),u=xs(ar(i),s,i);return u?{ok:false,reason:u}:{ok:true}}catch{return{ok:true}}}static async load(t=null,n={}){let r=n.onProgress??(()=>{}),s=Bd(t,n.file,n.revision??"main"),a=n.fetch??(n.accessToken?Ma(n.accessToken):void 0);r({status:"init",message:"Requesting WebGPU device"});let o=n.runtime??await ju(n.runtimeOptions??{}),i=!n.runtime;o.captureShaders=true;let u=async()=>{};try{r({status:"init",message:"Checking device support"});let l=await an.open(s,{fetch:a,signal:n.signal,cache:n.cache,force:n.force,cacheName:n.cacheName});u=()=>l.close();let c=xs(ar(l),o.device,l);if(c)throw new Error(c);r({status:"tokenizer",message:"Loading tokenizer"}),await si();let{tokenizer:d,chatTemplate:f,tokenizerConfig:p,eosTokenIds:g}=Iw(l);await si();let m=l.names().reduce((E,R)=>E+l.info(R).byteLength,0),A=0;l.onByteProgress=E=>{A+=E,r({status:"weights",kind:"bytes",loaded:A,total:m||null,fraction:m?Math.min(1,A/m):void 0,message:"Streaming weights"})};let h=await $t.loadGGUF(o,{gguf:l,onProgress:E=>{!Zr(E.total)||E.total<=0||r({status:"weights",kind:"tensors",loaded:E.processed,total:E.total,message:"Uploading to GPU"})}});await u();let C=new e({runtime:o,ownsRuntime:i,model:h,tokenizer:d,chatTemplate:f,tokenizerConfig:p,eosTokenIds:g,maxLength:n.maxLength});return r({status:"weights",kind:"tensors",message:"Compiling kernels (warmup)"}),await si(),await h.warmup(C.#t.cache),C.#a=await Ol(o),n.decodePipelineDepth!==void 0?C.#r=nr({decode_pipeline_depth:n.decodePipelineDepth},wn,Ft):(r({status:"weights",kind:"tensors",message:"Tuning decode pipeline"}),C.#r=await C.#s()),r({status:"ready",message:"Ready",fraction:1}),C}catch(l){throw await u().catch(()=>{}),i&&await o.destroy(),l}}get decodePipelineDepth(){return this.#r}get readbackLatencyMs(){return this.#a}async#s(){let t=Math.min(Ft,this.contextLength-1);return t<=wn?wn:(await this.calibrateDecodePipeline({baseDepth:wn,maxDepth:t,minSampleTokens:Math.min(24,this.contextLength)},r=>({decodePipelineDepth:r}))).depth}async benchmark(t,n={}){let r=n.maxNewTokens??64,s=nr({decode_pipeline_depth:n.decodePipelineDepth??this.#r},wn,Ft);return{...await this.benchmarkFixedTokenIds(this.encodePrompt(t),r,{decodePipelineDepth:s}),depth:s}}};function si(){return typeof requestAnimationFrame=="function"?new Promise(e2=>requestAnimationFrame(()=>e2())):new Promise(e2=>setTimeout(e2,0))}function Iw(e2){let t=e2.metadata,n=Hl(t),r=zl(t),s=new Di(r,n),a=typeof n.chat_template=="string"?n.chat_template:Wa(t);if(!a)throw new Error("Bonsai GGUF metadata is missing a chat_template");let o=Tw(n,s);return{tokenizer:s,chatTemplate:new pr(a),tokenizerConfig:n,eosTokenIds:o}}function Tw(e2,t){let n=new Set,r=e2.eos_token_id;if(Zr(r)&&n.add(r),typeof e2.eos_token=="string"){let s=t.token_to_id(e2.eos_token);Zr(s)&&n.add(s)}if(n.size===0)throw new Error("Bonsai GGUF metadata has no eos token id");return[...n]}var $I=ai;export{ai as Bonsai27B,Bw as DEFAULT_GGUF_FILE,Id as DEFAULT_MODEL_ID,$I as default,Bd as resolveGGUFUrl};const Bonsai27B=ai;const DEFAULT_GGUF_FILE=Bw;const $=id2=>document.getElementById(id2);const QSA=new URLSearchParams(location.search);const REQUIRE_HF_TOKEN=window.BONSAI_REQUIRE_HF_TOKEN===true;const MODEL_ID="prism-ml/Bonsai-27B-gguf";const MODEL_SRC=QSA.get("src")||MODEL_ID;const TOKEN_KEY="bonsai27b_hf_token_v1";const TOTAL_BYTES_FALLBACK=38e8;let chat=null;let loadState="idle";let loadBlocked=false;let accessToken=null;let messages=[];let isGenerating=false;let contextExhausted=false;let abortController=null;let reauthAfterGate=false;const SEED_EXAMPLES=[{label:"LOGIC PUZZLE",prompt:"You have three boxes labeled Apples, Oranges, and Mixed. Every label is wrong.\n\nYou may take one fruit from one box without looking inside. How can you correctly relabel all three boxes?"},{label:"GENERATE CODE",prompt:"Write a python function that takes a list of numbers and returns the sum of the even numbers."},{label:"WRITE A HAIKU",prompt:"Write a haiku about a bonsai tree."}];const gate=$("gate"),gateInput=$("gateInput"),gateError=$("gateError");const gateContinue=$("gateContinue"),gateField=$("gateField"),veil=$("veil");async function validateToken(token){const trimmed=(token||"").trim();if(!trimmed)return{valid:false,error:"A token is required."};try{const res=await fetch(`https://huggingface.co/api/models/${MODEL_ID}`,{headers:{Authorization:`Bearer ${trimmed}`}});if(res.ok)return{valid:true};if(res.status===401)return{valid:false,error:"Invalid token."};let body=null;try{body=await res.json()}catch{}const errText=body?.error?String(body.error):"";if(res.status===404||errText.toLowerCase().includes("repository not found")){return{valid:false,error:"This token can't access the model. Request access on the model page, then try again."}}if(res.status===403)return{valid:false,error:"Access forbidden — the token needs read permission."};return{valid:false,error:errText||`Validation failed (HTTP ${res.status}).`}}catch{return{valid:null,error:"Couldn't reach huggingface.co to verify the token."}}}function showGate(prefill=""){veil.hidden=true;gate.hidden=false;gate.classList.remove("leave");if(prefill)gateInput.value=prefill;requestAnimationFrame(()=>requestAnimationFrame(()=>{gate.classList.add("show");gateInput.focus()}))}function showGateError(message){gateError.textContent=message;gateError.hidden=false;gateField.classList.add("error")}function clearGateError(){gateError.hidden=true;gateField.classList.remove("error")}function grant(token){accessToken=token;try{localStorage.setItem(TOKEN_KEY,token)}catch{}gate.classList.add("leave");setTimeout(()=>{gate.hidden=true;gate.classList.remove("show","leave")},550);if(veil.hidden===false){veil.classList.add("leave");setTimeout(()=>{veil.hidden=true;veil.classList.remove("leave")},850)}window.App?.bootLanding?.();runAvailabilityCheck();if(reauthAfterGate){reauthAfterGate=false;hideLoadError();startLoad()}}async function submitGate(){if(gateContinue.classList.contains("busy"))return;const token=gateInput.value.trim();if(!token){showGateError("A token is required.");return}clearGateError();gateContinue.classList.add("busy");gateContinue.textContent="VALIDATING …";const result=await validateToken(token);gateContinue.classList.remove("busy");gateContinue.innerHTML="CONTINUE →";if(result.valid===false){showGateError(result.error);return}grant(token)}gateContinue.addEventListener("click",e2=>{e2.preventDefault();submitGate()});gateInput.addEventListener("keydown",e2=>{if(e2.key==="Enter"){e2.preventDefault();submitGate()}});gateInput.addEventListener("input",clearGateError);$("gateShow").addEventListener("click",()=>{const hidden=gateInput.type==="password";gateInput.type=hidden?"text":"password";$("gateShow").textContent=hidden?"HIDE":"SHOW"});async function initAccess(){if(!REQUIRE_HF_TOKEN){runAvailabilityCheck();return}let stored=null;try{stored=localStorage.getItem(TOKEN_KEY)}catch{}if(!stored){showGate();return}veil.hidden=false;const result=await validateToken(stored);if(result.valid===false){try{localStorage.removeItem(TOKEN_KEY)}catch{}showGate(stored);showGateError(result.error+" Enter a current token to continue.");return}grant(stored)}async function runAvailabilityCheck(){if(!navigator.gpu){blockLoad("WebGPU isn't available in this browser. Try a recent Chrome or Edge.");return}try{const res=await Bonsai27B.checkAvailability(MODEL_SRC,{file:MODEL_SRC===MODEL_ID?DEFAULT_GGUF_FILE:void 0,accessToken:accessToken??void 0});if(res&&!res.ok&&res.reason&&loadState==="idle")blockLoad(res.reason)}catch{}}function blockLoad(reason){loadBlocked=true;const cta=$("loadCta");cta.textContent="UNAVAILABLE ON THIS DEVICE";cta.style.opacity="0.45";cta.style.pointerEvents="none";$("ctaNote").textContent=reason;$("ctaNote").hidden=false}$("loadCta").addEventListener("click",e2=>{if(loadBlocked){e2.preventDefault();e2.stopImmediatePropagation()}},true);window.BonsaiApp={startLoad,enterChat};async function startLoad(){if(loadState==="loading"||loadState==="ready"||loadBlocked)return;loadState="loading";hideLoadError();BonsaiLoader.set(0,TOTAL_BYTES_FALLBACK);BonsaiLoader.phase("REQUESTING WEBGPU DEVICE");if(document.body.classList.contains("stage-loading")){await new Promise(resolve=>setTimeout(resolve,1150))}try{chat=await Bonsai27B.load(MODEL_SRC,{file:MODEL_SRC===MODEL_ID?DEFAULT_GGUF_FILE:void 0,accessToken:accessToken??void 0,cache:QSA.has("nocache")?false:void 0,maxLength:Number.parseInt(QSA.get("ctx")??"",10)||void 0,onProgress:onLoadProgress});loadState="ready";window.__bonsaiChat=chat;prepChatUi();BonsaiLoader.done()}catch(error){console.error(error);loadState="failed";showLoadError(error)}}function onLoadProgress(event){if(event.status==="init"){BonsaiLoader.phase((event.message||"INITIALIZING").toUpperCase())}else if(event.status==="tokenizer"){BonsaiLoader.phase("PARSING TOKENIZER — 248K VOCAB")}else if(event.status==="weights"){if(event.kind==="bytes"&&Number.isFinite(event.loaded)){BonsaiLoader.phase(null);BonsaiLoader.set(event.loaded,Number.isFinite(event.total)&&event.total>0?event.total:TOTAL_BYTES_FALLBACK)}else if(event.kind==="tensors"){if(/warmup/i.test(event.message||"")){BonsaiLoader.phase("COMPILING WEBGPU KERNELS · WARMUP")}else if(Number.isFinite(event.total)&&event.total>0){BonsaiLoader.info({tensors:event.loaded,tensorsTotal:event.total})}}}}function showLoadError(error){const message=String(error?.message??error);document.body.classList.add("load-failed");BonsaiLoader.phase("LOAD FAILED");$("loadErrorMsg").textContent=message;$("loadError").hidden=false;const authish=REQUIRE_HF_TOKEN&&/\b40[134]\b|unauthorized|forbidden|invalid token|\btoken\b|repository not found|access (denied|restricted|to model)/i.test(message);$("changeTokenBtn").hidden=!authish}function hideLoadError(){document.body.classList.remove("load-failed");$("loadError").hidden=true;BonsaiLoader.phase(null)}$("retryBtn").addEventListener("click",e2=>{e2.preventDefault();if(loadState==="failed"){hideLoadError();startLoad()}});$("changeTokenBtn").addEventListener("click",e2=>{e2.preventDefault();try{localStorage.removeItem(TOKEN_KEY)}catch{}reauthAfterGate=true;showGate(accessToken??"")});if(document.body.classList.contains("stage-loading")&&!QSA.has("demo")&&!QSA.has("p"))startLoad();const chatx=$("chatx"),cScroll=$("cScroll"),cThread=$("cThread");const cInput=$("cInput"),cSend=$("cSend"),cStop=$("cStop");const cStatus=$("cStatus"),cStatusText=$("cStatusText"),cLive=$("cLive");BonsaiLoader.onReady(()=>setTimeout(enterChat,1800));function enterChat(){if(loadState!=="ready"||document.body.classList.contains("stage-chat"))return;document.body.classList.add("stage-chat");chatx.classList.add("show");setStatus("","READY");setTimeout(()=>cInput.focus(),450)}function prepChatUi(){cInput.disabled=false;$("clearBtn").disabled=false;$("thinkToggle").disabled=false;renderSeeds();refreshSend()}function setStatus(mode,text){cStatus.className="c-status"+(mode?" "+mode:"");if(text!==void 0)cStatusText.textContent=text}function renderSeeds(){const wrap=$("cSeeds");if(!wrap)return;wrap.replaceChildren(...SEED_EXAMPLES.map(seed=>{const b=document.createElement("button");b.className="c-seed";b.type="button";b.dataset.prompt=seed.prompt;b.textContent=seed.label;return b}))}document.addEventListener("click",e2=>{const seed=e2.target.closest(".c-seed");if(!seed||seed.disabled||!chat||isGenerating)return;cInput.value=seed.dataset.prompt||"";send()});cSend.addEventListener("click",send);cStop.addEventListener("click",()=>abortController?.abort());$("clearBtn").addEventListener("click",clearChat);cInput.addEventListener("input",()=>{autoGrow();refreshSend()});cInput.addEventListener("keydown",e2=>{if(e2.key==="Enter"&&!e2.shiftKey){e2.preventDefault();if(!cSend.disabled)send()}});function refreshSend(){cSend.disabled=isGenerating||contextExhausted||!chat||cInput.value.trim()===""}function autoGrow(){cInput.style.height="auto";cInput.style.height=`${Math.min(cInput.scrollHeight,180)}px`}function scrollDown(force=false){const nearBottom=cScroll.scrollHeight-cScroll.scrollTop-cScroll.clientHeight<90;if(force||nearBottom)cScroll.scrollTop=cScroll.scrollHeight}function setGenerating(on2){isGenerating=on2;cInput.disabled=on2;$("clearBtn").disabled=on2;$("thinkToggle").disabled=on2;cSend.style.display=on2?"none":"";cStop.style.display=on2?"grid":"none";document.querySelectorAll(".c-seed").forEach(s=>{s.disabled=on2});setStatus(on2?"busy":"",on2?thinkingEnabled?"REASONING …":"WRITING …":"READY");refreshSend()}let thinkingEnabled=false;const thinkToggle=$("thinkToggle");thinkToggle.addEventListener("click",()=>{thinkingEnabled=!thinkingEnabled;thinkToggle.classList.toggle("on",thinkingEnabled);thinkToggle.setAttribute("aria-pressed",String(thinkingEnabled));$("thinkTip").textContent=`THINKING ${thinkingEnabled?"ON":"OFF"}`});const welcomeTemplate=$("cWelcome").cloneNode(true);function removeWelcome(){$("cWelcome")?.remove()}function clearChat(){if(isGenerating)return;messages=[];chat?.reset();contextExhausted=false;cInput.disabled=false;cInput.placeholder="Ask anything…";setStatus("","READY");cThread.replaceChildren(welcomeTemplate.cloneNode(true));renderSeeds();cInput.focus()}function appendUser(text){const msg=document.createElement("div");msg.className="c-msg user";const role=document.createElement("div");role.className="c-role";role.textContent="YOU";const bubble=document.createElement("div");bubble.className="u-bubble";bubble.textContent=text;msg.append(role,bubble);cThread.appendChild(msg);scrollDown(true)}function appendAssistant(withThinking){const msg=document.createElement("div");msg.className="c-msg bot";msg.innerHTML=`
|
| 5430 |
<div class="c-role">BONSAI</div>
|
| 5431 |
${withThinking?`
|
| 5432 |
<div class="t-block live open">
|