Spaces:
Running
Running
""" | |
A1D MCP Server - Gradio Application | |
Universal AI Tools for image and video processing | |
""" | |
import gradio as gr | |
import os | |
from typing import Optional, Tuple, Union | |
from utils import A1DAPIClient, validate_url, validate_scale, prepare_request_data, format_response_with_preview | |
from config import GRADIO_CONFIG, TOOLS_CONFIG | |
from mcp_handler import get_api_key_from_headers | |
# Initialize API client | |
def get_api_client(): | |
"""Get API client with current API key""" | |
# Try to get API key from multiple sources | |
api_key = None | |
# 1. Try from request headers (for MCP clients) | |
try: | |
request = gr.request() | |
if request and hasattr(request, 'headers'): | |
api_key = get_api_key_from_headers(dict(request.headers)) | |
except: | |
pass | |
# 2. Fallback to environment variable | |
if not api_key: | |
api_key = os.getenv("A1D_API_KEY") | |
if not api_key: | |
raise ValueError( | |
"API key is required. Set A1D_API_KEY environment variable or provide API_KEY in request headers.") | |
return A1DAPIClient(api_key) | |
def remove_bg(image_url: str) -> Tuple[str, Optional[str]]: | |
"""Remove background from images using AI. | |
Args: | |
image_url: The URL of the image to remove background from | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not validate_url(image_url): | |
return "β Error: Invalid image URL format", None | |
client = get_api_client() | |
data = prepare_request_data("remove_bg", image_url=image_url) | |
# Use the new method that waits for result | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["remove_bg"]["api_endpoint"], | |
data, | |
timeout=120 # 2 minutes timeout | |
) | |
return format_response_with_preview(response, "remove_bg") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
def image_upscaler(image_url: str, scale: int = 2) -> Tuple[str, Optional[str]]: | |
"""Upscale images using AI with specified scale factor. | |
Args: | |
image_url: The URL of the image to upscale | |
scale: Scale factor for upscaling (2, 4, 8, or 16). Default: 2 | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not validate_url(image_url): | |
return "β Error: Invalid image URL format", None | |
if not validate_scale(scale): | |
return "β Error: Scale must be 2, 4, 8, or 16", None | |
client = get_api_client() | |
data = prepare_request_data( | |
"image_upscaler", image_url=image_url, scale=scale) | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["image_upscaler"]["api_endpoint"], | |
data, | |
timeout=120 | |
) | |
return format_response_with_preview(response, "image_upscaler") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
def video_upscaler(video_url: str) -> Tuple[str, Optional[str]]: | |
"""Upscale videos using AI. | |
Args: | |
video_url: The URL of the video to upscale | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not validate_url(video_url): | |
return "β Error: Invalid video URL format", None | |
client = get_api_client() | |
data = prepare_request_data("video_upscaler", video_url=video_url) | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["video_upscaler"]["api_endpoint"], | |
data, | |
timeout=300 # 5 minutes for video processing | |
) | |
return format_response_with_preview(response, "video_upscaler") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
def image_vectorization(image_url: str) -> Tuple[str, Optional[str]]: | |
"""Convert images to vector format using AI. | |
Args: | |
image_url: The URL of the image to vectorize | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not validate_url(image_url): | |
return "β Error: Invalid image URL format", None | |
client = get_api_client() | |
data = prepare_request_data("image_vectorization", image_url=image_url) | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["image_vectorization"]["api_endpoint"], | |
data, | |
timeout=120 | |
) | |
return format_response_with_preview(response, "image_vectorization") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
def image_extends(image_url: str) -> Tuple[str, Optional[str]]: | |
"""Extend images using AI. | |
Args: | |
image_url: The URL of the image to extend | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not validate_url(image_url): | |
return "β Error: Invalid image URL format", None | |
client = get_api_client() | |
data = prepare_request_data("image_extends", image_url=image_url) | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["image_extends"]["api_endpoint"], | |
data, | |
timeout=120 | |
) | |
return format_response_with_preview(response, "image_extends") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
def image_generator(prompt: str) -> Tuple[str, Optional[str]]: | |
"""Generate images using AI from text prompts. | |
Args: | |
prompt: Text prompt to generate image from | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
try: | |
if not prompt or not prompt.strip(): | |
return "β Error: Prompt is required and cannot be empty", None | |
client = get_api_client() | |
data = prepare_request_data("image_generator", prompt=prompt.strip()) | |
response = client.make_request_with_result( | |
TOOLS_CONFIG["image_generator"]["api_endpoint"], | |
data, | |
timeout=120 | |
) | |
return format_response_with_preview(response, "image_generator") | |
except Exception as e: | |
return f"β Error: {str(e)}", None | |
# Wrapper functions for Gradio interface | |
def remove_bg_wrapper(image_url: str): | |
"""Wrapper for remove_bg that returns message and media for Gradio | |
Args: | |
image_url: The URL of the image to remove background from. Must be a valid HTTP/HTTPS URL pointing to an image file. | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = remove_bg(image_url) | |
return message, media_url if media_url else None | |
def image_upscaler_wrapper(image_url: str, scale: int): | |
"""Wrapper for image_upscaler that returns message and media for Gradio | |
Args: | |
image_url: The URL of the image to upscale. Must be a valid HTTP/HTTPS URL pointing to an image file. | |
scale: Scale factor for upscaling. Choose from 2, 4, 8, or 16. Higher values produce larger images but take longer to process. | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = image_upscaler(image_url, scale) | |
return message, media_url if media_url else None | |
def video_upscaler_wrapper(video_url: str): | |
"""Wrapper for video_upscaler that returns message and media for Gradio | |
Args: | |
video_url: The URL of the video to upscale. Must be a valid HTTP/HTTPS URL pointing to a video file (MP4, AVI, MOV, etc.). | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = video_upscaler(video_url) | |
return message, media_url if media_url else None | |
def image_vectorization_wrapper(image_url: str): | |
"""Wrapper for image_vectorization that returns message and media for Gradio | |
Args: | |
image_url: The URL of the image to convert to vector format. Must be a valid HTTP/HTTPS URL pointing to an image file. | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = image_vectorization(image_url) | |
return message, media_url if media_url else None | |
def image_extends_wrapper(image_url: str): | |
"""Wrapper for image_extends that returns message and media for Gradio | |
Args: | |
image_url: The URL of the image to extend. Must be a valid HTTP/HTTPS URL pointing to an image file. | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = image_extends(image_url) | |
return message, media_url if media_url else None | |
def image_generator_wrapper(prompt: str): | |
"""Wrapper for image_generator that returns message and media for Gradio | |
Args: | |
prompt: Text description of the image to generate. Be descriptive and specific for better results. Example: "A beautiful sunset over mountains with vibrant orange and purple colors". | |
Returns: | |
Tuple of (result_message, media_url_for_preview) | |
""" | |
message, media_url = image_generator(prompt) | |
return message, media_url if media_url else None | |
# Create Gradio interfaces for each tool | |
def create_gradio_app(): | |
"""Create the main Gradio application with all tools""" | |
# Create individual interfaces for each tool | |
remove_bg_interface = gr.Interface( | |
fn=remove_bg_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Image URL", | |
placeholder="https://example.com/image.jpg", | |
info="Enter the URL of the image to remove background from" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Preview") | |
], | |
title="π Background Removal", | |
description="Remove background from images using AI" | |
) | |
image_upscaler_interface = gr.Interface( | |
fn=image_upscaler_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Image URL", | |
placeholder="https://example.com/image.jpg", | |
info="Enter the URL of the image to upscale" | |
), | |
gr.Dropdown( | |
choices=[2, 4, 8, 16], | |
value=2, | |
label="Scale Factor", | |
info="Choose the upscaling factor" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Preview") | |
], | |
title="π Image Upscaler", | |
description="Upscale images using AI with specified scale factor" | |
) | |
video_upscaler_interface = gr.Interface( | |
fn=video_upscaler_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Video URL", | |
placeholder="https://example.com/video.mp4", | |
info="Enter the URL of the video to upscale" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Video(label="Preview") | |
], | |
title="π¬ Video Upscaler", | |
description="Upscale videos using AI" | |
) | |
image_vectorization_interface = gr.Interface( | |
fn=image_vectorization_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Image URL", | |
placeholder="https://example.com/image.jpg", | |
info="Enter the URL of the image to convert to vector format" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Preview") | |
], | |
title="π Image Vectorization", | |
description="Convert images to vector format using AI" | |
) | |
image_extends_interface = gr.Interface( | |
fn=image_extends_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Image URL", | |
placeholder="https://example.com/image.jpg", | |
info="Enter the URL of the image to extend" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Preview") | |
], | |
title="πΌοΈ Image Extension", | |
description="Extend images using AI" | |
) | |
image_generator_interface = gr.Interface( | |
fn=image_generator_wrapper, | |
inputs=[ | |
gr.Textbox( | |
label="Text Prompt", | |
placeholder="A beautiful sunset over mountains", | |
info="Enter a text description to generate an image", | |
lines=3 | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Preview") | |
], | |
title="π¨ Image Generator", | |
description="Generate images using AI from text prompts" | |
) | |
# Create tabbed interface | |
demo = gr.TabbedInterface( | |
[ | |
remove_bg_interface, | |
image_upscaler_interface, | |
video_upscaler_interface, | |
image_vectorization_interface, | |
image_extends_interface, | |
image_generator_interface | |
], | |
[ | |
"Background Removal", | |
"Image Upscaler", | |
"Video Upscaler", | |
"Image Vectorization", | |
"Image Extension", | |
"Image Generator" | |
], | |
title=GRADIO_CONFIG["title"], | |
theme=GRADIO_CONFIG["theme"] | |
) | |
return demo | |
if __name__ == "__main__": | |
# Check for API key | |
if not os.getenv("A1D_API_KEY"): | |
print("β Error: A1D_API_KEY environment variable is required") | |
print("Please set your API key: export A1D_API_KEY=your_api_key_here") | |
exit(1) | |
# Create and launch the app | |
demo = create_gradio_app() | |
# Launch the Gradio app | |
demo.launch( | |
server_name=GRADIO_CONFIG["server_name"], | |
server_port=GRADIO_CONFIG["server_port"], | |
share=GRADIO_CONFIG["share"] | |
) | |