From db4634b9a48b86f109db166b7f7b12c0639f19de Mon Sep 17 00:00:00 2001 From: Concedo <39025047+LostRuins@users.noreply.github.com> Date: Sun, 21 Dec 2025 22:54:40 +0800 Subject: [PATCH] testing new workaround for corrupt scaling --- koboldcpp.py | 165 ++++++++++++++++++++++++++------------------------- 1 file changed, 84 insertions(+), 81 deletions(-) diff --git a/koboldcpp.py b/koboldcpp.py index ea50fc1d7..7876ee2f4 100755 --- a/koboldcpp.py +++ b/koboldcpp.py @@ -4947,33 +4947,6 @@ def show_gui(): global using_gui_launcher using_gui_launcher = True - # if args received, launch - if len(sys.argv) != 1 and not args.showgui: - import tkinter as tk - root = tk.Tk() #we dont want the useless window to be visible, but we want it in taskbar - root.attributes("-alpha", 0) - args.model_param = zentk_askopenfilename(title="Select ggml model .bin or .gguf file or .kcpps config") - root.withdraw() - root.quit() - if args.model_param and args.model_param!="" and (args.model_param.lower().endswith('.kcpps') or args.model_param.lower().endswith('.kcppt') or args.model_param.lower().endswith('.kcpps?download=true') or args.model_param.lower().endswith('.kcppt?download=true')): - dlfile = download_model_from_url(args.model_param,[".kcpps",".kcppt"]) # maybe download from url - if dlfile: - args.model_param = dlfile - load_config_cli(args.model_param) - if not args.model_param and not args.sdmodel and not args.whispermodel and not args.ttsmodel and not args.embeddingsmodel and not args.nomodel: - global exitcounter - exitcounter = 999 - exit_with_error(2,"No gguf model or kcpps file was selected. Exiting.") - return - - #dummy line to get darkdetect imported in pyinstaller - try: - import darkdetect as darkdt - darkdt.isDark() - pass - except Exception: - pass - #check for wayland with fractional scale def get_problematic_scaler(): if sys.platform != "linux" or os.environ.get("XDG_SESSION_TYPE") != "wayland": @@ -5015,11 +4988,43 @@ def show_gui(): pass return False + corrupt_scaler = get_problematic_scaler() + if corrupt_scaler: + print("You seem to be using Wayland - because of increased reports of scaling issues, we will fallback to Bitmap Fonts. Don't worry about the error after this.") + #intentionally break fontconfig, forcing bitmap fonts + os.environ["FONTCONFIG_FILE"] = "nonexistent" + + # if args received, launch + if len(sys.argv) != 1 and not args.showgui: + import tkinter as tk + root = tk.Tk() #we dont want the useless window to be visible, but we want it in taskbar + root.attributes("-alpha", 0) + args.model_param = zentk_askopenfilename(title="Select ggml model .bin or .gguf file or .kcpps config") + root.withdraw() + root.quit() + if args.model_param and args.model_param!="" and (args.model_param.lower().endswith('.kcpps') or args.model_param.lower().endswith('.kcppt') or args.model_param.lower().endswith('.kcpps?download=true') or args.model_param.lower().endswith('.kcppt?download=true')): + dlfile = download_model_from_url(args.model_param,[".kcpps",".kcppt"]) # maybe download from url + if dlfile: + args.model_param = dlfile + load_config_cli(args.model_param) + if not args.model_param and not args.sdmodel and not args.whispermodel and not args.ttsmodel and not args.embeddingsmodel and not args.nomodel: + global exitcounter + exitcounter = 999 + exit_with_error(2,"No gguf model or kcpps file was selected. Exiting.") + return + + #dummy line to get darkdetect imported in pyinstaller + try: + import darkdetect as darkdt + darkdt.isDark() + pass + except Exception: + pass + import customtkinter as ctk nextstate = 0 #0=exit, 1=launch - corrupt_scaler = get_problematic_scaler() - original_windowwidth = int(860 if corrupt_scaler else 584) - original_windowheight = int(740 if corrupt_scaler else 584) + original_windowwidth = int(584) + original_windowheight = int(584) windowwidth = original_windowwidth windowheight = original_windowheight ctk.set_appearance_mode("dark") @@ -5084,8 +5089,6 @@ def show_gui(): windowwidth = max(256, min(1024, windowwidth)) windowheight = math.floor(original_windowheight*smallratio) windowheight = max(256, min(1024, windowheight)) - if corrupt_scaler: - smallratio = min(smallratio, 1)*0.98 #don't allow scaling beyond normal if resizing_id2: root.after_cancel(resizing_id2) resizing_id2 = None @@ -5132,7 +5135,7 @@ def show_gui(): tabs.grid(row=0, stick="nsew") tabnames= ["Quick Launch", "Hardware", "Tokens", "Loaded Files", "Network", "Horde Worker","Image Gen","Audio","Admin","Extra"] navbuttons = {} - navbuttonframe = ctk.CTkFrame(tabs, width=int(160 if corrupt_scaler else 100), height=int(tabs.cget("height"))) + navbuttonframe = ctk.CTkFrame(tabs, width=int(100), height=int(tabs.cget("height"))) navbuttonframe.grid(row=0, column=0, padx=2,pady=2) navbuttonframe.grid_propagate(False) @@ -5380,8 +5383,8 @@ def show_gui(): button = ctk.CTkButton(parent, 50, text="Browse", command= lambda a=var,b=searchtext:getfilename(a,b)) if singlerow: if singlecol: - entry.grid(row=row, column=0, padx=((194 if corrupt_scaler else 94)+8), pady=2, stick="w") - button.grid(row=row, column=0, padx=((194 if corrupt_scaler else 94)+width+12), pady=2, stick="w") + entry.grid(row=row, column=0, padx=((94)+8), pady=2, stick="w") + button.grid(row=row, column=0, padx=((94)+width+12), pady=2, stick="w") else: entry.grid(row=row, column=1, padx=8, pady=2, stick="w") button.grid(row=row, column=1, padx=(width+12), pady=2, stick="w") @@ -5885,12 +5888,12 @@ def show_gui(): # context size makeslider(tokens_tab, "Context Size:",contextsize_text, context_var, 0, len(contextsize_text)-1, 18, width=280, set=7,tooltip="What is the maximum context size to support. Model specific. You cannot exceed it.\nLarger contexts require more memory, and not all models support it.") context_var.trace_add("write", changed_gpulayers_estimate) - makelabelentry(tokens_tab, "Default Gen Amt:", defaultgenamt_var, row=20, padx=(220 if corrupt_scaler else 120), singleline=True, tooltip="How many tokens to generate by default, if not specified. Must be smaller than context size. Usually, your frontend GUI will override this.") - makelabelentry(tokens_tab, "Prompt Limit:", genlimit_var, row=20, padx=(460 if corrupt_scaler else 300), singleline=True, tooltip="If set, restricts max output tokens to this limit regardless of API request. Set to 0 to disable.",labelpadx=(300 if corrupt_scaler else 210)) + makelabelentry(tokens_tab, "Default Gen Amt:", defaultgenamt_var, row=20, padx=(120), singleline=True, tooltip="How many tokens to generate by default, if not specified. Must be smaller than context size. Usually, your frontend GUI will override this.") + makelabelentry(tokens_tab, "Prompt Limit:", genlimit_var, row=20, padx=(300), singleline=True, tooltip="If set, restricts max output tokens to this limit regardless of API request. Set to 0 to disable.",labelpadx=(210)) - nativectx_entry, nativectx_label = makelabelentry(tokens_tab, "Override Native Context:", customrope_nativectx, row=23, padx=(246 if corrupt_scaler else 146), singleline=True, tooltip="Overrides the native trained context of the loaded model with a custom value to be used for Rope scaling.") - customrope_scale_entry, customrope_scale_label = makelabelentry(tokens_tab, "RoPE Scale:", customrope_scale, row=23, padx=(160 if corrupt_scaler else 100), singleline=True, tooltip="For Linear RoPE scaling. RoPE frequency scale.") - customrope_base_entry, customrope_base_label = makelabelentry(tokens_tab, "Base:", customrope_base, row=23, padx=(420 if corrupt_scaler else 220), singleline=True, tooltip="For NTK Aware Scaling. RoPE frequency base.",labelpadx=(280 if corrupt_scaler else 180)) + nativectx_entry, nativectx_label = makelabelentry(tokens_tab, "Override Native Context:", customrope_nativectx, row=23, padx=(146), singleline=True, tooltip="Overrides the native trained context of the loaded model with a custom value to be used for Rope scaling.") + customrope_scale_entry, customrope_scale_label = makelabelentry(tokens_tab, "RoPE Scale:", customrope_scale, row=23, padx=(100), singleline=True, tooltip="For Linear RoPE scaling. RoPE frequency scale.") + customrope_base_entry, customrope_base_label = makelabelentry(tokens_tab, "Base:", customrope_base, row=23, padx=(220), singleline=True, tooltip="For NTK Aware Scaling. RoPE frequency base.",labelpadx=(180)) def togglerope(a,b,c): manualropebox.grid_remove() nativectx_label.grid_remove() @@ -5900,17 +5903,17 @@ def show_gui(): customrope_base_label.grid_remove() customrope_base_entry.grid_remove() if customrope_var.get() == 1: - manualropebox.grid(row=22, column=0,padx=(300 if corrupt_scaler else 200), pady=1, stick="nw") + manualropebox.grid(row=22, column=0,padx=(200), pady=1, stick="nw") if manualrope_var.get() == 1: customrope_scale_label.grid(row=23, column=0, padx=8, pady=1, stick="nw") - customrope_scale_entry.grid(row=23, column=0, padx=(160 if corrupt_scaler else 100), pady=1, stick="nw") - customrope_base_label.grid(row=23, column=0, padx=(280 if corrupt_scaler else 180), pady=1, stick="nw") - customrope_base_entry.grid(row=23, column=0, padx=(420 if corrupt_scaler else 220), pady=1, stick="nw") + customrope_scale_entry.grid(row=23, column=0, padx=(100), pady=1, stick="nw") + customrope_base_label.grid(row=23, column=0, padx=(180), pady=1, stick="nw") + customrope_base_entry.grid(row=23, column=0, padx=(220), pady=1, stick="nw") else: nativectx_label.grid(row=23, column=0, padx=8, pady=1, stick="nw") - nativectx_entry.grid(row=23, column=0, padx=(246 if corrupt_scaler else 146), pady=1, stick="nw") + nativectx_entry.grid(row=23, column=0, padx=(146), pady=1, stick="nw") - manualropebox = makecheckbox(tokens_tab, "Manual Rope Scale", variable=manualrope_var, row=22, command=togglerope, padx=(300 if corrupt_scaler else 200), tooltiptxt="Set RoPE base and scale manually.") + manualropebox = makecheckbox(tokens_tab, "Manual Rope Scale", variable=manualrope_var, row=22, command=togglerope, padx=(200), tooltiptxt="Set RoPE base and scale manually.") makecheckbox(tokens_tab, "Custom RoPE Config", variable=customrope_var, row=22, command=togglerope,tooltiptxt="Override the default RoPE configuration with custom RoPE scaling.") makecheckbox(tokens_tab, "Use FlashAttention", flashattention_var, 28, command=toggleflashattn, tooltiptxt="Enable flash attention for GGUF models.") @@ -5919,7 +5922,7 @@ def show_gui(): qkvslider,qkvlabel,qkvtitle = makeslider(tokens_tab, "Quantize KV Cache:", quantkv_text, quantkv_var, 0, 2, 30, set=0,tooltip="Enable quantization of KV cache.\nRequires FlashAttention for full effect, otherwise only K cache is quantized.") quantkv_var.trace_add("write", toggleflashattn) makecheckbox(tokens_tab, "No BOS Token", nobostoken_var, 43, tooltiptxt="Prevents BOS token from being added at the start of any prompt. Usually NOT recommended for most models.") - makecheckbox(tokens_tab, "Enable Guidance", enableguidance_var, 43,padx=(200 if corrupt_scaler else 140), tooltiptxt="Enables the use of Classifier-Free-Guidance, which allows the use of negative prompts. Has performance and memory impact.") + makecheckbox(tokens_tab, "Enable Guidance", enableguidance_var, 43,padx=(140), tooltiptxt="Enables the use of Classifier-Free-Guidance, which allows the use of negative prompts. Has performance and memory impact.") def togglejinja(a,b,c): if jinja_var.get()==1: jinjatoolsbox.grid() @@ -5928,30 +5931,30 @@ def show_gui(): jinjatoolsbox.grid_remove() changed_gpulayers_estimate() makecheckbox(tokens_tab, "Use Jinja", jinja_var, row=45, command=togglejinja, tooltiptxt="Enables using jinja chat template formatting for chat completions endpoint. Other endpoints are unaffected.") - jinjatoolsbox = makecheckbox(tokens_tab, "Jinja for Tools", jinja_tools_var, row=45 ,padx=(200 if corrupt_scaler else 140), tooltiptxt="Allows jinja even with tool calls. If unchecked, jinja will be disabled when tools are used.") + jinjatoolsbox = makecheckbox(tokens_tab, "Jinja for Tools", jinja_tools_var, row=45 ,padx=(140), tooltiptxt="Allows jinja even with tool calls. If unchecked, jinja will be disabled when tools are used.") jinja_var.trace_add("write", togglejinja) - makelabelentry(tokens_tab, "MoE Experts:", moeexperts_var, row=55, padx=(220 if corrupt_scaler else 120), singleline=True, tooltip="Override number of MoE experts.") - makelabelentry(tokens_tab, "MoE CPU Layers:", moecpu_var, row=55, padx=(490 if corrupt_scaler else 320), singleline=True, tooltip="Force Mixture of Experts (MoE) weights of the first N layers to the CPU.\nSetting it higher than GPU layers has no effect.", labelpadx=(300 if corrupt_scaler else 210)) - makelabelentry(tokens_tab, "Override KV:", override_kv_var, row=57, padx=(220 if corrupt_scaler else 120), singleline=True, width=150, tooltip="Override metadata value by key. Separate multiple values with commas. Format is name=type:value. Types: int, float, bool, str") - makelabelentry(tokens_tab, "Override Tensors:", override_tensors_var, row=59, padx=(220 if corrupt_scaler else 120), singleline=True, width=150, tooltip="Override selected backend for specific tensors matching tensor_name_regex_pattern=buffer_type, same as in llama.cpp.") + makelabelentry(tokens_tab, "MoE Experts:", moeexperts_var, row=55, padx=(120), singleline=True, tooltip="Override number of MoE experts.") + makelabelentry(tokens_tab, "MoE CPU Layers:", moecpu_var, row=55, padx=(320), singleline=True, tooltip="Force Mixture of Experts (MoE) weights of the first N layers to the CPU.\nSetting it higher than GPU layers has no effect.", labelpadx=(210)) + makelabelentry(tokens_tab, "Override KV:", override_kv_var, row=57, padx=(120), singleline=True, width=150, tooltip="Override metadata value by key. Separate multiple values with commas. Format is name=type:value. Types: int, float, bool, str") + makelabelentry(tokens_tab, "Override Tensors:", override_tensors_var, row=59, padx=(120), singleline=True, width=150, tooltip="Override selected backend for specific tensors matching tensor_name_regex_pattern=buffer_type, same as in llama.cpp.") # Model Tab model_tab = tabcontent["Loaded Files"] makefileentry(model_tab, "Text Model:", "Select GGUF or GGML Model File", model_var, 1,width=205,singlerow=True, onchoosefile=on_picked_model_file,tooltiptxt="Select a GGUF or GGML model file on disk to be loaded.") - ctk.CTkButton(model_tab, width=70, text = "HF Search", command = model_searcher ).grid(row=1,column=0, stick="nw", padx=(520 if corrupt_scaler else 370), pady=2) + ctk.CTkButton(model_tab, width=70, text = "HF Search", command = model_searcher ).grid(row=1,column=0, stick="nw", padx=(370), pady=2) makefileentry(model_tab, "Text Lora:", "Select Lora File",lora_var, 3,width=160,singlerow=True,tooltiptxt="Select an optional GGML Text LoRA adapter to use.\nLeave blank to skip.") - makelabelentry(model_tab, "Multiplier: ", loramult_var, 3, 50,padx=(580 if corrupt_scaler else 390),singleline=True,tooltip="Scale multiplier for Text LoRA Strength. Default is 1.0", labelpadx=(470 if corrupt_scaler else 330)) + makelabelentry(model_tab, "Multiplier: ", loramult_var, 3, 50,padx=(390),singleline=True,tooltip="Scale multiplier for Text LoRA Strength. Default is 1.0", labelpadx=(330)) makefileentry(model_tab, "Mmproj File:", "Select Audio or Vision mmproj File", mmproj_var, 7,width=280,singlerow=True,tooltiptxt="Select a mmproj file to use for multimodal models for vision and audio recognition.\nLeave blank to skip.") makecheckbox(model_tab, "Vision Force CPU", mmprojcpu_var, 9, tooltiptxt="Force CLIP for Vision mmproj always on CPU.") - makelabelentry(model_tab, "Vision MaxRes:", visionmaxres_var, 9, padx=(450 if corrupt_scaler else 320), singleline=True, tooltip=f"Clamp MMProj vision maximum allowed resolution. Allowed values are between 512 to 2048 px (default {default_visionmaxres}).", labelpadx=(260 if corrupt_scaler else 220)) + makelabelentry(model_tab, "Vision MaxRes:", visionmaxres_var, 9, padx=(320), singleline=True, tooltip=f"Clamp MMProj vision maximum allowed resolution. Allowed values are between 512 to 2048 px (default {default_visionmaxres}).", labelpadx=(220)) makefileentry(model_tab, "Draft Model:", "Select Speculative Text Model File", draftmodel_var, 11,width=280,singlerow=True,tooltiptxt="Select a draft text model file to use for speculative decoding.\nLeave blank to skip.") - makelabelentry(model_tab, "Draft Amount: ", draftamount_var, 13, 50,padx=(170 if corrupt_scaler else 100),singleline=True,tooltip="How many tokens to draft per chunk before verifying results") - makelabelentry(model_tab, "Splits: ", draftgpusplit_str_vars, 13, 50,padx=(320 if corrupt_scaler else 210),singleline=True,tooltip="Distribution of draft model layers. Leave blank to follow main model's gpu split. Only works if multi-gpu (All) selected in main model.", labelpadx=(260 if corrupt_scaler else 160)) - makelabelentry(model_tab, "Layers: ", draftgpulayers_var, 13, 50,padx=(470 if corrupt_scaler else 320),singleline=True,tooltip="How many layers to GPU offload for the draft model", labelpadx=(390 if corrupt_scaler else 270)) + makelabelentry(model_tab, "Draft Amount: ", draftamount_var, 13, 50,padx=(100),singleline=True,tooltip="How many tokens to draft per chunk before verifying results") + makelabelentry(model_tab, "Splits: ", draftgpusplit_str_vars, 13, 50,padx=(210),singleline=True,tooltip="Distribution of draft model layers. Leave blank to follow main model's gpu split. Only works if multi-gpu (All) selected in main model.", labelpadx=(160)) + makelabelentry(model_tab, "Layers: ", draftgpulayers_var, 13, 50,padx=(320),singleline=True,tooltip="How many layers to GPU offload for the draft model", labelpadx=(270)) makefileentry(model_tab, "Embeds Model:", "Select Embeddings Model File", embeddings_model_var, 15, width=130,singlerow=True, filetypes=[("*.gguf","*.gguf")], tooltiptxt="Select an embeddings GGUF model that can be used to generate embedding vectors.") - makelabelentry(model_tab, "ECtx: ", embeddings_ctx_var, 15, 50,padx=(490 if corrupt_scaler else 335),singleline=True,tooltip="If set above 0, limits max context for embedding model to save memory.", labelpadx=(442 if corrupt_scaler else 302)) - makecheckbox(model_tab, "GPU", embeddings_gpu_var, 15, 0,padx=(560 if corrupt_scaler else 390),tooltiptxt="Uses the GPU for Embeddings.") + makelabelentry(model_tab, "ECtx: ", embeddings_ctx_var, 15, 50,padx=(335),singleline=True,tooltip="If set above 0, limits max context for embedding model to save memory.", labelpadx=(302)) + makecheckbox(model_tab, "GPU", embeddings_gpu_var, 15, 0,padx=(390),tooltiptxt="Uses the GPU for Embeddings.") embeddings_gpu_var.trace_add("write", gui_changed_modelfile) makefileentry(model_tab, "Preload Story:", "Select Preloaded Story File", preloadstory_var, 17,width=280,singlerow=True,tooltiptxt="Select an optional KoboldAI JSON savefile \nto be served on launch to any client.") makefileentry(model_tab, "SaveData File:", "Select or Create New SaveData Database File", savedatafile_var, 19,width=280,filetypes=[("KoboldCpp SaveDB", "*.jsondb")],singlerow=True,dialog_type=1,tooltiptxt="Selecting a file will allow data to be loaded and saved persistently to this KoboldCpp server remotely. File is created if it does not exist.") @@ -5962,7 +5965,7 @@ def show_gui(): fnam = zentk_askopenfilename(title="Pick Premade ChatCompletions Adapter",filetypes=[("JSON Adapter", "*.json")], initialdir=initialDir) if fnam: chatcompletionsadapter_var.set(fnam) - ctk.CTkButton(model_tab, 64, text="Pick Premade", command=pickpremadetemplate).grid(row=25, column=0, padx=(422 if corrupt_scaler else 322), pady=2, stick="nw") + ctk.CTkButton(model_tab, 64, text="Pick Premade", command=pickpremadetemplate).grid(row=25, column=0, padx=(322), pady=2, stick="nw") mmproj_var.trace_add("write", gui_changed_modelfile) draftmodel_var.trace_add("write", gui_changed_modelfile) @@ -6021,15 +6024,15 @@ def show_gui(): images_tab = tabcontent["Image Gen"] makefileentry(images_tab, "Image Gen. Model (safetensors/gguf):", "Select Image Gen Model File", sd_model_var, 1, width=280, singlecol=True, filetypes=[("*.safetensors *.gguf","*.safetensors *.gguf")], tooltiptxt="Select a .safetensors or .gguf Image Generation model file on disk to be loaded.") - makelabelentry(images_tab, "Clamp Resolution Limit (Hard):", sd_clamped_var, 4, 50, padx=(340 if corrupt_scaler else 190),singleline=True,tooltip="Limit generation steps and output image size for shared use.\nSet to 0 to disable, otherwise value is clamped to the max size limit (min 512px).") - makelabelentry(images_tab, "(Soft):", sd_clamped_soft_var, 4, 50, padx=(490 if corrupt_scaler else 290),singleline=True,tooltip="Square image size restriction, to protect the server against memory crashes.\nAllows width-height tradeoffs, eg. 640 allows 640x640 and 512x768\nLeave at 0 for the default value: 832 for SD1.5/SD2, 1024 otherwise.",labelpadx=(450 if corrupt_scaler else 250)) - makelabelentry(images_tab, "ImgThreads:" , sd_threads_var, 8, 50,padx=(490 if corrupt_scaler else 290),singleline=True,tooltip="How many threads to use during image generation.\nIf left blank, uses same value as threads.",labelpadx=(350 if corrupt_scaler else 210)) + makelabelentry(images_tab, "Clamp Resolution Limit (Hard):", sd_clamped_var, 4, 50, padx=(190),singleline=True,tooltip="Limit generation steps and output image size for shared use.\nSet to 0 to disable, otherwise value is clamped to the max size limit (min 512px).") + makelabelentry(images_tab, "(Soft):", sd_clamped_soft_var, 4, 50, padx=(290),singleline=True,tooltip="Square image size restriction, to protect the server against memory crashes.\nAllows width-height tradeoffs, eg. 640 allows 640x640 and 512x768\nLeave at 0 for the default value: 832 for SD1.5/SD2, 1024 otherwise.",labelpadx=(250)) + makelabelentry(images_tab, "ImgThreads:" , sd_threads_var, 8, 50,padx=(290),singleline=True,tooltip="How many threads to use during image generation.\nIf left blank, uses same value as threads.",labelpadx=(210)) sd_model_var.trace_add("write", gui_changed_modelfile) - makelabelcombobox(images_tab, "Compress Weights: ", sd_quant_var, 8, width=(80 if corrupt_scaler else 60), padx=(226 if corrupt_scaler else 126), labelpadx=8, tooltiptxt="Quantizes the SD model weights to save memory.\nHigher levels save more memory, and cause more quality degradation.", values=sd_quant_choices) + makelabelcombobox(images_tab, "Compress Weights: ", sd_quant_var, 8, width=(60), padx=(126), labelpadx=8, tooltiptxt="Quantizes the SD model weights to save memory.\nHigher levels save more memory, and cause more quality degradation.", values=sd_quant_choices) sd_quant_var.trace_add("write", changed_gpulayers_estimate) makefileentry(images_tab, "Image LoRA:", "Select SD lora file",sd_lora_var, 20, width=160, singlerow=True, filetypes=[("*.safetensors *.gguf", "*.safetensors *.gguf")],tooltiptxt="Select a .safetensors or .gguf SD LoRA model file to be loaded. Should be unquantized!") - makelabelentry(images_tab, "Multiplier:" , sd_loramult_var, 20, 50,padx=(580 if corrupt_scaler else 390),singleline=True,tooltip="What mutiplier value to apply the SD LoRA with.",labelpadx=(460 if corrupt_scaler else 330)) + makelabelentry(images_tab, "Multiplier:" , sd_loramult_var, 20, 50,padx=(390),singleline=True,tooltip="What mutiplier value to apply the SD LoRA with.",labelpadx=(330)) makefileentry(images_tab, "T5-XXL File:", "Select T5-XXL model file (SD3, Flux, WAN)",sd_t5xxl_var, 24, width=280, singlerow=True, filetypes=[("*.safetensors *.gguf","*.safetensors *.gguf")],tooltiptxt="Select a .safetensors t5xxl file to be loaded.") makefileentry(images_tab, "Clip-1 File:", "Select First Clip model file (Clip-L for SD3 or Flux, or other vision encoder)",sd_clip1_var, 26, width=280, singlerow=True, filetypes=[("*.safetensors *.gguf","*.safetensors *.gguf")],tooltiptxt="Select a .safetensors Clip-1 file to be loaded.\nThis is Clip-L for SD3 and Flux, Clip Vision for WAN, and Qwen2.5VL for QwenImage") @@ -6048,13 +6051,13 @@ def show_gui(): sdvaeitem2.grid() sdvaeitem3.grid() makecheckbox(images_tab, "TAE SD (AutoFix Broken VAE)", sd_vaeauto_var, 42,command=toggletaesd,tooltiptxt="Replace VAE with TAESD. May fix bad VAE.") - makelabelcombobox(images_tab, "Conv2D Direct:", sd_convdirect_var, row=42, labelpadx=(390 if corrupt_scaler else 220), padx=(550 if corrupt_scaler else 310), width=90, tooltiptxt="Use Conv2D Direct operation. May save memory or improve performance.\nMight crash if not supported by the backend.\n", values=sd_convdirect_choices) - makelabelentry(images_tab, "VAE Tiling Threshold:", sd_tiled_vae_var, 44, 50, padx=(254 if corrupt_scaler else 144),singleline=True,tooltip="Enable VAE Tiling for images above this size, to save memory.\nSet to 0 to disable VAE tiling.") - makecheckbox(images_tab, "SD Flash Attention", sd_flash_attention_var, 44,padx=(400 if corrupt_scaler else 230), tooltiptxt="Enable Flash Attention for image diffusion. May save memory or improve performance.") + makelabelcombobox(images_tab, "Conv2D Direct:", sd_convdirect_var, row=42, labelpadx=(220), padx=(310), width=90, tooltiptxt="Use Conv2D Direct operation. May save memory or improve performance.\nMight crash if not supported by the backend.\n", values=sd_convdirect_choices) + makelabelentry(images_tab, "VAE Tiling Threshold:", sd_tiled_vae_var, 44, 50, padx=(144),singleline=True,tooltip="Enable VAE Tiling for images above this size, to save memory.\nSet to 0 to disable VAE tiling.") + makecheckbox(images_tab, "SD Flash Attention", sd_flash_attention_var, 44,padx=(230), tooltiptxt="Enable Flash Attention for image diffusion. May save memory or improve performance.") makecheckbox(images_tab, "Model CPU Offload", sd_offload_cpu_var, 50,padx=8, tooltiptxt="Offload image weights in RAM to save VRAM, swap into VRAM when needed.") - makecheckbox(images_tab, "VAE on CPU", sd_vae_cpu_var, 50,padx=(270 if corrupt_scaler else 160), tooltiptxt="Force VAE to CPU only for image generation.") - makecheckbox(images_tab, "CLIP on GPU", sd_clip_gpu_var, 50,padx=(480 if corrupt_scaler else 280), tooltiptxt="Put CLIP and T5 to GPU for image generation. Otherwise, CLIP will use CPU.") - makelabelentry(images_tab, "Default Params:", sd_gen_defaults_var, 52, 280, padx=(220 if corrupt_scaler else 110), singleline=True, tooltip='Default image generation parameters when not specified by the UI or API.\nSpecified as JSON fields: {"KEY1":"VALUE1", "KEY2":"VALUE2"...}') + makecheckbox(images_tab, "VAE on CPU", sd_vae_cpu_var, 50,padx=(160), tooltiptxt="Force VAE to CPU only for image generation.") + makecheckbox(images_tab, "CLIP on GPU", sd_clip_gpu_var, 50,padx=(280), tooltiptxt="Put CLIP and T5 to GPU for image generation. Otherwise, CLIP will use CPU.") + makelabelentry(images_tab, "Default Params:", sd_gen_defaults_var, 52, 280, padx=(110), singleline=True, tooltip='Default image generation parameters when not specified by the UI or API.\nSpecified as JSON fields: {"KEY1":"VALUE1", "KEY2":"VALUE2"...}') # audio tab audio_tab = tabcontent["Audio"] @@ -6078,7 +6081,7 @@ def show_gui(): autopath = os.path.dirname(autopath) admin_dir_var.set(autopath) makecheckbox(admin_tab, "Enable Model Administration", admin_var, 1, 0, command=toggleadmin,tooltiptxt="Enable a admin server, allowing you to remotely relaunch and swap models and configs.") - makelabelentry(admin_tab, "Admin Password:" , admin_password_var, 3, 150,padx=(220 if corrupt_scaler else 120),singleline=True,tooltip="Require a password to access admin functions. You are strongly advised to use one for publically accessible instances!") + makelabelentry(admin_tab, "Admin Password:" , admin_password_var, 3, 150,padx=(120),singleline=True,tooltip="Require a password to access admin functions. You are strongly advised to use one for publically accessible instances!") makefileentry(admin_tab, "Config Directory (Required):", "Select directory containing .gguf or .kcpps files to relaunch from", admin_dir_var, 5, width=280, dialog_type=2, tooltiptxt="Specify a directory to look for .kcpps configs in, which can be used to swap models.") makecheckbox(admin_tab, "SingleInstance Mode", singleinstance_var, 10, 0,tooltiptxt="Allows this server to be shut down by another KoboldCpp instance with singleinstance starting on the same port.") @@ -6105,15 +6108,15 @@ def show_gui(): # extra tab extra_tab = tabcontent["Extra"] makelabel(extra_tab, "Extract KoboldCpp Files", 3, 0,tooltiptxt="Unpack KoboldCpp to a local directory to modify its files. You can also launch via koboldcpp.py for faster startup.") - ctk.CTkButton(extra_tab , text = "Unpack KoboldCpp To Folder", command = unpack_to_dir ).grid(row=3,column=0, stick="w", padx=(300 if corrupt_scaler else 170), pady=2) + ctk.CTkButton(extra_tab , text = "Unpack KoboldCpp To Folder", command = unpack_to_dir ).grid(row=3,column=0, stick="w", padx=(170), pady=2) makelabel(extra_tab, "Export as .kcppt template", 4, 0,tooltiptxt="Creates a KoboldCpp launch template for others to use.\nEmbeds JSON files directly into exported file when saving.\nWhen loaded, forces the backend to be automatically determined.\nWarning! Not recommended for beginners!") - ctk.CTkButton(extra_tab , text = "Generate LaunchTemplate", command = kcpp_export_template ).grid(row=4,column=0, stick="w", padx=(300 if corrupt_scaler else 170), pady=2) + ctk.CTkButton(extra_tab , text = "Generate LaunchTemplate", command = kcpp_export_template ).grid(row=4,column=0, stick="w", padx=(170), pady=2) makelabel(extra_tab, "Analyze GGUF Metadata", 6, 0,tooltiptxt="Reads the metadata, weight types and tensor names in any GGUF file.") - ctk.CTkButton(extra_tab , text = "Analyze GGUF", command = analyze_gguf_model_wrapper ).grid(row=6,column=0, stick="w", padx=(300 if corrupt_scaler else 170), pady=2) + ctk.CTkButton(extra_tab , text = "Analyze GGUF", command = analyze_gguf_model_wrapper ).grid(row=6,column=0, stick="w", padx=(170), pady=2) if os.name == 'nt': makelabel(extra_tab, "File Extensions Handler", 10, 0,tooltiptxt="Makes KoboldCpp the default handler for .kcpps, .kcppt, .ggml and .gguf files.") - ctk.CTkButton(extra_tab , text = "Register", width=90, command = register_koboldcpp ).grid(row=10,column=0, stick="w", padx= (300 if corrupt_scaler else 170), pady=2) - ctk.CTkButton(extra_tab , text = "Unregister", width=90, command = unregister_koboldcpp ).grid(row=10,column=0, stick="w", padx= (434 if corrupt_scaler else 264), pady=2) + ctk.CTkButton(extra_tab , text = "Register", width=90, command = register_koboldcpp ).grid(row=10,column=0, stick="w", padx= (170), pady=2) + ctk.CTkButton(extra_tab , text = "Unregister", width=90, command = unregister_koboldcpp ).grid(row=10,column=0, stick="w", padx= (264), pady=2) if sys.platform == "linux": def togglezenity(a,b,c): global zenity_permitted @@ -6655,12 +6658,12 @@ def show_gui(): def display_updates(): LaunchWebbrowser("https://github.com/LostRuins/koboldcpp/releases/latest","Cannot launch updates in browser.") - ctk.CTkButton(tabs , text = "Launch", fg_color="#2f8d3c", hover_color="#2faa3c", command = guilaunch, width=80, height = 35 ).grid(row=1,column=1, stick="se", padx=(170 if corrupt_scaler else 25), pady=5) + ctk.CTkButton(tabs , text = "Launch", fg_color="#2f8d3c", hover_color="#2faa3c", command = guilaunch, width=80, height = 35 ).grid(row=1,column=1, stick="se", padx=(25), pady=5) ctk.CTkButton(tabs , text = "Update", fg_color="#9900cc", hover_color="#aa11dd", command = display_updates, width=90, height = 35 ).grid(row=1,column=0, stick="sw", padx= 5, pady=5) ctk.CTkButton(tabs , text = "Save Config", fg_color="#084a66", hover_color="#085a88", command = save_config_gui, width=60, height = 35 ).grid(row=1,column=1, stick="sw", padx= 5, pady=5) - ctk.CTkButton(tabs , text = "Load Config", fg_color="#084a66", hover_color="#085a88", command = load_config_gui, width=60, height = 35 ).grid(row=1,column=1, stick="sw", padx= (152 if corrupt_scaler else 92), pady=5) - ctk.CTkButton(tabs , text = "Help (Find Models)", fg_color="#992222", hover_color="#bb3333", command = display_help_models, width=100, height = 35 ).grid(row=1,column=1, stick="sw", padx= (300 if corrupt_scaler else 180), pady=5) + ctk.CTkButton(tabs , text = "Load Config", fg_color="#084a66", hover_color="#085a88", command = load_config_gui, width=60, height = 35 ).grid(row=1,column=1, stick="sw", padx= (92), pady=5) + ctk.CTkButton(tabs , text = "Help (Find Models)", fg_color="#992222", hover_color="#bb3333", command = display_help_models, width=100, height = 35 ).grid(row=1,column=1, stick="sw", padx= (180), pady=5) # start a thread that tries to get actual gpu names and layer counts gpuinfo_thread = threading.Thread(target=auto_set_backend_gui)