diff --git a/pretor/api/resource.py b/pretor/api/resource.py index e39789a..af28e8a 100644 --- a/pretor/api/resource.py +++ b/pretor/api/resource.py @@ -82,5 +82,8 @@ async def delete_skill(skill_name: str, _: TokenData = Depends(RoleChecker(allow @resource_router.get("/tool") async def get_tools(_: TokenData = Depends(RoleChecker(allowed_roles=UserAuthority.USER))): global_state_machine = ray_actor_hook("global_state_machine").global_state_machine - tools = await global_state_machine.get_tool_list.remote("default") - return {"tools": list(tools.keys())} + tool_mapper = await global_state_machine.get_tool_mapper.remote() + all_tool_names = set() + for scope_tools in tool_mapper.values(): + all_tool_names.update(scope_tools.keys()) + return {"tools": list(all_tool_names)} \ No newline at end of file diff --git a/pretor/core/individual/consciousness_node/consciousness_node.py b/pretor/core/individual/consciousness_node/consciousness_node.py index be0de50..dedd2ad 100644 --- a/pretor/core/individual/consciousness_node/consciousness_node.py +++ b/pretor/core/individual/consciousness_node/consciousness_node.py @@ -134,7 +134,7 @@ class ConsciousnessNode: async def _run(self, payload: Union[ForSupervisoryInput, ForWorkflowInput, ForWorkflowEngineInput]) -> Union[ForSupervisoryNode, ForWorkflow, ForWorkflowEngine]: try: self.agent.retries = 3 - tool = get_tool("control_node") + tool = await get_tool("control_node") if isinstance(payload, ForWorkflowEngineInput): deps = ConsciousnessNodeDeps( original_command=payload.original_command, diff --git a/pretor/core/individual/control_node/control_node.py b/pretor/core/individual/control_node/control_node.py index 46cbeb6..3148982 100644 --- a/pretor/core/individual/control_node/control_node.py +++ b/pretor/core/individual/control_node/control_node.py @@ -89,7 +89,7 @@ class ControlNode: ) self.logger.debug(f"ControlNode: 开始执行工作流节点 [{payload.workflow_step.name}] (原生重试开启)") - tool = get_tool("control_node") + tool = await get_tool("control_node") result = await self.agent.run( f"请根据提供的 workflow_step 上下文,执行此步骤并输出结果。\n详细指令或附加数据:{payload.workflow_step.model_dump_json()}", diff --git a/pretor/core/individual/supervisory_node/supervisory_node.py b/pretor/core/individual/supervisory_node/supervisory_node.py index 784a831..2607366 100644 --- a/pretor/core/individual/supervisory_node/supervisory_node.py +++ b/pretor/core/individual/supervisory_node/supervisory_node.py @@ -172,7 +172,7 @@ class SupervisoryNode: if isinstance(payload, TerminationMessage): prompt_message = f"【工作流执行结束报告】\n请将以下技术报告转化为对用户的友好回复:\n{message}" self.agent.retries = 3 - tool = get_tool("supervisory_node") + tool = await get_tool("supervisory_node") result = await self.agent.run(prompt_message, deps=deps, tools=tool) diff --git a/pretor/plugin/tool_plugin/file_reader/file_reader.py b/pretor/plugin/tool_plugin/file_reader/file_reader.py index 9ec80be..10d1711 100644 --- a/pretor/plugin/tool_plugin/file_reader/file_reader.py +++ b/pretor/plugin/tool_plugin/file_reader/file_reader.py @@ -17,6 +17,7 @@ from pretor.plugin.tool_plugin.base_tool import BaseToolData import os class FileReaderData(BaseToolData): + is_system: bool = True name: str = "file_reader" description: str = "读取本地文件的内容" diff --git a/pretor/utils/get_tool.py b/pretor/utils/get_tool.py index 0b811e8..8fe6fd2 100644 --- a/pretor/utils/get_tool.py +++ b/pretor/utils/get_tool.py @@ -15,12 +15,12 @@ import importlib from typing import Callable, Dict, List import pathlib -from functools import lru_cache from pretor.utils.ray_hook import ray_actor_hook from pretor.utils.logger import get_logger logger = get_logger('get_tool') _tool_cache: Dict[str, Callable] = {} +_agent_tool_result_cache: Dict[str, List[Callable]] = {} def _get_tool_func(tool_name: str) -> Callable | None: @@ -48,10 +48,13 @@ def del_tool_cache(tool_name: str) -> None: del _tool_cache[tool_name] refresh_agent_tools() -@lru_cache(maxsize=1) + async def get_tool(agent_name: str) -> List[Callable]: + cached = _agent_tool_result_cache.get(agent_name) + if cached is not None: + return cached global_state_machine = ray_actor_hook("global_state_machine") - _tool_list = await global_state_machine.get_tool_list.remote( agent_name) + _tool_list = await global_state_machine.get_tool_list.remote(agent_name) tool_list = [] for tool_name in _tool_list.keys(): tool_func = _get_tool_func(tool_name) @@ -59,9 +62,8 @@ async def get_tool(agent_name: str) -> List[Callable]: tool_list.append(tool_func) else: continue + _agent_tool_result_cache[agent_name] = tool_list return tool_list def refresh_agent_tools() -> None: - get_tool.cache_clear() - - + _agent_tool_result_cache.clear() \ No newline at end of file