diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 3f383f38..3d005689 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -865,7 +865,7 @@ async def resume_agent_chat( async def save_agent_config( agent_id: str, config: dict = Body(...), - reload_graph: bool = Query(False), + reload_graph: bool = Query(True), current_user: User = Depends(get_required_user), ): """保存智能体配置到YAML文件(需要登录)""" diff --git a/src/agents/chatbot/context.py b/src/agents/chatbot/context.py index 07d1e5bd..5d6efda2 100644 --- a/src/agents/chatbot/context.py +++ b/src/agents/chatbot/context.py @@ -36,6 +36,7 @@ class Context(BaseContext): "options": lambda: list(MCP_SERVERS.keys()), "description": ( "MCP服务器列表,建议使用支持 SSE 的 MCP 服务器," - "如果需要使用 uvx 或 npx 运行的服务器,也请在项目外部启动 MCP 服务器,并在项目中配置 MCP 服务器。"), + "如果需要使用 uvx 或 npx 运行的服务器,也请在项目外部启动 MCP 服务器,并在项目中配置 MCP 服务器。" + ), }, ) diff --git a/src/agents/chatbot/graph.py b/src/agents/chatbot/graph.py index 58a61ced..8a21c92d 100644 --- a/src/agents/chatbot/graph.py +++ b/src/agents/chatbot/graph.py @@ -4,8 +4,6 @@ from langchain.agents.middleware import ModelRetryMiddleware from src.agents.common import BaseAgent, load_chat_model from src.agents.common.mcp import get_mcp_tools from src.agents.common.middlewares import ( - context_aware_prompt, - context_based_model, inject_attachment_context, ) from src.agents.common.tools import get_kb_based_tools @@ -17,7 +15,7 @@ from .tools import get_tools class ChatbotAgent(BaseAgent): name = "智能体助手" description = "基础的对话机器人,可以回答问题,默认不使用任何工具,可在配置中启用需要的工具。" - capabilities = ["file_upload", "reload_graph"] # 支持文件上传功能和重载图 + capabilities = ["file_upload"] # 支持文件上传功能 def __init__(self, **kwargs): super().__init__(**kwargs) @@ -26,7 +24,6 @@ class ChatbotAgent(BaseAgent): self.context_schema = Context async def get_tools(self, tools: list[str] = None, mcps=None, knowledges=None): - # 1. 基础工具 (从 context.tools 中筛选) all_basic_tools = get_tools() selected_tools = [] @@ -63,10 +60,9 @@ class ChatbotAgent(BaseAgent): graph = create_agent( model=load_chat_model(context.model), # 使用 context 中的模型配置 tools=await self.get_tools(context.tools, context.mcps, context.knowledges), + system_prompt=context.system_prompt, middleware=[ - context_aware_prompt, # 动态系统提示词 inject_attachment_context, # 附件上下文注入 - context_based_model, # 动态模型选择 ModelRetryMiddleware(), # 模型重试中间件 ], checkpointer=await self._get_checkpointer(), @@ -82,4 +78,4 @@ def main(): if __name__ == "__main__": main() - # asyncio.run(main()) \ No newline at end of file + # asyncio.run(main()) diff --git a/src/agents/common/context.py b/src/agents/common/context.py index dd9bc572..789bbd60 100644 --- a/src/agents/common/context.py +++ b/src/agents/common/context.py @@ -49,7 +49,7 @@ class BaseContext: metadata={ "name": "智能体模型", "options": [], - "description": "智能体的驱动模型,建议选择 Agent 能力较强的模型,不建议使用小参数模型。" + "description": "智能体的驱动模型,建议选择 Agent 能力较强的模型,不建议使用小参数模型。", }, ) diff --git a/src/agents/deep_agent/graph.py b/src/agents/deep_agent/graph.py index 3b018c5c..dd67368a 100644 --- a/src/agents/deep_agent/graph.py +++ b/src/agents/deep_agent/graph.py @@ -7,7 +7,7 @@ from langchain.agents import create_agent from langchain.agents.middleware import ModelRequest, SummarizationMiddleware, TodoListMiddleware, dynamic_prompt from src.agents.common import BaseAgent, load_chat_model -from src.agents.common.middlewares import context_based_model, inject_attachment_context +from src.agents.common.middlewares import inject_attachment_context from src.agents.common.tools import search from .context import DeepContext @@ -64,7 +64,6 @@ class DeepAgent(BaseAgent): "file_upload", "todo", "files", - "reload_graph", ] def __init__(self, **kwargs): @@ -93,8 +92,8 @@ class DeepAgent(BaseAgent): graph = create_agent( model=model, tools=tools, + system_prompt=context.system_prompt, middleware=[ - context_based_model, # 动态模型选择 context_aware_prompt, # 动态系统提示词 inject_attachment_context, # 附件上下文注入 TodoListMiddleware(), @@ -104,8 +103,8 @@ class DeepAgent(BaseAgent): default_tools=tools, subagents=[critique_sub_agent, research_sub_agent], default_middleware=[ - TodoListMiddleware(), - FilesystemMiddleware(), + TodoListMiddleware(), # 子智能体也有 todo 列表 + FilesystemMiddleware(), # 当前的两个文件系统是隔离的 SummarizationMiddleware( model=sub_model, trigger=("tokens", 110000), diff --git a/src/agents/mini_agent/graph.py b/src/agents/mini_agent/graph.py index 0e094659..21d068d3 100644 --- a/src/agents/mini_agent/graph.py +++ b/src/agents/mini_agent/graph.py @@ -2,7 +2,6 @@ from langchain.agents import create_agent from src import config from src.agents.common import BaseAgent, get_buildin_tools, load_chat_model -from src.agents.common.middlewares import context_aware_prompt, context_based_model class MiniAgent(BaseAgent): @@ -19,11 +18,13 @@ class MiniAgent(BaseAgent): if self.graph: return self.graph + context = self.context_schema.from_file(module_name=self.module_name) + # 创建 MiniAgent graph = create_agent( - model=load_chat_model(config.default_model), # 实际会被覆盖 + model=load_chat_model(config.default_model), + system_prompt=context.system_prompt, tools=self.get_tools(), - middleware=[context_aware_prompt, context_based_model], checkpointer=await self._get_checkpointer(), ) diff --git a/src/agents/reporter/graph.py b/src/agents/reporter/graph.py index 11f64cec..ec6655b6 100644 --- a/src/agents/reporter/graph.py +++ b/src/agents/reporter/graph.py @@ -2,7 +2,6 @@ from langchain.agents import create_agent from src import config from src.agents.common import BaseAgent, get_mcp_tools, load_chat_model -from src.agents.common.middlewares import context_aware_prompt, context_based_model from src.agents.common.toolkits.mysql import get_mysql_tools from src.utils import logger @@ -25,11 +24,13 @@ class SqlReporterAgent(BaseAgent): if self.graph: return self.graph + context = self.context_schema.from_file(module_name=self.module_name) + # 创建 SqlReporterAgent graph = create_agent( model=load_chat_model(config.default_model), # 默认模型,会被 middleware 覆盖 + system_prompt=context.system_prompt, tools=await self.get_tools(), - middleware=[context_aware_prompt, context_based_model], checkpointer=await self._get_checkpointer(), ) diff --git a/web/src/components/AgentConfigSidebar.vue b/web/src/components/AgentConfigSidebar.vue index b15cc48c..7c670cb6 100644 --- a/web/src/components/AgentConfigSidebar.vue +++ b/web/src/components/AgentConfigSidebar.vue @@ -220,7 +220,7 @@
@@ -334,12 +334,6 @@ const isEmptyConfig = computed(() => { return !selectedAgentId.value || Object.keys(configurableItems.value).length === 0; }); -const needsReload = computed(() => { - return selectedAgent.value && - selectedAgent.value.capabilities && - selectedAgent.value.capabilities.includes('reload_graph'); -}); - const filteredTools = computed(() => { const toolsList = availableTools.value ? Object.values(availableTools.value) : []; if (!toolsSearchText.value) { @@ -536,12 +530,7 @@ const saveConfig = async () => { message.info('检测到无效配置项,已自动过滤'); } - const options = {}; - if (selectedAgent.value && selectedAgent.value.capabilities && selectedAgent.value.capabilities.includes('reload_graph')) { - options.reload_graph = true; - } - - await agentStore.saveAgentConfig(options); + await agentStore.saveAgentConfig(); message.success('配置已保存到服务器'); } catch (error) { console.error('保存配置到服务器出错:', error);