--- datasets: - TeichAI/gpt-5.1-codex-max-1000x - TeichAI/gpt-5.1-high-reasoning-1000x base_model: - openai-community/gpt2-medium --- Below is a standalone Python GUI application that loads the gss1147/GPT5.1-high-reasoning-codex-0.4B model from Hugging Face and provides a simple interface for text generation. The GUI is built with tkinter and uses transformers and torch for model inference. Generation runs in a separate thread to keep the interface responsive. Features · Load the model once at startup. · Input text box for user prompts. · Adjustable generation parameters: max new tokens, temperature, top‑p, and repetition penalty. · Generate button with a progress indicator (text changes to "Generating..." while busy). · Output displayed in a scrollable text area. · Error handling for missing dependencies and CUDA issues. Requirements Install the required packages before running the script: ```bash pip install transformers torch ``` (If you have a GPU, ensure you install the appropriate version of PyTorch with CUDA support. The script will automatically use GPU if available.) The Code ```python import tkinter as tk from tkinter import scrolledtext, messagebox, ttk import threading import torch from transformers import AutoModelForCausalLM, AutoTokenizer # Model name MODEL_NAME = "gss1147/GPT5.1-high-reasoning-codex-0.4B" # Global variables for model and tokenizer (loaded once) model = None tokenizer = None def load_model(): """Load the model and tokenizer from Hugging Face.""" global model, tokenizer try: # Show loading message in the GUI (if root already exists) if 'root' in globals(): status_label.config(text="Loading model... This may take a while.") root.update() device = "cuda" if torch.cuda.is_available() else "cpu" tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, torch_dtype=torch.float16 if device == "cuda" else torch.float32, device_map="auto" if device == "cuda" else None ) if device == "cpu": model.to(device) model.eval() if 'root' in globals(): status_label.config(text="Model loaded. Ready.") generate_button.config(state=tk.NORMAL) except Exception as e: messagebox.showerror("Error", f"Failed to load model:\n{e}") if 'root' in globals(): status_label.config(text="Loading failed.") raise def generate_text(): """Start generation in a separate thread.""" thread = threading.Thread(target=generate_thread) thread.start() def generate_thread(): """Run generation and update the GUI when done.""" # Disable the generate button and show progress generate_button.config(state=tk.DISABLED, text="Generating...") status_label.config(text="Generating...") root.update() try: # Get parameters from the GUI prompt = input_text.get("1.0", tk.END).strip() if not prompt: messagebox.showwarning("Warning", "Please enter a prompt.") return max_new = int(max_new_tokens_var.get()) temp = float(temperature_var.get()) top_p_val = float(top_p_var.get()) rep_penalty = float(rep_penalty_var.get()) # Tokenize input inputs = tokenizer(prompt, return_tensors="pt").to(model.device) # Generate with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=max_new, temperature=temp, top_p=top_p_val, repetition_penalty=rep_penalty, do_sample=True, pad_token_id=tokenizer.eos_token_id ) # Decode and display generated = tokenizer.decode(outputs[0], skip_special_tokens=True) # Remove the input prompt from the output if desired if generated.startswith(prompt): generated = generated[len(prompt):].lstrip() # Update output in GUI (thread-safe via after) root.after(0, lambda: display_output(generated)) except Exception as e: root.after(0, lambda: messagebox.showerror("Error", f"Generation failed:\n{e}")) finally: # Re-enable button and reset status root.after(0, lambda: generate_button.config(state=tk.NORMAL, text="Generate")) root.after(0, lambda: status_label.config(text="Ready.")) def display_output(text): """Insert generated text into the output box.""" output_text.delete("1.0", tk.END) output_text.insert(tk.END, text) # ------------------- GUI Setup ------------------- root = tk.Tk() root.title("GPT-5.1 0.4B Text Generator") root.geometry("800x700") root.resizable(True, True) # Style root.option_add("*Font", "Arial 11") # Status bar at the top status_label = tk.Label(root, text="Initializing...", bd=1, relief=tk.SUNKEN, anchor=tk.W) status_label.pack(fill=tk.X, padx=5, pady=2) # Main frame main_frame = ttk.Frame(root, padding="10") main_frame.pack(fill=tk.BOTH, expand=True) # Input label and text area ttk.Label(main_frame, text="Input Prompt:").grid(row=0, column=0, sticky=tk.W, pady=5) input_text = scrolledtext.ScrolledText(main_frame, height=8, wrap=tk.WORD) input_text.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5) # Generation parameters param_frame = ttk.LabelFrame(main_frame, text="Generation Parameters", padding="10") param_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10) # Max new tokens ttk.Label(param_frame, text="Max New Tokens:").grid(row=0, column=0, sticky=tk.W, padx=5) max_new_tokens_var = tk.StringVar(value="100") ttk.Entry(param_frame, textvariable=max_new_tokens_var, width=8).grid(row=0, column=1, sticky=tk.W) # Temperature ttk.Label(param_frame, text="Temperature:").grid(row=0, column=2, sticky=tk.W, padx=5) temperature_var = tk.StringVar(value="0.7") ttk.Entry(param_frame, textvariable=temperature_var, width=8).grid(row=0, column=3, sticky=tk.W) # Top-p ttk.Label(param_frame, text="Top-p:").grid(row=1, column=0, sticky=tk.W, padx=5) top_p_var = tk.StringVar(value="0.9") ttk.Entry(param_frame, textvariable=top_p_var, width=8).grid(row=1, column=1, sticky=tk.W) # Repetition penalty ttk.Label(param_frame, text="Rep. Penalty:").grid(row=1, column=2, sticky=tk.W, padx=5) rep_penalty_var = tk.StringVar(value="1.1") ttk.Entry(param_frame, textvariable=rep_penalty_var, width=8).grid(row=1, column=3, sticky=tk.W) # Generate button generate_button = ttk.Button(main_frame, text="Generate", command=generate_text, state=tk.DISABLED) generate_button.grid(row=3, column=0, pady=10) # Output label and text area ttk.Label(main_frame, text="Generated Output:").grid(row=4, column=0, sticky=tk.W, pady=5) output_text = scrolledtext.ScrolledText(main_frame, height=15, wrap=tk.WORD) output_text.grid(row=5, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5) # Configure grid weights so text areas expand main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(1, weight=1) main_frame.rowconfigure(5, weight=1) # Start loading the model in the background after GUI is up root.after(100, lambda: threading.Thread(target=load_model, daemon=True).start()) root.mainloop() ``` How to Use 1. Save the code as gpt_gui.py. 2. Install the dependencies: pip install transformers torch. 3. Run the script: python gpt_gui.py. 4. Wait for the model to load (a status bar shows progress). 5. Enter a prompt, adjust parameters if needed, and click Generate. 6. The generated text appears in the lower box. Notes · The model is about 0.4 B parameters, so it requires roughly 1–2 GB of RAM/VRAM. · If you have a GPU with sufficient memory, the script will automatically use it (via device_map="auto"). · Generation can take a few seconds to tens of seconds depending on your hardware and the number of tokens requested. · The GUI remains responsive during generation because the work is done in a separate thread. Enjoy experimenting with the model!