import gradio as gr import requests from PIL import Image from io import BytesIO import urllib.parse import spaces @spaces.GPU(duration=60) def generate_image(prompt: str, width: int = 1024, height: int = 1024, seed: int = -1): if not prompt or not prompt.strip(): return None, "Please enter a prompt." encoded_prompt = urllib.parse.quote(prompt.strip()) url = f"https://image.pollinations.ai/prompt/{encoded_prompt}" params = { "width": width, "height": height, "nologo": "true", "enhance": "true" } if seed != -1: params["seed"] = int(seed) try: response = requests.get(url, params=params, timeout=90) response.raise_for_status() image = Image.open(BytesIO(response.content)) return image, f"✅ Generated successfully\nPrompt: {prompt}" except Exception as e: return None, f"❌ Error: {str(e)}" with gr.Blocks(title="Image Generator") as demo: gr.Markdown(""" # 🎨 Image Generator Powered by **Pollinations.ai** - no API key needed. """) with gr.Row(): with gr.Column(scale=2): prompt = gr.Textbox( label="Prompt", placeholder="A cute cat wearing sunglasses, cyberpunk style...", lines=3 ) with gr.Row(): width = gr.Slider(512, 1280, value=1024, step=64, label="Width") height = gr.Slider(512, 1280, value=1024, step=64, label="Height") seed = gr.Number(value=-1, label="Seed (-1 = random)", precision=0) generate_btn = gr.Button("Generate Image", variant="primary") with gr.Column(scale=3): output_image = gr.Image(label="Generated Image", type="pil") status = gr.Textbox(label="Status", interactive=False) generate_btn.click( fn=generate_image, inputs=[prompt, width, height, seed], outputs=[output_image, status] ) prompt.submit( fn=generate_image, inputs=[prompt, width, height, seed], outputs=[output_image, status] ) if __name__ == "__main__": demo.launch(ssr_mode=False)