Spaces:
Runtime error
Runtime error
| import os | |
| import requests | |
| import gradio as gr | |
| from PIL import Image, ImageDraw, ImageFont | |
| import io | |
| import time | |
| # Configuration | |
| HF_API_TOKEN = os.environ.get("HF_API_TOKEN") | |
| MODEL_NAME = "stabilityai/stable-diffusion-xl-base-1.0" # High-quality model | |
| API_URL = f"https://api-inference.huggingface.co/models/{MODEL_NAME}" | |
| headers = {"Authorization": f"Bearer {HF_API_TOKEN}"} | |
| WATERMARK_TEXT = "SelamGPT" | |
| MAX_RETRIES = 3 | |
| def add_watermark(image_bytes): | |
| """Add watermark to generated image""" | |
| try: | |
| image = Image.open(io.BytesIO(image_bytes)).convert("RGB") | |
| draw = ImageDraw.Draw(image) | |
| # Use default font (no need for external files) | |
| try: | |
| font = ImageFont.truetype("arialbd.ttf", 40) | |
| except: | |
| font = ImageFont.load_default(size=40) # Fallback | |
| # Calculate text position (bottom-right corner) | |
| bbox = draw.textbbox((0, 0), WATERMARK_TEXT, font=font) | |
| text_width = bbox[2] - bbox[0] | |
| text_height = bbox[3] - bbox[1] | |
| margin = 20 | |
| position = (image.width - text_width - margin, image.height - text_height - margin) | |
| # Draw watermark with semi-transparent white text and black outline | |
| draw.text( | |
| position, | |
| WATERMARK_TEXT, | |
| font=font, | |
| fill=(255, 255, 255, 128), | |
| stroke_width=2, | |
| stroke_fill=(0, 0, 0, 128) | |
| ) | |
| return image | |
| except Exception as e: | |
| print(f"Watermark error: {str(e)}") | |
| return Image.open(io.BytesIO(image_bytes)) # Return original if watermark fails | |
| def generate_image(prompt): | |
| """Generate image with retry logic""" | |
| if not prompt.strip(): | |
| return "Error: Please enter a valid prompt" | |
| for attempt in range(MAX_RETRIES): | |
| try: | |
| response = requests.post( | |
| API_URL, | |
| headers=headers, | |
| json={"inputs": prompt, "options": {"wait_for_model": True}}, | |
| timeout=30 | |
| ) | |
| if response.status_code == 200: | |
| return add_watermark(response.content) | |
| elif response.status_code == 503: # Model loading | |
| time.sleep(10 * (attempt + 1)) # Exponential backoff | |
| continue | |
| else: | |
| return f"API Error: {response.text}" | |
| except requests.Timeout: | |
| return "Error: Request timed out (30s)" | |
| except Exception as e: | |
| return f"Unexpected error: {str(e)}" | |
| return "Failed after multiple attempts. Try again later." | |
| # Gradio Interface | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # π¨ SelamGPT Image Generator | |
| *Powered by Stable Diffusion XL with built-in watermark* | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| prompt_input = gr.Textbox( | |
| label="Describe your image", | |
| placeholder="A futuristic city at sunset...", | |
| lines=3 | |
| ) | |
| generate_btn = gr.Button("Generate", variant="primary") | |
| examples = gr.Examples( | |
| examples=["A cute robot reading a book", "Ethiopian landscape in oil painting style"], | |
| inputs=prompt_input | |
| ) | |
| with gr.Column(): | |
| output_image = gr.Image(label="Generated Image", height=512) | |
| error_output = gr.Textbox(label="Status", visible=False) | |
| generate_btn.click( | |
| fn=generate_image, | |
| inputs=prompt_input, | |
| outputs=[output_image, error_output], | |
| show_progress="full" | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |