Skip to content

Commit a5b5d21

Browse files
committed
added chat mode to noscript
1 parent 4b0f63e commit a5b5d21

File tree

2 files changed

+52
-13
lines changed

2 files changed

+52
-13
lines changed

klite.embd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ Current version indicated by LITEVER below.
1212
-->
1313

1414
<script>
15-
const LITEVER = 229;
15+
const LITEVER = 230;
1616
const urlParams = new URLSearchParams(window.location.search);
17-
var localflag = true;
17+
var localflag = urlParams.get('local'); //this will be replaced automatically in embedded kcpp
1818
const STORAGE_PREFIX = (localflag?"e_":"")+"kaihordewebui_";
1919
</script>
2020

@@ -9027,7 +9027,7 @@ Current version indicated by LITEVER below.
90279027
.then((response) => response.json())
90289028
.then((data) => {
90299029
console.log(data);
9030-
if (data && data.data.length > 0)
9030+
if (data && data.data && data.data.length > 0)
90319031
{
90329032
for (var i = dropdown.options.length - 1; i >= 0; i--) {
90339033
var option = dropdown.options[i];

koboldcpp.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2545,13 +2545,26 @@ def noscript_webui(self):
25452545
reply = ""
25462546
status = str(parsed_dict['status'][0]) if 'status' in parsed_dict else "Ready To Generate"
25472547
prompt = str(parsed_dict['prompt'][0]) if 'prompt' in parsed_dict else ""
2548+
chatmsg = str(parsed_dict['chatmsg'][0]) if 'chatmsg' in parsed_dict else ""
25482549
max_length = int(parsed_dict['max_length'][0]) if 'max_length' in parsed_dict else 100
25492550
temperature = float(parsed_dict['temperature'][0]) if 'temperature' in parsed_dict else 0.75
25502551
top_k = int(parsed_dict['top_k'][0]) if 'top_k' in parsed_dict else 100
25512552
top_p = float(parsed_dict['top_p'][0]) if 'top_p' in parsed_dict else 0.9
25522553
rep_pen = float(parsed_dict['rep_pen'][0]) if 'rep_pen' in parsed_dict else 1.0
25532554
ban_eos_token = int(parsed_dict['ban_eos_token'][0]) if 'ban_eos_token' in parsed_dict else 0
2554-
gencommand = (parsed_dict['generate'][0] if 'generate' in parsed_dict else "")=="Generate"
2555+
genbtnval = (parsed_dict['generate'][0] if 'generate' in parsed_dict else "")
2556+
gencommand = (genbtnval=="Generate" or genbtnval=="Send")
2557+
chatmode = int(parsed_dict['chatmode'][0]) if 'chatmode' in parsed_dict else 0
2558+
stops = []
2559+
prefix = ""
2560+
if chatmode:
2561+
ban_eos_token = False
2562+
if chatmsg:
2563+
prompt += f"\nUser: {chatmsg}\nAssistant:"
2564+
else:
2565+
gencommand = False
2566+
stops = ["\nUser:","\nAssistant:"]
2567+
prefix = "[This is a chat conversation log between User and Assistant.]\n"
25552568

25562569
if modelbusy.locked():
25572570
status = "Model is currently busy, try again later."
@@ -2565,23 +2578,41 @@ def noscript_webui(self):
25652578
epurl = f"{httpsaffix}://localhost:{args.port}"
25662579
if args.host!="":
25672580
epurl = f"{httpsaffix}://{args.host}:{args.port}"
2568-
gen_payload = {"prompt": prompt,"max_length": max_length,"temperature": temperature,"top_k": top_k,"top_p": top_p,"rep_pen": rep_pen,"ban_eos_token":ban_eos_token}
2581+
gen_payload = {"prompt": prefix+prompt,"max_length": max_length,"temperature": temperature,"top_k": top_k,"top_p": top_p,"rep_pen": rep_pen,"ban_eos_token":ban_eos_token, "stop_sequence":stops}
25692582
respjson = make_url_request(f'{epurl}/api/v1/generate', gen_payload)
25702583
reply = html.escape(respjson["results"][0]["text"])
2584+
if chatmode:
2585+
reply = " "+reply.strip()
25712586
status = "Generation Completed"
25722587

25732588
if "generate" in parsed_dict:
25742589
del parsed_dict["generate"]
2590+
if "chatmsg" in parsed_dict:
2591+
del parsed_dict["chatmsg"]
25752592
parsed_dict["prompt"] = prompt + reply
25762593
parsed_dict["status"] = status
2594+
parsed_dict["chatmode"] = ("1" if chatmode else "0")
25772595
updated_query_string = urlparse.urlencode(parsed_dict, doseq=True)
25782596
updated_path = parsed_url._replace(query=updated_query_string).geturl()
25792597
self.path = updated_path
2598+
time.sleep(0.2) #short delay
25802599
self.send_response(302)
25812600
self.send_header("location", self.path)
25822601
self.end_headers(content_type='text/html')
25832602
return
25842603

2604+
bodycontent = f'''<b>{"Chat Mode" if chatmode else "Story Mode"}</b><br>'''
2605+
if chatmode:
2606+
tmp = prompt.strip().replace("\n","<br>")
2607+
bodycontent += f'''<p>{"No History Yet. Talk to the AI." if prompt=="" else tmp}</p>
2608+
<label>Say: </label><input type="text" size="40" value="" name="chatmsg">
2609+
<input type="hidden" name="prompt" value="{prompt}">
2610+
<input type="submit" name="generate" value="Send"> (Be patient)'''
2611+
else:
2612+
bodycontent += f'''
2613+
<textarea name="prompt" cols="60" rows="8" wrap="soft" placeholder="Enter Prompt Here">{prompt}</textarea><br>
2614+
<input type="submit" name="generate" value="Generate"> (Be patient)
2615+
'''
25852616
finalhtml = f'''<!doctype html>
25862617
<html lang="en"><head>
25872618
<meta charset="utf-8">
@@ -2592,8 +2623,7 @@ def noscript_webui(self):
25922623
<p>KoboldCpp can be used without Javascript enabled, however this is not recommended.
25932624
<br>If you have Javascript, please use <a href="/">KoboldAI Lite WebUI</a> instead.</p><hr>
25942625
<form action="/noscript">
2595-
Enter Prompt:<br>
2596-
<textarea name="prompt" cols="60" rows="8" wrap="soft" placeholder="Enter Prompt Here">{prompt}</textarea>
2626+
{bodycontent}
25972627
<hr>
25982628
<b>{status}</b><br>
25992629
<hr>
@@ -2603,12 +2633,19 @@ def noscript_webui(self):
26032633
<label>Top-P</label> <input type="text" size="4" value="{top_p}" name="top_p"><br>
26042634
<label>Rep. Pen</label> <input type="text" size="4" value="{rep_pen}" name="rep_pen"><br>
26052635
<label>Prevent EOS</label> <input type="checkbox" name="ban_eos_token" value="1" {"checked" if ban_eos_token else ""}><br>
2606-
<input type="submit" name="generate" value="Generate"> (Please be patient)
2636+
<input type="hidden" name="chatmode" value="{chatmode}">
26072637
</form>
2608-
<form action="/noscript">
2609-
<input type="submit" value="Reset">
2638+
<hr>
2639+
<div style="display: inline-block;">
2640+
<form action="/noscript" style="display: inline;">
2641+
<input type="submit" value="Reset (Story Mode)">
2642+
</form>
2643+
<form action="/noscript" style="display: inline;">
2644+
<input type="hidden" name="chatmode" value="1">
2645+
<input type="submit" value="Reset (Chat Mode)">
26102646
</form>
26112647
</div>
2648+
</div>
26122649
</body></html>'''
26132650
finalhtml = finalhtml.encode('utf-8')
26142651
self.send_response(200)
@@ -6173,10 +6210,12 @@ def kcpp_main_process(launch_args, g_memory=None, gui_launcher=False):
61736210
with open(os.path.join(basepath, "klite.embd"), mode='rb') as f:
61746211
embedded_kailite = f.read()
61756212
# patch it with extra stuff
6176-
origStr = "Sorry, KoboldAI Lite requires Javascript to function."
6177-
patchedStr = "Sorry, KoboldAI Lite requires Javascript to function.<br>You can use <a class=\"color_blueurl\" href=\"/noscript\">KoboldCpp NoScript mode</a> instead."
6213+
patches = [{"find":"Sorry, KoboldAI Lite requires Javascript to function.","replace":"Sorry, KoboldAI Lite requires Javascript to function.<br>You can use <a class=\"color_blueurl\" href=\"/noscript\">KoboldCpp NoScript mode</a> instead."},
6214+
{"find":"var localflag = urlParams.get('local');","replace":"var localflag = true;"},
6215+
{"find":"<p id=\"tempgtloadtxt\">Loading...</p>","replace":"<p id=\"tempgtloadtxt\">Loading...<br>(If load fails, try <a class=\"color_blueurl\" href=\"/noscript\">KoboldCpp NoScript mode</a> instead.)</p>"}]
61786216
embedded_kailite = embedded_kailite.decode("UTF-8","ignore")
6179-
embedded_kailite = embedded_kailite.replace(origStr, patchedStr)
6217+
for p in patches:
6218+
embedded_kailite = embedded_kailite.replace(p["find"], p["replace"])
61806219
embedded_kailite = embedded_kailite.encode()
61816220
print("Embedded KoboldAI Lite loaded.")
61826221
except Exception:

0 commit comments

Comments
 (0)