added ai vision

This commit is contained in:
Concedo 2024-02-15 10:51:41 +08:00
parent 39f8cbd1f3
commit 1ae0a524ad

View file

@ -6,7 +6,7 @@ It requires no dependencies, installation or setup.
Just copy this single static HTML file anywhere and open it in a browser, or from a webserver.
Please go to https://github.com/LostRuins/lite.koboldai.net for updates on Kobold Lite.
Kobold Lite is under the AGPL v3.0 License unless otherwise exempted. Please do not remove this line.
Current version: 111
Current version: 112
-Concedo
-->
@ -1509,6 +1509,7 @@ Current version: 111
max-height: 120px;
overflow-y: auto;
overflow-x: hidden;
font-size: 12px;
}
.mdlpicker::-webkit-calendar-picker-indicator {
opacity: 100;
@ -3294,6 +3295,8 @@ Current version: 111
const stablehorde_poll_endpoint = stablehorde_url + "/api/v2/generate/check";
const stablehorde_output_endpoint = stablehorde_url + "/api/v2/generate/status";
const stablehorde_model_endpoint = stablehorde_url + "/api/v2/status/models";
const stablehorde_submit_interrogate_endpoint = stablehorde_url + "/api/v2/interrogate/async";
const stablehorde_output_interrogate_endpoint = stablehorde_url + "/api/v2/interrogate/status";
const kobold_custom_gen_endpoint = "/api/v1/generate";
const kobold_custom_gen_stream_endpoint = "/api/extra/generate/stream";
@ -3327,6 +3330,7 @@ Current version: 111
const a1111_models_endpoint = "/sdapi/v1/sd-models";
const a1111_options_endpoint = "/sdapi/v1/options";
const a1111_txt2img_endpoint = "/sdapi/v1/txt2img";
const a1111_interrogate_endpoint = "/sdapi/v1/interrogate";
const xtts_gen_endpoint = "/tts_to_audio/";
const xtts_voices_endpoint = "/speakers_list";
@ -3345,6 +3349,8 @@ Current version: 111
const default_xtts_base = " http://localhost:8020";
const XTTS_ID = 1000;
const HD_RES_PX = 400;
const NO_HD_RES_PX = 256;
//all configurable globals
var perfdata = null; //if it's null, we are not connected
@ -3379,6 +3385,7 @@ Current version: 111
var generateimagesinterval = 650; //if generated images is enabled, it will trigger after every 600 new characters in context.
var nextgeneratedimagemilestone = generateimagesinterval; //used to keep track of when to generate the next image
var image_db = {}; //stores a dictionary of pending images
var interrogation_db = {};
var completed_imgs_meta = {}; //stores temp info on completed images like alt text
//key is ID, body is {done:false,queue:10,result:""}
var stablemodels = [{"name": "stable_diffusion","count": 1}]; //stored as {name,count}
@ -4703,6 +4710,7 @@ Current version: 111
let new_save_storyobj = generate_base_storyobj();
let export_arr = gametext_arr;
let export_hashes = {};
if(!save_images)
{
export_arr = [];
@ -4710,6 +4718,22 @@ Current version: 111
export_arr.push(gametext_arr[i].replace(/\[<\|p\|.+?\|p\|>\]/g, "").replace(/\[<\|d\|.+?\|d\|>\]/g, ""));
}
}
else
{
//bake used image metas into savefile
for (let i = 0; i < gametext_arr.length; ++i) {
let matches = gametext_arr[i].match(/\[<\|d\|.+?\|d\|>\]/g);
for(let m in matches)
{
let inner = matches[m].substring(5, matches[m].length - 5);
let imghash = cyrb_hash(inner);
if (completed_imgs_meta[imghash] != null) {
export_hashes[imghash] = completed_imgs_meta[imghash];
}
}
}
new_save_storyobj.completed_imgs_meta = export_hashes;
}
if (export_arr.length > 0) {
new_save_storyobj.prompt = export_arr[0];
@ -5073,6 +5097,14 @@ Current version: 111
}
}
}
if(storyobj.completed_imgs_meta)
{
for (var key in storyobj.completed_imgs_meta)
{
completed_imgs_meta[key] = storyobj.completed_imgs_meta[key];
}
}
}
//port over old images to the new format
@ -6076,6 +6108,7 @@ Current version: 111
document.getElementById("zoomedimgcontainer").classList.contains("hidden") &&
document.getElementById("groupselectcontainer").classList.contains("hidden") &&
document.getElementById("imagestylecontainer").classList.contains("hidden") &&
document.getElementById("addimgcontainer").classList.contains("hidden") &&
document.getElementById("advancedloadfile").classList.contains("hidden")
);
}
@ -6096,6 +6129,7 @@ Current version: 111
document.getElementById("zoomedimgcontainer").classList.add("hidden");
document.getElementById("groupselectcontainer").classList.add("hidden");
document.getElementById("imagestylecontainer").classList.add("hidden");
document.getElementById("addimgcontainer").classList.add("hidden");
document.getElementById("advancedloadfile").classList.add("hidden");
}
@ -8187,6 +8221,7 @@ Current version: 111
document.getElementById("cht_inp").value = "";
chat_resize_input();
image_db = {};
interrogation_db = {};
completed_imgs_meta = {};
localsettings.adventure_is_action = false;
prev_hl_chunk = null;
@ -8456,29 +8491,6 @@ Current version: 111
show_abort_button(false);
}
var addimgLongPressTimer = null;
function btn_addimg_longpress_start()
{
addimgLongPressTimer = setTimeout(()=>{
popup_manual_image();
}, 2000);
}
function btn_addimg_longpress_end()
{
clearTimeout(addimgLongPressTimer);
}
function popup_manual_image()
{
inputBox("Tip: You can generate images manually by long-pressing the 'Add Img' button.\n\nEnter a prompt to generate an image with.","Generate Image Manually","","Enter a Prompt",()=>{
let userinput = getInputBoxValue();
if(userinput.trim()!="")
{
var sentence = userinput.trim().substring(0, 300);
do_manual_gen_image(sentence);
}
},false);
}
function do_manual_gen_image(sentence)
{
generate_new_image(sentence);
@ -8491,7 +8503,7 @@ Current version: 111
}, 10000);
}
function manual_gen_image() {
function add_img_btn_auto() {
let truncated_context = concat_gametext(true, "");
truncated_context = replace_placeholders(truncated_context);
var tclen = truncated_context.length;
@ -8504,8 +8516,56 @@ Current version: 111
do_manual_gen_image(sentence);
}
}else{
popup_manual_image();
msgbox("Error: Your current story is blank.\nAdd some text, or try generating from custom prompt instead.","Story is Blank")
}
document.getElementById("addimgcontainer").classList.add("hidden");
}
function add_img_btn_custom()
{
inputBox("Enter a custom prompt to generate an image with.","Generate Image Manually","","Enter a Prompt",()=>{
let userinput = getInputBoxValue();
if(userinput.trim()!="")
{
var sentence = userinput.trim().substring(0, 300);
do_manual_gen_image(sentence);
}
},false);
document.getElementById("addimgcontainer").classList.add("hidden");
}
function add_img_btn_upload()
{
let finput = document.getElementById('addimgfileinput');
finput.click();
finput.onchange = (event) => {
if (event.target.files.length > 0 && event.target.files[0]) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = function(img) {
let imgid = "selfuploadimg"+(Math.floor(10000 + Math.random() * 90000)).toString();
let nimgtag = "[<|p|" + imgid + "|p|>]";
gametext_arr.push(nimgtag);
image_db[imgid] = { done: false, queue: "Generating", result: "", prompt:"", local:true };
let imgres = localsettings.img_allowhd?HD_RES_PX:NO_HD_RES_PX;
compressImage(img.target.result, (newDataUri) => {
image_db[imgid].done = true;
image_db[imgid].result = newDataUri;
}, true, true, imgres,0.33,true);
}
reader.readAsDataURL(file);
}
finput.value = "";
};
document.getElementById("addimgcontainer").classList.add("hidden");
}
function add_img_btn_menu()
{
document.getElementById("addimgcontainer").classList.remove("hidden");
}
var xtts_is_connected = false;
@ -8788,7 +8848,7 @@ Current version: 111
}
}
let truncated_context = concat_gametext(true, ""); //no need to truncate if memory is empty
let truncated_context = concat_gametext(true, "","","",false,true); //no need to truncate if memory is empty
truncated_context = truncated_context.replace(/\xA0/g,' '); //replace non breaking space nbsp
//this is a hack since we dont have a proper tokenizer, but we can estimate 1 token per 3 characters
@ -9810,7 +9870,7 @@ Current version: 111
//for now, append the new image directly into the gtarr
let nimgtag = "[<|p|" + data.id + "|p|>]";
gametext_arr.push(nimgtag);
image_db[data.id] = { done: false, queue: "Starting", result: "", alt:sentence, local:false };
image_db[data.id] = { done: false, queue: "Starting", result: "", prompt:sentence, local:false };
console.log("New image queued " + nimgtag);
}
else {
@ -9827,16 +9887,16 @@ Current version: 111
{
let desired_model = document.getElementById("generate_images_local_model").value;
genimg_payload.models = [desired_model];
let imgid = "A111img"+(Math.floor(10000 + Math.random() * 90000)).toString();
let imgid = "A1111img"+(Math.floor(10000 + Math.random() * 90000)).toString();
let nimgtag = "[<|p|" + imgid + "|p|>]";
gametext_arr.push(nimgtag);
image_db[imgid] = { done: false, queue: "Generating", result: "", alt:sentence, local:true };
image_db[imgid] = { done: false, queue: "Generating", result: "", prompt:sentence, local:true };
generate_a1111_image(genimg_payload,(outputimg)=>{
if(outputimg)
{
//console.log(outputimg);
let origImg = "data:image/jpeg;base64," + outputimg;
let imgres = localsettings.img_allowhd?400:256;
let imgres = localsettings.img_allowhd?HD_RES_PX:NO_HD_RES_PX;
compressImage(origImg, (newDataUri) => {
image_db[imgid].done = true;
image_db[imgid].result = newDataUri;
@ -9858,13 +9918,13 @@ Current version: 111
let imgid = "DALLEimg"+(Math.floor(10000 + Math.random() * 90000)).toString();
let nimgtag = "[<|p|" + imgid + "|p|>]";
gametext_arr.push(nimgtag);
image_db[imgid] = { done: false, queue: "Generating", result: "", alt:sentence, local:true };
image_db[imgid] = { done: false, queue: "Generating", result: "", prompt:sentence, local:true };
generate_dalle_image(genimg_payload,(outputimg)=>{
if(outputimg)
{
//console.log(outputimg);
let origImg = "data:image/jpeg;base64," + outputimg;
let imgres = localsettings.img_allowhd?380:256;
let imgres = localsettings.img_allowhd?HD_RES_PX:NO_HD_RES_PX;
compressImage(origImg, (newDataUri) => {
image_db[imgid].done = true;
image_db[imgid].result = newDataUri;
@ -9878,7 +9938,129 @@ Current version: 111
}
}
function click_image(target)
function interrogate_new_image(base64img, imghash)
{
let parts = base64img.split(',');
if (parts.length === 2 && parts[0].startsWith('data:image')) {
base64img = parts[1];
}
if(localsettings.generate_images_mode==2) //a1111
{
let payload = {
"image": base64img,
"model": "clip"
};
let imgid = "A1111interrogate"+(Math.floor(10000 + Math.random() * 90000)).toString();
fetch(localsettings.saved_a1111_url + a1111_interrogate_endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
})
.then(x => x.json())
.then(resp => {
console.log(resp);
if(resp && resp.caption)
{
let caption = resp.caption;
let savedmeta = completed_imgs_meta[imghash];
if(caption && savedmeta)
{
savedmeta.desc = caption;
update_clicked_image(imghash);
}
}
}).catch((error) => {
console.log("Interrogate Error: " + error);
});
}
else
{
//horde
let payload = {
"forms": [
{
"name": "caption"
}
],
"source_image": base64img
};
fetch(stablehorde_submit_interrogate_endpoint, {
method: 'POST', // or 'PUT'
headers: {
'Content-Type': 'application/json',
'Client-Agent': default_client_agent,
'apikey': localsettings.my_api_key,
},
body: JSON.stringify(payload),
})
.then((response) => response.json())
.then((data) => {
console.log('interrogate img result:', data);
if (data.id && data.id != "") {
interrogation_db[data.id] = { done: false, result: "", imghash:imghash, local:false };
console.log("New interrogate queued: " + data.id);
}
else {
//something went wrong. do nothing.
msgbox("Image interrogation failed: " + data.message);
}
})
.catch((error) => {
console.error('Error:', error);
msgbox("Image interrogation error: " + error);
});
}
}
function toggle_ai_vision(imghash)
{
let savedmeta = completed_imgs_meta[imghash];
if(savedmeta)
{
savedmeta.enabled = !savedmeta.enabled;
if(!savedmeta.desc && savedmeta.enabled)
{
//request a new interrogation
var alreadysent = Object.values(interrogation_db).some(item => item.imghash === imghash);
if(!alreadysent)
{
let b64 = document.getElementById("zoomedimg").src;
interrogate_new_image(b64,imghash);
}
}
update_clicked_image(imghash);
}
else
{
console.log("IMG META NOT FOUND!");
}
}
function update_clicked_image(imghash)
{
let savedmeta = completed_imgs_meta[imghash];
if(!savedmeta)
{
document.getElementById("zoomedimgdesc").innerText = "No Saved Data";
}
else
{
let origprompt = (savedmeta.prompt?replaceAll(savedmeta.prompt,"\n"," ") : "No Saved Description");
origprompt = escapeHtml(origprompt);
let visionstatus = (savedmeta.enabled?(savedmeta.desc?`<span class="color_green">Active</span>`:`<span class="color_yellow">Analyzing...</span>`):`<span class="color_red">Inactive</span>`);
let togglebtn = (savedmeta.enabled?`<button type="button" class="bg_red btn btn-primary" style="width: 84px; padding: 2px; margin: 3px; font-size:12px;" onclick="toggle_ai_vision(\'`+imghash+`\')">Disable</button>`:`<button type="button" class="bg_green btn btn-primary" style="width: 84px; padding: 2px; margin: 3px; font-size:12px;" onclick="toggle_ai_vision(\'`+imghash+`\')">👁️ Enable 👁️</button>`);
document.getElementById("zoomedimgdesc").innerHTML = `
AI Vision: `+visionstatus+` <span class="helpicon">?<span class="helptext">This allows the AI to visually recognize this image, to see and react to this image. Uses Horde or Local A1111 for image interrogation if enabled.</span></span>
`+togglebtn+`
<br><button type="button" class="btn btn-primary" style="width: 140px; padding: 2px; margin: 3px; font-size:12px;" onclick="msgbox('`+origprompt+`','Original Prompt')">View Original Prompt</button>
`;
}
}
function click_image(target,imghash)
{
if(target)
{
@ -9890,16 +10072,9 @@ Current version: 111
}
document.getElementById("zoomedimgcontainer").classList.remove("hidden");
document.getElementById("zoomedimg").src = target.src;
let tmpdsc = target.title;
if(tmpdsc && tmpdsc!="")
{
tmpdsc = replaceAll(tmpdsc,"<br>"," ");
document.getElementById("zoomedimgdesc").innerText = tmpdsc;
}
else
{
document.getElementById("zoomedimgdesc").innerText = "No Saved Description";
}
update_clicked_image(imghash);
}
}
function delete_curr_image()
@ -9929,7 +10104,7 @@ Current version: 111
let waittime = "Unavailable";
if (image_db[pend_txt] != null) {
let qq = image_db[pend_txt].queue;
alttxt = image_db[pend_txt].alt?escapeHtml(image_db[pend_txt].alt):"";
alttxt = image_db[pend_txt].prompt?escapeHtml(image_db[pend_txt].prompt):"";
waittime = (qq == 0 ? "Generating" : (qq=="Starting"?qq:"Queue: " + qq));
} else {
console.log("Cannot render " + pend_txt);
@ -9937,11 +10112,11 @@ Current version: 111
return `<div class="`+siclass+reinvertcolor+`" contenteditable="false"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBCYFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2wBDARweHigjKE4rK06kbl1upKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wAARCAEAAQADASIAAhEBAxEB/8QAGQABAQEBAQEAAAAAAAAAAAAAAAEDAgQF/8QAIBABAAIBBQEBAQEAAAAAAAAAAAECEgMRMVKRIWFBof/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABETPENNPT3je3jUHm22HpmInljqUx+xwDgAAAAAAAAAAAAAAAAAAAAAAAAABaxvaIRaztaJB6AAEmN4mFSZ2iZB5wAAAAAAAAAAAAAAAAAAAAAAAAAAAaaeptG1vWrzETMcSD0zMRyx1L5fI4cb7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7rpzNd/HAAAAAAAAAAAAAAAAAAAAAAAAAAAAADTT09/s8Gnp7/Z4agONSmX2OXYDzDbUpl9jliAAAAAAAAAAAAAAAAAAAsVmd9o4KVm0/jeIiI2gHnGupp/2vjIAABpp6e/2TT09/s8NQAAAAHGpTL7HLsB5htqUy+xyxAAAAAAAAAAAAAAAWlZtP4UrNp/G8RFY2gCIiI2hQAZ6mn/a+NAHmaaenv8AZ4dzp1m2/wDjoAAAAAAAABxqUy+xy7AeYbalMvscsQAAAAAAAAAAFpWbT+FKzafxvEREbQBEREbQoAAAAAAAAAAAAAAAAAONSmX2OXYDzDbUpl9jliAAAAAAAtKzafxaVm0/jaIiI2gCIiI2hQAAAAAAAAAAAAAAAAAAAAAcalMvscuwHmG2pTL7HLEAAAAFi0xxMwZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6ZW7T6gC5W7T6kzvyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/Z" width=` + dim + ` height=` + dim + ` style="border-radius: 6%;" title="`+alttxt+`" alt="` + pend_txt + `"><div class=\"loader2\"></div><div class=\"imagelabel\">` + waittime + `</div></div>`;
} else {
let imghash = cyrb_hash(data);
let imghash = cyrb_hash(data).trim();
if (completed_imgs_meta[imghash] != null) {
alttxt = completed_imgs_meta[imghash].alt?escapeHtml(completed_imgs_meta[imghash].alt):"";
alttxt = completed_imgs_meta[imghash].prompt?escapeHtml(completed_imgs_meta[imghash].prompt):"";
}
return `<div class="`+siclass+reinvertcolor+`"><img src="` + data + `" width=` + dim + ` height=` + dim + ` title="`+alttxt+`" style="border-radius: 6%; cursor: pointer;" onclick="return click_image(this);"></div>`;
return `<div class="`+siclass+reinvertcolor+`"><img src="` + data + `" width=` + dim + ` height=` + dim + ` title="`+alttxt+`" style="border-radius: 6%; cursor: pointer;" onclick="return click_image(this,\'`+imghash+`\');"></div>`;
}
}
@ -10158,7 +10333,59 @@ Current version: 111
document.getElementById("lastreq2").innerHTML = lastreq;
}
function poll_interrogation_db()
{
let imagecount = Object.keys(interrogation_db).length;
if (!imagecount) return;
console.log("polling for pending interrogations " + imagecount);
for (let key in interrogation_db) {
let img = interrogation_db[key];
if (img.done == false && !img.local) {
//call check
fetch(stablehorde_output_interrogate_endpoint + "/" + key)
.then(x => x.json())
.then((data) => {
console.log('pollimg result:', data);
if (!data.state || (data.state!="processing" && data.state!="done")) {
msgbox("Pending image interrogation could not complete.");
console.log("removing from interrogation: " + key);
delete interrogation_db[key];
}
else if (data.state == "done") {
//fetch final image
img.done = true;
//save results
if(data.forms && data.forms.length>0 && data.forms[0].result && data.forms[0].result.caption)
{
let caption = data.forms[0].result.caption;
let savedmeta = completed_imgs_meta[img.imghash];
if(caption && savedmeta)
{
savedmeta.desc = caption;
update_clicked_image(img.imghash);
}
}
delete interrogation_db[key];
}
else {
//do nothing
}
})
.catch((error) => {
console.error('Error:', error);
msgbox("Interrogate poll error: " + error);
delete interrogation_db[key];
});
}
}
}
function poll_image_db() {
poll_interrogation_db();
//every time this runs, we loop through our image cache for unfinished images and poll for a response
//console.log("polling for pending images: " + JSON.stringify(image_db));
let imagecount = Object.keys(image_db).length;
@ -10194,7 +10421,7 @@ Current version: 111
img.queue = 0;
let origImg = "data:image/jpeg;base64," + finalimg.generations[0].img;
//console.log("Original image: " + origImg);
let imgres = localsettings.img_allowhd?380:256;
let imgres = localsettings.img_allowhd?HD_RES_PX:NO_HD_RES_PX;
compressImage(origImg, (newDataUri) => { img.result = newDataUri; }, true, true, imgres);
}
})
@ -10233,7 +10460,7 @@ Current version: 111
let newstr = "[<|d|" + img.result + "|d|>]";
console.log("Replacing with Image: " + matchstr);
gametext_arr[i] = gametext_arr[i].replace(matchstr, newstr);
completed_imgs_meta[cyrb_hash(img.result)] = {alt:image_db[key].alt};
completed_imgs_meta[cyrb_hash(img.result)] = {prompt:image_db[key].prompt, desc:"", enabled:false};
delete image_db[key];
}
}
@ -10246,7 +10473,7 @@ Current version: 111
}
}
function compressImage(inputDataUri, onDone, isJpeg=true, fixedSize=true, maxSize=256, quality = 0.33) {
function compressImage(inputDataUri, onDone, isJpeg=true, fixedSize=true, maxSize=NO_HD_RES_PX, quality = 0.33, forceCrop=false) {
let img = document.createElement('img');
let wantedWidth = maxSize;
let wantedHeight = maxSize;
@ -10288,7 +10515,15 @@ Current version: 111
canvas.height = wantedHeight;
// We resize the image with the canvas method
ctx.drawImage(this, 0, 0, wantedWidth, wantedHeight);
if(forceCrop)
{
let minsize = Math.min(origW, origH);
let mx = (origW - minsize) / 2;
let my = (origH - minsize) / 2;
ctx.drawImage(this, mx, my, minsize, minsize, 0, 0, wantedWidth, wantedHeight);
}else{
ctx.drawImage(this, 0, 0, wantedWidth, wantedHeight);
}
var dataURI = "";
if(isJpeg)
@ -10600,7 +10835,10 @@ Current version: 111
gametext_elem.querySelectorAll('div.storyimg,div.storyimgfloat').forEach(
(el) => {
let chimg = el.getElementsByTagName("img")[0];
el.replaceWith((chimg.alt == null || chimg.alt == "") ? ("[<|d|" + chimg.src + "|d|>]") : ("[<|p|" + chimg.alt + "|p|>]"))
if(el && chimg)
{
el.replaceWith((chimg.alt == null || chimg.alt == "") ? ("[<|d|" + chimg.src + "|d|>]") : ("[<|p|" + chimg.alt + "|p|>]"))
}
}
);
@ -10678,7 +10916,7 @@ Current version: 111
}
}
function concat_gametext(stripimg = false, stripimg_replace_str = "", append_before_segment="",append_after_segment="",escapeTxt=false) {
function concat_gametext(stripimg = false, stripimg_replace_str = "", append_before_segment="",append_after_segment="",escapeTxt=false,insertAIVision=false) {
let fulltxt = "";
for (let i = 0; i < gametext_arr.length; ++i) {
let extracted = (gametext_arr[i]);
@ -10729,7 +10967,21 @@ Current version: 111
fulltxt = replaceAll(fulltxt,b,get_instruct_endtag(false));
}
}
if (stripimg) {
if (stripimg)
{
if(insertAIVision)
{
fulltxt = fulltxt.replace(/\[<\|d\|.+?\|d\|>\]/g, function (m) {
// m here means the whole matched string
let inner = m.substring(5, m.length - 5);
let imghash = cyrb_hash(inner);
let foundmeta = completed_imgs_meta[imghash];
if (foundmeta != null && foundmeta.enabled && foundmeta.desc) {
return "\n(Attached Image: " + foundmeta.desc + ")\n";
}
return "";
});
}
fulltxt = fulltxt.replace(/\[<\|p\|.+?\|p\|>\]/g, stripimg_replace_str);
fulltxt = fulltxt.replace(/\[<\|d\|.+?\|d\|>\]/g, stripimg_replace_str);
@ -12274,7 +12526,7 @@ Current version: 111
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].startsWith('```')) {
blocks[i] = blocks[i].replace(/```[\s\S]*?\n([\s\S]*?)```/g,
function (m,m2) {return `</p><pre style='min-width:80%;margin:0px 40px 0px 20px;background-color:${as.code_block_background};color:${as.code_block_foreground}'>${m2.replace(/[“”]/g, "\"")}</pre><p>`});
function (m,m2) {return `</p><pre style='min-width:80%;white-space:pre-wrap;margin:0px 30px 0px 20px;background-color:${as.code_block_background};color:${as.code_block_foreground}'>${m2.replace(/[“”]/g, "\"")}</pre><p>`});
}
else {
blocks[i] = blocks[i].replaceAll('```', '`').replaceAll('``', '`').replace(/`(.*?)`/g, function (m,m2) {return `<code style='background-color:black'>${m2.replace(/[“”]/g, "\"")}</code>`;}); //remove fancy quotes too
@ -12422,7 +12674,7 @@ Current version: 111
<button type="button" class="btn btn-primary" id="btn_actundo" onpointerdown="btn_back_longpress_start()" onpointerleave="btn_back_longpress_end()" onpointerup="btn_back_longpress_end()" onclick="btn_back()">Back</button>
<button type="button" class="btn btn-primary" id="btn_actredo" onpointerdown="btn_redo_longpress_start()" onpointerleave="btn_redo_longpress_end()" onpointerup="btn_redo_longpress_end()" onclick="btn_redo()">Redo</button>
<button type="button" class="btn btn-primary" id="btn_actretry" onclick="btn_retry()">Retry</button>
<button type="button" class="btn btn-primary bg_green" id="btn_genimg" onpointerdown="btn_addimg_longpress_start()" onpointerleave="btn_addimg_longpress_end()" onpointerup="btn_addimg_longpress_end()" onclick="manual_gen_image()">Add Img</button>
<button type="button" class="btn btn-primary bg_green" id="btn_genimg" onclick="add_img_btn_menu()">Add Img</button>
</div>
<div class="box flex flex-push-right">
<input type="checkbox" id="entersubmit" onclick="toggle_entersends()" checked>
@ -12469,7 +12721,7 @@ Current version: 111
<button type="button" class="btn btn-primary" id="btn_actundo2" onpointerdown="btn_back_longpress_start()" onpointerleave="btn_back_longpress_end()" onpointerup="btn_back_longpress_end()" onclick="btn_back()">Back</button>
<button type="button" class="btn btn-primary" id="btn_actredo2" onpointerdown="btn_redo_longpress_start()" onpointerleave="btn_redo_longpress_end()" onpointerup="btn_redo_longpress_end()" onclick="btn_redo()">Redo</button>
<button type="button" class="btn btn-primary" id="btn_actretry2" onclick="btn_retry()">Retry</button>
<button type="button" class="btn btn-primary bg_green" id="btn_genimg2" onpointerdown="btn_addimg_longpress_start()" onpointerleave="btn_addimg_longpress_end()" onpointerup="btn_addimg_longpress_end()" onclick="manual_gen_image()">Add Img</button>
<button type="button" class="btn btn-primary bg_green" id="btn_genimg2" onclick="add_img_btn_menu()">Add Img</button>
<button type="button" class="btn btn-primary" id="btn_editmode" onclick="btn_editmode()">Edit</button>
</div>
@ -13575,6 +13827,7 @@ Current version: 111
<div class="aidgpopuplistheader anotelabel zoomedimgdesc" id="zoomedimgdesc" style="word-wrap: break-word;">
Loading...
</div>
<br>
<div class="popupfooter">
<button type="button" class="bg_red btn btn-primary" style="width: 124px;" onclick="delete_curr_image();hide_popups();">Delete Image</button>
<button type="button" class="btn btn-primary" onclick="hide_popups()">Close</button>
@ -13659,6 +13912,29 @@ Current version: 111
</div>
</div>
<div class="popupcontainer flex hidden" id="addimgcontainer">
<div class="popupbg flex"></div>
<div class="nspopup fixsize">
<div class="popuptitlebar">
<div class="popuptitletext">Add New Image</div>
</div>
<div class="aidgpopuplistheader anotelabel">
<button type="button" class="btn btn-primary bg_green" onclick="add_img_btn_auto()">Generate Image (Automatic)</button>
</div>
<div class="aidgpopuplistheader anotelabel">
<button type="button" class="btn btn-primary bg_green" onclick="add_img_btn_custom()">Generate Image (Custom Prompt)</button>
</div>
<div class="aidgpopuplistheader anotelabel">
<button type="button" class="btn btn-primary bg_green" onclick="add_img_btn_upload()">Upload Image File</button>
</div>
<br>
<input type="file" id="addimgfileinput" style="display:none" accept="image/*">
<div class="popupfooter">
<button type="button" class="btn btn-primary" onclick="hide_popups()">Cancel</button>
</div>
</div>
</div>
<div class="popupcontainer flex hidden" id="groupselectcontainer">
<div class="popupbg flex"></div>
<div class="nspopup fixsize">