Openimage / app.py
Felguk's picture
Update app.py
8507a02 verified
import gradio as gr
import requests
from PIL import Image
import io
# Model information dictionary - maps model names to their descriptions
MODEL_INFO = {
"None": "Default model (good for general purposes)",
"stability": "Stability AI's Stable Diffusion (balanced quality)",
"openjourney": "Midjourney-style images",
"dreamlike": "Dreamlike photorealistic art",
"protogen": "Sci-fi and futuristic styles",
"sd14": "Stable Diffusion 1.4 (classic model)",
"sd21": "Stable Diffusion 2.1 (improved details)",
"kontext": "Context-aware generation",
"gptimage": "GPT-assisted image generation",
"anything": "Anime-style generation",
"realistic": "Photorealistic outputs",
"analog": "Film photography style",
"arcanediffusion": "Fantasy art style",
"dreamshaper": "Enhanced creative variations",
"deliberate": "Precise prompt following",
"revanimated": "Animated/cartoon styles",
"meinamix": "Anime/portrait hybrid"
}
# ------------------------------------------------------------------
# Helper: fetch list of available models
# ------------------------------------------------------------------
def get_models():
try:
r = requests.get("https://image.pollinations.ai/models", timeout=10)
models = [m.strip() for m in r.text.splitlines() if m.strip()]
except:
# Fallback if API is unavailable
models = list(MODEL_INFO.keys())
# Ensure our known models are included
for m in MODEL_INFO:
if m not in models and m != "None":
models.append(m)
# Sort alphabetically but keep "None" first
models = sorted(models)
if "None" in models:
models.remove("None")
models.insert(0, "None")
return models
# ------------------------------------------------------------------
# Image-generation function
# ------------------------------------------------------------------
def generate_image(prompt, model):
if model == "None":
model = "" # API expects empty string for default
url = f"https://image.pollinations.ai/prompt/{prompt}?nologo=true&seed=random"
if model:
url += f"&model={model}"
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
img = Image.open(io.BytesIO(r.content))
return img
except Exception as e:
raise gr.Error(f"Failed to generate image: {str(e)}")
# ------------------------------------------------------------------
# Gradio UI with improved model selector
# ------------------------------------------------------------------
models = get_models()
with gr.Blocks(theme="soft") as demo:
gr.Markdown("""# Openimage
### Select a model style that matches your desired output
""")
with gr.Row():
with gr.Column(scale=3):
prompt_box = gr.Textbox(
label="Prompt",
placeholder="A cat wearing sunglasses on the moon...",
lines=2
)
# Improved model dropdown with descriptions
model_dropdown = gr.Dropdown(
choices=models,
value="None",
label="Model Style",
info="Select a generation style",
interactive=True,
filterable=True, # Allows searching through models
elem_classes="model-selector"
)
# Add model description display
model_description = gr.Markdown(MODEL_INFO["None"])
# Update description when model changes
def update_description(model):
return MODEL_INFO.get(model, "No description available")
model_dropdown.change(
fn=update_description,
inputs=model_dropdown,
outputs=model_description
)
generate_btn = gr.Button("Generate", variant="primary")
with gr.Column(scale=3):
output_img = gr.Image(type="pil", label="Generated Image")
generate_btn.click(
fn=generate_image,
inputs=[prompt_box, model_dropdown],
outputs=output_img
)
if __name__ == "__main__":
demo.launch()