sillytavern-utils-lib 1.0.65 → 1.0.66

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.
@@ -1,6 +1,6 @@
1
- "use strict";var Et=Object.defineProperty;var Rt=(m,i,o)=>i in m?Et(m,i,{enumerable:!0,configurable:!0,writable:!0,value:o}):m[i]=o;var A=(m,i,o)=>Rt(m,typeof i!="symbol"?i+"":i,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./config.cjs"),St=require("./tokenizer.cjs"),gt=require("../../../regex/engine.js"),dt=require("../../../../world-info.js"),a=require("../../../../../script.js"),_t=require("../../../../power-user.js"),ht=require("../../../../group-chats.js");class Ot{constructor(i){A(this,"messages",[]);A(this,"tokenizer");A(this,"maxContext");A(this,"currentTokenCount",0);this.tokenizer=new St.Tokenizer,this.maxContext=i}getTokenCount(i){var o,g;return i.content?((g=(o=i.source)==null?void 0:o.extra)==null?void 0:g.token_count)??this.tokenizer.encode(i.content).length:0}canFit(i){return this.currentTokenCount+this.getTokenCount(i)<=this.maxContext}add(i){if(!i.content)return!0;const o=this.getTokenCount(i);return this.currentTokenCount+o>this.maxContext?!1:(this.messages.push(i),this.currentTokenCount+=o,!0)}addFront(i){if(!i.content)return!0;const o=this.getTokenCount(i);return this.currentTokenCount+o>this.maxContext?!1:(this.messages.unshift(i),this.currentTokenCount+=o,!0)}addMany(i){const o=i.filter(u=>u.content),g=o.map(u=>this.getTokenCount(u)),U=g.reduce((u,P)=>u+P,0);if(this.currentTokenCount+U<=this.maxContext)return this.messages.push(...o),this.currentTokenCount+=U,!0;let b=0;const f=[];for(let u=o.length-1;u>=0;u--){const P=o[u],v=g[u];if(this.currentTokenCount+b+v<=this.maxContext)f.unshift(P),b+=v;else break}return f.length>0&&(this.messages.push(...f),this.currentTokenCount+=b),f.length===o.length}insert(i,o){if(!o.content)return!0;const g=this.getTokenCount(o);return this.currentTokenCount+g>this.maxContext?!1:(this.messages.splice(i,0,o),this.currentTokenCount+=g,!0)}getMessages(){return this.messages}}async function At(m,{targetCharacterId:i,presetName:o,instructName:g,contextName:U,syspromptName:b,maxContext:f,includeNames:u,ignoreCharacterFields:P,ignoreAuthorNote:v,ignoreWorldInfo:Q,messageIndexesBetween:k}={}){var Z,tt,et,ot,nt,st,rt,it,at,pt,ct,lt,ut,mt;if(!["textgenerationwebui","openai"].includes(m))throw new Error("Unsupported API");const n=SillyTavern.getContext();let{description:$,personality:q,persona:J,scenario:z,mesExamples:Pt,system:y,jailbreak:yt}=P?{description:"",personality:"",persona:"",scenario:"",mesExamples:"",system:"",jailbreak:""}:n.getCharacterCardFields({chid:i});const E=m==="textgenerationwebui"?(Z=n.getPresetManager("instruct"))==null?void 0:Z.getCompletionPresetByName(g):void 0,H=!!(E!=null&&E.enabled);let x=s.st_parseMesExamples(Pt,H);function xt(){var e,l;if(typeof f=="number")return f;if(!f||f==="active"||!o)return s.st_getMaxContextSize();if(typeof f=="number")return f;let t;if(m==="textgenerationwebui"){const r=(e=n.getPresetManager("textgenerationwebui"))==null?void 0:e.getCompletionPresetByName(o);t=r==null?void 0:r.max_length}else{const r=(l=n.getPresetManager("openai"))==null?void 0:l.getCompletionPresetByName(o);t=r==null?void 0:r.openai_max_context}return typeof t=="number"?t:s.st_getMaxContextSize()}let M=[];const W=xt();if(W<=0)return{result:[],warnings:M};const c=new Ot(W),Mt=n.ToolManager.isToolCallingSupported(),K=(k==null?void 0:k.start)??0,L=k!=null&&k.end?k.end+1:void 0;let w=K===-1&&L===0?[]:n.chat.slice(K,L).filter(t=>{var e;return!t.is_system||Mt&&Array.isArray((e=t.extra)==null?void 0:e.tool_invocations)});w=await Promise.all(w.map(async(t,e)=>{var j,D;let l=t.mes,r=t.is_user?gt.regex_placement.USER_INPUT:gt.regex_placement.AI_OUTPUT,p={isPrompt:!0,depth:w.length-e-1},d=s.st_getRegexedString(l,r,p);return d=await s.st_appendFileContent(t,d),(j=t==null?void 0:t.extra)!=null&&j.append_title&&((D=t==null?void 0:t.extra)!=null&&D.title)&&(d=`${d}
1
+ "use strict";var Re=Object.defineProperty;var Se=(u,r,o)=>r in u?Re(u,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):u[r]=o;var U=(u,r,o)=>Se(u,typeof r!="symbol"?r+"":r,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./config.cjs"),Oe=require("./tokenizer.cjs"),I=require("./prompt-message-utils.cjs"),de=require("../../../regex/engine.js"),_e=require("../../../../world-info.js"),a=require("../../../../../script.js"),he=require("../../../../power-user.js"),Pe=require("../../../../group-chats.js");class Ae{constructor(r){U(this,"messages",[]);U(this,"tokenizer");U(this,"maxContext");U(this,"currentTokenCount",0);this.tokenizer=new Oe.Tokenizer,this.maxContext=r}getTokenCount(r){var m,g;const o=I.getMessageText(r);return o?((g=(m=r.source)==null?void 0:m.extra)==null?void 0:g.token_count)??this.tokenizer.encode(o).length:0}canFit(r){return this.currentTokenCount+this.getTokenCount(r)<=this.maxContext}add(r){const o=I.sanitizePromptMessage(r);if(!o)return!0;r=o;const m=this.getTokenCount(r);return this.currentTokenCount+m>this.maxContext?!1:(this.messages.push(r),this.currentTokenCount+=m,!0)}addFront(r){const o=I.sanitizePromptMessage(r);if(!o)return!0;r=o;const m=this.getTokenCount(r);return this.currentTokenCount+m>this.maxContext?!1:(this.messages.unshift(r),this.currentTokenCount+=m,!0)}addMany(r){const o=I.sanitizePromptMessages(r),m=o.map(d=>this.getTokenCount(d)),g=m.reduce((d,y)=>d+y,0);if(this.currentTokenCount+g<=this.maxContext)return this.messages.push(...o),this.currentTokenCount+=g,!0;let v=0;const f=[];for(let d=o.length-1;d>=0;d--){const y=o[d],E=m[d];if(this.currentTokenCount+v+E<=this.maxContext)f.unshift(y),v+=E;else break}return f.length>0&&(this.messages.push(...f),this.currentTokenCount+=v),f.length===o.length}insert(r,o){const m=I.sanitizePromptMessage(o);if(!m)return!0;o=m;const g=this.getTokenCount(o);return this.currentTokenCount+g>this.maxContext?!1:(this.messages.splice(r,0,o),this.currentTokenCount+=g,!0)}getMessages(){return this.messages}}async function Ue(u,{targetCharacterId:r,presetName:o,instructName:m,contextName:g,syspromptName:v,maxContext:f,includeNames:d,ignoreCharacterFields:y,ignoreAuthorNote:E,ignoreWorldInfo:J,messageIndexesBetween:w}={}){var ee,te,oe,se,ne,re,ie,ae,pe,ce,le,me,ue,fe;if(!["textgenerationwebui","openai"].includes(u))throw new Error("Unsupported API");const s=SillyTavern.getContext();let{description:F,personality:$,persona:K,scenario:H,mesExamples:ye,system:x,jailbreak:xe}=y?{description:"",personality:"",persona:"",scenario:"",mesExamples:"",system:"",jailbreak:""}:s.getCharacterCardFields({chid:r});const R=u==="textgenerationwebui"?(ee=s.getPresetManager("instruct"))==null?void 0:ee.getCompletionPresetByName(m):void 0,W=!!(R!=null&&R.enabled);let M=n.st_parseMesExamples(ye,W);function Me(){var t,l;if(typeof f=="number")return f;if(!f||f==="active"||!o)return n.st_getMaxContextSize();if(typeof f=="number")return f;let e;if(u==="textgenerationwebui"){const i=(t=s.getPresetManager("textgenerationwebui"))==null?void 0:t.getCompletionPresetByName(o);e=i==null?void 0:i.max_length}else{const i=(l=s.getPresetManager("openai"))==null?void 0:l.getCompletionPresetByName(o);e=i==null?void 0:i.openai_max_context}return typeof e=="number"?e:n.st_getMaxContextSize()}let C=[];const G=Me();if(G<=0)return{result:[],warnings:C};const c=new Ae(G),Ce=s.ToolManager.isToolCallingSupported(),L=(w==null?void 0:w.start)??0,V=w!=null&&w.end?w.end+1:void 0;let b=L===-1&&V===0?[]:s.chat.slice(L,V).filter(e=>{var t;return!e.is_system||Ce&&Array.isArray((t=e.extra)==null?void 0:t.tool_invocations)});b=await Promise.all(b.map(async(e,t)=>{var z,D;let l=e.mes,i=e.is_user?de.regex_placement.USER_INPUT:de.regex_placement.AI_OUTPUT,p={isPrompt:!0,depth:b.length-t-1},_=n.st_getRegexedString(l,i,p);return _=await n.st_appendFileContent(e,_),(z=e==null?void 0:e.extra)!=null&&z.append_title&&((D=e==null?void 0:e.extra)!=null&&D.title)&&(_=`${_}
2
2
 
3
- ${t.extra.title}`),{...t,mes:d,index:e}}));const Ct=w.map(t=>dt.world_info_include_names?`${t.name}: ${t.mes}`:t.mes).reverse(),{worldInfoString:Ut,worldInfoBefore:I,worldInfoAfter:N,worldInfoExamples:Tt,worldInfoDepth:kt,anBefore:V,anAfter:X}=Q?{worldInfoString:"",worldInfoBefore:"",worldInfoAfter:"",worldInfoExamples:[],worldInfoDepth:[],anBefore:[],anAfter:[]}:await n.getWorldInfoPrompt(Ct,W,!1);for(const t of Tt){const e=t.content;if(e.length===0)continue;const l=s.st_baseChatReplace(e,a.name1,a.name2),r=s.st_parseMesExamples(l,H);t.position===dt.wi_anchor_position.before?x.unshift(...r):x.push(...r)}function Y(){const t=[];for(let e=w.length-1;e>=0;e--){const l=w[e],r=l.name==="System"&&!l.is_user?"system":l.is_user?"user":"assistant";t.unshift({role:r,content:u&&r!="system"?`${l.name}: ${l.mes}`:l.mes,source:l})}c.addMany(t)}if(m==="textgenerationwebui"){const t=[...x];x&&(x=s.st_formatInstructModeExamples(x,a.name1,a.name2));const e=(tt=n.getPresetManager("sysprompt"))==null?void 0:tt.getCompletionPresetByName(b);e&&(y=n.powerUserSettings.prefer_character_prompt&&y?y:s.st_baseChatReplace(e.content,a.name1,a.name2),y=H?s.st_formatInstructModeSystemPrompt(n.substituteParams(y,a.name1,a.name2,e.content),E):y);const l={description:$,personality:q,persona:n.powerUserSettings.persona_description_position==_t.persona_description_positions.IN_PROMPT?J:"",scenario:z,system:y,char:a.name2,user:a.name1,wiBefore:I,wiAfter:N,loreBefore:I,loreAfter:N,mesExamples:x.join(""),mesExamplesRaw:t.join("")},r=(et=n.getPresetManager("context"))==null?void 0:et.getCompletionPresetByName(U);let p=s.st_renderStoryString(l,{customInstructSettings:E,customStoryString:r==null?void 0:r.story_string});p&&c.add({role:"system",content:p,ignoreInstruct:!0}),Y()}else{let t=function(h){const T=_.find(G=>G.identifier===h);if(T)return T;const ft=p.prompts.find(G=>G.identifier===h);if(ft)return ft},e=s.st_setOpenAIMessages(w),l=s.st_setOpenAIMessageExamples(x);async function r(){let[h,T]=await s.st_prepareOpenAIMessages({name2:a.name2,charDescription:$,charPersonality:q,Scenario:z,worldInfoBefore:I,worldInfoAfter:N,extensionPrompts:n.extensionPrompts,bias:"",type:"normal",quietPrompt:void 0,quietImage:void 0,cyclePrompt:"",systemPromptOverride:y,jailbreakPromptOverride:yt,personaDescription:J,messages:e,messageExamples:l},!1);c.addMany(h)}if(!o)return M.push("No preset name provided. Using default preset."),await r(),{result:c.getMessages(),warnings:M};const p=(ot=n.getPresetManager("openai"))==null?void 0:ot.getCompletionPresetByName(o);if(!p)return console.warn(`Preset not found: ${o}. Using current preset.`),M.push(`Preset not found: ${o}. Using current preset.`),r(),{result:c.getMessages(),warnings:M};let d=(nt=p.prompt_order)==null?void 0:nt.find(h=>h.character_id===a.this_chid);if(!d&&p.prompt_order&&p.prompt_order.length>0&&(d=p.prompt_order[p.prompt_order.length-1]),!d)return console.warn(`No prompt order found for preset: ${o}. Using current preset.`),M.push(`No prompt order found for preset: ${o}. Using current preset.`),r(),{result:c.getMessages(),warnings:M};const j=z&&p.scenario_format?n.substituteParams(p.scenario_format):"",D=q&&p.personality_format?n.substituteParams(p.personality_format):"",bt=n.substituteParams(p.group_nudge_prompt),vt=p.impersonation_prompt?n.substituteParams(p.impersonation_prompt):"",_=[];Q||_.push({role:"system",content:s.st_formatWorldInfo(I,{wiFormat:p.wi_format}),identifier:"worldInfoBefore"},{role:"system",content:s.st_formatWorldInfo(N,{wiFormat:p.wi_format}),identifier:"worldInfoAfter"}),P||_.push({role:"system",content:$,identifier:"charDescription"},{role:"system",content:D,identifier:"charPersonality"},{role:"system",content:j,identifier:"scenario"}),_.push({role:"system",content:vt,identifier:"impersonate"},{role:"system",content:bt,identifier:"groupNudge"});const R=n.extensionPrompts["1_memory"];R&&R.value&&_.push({role:s.st_getPromptRole(R.role),content:R.value,identifier:"summary",position:s.st_getPromptPosition(R.position)});const S=n.extensionPrompts["2_floating_prompt"];!v&&S&&S.value&&_.push({role:s.st_getPromptRole(S.role),content:S.value,identifier:"authorsNote",position:s.st_getPromptPosition(S.position)});const B=n.extensionPrompts["3_vectors"];B&&B.value&&_.push({role:"system",content:B.value,identifier:"vectorsMemory",position:s.st_getPromptPosition(B.position)});const O=n.extensionPrompts["4_vectors_data_bank"];O&&O.value&&_.push({role:s.st_getPromptRole(O.role),content:O.value,identifier:"vectorsDataBank",position:s.st_getPromptPosition(O.position)});const F=n.extensionPrompts.chromadb;F&&F.value&&_.push({role:"system",content:F.value,identifier:"smartContext",position:s.st_getPromptPosition(F.position)}),!P&&n.powerUserSettings.persona_description&&n.powerUserSettings.persona_description_position===_t.persona_description_positions.IN_PROMPT&&_.push({role:"system",content:n.powerUserSettings.persona_description,identifier:"personaDescription"}),d.order.forEach(h=>{if(!h.enabled)return;const T=t(h.identifier);if(T&&T.content){c.add({role:T.role??"system",content:n.substituteParams(T.content)});return}h.identifier==="chatHistory"&&Y()})}const wt=["1_memory","2_floating_prompt","3_vectors","4_vectors_data_bank","chromadb","PERSONA_DESCRIPTION","QUIET_PROMPT","DEPTH_PROMPT"];for(const t in n.extensionPrompts)if(Object.hasOwn(n.extensionPrompts,t)){const e=n.extensionPrompts[t];if(wt.includes(t)||!n.extensionPrompts[t].value||![a.extension_prompt_types.BEFORE_PROMPT,a.extension_prompt_types.IN_PROMPT].includes(e.position)||typeof e.filter=="function"&&!await e.filter())continue;const r={role:s.st_getPromptRole(e.role)??"system",content:e.value};if(e.position===a.extension_prompt_types.BEFORE_PROMPT)c.insert(e.depth,r);else if(e.position===a.extension_prompt_types.IN_PROMPT){const p=c.getMessages();c.insert(p.length-e.depth,r)}}for(const t of kt){const e=c.getMessages();c.insert(e.length-t.depth,{role:s.st_getPromptRole(t.role),content:t.entries.join(`
4
- `)})}if(!P){const t=s.st_getGroupDepthPrompts(ht.selected_group,Number(a.this_chid));if(ht.selected_group&&Array.isArray(t)&&t.length>0)t.filter(e=>e.text).forEach((e,l)=>{const r=c.getMessages();c.insert(r.length-e.depth,{role:e.role,content:e.text})});else{const e=s.st_baseChatReplace((pt=(at=(it=(rt=(st=n.characters[a.this_chid])==null?void 0:st.data)==null?void 0:rt.extensions)==null?void 0:it.depth_prompt)==null?void 0:at.prompt)==null?void 0:pt.trim(),a.name1,a.name2)||"";if(e){const l=a.depth_prompt_depth_default,r=((mt=(ut=(lt=(ct=n.characters[a.this_chid])==null?void 0:ct.data)==null?void 0:lt.extensions)==null?void 0:ut.depth_prompt)==null?void 0:mt.role)??a.depth_prompt_role_default,p=c.getMessages();c.insert(p.length-l,{role:s.st_getPromptRole(r),content:e})}}}let C=-1;if(!v){const t=s.st_getAuthorNote();if(t.prompt){t.prompt=s.st_baseChatReplace(t.prompt,a.name1,a.name2);const e={role:s.st_getPromptRole(t.role),content:t.prompt};switch(t.position){case a.extension_prompt_types.IN_PROMPT:c.insert(1,e),C=1;break;case a.extension_prompt_types.IN_CHAT:C=c.getMessages().length-t.depth,c.insert(C,e);break;case a.extension_prompt_types.BEFORE_PROMPT:c.addFront(e),C=0;break}}}return C>=0&&(V.length>0&&(c.insert(C,{role:"system",content:V.join(`
5
- `)}),C++),X.length>0&&c.insert(C+1,{role:"system",content:X.join(`
6
- `)})),{result:c.getMessages(),warnings:M}}exports.buildPrompt=At;
3
+ ${e.extra.title}`),{...e,mes:_,index:t}}));const Te=b.map(e=>_e.world_info_include_names?`${e.name}: ${e.mes}`:e.mes).reverse(),{worldInfoString:Ie,worldInfoBefore:N,worldInfoAfter:j,worldInfoExamples:ke,worldInfoDepth:we,anBefore:X,anAfter:Y}=J?{worldInfoString:"",worldInfoBefore:"",worldInfoAfter:"",worldInfoExamples:[],worldInfoDepth:[],anBefore:[],anAfter:[]}:await s.getWorldInfoPrompt(Te,G,!1);for(const e of ke){const t=e.content;if(t.length===0)continue;const l=n.st_baseChatReplace(t,a.name1,a.name2),i=n.st_parseMesExamples(l,W);e.position===_e.wi_anchor_position.before?M.unshift(...i):M.push(...i)}function Z(){const e=[];for(let t=b.length-1;t>=0;t--){const l=b[t],i=l.name==="System"&&!l.is_user?"system":l.is_user?"user":"assistant";e.unshift({role:i,content:d&&i!="system"?`${l.name}: ${l.mes}`:l.mes,source:l})}c.addMany(e)}if(u==="textgenerationwebui"){const e=[...M];M&&(M=n.st_formatInstructModeExamples(M,a.name1,a.name2));const t=(te=s.getPresetManager("sysprompt"))==null?void 0:te.getCompletionPresetByName(v);t&&(x=s.powerUserSettings.prefer_character_prompt&&x?x:n.st_baseChatReplace(t.content,a.name1,a.name2),x=W?n.st_formatInstructModeSystemPrompt(s.substituteParams(x,a.name1,a.name2,t.content),R):x);const l={description:F,personality:$,persona:s.powerUserSettings.persona_description_position==he.persona_description_positions.IN_PROMPT?K:"",scenario:H,system:x,char:a.name2,user:a.name1,wiBefore:N,wiAfter:j,loreBefore:N,loreAfter:j,mesExamples:M.join(""),mesExamplesRaw:e.join("")},i=(oe=s.getPresetManager("context"))==null?void 0:oe.getCompletionPresetByName(g);let p=n.st_renderStoryString(l,{customInstructSettings:R,customStoryString:i==null?void 0:i.story_string});p&&c.add({role:"system",content:p,ignoreInstruct:!0}),Z()}else{let e=function(P){const k=h.find(Q=>Q.identifier===P);if(k)return k;const ge=p.prompts.find(Q=>Q.identifier===P);if(ge)return ge},t=n.st_setOpenAIMessages(b),l=n.st_setOpenAIMessageExamples(M);async function i(){let[P,k]=await n.st_prepareOpenAIMessages({name2:a.name2,charDescription:F,charPersonality:$,Scenario:H,worldInfoBefore:N,worldInfoAfter:j,extensionPrompts:s.extensionPrompts,bias:"",type:"normal",quietPrompt:void 0,quietImage:void 0,cyclePrompt:"",systemPromptOverride:x,jailbreakPromptOverride:xe,personaDescription:K,messages:t,messageExamples:l},!1);c.addMany(P)}if(!o)return C.push("No preset name provided. Using default preset."),await i(),{result:c.getMessages(),warnings:C};const p=(se=s.getPresetManager("openai"))==null?void 0:se.getCompletionPresetByName(o);if(!p)return console.warn(`Preset not found: ${o}. Using current preset.`),C.push(`Preset not found: ${o}. Using current preset.`),i(),{result:c.getMessages(),warnings:C};let _=(ne=p.prompt_order)==null?void 0:ne.find(P=>P.character_id===a.this_chid);if(!_&&p.prompt_order&&p.prompt_order.length>0&&(_=p.prompt_order[p.prompt_order.length-1]),!_)return console.warn(`No prompt order found for preset: ${o}. Using current preset.`),C.push(`No prompt order found for preset: ${o}. Using current preset.`),i(),{result:c.getMessages(),warnings:C};const z=H&&p.scenario_format?s.substituteParams(p.scenario_format):"",D=$&&p.personality_format?s.substituteParams(p.personality_format):"",ve=s.substituteParams(p.group_nudge_prompt),Ee=p.impersonation_prompt?s.substituteParams(p.impersonation_prompt):"",h=[];J||h.push({role:"system",content:n.st_formatWorldInfo(N,{wiFormat:p.wi_format}),identifier:"worldInfoBefore"},{role:"system",content:n.st_formatWorldInfo(j,{wiFormat:p.wi_format}),identifier:"worldInfoAfter"}),y||h.push({role:"system",content:F,identifier:"charDescription"},{role:"system",content:D,identifier:"charPersonality"},{role:"system",content:z,identifier:"scenario"}),h.push({role:"system",content:Ee,identifier:"impersonate"},{role:"system",content:ve,identifier:"groupNudge"});const S=s.extensionPrompts["1_memory"];S&&S.value&&h.push({role:n.st_getPromptRole(S.role),content:S.value,identifier:"summary",position:n.st_getPromptPosition(S.position)});const O=s.extensionPrompts["2_floating_prompt"];!E&&O&&O.value&&h.push({role:n.st_getPromptRole(O.role),content:O.value,identifier:"authorsNote",position:n.st_getPromptPosition(O.position)});const q=s.extensionPrompts["3_vectors"];q&&q.value&&h.push({role:"system",content:q.value,identifier:"vectorsMemory",position:n.st_getPromptPosition(q.position)});const A=s.extensionPrompts["4_vectors_data_bank"];A&&A.value&&h.push({role:n.st_getPromptRole(A.role),content:A.value,identifier:"vectorsDataBank",position:n.st_getPromptPosition(A.position)});const B=s.extensionPrompts.chromadb;B&&B.value&&h.push({role:"system",content:B.value,identifier:"smartContext",position:n.st_getPromptPosition(B.position)}),!y&&s.powerUserSettings.persona_description&&s.powerUserSettings.persona_description_position===he.persona_description_positions.IN_PROMPT&&h.push({role:"system",content:s.powerUserSettings.persona_description,identifier:"personaDescription"}),_.order.forEach(P=>{if(!P.enabled)return;const k=e(P.identifier);if(k&&k.content){c.add({role:k.role??"system",content:s.substituteParams(k.content)});return}P.identifier==="chatHistory"&&Z()})}const be=["1_memory","2_floating_prompt","3_vectors","4_vectors_data_bank","chromadb","PERSONA_DESCRIPTION","QUIET_PROMPT","DEPTH_PROMPT"];for(const e in s.extensionPrompts)if(Object.hasOwn(s.extensionPrompts,e)){const t=s.extensionPrompts[e];if(be.includes(e)||!s.extensionPrompts[e].value||![a.extension_prompt_types.BEFORE_PROMPT,a.extension_prompt_types.IN_PROMPT].includes(t.position)||typeof t.filter=="function"&&!await t.filter())continue;const i={role:n.st_getPromptRole(t.role)??"system",content:t.value};if(t.position===a.extension_prompt_types.BEFORE_PROMPT)c.insert(t.depth,i);else if(t.position===a.extension_prompt_types.IN_PROMPT){const p=c.getMessages();c.insert(p.length-t.depth,i)}}for(const e of we){const t=c.getMessages();c.insert(t.length-e.depth,{role:n.st_getPromptRole(e.role),content:e.entries.join(`
4
+ `)})}if(!y){const e=n.st_getGroupDepthPrompts(Pe.selected_group,Number(a.this_chid));if(Pe.selected_group&&Array.isArray(e)&&e.length>0)e.filter(t=>t.text).forEach((t,l)=>{const i=c.getMessages();c.insert(i.length-t.depth,{role:t.role,content:t.text})});else{const t=n.st_baseChatReplace((ce=(pe=(ae=(ie=(re=s.characters[a.this_chid])==null?void 0:re.data)==null?void 0:ie.extensions)==null?void 0:ae.depth_prompt)==null?void 0:pe.prompt)==null?void 0:ce.trim(),a.name1,a.name2)||"";if(t){const l=a.depth_prompt_depth_default,i=((fe=(ue=(me=(le=s.characters[a.this_chid])==null?void 0:le.data)==null?void 0:me.extensions)==null?void 0:ue.depth_prompt)==null?void 0:fe.role)??a.depth_prompt_role_default,p=c.getMessages();c.insert(p.length-l,{role:n.st_getPromptRole(i),content:t})}}}let T=-1;if(!E){const e=n.st_getAuthorNote();if(e.prompt){e.prompt=n.st_baseChatReplace(e.prompt,a.name1,a.name2);const t={role:n.st_getPromptRole(e.role),content:e.prompt};switch(e.position){case a.extension_prompt_types.IN_PROMPT:c.insert(1,t),T=1;break;case a.extension_prompt_types.IN_CHAT:T=c.getMessages().length-e.depth,c.insert(T,t);break;case a.extension_prompt_types.BEFORE_PROMPT:c.addFront(t),T=0;break}}}return T>=0&&(X.length>0&&(c.insert(T,{role:"system",content:X.join(`
5
+ `)}),T++),Y.length>0&&c.insert(T+1,{role:"system",content:Y.join(`
6
+ `)})),{result:c.getMessages(),warnings:C}}exports.buildPrompt=Ue;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMtE,MAAM,WAAW,OAAQ,SAAQ,qBAAqB;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,qBAAqB,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAmGD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,EACE,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAE,kBAAuB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsgBrD"}
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,OAAQ,SAAQ,qBAAqB;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,qBAAqB,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AA0GD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,EACE,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAE,kBAAuB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsgBrD"}
@@ -1,80 +1,88 @@
1
- var It = Object.defineProperty;
2
- var Dt = (l, s, o) => s in l ? It(l, s, { enumerable: !0, configurable: !0, writable: !0, value: o }) : l[s] = o;
3
- var U = (l, s, o) => Dt(l, typeof s != "symbol" ? s + "" : s, o);
4
- import { st_parseMesExamples as xt, st_getRegexedString as Bt, st_appendFileContent as Ft, st_baseChatReplace as q, st_formatInstructModeExamples as $t, st_formatInstructModeSystemPrompt as jt, st_renderStoryString as zt, st_setOpenAIMessages as Ht, st_setOpenAIMessageExamples as qt, st_formatWorldInfo as Mt, st_getPromptPosition as I, st_getPromptRole as w, st_getGroupDepthPrompts as Wt, st_getAuthorNote as Gt, st_getMaxContextSize as X, st_prepareOpenAIMessages as Qt } from "./config.js";
5
- import { Tokenizer as Jt } from "./tokenizer.js";
6
- import { regex_placement as Tt } from "../../../regex/engine.js";
7
- import { world_info_include_names as Kt, wi_anchor_position as Lt } from "../../../../world-info.js";
8
- import { name1 as b, name2 as T, this_chid as W, extension_prompt_types as v, depth_prompt_role_default as Vt, depth_prompt_depth_default as Xt } from "../../../../../script.js";
9
- import { persona_description_positions as Ct } from "../../../../power-user.js";
10
- import { selected_group as kt } from "../../../../group-chats.js";
11
- class Yt {
12
- constructor(s) {
13
- U(this, "messages", []);
14
- U(this, "tokenizer");
15
- U(this, "maxContext");
16
- U(this, "currentTokenCount", 0);
17
- this.tokenizer = new Jt(), this.maxContext = s;
1
+ var Dt = Object.defineProperty;
2
+ var zt = (l, n, o) => n in l ? Dt(l, n, { enumerable: !0, configurable: !0, writable: !0, value: o }) : l[n] = o;
3
+ var I = (l, n, o) => zt(l, typeof n != "symbol" ? n + "" : n, o);
4
+ import { st_parseMesExamples as Mt, st_getRegexedString as Bt, st_appendFileContent as Ft, st_baseChatReplace as q, st_formatInstructModeExamples as $t, st_formatInstructModeSystemPrompt as jt, st_renderStoryString as Ht, st_setOpenAIMessages as qt, st_setOpenAIMessageExamples as Wt, st_formatWorldInfo as Tt, st_getPromptPosition as D, st_getPromptRole as b, st_getGroupDepthPrompts as Gt, st_getAuthorNote as Qt, st_getMaxContextSize as X, st_prepareOpenAIMessages as Jt } from "./config.js";
5
+ import { Tokenizer as Kt } from "./tokenizer.js";
6
+ import { getMessageText as Lt, sanitizePromptMessage as Y, sanitizePromptMessages as Vt } from "./prompt-message-utils.js";
7
+ import { regex_placement as Ct } from "../../../regex/engine.js";
8
+ import { world_info_include_names as Xt, wi_anchor_position as Yt } from "../../../../world-info.js";
9
+ import { name1 as v, name2 as C, this_chid as W, extension_prompt_types as E, depth_prompt_role_default as Zt, depth_prompt_depth_default as te } from "../../../../../script.js";
10
+ import { persona_description_positions as kt } from "../../../../power-user.js";
11
+ import { selected_group as wt } from "../../../../group-chats.js";
12
+ class ee {
13
+ constructor(n) {
14
+ I(this, "messages", []);
15
+ I(this, "tokenizer");
16
+ I(this, "maxContext");
17
+ I(this, "currentTokenCount", 0);
18
+ this.tokenizer = new Kt(), this.maxContext = n;
18
19
  }
19
- getTokenCount(s) {
20
- var o, m;
21
- return s.content ? ((m = (o = s.source) == null ? void 0 : o.extra) == null ? void 0 : m.token_count) ?? this.tokenizer.encode(s.content).length : 0;
20
+ getTokenCount(n) {
21
+ var c, m;
22
+ const o = Lt(n);
23
+ return o ? ((m = (c = n.source) == null ? void 0 : c.extra) == null ? void 0 : m.token_count) ?? this.tokenizer.encode(o).length : 0;
22
24
  }
23
- canFit(s) {
24
- return this.currentTokenCount + this.getTokenCount(s) <= this.maxContext;
25
+ canFit(n) {
26
+ return this.currentTokenCount + this.getTokenCount(n) <= this.maxContext;
25
27
  }
26
- add(s) {
27
- if (!s.content) return !0;
28
- const o = this.getTokenCount(s);
29
- return this.currentTokenCount + o > this.maxContext ? !1 : (this.messages.push(s), this.currentTokenCount += o, !0);
28
+ add(n) {
29
+ const o = Y(n);
30
+ if (!o) return !0;
31
+ n = o;
32
+ const c = this.getTokenCount(n);
33
+ return this.currentTokenCount + c > this.maxContext ? !1 : (this.messages.push(n), this.currentTokenCount += c, !0);
30
34
  }
31
- addFront(s) {
32
- if (!s.content) return !0;
33
- const o = this.getTokenCount(s);
34
- return this.currentTokenCount + o > this.maxContext ? !1 : (this.messages.unshift(s), this.currentTokenCount += o, !0);
35
+ addFront(n) {
36
+ const o = Y(n);
37
+ if (!o) return !0;
38
+ n = o;
39
+ const c = this.getTokenCount(n);
40
+ return this.currentTokenCount + c > this.maxContext ? !1 : (this.messages.unshift(n), this.currentTokenCount += c, !0);
35
41
  }
36
- addMany(s) {
37
- const o = s.filter((c) => c.content), m = o.map((c) => this.getTokenCount(c)), D = m.reduce((c, h) => c + h, 0);
38
- if (this.currentTokenCount + D <= this.maxContext)
39
- return this.messages.push(...o), this.currentTokenCount += D, !0;
40
- let E = 0;
42
+ addMany(n) {
43
+ const o = Vt(n), c = o.map((f) => this.getTokenCount(f)), m = c.reduce((f, _) => f + _, 0);
44
+ if (this.currentTokenCount + m <= this.maxContext)
45
+ return this.messages.push(...o), this.currentTokenCount += m, !0;
46
+ let O = 0;
41
47
  const u = [];
42
- for (let c = o.length - 1; c >= 0; c--) {
43
- const h = o[c], O = m[c];
44
- if (this.currentTokenCount + E + O <= this.maxContext)
45
- u.unshift(h), E += O;
48
+ for (let f = o.length - 1; f >= 0; f--) {
49
+ const _ = o[f], S = c[f];
50
+ if (this.currentTokenCount + O + S <= this.maxContext)
51
+ u.unshift(_), O += S;
46
52
  else
47
53
  break;
48
54
  }
49
- return u.length > 0 && (this.messages.push(...u), this.currentTokenCount += E), u.length === o.length;
55
+ return u.length > 0 && (this.messages.push(...u), this.currentTokenCount += O), u.length === o.length;
50
56
  }
51
- insert(s, o) {
52
- if (!o.content) return !0;
57
+ insert(n, o) {
58
+ const c = Y(o);
59
+ if (!c) return !0;
60
+ o = c;
53
61
  const m = this.getTokenCount(o);
54
- return this.currentTokenCount + m > this.maxContext ? !1 : (this.messages.splice(s, 0, o), this.currentTokenCount += m, !0);
62
+ return this.currentTokenCount + m > this.maxContext ? !1 : (this.messages.splice(n, 0, o), this.currentTokenCount += m, !0);
55
63
  }
56
64
  getMessages() {
57
65
  return this.messages;
58
66
  }
59
67
  }
60
- async function ce(l, {
61
- targetCharacterId: s,
68
+ async function fe(l, {
69
+ targetCharacterId: n,
62
70
  presetName: o,
63
- instructName: m,
64
- contextName: D,
65
- syspromptName: E,
71
+ instructName: c,
72
+ contextName: m,
73
+ syspromptName: O,
66
74
  maxContext: u,
67
- includeNames: c,
68
- ignoreCharacterFields: h,
69
- ignoreAuthorNote: O,
70
- ignoreWorldInfo: Y,
71
- messageIndexesBetween: C
75
+ includeNames: f,
76
+ ignoreCharacterFields: _,
77
+ ignoreAuthorNote: S,
78
+ ignoreWorldInfo: Z,
79
+ messageIndexesBetween: k
72
80
  } = {}) {
73
- var st, it, at, pt, ct, lt, ut, mt, ft, dt, gt, ht, _t, Pt;
81
+ var it, at, pt, ct, lt, ut, mt, ft, dt, gt, ht, _t, Pt, yt;
74
82
  if (!["textgenerationwebui", "openai"].includes(l))
75
83
  throw new Error("Unsupported API");
76
- const n = SillyTavern.getContext();
77
- let { description: G, personality: Q, persona: Z, scenario: J, mesExamples: wt, system: _, jailbreak: bt } = h ? {
84
+ const s = SillyTavern.getContext();
85
+ let { description: G, personality: Q, persona: tt, scenario: J, mesExamples: bt, system: P, jailbreak: vt } = _ ? {
78
86
  description: "",
79
87
  personality: "",
80
88
  persona: "",
@@ -82,12 +90,12 @@ async function ce(l, {
82
90
  mesExamples: "",
83
91
  system: "",
84
92
  jailbreak: ""
85
- } : n.getCharacterCardFields({
86
- chid: s
93
+ } : s.getCharacterCardFields({
94
+ chid: n
87
95
  });
88
- const S = l === "textgenerationwebui" ? (st = n.getPresetManager("instruct")) == null ? void 0 : st.getCompletionPresetByName(m) : void 0, K = !!(S != null && S.enabled);
89
- let P = xt(wt, K);
90
- function vt() {
96
+ const A = l === "textgenerationwebui" ? (it = s.getPresetManager("instruct")) == null ? void 0 : it.getCompletionPresetByName(c) : void 0, K = !!(A != null && A.enabled);
97
+ let y = Mt(bt, K);
98
+ function Et() {
91
99
  var e, p;
92
100
  if (typeof u == "number")
93
101
  return u;
@@ -99,37 +107,37 @@ async function ce(l, {
99
107
  return u;
100
108
  let t;
101
109
  if (l === "textgenerationwebui") {
102
- const r = (e = n.getPresetManager("textgenerationwebui")) == null ? void 0 : e.getCompletionPresetByName(o);
110
+ const r = (e = s.getPresetManager("textgenerationwebui")) == null ? void 0 : e.getCompletionPresetByName(o);
103
111
  t = r == null ? void 0 : r.max_length;
104
112
  } else {
105
- const r = (p = n.getPresetManager("openai")) == null ? void 0 : p.getCompletionPresetByName(o);
113
+ const r = (p = s.getPresetManager("openai")) == null ? void 0 : p.getCompletionPresetByName(o);
106
114
  t = r == null ? void 0 : r.openai_max_context;
107
115
  }
108
116
  return typeof t == "number" ? t : X();
109
117
  }
110
- let y = [];
111
- const L = vt();
118
+ let x = [];
119
+ const L = Et();
112
120
  if (L <= 0)
113
- return { result: [], warnings: y };
114
- const a = new Yt(L), Et = n.ToolManager.isToolCallingSupported(), tt = (C == null ? void 0 : C.start) ?? 0, et = C != null && C.end ? C.end + 1 : void 0;
115
- let k = tt === -1 && et === 0 ? [] : n.chat.slice(tt, et).filter((t) => {
121
+ return { result: [], warnings: x };
122
+ const a = new ee(L), Ot = s.ToolManager.isToolCallingSupported(), et = (k == null ? void 0 : k.start) ?? 0, ot = k != null && k.end ? k.end + 1 : void 0;
123
+ let w = et === -1 && ot === 0 ? [] : s.chat.slice(et, ot).filter((t) => {
116
124
  var e;
117
- return !t.is_system || Et && Array.isArray((e = t.extra) == null ? void 0 : e.tool_invocations);
125
+ return !t.is_system || Ot && Array.isArray((e = t.extra) == null ? void 0 : e.tool_invocations);
118
126
  });
119
- k = await Promise.all(
120
- k.map(async (t, e) => {
121
- var $, j;
122
- let p = t.mes, r = t.is_user ? Tt.USER_INPUT : Tt.AI_OUTPUT, i = { isPrompt: !0, depth: k.length - e - 1 }, f = Bt(p, r, i);
123
- return f = await Ft(t, f), ($ = t == null ? void 0 : t.extra) != null && $.append_title && ((j = t == null ? void 0 : t.extra) != null && j.title) && (f = `${f}
127
+ w = await Promise.all(
128
+ w.map(async (t, e) => {
129
+ var F, $;
130
+ let p = t.mes, r = t.is_user ? Ct.USER_INPUT : Ct.AI_OUTPUT, i = { isPrompt: !0, depth: w.length - e - 1 }, d = Bt(p, r, i);
131
+ return d = await Ft(t, d), (F = t == null ? void 0 : t.extra) != null && F.append_title && (($ = t == null ? void 0 : t.extra) != null && $.title) && (d = `${d}
124
132
 
125
133
  ${t.extra.title}`), {
126
134
  ...t,
127
- mes: f,
135
+ mes: d,
128
136
  index: e
129
137
  };
130
138
  })
131
139
  );
132
- const Ot = k.map((t) => Kt ? `${t.name}: ${t.mes}` : t.mes).reverse(), { worldInfoString: Zt, worldInfoBefore: B, worldInfoAfter: F, worldInfoExamples: St, worldInfoDepth: At, anBefore: ot, anAfter: nt } = Y ? {
140
+ const St = w.map((t) => Xt ? `${t.name}: ${t.mes}` : t.mes).reverse(), { worldInfoString: oe, worldInfoBefore: z, worldInfoAfter: B, worldInfoExamples: At, worldInfoDepth: Rt, anBefore: st, anAfter: nt } = Z ? {
133
141
  worldInfoString: "",
134
142
  worldInfoBefore: "",
135
143
  worldInfoAfter: "",
@@ -137,169 +145,169 @@ ${t.extra.title}`), {
137
145
  worldInfoDepth: [],
138
146
  anBefore: [],
139
147
  anAfter: []
140
- } : await n.getWorldInfoPrompt(Ot, L, !1);
141
- for (const t of St) {
148
+ } : await s.getWorldInfoPrompt(St, L, !1);
149
+ for (const t of At) {
142
150
  const e = t.content;
143
151
  if (e.length === 0)
144
152
  continue;
145
- const p = q(e, b, T), r = xt(p, K);
146
- t.position === Lt.before ? P.unshift(...r) : P.push(...r);
153
+ const p = q(e, v, C), r = Mt(p, K);
154
+ t.position === Yt.before ? y.unshift(...r) : y.push(...r);
147
155
  }
148
156
  function rt() {
149
157
  const t = [];
150
- for (let e = k.length - 1; e >= 0; e--) {
151
- const p = k[e], r = p.name === "System" && !p.is_user ? "system" : p.is_user ? "user" : "assistant";
158
+ for (let e = w.length - 1; e >= 0; e--) {
159
+ const p = w[e], r = p.name === "System" && !p.is_user ? "system" : p.is_user ? "user" : "assistant";
152
160
  t.unshift({
153
161
  role: r,
154
- content: c && r != "system" ? `${p.name}: ${p.mes}` : p.mes,
162
+ content: f && r != "system" ? `${p.name}: ${p.mes}` : p.mes,
155
163
  source: p
156
164
  });
157
165
  }
158
166
  a.addMany(t);
159
167
  }
160
168
  if (l === "textgenerationwebui") {
161
- const t = [...P];
162
- P && (P = $t(P, b, T));
163
- const e = (it = n.getPresetManager("sysprompt")) == null ? void 0 : it.getCompletionPresetByName(E);
164
- e && (_ = n.powerUserSettings.prefer_character_prompt && _ ? _ : q(e.content, b, T), _ = K ? jt(
165
- n.substituteParams(_, b, T, e.content),
166
- S
167
- ) : _);
169
+ const t = [...y];
170
+ y && (y = $t(y, v, C));
171
+ const e = (at = s.getPresetManager("sysprompt")) == null ? void 0 : at.getCompletionPresetByName(O);
172
+ e && (P = s.powerUserSettings.prefer_character_prompt && P ? P : q(e.content, v, C), P = K ? jt(
173
+ s.substituteParams(P, v, C, e.content),
174
+ A
175
+ ) : P);
168
176
  const p = {
169
177
  description: G,
170
178
  personality: Q,
171
- persona: n.powerUserSettings.persona_description_position == Ct.IN_PROMPT ? Z : "",
179
+ persona: s.powerUserSettings.persona_description_position == kt.IN_PROMPT ? tt : "",
172
180
  scenario: J,
173
- system: _,
174
- char: T,
175
- user: b,
176
- wiBefore: B,
177
- wiAfter: F,
178
- loreBefore: B,
179
- loreAfter: F,
180
- mesExamples: P.join(""),
181
+ system: P,
182
+ char: C,
183
+ user: v,
184
+ wiBefore: z,
185
+ wiAfter: B,
186
+ loreBefore: z,
187
+ loreAfter: B,
188
+ mesExamples: y.join(""),
181
189
  mesExamplesRaw: t.join("")
182
- }, r = (at = n.getPresetManager("context")) == null ? void 0 : at.getCompletionPresetByName(D);
183
- let i = zt(p, {
184
- customInstructSettings: S,
190
+ }, r = (pt = s.getPresetManager("context")) == null ? void 0 : pt.getCompletionPresetByName(m);
191
+ let i = Ht(p, {
192
+ customInstructSettings: A,
185
193
  customStoryString: r == null ? void 0 : r.story_string
186
194
  });
187
195
  i && a.add({ role: "system", content: i, ignoreInstruct: !0 }), rt();
188
196
  } else {
189
- let t = function(g) {
190
- const M = d.find((V) => V.identifier === g);
191
- if (M)
192
- return M;
193
- const yt = i.prompts.find((V) => V.identifier === g);
194
- if (yt)
195
- return yt;
196
- }, e = Ht(k), p = qt(P);
197
+ let t = function(h) {
198
+ const T = g.find((V) => V.identifier === h);
199
+ if (T)
200
+ return T;
201
+ const xt = i.prompts.find((V) => V.identifier === h);
202
+ if (xt)
203
+ return xt;
204
+ }, e = qt(w), p = Wt(y);
197
205
  async function r() {
198
- let [g, M] = await Qt(
206
+ let [h, T] = await Jt(
199
207
  {
200
- name2: T,
208
+ name2: C,
201
209
  charDescription: G,
202
210
  charPersonality: Q,
203
211
  Scenario: J,
204
- worldInfoBefore: B,
205
- worldInfoAfter: F,
206
- extensionPrompts: n.extensionPrompts,
212
+ worldInfoBefore: z,
213
+ worldInfoAfter: B,
214
+ extensionPrompts: s.extensionPrompts,
207
215
  bias: "",
208
216
  type: "normal",
209
217
  quietPrompt: void 0,
210
218
  quietImage: void 0,
211
219
  cyclePrompt: "",
212
- systemPromptOverride: _,
213
- jailbreakPromptOverride: bt,
214
- personaDescription: Z,
220
+ systemPromptOverride: P,
221
+ jailbreakPromptOverride: vt,
222
+ personaDescription: tt,
215
223
  messages: e,
216
224
  messageExamples: p
217
225
  },
218
226
  !1
219
227
  );
220
- a.addMany(g);
228
+ a.addMany(h);
221
229
  }
222
230
  if (!o)
223
- return y.push("No preset name provided. Using default preset."), await r(), { result: a.getMessages(), warnings: y };
224
- const i = (pt = n.getPresetManager("openai")) == null ? void 0 : pt.getCompletionPresetByName(o);
231
+ return x.push("No preset name provided. Using default preset."), await r(), { result: a.getMessages(), warnings: x };
232
+ const i = (ct = s.getPresetManager("openai")) == null ? void 0 : ct.getCompletionPresetByName(o);
225
233
  if (!i)
226
- return console.warn(`Preset not found: ${o}. Using current preset.`), y.push(`Preset not found: ${o}. Using current preset.`), r(), { result: a.getMessages(), warnings: y };
227
- let f = (ct = i.prompt_order) == null ? void 0 : ct.find((g) => g.character_id === W);
228
- if (!f && i.prompt_order && i.prompt_order.length > 0 && (f = i.prompt_order[i.prompt_order.length - 1]), !f)
229
- return console.warn(`No prompt order found for preset: ${o}. Using current preset.`), y.push(`No prompt order found for preset: ${o}. Using current preset.`), r(), { result: a.getMessages(), warnings: y };
230
- const $ = J && i.scenario_format ? n.substituteParams(i.scenario_format) : "", j = Q && i.personality_format ? n.substituteParams(i.personality_format) : "", Nt = n.substituteParams(i.group_nudge_prompt), Ut = i.impersonation_prompt ? n.substituteParams(i.impersonation_prompt) : "", d = [];
231
- Y || d.push(
234
+ return console.warn(`Preset not found: ${o}. Using current preset.`), x.push(`Preset not found: ${o}. Using current preset.`), r(), { result: a.getMessages(), warnings: x };
235
+ let d = (lt = i.prompt_order) == null ? void 0 : lt.find((h) => h.character_id === W);
236
+ if (!d && i.prompt_order && i.prompt_order.length > 0 && (d = i.prompt_order[i.prompt_order.length - 1]), !d)
237
+ return console.warn(`No prompt order found for preset: ${o}. Using current preset.`), x.push(`No prompt order found for preset: ${o}. Using current preset.`), r(), { result: a.getMessages(), warnings: x };
238
+ const F = J && i.scenario_format ? s.substituteParams(i.scenario_format) : "", $ = Q && i.personality_format ? s.substituteParams(i.personality_format) : "", Ut = s.substituteParams(i.group_nudge_prompt), It = i.impersonation_prompt ? s.substituteParams(i.impersonation_prompt) : "", g = [];
239
+ Z || g.push(
232
240
  {
233
241
  role: "system",
234
- content: Mt(B, { wiFormat: i.wi_format }),
242
+ content: Tt(z, { wiFormat: i.wi_format }),
235
243
  identifier: "worldInfoBefore"
236
244
  },
237
245
  {
238
246
  role: "system",
239
- content: Mt(F, { wiFormat: i.wi_format }),
247
+ content: Tt(B, { wiFormat: i.wi_format }),
240
248
  identifier: "worldInfoAfter"
241
249
  }
242
- ), h || d.push(
250
+ ), _ || g.push(
243
251
  { role: "system", content: G, identifier: "charDescription" },
244
- { role: "system", content: j, identifier: "charPersonality" },
245
- { role: "system", content: $, identifier: "scenario" }
246
- ), d.push(
247
- { role: "system", content: Ut, identifier: "impersonate" },
248
- { role: "system", content: Nt, identifier: "groupNudge" }
252
+ { role: "system", content: $, identifier: "charPersonality" },
253
+ { role: "system", content: F, identifier: "scenario" }
254
+ ), g.push(
255
+ { role: "system", content: It, identifier: "impersonate" },
256
+ { role: "system", content: Ut, identifier: "groupNudge" }
249
257
  );
250
- const A = n.extensionPrompts["1_memory"];
251
- A && A.value && d.push({
252
- role: w(A.role),
253
- content: A.value,
258
+ const R = s.extensionPrompts["1_memory"];
259
+ R && R.value && g.push({
260
+ role: b(R.role),
261
+ content: R.value,
254
262
  identifier: "summary",
255
- position: I(A.position)
263
+ position: D(R.position)
256
264
  });
257
- const R = n.extensionPrompts["2_floating_prompt"];
258
- !O && R && R.value && d.push({
259
- role: w(R.role),
260
- content: R.value,
265
+ const N = s.extensionPrompts["2_floating_prompt"];
266
+ !S && N && N.value && g.push({
267
+ role: b(N.role),
268
+ content: N.value,
261
269
  identifier: "authorsNote",
262
- position: I(R.position)
270
+ position: D(N.position)
263
271
  });
264
- const z = n.extensionPrompts["3_vectors"];
265
- z && z.value && d.push({
272
+ const j = s.extensionPrompts["3_vectors"];
273
+ j && j.value && g.push({
266
274
  role: "system",
267
- content: z.value,
275
+ content: j.value,
268
276
  identifier: "vectorsMemory",
269
- position: I(z.position)
277
+ position: D(j.position)
270
278
  });
271
- const N = n.extensionPrompts["4_vectors_data_bank"];
272
- N && N.value && d.push({
273
- role: w(N.role),
274
- content: N.value,
279
+ const U = s.extensionPrompts["4_vectors_data_bank"];
280
+ U && U.value && g.push({
281
+ role: b(U.role),
282
+ content: U.value,
275
283
  identifier: "vectorsDataBank",
276
- position: I(N.position)
284
+ position: D(U.position)
277
285
  });
278
- const H = n.extensionPrompts.chromadb;
279
- H && H.value && d.push({
286
+ const H = s.extensionPrompts.chromadb;
287
+ H && H.value && g.push({
280
288
  role: "system",
281
289
  content: H.value,
282
290
  identifier: "smartContext",
283
- position: I(H.position)
284
- }), !h && n.powerUserSettings.persona_description && n.powerUserSettings.persona_description_position === Ct.IN_PROMPT && d.push({
291
+ position: D(H.position)
292
+ }), !_ && s.powerUserSettings.persona_description && s.powerUserSettings.persona_description_position === kt.IN_PROMPT && g.push({
285
293
  role: "system",
286
- content: n.powerUserSettings.persona_description,
294
+ content: s.powerUserSettings.persona_description,
287
295
  identifier: "personaDescription"
288
- }), f.order.forEach((g) => {
289
- if (!g.enabled)
296
+ }), d.order.forEach((h) => {
297
+ if (!h.enabled)
290
298
  return;
291
- const M = t(g.identifier);
292
- if (M && M.content) {
299
+ const T = t(h.identifier);
300
+ if (T && T.content) {
293
301
  a.add({
294
- role: M.role ?? "system",
295
- content: n.substituteParams(M.content)
302
+ role: T.role ?? "system",
303
+ content: s.substituteParams(T.content)
296
304
  });
297
305
  return;
298
306
  }
299
- g.identifier === "chatHistory" && rt();
307
+ h.identifier === "chatHistory" && rt();
300
308
  });
301
309
  }
302
- const Rt = [
310
+ const Nt = [
303
311
  "1_memory",
304
312
  "2_floating_prompt",
305
313
  "3_vectors",
@@ -309,74 +317,74 @@ ${t.extra.title}`), {
309
317
  "QUIET_PROMPT",
310
318
  "DEPTH_PROMPT"
311
319
  ];
312
- for (const t in n.extensionPrompts)
313
- if (Object.hasOwn(n.extensionPrompts, t)) {
314
- const e = n.extensionPrompts[t];
315
- if (Rt.includes(t) || !n.extensionPrompts[t].value || ![v.BEFORE_PROMPT, v.IN_PROMPT].includes(e.position) || typeof e.filter == "function" && !await e.filter()) continue;
320
+ for (const t in s.extensionPrompts)
321
+ if (Object.hasOwn(s.extensionPrompts, t)) {
322
+ const e = s.extensionPrompts[t];
323
+ if (Nt.includes(t) || !s.extensionPrompts[t].value || ![E.BEFORE_PROMPT, E.IN_PROMPT].includes(e.position) || typeof e.filter == "function" && !await e.filter()) continue;
316
324
  const r = {
317
- role: w(e.role) ?? "system",
325
+ role: b(e.role) ?? "system",
318
326
  content: e.value
319
327
  };
320
- if (e.position === v.BEFORE_PROMPT)
328
+ if (e.position === E.BEFORE_PROMPT)
321
329
  a.insert(e.depth, r);
322
- else if (e.position === v.IN_PROMPT) {
330
+ else if (e.position === E.IN_PROMPT) {
323
331
  const i = a.getMessages();
324
332
  a.insert(i.length - e.depth, r);
325
333
  }
326
334
  }
327
- for (const t of At) {
335
+ for (const t of Rt) {
328
336
  const e = a.getMessages();
329
337
  a.insert(e.length - t.depth, {
330
- role: w(t.role),
338
+ role: b(t.role),
331
339
  content: t.entries.join(`
332
340
  `)
333
341
  });
334
342
  }
335
- if (!h) {
336
- const t = Wt(kt, Number(W));
337
- if (kt && Array.isArray(t) && t.length > 0)
343
+ if (!_) {
344
+ const t = Gt(wt, Number(W));
345
+ if (wt && Array.isArray(t) && t.length > 0)
338
346
  t.filter((e) => e.text).forEach((e, p) => {
339
347
  const r = a.getMessages();
340
348
  a.insert(r.length - e.depth, { role: e.role, content: e.text });
341
349
  });
342
350
  else {
343
351
  const e = q(
344
- (dt = (ft = (mt = (ut = (lt = n.characters[W]) == null ? void 0 : lt.data) == null ? void 0 : ut.extensions) == null ? void 0 : mt.depth_prompt) == null ? void 0 : ft.prompt) == null ? void 0 : dt.trim(),
345
- b,
346
- T
352
+ (gt = (dt = (ft = (mt = (ut = s.characters[W]) == null ? void 0 : ut.data) == null ? void 0 : mt.extensions) == null ? void 0 : ft.depth_prompt) == null ? void 0 : dt.prompt) == null ? void 0 : gt.trim(),
353
+ v,
354
+ C
347
355
  ) || "";
348
356
  if (e) {
349
- const p = Xt, r = ((Pt = (_t = (ht = (gt = n.characters[W]) == null ? void 0 : gt.data) == null ? void 0 : ht.extensions) == null ? void 0 : _t.depth_prompt) == null ? void 0 : Pt.role) ?? Vt, i = a.getMessages();
357
+ const p = te, r = ((yt = (Pt = (_t = (ht = s.characters[W]) == null ? void 0 : ht.data) == null ? void 0 : _t.extensions) == null ? void 0 : Pt.depth_prompt) == null ? void 0 : yt.role) ?? Zt, i = a.getMessages();
350
358
  a.insert(i.length - p, {
351
- role: w(r),
359
+ role: b(r),
352
360
  content: e
353
361
  });
354
362
  }
355
363
  }
356
364
  }
357
- let x = -1;
358
- if (!O) {
359
- const t = Gt();
365
+ let M = -1;
366
+ if (!S) {
367
+ const t = Qt();
360
368
  if (t.prompt) {
361
- t.prompt = q(t.prompt, b, T);
362
- const e = { role: w(t.role), content: t.prompt };
369
+ t.prompt = q(t.prompt, v, C);
370
+ const e = { role: b(t.role), content: t.prompt };
363
371
  switch (t.position) {
364
- case v.IN_PROMPT:
365
- a.insert(1, e), x = 1;
372
+ case E.IN_PROMPT:
373
+ a.insert(1, e), M = 1;
366
374
  break;
367
- case v.IN_CHAT:
368
- x = a.getMessages().length - t.depth, a.insert(x, e);
375
+ case E.IN_CHAT:
376
+ M = a.getMessages().length - t.depth, a.insert(M, e);
369
377
  break;
370
- case v.BEFORE_PROMPT:
371
- a.addFront(e), x = 0;
378
+ case E.BEFORE_PROMPT:
379
+ a.addFront(e), M = 0;
372
380
  break;
373
381
  }
374
382
  }
375
383
  }
376
- return x >= 0 && (ot.length > 0 && (a.insert(x, { role: "system", content: ot.join(`
377
- `) }), x++), nt.length > 0 && a.insert(x + 1, { role: "system", content: nt.join(`
378
- `) })), { result: a.getMessages(), warnings: y };
384
+ return M >= 0 && (st.length > 0 && (a.insert(M, { role: "system", content: st.join(`
385
+ `) }), M++), nt.length > 0 && a.insert(M + 1, { role: "system", content: nt.join(`
386
+ `) })), { result: a.getMessages(), warnings: x };
379
387
  }
380
388
  export {
381
- ce as buildPrompt
389
+ fe as buildPrompt
382
390
  };
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function r(e){return typeof e=="string"&&e.trim().length>0}function o(e){const t=e.content;return typeof t=="string"?t:Array.isArray(t)?t.map(n=>n.type==="text"?n.text:"").filter(r).join(`
2
+ `):""}function s(e){const t=e.content;if(typeof t=="string")return r(t)?e:null;if(Array.isArray(t)){const n=t.filter(i=>i.type!=="text"||r(i.text));return n.length>0?{...e,content:n}:null}return null}function u(e){return e.map(t=>s(t)).filter(t=>t!==null)}exports.getMessageText=o;exports.sanitizePromptMessage=s;exports.sanitizePromptMessages=u;
@@ -0,0 +1,6 @@
1
+ import { ChatCompletionMessage } from './types/index.js';
2
+
3
+ export declare function getMessageText(message: ChatCompletionMessage): string;
4
+ export declare function sanitizePromptMessage<T extends ChatCompletionMessage>(message: T): T | null;
5
+ export declare function sanitizePromptMessages<T extends ChatCompletionMessage>(messages: T[]): T[];
6
+ //# sourceMappingURL=prompt-message-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-message-utils.d.ts","sourceRoot":"","sources":["../src/prompt-message-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAYzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAerE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,qBAAqB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAa3F;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAI1F"}
@@ -0,0 +1,26 @@
1
+ function r(n) {
2
+ return typeof n == "string" && n.trim().length > 0;
3
+ }
4
+ function s(n) {
5
+ const t = n.content;
6
+ return typeof t == "string" ? t : Array.isArray(t) ? t.map((e) => e.type === "text" ? e.text : "").filter(r).join(`
7
+ `) : "";
8
+ }
9
+ function o(n) {
10
+ const t = n.content;
11
+ if (typeof t == "string")
12
+ return r(t) ? n : null;
13
+ if (Array.isArray(t)) {
14
+ const e = t.filter((i) => i.type !== "text" || r(i.text));
15
+ return e.length > 0 ? { ...n, content: e } : null;
16
+ }
17
+ return null;
18
+ }
19
+ function u(n) {
20
+ return n.map((t) => o(t)).filter((t) => t !== null);
21
+ }
22
+ export {
23
+ s as getMessageText,
24
+ o as sanitizePromptMessage,
25
+ u as sanitizePromptMessages
26
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sillytavern-utils-lib",
3
- "version": "1.0.65",
3
+ "version": "1.0.66",
4
4
  "description": "Utility library for SillyTavern",
5
5
  "type": "module",
6
6
  "exports": {