Spaces:
Sleeping
Sleeping
Create agents.py
Browse files
agents.py
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, PythonInterpreterTool, VisitWebpageTool, WikipediaSearchTool
|
| 2 |
+
from smolagents import LiteLLMModel
|
| 3 |
+
import os
|
| 4 |
+
from smolagents import CodeAgent
|
| 5 |
+
from mcp import StdioServerParameters
|
| 6 |
+
from custom_mcp import create_mcp_client
|
| 7 |
+
|
| 8 |
+
def run_orchestrator(prompt):
|
| 9 |
+
"""
|
| 10 |
+
Runs the orchestrator agent with the given prompt and returns the answer.
|
| 11 |
+
|
| 12 |
+
Args:
|
| 13 |
+
prompt (str): The prompt to run with the orchestrator
|
| 14 |
+
|
| 15 |
+
Returns:
|
| 16 |
+
str: The answer from the orchestrator
|
| 17 |
+
"""
|
| 18 |
+
'''
|
| 19 |
+
model = LiteLLMModel(
|
| 20 |
+
model_id="openrouter/google/gemini-2.5-flash-preview",
|
| 21 |
+
api_base="https://openrouter.ai/api/v1",
|
| 22 |
+
api_key="your_api_key_here",
|
| 23 |
+
num_ctx=1000000,
|
| 24 |
+
)
|
| 25 |
+
'''
|
| 26 |
+
|
| 27 |
+
model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct")
|
| 28 |
+
|
| 29 |
+
# Store active clients to clean up later
|
| 30 |
+
active_clients = []
|
| 31 |
+
|
| 32 |
+
def create_client_safely(name, params):
|
| 33 |
+
"""Create an MCP client and handle errors gracefully"""
|
| 34 |
+
try:
|
| 35 |
+
client = create_mcp_client(params)
|
| 36 |
+
active_clients.append(client)
|
| 37 |
+
print(f"✅ Successfully connected to {name} MCP server")
|
| 38 |
+
return client
|
| 39 |
+
except Exception as e:
|
| 40 |
+
print(f"❌ Error connecting to {name} MCP server: {e}")
|
| 41 |
+
return None
|
| 42 |
+
|
| 43 |
+
## Define MCP parameters
|
| 44 |
+
wikipedia_params = StdioServerParameters(
|
| 45 |
+
command="npx",
|
| 46 |
+
args=["-y", "wikipedia-mcp"],
|
| 47 |
+
env=os.environ
|
| 48 |
+
)
|
| 49 |
+
|
| 50 |
+
fetch_webpage_params = StdioServerParameters(
|
| 51 |
+
command="uvx",
|
| 52 |
+
args=["mcp-server-fetch"],
|
| 53 |
+
env=os.environ
|
| 54 |
+
)
|
| 55 |
+
|
| 56 |
+
youtube_transcript_params = StdioServerParameters(
|
| 57 |
+
command="uvx",
|
| 58 |
+
args=["--from", "git+https://github.com/jkawamoto/mcp-youtube-transcript", "mcp-youtube-transcript"],
|
| 59 |
+
env=os.environ
|
| 60 |
+
)
|
| 61 |
+
|
| 62 |
+
code_reasoning_params = StdioServerParameters(
|
| 63 |
+
command="npx",
|
| 64 |
+
args=["-y", "@mettamatt/code-reasoning"],
|
| 65 |
+
env=os.environ
|
| 66 |
+
)
|
| 67 |
+
|
| 68 |
+
sequential_thinking_params = StdioServerParameters(
|
| 69 |
+
command="npx",
|
| 70 |
+
args=["-y", "@modelcontextprotocol/server-sequential-thinking"],
|
| 71 |
+
env=os.environ
|
| 72 |
+
)
|
| 73 |
+
|
| 74 |
+
# Connect to MCP servers safely
|
| 75 |
+
wikipedia_client = create_client_safely("Wikipedia", wikipedia_params)
|
| 76 |
+
youtube_transcript_client = create_client_safely("YouTube Transcript", youtube_transcript_params)
|
| 77 |
+
code_reasoning_client = create_client_safely("Code Reasoning", code_reasoning_params)
|
| 78 |
+
sequential_thinking_client = create_client_safely("Sequential Thinking", sequential_thinking_params)
|
| 79 |
+
fetch_webpage_client = create_client_safely("Fetch Webpage", fetch_webpage_params)
|
| 80 |
+
|
| 81 |
+
answer = None
|
| 82 |
+
try:
|
| 83 |
+
# Only create agents for services that connected successfully
|
| 84 |
+
agents = []
|
| 85 |
+
|
| 86 |
+
if sequential_thinking_client:
|
| 87 |
+
reasoning_agent = CodeAgent(
|
| 88 |
+
tools=[*sequential_thinking_client.get_tools()],
|
| 89 |
+
model=model,
|
| 90 |
+
name="reasoning_agent",
|
| 91 |
+
description="Analyzes complex problems using logical reasoning."
|
| 92 |
+
)
|
| 93 |
+
agents.append(reasoning_agent)
|
| 94 |
+
|
| 95 |
+
if code_reasoning_client:
|
| 96 |
+
code_agent = CodeAgent(
|
| 97 |
+
tools=[PythonInterpreterTool(), *code_reasoning_client.get_tools()],
|
| 98 |
+
model=model,
|
| 99 |
+
additional_authorized_imports=['pandas','csv', 'numpy', 'requests', 'matplotlib', 'seaborn', 'plotly', 'scipy', 'sklearn'],
|
| 100 |
+
name="code_agent",
|
| 101 |
+
description="Writes and executes Python code to solve computational and data analysis problems. Also reason about the code and the results."
|
| 102 |
+
)
|
| 103 |
+
agents.append(code_agent)
|
| 104 |
+
|
| 105 |
+
if youtube_transcript_client:
|
| 106 |
+
youtube_agent = CodeAgent(
|
| 107 |
+
tools=[*youtube_transcript_client.get_tools()],
|
| 108 |
+
model=model,
|
| 109 |
+
name="youtube_agent",
|
| 110 |
+
description="Gets the transcript of a youtube video."
|
| 111 |
+
)
|
| 112 |
+
agents.append(youtube_agent)
|
| 113 |
+
|
| 114 |
+
if wikipedia_client:
|
| 115 |
+
wikipedia_agent = CodeAgent(
|
| 116 |
+
tools=[*wikipedia_client.get_tools()],
|
| 117 |
+
model=model,
|
| 118 |
+
name="wikipedia_agent",
|
| 119 |
+
description="Searches Wikipedia for information."
|
| 120 |
+
)
|
| 121 |
+
agents.append(wikipedia_agent)
|
| 122 |
+
|
| 123 |
+
# Create the orchestrator agent if we have any working agents
|
| 124 |
+
if agents:
|
| 125 |
+
if fetch_webpage_client:
|
| 126 |
+
search_agent = CodeAgent(
|
| 127 |
+
tools=[DuckDuckGoSearchTool(), *fetch_webpage_client.get_tools()],
|
| 128 |
+
model=model,
|
| 129 |
+
name="search_agent",
|
| 130 |
+
description="Performs web searches to find factual information online."
|
| 131 |
+
)
|
| 132 |
+
else:
|
| 133 |
+
search_agent = CodeAgent(
|
| 134 |
+
tools=[VisitWebpageTool(), DuckDuckGoSearchTool()],
|
| 135 |
+
model=model,
|
| 136 |
+
name="search_agent",
|
| 137 |
+
description="Performs web searches to find factual information online."
|
| 138 |
+
)
|
| 139 |
+
|
| 140 |
+
manager_agent = CodeAgent(
|
| 141 |
+
tools=[],
|
| 142 |
+
model=model,
|
| 143 |
+
managed_agents=[search_agent, *agents],
|
| 144 |
+
name="orchestrator",
|
| 145 |
+
description="Coordinates specialized agents to solve complex problems."
|
| 146 |
+
)
|
| 147 |
+
|
| 148 |
+
# Run the agent with the given prompt and get the answer
|
| 149 |
+
answer = manager_agent.run(prompt)
|
| 150 |
+
else:
|
| 151 |
+
print("❌ No agents were created - all MCP servers failed to connect")
|
| 152 |
+
answer = "Error: No agents were available to process the question."
|
| 153 |
+
|
| 154 |
+
finally:
|
| 155 |
+
# Clean up all active clients
|
| 156 |
+
for client in active_clients:
|
| 157 |
+
try:
|
| 158 |
+
client.disconnect()
|
| 159 |
+
except:
|
| 160 |
+
pass
|
| 161 |
+
|
| 162 |
+
return answer
|