VL_AI / app.py
dtometzki's picture
Update app.py
21bd66a verified
import gradio as gr
import fal_client
import os
# API Key Check
if not os.environ.get("FAL_KEY"):
print("WARNUNG: 'FAL_KEY' fehlt in den Secrets!")
MODELS = [
"fal-ai/qwen-image-2512",
"fal-ai/flux-2",
"fal-ai/flux-2/klein/9b",
"fal-ai/flux/schnell",
]
def generate_image(prompt, model_name, steps, cfg_scale, width, height):
print(f"Generiere: {model_name} | {width}x{height} | Steps: {steps} | CFG: {cfg_scale}")
# Argumente vorbereiten
args = {
"prompt": prompt,
# Bei fal.ai kann man oft benutzerdefinierte Größen als Dictionary übergeben
# oder direkt als width/height, je nach Modell.
# Die sicherste Variante für Flux/Qwen ist oft "image_size" als Dict oder String.
"image_size": {
"width": int(width),
"height": int(height)
},
"num_inference_steps": int(steps),
"guidance_scale": float(cfg_scale), # Das ist der CFG Scale
"enable_safety_checker": False
}
# Ausnahme für Flux Pro/v1.1 ("Flux-2"):
# Diese Modelle akzeptieren oft keine manuellen Steps oder CFG.
# Wir filtern das, damit kein Fehler kommt.
if "flux-pro" in model_name or "flux-2" in model_name:
if "num_inference_steps" in args: del args["num_inference_steps"]
if "guidance_scale" in args: del args["guidance_scale"]
try:
handler = fal_client.submit(model_name, arguments=args)
result = handler.get()
if "images" in result: return result["images"][0]["url"]
elif "image" in result: return result["image"]["url"]
else: raise gr.Error("Keine Bild-URL erhalten.")
except Exception as e:
raise gr.Error(f"Fehler bei '{model_name}': {str(e)}")
# --- UI Aufbau ---
with gr.Blocks(title="Custom Model Gen") as demo:
gr.Markdown("## ⚡ Custom Model Generator")
with gr.Row():
# LINKER BEREICH
with gr.Column(scale=1):
model_selector = gr.Dropdown(
choices=MODELS,
value=MODELS[1],
label="Modell ID"
)
prompt_input = gr.Textbox(
label="Prompt",
placeholder="Beschreibe dein Bild...",
lines=3
)
# --- HIER IST DEIN NEUES DESIGN ---
with gr.Accordion("⚙️ Erweiterte Parameter", open=True):
# 1. Steps Slider
steps_slider = gr.Slider(
minimum=10, maximum=50, value=25, step=1,
label="Steps (Qualität)",
info="Mehr Schritte = Bessere Qualität, aber langsamer."
)
# 2. CFG Scale Slider
cfg_slider = gr.Slider(
minimum=1, maximum=20, value=7.5, step=0.5,
label="CFG Scale (Text-Treue)",
info="Höher = Hält sich strikter an den Text."
)
# 3. Breite und Höhe nebeneinander
with gr.Row():
width_slider = gr.Slider(
minimum=256, maximum=1024, value=1024, step=8,
label="Breite"
)
height_slider = gr.Slider(
minimum=256, maximum=1024, value=768, step=8,
label="Höhe"
)
# ----------------------------------
run_btn = gr.Button("🚀 Generieren", variant="primary")
# RECHTER BEREICH
with gr.Column(scale=2):
result_output = gr.Image(label="Ergebnis")
# Inputs bündeln
inputs = [prompt_input, model_selector, steps_slider, cfg_slider, width_slider, height_slider]
run_btn.click(fn=generate_image, inputs=inputs, outputs=result_output)
if __name__ == "__main__":
demo.launch(theme=gr.themes.Base())