Download app.py from dtometzki/VL_AI: direct link, hf CLI and curl.
- Browser
- Download file 4.01 kB
-
https://huggingface.co/spaces/dtometzki/VL_AI/resolve/02bbec15e5afc6a4430d1b54d020b7a96014c73c/app.py
- Command line
-
hf download hf://spaces/dtometzki/VL_AI@02bbec15e5afc6a4430d1b54d020b7a96014c73c/app.py
-
curl -L -o app.py https://huggingface.co/spaces/dtometzki/VL_AI/resolve/02bbec15e5afc6a4430d1b54d020b7a96014c73c/app.py
4.01 kB
| 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()) |