Spaces:
No application file
No application file
| #!/usr/bin/env python3 | |
| """ | |
| Agent2Robot - MCP Hackathon 2024 Submission | |
| AI-Powered Vehicle Design Assistant with MCP Integration | |
| """ | |
| import os | |
| import ssl | |
| import json | |
| # Minimal SSL fix for local development (won't affect HuggingFace Spaces) | |
| try: | |
| # Only apply SSL fix if needed | |
| ssl._create_default_https_context = ssl._create_unverified_context | |
| except: | |
| pass | |
| import gradio as gr | |
| from design_tools import VehicleDesigner | |
| import main_orchestrator | |
| # Initialize the vehicle designer with MCP integration | |
| designer = VehicleDesigner() | |
| def get_mcp_status(): | |
| """Get MCP server status for display""" | |
| status = designer.get_mcp_status() | |
| return f"MCP Server: {status['name']} v{status['version']} - Status: {status['status']}" | |
| # Create Gradio interface | |
| def create_app(): | |
| # Custom CSS for enhanced styling | |
| custom_css = """ | |
| .simulation-output textarea { | |
| font-family: 'Courier New', monospace !important; | |
| background: #f8f9fa !important; | |
| border: 2px solid #667eea !important; | |
| border-radius: 8px !important; | |
| } | |
| .simulation-output { | |
| background: linear-gradient(145deg, #f0f2f5, #e8eaf0) !important; | |
| border-radius: 12px !important; | |
| padding: 10px !important; | |
| } | |
| .gradio-button.primary { | |
| background: linear-gradient(90deg, #667eea 0%, #764ba2 100%) !important; | |
| border: none !important; | |
| border-radius: 25px !important; | |
| font-weight: bold !important; | |
| text-transform: uppercase !important; | |
| } | |
| .status-display { | |
| font-size: 18px !important; | |
| font-weight: bold !important; | |
| text-align: center !important; | |
| padding: 10px !important; | |
| background: linear-gradient(90deg, #f8f9fa, #e9ecef) !important; | |
| border-radius: 8px !important; | |
| } | |
| .current-specs { | |
| background: #fff3cd !important; | |
| border: 2px solid #ffc107 !important; | |
| border-radius: 8px !important; | |
| } | |
| .final-specs { | |
| background: #d1edff !important; | |
| border: 2px solid #0066cc !important; | |
| border-radius: 8px !important; | |
| } | |
| """ | |
| with gr.Blocks( | |
| title="π€π Agent2Robot - MCP Hackathon 2024", | |
| theme=gr.themes.Soft(), | |
| css=custom_css | |
| ) as app: | |
| # Header | |
| gr.HTML(""" | |
| <div style="text-align: center; padding: 20px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; margin-bottom: 20px;"> | |
| <h1>π€π Agent2Robot Design Assistant</h1> | |
| <p>AI-Powered Vehicle Design with MCP Integration</p> | |
| <p><strong>MCP Hackathon 2024 Submission</strong></p> | |
| </div> | |
| """) | |
| # MCP Status Display | |
| with gr.Row(): | |
| gr.Markdown("### π MCP Server Status") | |
| mcp_status = gr.Textbox( | |
| value=get_mcp_status(), | |
| label="Server Connection", | |
| interactive=False | |
| ) | |
| # === MAIN INTERFACE LAYOUT === | |
| with gr.Row(): | |
| # Input Section | |
| with gr.Column(scale=1): | |
| gr.Markdown("## π― Design Parameters") | |
| vehicle_type = gr.Dropdown( | |
| choices=["Robot", "Drone", "Autonomous Vehicle", "Robotic Arm"], | |
| label="π Vehicle Type", | |
| value="Robot" | |
| ) | |
| description = gr.Textbox( | |
| label="π Design Requirements", | |
| lines=6, | |
| placeholder="Describe your vehicle requirements and specifications...\n\nExample: Design a warehouse robot for navigation and package delivery with 50kg payload capacity, 8-hour operation time, and obstacle avoidance.", | |
| value="Design a robot for warehouse navigation and package delivery" | |
| ) | |
| generate_btn = gr.Button("π Generate Design with MCP", variant="primary", size="lg") | |
| # Status Display | |
| gr.Markdown("### π Process Status") | |
| status_display = gr.Markdown( | |
| value="π’ Ready to start design process", | |
| elem_classes=["status-display"] | |
| ) | |
| # Output Section | |
| with gr.Column(scale=2): | |
| gr.Markdown("## π Live Design Process & Results") | |
| # Main process log / final report display | |
| process_log_output = gr.Textbox( | |
| label="π― Design Process Log / Final Report", | |
| lines=20, | |
| interactive=False, | |
| show_copy_button=True, | |
| placeholder="π Click 'Generate Design with MCP' to start the live design process...\n\nYou'll see real-time updates including:\nβ’ MCP server communication\nβ’ Iterative design generation\nβ’ Physics simulation results\nβ’ Performance optimization\nβ’ Final design validation" | |
| ) | |
| # === ITERATIVE DESIGN SECTION === | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### π Current Iteration Specs") | |
| current_specs_output = gr.JSON( | |
| label="π Current Design Being Tested", | |
| elem_classes=["current-specs"] | |
| ) | |
| with gr.Column(): | |
| gr.Markdown("### π Final Best Design") | |
| final_specs_output = gr.JSON( | |
| label="π― Optimized Final Specifications", | |
| elem_classes=["final-specs"] | |
| ) | |
| # === SIMULATION & DOWNLOAD SECTION === | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| gr.Markdown("## π¬ MCP Simulation Engine") | |
| gr.HTML(""" | |
| <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 15px; border-radius: 10px; color: white; text-align: center; margin-bottom: 10px;"> | |
| <h3 style="margin: 0; color: white;">π₯ Advanced Physics Simulation</h3> | |
| <p style="margin: 5px 0 0 0; color: white;">MCP-Powered Vehicle Behavior Modeling</p> | |
| </div> | |
| """) | |
| simulation_output = gr.Textbox( | |
| label="π Simulation Results & Video Information", | |
| lines=20, | |
| interactive=False, | |
| show_copy_button=True, | |
| placeholder="π¬ Simulation will be generated after design completion...\n\nSimulation features:\nβ’ Physics-based movement modeling\nβ’ Environmental interaction analysis\nβ’ Performance metrics visualization\nβ’ Real-time system validation", | |
| elem_classes=["simulation-output"] | |
| ) | |
| with gr.Column(scale=1): | |
| gr.Markdown("### π₯ Downloads") | |
| gr.HTML(""" | |
| <div style="background: #e8f5e8; padding: 15px; border-radius: 10px; border: 2px solid #28a745; margin-bottom: 10px;"> | |
| <h4 style="margin: 0; color: #155724;">π― Design Outputs</h4> | |
| <p style="margin: 5px 0 0 0; color: #155724;">Download final specifications</p> | |
| </div> | |
| """) | |
| download_file_output = gr.File( | |
| label="π Download Design Specs (JSON)", | |
| file_count="single", | |
| interactive=False, | |
| visible=False | |
| ) | |
| gr.Markdown(""" | |
| **π Available after completion:** | |
| - Complete design specifications | |
| - Technical parameters (JSON) | |
| - Performance metrics | |
| - MCP validation results | |
| """) | |
| # === CONNECT GENERATOR FUNCTION === | |
| def process_with_updates(vehicle_type, design_requirements): | |
| """Wrapper function to handle generator updates""" | |
| for update in main_orchestrator.process_design_request(vehicle_type, design_requirements): | |
| # Extract values from the update dictionary | |
| process_log = update.get("process_log", "") | |
| current_specs = update.get("current_specs", None) | |
| final_specs = update.get("final_specs", None) | |
| simulation_video = update.get("simulation_video", "") | |
| status = update.get("status", "") | |
| download_file = update.get("download_file", None) | |
| # Make download file visible if available | |
| download_visible = download_file is not None | |
| download_value = download_file if download_file else None | |
| yield [ | |
| process_log, # process_log_output | |
| current_specs, # current_specs_output | |
| final_specs, # final_specs_output | |
| simulation_video, # simulation_output | |
| status, # status_display | |
| gr.File(value=download_value, visible=download_visible) # download_file_output | |
| ] | |
| # Connect the generator function to the button | |
| generate_btn.click( | |
| fn=process_with_updates, | |
| inputs=[vehicle_type, description], | |
| outputs=[ | |
| process_log_output, | |
| current_specs_output, | |
| final_specs_output, | |
| simulation_output, | |
| status_display, | |
| download_file_output | |
| ] | |
| ) | |
| # === INFORMATION SECTIONS === | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown(""" | |
| ### π§ MCP Integration Features | |
| **Model Context Protocol (MCP) Integration:** | |
| - **π Server Communication**: Direct integration with MCP servers for design generation | |
| - **π Real-time Validation**: Live design validation through MCP protocols | |
| - **π― Context Awareness**: Maintains design context across sessions | |
| - **π¬ Simulation Generation**: MCP-powered video simulation creation | |
| - **π Iterative Optimization**: Multi-iteration design improvement | |
| - **π Scalable Architecture**: Modular design supporting multiple MCP servers | |
| """) | |
| with gr.Column(): | |
| gr.Markdown(""" | |
| ### π MCP Hackathon 2024 - Technical Stack | |
| **Core Components:** | |
| - **MCP Client**: `mcp_client.py` - Handles server communication | |
| - **Design Tools**: `design_tools.py` - Core vehicle design logic | |
| - **Main Orchestrator**: `main_orchestrator.py` - Generator-based processing | |
| - **Gradio Interface**: `app.py` - Real-time UI updates | |
| - **Simulation Engine**: MCP-integrated physics modeling | |
| - **Download System**: JSON specification export | |
| """) | |
| # Footer | |
| gr.Markdown(""" | |
| --- | |
| ### π Agent2Robot - MCP Hackathon 2024 | |
| **AI-Powered Vehicle Design Assistant** with **Model Context Protocol Integration** | |
| Experience **real-time design generation** with live updates showing MCP server communication, | |
| iterative optimization, physics simulation, and final results. | |
| **MCP Features**: Live server integration β’ Real-time validation β’ Context preservation β’ | |
| Iterative optimization β’ Simulation generation β’ Download capability | |
| Built with β€οΈ for the MCP Hackathon 2024 | Powered by Gradio + MCP + Generator Architecture | |
| """) | |
| return app | |
| # Launch the application | |
| if __name__ == "__main__": | |
| app = create_app() | |
| app.launch() |