From 2ea78619b914504a2ae26182e71dbd521050ae5f Mon Sep 17 00:00:00 2001 From: zxstty Date: Sat, 16 Aug 2025 16:09:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E5=AE=8C=E5=96=84json=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/scheduler/mcp_agent/base.py | 8 ++++---- apps/scheduler/mcp_agent/plan.py | 3 --- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/scheduler/mcp_agent/base.py b/apps/scheduler/mcp_agent/base.py index 6cd60a93..65cbec47 100644 --- a/apps/scheduler/mcp_agent/base.py +++ b/apps/scheduler/mcp_agent/base.py @@ -16,8 +16,8 @@ class MCPBase: """获取推理结果""" # 调用推理大模型 message = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": prompt}, + {"role": "system", "content": prompt}, + {"role": "user", "content": "Please provide a JSON response based on the above information."}, ] result = "" async for chunk in resoning_llm.call( @@ -50,10 +50,10 @@ class MCPBase: flag = False if not flag: json_generator = JsonGenerator( - "请提取下面内容中的json\n\n", + "Please provide a JSON response based on the above information.\n\n", [ {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "请提取下面内容中的json\n\n"+result}, + {"role": "user", "content": result}, ], schema, ) diff --git a/apps/scheduler/mcp_agent/plan.py b/apps/scheduler/mcp_agent/plan.py index 31b3c7c0..b99e3d98 100644 --- a/apps/scheduler/mcp_agent/plan.py +++ b/apps/scheduler/mcp_agent/plan.py @@ -217,9 +217,6 @@ class MCPPlanner(MCPBase): # 使用Step模型解析结果 step = Step.model_validate(step) - if len(step.description) > 15: - # 限制步骤描述长度为15个字符 - step.description = step.description[:15]+'...' return step @staticmethod -- Gitee From ab9ffaf2a9a71e5fa57d5a3453ee615f5539a83b Mon Sep 17 00:00:00 2001 From: zxstty Date: Sun, 17 Aug 2025 22:47:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/scheduler/executor/agent.py | 7 ++++--- apps/scheduler/mcp_agent/base.py | 4 ++-- apps/scheduler/mcp_agent/plan.py | 18 ++++++++++++------ apps/scheduler/mcp_agent/prompt.py | 8 ++++++-- apps/schemas/mcp.py | 6 ++++++ perf.data | Bin 32600 -> 0 bytes 6 files changed, 30 insertions(+), 13 deletions(-) delete mode 100644 perf.data diff --git a/apps/scheduler/executor/agent.py b/apps/scheduler/executor/agent.py index 4114d76d..c8793390 100644 --- a/apps/scheduler/executor/agent.py +++ b/apps/scheduler/executor/agent.py @@ -34,7 +34,7 @@ logger = logging.getLogger(__name__) class MCPAgentExecutor(BaseExecutor): """MCP Agent执行器""" - max_steps: int = Field(default=20, description="最大步数") + max_steps: int = Field(default=40, description="最大步数") servers_id: list[str] = Field(description="MCP server id") agent_id: str = Field(default="", description="Agent ID") agent_description: str = Field(default="", description="Agent描述") @@ -176,6 +176,7 @@ class MCPAgentExecutor(BaseExecutor): self.task.state.step_status = StepStatus.ERROR self.task.state.error_message = str(e) return + logger.error(f"当前工具名称: {mcp_tool.name}, 输出参数: {output_params}") if output_params.isError: err = "" for output in output_params.content: @@ -465,9 +466,9 @@ class MCPAgentExecutor(BaseExecutor): # 初始化状态 try: self.task.state.flow_id = str(uuid.uuid4()) - self.task.state.flow_name = await MCPPlanner.get_flow_name( + self.task.state.flow_name = (await MCPPlanner.get_flow_name( self.task.runtime.question, self.resoning_llm, self.task.language - ) + )).flow_name await TaskManager.save_task(self.task.id, self.task) await self.get_next_step() except Exception as e: diff --git a/apps/scheduler/mcp_agent/base.py b/apps/scheduler/mcp_agent/base.py index 65cbec47..f69d71ab 100644 --- a/apps/scheduler/mcp_agent/base.py +++ b/apps/scheduler/mcp_agent/base.py @@ -17,7 +17,7 @@ class MCPBase: # 调用推理大模型 message = [ {"role": "system", "content": prompt}, - {"role": "user", "content": "Please provide a JSON response based on the above information."}, + {"role": "user", "content": "Please provide a JSON response based on the above information and schema."}, ] result = "" async for chunk in resoning_llm.call( @@ -50,7 +50,7 @@ class MCPBase: flag = False if not flag: json_generator = JsonGenerator( - "Please provide a JSON response based on the above information.\n\n", + "Please provide a JSON response based on the above information and schema.\n\n", [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": result}, diff --git a/apps/scheduler/mcp_agent/plan.py b/apps/scheduler/mcp_agent/plan.py index b99e3d98..faa9720d 100644 --- a/apps/scheduler/mcp_agent/plan.py +++ b/apps/scheduler/mcp_agent/plan.py @@ -29,6 +29,7 @@ from apps.schemas.enum_var import LanguageType from apps.scheduler.slot.slot import Slot from apps.schemas.mcp import ( GoalEvaluationResult, + FlowName, IsParamError, MCPPlan, MCPTool, @@ -54,8 +55,9 @@ class MCPPlanner(MCPBase): @staticmethod async def evaluate_goal( - goal: str, tool_list: list[MCPTool], resoning_llm: ReasoningLLM = ReasoningLLM(), language: LanguageType = LanguageType.CHINESE, - ) -> GoalEvaluationResult: + goal: str, tool_list: list[MCPTool], + resoning_llm: ReasoningLLM = ReasoningLLM(), + language: LanguageType = LanguageType.CHINESE,) -> GoalEvaluationResult: """评估用户目标的可行性""" # 获取推理结果 result = await MCPPlanner._get_reasoning_evaluation(goal, tool_list, resoning_llm, language) @@ -65,8 +67,9 @@ class MCPPlanner(MCPBase): @staticmethod async def _get_reasoning_evaluation( - goal, tool_list: list[MCPTool], resoning_llm: ReasoningLLM = ReasoningLLM(), language: LanguageType = LanguageType.CHINESE, - ) -> str: + goal, tool_list: list[MCPTool], + resoning_llm: ReasoningLLM = ReasoningLLM(), + language: LanguageType = LanguageType.CHINESE,) -> str: """获取推理大模型的评估结果""" template = _env.from_string(EVALUATE_GOAL[language]) prompt = template.render( @@ -87,10 +90,13 @@ class MCPPlanner(MCPBase): user_goal: str, resoning_llm: ReasoningLLM = ReasoningLLM(), language: LanguageType = LanguageType.CHINESE, - ) -> str: + ) -> FlowName: """获取当前流程的名称""" - return await MCPPlanner._get_reasoning_flow_name(user_goal, resoning_llm, language) + result = await MCPPlanner._get_reasoning_flow_name(user_goal, resoning_llm, language) + result = await MCPPlanner._parse_result(result, FlowName.model_json_schema()) + # 使用FlowName模型解析结果 + return FlowName.model_validate(result) @staticmethod async def _get_reasoning_flow_name( diff --git a/apps/scheduler/mcp_agent/prompt.py b/apps/scheduler/mcp_agent/prompt.py index 59abd383..086bf4dc 100644 --- a/apps/scheduler/mcp_agent/prompt.py +++ b/apps/scheduler/mcp_agent/prompt.py @@ -365,7 +365,9 @@ GENERATE_FLOW_NAME: dict[LanguageType, str] = { # 目标 我需要扫描当前mysql数据库,分析性能瓶颈, 并调优 # 输出 - 扫描MySQL数据库并分析性能瓶颈,进行调优 + { + "flow_name": "扫描MySQL数据库并分析性能瓶颈,进行调优" + } # 现在开始生成流程名称: # 目标 {{goal}} @@ -386,7 +388,9 @@ GENERATE_FLOW_NAME: dict[LanguageType, str] = { # Goal I need to scan the current MySQL database, analyze performance bottlenecks, and optimize it. # Output - Scan MySQL database and analyze performance bottlenecks, and optimize it. + { + "flow_name": "Scan MySQL database and analyze performance bottlenecks, and optimize it." + } # Now start generating the flow name: # Goal {{goal}} diff --git a/apps/schemas/mcp.py b/apps/schemas/mcp.py index 676e9c7d..7506e332 100644 --- a/apps/schemas/mcp.py +++ b/apps/schemas/mcp.py @@ -116,6 +116,12 @@ class GoalEvaluationResult(BaseModel): reason: str = Field(description="评估原因") +class FlowName(BaseModel): + """MCP 流程名称""" + + flow_name: str = Field(description="MCP 流程名称", default="") + + class RestartStepIndex(BaseModel): """MCP重新规划的步骤索引""" diff --git a/perf.data b/perf.data deleted file mode 100644 index f319e212c75a402bbf0ff2e488552bad93ff5b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32600 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