Spaces:
Sleeping
Sleeping
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 |