import gradio as gr import requests import json from smolagents import CodeAgent import logging from tenacity import retry, stop_after_attempt, wait_exponential # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) HF_SPACE_URL = "https://manavraj-troubleshoot-mcp.hf.space" @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def call_mcp_server(message: str, tool_type: str = "knowledge_base") -> str: """Call MCP server endpoint""" try: endpoint = f"{HF_SPACE_URL}/gradio_api/mcp/sse" response = requests.post( endpoint, json={ "tool": tool_type, "input": message }, stream=True, timeout=30 ) response.raise_for_status() for line in response.iter_lines(): if line.startswith(b'data:'): return json.loads(line[5:])["output"] return "No response received from MCP server" except Exception as e: logger.error(f"API call failed: {str(e)}") return f"Error: {str(e)}" agent = CodeAgent( tools=[], model="microsoft/DialoGPT-medium", system_prompt="""{{authorized_imports}} - requests for API calls - standard Python libraries {{managed_agents_descriptions}} You are a Technical Support Assistant with these capabilities: 1. Troubleshooting technical issues 2. Finding information via web search 3. Formatting instructions Access tools through MCP server: - knowledge_base: For technical issues - web_search: For information lookup - formatter: To organize steps Response workflow: 1. Analyze user request 2. Choose appropriate tool 3. Return clear response Example: USER: My wifi disconnected THOUGHT: Should use knowledge_base ACTION: knowledge_base("wifi disconnection") RESPONSE: Try these steps: [solution steps] Never show internal workflow to user.""" ) def chat_interface(message: str, history: list) -> str: """Handle chat interaction""" try: response = agent.run(message) if "ACTION:" in response: tool_call = response.split("ACTION:")[1].split("(")[0].strip() input_text = response.split("(")[1].split(")")[0].strip('"') return call_mcp_server(input_text, tool_call) return response except Exception as e: logger.error(f"Chat error: {str(e)}") return f"Error: {str(e)}" demo = gr.ChatInterface( fn=chat_interface, title="🔧 Technical Support", examples=["Wifi not working", "Find Windows 11 specs", "Format: Turn off. Wait. Restart"] ) if __name__ == "__main__": demo.launch()