核心功能:限制单次 LLM 响应中 task 工具调用的并发数量,防止模型在一个响应中生成过多的并行子代理任务。
1 限制机制
默认限制:MAX_CONCURRENT_SUBAGENTS = 3
有效范围:可配置的 max_concurrent,但会被限制到 [2, 4] 之间
如果模型在一次响应中生成了超过限制的 task 工具调用,只保留前 N 个,丢弃多余的
2 实现方式
after_model() / aafter_model() → _truncate_task_calls(state)
└─ 检查最后一条 AI 消息的 tool_calls
└─ 统计名为 "task" 的工具调用数量
└─ 如果超过 max_concurrent,截取前 N 个
└─ 返回截断后的 state
3 使用场景
这是比提示词限制更可靠的方式,因为它是代码层面的强制约束,而不是依赖模型的自我约束。
函数解析:
_truncate_task_calls:
- 获取 state 中的 messages 列表
- 取最后一条消息,判断是否为 AI 消息 (type == “ai”)
- 检查该消息是否包含 tool_calls
- 筛选出所有 name == “task” 的工具调用的索引
- 如果数量 <= max_concurrent,返回 None(无需截断)
- 否则,保留前 N 个,将超出部分的索引标记为待丢弃
- 用 model_copy() 创建一条新的截断后的 AI 消息
- 打印 warning 日志,记录丢弃的数量
- 返回 {“messages”: [updated_msg]} 用于更新 state