@@ -630,52 +630,85 @@ async def handle_request(self, genparams, api_format, stream_flag):
630
630
except Exception as e :
631
631
print (e )
632
632
633
- def noscript_webui (self , path ):
633
+ def noscript_webui (self ):
634
634
global modelbusy
635
+ import html
635
636
import urllib .parse as urlparse
636
- parsed_url = urlparse .urlparse (path )
637
+ parsed_url = urlparse .urlparse (self . path )
637
638
parsed_dict = urlparse .parse_qs (parsed_url .query )
638
- status = "Error"
639
639
reply = ""
640
+ status = parsed_dict ['status' ][0 ] if 'status' in parsed_dict else "Ready To Generate"
640
641
prompt = parsed_dict ['prompt' ][0 ] if 'prompt' in parsed_dict else ""
641
- max_length = parsed_dict ['max_length' ][0 ] if 'max_length' in parsed_dict else 100
642
- temperature = parsed_dict ['temperature' ][0 ] if 'temperature' in parsed_dict else 0.7
643
- top_k = parsed_dict ['top_k' ][0 ] if 'top_k' in parsed_dict else 100
644
- top_p = parsed_dict ['top_p' ][0 ] if 'top_p' in parsed_dict else 0.9
645
- rep_pen = parsed_dict ['rep_pen' ][0 ] if 'rep_pen' in parsed_dict else 1.1
642
+ max_length = int (parsed_dict ['max_length' ][0 ]) if 'max_length' in parsed_dict else 100
643
+ temperature = float (parsed_dict ['temperature' ][0 ]) if 'temperature' in parsed_dict else 0.7
644
+ top_k = int (parsed_dict ['top_k' ][0 ]) if 'top_k' in parsed_dict else 100
645
+ top_p = float (parsed_dict ['top_p' ][0 ]) if 'top_p' in parsed_dict else 0.9
646
+ rep_pen = float (parsed_dict ['rep_pen' ][0 ]) if 'rep_pen' in parsed_dict else 1.1
647
+ use_default_badwordsids = int (parsed_dict ['use_default_badwordsids' ][0 ]) if 'use_default_badwordsids' in parsed_dict else 0
646
648
gencommand = (parsed_dict ['generate' ][0 ] if 'generate' in parsed_dict else "" )== "Generate"
647
649
648
- if prompt == "" or not gencommand or max_length <= 0 :
649
- status = "Ready To Generate"
650
- elif modelbusy .locked ():
651
- status = "Model is busy, try again later."
650
+ if gencommand :
651
+ if prompt == "" or max_length <= 0 :
652
+ status = "Need a valid prompt and length to generate."
653
+ if modelbusy .locked ():
654
+ status = "Model is currently busy, try again later."
655
+ else :
656
+ epurl = f"http://localhost:{ args .port } "
657
+ if args .host != "" :
658
+ epurl = f"http://{ args .host } :{ args .port } "
659
+ gen_payload = {"prompt" : prompt ,"max_length" : max_length ,"temperature" : temperature ,"prompt" : prompt ,"top_k" : top_k ,"top_p" : top_p ,"rep_pen" : rep_pen ,"use_default_badwordsids" :use_default_badwordsids }
660
+ respjson = make_url_request (f'{ epurl } /api/v1/generate' , gen_payload )
661
+ reply = html .escape (respjson ["results" ][0 ]["text" ])
662
+ status = "Generation Completed"
663
+
664
+ if "generate" in parsed_dict :
665
+ del parsed_dict ["generate" ]
666
+ parsed_dict ["prompt" ] = prompt + reply
667
+ parsed_dict ["status" ] = status
668
+ updated_query_string = urlparse .urlencode (parsed_dict , doseq = True )
669
+ updated_path = parsed_url ._replace (query = updated_query_string ).geturl ()
670
+ self .path = updated_path
671
+ self .send_response (302 )
672
+ self .send_header ("location" , self .path )
673
+ self .end_headers (content_type = 'text/html' )
674
+ return
652
675
else :
653
- epurl = f"http://localhost:{ args .port } "
654
- if args .host != "" :
655
- epurl = f"http://{ args .host } :{ args .port } "
656
- gen_payload = {"prompt" : prompt ,"max_length" : max_length ,"temperature" : temperature ,"prompt" : prompt ,"top_k" : top_k ,"top_p" : top_p ,"rep_pen" : rep_pen }
657
- respjson = make_url_request (f'{ epurl } /api/v1/generate' , gen_payload )
658
- reply = respjson ["results" ][0 ]["text" ]
659
- status = "Generation Completed"
660
-
661
- finalhtml = f'''
662
- <!DOCTYPE html>
663
- <html><head><title>KoboldCpp NoScript Mode</title></head><body>
664
- <h2>KoboldCpp NoScript Mode</h2>
665
- <p>KoboldCpp can be used without Javascript enabled, however this is not recommended.
666
- <br>If you have Javascript, please use <a href="/">Kobold Lite WebUI</a> instead.</p><hr/>
667
- <form action="/noscript">
668
- Enter Prompt:<br>
669
- <textarea name="prompt" cols="60" rows="7" placeholder="Enter Prompt Here">{ prompt + reply } </textarea>
670
- <hr/>
671
- { status } <br>
672
- <hr/>
673
- <input type="submit" name="generate" value="Generate">
674
- </form>
675
- </body>
676
- </html>
677
- '''
678
- return finalhtml
676
+ if modelbusy .locked ():
677
+ status = "Model is currently busy."
678
+
679
+ finalhtml = f'''<!doctype html>
680
+ <html lang="en"><head>
681
+ <meta charset="utf-8">
682
+ <meta name="viewport" content="width=device-width, initial-scale=1">
683
+ <title>KoboldCpp NoScript Mode</title></head><body>
684
+ <h2>KoboldCpp NoScript Mode</h2>
685
+ <div>
686
+ <p>KoboldCpp can be used without Javascript enabled, however this is not recommended.
687
+ <br>If you have Javascript, please use <a href="/">Kobold Lite WebUI</a> instead.</p><hr>
688
+ <form action="/noscript">
689
+ Enter Prompt:<br>
690
+ <textarea name="prompt" cols="60" rows="8" wrap="soft" placeholder="Enter Prompt Here">{ prompt } </textarea>
691
+ <hr>
692
+ { status } <br>
693
+ <hr>
694
+ <label>Gen. Amount</label> <input type="text" size="4" value="{ max_length } " name="max_length"><br>
695
+ <label>Temperature</label> <input type="text" size="4" value="{ temperature } " name="temperature"><br>
696
+ <label>Top-K</label> <input type="text" size="4" value="{ top_k } " name="top_k"><br>
697
+ <label>Top-P</label> <input type="text" size="4" value="{ top_p } " name="top_p"><br>
698
+ <label>Rep. Pen</label> <input type="text" size="4" value="{ rep_pen } " name="rep_pen"><br>
699
+ <label>Ignore EOS</label> <input type="checkbox" name="use_default_badwordsids" value="1" { "checked" if use_default_badwordsids else "" } ><br>
700
+ <input type="submit" name="generate" value="Generate"> (Please be patient)
701
+ </form>
702
+ <form action="/noscript">
703
+ <input type="submit" value="Reset">
704
+ </form>
705
+ </div>
706
+ </body></html>'''
707
+ finalhtml = finalhtml .encode ('utf-8' )
708
+ self .send_response (200 )
709
+ self .send_header ('content-length' , str (len (finalhtml )))
710
+ self .end_headers (content_type = 'text/html' )
711
+ self .wfile .write (finalhtml )
679
712
680
713
def do_GET (self ):
681
714
global maxctx , maxhordelen , friendlymodelname , KcppVersion , totalgens , preloaded_story
@@ -691,8 +724,8 @@ def do_GET(self):
691
724
response_body = self .embedded_kailite
692
725
693
726
elif self .path in ["/noscript" , "/noscript?" ] or self .path .startswith (('/noscript?' ,'noscript?' )): #it's possible for the root url to have ?params without /
694
- content_type = 'text/html'
695
- response_body = ( self . noscript_webui ( self . path )). encode ( 'utf-8' )
727
+ self . noscript_webui ()
728
+ return
696
729
697
730
elif self .path .endswith (('/api/v1/model' , '/api/latest/model' )):
698
731
response_body = (json .dumps ({'result' : friendlymodelname }).encode ())
0 commit comments