refactor(tool_executor): 移除串行执行模式,优化工具执行性能

This commit is contained in:
Windpicker-owo
2025-11-20 22:50:52 +08:00
parent ddc68b9257
commit ff1321e017

View File

@@ -20,7 +20,6 @@ logger = get_logger("tool_use")
@dataclass
class ToolExecutionConfig:
"""工具执行配置"""
enable_parallel: bool = True # 是否启用并行执行
max_concurrent_tools: int = 5 # 最大并发工具数量
tool_timeout: float = 60.0 # 单个工具超时时间(秒)
enable_dependency_check: bool = True # 是否启用依赖检查
@@ -131,8 +130,6 @@ class ToolExecutor:
tool_cfg = getattr(global_config, "tool", None)
if not tool_cfg:
return
if hasattr(tool_cfg, "force_parallel_execution"):
self.execution_config.enable_parallel = bool(tool_cfg.force_parallel_execution)
max_invocations = getattr(tool_cfg, "max_parallel_invocations", None)
if max_invocations:
self.execution_config.max_concurrent_tools = max(1, max_invocations)
@@ -270,15 +267,10 @@ class ToolExecutor:
return [], []
if func_names:
logger.info(f"{self.log_prefix}开始执行工具调用: {func_names} (模式: {'并发' if self.execution_config.enable_parallel else '串行'})")
logger.info(f"{self.log_prefix}开始执行工具调用: {func_names} (并发执行)")
# 选择执行模式
if self.execution_config.enable_parallel and len(valid_tool_calls) > 1:
# 并发执行模式
# 并行执行所有工具
execution_results = await self._execute_tools_concurrently(valid_tool_calls)
else:
# 串行执行模式(保持原有逻辑)
execution_results = await self._execute_tools_sequentially(valid_tool_calls)
# 处理执行结果,保持原始顺序
execution_results.sort(key=lambda x: x.original_index)
@@ -410,23 +402,6 @@ class ToolExecutor:
for i, tool_call in enumerate(tool_calls)
]
async def _execute_tools_sequentially(self, tool_calls: list[ToolCall]) -> list[ToolExecutionResult]:
"""串行执行多个工具调用(保持原有逻辑)
Args:
tool_calls: 工具调用列表
Returns:
List[ToolExecutionResult]: 执行结果列表
"""
logger.info(f"{self.log_prefix}启动串行执行,工具数量: {len(tool_calls)}")
results = []
for i, tool_call in enumerate(tool_calls):
result = await self._execute_single_tool_with_timeout(tool_call, i)
results.append(result)
return results
async def _execute_single_tool_with_timeout(self, tool_call: ToolCall, index: int) -> ToolExecutionResult:
"""执行单个工具调用,支持超时控制
@@ -731,24 +706,7 @@ class ToolExecutor:
config: 新的执行配置
"""
self.execution_config = config
logger.info(f"{self.log_prefix}工具执行配置已更新: 并发={config.enable_parallel}, 最大并发数={config.max_concurrent_tools}, 超时={config.tool_timeout}s")
def enable_parallel_execution(self, max_concurrent_tools: int = 5, timeout: float = 60.0) -> None:
"""启用并发执行
Args:
max_concurrent_tools: 最大并发工具数量
timeout: 单个工具超时时间(秒)
"""
self.execution_config.enable_parallel = True
self.execution_config.max_concurrent_tools = max_concurrent_tools
self.execution_config.tool_timeout = timeout
logger.info(f"{self.log_prefix}已启用并发执行: 最大并发数={max_concurrent_tools}, 超时={timeout}s")
def disable_parallel_execution(self) -> None:
"""禁用并发执行,使用串行模式"""
self.execution_config.enable_parallel = False
logger.info(f"{self.log_prefix}已禁用并发执行,使用串行模式")
logger.info(f"{self.log_prefix}工具执行配置已更新: 最大并发数={config.max_concurrent_tools}, 超时={config.tool_timeout}s")
@classmethod
def create_with_parallel_config(
@@ -770,7 +728,6 @@ class ToolExecutor:
配置好并发执行的ToolExecutor实例
"""
config = ToolExecutionConfig(
enable_parallel=True,
max_concurrent_tools=max_concurrent_tools,
tool_timeout=tool_timeout,
enable_dependency_check=enable_dependency_check
@@ -796,9 +753,6 @@ parallel_executor = ToolExecutor.create_with_parallel_config(
tool_timeout=30.0 # 单个工具30秒超时
)
# 或者动态配置并发执行
executor.enable_parallel_execution(max_concurrent_tools=5, timeout=60.0)
# 3. 并发执行多个工具 - 当LLM返回多个工具调用时自动并发执行
results, used_tools, _ = await parallel_executor.execute_from_chat_message(
target_message="帮我查询天气、新闻和股票价格",
@@ -837,7 +791,6 @@ await executor.execute_from_chat_message(
# 7. 配置管理
config = ToolExecutionConfig(
enable_parallel=True,
max_concurrent_tools=10,
tool_timeout=120.0,
enable_dependency_check=True
@@ -849,9 +802,6 @@ history = executor.get_tool_history() # 获取历史记录
stats = executor.get_tool_stats() # 获取执行统计信息
executor.clear_tool_history() # 清除历史记录
# 9. 禁用并发执行(如需要串行执行)
executor.disable_parallel_execution()
并发执行优势:
- 🚀 性能提升:多个工具同时执行,减少总体等待时间
- 🛡️ 错误隔离:单个工具失败不影响其他工具执行