|
import gradio as gr |
|
import requests |
|
import random |
|
from io import BytesIO |
|
from PIL import Image |
|
import os |
|
import time |
|
|
|
|
|
BASE_URL = os.environ.get('POLLINATIONS_URL') |
|
|
|
def generate_image(prompt, model): |
|
if not prompt: |
|
raise gr.Error("Please enter a prompt.") |
|
|
|
|
|
seed = random.randint(1, 999999) |
|
|
|
|
|
url = f"{BASE_URL}{prompt}?width=2048&height=2048&seed={seed}&nologo=true&model={model}" |
|
|
|
max_retries = 2 |
|
for attempt in range(max_retries): |
|
try: |
|
response = requests.get(url, stream=True) |
|
response.raise_for_status() |
|
|
|
|
|
img = Image.open(BytesIO(response.content)) |
|
return img |
|
|
|
except requests.exceptions.HTTPError as e: |
|
if response.status_code == 500 and 'Access to kontext model' in response.text: |
|
if attempt < max_retries - 1: |
|
time.sleep(1) |
|
continue |
|
raise gr.Error("Access denied for kontext model (limit reached). Try turbo/flux or authenticate at pollinations.ai.") |
|
else: |
|
raise gr.Error(f"Error: {response.status_code} - {response.text}") |
|
except Exception as e: |
|
raise gr.Error(f"Unexpected error: {str(e)}") |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Fake flux pro Image Generator") |
|
|
|
prompt_input = gr.Textbox(label="Prompt", placeholder="e.g., emma watson") |
|
model_input = gr.Dropdown(choices=["kontext", "turbo", "flux","imagen-4-ultra","imagen-4"], label="Model", value="turbo") |
|
|
|
generate_btn = gr.Button("Generate") |
|
output_image = gr.Image(label="Generated Image") |
|
|
|
generate_btn.click(generate_image, inputs=[prompt_input, model_input], outputs=output_image) |
|
demo.queue(max_size=None, default_concurrency_limit=None) |
|
demo.launch() |
|
|