diff --git a/klite.embd b/klite.embd index 22a2c565e..469bfca7d 100644 --- a/klite.embd +++ b/klite.embd @@ -4030,6 +4030,7 @@ Current version: 113 const foundStory = urlParams.get('s'); const foundScenario = urlParams.get('scenario'); const foundChub = urlParams.get('chub'); + const foundPyg = urlParams.get('pyg'); if (foundStory && foundStory != "") { let safe_to_overwrite = (gametext_arr.length == 0 && current_memory == "" && current_anote == "" && current_wi.length == 0 && redo_arr.length == 0); @@ -4056,6 +4057,11 @@ Current version: 113 get_chubai_scenario(foundChub); //purge url params window.history.replaceState(null, null, window.location.pathname); + } else if (foundPyg && foundPyg != "") { + display_scenarios(); + get_pygchat_scenario(foundPyg); + //purge url params + window.history.replaceState(null, null, window.location.pathname); } } @@ -5360,6 +5366,68 @@ Current version: 113 },false); } + function load_temp_scenario_from_tavernobj(obj,loadall) + { + if(obj!=null) + { + //a lightweight tavern card loader, not fully compliant + if(obj.spec=="chara_card_v2" && obj.data!=null) + { + obj = obj.data; + } + + if(loadall) + { + let chatopponent = obj.name?obj.name:"Bot"; + let memory = obj.description?("Persona: "+obj.description):""; + memory += obj.personality?("\nPersonality: "+obj.personality):""; + let scenario = obj.scenario?obj.scenario:""; + let examplemsg = obj.mes_example?obj.mes_example:""; + let greeting = obj.first_mes?obj.first_mes:""; + let sysprompt = obj.system_prompt?obj.system_prompt:""; + + //aliases + if(examplemsg=="" && obj.mesExample!="") + { + examplemsg = obj.mesExample; + } + if(greeting=="" && obj.firstMes!="") + { + greeting = obj.firstMes; + } + + if(scenario!="") + { + scenario = "\n[Scenario: "+scenario+"]"; + } + if(examplemsg!="") + { + examplemsg = "\n"+examplemsg; + } + if(sysprompt!="") + { + sysprompt = sysprompt+"\n"; + } + let combinedmem = sysprompt + memory + scenario + examplemsg; + temp_scenario.title = chatopponent; + let prev2 = replaceAll(obj.description,"{{char}}",chatopponent,true); + prev2 = replaceAll(prev2,"{{user}}","You",true); + temp_scenario.desc = prev2; + temp_scenario.chatopponent = chatopponent; + temp_scenario.prompt = ("\n{{char}}: "+ greeting); + temp_scenario.memory = combinedmem; + } + + //since cai format has no wi, try to grab it from tavern format + if(obj.character_book && obj.character_book.entries && obj.character_book.entries.length>0) + { + let myname = ((localsettings.chatname && localsettings.chatname!="")?localsettings.chatname:"You"); + temp_scenario.worldinfo = load_tavern_wi(obj.character_book,chatopponent,myname); + } + preview_temp_scenario(); + } + } + function get_chubai_portrait(userinput, card_is_defective, original_no_exist) { //try to obtain the full portrait image @@ -5387,55 +5455,7 @@ Current version: 113 preview_temp_scenario(); readTavernPngFromBlob(blob,(obj)=>{ - if(obj!=null) - { - //a lightweight tavern card loader, not fully compliant - if(obj.spec=="chara_card_v2" && obj.data!=null) - { - obj = obj.data; - } - - if(card_is_defective) - { - let chatopponent = obj.name?obj.name:"Bot"; - let memory = obj.description?("Persona: "+obj.description):""; - memory += obj.personality?("\nPersonality: "+obj.personality):""; - let scenario = obj.scenario?obj.scenario:""; - let examplemsg = obj.mes_example?obj.mes_example:""; - let greeting = obj.first_mes?obj.first_mes:""; - let sysprompt = obj.system_prompt?obj.system_prompt:""; - - if(scenario!="") - { - scenario = "\n[Scenario: "+scenario+"]"; - } - if(examplemsg!="") - { - examplemsg = "\n"+examplemsg; - } - if(sysprompt!="") - { - sysprompt = sysprompt+"\n"; - } - let combinedmem = sysprompt + memory + scenario + examplemsg; - temp_scenario.title = chatopponent; - let prev2 = replaceAll(obj.description,"{{char}}",chatopponent,true); - prev2 = replaceAll(prev2,"{{user}}","You",true); - temp_scenario.desc = prev2; - temp_scenario.chatopponent = chatopponent; - temp_scenario.prompt = ("\n{{char}}: "+ greeting); - temp_scenario.memory = combinedmem; - } - - //since cai format has no wi, try to grab it from tavern format - if(obj.character_book && obj.character_book.entries && obj.character_book.entries.length>0) - { - let myname = ((localsettings.chatname && localsettings.chatname!="")?localsettings.chatname:"You"); - temp_scenario.worldinfo = load_tavern_wi(obj.character_book,chatopponent,myname); - } - preview_temp_scenario(); - } - + load_temp_scenario_from_tavernobj(obj,card_is_defective); }); const objectURL = URL.createObjectURL(blob); @@ -5461,6 +5481,102 @@ Current version: 113 }); } + function get_pygchat_scenario(charstr="") + { + const loadpyg = function(userinput) + { + if(userinput=="") + { + //pass + } + else + { + if (userinput.match(/pygmalion\.chat\//i)) { + const urlParams = new URLSearchParams(userinput); + const cid = urlParams.get('id'); + if(cid && cid!="") + { + userinput = cid; + } + } + userinput = userinput.endsWith('/') ? userinput.slice(0, -1) : userinput; + if(userinput!="") + { + temp_scenario = { + "title":"", + "desc": "", + "opmode":3, + "chatname": "You", + "chatopponent": "", + "gui_type":1, + "prefmodel1":chatmodels1, + "prefmodel2":chatmodels2, + "prompt":"", + "memory": "", + "authorsnote": "", + "worldinfo": [], + }; + + document.getElementById("scenariodesc").innerText = "Loading scenario from Pygmalion.Chat..."; + fetch(cors_proxy+"?https://server.pygmalion.chat/galatea.v1.PublicCharacterService/CharacterExport", { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ "character_id": userinput }), + referrerPolicy: 'no-referrer', + }) + .then(x => { + if(x.ok) + { + return x.json(); + }else{ + console.log('Cannot fetch pyg scenario: try fallback to tavern image'); + throw new Error('Cannot fetch character from pygmalion.chat'); + return null; + } + }) + .then(data => { + console.log(data); + if(data && data.card) //if fetch was successful + { + load_temp_scenario_from_tavernobj(data.card,true); + if(data.card.data && data.card.data.avatar) + { + const compressedImg = compressImage(data.card.data.avatar, (compressedImageURI, aspectratio)=>{ + temp_scenario.image = compressedImageURI; + temp_scenario.image_aspect = aspectratio; + preview_temp_scenario(); + }, true); + } + }else{ + temp_scenario = null; + document.getElementById("scenariodesc").innerText = "Error: Selected scenario is invalid."; + } + + }).catch((error) => { + temp_scenario = null; + document.getElementById("scenariodesc").innerText = "Error: Selected scenario is invalid."; + console.log("Error: " + error); + }); + }else{ + temp_scenario = null; + document.getElementById("scenariodesc").innerText = "Error: User input is invalid\n\n Please ensure you have input a valid Pygmalion.Chat UUID."; + } + } + } + + if(charstr=="") + { + inputBox("Enter pygmalion.chat character UUID","Import from pygmalion.chat","","d7950ca8-c241-4725-8de1-42866e389ebf", ()=>{ + let userinput = getInputBoxValue().trim(); + loadpyg(userinput); + },false); + }else{ + loadpyg(charstr); + } + } + function get_chubai_scenario(chubstr="") { const loadchub = function(userinput) @@ -5828,7 +5944,8 @@ Current version: 113 document.getElementById("quickstartcontainer").classList.remove("hidden"); let scenarios = ``+ - ``; + `` + + ``; for(let i=0;i { image_db[imgid].done = true; image_db[imgid].result = newDataUri; - }, true, true, imgres,0.33,true); + }, true, true, imgres,0.35,true); } reader.readAsDataURL(file); @@ -10507,7 +10624,7 @@ Current version: 113 } } - function compressImage(inputDataUri, onDone, isJpeg=true, fixedSize=true, maxSize=NO_HD_RES_PX, quality = 0.33, forceCrop=false) { + function compressImage(inputDataUri, onDone, isJpeg=true, fixedSize=true, maxSize=NO_HD_RES_PX, quality = 0.35, forceCrop=false) { let img = document.createElement('img'); let wantedWidth = maxSize; let wantedHeight = maxSize; @@ -10571,6 +10688,7 @@ Current version: 113 } onDone(dataURI,aspectratio); }; + img.setAttribute('crossorigin', 'anonymous'); // We put the Data URI in the image's src attribute if (typeof inputDataUri === 'string' || inputDataUri instanceof String)