diff --git a/examples/server/public/index.html.gz b/examples/server/public/index.html.gz
index d20e250c..8a136975 100644
Binary files a/examples/server/public/index.html.gz and b/examples/server/public/index.html.gz differ
diff --git a/examples/server/webui/dist/index.html b/examples/server/webui/dist/index.html
index b0eff630..0d185b68 100644
--- a/examples/server/webui/dist/index.html
+++ b/examples/server/webui/dist/index.html
@@ -69,7 +69,7 @@ ${n.content}`});else if(n.type==="imageFile")e.push({type:"image_url",image_url:
***`:i.role==="assistant"?"Assistant:"+s:i.role==="user"?"User:"+s:i.role+":"+s}).join(`
`),e=e+`
Assistant:`):e=l.map(i=>{let s=oz(i);return i.role==="system"?s+`
-***`:(i.role==="assistant"||i.role==="user",s)}).join(""),e}function PC(l){return console.debug({messages:l}),l.map(t=>{if(t.role!=="assistant")return t;const e=t.content;return{role:t.role,content:t.role==="assistant"?e.split(/<\/think>|<\|end\|>/).at(-1).trim():e}})}function es(l){return Object.entries(l).filter(([t,e])=>e).map(([t,e])=>t).join(" ")}const HC=l=>{const t=new URL(window.location.href);l.forEach(e=>{t.searchParams.delete(e)}),window.history.replaceState({},"",t.toString())},f1=async(l,t)=>{try{const e=await fetch(`${l}/v1/props`,{headers:{"Content-Type":"application/json",...t?{Authorization:`Bearer ${t}`}:{}}});return e.ok,await e.json()}catch(e){throw e}},QC=!1,hb=new URL(".",document.baseURI).href.toString().replace(/\/$/,""),Br={apiKey:"",completionType:"Chat",systemMessage:"You are a helpful assistant.",showTokensPerSecond:!1,showThoughtInProgress:!1,useServerDefaults:!1,excludeThoughtOnReq:!0,pasteLongTextToFileLen:2500,pdfAsImage:!1,reasoning_format:"auto",samplers:"kdypmxntw",temperature:.8,dynatemp_range:0,dynatemp_exponent:1,top_k:40,top_p:.95,min_p:.05,xtc_probability:0,xtc_threshold:.1,adaptive_target:-1,adaptive_decay:.9,top_n_sigma:0,typical_p:1,repeat_last_n:64,repeat_penalty:1,presence_penalty:0,frequency_penalty:0,dry_multiplier:0,dry_base:1.75,dry_allowed_length:2,dry_penalty_last_n:-1,max_tokens:-1,stop_string:"\\n\\n,\\nUser:",prefix_role:"true",custom:"",pyIntepreterEnabled:!1},BC={reasoning_format:"Specify how to parse reasoning content. none: reasoning content in content block. auto: reasoning content in reasoning_content. ",apiKey:"Set the API Key if you are using --api-key option for the server.",completionType:"Set completion type to be either chat or text",systemMessage:"The starting message that defines how model should behave.",pasteLongTextToFileLen:"On pasting long text, it will be converted to a file. You can control the file length by setting the value of this parameter. Value 0 means disable.",samplers:'The order at which samplers are applied, in simplified way. Default is "dkypmxnt": dry->top_k->typ_p->top_p->min_p->xtc->top_sigma->temperature',temperature:"Controls the randomness of the generated text by affecting the probability distribution of the output tokens. Higher = more random, lower = more focused.",dynatemp_range:"Addon for the temperature sampler. The added value to the range of dynamic temperature, which adjusts probabilities by entropy of tokens.",dynatemp_exponent:"Addon for the temperature sampler. Smoothes out the probability redistribution based on the most probable token.",top_k:"Keeps only k top tokens.",top_p:"Limits tokens to those that together have a cumulative probability of at least p",min_p:"Limits tokens based on the minimum probability for a token to be considered, relative to the probability of the most likely token.",xtc_probability:"XTC sampler cuts out top tokens; this parameter controls the chance of cutting tokens at all. 0 disables XTC.",xtc_threshold:"XTC sampler cuts out top tokens; this parameter controls the token probability that is required to cut that token.",top_n_sigma:"Top-n-sigma sampling filters out low-value tokens by discarding tokens that fall more than n standard deviations below the maximum probability",typical_p:"Sorts and limits tokens based on the difference between log-probability and entropy.",repeat_last_n:"Last n tokens to consider for penalizing repetition",repeat_penalty:"Controls the repetition of token sequences in the generated text",presence_penalty:"Limits tokens based on whether they appear in the output or not.",frequency_penalty:"Limits tokens based on how often they appear in the output.",dry_multiplier:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the DRY sampling multiplier.",dry_base:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the DRY sampling base value.",dry_allowed_length:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the allowed length for DRY sampling.",dry_penalty_last_n:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets DRY penalty for the last n tokens.",max_tokens:"The maximum number of token per output.",useServerDefaults:"When enabled, skip sending WebUI defaults (e.g., temperature) and use the server's default values instead.",stop_string:"List of stop string separated by comma. Not applied to chat completions.",prefix_role:"Whether to add Role at the start of each message. Not applied to chat completions.",adaptive_target:"Select tokens near this probability (valid range 0.0 to 1.0; <0 = disabled)",adaptive_decay:"Decay rate for target adaptation over time. lower values -> faster but less stable adaptation. (valid range 0.0 to 1.0; ≤0 = no adaptation)",custom:""};Object.entries(Br).filter(l=>SX(l[1])).map(l=>l[0]);const AC=["light","dark"].concat(Object.keys(Jx).filter(l=>l!=="light"&&l!=="dark"));var S1={exports:{}},_C=S1.exports,dz;function qC(){return dz||(dz=1,function(l,t){(function(e,n){l.exports=n()})(_C,function(){var e=function(W,G){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(I,R){I.__proto__=R}||function(I,R){for(var O in R)Object.prototype.hasOwnProperty.call(R,O)&&(I[O]=R[O])})(W,G)},n=function(){return(n=Object.assign||function(W){for(var G,I=1,R=arguments.length;I"u"||s.Promise||(s.Promise=Promise);var d=Object.getPrototypeOf,h={}.hasOwnProperty;function b(W,G){return h.call(W,G)}function p(W,G){typeof G=="function"&&(G=G(d(W))),(typeof Reflect>"u"?a:Reflect.ownKeys)(G).forEach(function(I){M(W,I,G[I])})}var y=Object.defineProperty;function M(W,G,I,R){y(W,G,o(I&&b(I,"get")&&typeof I.get=="function"?{get:I.get,set:I.set,configurable:!0}:{value:I,configurable:!0,writable:!0},R))}function T(W){return{from:function(G){return W.prototype=Object.create(G.prototype),M(W.prototype,"constructor",W),{extend:p.bind(null,W.prototype)}}}}var Y=Object.getOwnPropertyDescriptor,L=[].slice;function x(W,G,I){return L.call(W,G,I)}function g(W,G){return G(W)}function F(W){if(!W)throw new Error("Assertion Failed")}function j(W){s.setImmediate?setImmediate(W):setTimeout(W,0)}function D(W,G){if(typeof G=="string"&&b(W,G))return W[G];if(!G)return W;if(typeof G!="string"){for(var I=[],R=0,O=G.length;R{if(t.role!=="assistant")return t;const e=t.content;return{role:t.role,content:t.role==="assistant"?e.split(/<\/think>|<\|end\|>/).at(-1).trim():e}})}function es(l){return Object.entries(l).filter(([t,e])=>e).map(([t,e])=>t).join(" ")}const HC=l=>{const t=new URL(window.location.href);l.forEach(e=>{t.searchParams.delete(e)}),window.history.replaceState({},"",t.toString())},f1=async(l,t)=>{try{const e=await fetch(`${l}/v1/props`,{headers:{"Content-Type":"application/json",...t?{Authorization:`Bearer ${t}`}:{}}});return e.ok,await e.json()}catch(e){throw e}},QC=!1,hb=new URL(".",document.baseURI).href.toString().replace(/\/$/,""),Br={apiKey:"",completionType:"Chat",systemMessage:"You are a helpful assistant.",showTokensPerSecond:!1,showThoughtInProgress:!1,useServerDefaults:!1,excludeThoughtOnReq:!0,pasteLongTextToFileLen:2500,pdfAsImage:!1,reasoning_format:"auto",samplers:"kdypmxntw",temperature:.8,dynatemp_range:0,dynatemp_exponent:1,top_k:40,top_p:.95,min_p:.05,xtc_probability:0,xtc_threshold:.1,adaptive_target:-1,adaptive_decay:.9,top_n_sigma:0,typical_p:1,repeat_last_n:64,repeat_penalty:1,presence_penalty:0,frequency_penalty:0,dry_multiplier:0,dry_base:1.75,dry_allowed_length:2,dry_penalty_last_n:-1,max_tokens:-1,stop_string:"\\n\\n,\\nUser:",prefix_role:"true",custom:"",pyIntepreterEnabled:!1},BC={reasoning_format:"Specify how to parse reasoning content. none: reasoning content in content block. auto: reasoning content in reasoning_content. ",apiKey:"Set the API Key if you are using --api-key option for the server.",completionType:"Set completion type to be either chat or text",systemMessage:"The starting message that defines how model should behave.",pasteLongTextToFileLen:"On pasting long text, it will be converted to a file. You can control the file length by setting the value of this parameter. Value 0 means disable.",samplers:'The order at which samplers are applied, in simplified way. Default is "kdypmxntw": top_k->dry->typ_p->top_p->min_p->xtc->top_sigma->temperature->adaptive_p',temperature:"Controls the randomness of the generated text by affecting the probability distribution of the output tokens. Higher = more random, lower = more focused.",dynatemp_range:"Addon for the temperature sampler. The added value to the range of dynamic temperature, which adjusts probabilities by entropy of tokens.",dynatemp_exponent:"Addon for the temperature sampler. Smoothes out the probability redistribution based on the most probable token.",top_k:"Keeps only k top tokens.",top_p:"Limits tokens to those that together have a cumulative probability of at least p",min_p:"Limits tokens based on the minimum probability for a token to be considered, relative to the probability of the most likely token.",xtc_probability:"XTC sampler cuts out top tokens; this parameter controls the chance of cutting tokens at all. 0 disables XTC.",xtc_threshold:"XTC sampler cuts out top tokens; this parameter controls the token probability that is required to cut that token.",top_n_sigma:"Top-n-sigma sampling filters out low-value tokens by discarding tokens that fall more than n standard deviations below the maximum probability",typical_p:"Sorts and limits tokens based on the difference between log-probability and entropy.",repeat_last_n:"Last n tokens to consider for penalizing repetition",repeat_penalty:"Controls the repetition of token sequences in the generated text",presence_penalty:"Limits tokens based on whether they appear in the output or not.",frequency_penalty:"Limits tokens based on how often they appear in the output.",dry_multiplier:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the DRY sampling multiplier.",dry_base:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the DRY sampling base value.",dry_allowed_length:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets the allowed length for DRY sampling.",dry_penalty_last_n:"DRY sampling reduces repetition in generated text even across long contexts. This parameter sets DRY penalty for the last n tokens.",max_tokens:"The maximum number of token per output.",useServerDefaults:"When enabled, skip sending WebUI defaults (e.g., temperature) and use the server's default values instead.",stop_string:"List of stop string separated by comma. Not applied to chat completions.",prefix_role:"Whether to add Role at the start of each message. Not applied to chat completions.",adaptive_target:"Select tokens near this probability (valid range 0.0 to 1.0; <0 = disabled)",adaptive_decay:"Decay rate for target adaptation over time. lower values -> faster but less stable adaptation. (valid range 0.0 to 1.0; ≤0 = no adaptation)",custom:""};Object.entries(Br).filter(l=>SX(l[1])).map(l=>l[0]);const AC=["light","dark"].concat(Object.keys(Jx).filter(l=>l!=="light"&&l!=="dark"));var S1={exports:{}},_C=S1.exports,dz;function qC(){return dz||(dz=1,function(l,t){(function(e,n){l.exports=n()})(_C,function(){var e=function(W,G){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(I,R){I.__proto__=R}||function(I,R){for(var O in R)Object.prototype.hasOwnProperty.call(R,O)&&(I[O]=R[O])})(W,G)},n=function(){return(n=Object.assign||function(W){for(var G,I=1,R=arguments.length;I"u"||s.Promise||(s.Promise=Promise);var d=Object.getPrototypeOf,h={}.hasOwnProperty;function b(W,G){return h.call(W,G)}function p(W,G){typeof G=="function"&&(G=G(d(W))),(typeof Reflect>"u"?a:Reflect.ownKeys)(G).forEach(function(I){M(W,I,G[I])})}var y=Object.defineProperty;function M(W,G,I,R){y(W,G,o(I&&b(I,"get")&&typeof I.get=="function"?{get:I.get,set:I.set,configurable:!0}:{value:I,configurable:!0,writable:!0},R))}function T(W){return{from:function(G){return W.prototype=Object.create(G.prototype),M(W.prototype,"constructor",W),{extend:p.bind(null,W.prototype)}}}}var Y=Object.getOwnPropertyDescriptor,L=[].slice;function x(W,G,I){return L.call(W,G,I)}function g(W,G){return G(W)}function F(W){if(!W)throw new Error("Assertion Failed")}function j(W){s.setImmediate?setImmediate(W):setTimeout(W,0)}function D(W,G){if(typeof G=="string"&&b(W,G))return W[G];if(!G)return W;if(typeof G!="string"){for(var I=[],R=0,O=G.length;R"u"?[]:function(){var W=Promise.resolve();if(typeof crypto>"u"||!crypto.subtle)return[W,d(W),W];var G=crypto.subtle.digest("SHA-512",new Uint8Array([0]));return[G,d(G),W]}(),de=Yt[0],la=Yt[1],Yt=Yt[2],la=la&&la.then,Jt=de&&de.constructor,be=!!Yt,ee=function(W,G){fe.push([W,G]),C&&(queueMicrotask(Me),C=!1)},Q=!0,C=!0,q=[],mt=[],Vt=$e,ie={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:he,pgp:!1,env:{},finalize:he},Ot=ie,fe=[],oe=0,_e=[];function $t(W){if(typeof this!="object")throw new TypeError("Promises must be constructed via new");this._listeners=[],this._lib=!1;var G=this._PSD=Ot;if(typeof W!="function"){if(W!==sn)throw new TypeError("Not a function");return this._state=arguments[1],this._value=arguments[2],void(this._state===!1&&Nl(this,this._value))}this._state=null,this._value=null,++G.ref,function I(R,O){try{O(function(P){if(R._state===null){if(P===R)throw new TypeError("A promise cannot be resolved with itself.");var et=R._lib&&ml();P&&typeof P.then=="function"?I(R,function(ct,yt){P instanceof $t?P._then(ct,yt):P.then(ct,yt)}):(R._state=!0,R._value=P,it(R)),et&&Ne()}},Nl.bind(null,R))}catch(P){Nl(R,P)}}(this,W)}var hl={get:function(){var W=Ot,G=Yn;function I(R,O){var P=this,et=!W.global&&(W!==Ot||G!==Yn),ct=et&&!Yl(),yt=new $t(function(Tt,zt){Et(P,new xl(ec(R,W,et,ct),ec(O,W,et,ct),Tt,zt,W))});return this._consoleTask&&(yt._consoleTask=this._consoleTask),yt}return I.prototype=sn,I},set:function(W){M(this,"then",W&&W.prototype===sn?hl:{get:function(){return W},set:hl.set})}};function xl(W,G,I,R,O){this.onFulfilled=typeof W=="function"?W:null,this.onRejected=typeof G=="function"?G:null,this.resolve=I,this.reject=R,this.psd=O}function Nl(W,G){var I,R;mt.push(G),W._state===null&&(I=W._lib&&ml(),G=Vt(G),W._state=!1,W._value=G,R=W,q.some(function(O){return O._value===R._value})||q.push(R),it(W),I&&Ne())}function it(W){var G=W._listeners;W._listeners=[];for(var I=0,R=G.length;I.",Ms="String expected.",Ni=[],ns="__dbnames",mr="readonly",ye="readwrite";function Qe(W,G){return W?G?function(){return W.apply(this,arguments)&&G.apply(this,arguments)}:W:G}var wl={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function fl(W){return typeof W!="string"||/\./.test(W)?function(G){return G}:function(G){return G[W]===void 0&&W in G&&delete(G=ht(G))[W],G}}function On(){throw Zt.Type()}function ll(W,G){try{var I=Wa(W),R=Wa(G);if(I!==R)return I==="Array"?1:R==="Array"?-1:I==="binary"?1:R==="binary"?-1:I==="string"?1:R==="string"?-1:I==="Date"?1:R!=="Date"?NaN:-1;switch(I){case"number":case"Date":case"string":return GHt+Bt&&jt(Ht+zt)})})}var Pt=ea(I)&&I.limit===1/0&&(typeof W!="function"||W===co)&&{index:I.index,range:I.range};return jt(0).then(function(){if(0=ft})).length!==0?(zt.forEach(function(jt){St.push(function(){var Pt=Lt,Ht=jt._cfg.dbschema;Ki(ot,Pt,wt),Ki(ot,Ht,wt),Lt=ot._dbSchema=Ht;var Bt=Dd(Pt,Ht);Bt.add.forEach(function(ge){Sh(wt,ge[0],ge[1].primKey,ge[1].indexes)}),Bt.change.forEach(function(ge){if(ge.recreate)throw new Zt.Upgrade("Not yet support for changing primary key");var Ye=wt.objectStore(ge.name);ge.add.forEach(function(Oe){return uo(Ye,Oe)}),ge.change.forEach(function(Oe){Ye.deleteIndex(Oe.name),uo(Ye,Oe)}),ge.del.forEach(function(Oe){return Ye.deleteIndex(Oe)})});var Ze=jt._cfg.contentUpgrade;if(Ze&&jt._cfg.version>ft){kd(ot,wt),Wt._memoizedTables={};var Ie=ut(Ht);Bt.del.forEach(function(ge){Ie[ge]=Pt[ge]}),Y0(ot,[ot.Transaction.prototype]),oo(ot,[ot.Transaction.prototype],a(Ie),Ie),Wt.schema=Ie;var pe,Xe=nt(Ze);return Xe&&Pn(),Bt=$t.follow(function(){var ge;(pe=Ze(Wt))&&Xe&&(ge=Yl.bind(null,null),pe.then(ge,ge))}),pe&&typeof pe.then=="function"?$t.resolve(pe):Bt.then(function(){return pe})}}),St.push(function(Pt){var Ht,Bt,Ze=jt._cfg.dbschema;Ht=Ze,Bt=Pt,[].slice.call(Bt.db.objectStoreNames).forEach(function(Ie){return Ht[Ie]==null&&Bt.db.deleteObjectStore(Ie)}),Y0(ot,[ot.Transaction.prototype]),oo(ot,[ot.Transaction.prototype],ot._storeNames,ot._dbSchema),Wt.schema=ot._dbSchema}),St.push(function(Pt){ot.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(ot.idbdb.version/10)===jt._cfg.version?(ot.idbdb.deleteObjectStore("$meta"),delete ot._dbSchema.$meta,ot._storeNames=ot._storeNames.filter(function(Ht){return Ht!=="$meta"})):Pt.objectStore("$meta").put(jt._cfg.version,"version"))})}),function jt(){return St.length?$t.resolve(St.shift()(Wt.idbtrans)).then(jt):$t.resolve()}().then(function(){L0(Lt,wt)})):$t.resolve();var ot,ft,Wt,wt,St,Lt}).catch(et)):(a(O).forEach(function(zt){Sh(I,zt,O[zt].primKey,O[zt].indexes)}),kd(W,I),void $t.follow(function(){return W.on.populate.fire(P)}).catch(et));var yt,Tt})}function up(W,G){L0(W._dbSchema,G),G.db.version%10!=0||G.objectStoreNames.contains("$meta")||G.db.createObjectStore("$meta").add(Math.ceil(G.db.version/10-1),"version");var I=V0(0,W.idbdb,G);Ki(W,W._dbSchema,G);for(var R=0,O=Dd(I,W._dbSchema).change;RMath.pow(2,62)?0:Lt.oldVersion,ot=Lt<1,W.idbdb=St.result,P&&up(W,zt),Zr(W,Lt/10,zt,Wt))},Wt),St.onsuccess=Qt(function(){zt=null;var Lt,jt,Pt,Ht,Bt,Ze=W.idbdb=St.result,Ie=x(Ze.objectStoreNames);if(0"u"?$t.resolve():!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise(function(ft){function Wt(){return indexedDB.databases().finally(ft)}yt=setInterval(Wt,100),Wt()}).finally(function(){return clearInterval(yt)}):Promise.resolve()).then(ct)]).then(function(){return et(),G.onReadyBeingFired=[],$t.resolve(w0(function(){return W.on.ready.fire(W.vip)})).then(function ft(){if(0G.limit?ft.length=G.limit:W.length===G.limit&&ft.length=jt.limit&&(!jt.values||Ze.req.values)&&_W(Ze.req.query.range,jt.query.range)}),!1,Pt,Ht];case"count":return Bt=Ht.find(function(Ze){return AW(Ze.req.query.range,jt.query.range)}),[Bt,!!Bt,Pt,Ht]}}(G,I,"query",P),zt=Tt[0],ot=Tt[1],ft=Tt[2],Wt=Tt[3];return zt&&ot?zt.obsSet=P.obsSet:(ot=R.query(P).then(function(wt){var St=wt.result;if(zt&&(zt.res=St),et){for(var Lt=0,jt=St.length;Lt = {
pasteLongTextToFileLen:
'On pasting long text, it will be converted to a file. You can control the file length by setting the value of this parameter. Value 0 means disable.',
samplers:
- 'The order at which samplers are applied, in simplified way. Default is "dkypmxnt": dry->top_k->typ_p->top_p->min_p->xtc->top_sigma->temperature',
+ 'The order at which samplers are applied, in simplified way. Default is "kdypmxntw": top_k->dry->typ_p->top_p->min_p->xtc->top_sigma->temperature->adaptive_p',
temperature:
'Controls the randomness of the generated text by affecting the probability distribution of the output tokens. Higher = more random, lower = more focused.',
dynatemp_range: