Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ body:
id: version
attributes:
label: What version of eigent are you using?
placeholder: E.g., 0.0.90
placeholder: E.g., 0.0.91
validations:
required: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ jobs:
files: |
gh-release-assets/*

# Extract version from tag (e.g., v0.0.85 -> 0.0.90)
# Extract version from tag (e.g., v0.0.85 -> 0.0.91)
- name: Extract version
if: startsWith(github.ref, 'refs/tags/')
id: version
Expand Down
32 changes: 23 additions & 9 deletions backend/app/agent/factory/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
from camel.toolkits import ToolkitMessageIntegration

from app.agent.agent_model import agent_model
from app.agent.factory.remote_sub_agent import (
attach_remote_sub_agent_if_enabled,
)
from app.agent.listen_chat_agent import logger
from app.agent.prompt import BROWSER_SYS_PROMPT
from app.agent.toolkit.human_toolkit import HumanToolkit
Expand Down Expand Up @@ -279,6 +282,15 @@ def browser_agent(options: Chat):
*search_tools,
*skill_toolkit.get_tools(),
]
tool_names = [
SearchToolkit.toolkit_name(),
HybridBrowserToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
]

# Build external browser notice
external_browser_notice = ""
Expand All @@ -300,6 +312,16 @@ def browser_agent(options: Chat):
now_str=NOW_STR,
external_browser_notice=external_browser_notice,
)
system_message = attach_remote_sub_agent_if_enabled(
options=options,
agent_name=Agents.browser_agent,
working_directory=working_directory,
tools=tools,
tool_names=tool_names,
system_message=system_message,
local_tool_description="local browser, search, or terminal actions",
message_integration=message_integration,
)

agent = agent_model(
Agents.browser_agent,
Expand All @@ -310,15 +332,7 @@ def browser_agent(options: Chat):
options,
tools,
prune_tool_calls_from_memory=True,
tool_names=[
SearchToolkit.toolkit_name(),
HybridBrowserToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
],
tool_names=tool_names,
toolkits_to_register_agent=[
web_toolkit_for_agent_registration,
screenshot_toolkit_for_agent_registration,
Expand Down
33 changes: 24 additions & 9 deletions backend/app/agent/factory/developer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
from camel.toolkits import ToolkitMessageIntegration

from app.agent.agent_model import agent_model
from app.agent.factory.remote_sub_agent import (
attach_remote_sub_agent_if_enabled,
)
from app.agent.listen_chat_agent import logger
from app.agent.prompt import DEVELOPER_SYS_PROMPT
from app.agent.toolkit.human_toolkit import HumanToolkit
Expand Down Expand Up @@ -103,12 +106,32 @@ async def developer_agent(options: Chat):
*skill_toolkit.get_tools(),
*search_tools,
]
tool_names = [
HumanToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
WebDeployToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
]

system_message = DEVELOPER_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
working_directory=working_directory,
now_str=NOW_STR,
)
system_message = attach_remote_sub_agent_if_enabled(
options=options,
agent_name=Agents.developer_agent,
working_directory=working_directory,
tools=tools,
tool_names=tool_names,
system_message=system_message,
local_tool_description="local `shell_exec` or local file writes",
message_integration=message_integration,
)

return agent_model(
Agents.developer_agent,
Expand All @@ -118,15 +141,7 @@ async def developer_agent(options: Chat):
),
options,
tools,
tool_names=[
HumanToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
WebDeployToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
],
tool_names=tool_names,
toolkits_to_register_agent=[
screenshot_toolkit_for_agent_registration,
],
Expand Down
42 changes: 29 additions & 13 deletions backend/app/agent/factory/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
from camel.toolkits import ToolkitMessageIntegration

from app.agent.agent_model import agent_model
from app.agent.factory.remote_sub_agent import (
attach_remote_sub_agent_if_enabled,
)
from app.agent.listen_chat_agent import logger
from app.agent.prompt import DOCUMENT_SYS_PROMPT
from app.agent.toolkit.excel_toolkit import ExcelToolkit
Expand Down Expand Up @@ -126,12 +129,37 @@ async def document_agent(options: Chat):
*skill_toolkit.get_tools(),
*search_tools,
]
tool_names = [
FileToolkit.toolkit_name(),
PPTXToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
MarkItDownToolkit.toolkit_name(),
ExcelToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
GoogleDriveMCPToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
]
system_message = DOCUMENT_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
working_directory=working_directory,
now_str=NOW_STR,
)
system_message = attach_remote_sub_agent_if_enabled(
options=options,
agent_name=Agents.document_agent,
working_directory=working_directory,
tools=tools,
tool_names=tool_names,
system_message=system_message,
local_tool_description=(
"local document, file, terminal, or search tools"
),
message_integration=message_integration,
)

return agent_model(
Agents.document_agent,
Expand All @@ -141,19 +169,7 @@ async def document_agent(options: Chat):
),
options,
tools,
tool_names=[
FileToolkit.toolkit_name(),
PPTXToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
MarkItDownToolkit.toolkit_name(),
ExcelToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
GoogleDriveMCPToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
],
tool_names=tool_names,
toolkits_to_register_agent=[
screenshot_toolkit_for_agent_registration,
],
Expand Down
31 changes: 28 additions & 3 deletions backend/app/agent/factory/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,38 @@
import uuid

from camel.models import ModelFactory
from camel.toolkits import ToolkitMessageIntegration
from camel.types import ModelPlatformType

from app.agent.factory.remote_sub_agent import (
attach_remote_sub_agent_if_enabled,
)
from app.agent.listen_chat_agent import ListenChatAgent, logger
from app.agent.prompt import MCP_SYS_PROMPT
from app.agent.toolkit.human_toolkit import HumanToolkit
from app.agent.toolkit.mcp_search_toolkit import McpSearchToolkit
from app.agent.tools import get_mcp_tools
from app.model.chat import Chat
from app.model.model_platform import patch_bedrock_cloud_config
from app.service.task import ActionCreateAgentData, Agents, get_task_lock
from app.utils.file_utils import get_working_directory


async def mcp_agent(options: Chat):
working_directory = get_working_directory(options)
logger.info(
f"Creating MCP agent for project: {options.project_id} "
f"with {len(options.installed_mcp['mcpServers'])} MCP servers"
)
message_integration = ToolkitMessageIntegration(
message_handler=HumanToolkit(
options.project_id, Agents.mcp_agent
).send_message_to_user
)
tools = [
*McpSearchToolkit(options.project_id).get_tools(),
]
tool_names = [McpSearchToolkit.toolkit_name()]
if len(options.installed_mcp["mcpServers"]) > 0:
try:
mcp_tools = await get_mcp_tools(options.installed_mcp)
Expand All @@ -43,15 +56,16 @@ async def mcp_agent(options: Chat):
f"for task {options.project_id}"
)
if mcp_tools:
tool_names = [
mcp_tool_names = [
(
tool.get_function_name()
if hasattr(tool, "get_function_name")
else str(tool)
)
for tool in mcp_tools
]
logger.debug(f"MCP tools: {tool_names}")
logger.debug(f"MCP tools: {mcp_tool_names}")
tool_names.extend(mcp_tool_names)
tools = [*tools, *mcp_tools]
except Exception as e:
logger.debug(repr(e))
Expand Down Expand Up @@ -92,6 +106,17 @@ async def mcp_agent(options: Chat):
extra_params = dict(extra_params)
extra_params.setdefault("api_version", "2024-12-01-preview")

system_message = attach_remote_sub_agent_if_enabled(
options=options,
agent_name=Agents.mcp_agent,
working_directory=working_directory,
tools=tools,
tool_names=tool_names,
system_message=MCP_SYS_PROMPT,
local_tool_description="local MCP or search tools",
message_integration=message_integration,
)

# Build model_config_dict with prompt caching
model_config_dict = {}
if options.is_cloud():
Expand All @@ -116,7 +141,7 @@ async def mcp_agent(options: Chat):
return ListenChatAgent(
options.project_id,
Agents.mcp_agent,
system_message=MCP_SYS_PROMPT,
system_message=system_message,
model=ModelFactory.create(
model_platform=options.model_platform,
model_type=options.model_type,
Expand Down
38 changes: 27 additions & 11 deletions backend/app/agent/factory/multi_modal.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
from camel.types import ModelPlatformType

from app.agent.agent_model import agent_model
from app.agent.factory.remote_sub_agent import (
attach_remote_sub_agent_if_enabled,
)
from app.agent.listen_chat_agent import logger
from app.agent.prompt import MULTI_MODAL_SYS_PROMPT
from app.agent.toolkit.audio_analysis_toolkit import AudioAnalysisToolkit
Expand Down Expand Up @@ -149,12 +152,35 @@ def multi_modal_agent(options: Chat):
)
tools.extend(audio_analysis_toolkit.get_tools())

tool_names = [
VideoDownloaderToolkit.toolkit_name(),
AudioAnalysisToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
OpenAIImageToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
]
system_message = MULTI_MODAL_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
working_directory=working_directory,
now_str=NOW_STR,
)
system_message = attach_remote_sub_agent_if_enabled(
options=options,
agent_name=Agents.multi_modal_agent,
working_directory=working_directory,
tools=tools,
tool_names=tool_names,
system_message=system_message,
local_tool_description=(
"local media, terminal, file, or search tools"
),
message_integration=message_integration,
)

return agent_model(
Agents.multi_modal_agent,
Expand All @@ -164,17 +190,7 @@ def multi_modal_agent(options: Chat):
),
options,
tools,
tool_names=[
VideoDownloaderToolkit.toolkit_name(),
AudioAnalysisToolkit.toolkit_name(),
ScreenshotToolkit.toolkit_name(),
OpenAIImageToolkit.toolkit_name(),
HumanToolkit.toolkit_name(),
TerminalToolkit.toolkit_name(),
NoteTakingToolkit.toolkit_name(),
SearchToolkit.toolkit_name(),
SkillToolkit.toolkit_name(),
],
tool_names=tool_names,
toolkits_to_register_agent=[
screenshot_toolkit_for_agent_registration,
],
Expand Down
Loading
Loading