diff --git a/koboldcpp.py b/koboldcpp.py index b1039d843..8dd785117 100644 --- a/koboldcpp.py +++ b/koboldcpp.py @@ -9,9 +9,10 @@ # scenarios and everything Kobold and Kobold Lite have to offer. import ctypes -import os, math +import os, math, re import argparse import platform +import base64 import json, sys, http.server, time, asyncio, socket, threading from concurrent.futures import ThreadPoolExecutor @@ -844,6 +845,26 @@ class ServerRequestHandler(http.server.SimpleHTTPRequestHandler): super().log_message(format, *args) pass + def extract_b64string_from_file_upload(self, body): + try: + if 'content-type' in self.headers and self.headers['content-type']: + boundary = self.headers['content-type'].split("=")[1].encode() + if boundary: + fparts = body.split(boundary) + for fpart in fparts: + detected_upload_filename = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"', fpart.decode('utf-8',errors='ignore')) + if detected_upload_filename and len(detected_upload_filename)>0: + utfprint(f"Detected uploaded file: {detected_upload_filename[0]}") + file_data = fpart.split(b'\r\n\r\n')[1].rsplit(b'\r\n', 1)[0] + file_data_base64 = base64.b64encode(file_data).decode('utf-8') + base64_string = f"data:audio/wav;base64,{file_data_base64}" + return base64_string + print("Uploaded file not found.") + return None + except Exception as e: + print(f"File Upload Process Error: {e}") + return None + async def generate_text(self, genparams, api_format, stream_flag): from datetime import datetime global friendlymodelname, chatcompl_adapter, currfinishreason @@ -1425,7 +1446,7 @@ Enter Prompt:
if self.path.endswith('/sdapi/v1/txt2img') or self.path.endswith('/sdapi/v1/img2img'): is_imggen = True - if self.path.endswith('/api/extra/transcribe'): + if self.path.endswith('/api/extra/transcribe') or self.path.endswith('/v1/audio/transcriptions'): is_transcribe = True if is_imggen or is_transcribe or api_format > 0: @@ -1440,14 +1461,21 @@ Enter Prompt:
try: genparams = json.loads(body) except Exception as e: - utfprint("Body Err: " + str(body)) - self.send_response(500) - self.end_headers(content_type='application/json') - self.wfile.write(json.dumps({"detail": { - "msg": "Error parsing input.", - "type": "bad_input", - }}).encode()) - return + genparams = None + if is_transcribe: #fallback handling of file uploads + b64wav = self.extract_b64string_from_file_upload(body) + if b64wav: + genparams = {"audio_data":b64wav} + + if not genparams: + utfprint("Body Err: " + str(body)) + self.send_response(500) + self.end_headers(content_type='application/json') + self.wfile.write(json.dumps({"detail": { + "msg": "Error parsing input.", + "type": "bad_input", + }}).encode()) + return is_quiet = args.quiet if (args.debugmode != -1 and not is_quiet) or args.debugmode >= 1: @@ -3463,7 +3491,7 @@ def main(launch_args,start_server=True): from datetime import datetime, timezone start_server = False save_to_file = (args.benchmark!="stdout" and args.benchmark!="") - benchmaxctx = (16384 if maxctx>16384 else maxctx) + benchmaxctx = maxctx benchlen = 100 benchmodel = sanitize_string(os.path.splitext(os.path.basename(modelname))[0]) if os.path.exists(args.benchmark) and os.path.getsize(args.benchmark) > 1000000: @@ -3475,7 +3503,7 @@ def main(launch_args,start_server=True): print(f"\nRunning benchmark (Not Saved)...") benchprompt = "1111111111111111" - for i in range(0,12): #generate massive prompt + for i in range(0,14): #generate massive prompt benchprompt += benchprompt genout = generate(benchprompt,memory="",images=[],max_length=benchlen,max_context_length=benchmaxctx,temperature=0.1,top_k=1,rep_pen=1,use_default_badwordsids=True) result = genout['text']