Skip to content

[Feature]: LocalAgentRunner 应支持并行执行 Tool Calls #2050

@huanghuoguoguo

Description

@huanghuoguoguo

背景

当前 LocalAgentRunnersrc/langbot/pkg/provider/runners/localagent.py)在处理 LLM 返回的多个 tool_calls 时,采用的是顺序执行

for tool_call in pending_tool_calls:
    func_ret = await self.ap.tool_mgr.execute_func_call(func.name, parameters, query=query)

每个工具调用都是逐个 await,没有使用 asyncio.gather() 或类似机制进行并发。

问题

当 LLM 单次返回多个 tool_calls 时(这在 OpenAI、Claude 等模型中很常见),这些调用之间往往是相互独立的——模型在同一次响应中请求的多个工具本身不存在依赖关系,否则模型会分多轮调用。

顺序执行意味着:

  • 如果有 3 个工具调用,每个耗时 2 秒,总耗时 6 秒,而并行只需约 2 秒
  • 对于涉及网络请求的工具(HTTP 调用、MCP 远程工具等),延迟被线性叠加
  • 用户体验上,Agent 响应会明显变慢

建议

将 tool_calls 的执行改为并行,例如:

import asyncio

async def _execute_tool_call(tool_call):
    func = tool_call.function
    parameters = json.loads(func.arguments)
    try:
        func_ret = await self.ap.tool_mgr.execute_func_call(func.name, parameters, query=query)
        return tool_call, func_ret, None
    except Exception as e:
        return tool_call, None, e

results = await asyncio.gather(*[
    _execute_tool_call(tc) for tc in pending_tool_calls
])

LLM 在同一次响应中返回的多个 tool_calls 在语义上就是并行意图,顺序执行没有必要。主流框架(LangChain、OpenAI Agents SDK 等)对此均采用并行执行策略。

参考

  • OpenAI Function Calling 文档中明确建议 parallel tool calls 应并行处理
  • LangChain AgentExecutor 默认并行执行同批次 tool calls

Metadata

Metadata

Assignees

No one assigned

    Labels

    eh: Improveenhance: 现有功能的改进 / improve current featuresm: Tools工具(ToolUse、内容函数)相关 / Function Calling or tools management

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions