fixed file select cancel, updated lite

This commit is contained in:
Concedo 2024-01-24 16:36:53 +08:00
parent 0f6fa6be93
commit 346c1a97de
2 changed files with 163 additions and 14 deletions

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. 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. 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. Kobold Lite is under the AGPL v3.0 License unless otherwise exempted. Please do not remove this line.
Current version: 106 Current version: 107
-Concedo -Concedo
--> -->
@ -3110,6 +3110,30 @@ Current version: 106
console.log("beep sound"); console.log("beep sound");
} }
let notify_allowed = false;
function shownotify()
{
if ("Notification" in window) {
// Request permission to show notifications
if (Notification.permission === "granted" || notify_allowed) {
var notification = new Notification("Kobold Lite", {
body: "Text Generation Completed!"
});
} else {
Notification.requestPermission().then(function (permission) {
if (permission === "granted") {
notify_allowed = true;
console.log("Notification permission granted");
} else {
console.log("Notification permission denied");
}
});
}
} else {
console.log("Notification API not supported in this browser");
}
}
function compare_version_str(a, b) { function compare_version_str(a, b) {
var i, diff; var i, diff;
var regExStrip0 = /(\.0+)+$/; var regExStrip0 = /(\.0+)+$/;
@ -3261,6 +3285,9 @@ Current version: 106
const a1111_options_endpoint = "/sdapi/v1/options"; const a1111_options_endpoint = "/sdapi/v1/options";
const a1111_txt2img_endpoint = "/sdapi/v1/txt2img"; const a1111_txt2img_endpoint = "/sdapi/v1/txt2img";
const xtts_gen_endpoint = "/tts_to_audio";
const xtts_voices_endpoint = "/speakers_list";
//support for quick news updates //support for quick news updates
const horde_news_endpoint = "https://hordenews.concedo.workers.dev" const horde_news_endpoint = "https://hordenews.concedo.workers.dev"
@ -3317,6 +3344,7 @@ Current version: 106
var custom_claude_key = ""; var custom_claude_key = "";
var custom_claude_model = ""; var custom_claude_model = "";
var a1111_base_url = "http://localhost:7860"; var a1111_base_url = "http://localhost:7860";
var xtts_base_url = " http://localhost:8020";
var uses_cors_proxy = false; //we start off attempting a direct connection. switch to proxy if that fails var uses_cors_proxy = false; //we start off attempting a direct connection. switch to proxy if that fails
var synchro_polled_response = null; var synchro_polled_response = null;
var synchro_pending_stream = ""; //used for token pseduo streaming for kobold api only var synchro_pending_stream = ""; //used for token pseduo streaming for kobold api only
@ -3367,8 +3395,9 @@ Current version: 106
instruct_has_markdown: true, instruct_has_markdown: true,
placeholder_tags: true, placeholder_tags: true,
persist_session: true, persist_session: true,
speech_synth: 0, //0 is disabled speech_synth: 0, //0 is disabled, 100 is xtts
beep_on: false, beep_on: false,
notify_on: false,
narrate_both_sides: false, narrate_both_sides: false,
image_styles: "", image_styles: "",
grammar:"", grammar:"",
@ -7386,9 +7415,12 @@ Current version: 106
} else { } else {
console.log("No speech synth available"); console.log("No speech synth available");
} }
ttshtml += "<option value=\"100\">XTTS API Server</option>";
document.getElementById("ttsselect").innerHTML = ttshtml; document.getElementById("ttsselect").innerHTML = ttshtml;
document.getElementById("ttsselect").value = localsettings.speech_synth; document.getElementById("ttsselect").value = localsettings.speech_synth;
toggle_tts_mode();
document.getElementById("beep_on").checked = localsettings.beep_on; document.getElementById("beep_on").checked = localsettings.beep_on;
document.getElementById("notify_on").checked = localsettings.notify_on;
document.getElementById("narrate_both_sides").checked = localsettings.narrate_both_sides; document.getElementById("narrate_both_sides").checked = localsettings.narrate_both_sides;
toggle_opmode(); toggle_opmode();
@ -7573,6 +7605,7 @@ Current version: 106
localsettings.speech_synth = document.getElementById("ttsselect").value; localsettings.speech_synth = document.getElementById("ttsselect").value;
localsettings.beep_on = (document.getElementById("beep_on").checked?true:false); localsettings.beep_on = (document.getElementById("beep_on").checked?true:false);
localsettings.notify_on = (document.getElementById("notify_on").checked?true:false);
localsettings.narrate_both_sides = (document.getElementById("narrate_both_sides").checked?true:false); localsettings.narrate_both_sides = (document.getElementById("narrate_both_sides").checked?true:false);
localsettings.auto_ctxlen = (document.getElementById("auto_ctxlen").checked ? true : false); localsettings.auto_ctxlen = (document.getElementById("auto_ctxlen").checked ? true : false);
localsettings.auto_genamt = (document.getElementById("auto_genamt").checked ? true : false); localsettings.auto_genamt = (document.getElementById("auto_genamt").checked ? true : false);
@ -8312,6 +8345,102 @@ Current version: 106
} }
} }
var xtts_is_connected = false;
function fetch_xtts_voices(silent)
{
if(!xtts_is_connected)
{
fetch(xtts_base_url + xtts_voices_endpoint)
.then(x => x.json())
.then(data => {
console.log(data);
//repopulate our voices list
let dropdown = document.getElementById("xtts_voices");
let selectionhtml = ``;
for (var i = 0; i < data.length; ++i) {
selectionhtml += `<option value="` + data[i] + `">`+data[i]+`</option>`;
}
dropdown.innerHTML = selectionhtml;
xtts_is_connected = true;
}).catch((error) => {
xtts_is_connected = false;
if(!silent)
{
msgbox("XTTS Connect Error: " + error+"\nCheck XTTS API Server endpoint URL.\n");
}
});
}
}
function toggle_tts_mode()
{
if(document.getElementById("ttsselect").value==100)
{
document.getElementById("xtts_container").classList.remove("hidden");
}else{
document.getElementById("xtts_container").classList.add("hidden");
}
}
function set_xtts_url()
{
inputBox("Enter XTTS API Server URL.","XTTS API Server URL",xtts_base_url,"Input XTTS API Server URL", ()=>{
let userinput = getInputBoxValue();
userinput = userinput.trim();
if(userinput!="" && userinput.slice(-1)=="/")
{
userinput = userinput.slice(0, -1);
}
if (userinput != null && userinput!="") {
xtts_base_url = userinput.trim();
xtts_is_connected = false;
fetch_xtts_voices(false);
}
},false);
}
function tts_speak(text)
{
if(localsettings.speech_synth==100) //xtts api server
{
if(xtts_is_connected)
{
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
let xtts_payload = {
"text": text,
"speaker_wav": document.getElementById("xtts_voices").value,
"language": "EN"
};
fetch(xtts_base_url + xtts_gen_endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(xtts_payload),
})
.then(response => response.arrayBuffer())
.then(data => {
return audioContext.decodeAudioData(data);
})
.then(decodedData => {
const playSound = audioContext.createBufferSource();
playSound.buffer = decodedData;
playSound.connect(audioContext.destination);
playSound.start(audioContext.currentTime);
}).catch((error) => {
console.log("XTTS Speak Error: " + error);
});
}
}
else
{
if ('speechSynthesis' in window) {
let utterance = new window.SpeechSynthesisUtterance(text);
utterance.voice = window.speechSynthesis.getVoices()[localsettings.speech_synth - 1];
window.speechSynthesis.speak(utterance);
}
}
}
function submit_generation() { function submit_generation() {
let newgen = document.getElementById("input_text").value; let newgen = document.getElementById("input_text").value;
@ -8323,12 +8452,11 @@ Current version: 106
waiting_for_autosummary = false; waiting_for_autosummary = false;
idle_timer = 0; idle_timer = 0;
idle_triggered_counter = 0; idle_triggered_counter = 0;
if (localsettings.speech_synth > 0 && 'speechSynthesis' in window) { if (localsettings.speech_synth > 0)
{
if(localsettings.narrate_both_sides) if(localsettings.narrate_both_sides)
{ {
let utterance = new window.SpeechSynthesisUtterance(newgen); tts_speak(newgen);
utterance.voice = window.speechSynthesis.getVoices()[localsettings.speech_synth - 1];
window.speechSynthesis.speak(utterance);
} }
} }
@ -9734,6 +9862,11 @@ Current version: 106
} }
} }
//second pass for trimming whitespace
if (localsettings.trimwhitespace) {
gentxt = gentxt.replace(/[\t\r\n ]+$/, '');
}
let gentxtspeak = gentxt; let gentxtspeak = gentxt;
if (pending_context_preinjection != "") { if (pending_context_preinjection != "") {
if(gentxt!="" && gentxt[0]!=" " && localsettings.opmode==3) if(gentxt!="" && gentxt[0]!=" " && localsettings.opmode==3)
@ -9745,15 +9878,13 @@ Current version: 106
pending_context_preinjection = ""; pending_context_preinjection = "";
} }
if (localsettings.speech_synth > 0 && 'speechSynthesis' in window) if (localsettings.speech_synth > 0)
{ {
if(localsettings.narrate_both_sides) if(localsettings.narrate_both_sides)
{ {
gentxtspeak = gentxt; gentxtspeak = gentxt;
} }
let utterance = new window.SpeechSynthesisUtterance(gentxtspeak); tts_speak(gentxt);
utterance.voice = window.speechSynthesis.getVoices()[localsettings.speech_synth - 1];
window.speechSynthesis.speak(utterance);
} }
if(gentxt!="") if(gentxt!="")
@ -9765,6 +9896,10 @@ Current version: 106
{ {
playbeep(); playbeep();
} }
if(localsettings.notify_on)
{
shownotify();
}
let lastreq = "<a href=\"#\" onclick=\"show_last_req()\">Last request</a> served by <a href=\"#\" onclick=\"get_and_show_workers()\">" + genworker + "</a> using <span class=\"color_darkgreen\">"+genmdl+ "</span>"+(genkudos>0?(" for " + genkudos + " kudos"):"")+" in " + getTimeTaken() + " seconds."; let lastreq = "<a href=\"#\" onclick=\"show_last_req()\">Last request</a> served by <a href=\"#\" onclick=\"get_and_show_workers()\">" + genworker + "</a> using <span class=\"color_darkgreen\">"+genmdl+ "</span>"+(genkudos>0?(" for " + genkudos + " kudos"):"")+" in " + getTimeTaken() + " seconds.";
document.getElementById("lastreq").innerHTML = lastreq; document.getElementById("lastreq").innerHTML = lastreq;
document.getElementById("lastreq2").innerHTML = lastreq; document.getElementById("lastreq2").innerHTML = lastreq;
@ -12716,8 +12851,16 @@ Current version: 106
<div class="settingitem"> <div class="settingitem">
<div class="settinglabel"> <div class="settinglabel">
<div class="justifyleft settingsmall">TTS <span class="helpicon">?<span class="helptext">Enable Text-To-Speech to have your story automatically read to you.</span></span></div> <div class="justifyleft settingsmall">TTS <span class="helpicon">?<span class="helptext">Enable Text-To-Speech to have your story automatically read to you.</span></span></div>
<select class="form-control" id="ttsselect" style="height:20px;padding:0;margin:0px 0 0;"> <select class="form-control" id="ttsselect" style="height:20px;padding:0;margin:0px 0 0;" onchange="toggle_tts_mode()">
</select> </select>
<div id="xtts_container" class="settinglabel hidden">
<table width="100%"><tr>
<td><button id="xtts_url" type="button" class="btn btn-primary" style="width:100%; padding:2px 3px;margin-top:2px;font-size:11px;" onclick="set_xtts_url()">Set URL</button></td>
<td><select class="form-control" id="xtts_voices" style="font-size:12px;height:20px;padding:0;margin:0px 0 0;">
<option value="female_calm" selected>female_calm</option><option value="female">female</option><option value="male">male</option>
</select></td>
</tr></table>
</div>
</div> </div>
<div class="settinglabel"> <div class="settinglabel">
<div class="justifyleft settingsmall" title="If unchecked, only speak AI replies, not other text.">Narrate Both Sides </div> <div class="justifyleft settingsmall" title="If unchecked, only speak AI replies, not other text.">Narrate Both Sides </div>
@ -12727,6 +12870,10 @@ Current version: 106
<div class="justifyleft settingsmall" title="Play a sound when generation is complete">Beep on Done </div> <div class="justifyleft settingsmall" title="Play a sound when generation is complete">Beep on Done </div>
<input type="checkbox" id="beep_on" style="margin:0px 0 0;"> <input type="checkbox" id="beep_on" style="margin:0px 0 0;">
</div> </div>
<div class="settinglabel">
<div class="justifyleft settingsmall" title="Show notification when generation is complete">Notify on Done </div>
<input type="checkbox" id="notify_on" style="margin:0px 0 0;">
</div>
<button id="resetallsettings" type="button" class="btn btn-primary bg_red" style="padding:2px 3px;margin-top:2px;font-size:11px;" onclick="reset_all_settings()">Reset ALL Settings</button> <button id="resetallsettings" type="button" class="btn btn-primary bg_red" style="padding:2px 3px;margin-top:2px;font-size:11px;" onclick="reset_all_settings()">Reset ALL Settings</button>
</div> </div>

View file

@ -1268,9 +1268,11 @@ def show_new_gui():
def makefileentry(parent, text, searchtext, var, row=0, width=200, filetypes=[], onchoosefile=None, singlerow=False, tooltiptxt=""): def makefileentry(parent, text, searchtext, var, row=0, width=200, filetypes=[], onchoosefile=None, singlerow=False, tooltiptxt=""):
makelabel(parent, text, row,0,tooltiptxt) makelabel(parent, text, row,0,tooltiptxt)
def getfilename(var, text): def getfilename(var, text):
var.set(askopenfilename(title=text,filetypes=filetypes)) fnam = askopenfilename(title=text,filetypes=filetypes)
if onchoosefile: if fnam:
onchoosefile(var.get()) var.set(fnam)
if onchoosefile:
onchoosefile(var.get())
entry = ctk.CTkEntry(parent, width, textvariable=var) entry = ctk.CTkEntry(parent, width, textvariable=var)
button = ctk.CTkButton(parent, 50, text="Browse", command= lambda a=var,b=searchtext:getfilename(a,b)) button = ctk.CTkButton(parent, 50, text="Browse", command= lambda a=var,b=searchtext:getfilename(a,b))
if singlerow: if singlerow: