Skip to content

Commit a5355f4

Browse files
4pmtongfengju0213
andauthored
feat: add configurable remote sub agents (#1643)
Co-authored-by: Sun Tao <2605127667@qq.com>
1 parent 9169d70 commit a5355f4

77 files changed

Lines changed: 4455 additions & 114 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ body:
1212
id: version
1313
attributes:
1414
label: What version of eigent are you using?
15-
placeholder: E.g., 0.0.90
15+
placeholder: E.g., 0.0.91
1616
validations:
1717
required: true
1818

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ jobs:
347347
files: |
348348
gh-release-assets/*
349349
350-
# Extract version from tag (e.g., v0.0.85 -> 0.0.90)
350+
# Extract version from tag (e.g., v0.0.85 -> 0.0.91)
351351
- name: Extract version
352352
if: startsWith(github.ref, 'refs/tags/')
353353
id: version

backend/app/agent/factory/browser.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
from camel.toolkits import ToolkitMessageIntegration
2121

2222
from app.agent.agent_model import agent_model
23+
from app.agent.factory.remote_sub_agent import (
24+
attach_remote_sub_agent_if_enabled,
25+
)
2326
from app.agent.listen_chat_agent import logger
2427
from app.agent.prompt import BROWSER_SYS_PROMPT
2528
from app.agent.toolkit.human_toolkit import HumanToolkit
@@ -279,6 +282,15 @@ def browser_agent(options: Chat):
279282
*search_tools,
280283
*skill_toolkit.get_tools(),
281284
]
285+
tool_names = [
286+
SearchToolkit.toolkit_name(),
287+
HybridBrowserToolkit.toolkit_name(),
288+
HumanToolkit.toolkit_name(),
289+
NoteTakingToolkit.toolkit_name(),
290+
TerminalToolkit.toolkit_name(),
291+
ScreenshotToolkit.toolkit_name(),
292+
SkillToolkit.toolkit_name(),
293+
]
282294

283295
# Build external browser notice
284296
external_browser_notice = ""
@@ -300,6 +312,16 @@ def browser_agent(options: Chat):
300312
now_str=NOW_STR,
301313
external_browser_notice=external_browser_notice,
302314
)
315+
system_message = attach_remote_sub_agent_if_enabled(
316+
options=options,
317+
agent_name=Agents.browser_agent,
318+
working_directory=working_directory,
319+
tools=tools,
320+
tool_names=tool_names,
321+
system_message=system_message,
322+
local_tool_description="local browser, search, or terminal actions",
323+
message_integration=message_integration,
324+
)
303325

304326
agent = agent_model(
305327
Agents.browser_agent,
@@ -310,15 +332,7 @@ def browser_agent(options: Chat):
310332
options,
311333
tools,
312334
prune_tool_calls_from_memory=True,
313-
tool_names=[
314-
SearchToolkit.toolkit_name(),
315-
HybridBrowserToolkit.toolkit_name(),
316-
HumanToolkit.toolkit_name(),
317-
NoteTakingToolkit.toolkit_name(),
318-
TerminalToolkit.toolkit_name(),
319-
ScreenshotToolkit.toolkit_name(),
320-
SkillToolkit.toolkit_name(),
321-
],
335+
tool_names=tool_names,
322336
toolkits_to_register_agent=[
323337
web_toolkit_for_agent_registration,
324338
screenshot_toolkit_for_agent_registration,

backend/app/agent/factory/developer.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
from camel.toolkits import ToolkitMessageIntegration
1919

2020
from app.agent.agent_model import agent_model
21+
from app.agent.factory.remote_sub_agent import (
22+
attach_remote_sub_agent_if_enabled,
23+
)
2124
from app.agent.listen_chat_agent import logger
2225
from app.agent.prompt import DEVELOPER_SYS_PROMPT
2326
from app.agent.toolkit.human_toolkit import HumanToolkit
@@ -103,12 +106,32 @@ async def developer_agent(options: Chat):
103106
*skill_toolkit.get_tools(),
104107
*search_tools,
105108
]
109+
tool_names = [
110+
HumanToolkit.toolkit_name(),
111+
TerminalToolkit.toolkit_name(),
112+
NoteTakingToolkit.toolkit_name(),
113+
WebDeployToolkit.toolkit_name(),
114+
ScreenshotToolkit.toolkit_name(),
115+
SkillToolkit.toolkit_name(),
116+
SearchToolkit.toolkit_name(),
117+
]
118+
106119
system_message = DEVELOPER_SYS_PROMPT.format(
107120
platform_system=platform.system(),
108121
platform_machine=platform.machine(),
109122
working_directory=working_directory,
110123
now_str=NOW_STR,
111124
)
125+
system_message = attach_remote_sub_agent_if_enabled(
126+
options=options,
127+
agent_name=Agents.developer_agent,
128+
working_directory=working_directory,
129+
tools=tools,
130+
tool_names=tool_names,
131+
system_message=system_message,
132+
local_tool_description="local `shell_exec` or local file writes",
133+
message_integration=message_integration,
134+
)
112135

113136
return agent_model(
114137
Agents.developer_agent,
@@ -118,15 +141,7 @@ async def developer_agent(options: Chat):
118141
),
119142
options,
120143
tools,
121-
tool_names=[
122-
HumanToolkit.toolkit_name(),
123-
TerminalToolkit.toolkit_name(),
124-
NoteTakingToolkit.toolkit_name(),
125-
WebDeployToolkit.toolkit_name(),
126-
ScreenshotToolkit.toolkit_name(),
127-
SkillToolkit.toolkit_name(),
128-
SearchToolkit.toolkit_name(),
129-
],
144+
tool_names=tool_names,
130145
toolkits_to_register_agent=[
131146
screenshot_toolkit_for_agent_registration,
132147
],

backend/app/agent/factory/document.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
from camel.toolkits import ToolkitMessageIntegration
1818

1919
from app.agent.agent_model import agent_model
20+
from app.agent.factory.remote_sub_agent import (
21+
attach_remote_sub_agent_if_enabled,
22+
)
2023
from app.agent.listen_chat_agent import logger
2124
from app.agent.prompt import DOCUMENT_SYS_PROMPT
2225
from app.agent.toolkit.excel_toolkit import ExcelToolkit
@@ -126,12 +129,37 @@ async def document_agent(options: Chat):
126129
*skill_toolkit.get_tools(),
127130
*search_tools,
128131
]
132+
tool_names = [
133+
FileToolkit.toolkit_name(),
134+
PPTXToolkit.toolkit_name(),
135+
HumanToolkit.toolkit_name(),
136+
MarkItDownToolkit.toolkit_name(),
137+
ExcelToolkit.toolkit_name(),
138+
NoteTakingToolkit.toolkit_name(),
139+
TerminalToolkit.toolkit_name(),
140+
ScreenshotToolkit.toolkit_name(),
141+
GoogleDriveMCPToolkit.toolkit_name(),
142+
SkillToolkit.toolkit_name(),
143+
SearchToolkit.toolkit_name(),
144+
]
129145
system_message = DOCUMENT_SYS_PROMPT.format(
130146
platform_system=platform.system(),
131147
platform_machine=platform.machine(),
132148
working_directory=working_directory,
133149
now_str=NOW_STR,
134150
)
151+
system_message = attach_remote_sub_agent_if_enabled(
152+
options=options,
153+
agent_name=Agents.document_agent,
154+
working_directory=working_directory,
155+
tools=tools,
156+
tool_names=tool_names,
157+
system_message=system_message,
158+
local_tool_description=(
159+
"local document, file, terminal, or search tools"
160+
),
161+
message_integration=message_integration,
162+
)
135163

136164
return agent_model(
137165
Agents.document_agent,
@@ -141,19 +169,7 @@ async def document_agent(options: Chat):
141169
),
142170
options,
143171
tools,
144-
tool_names=[
145-
FileToolkit.toolkit_name(),
146-
PPTXToolkit.toolkit_name(),
147-
HumanToolkit.toolkit_name(),
148-
MarkItDownToolkit.toolkit_name(),
149-
ExcelToolkit.toolkit_name(),
150-
NoteTakingToolkit.toolkit_name(),
151-
TerminalToolkit.toolkit_name(),
152-
ScreenshotToolkit.toolkit_name(),
153-
GoogleDriveMCPToolkit.toolkit_name(),
154-
SkillToolkit.toolkit_name(),
155-
SearchToolkit.toolkit_name(),
156-
],
172+
tool_names=tool_names,
157173
toolkits_to_register_agent=[
158174
screenshot_toolkit_for_agent_registration,
159175
],

backend/app/agent/factory/mcp.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,38 @@
1616
import uuid
1717

1818
from camel.models import ModelFactory
19+
from camel.toolkits import ToolkitMessageIntegration
1920
from camel.types import ModelPlatformType
2021

22+
from app.agent.factory.remote_sub_agent import (
23+
attach_remote_sub_agent_if_enabled,
24+
)
2125
from app.agent.listen_chat_agent import ListenChatAgent, logger
2226
from app.agent.prompt import MCP_SYS_PROMPT
27+
from app.agent.toolkit.human_toolkit import HumanToolkit
2328
from app.agent.toolkit.mcp_search_toolkit import McpSearchToolkit
2429
from app.agent.tools import get_mcp_tools
2530
from app.model.chat import Chat
2631
from app.model.model_platform import patch_bedrock_cloud_config
2732
from app.service.task import ActionCreateAgentData, Agents, get_task_lock
33+
from app.utils.file_utils import get_working_directory
2834

2935

3036
async def mcp_agent(options: Chat):
37+
working_directory = get_working_directory(options)
3138
logger.info(
3239
f"Creating MCP agent for project: {options.project_id} "
3340
f"with {len(options.installed_mcp['mcpServers'])} MCP servers"
3441
)
42+
message_integration = ToolkitMessageIntegration(
43+
message_handler=HumanToolkit(
44+
options.project_id, Agents.mcp_agent
45+
).send_message_to_user
46+
)
3547
tools = [
3648
*McpSearchToolkit(options.project_id).get_tools(),
3749
]
50+
tool_names = [McpSearchToolkit.toolkit_name()]
3851
if len(options.installed_mcp["mcpServers"]) > 0:
3952
try:
4053
mcp_tools = await get_mcp_tools(options.installed_mcp)
@@ -43,15 +56,16 @@ async def mcp_agent(options: Chat):
4356
f"for task {options.project_id}"
4457
)
4558
if mcp_tools:
46-
tool_names = [
59+
mcp_tool_names = [
4760
(
4861
tool.get_function_name()
4962
if hasattr(tool, "get_function_name")
5063
else str(tool)
5164
)
5265
for tool in mcp_tools
5366
]
54-
logger.debug(f"MCP tools: {tool_names}")
67+
logger.debug(f"MCP tools: {mcp_tool_names}")
68+
tool_names.extend(mcp_tool_names)
5569
tools = [*tools, *mcp_tools]
5670
except Exception as e:
5771
logger.debug(repr(e))
@@ -92,6 +106,17 @@ async def mcp_agent(options: Chat):
92106
extra_params = dict(extra_params)
93107
extra_params.setdefault("api_version", "2024-12-01-preview")
94108

109+
system_message = attach_remote_sub_agent_if_enabled(
110+
options=options,
111+
agent_name=Agents.mcp_agent,
112+
working_directory=working_directory,
113+
tools=tools,
114+
tool_names=tool_names,
115+
system_message=MCP_SYS_PROMPT,
116+
local_tool_description="local MCP or search tools",
117+
message_integration=message_integration,
118+
)
119+
95120
# Build model_config_dict with prompt caching
96121
model_config_dict = {}
97122
if options.is_cloud():
@@ -116,7 +141,7 @@ async def mcp_agent(options: Chat):
116141
return ListenChatAgent(
117142
options.project_id,
118143
Agents.mcp_agent,
119-
system_message=MCP_SYS_PROMPT,
144+
system_message=system_message,
120145
model=ModelFactory.create(
121146
model_platform=options.model_platform,
122147
model_type=options.model_type,

backend/app/agent/factory/multi_modal.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
from camel.types import ModelPlatformType
2020

2121
from app.agent.agent_model import agent_model
22+
from app.agent.factory.remote_sub_agent import (
23+
attach_remote_sub_agent_if_enabled,
24+
)
2225
from app.agent.listen_chat_agent import logger
2326
from app.agent.prompt import MULTI_MODAL_SYS_PROMPT
2427
from app.agent.toolkit.audio_analysis_toolkit import AudioAnalysisToolkit
@@ -149,12 +152,35 @@ def multi_modal_agent(options: Chat):
149152
)
150153
tools.extend(audio_analysis_toolkit.get_tools())
151154

155+
tool_names = [
156+
VideoDownloaderToolkit.toolkit_name(),
157+
AudioAnalysisToolkit.toolkit_name(),
158+
ScreenshotToolkit.toolkit_name(),
159+
OpenAIImageToolkit.toolkit_name(),
160+
HumanToolkit.toolkit_name(),
161+
TerminalToolkit.toolkit_name(),
162+
NoteTakingToolkit.toolkit_name(),
163+
SearchToolkit.toolkit_name(),
164+
SkillToolkit.toolkit_name(),
165+
]
152166
system_message = MULTI_MODAL_SYS_PROMPT.format(
153167
platform_system=platform.system(),
154168
platform_machine=platform.machine(),
155169
working_directory=working_directory,
156170
now_str=NOW_STR,
157171
)
172+
system_message = attach_remote_sub_agent_if_enabled(
173+
options=options,
174+
agent_name=Agents.multi_modal_agent,
175+
working_directory=working_directory,
176+
tools=tools,
177+
tool_names=tool_names,
178+
system_message=system_message,
179+
local_tool_description=(
180+
"local media, terminal, file, or search tools"
181+
),
182+
message_integration=message_integration,
183+
)
158184

159185
return agent_model(
160186
Agents.multi_modal_agent,
@@ -164,17 +190,7 @@ def multi_modal_agent(options: Chat):
164190
),
165191
options,
166192
tools,
167-
tool_names=[
168-
VideoDownloaderToolkit.toolkit_name(),
169-
AudioAnalysisToolkit.toolkit_name(),
170-
ScreenshotToolkit.toolkit_name(),
171-
OpenAIImageToolkit.toolkit_name(),
172-
HumanToolkit.toolkit_name(),
173-
TerminalToolkit.toolkit_name(),
174-
NoteTakingToolkit.toolkit_name(),
175-
SearchToolkit.toolkit_name(),
176-
SkillToolkit.toolkit_name(),
177-
],
193+
tool_names=tool_names,
178194
toolkits_to_register_agent=[
179195
screenshot_toolkit_for_agent_registration,
180196
],

0 commit comments

Comments
 (0)