| import gradio as gr |
| from huggingface_hub import InferenceClient |
| import spaces |
| from openai import OpenAI |
| import io |
| import requests |
| from PIL import Image |
|
|
| @spaces.GPU |
| def generate_image(prompt, hf_token, progress=gr.Progress(track_tqdm=True)): |
| if not hf_token: |
| raise gr.Error("Please enter your Hugging Face API Token!") |
| if not prompt: |
| raise gr.Error("Please enter a prompt!") |
| |
| client = InferenceClient(token=hf_token.strip()) |
| |
| image = client.text_to_image( |
| prompt, |
| model="black-forest-labs/FLUX.1-schnell" |
| ) |
| |
| return image |
|
|
| def edit_image(image, prompt, omni_url, omni_key, omni_model, progress=gr.Progress(track_tqdm=True)): |
| if not omni_url or not omni_key: |
| raise gr.Error("Please provide both your OmniRoute URL and API Key!") |
| if not image: |
| raise gr.Error("Please upload an image to edit!") |
| if not prompt: |
| raise gr.Error("Please enter a prompt for editing!") |
| |
| client = OpenAI( |
| base_url=omni_url.strip(), |
| api_key=omni_key.strip() |
| ) |
| |
| img_byte_arr = io.BytesIO() |
| image.save(img_byte_arr, format='PNG') |
| img_byte_arr = img_byte_arr.getvalue() |
| |
| try: |
| response = client.images.edit( |
| image=img_byte_arr, |
| prompt=prompt, |
| model=omni_model.strip() |
| ) |
| |
| if response.data and len(response.data) > 0: |
| url = response.data[0].url |
| if url: |
| img_response = requests.get(url) |
| edited = Image.open(io.BytesIO(img_response.content)) |
| return edited |
| elif response.data[0].b64_json: |
| import base64 |
| img_bytes = base64.b64decode(response.data[0].b64_json) |
| edited = Image.open(io.BytesIO(img_bytes)) |
| return edited |
| |
| raise gr.Error("OmniRoute returned an empty response.") |
| except Exception as e: |
| raise gr.Error(f"OmniRoute API Error: {str(e)}") |
|
|
| custom_theme = gr.themes.Soft( |
| primary_hue="blue", |
| secondary_hue="indigo", |
| font=gr.themes.GoogleFont("Inter"), |
| ) |
|
|
| with gr.Blocks() as demo: |
| gr.Markdown( |
| """ |
| # ⚡ FLUX.1 Image Studio (Grok Quality) |
| Generate ultra-fast images from text using the real-time FLUX.1-schnell model via Hugging Face Serverless API. *No local GPU Required!* |
| """ |
| ) |
| |
| with gr.Tabs(): |
| with gr.Tab("✨ Generate New Image"): |
| with gr.Row(): |
| with gr.Column(scale=1): |
| hf_token = gr.Textbox( |
| label="🔑 Hugging Face Access Token", |
| placeholder="hf_...", |
| type="password", |
| info="Paste your Hugging Face Token here" |
| ) |
| prompt = gr.Textbox( |
| label="✨ Prompt", |
| lines=3, |
| placeholder="e.g. A futuristic cyberpunk city at night...", |
| autofocus=True |
| ) |
| |
| generate_btn = gr.Button("🎨 Generate Image", variant="primary", size="lg") |
| |
| with gr.Column(scale=1): |
| output_image = gr.Image(label="Result", type="pil", interactive=False) |
|
|
| generate_btn.click( |
| fn=generate_image, |
| inputs=[prompt, hf_token], |
| outputs=[output_image] |
| ) |
| prompt.submit( |
| fn=generate_image, |
| inputs=[prompt, hf_token], |
| outputs=[output_image] |
| ) |
| |
| with gr.Tab("🖌️ Edit Existing Image (OmniRoute)"): |
| with gr.Row(): |
| with gr.Column(scale=1): |
| with gr.Accordion("⚙️ OmniRoute Configuration", open=True): |
| omni_url = gr.Textbox( |
| label="OmniRoute Base URL", |
| value="http://localhost:20128/v1", |
| info="The endpoint URL of your OmniRoute gateway" |
| ) |
| omni_key = gr.Textbox( |
| label="🔑 OmniRoute API Key", |
| placeholder="Enter your key...", |
| type="password" |
| ) |
| omni_model = gr.Textbox( |
| label="Model ID", |
| value="chatgpt-web", |
| info="The underlying model to route to (e.g. chatgpt-web)" |
| ) |
| |
| input_image = gr.Image(label="Image to Edit", type="pil") |
| edit_prompt = gr.Textbox( |
| label="✨ Edit Prompt", |
| lines=2, |
| placeholder="e.g. change the sky to red..." |
| ) |
| |
| edit_btn = gr.Button("🖌️ Edit Image", variant="primary", size="lg") |
| |
| with gr.Column(scale=1): |
| edit_output = gr.Image(label="Edited Result", type="pil", interactive=False) |
| |
| edit_btn.click( |
| fn=edit_image, |
| inputs=[input_image, edit_prompt, omni_url, omni_key, omni_model], |
| outputs=[edit_output] |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch(theme=custom_theme) |