import gradio as gr import numpy as np import spaces import torch import random import os from PIL import Image # Import the pipeline from diffusers from diffusers import FluxKontextPipeline # --- Constants and Model Loading --- MAX_SEED = np.iinfo(np.int32).max # Load the pretrained model try: pipe = FluxKontextPipeline.from_pretrained( "black-forest-labs/FLUX.1-Kontext-dev", torch_dtype=torch.bfloat16, ).to("cuda") except Exception as e: pipe = None print(f"Warning: Could not load the model on CUDA. GPU is required. Error: {e}") # --- Core Inference Function for ChatInterface --- @spaces.GPU def chat_fn(message, chat_history, seed, randomize_seed, guidance_scale, steps, progress=gr.Progress(track_tqdm=True)): """ Performs image generation or editing based on user input from the chat interface. """ if pipe is None: raise gr.Error("Model could not be loaded. This could be due to no access to the model or no CUDA-enabled GPU.") prompt = message["text"] files = message["files"] if not prompt and not files: raise gr.Error("Please provide a prompt and/or upload an image.") if randomize_seed: seed = random.randint(0, MAX_SEED) generator = torch.Generator(device="cuda").manual_seed(int(seed)) input_image = None if files: print(f"Received image: {files[0]}") input_image = Image.open(files[0]).convert("RGB") image = pipe( image=input_image, prompt=prompt, guidance_scale=guidance_scale, num_inference_steps=steps, generator=generator, ).images[0] else: print(f"Received prompt for text-to-image: {prompt}") image = pipe( prompt=prompt, guidance_scale=guidance_scale, num_inference_steps=steps, generator=generator, ).images[0] return image # --- UI Definition using gr.ChatInterface --- seed_slider = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=42) randomize_checkbox = gr.Checkbox(label="Randomize seed", value=False) guidance_slider = gr.Slider(label="Guidance Scale", minimum=1.0, maximum=10.0, step=0.1, value=2.5) steps_slider = gr.Slider(label="Steps", minimum=1, maximum=30, value=28, step=1) # --- FIX 2: Remove examples with external URLs that cause 403 errors --- # Instead, provide text-only examples that work without external image dependencies examples = [ [ {"text": "A cute robot reading a book in a cozy library", "files": []}, 42, False, 2.5, 28 ], [ {"text": "A majestic lion standing on a rocky cliff at sunset", "files": []}, 12345, False, 3.0, 25 ], [ {"text": "A futuristic cityscape with flying cars and neon lights", "files": []}, 54321, False, 2.0, 30 ], ] demo = gr.ChatInterface( fn=chat_fn, title="FLUX.1 Kontext [dev]", description="""
A simple chat UI for the FLUX.1 Kontext model.
To edit an image, upload it and type your instructions (e.g., "Add a hat").
To generate an image, just type a prompt (e.g., "A photo of an astronaut on a horse").
Find the model on Hugging Face.