Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from g4f.client import Client | |
| client = Client() | |
| # Supported models and styles | |
| MODEL_CHOICES = [ | |
| "DALL E 3", | |
| "dall-e-3", | |
| "midjourney", | |
| "stablediffusion", | |
| "pollinations" | |
| ] | |
| IMAGE_STYLES = [ | |
| "photographic", "anime", "painting", "digital-art", | |
| "cinematic", "3d-model", "pixel-art", "fantasy" | |
| ] | |
| SAMPLING_METHODS = [ | |
| "Euler", "Euler a", "DDIM", "DPM++ 2M Karras", "LMS" | |
| ] | |
| def generate_image( | |
| prompt, negative_prompt, | |
| model, style, | |
| width, height, | |
| sampling_method, sampling_steps | |
| ): | |
| """ | |
| Generates an image using the g4f client based on the provided parameters. | |
| Returns the URL of the generated image and a status message. | |
| """ | |
| try: | |
| response = client.images.generate( | |
| model=model, | |
| prompt=prompt, | |
| negativePrompt=negative_prompt, | |
| imageStyle=style, | |
| width=width, | |
| height=height, | |
| samplingMethod=sampling_method, | |
| samplingSteps=sampling_steps, | |
| response_format="url" | |
| ) | |
| image_url = response.data[0].url | |
| return image_url, f"✅ Image generated. URL: {image_url}" | |
| except Exception as e: | |
| return None, f"❌ Error: {str(e)}" | |
| # --- Custom Theme Definition --- | |
| # This theme provides a vibrant color palette, modern typography, and refined spacing. | |
| # Subtle animations are handled by Gradio's default element transitions enhanced by CSS. | |
| custom_theme = gr.themes.Base( | |
| primary_hue=gr.themes.Color( | |
| c50="#FDE6E8", c100="#FAD2D8", c200="#F5A7B3", c300="#F07C8E", c400="#EB5169", | |
| c500="#E62645", c600="#CD223E", c700="#B41D37", c800="#9B1930", c900="#821429", | |
| c950="#410A14" | |
| ), # Custom vibrant red/pink hue for primary elements | |
| secondary_hue="blue", # Complementary blue hue | |
| neutral_hue="gray", # Neutral shades for backgrounds and borders | |
| font=[gr.themes.GoogleFont("Poppins"), "ui-sans-serif", "system-ui", "sans-serif"], # Modern sans-serif font | |
| spacing_size=gr.themes.sizes.spacing_md, # Standard spacing size for balance | |
| radius_size=gr.themes.sizes.radius_md # Standard border radius for modern feel | |
| ) | |
| # The `set()` method arguments that caused the `TypeError` have been removed. | |
| # Gradio themes handle these defaults, or they can be adjusted via CSS if necessary. | |
| # --- Custom CSS for Dynamic Header and Modern UI Elements --- | |
| # This CSS handles the background photo for the header, | |
| # subtle animations on interactive elements, and improved typography/spacing. | |
| app_css = """ | |
| /* Dynamic Header with Background Photo */ | |
| #custom-header-container { | |
| background-image: url('https://surl.li/ofirja'); /* Background photo for the header */ | |
| background-size: cover; /* Cover the entire area */ | |
| background-position: center; /* Center the image */ | |
| background-repeat: no-repeat; /* Do not repeat the image */ | |
| color: white; /* Text color for header content */ | |
| padding: 50px 20px; /* Ample padding for visual appeal */ | |
| text-shadow: 2px 2px 6px rgba(0, 0, 0, 0.8); /* Shadow for text readability */ | |
| border-radius: var(--radius-md); /* Match theme's border radius */ | |
| margin-bottom: var(--spacing-lg); /* Space below the header */ | |
| } | |
| #custom-header-container h1 { | |
| color: white; /* Ensure the main title is white */ | |
| margin-top: 0; /* Remove default top margin */ | |
| margin-bottom: 10px; /* Space below title */ | |
| } | |
| #custom-header-container p { | |
| color: white; /* Ensure paragraph text is white */ | |
| margin-bottom: 0; /* Remove default bottom margin */ | |
| } | |
| /* Modern UI Elements: Typography and Spacing enhancements */ | |
| .gradio-input, .gradio-dropdown, .gradio-number { | |
| border-radius: var(--radius-md); /* Apply theme's border radius */ | |
| box-shadow: var(--shadow-md); /* Apply theme's shadow */ | |
| padding: var(--spacing-sm) var(--spacing-md); /* Adjust padding */ | |
| font-family: var(--font); /* Apply theme's font */ | |
| } | |
| /* Subtle Animations for Buttons */ | |
| .gradio-button { | |
| border-radius: var(--radius-md); /* Apply theme's border radius */ | |
| transition: all 0.3s ease-in-out; /* Smooth transition for hover effects */ | |
| } | |
| .gradio-button:hover { | |
| transform: translateY(-2px); /* Slight lift effect on hover */ | |
| box-shadow: var(--shadow-lg); /* Enhance shadow on hover */ | |
| } | |
| /* Footer Styling */ | |
| #custom-footer-container { | |
| padding: 20px; /* Padding around footer content */ | |
| text-align: center; /* Center align footer text */ | |
| font-size: 0.85em; /* Slightly smaller font size */ | |
| color: var(--neutral-600); /* Neutral color for footer text */ | |
| border-top: 1px solid var(--neutral-100); /* Subtle top border */ | |
| margin-top: var(--spacing-lg); /* Space above the footer */ | |
| } | |
| """ | |
| with gr.Blocks(title="🖼️ lumaGPT Image", theme=custom_theme, css=app_css) as demo: | |
| # Dynamic Header and Branding | |
| gr.Markdown( | |
| """ | |
| <div id="custom-header-container" style="text-align:center;"> | |
| <h1>🖼️ lumaGPT Image</h1> | |
| <p>Unleash your creativity with AI-powered image generation.</p> | |
| </div> | |
| """ | |
| ) | |
| gr.Markdown(""" | |
| <div style="text-align:center; padding: 20px;"> | |
| <p>Enter a description of the image, select the model and size.</p> | |
| </div> | |
| """) | |
| # Improved Layout with Panels | |
| with gr.Row(): | |
| with gr.Column(scale=2, min_width=300): # Input parameters column | |
| gr.Markdown("## 🎨 Image Generation Parameters") | |
| prompt = gr.Textbox(label="Image Description", lines=3, placeholder="Example: A cyberpunk city at night", elem_id="prompt-input") | |
| negative_prompt = gr.Textbox(label="What NOT to include", lines=2, placeholder="e.g., bad quality, blur", elem_id="negative-prompt-input") | |
| gr.Markdown("### Model and Style Selection") | |
| with gr.Row(): | |
| model = gr.Dropdown(choices=MODEL_CHOICES, label="Model", value="DALL E 3", elem_id="model-dropdown") | |
| style = gr.Dropdown(choices=IMAGE_STYLES, label="Image Style", value="photographic", elem_id="style-dropdown") | |
| gr.Markdown("### Image Dimensions") | |
| with gr.Row(): | |
| width = gr.Number(label="Width", value=1024, precision=0, elem_id="width-input") | |
| height = gr.Number(label="Height", value=1024, precision=0, elem_id="height-input") | |
| gr.Markdown("### Advanced Sampling Options") | |
| with gr.Row(): | |
| sampling_method = gr.Dropdown(choices=SAMPLING_METHODS, label="Sampling Method", value="Euler", elem_id="sampling-method-dropdown") | |
| sampling_steps = gr.Number(label="Sampling Steps", value=25, precision=0, elem_id="sampling-steps-input") | |
| btn = gr.Button("🎨 Generate Image", variant="primary", elem_id="generate-button") | |
| with gr.Column(scale=3, min_width=400): # Output image column | |
| gr.Markdown("## ✨ Generated Image Result") | |
| output_img = gr.Image(label="Result", type="pil", elem_id="output-image", height="auto") # Responsive image height | |
| status = gr.Textbox(label="Status", interactive=False, elem_id="status-textbox") | |
| btn.click( | |
| fn=generate_image, | |
| inputs=[ | |
| prompt, negative_prompt, | |
| model, style, | |
| width, height, | |
| sampling_method, sampling_steps | |
| ], | |
| outputs=[output_img, status] | |
| ) | |
| # Informative Footer | |
| gr.Markdown( | |
| """ | |
| <div id="custom-footer-container"> | |
| <p>© 2025 lumaGPT Image. All rights reserved.</p> | |
| <p>For support or feedback, please contact us at <a href="mailto:splumagpt@gmail.com">splumagpt@gmail.com</a>.</p> | |
| </div> | |
| """ | |
| ) | |
| demo.launch() |