mirror of
https://github.com/LostRuins/koboldcpp.git
synced 2025-09-10 17:14:36 +00:00
error popups on python exits
This commit is contained in:
parent
8412946b9f
commit
516fd35e93
1 changed files with 114 additions and 123 deletions
237
koboldcpp.py
237
koboldcpp.py
|
@ -16,6 +16,7 @@ import base64
|
|||
import json, sys, http.server, time, asyncio, socket, threading
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
# constants
|
||||
sampler_order_max = 7
|
||||
stop_token_max = 16
|
||||
ban_token_max = 16
|
||||
|
@ -26,6 +27,51 @@ images_max = 4
|
|||
bias_min_value = -100.0
|
||||
bias_max_value = 100.0
|
||||
|
||||
# global vars
|
||||
handle = None
|
||||
friendlymodelname = "inactive"
|
||||
friendlysdmodelname = "inactive"
|
||||
fullsdmodelpath = "" #if empty, it's not initialized
|
||||
mmprojpath = "" #if empty, it's not initialized
|
||||
password = "" #if empty, no auth key required
|
||||
fullwhispermodelpath = "" #if empty, it's not initialized
|
||||
maxctx = 4096
|
||||
maxhordectx = 4096
|
||||
maxhordelen = 350
|
||||
modelbusy = threading.Lock()
|
||||
requestsinqueue = 0
|
||||
defaultport = 5001
|
||||
KcppVersion = "1.70.1"
|
||||
showdebug = True
|
||||
guimode = False
|
||||
showsamplerwarning = True
|
||||
showmaxctxwarning = True
|
||||
session_kudos_earned = 0
|
||||
session_jobs = 0
|
||||
session_starttime = None
|
||||
exitcounter = -1
|
||||
punishcounter = 0 #causes a timeout if too many errors
|
||||
rewardcounter = 0 #reduces error counts for successful jobs
|
||||
totalgens = 0
|
||||
currentusergenkey = "" #store a special key so polled streaming works even in multiuser
|
||||
pendingabortkey = "" #if an abort is received for the non-active request, remember it (at least 1) to cancel later
|
||||
args = None #global args
|
||||
gui_layers_untouched = True
|
||||
runmode_untouched = True
|
||||
preloaded_story = None
|
||||
chatcompl_adapter = None
|
||||
embedded_kailite = None
|
||||
embedded_kcpp_docs = None
|
||||
embedded_kcpp_sdui = None
|
||||
sslvalid = False
|
||||
nocertify = False
|
||||
start_time = time.time()
|
||||
last_req_time = time.time()
|
||||
last_non_horde_req_time = time.time()
|
||||
currfinishreason = "null"
|
||||
using_gui_launcher = False
|
||||
using_outdated_flags = False
|
||||
|
||||
class logit_bias(ctypes.Structure):
|
||||
_fields_ = [("token_id", ctypes.c_int32),
|
||||
("bias", ctypes.c_float)]
|
||||
|
@ -160,8 +206,6 @@ class whisper_generation_outputs(ctypes.Structure):
|
|||
_fields_ = [("status", ctypes.c_int),
|
||||
("data", ctypes.c_char_p)]
|
||||
|
||||
handle = None
|
||||
|
||||
def getdirpath():
|
||||
return os.path.dirname(os.path.realpath(__file__))
|
||||
def getabspath():
|
||||
|
@ -438,6 +482,47 @@ def unpack_to_dir(destpath = ""):
|
|||
else:
|
||||
messagebox.showwarning("Invalid Selection", "The target folder is not empty or invalid. Please select an empty folder.")
|
||||
|
||||
def exit_with_error(code, message, title="Error"):
|
||||
global guimode
|
||||
print("")
|
||||
time.sleep(1)
|
||||
if guimode:
|
||||
show_gui_msgbox(title, message)
|
||||
else:
|
||||
print(message, flush=True)
|
||||
time.sleep(2)
|
||||
sys.exit(code)
|
||||
|
||||
def utfprint(str):
|
||||
maxlen = 32000
|
||||
if args.debugmode >= 1:
|
||||
maxlen = 64000
|
||||
strlength = len(str)
|
||||
if strlength > maxlen: #limit max output len
|
||||
str = str[:maxlen] + f"... (+{strlength-maxlen} chars)"
|
||||
try:
|
||||
print(str)
|
||||
except UnicodeEncodeError:
|
||||
# Replace or omit the problematic character
|
||||
utf_string = str.encode('ascii', 'ignore').decode('ascii',"ignore")
|
||||
utf_string = utf_string.replace('\a', '') #remove bell characters
|
||||
print(utf_string)
|
||||
|
||||
def bring_terminal_to_foreground():
|
||||
if os.name=='nt':
|
||||
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 9)
|
||||
ctypes.windll.user32.SetForegroundWindow(ctypes.windll.kernel32.GetConsoleWindow())
|
||||
|
||||
def string_contains_sequence_substring(inputstr,sequences):
|
||||
if inputstr.strip()=="":
|
||||
return False
|
||||
for s in sequences:
|
||||
if s.strip()=="":
|
||||
continue
|
||||
if s.strip() in inputstr.strip() or inputstr.strip() in s.strip():
|
||||
return True
|
||||
return False
|
||||
|
||||
def load_model(model_filename):
|
||||
global args
|
||||
inputs = load_model_inputs()
|
||||
|
@ -753,81 +838,10 @@ def whisper_generate(genparams):
|
|||
outstr = ret.data.decode("UTF-8","ignore")
|
||||
return outstr
|
||||
|
||||
def utfprint(str):
|
||||
maxlen = 32000
|
||||
if args.debugmode >= 1:
|
||||
maxlen = 64000
|
||||
strlength = len(str)
|
||||
if strlength > maxlen: #limit max output len
|
||||
str = str[:maxlen] + f"... (+{strlength-maxlen} chars)"
|
||||
try:
|
||||
print(str)
|
||||
except UnicodeEncodeError:
|
||||
# Replace or omit the problematic character
|
||||
utf_string = str.encode('ascii', 'ignore').decode('ascii',"ignore")
|
||||
utf_string = utf_string.replace('\a', '') #remove bell characters
|
||||
print(utf_string)
|
||||
|
||||
def bring_terminal_to_foreground():
|
||||
if os.name=='nt':
|
||||
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 9)
|
||||
ctypes.windll.user32.SetForegroundWindow(ctypes.windll.kernel32.GetConsoleWindow())
|
||||
|
||||
def string_contains_sequence_substring(inputstr,sequences):
|
||||
if inputstr.strip()=="":
|
||||
return False
|
||||
for s in sequences:
|
||||
if s.strip()=="":
|
||||
continue
|
||||
if s.strip() in inputstr.strip() or inputstr.strip() in s.strip():
|
||||
return True
|
||||
return False
|
||||
|
||||
#################################################################
|
||||
### A hacky simple HTTP server simulating a kobold api by Concedo
|
||||
### we are intentionally NOT using flask, because we want MINIMAL dependencies
|
||||
#################################################################
|
||||
friendlymodelname = "inactive"
|
||||
friendlysdmodelname = "inactive"
|
||||
fullsdmodelpath = "" #if empty, it's not initialized
|
||||
mmprojpath = "" #if empty, it's not initialized
|
||||
password = "" #if empty, no auth key required
|
||||
fullwhispermodelpath = "" #if empty, it's not initialized
|
||||
maxctx = 4096
|
||||
maxhordectx = 4096
|
||||
maxhordelen = 350
|
||||
modelbusy = threading.Lock()
|
||||
requestsinqueue = 0
|
||||
defaultport = 5001
|
||||
KcppVersion = "1.70.1"
|
||||
showdebug = True
|
||||
showsamplerwarning = True
|
||||
showmaxctxwarning = True
|
||||
session_kudos_earned = 0
|
||||
session_jobs = 0
|
||||
session_starttime = None
|
||||
exitcounter = -1
|
||||
punishcounter = 0 #causes a timeout if too many errors
|
||||
rewardcounter = 0 #reduces error counts for successful jobs
|
||||
totalgens = 0
|
||||
currentusergenkey = "" #store a special key so polled streaming works even in multiuser
|
||||
pendingabortkey = "" #if an abort is received for the non-active request, remember it (at least 1) to cancel later
|
||||
args = None #global args
|
||||
gui_layers_untouched = True
|
||||
runmode_untouched = True
|
||||
preloaded_story = None
|
||||
chatcompl_adapter = None
|
||||
embedded_kailite = None
|
||||
embedded_kcpp_docs = None
|
||||
embedded_kcpp_sdui = None
|
||||
sslvalid = False
|
||||
nocertify = False
|
||||
start_time = time.time()
|
||||
last_req_time = time.time()
|
||||
last_non_horde_req_time = time.time()
|
||||
currfinishreason = "null"
|
||||
using_gui_launcher = False
|
||||
using_outdated_flags = False
|
||||
|
||||
# Used to parse json for openai tool calls
|
||||
def extract_json_from_string(input_string):
|
||||
|
@ -1826,7 +1840,9 @@ def RunServerMultiThreaded(addr, port):
|
|||
sys.exit(0)
|
||||
|
||||
# note: customtkinter-5.2.0
|
||||
def show_new_gui():
|
||||
def show_gui():
|
||||
global guimode
|
||||
guimode = True
|
||||
from tkinter.filedialog import askopenfilename
|
||||
from tkinter.filedialog import asksaveasfile
|
||||
|
||||
|
@ -1843,9 +1859,7 @@ def show_new_gui():
|
|||
if not args.model_param and not args.sdmodel and not args.whispermodel:
|
||||
global exitcounter
|
||||
exitcounter = 999
|
||||
print("\nNo ggml model or kcpps file was selected. Exiting.")
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,"No ggml model or kcpps file was selected. Exiting.")
|
||||
return
|
||||
|
||||
import customtkinter as ctk
|
||||
|
@ -1976,9 +1990,7 @@ def show_new_gui():
|
|||
|
||||
if not any(runopts):
|
||||
exitcounter = 999
|
||||
show_gui_msgbox("No Backends Available!","KoboldCPP couldn't locate any backends to use (i.e Default, OpenBLAS, CLBlast, CuBLAS).\n\nTo use the program, please run the 'make' command from the directory.")
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,"KoboldCPP couldn't locate any backends to use (i.e Default, OpenBLAS, CLBlast, CuBLAS).\n\nTo use the program, please run the 'make' command from the directory.","No Backends Available!")
|
||||
|
||||
# Vars - should be in scope to be used by multiple widgets
|
||||
gpulayers_var = ctk.StringVar(value="0")
|
||||
|
@ -2961,12 +2973,10 @@ def show_new_gui():
|
|||
|
||||
if not args.model_param and not args.sdmodel and not args.whispermodel:
|
||||
exitcounter = 999
|
||||
print("\nNo text or image model file was selected. Exiting.")
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,"No text or image model file was selected. Exiting.")
|
||||
|
||||
def show_gui_msgbox(title,message):
|
||||
print(title + ": " + message)
|
||||
print(title + ": " + message, flush=True)
|
||||
try:
|
||||
from tkinter import messagebox
|
||||
import tkinter as tk
|
||||
|
@ -3427,9 +3437,7 @@ def main(launch_args,start_server=True):
|
|||
else:
|
||||
global exitcounter
|
||||
exitcounter = 999
|
||||
print("Specified kcpp config file invalid or not found.")
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,"Specified kcpp config file invalid or not found.")
|
||||
args = convert_outdated_args(args)
|
||||
|
||||
#positional handling for kcpps files (drag and drop)
|
||||
|
@ -3438,8 +3446,7 @@ def main(launch_args,start_server=True):
|
|||
|
||||
#prevent quantkv from being used without flash attn
|
||||
if args.quantkv and args.quantkv>0 and not args.flashattention:
|
||||
print("Error: Using --quantkv requires --flashattention")
|
||||
sys.exit(1)
|
||||
exit_with_error(1, "Error: Using --quantkv requires --flashattention")
|
||||
|
||||
if not args.model_param:
|
||||
args.model_param = args.model
|
||||
|
@ -3449,7 +3456,7 @@ def main(launch_args,start_server=True):
|
|||
print("For command line arguments, please refer to --help")
|
||||
print("***")
|
||||
try:
|
||||
show_new_gui()
|
||||
show_gui()
|
||||
except Exception as ex:
|
||||
exitcounter = 999
|
||||
ermsg = "Reason: " + str(ex) + "\nFile selection GUI unsupported.\ncustomtkinter python module required!\nPlease check command line: script.py --help"
|
||||
|
@ -3580,50 +3587,43 @@ def main(launch_args,start_server=True):
|
|||
#handle loading text model
|
||||
if args.model_param:
|
||||
if not os.path.exists(args.model_param):
|
||||
print(f"Cannot find text model file: {args.model_param}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing model file...")
|
||||
print(f"Ignoring missing model file: {args.model_param}")
|
||||
args.model_param = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find text model file: {args.model_param}")
|
||||
|
||||
if args.lora and args.lora[0]!="":
|
||||
if not os.path.exists(args.lora[0]):
|
||||
print(f"Cannot find lora file: {args.lora[0]}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing lora file...")
|
||||
print(f"Ignoring missing lora file: {args.lora[0]}")
|
||||
args.lora = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find lora file: {args.lora[0]}")
|
||||
else:
|
||||
args.lora[0] = os.path.abspath(args.lora[0])
|
||||
if len(args.lora) > 1:
|
||||
if not os.path.exists(args.lora[1]):
|
||||
print(f"Cannot find lora base: {args.lora[1]}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing lora file...")
|
||||
print(f"Ignoring missing lora base: {args.lora[1]}")
|
||||
args.lora = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find lora base: {args.lora[1]}")
|
||||
|
||||
else:
|
||||
args.lora[1] = os.path.abspath(args.lora[1])
|
||||
|
||||
if args.mmproj and args.mmproj!="":
|
||||
if not os.path.exists(args.mmproj):
|
||||
print(f"Cannot find mmproj file: {args.mmproj}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing mmproj file...")
|
||||
print(f"Ignoring missing mmproj file: {args.mmproj}")
|
||||
args.mmproj = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find mmproj file: {args.mmproj}")
|
||||
else:
|
||||
global mmprojpath
|
||||
args.mmproj = os.path.abspath(args.mmproj)
|
||||
|
@ -3645,22 +3645,18 @@ def main(launch_args,start_server=True):
|
|||
|
||||
if not loadok:
|
||||
exitcounter = 999
|
||||
print("Could not load text model: " + modelname)
|
||||
time.sleep(3)
|
||||
sys.exit(3)
|
||||
exit_with_error(3,"Could not load text model: " + modelname)
|
||||
|
||||
#handle loading image model
|
||||
if args.sdmodel and args.sdmodel!="":
|
||||
imgmodel = args.sdmodel
|
||||
if not imgmodel or not os.path.exists(imgmodel):
|
||||
print(f"Cannot find image model file: {imgmodel}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing img model file...")
|
||||
print(f"Ignoring missing img model file: {imgmodel}")
|
||||
args.sdmodel = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find image model file: {imgmodel}")
|
||||
else:
|
||||
imglora = ""
|
||||
imgvae = ""
|
||||
|
@ -3684,22 +3680,18 @@ def main(launch_args,start_server=True):
|
|||
print("Load Image Model OK: " + str(loadok))
|
||||
if not loadok:
|
||||
exitcounter = 999
|
||||
print("Could not load image model: " + imgmodel)
|
||||
time.sleep(3)
|
||||
sys.exit(3)
|
||||
exit_with_error(3,"Could not load image model: " + imgmodel)
|
||||
|
||||
#handle whisper model
|
||||
if args.whispermodel and args.whispermodel!="":
|
||||
whispermodel = args.whispermodel
|
||||
if not whispermodel or not os.path.exists(whispermodel):
|
||||
print(f"Cannot find whisper model file: {whispermodel}")
|
||||
if args.ignoremissing:
|
||||
print(f"Ignoring missing whisper model file...")
|
||||
print(f"Ignoring missing whisper model file: {whispermodel}")
|
||||
args.whispermodel = None
|
||||
else:
|
||||
exitcounter = 999
|
||||
time.sleep(3)
|
||||
sys.exit(2)
|
||||
exit_with_error(2,f"Cannot find whisper model file: {whispermodel}")
|
||||
else:
|
||||
whispermodel = os.path.abspath(whispermodel)
|
||||
fullwhispermodelpath = whispermodel
|
||||
|
@ -3707,9 +3699,8 @@ def main(launch_args,start_server=True):
|
|||
print("Load Whisper Model OK: " + str(loadok))
|
||||
if not loadok:
|
||||
exitcounter = 999
|
||||
print("Could not load whisper model: " + imgmodel)
|
||||
time.sleep(3)
|
||||
sys.exit(3)
|
||||
exit_with_error(3,"Could not load whisper model: " + whispermodel)
|
||||
|
||||
|
||||
#load embedded lite
|
||||
try:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue