from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, PythonInterpreterTool, VisitWebpageTool, WikipediaSearchTool from smolagents import LiteLLMModel import os from smolagents import CodeAgent from mcp import StdioServerParameters from custom_mcp import create_mcp_client def run_orchestrator(prompt): """ Runs the orchestrator agent with the given prompt and returns the answer. Args: prompt (str): The prompt to run with the orchestrator Returns: str: The answer from the orchestrator """ ''' model = LiteLLMModel( model_id="openrouter/google/gemini-2.5-flash-preview", api_base="https://openrouter.ai/api/v1", api_key="your_api_key_here", num_ctx=1000000, ) ''' model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") # Store active clients to clean up later active_clients = [] def create_client_safely(name, params): """Create an MCP client and handle errors gracefully""" try: client = create_mcp_client(params) active_clients.append(client) print(f"✅ Successfully connected to {name} MCP server") return client except Exception as e: print(f"❌ Error connecting to {name} MCP server: {e}") return None ## Define MCP parameters wikipedia_params = StdioServerParameters( command="npx", args=["-y", "wikipedia-mcp"], env=os.environ ) fetch_webpage_params = StdioServerParameters( command="uvx", args=["mcp-server-fetch"], env=os.environ ) youtube_transcript_params = StdioServerParameters( command="uvx", args=["--from", "git+https://github.com/jkawamoto/mcp-youtube-transcript", "mcp-youtube-transcript"], env=os.environ ) code_reasoning_params = StdioServerParameters( command="npx", args=["-y", "@mettamatt/code-reasoning"], env=os.environ ) sequential_thinking_params = StdioServerParameters( command="npx", args=["-y", "@modelcontextprotocol/server-sequential-thinking"], env=os.environ ) # Connect to MCP servers safely wikipedia_client = create_client_safely("Wikipedia", wikipedia_params) youtube_transcript_client = create_client_safely("YouTube Transcript", youtube_transcript_params) code_reasoning_client = create_client_safely("Code Reasoning", code_reasoning_params) sequential_thinking_client = create_client_safely("Sequential Thinking", sequential_thinking_params) fetch_webpage_client = create_client_safely("Fetch Webpage", fetch_webpage_params) answer = None try: # Only create agents for services that connected successfully agents = [] if sequential_thinking_client: reasoning_agent = CodeAgent( tools=[*sequential_thinking_client.get_tools()], model=model, name="reasoning_agent", description="Analyzes complex problems using logical reasoning." ) agents.append(reasoning_agent) if code_reasoning_client: code_agent = CodeAgent( tools=[PythonInterpreterTool(), *code_reasoning_client.get_tools()], model=model, additional_authorized_imports=['pandas','csv', 'numpy', 'requests', 'matplotlib', 'seaborn', 'plotly', 'scipy', 'sklearn'], name="code_agent", description="Writes and executes Python code to solve computational and data analysis problems. Also reason about the code and the results." ) agents.append(code_agent) if youtube_transcript_client: youtube_agent = CodeAgent( tools=[*youtube_transcript_client.get_tools()], model=model, name="youtube_agent", description="Gets the transcript of a youtube video." ) agents.append(youtube_agent) if wikipedia_client: wikipedia_agent = CodeAgent( tools=[*wikipedia_client.get_tools()], model=model, name="wikipedia_agent", description="Searches Wikipedia for information." ) agents.append(wikipedia_agent) # Create the orchestrator agent if we have any working agents if agents: if fetch_webpage_client: search_agent = CodeAgent( tools=[DuckDuckGoSearchTool(), *fetch_webpage_client.get_tools()], model=model, name="search_agent", description="Performs web searches to find factual information online." ) else: search_agent = CodeAgent( tools=[VisitWebpageTool(), DuckDuckGoSearchTool()], model=model, name="search_agent", description="Performs web searches to find factual information online." ) manager_agent = CodeAgent( tools=[], model=model, managed_agents=[search_agent, *agents], name="orchestrator", description="Coordinates specialized agents to solve complex problems." ) # Run the agent with the given prompt and get the answer answer = manager_agent.run(prompt) else: print("❌ No agents were created - all MCP servers failed to connect") answer = "Error: No agents were available to process the question." finally: # Clean up all active clients for client in active_clients: try: client.disconnect() except: pass return answer