
Agent连续查同一份资料、拿到同样结果,却仍不肯停下来:直接报错会丢掉可用的工作,强行给答案又可能让人误以为任务已经成功。CrewAI 1.15.34调整了这段收尾逻辑,把重复调用先告警、再停止工具循环与保留已有材料结合起来。对企业流程而言,更重要的变化不是多一个停止条件,而是停下来后如何交代结果和失败。
快速看点:版本于11月1日21时21分UTC发布,即北京时间2日清晨;重复保护比较工具、参数和结果,且只数连续相同;默认可转入最终回答,但严格失败策略仍会抛错。这不是所有工具最多执行五次的全局配额,也不是自动完成业务的保证。
正式版本把连续重复阈值设为五。通常的原生工具调用路径中,第四个相同结果会附带提示,要求模型使用已有信息给出最终答案;第五个使执行器进入强制收尾路径,不再继续正常的工具推理循环。相比上一版本仅累计同类调用并直接抛错,新逻辑也避免把穿插其他查询的正常回读一直算成同一串。
这里的“相同”不是语义理解,而是代码对工具名、参数及结果的字符串表示生成比较键。任一项变化,就重新开始计数。例如轮询任务从排队变成运行,说明返回状态在推进;查询A、再查B、再回A,也不属于连续重复。但A、B交替打转同样可能没进展,这条保护并不检测它,仍需其他迭代或业务限制。
文本式ReAct调用还有一层已有的重复使用提示,会使告警与停止在文档所述场景中各晚一次。新版另外保留未经格式提醒拼接的原始工具结果,避免附加文字变了就逃过比较;工具真实返回None也单独保留,不把它当成“未提供原始值”。所以阈值不能简单换算成外部系统恰好被访问五次。
重复上限触发后,默认warn策略会记录REPEATED_CALL失败并发出事件,再让普通Agent沿既有迭代上限路径,基于上下文请求最终回答。计划步骤则结束当前循环并返回已收集的工具材料。它保住的是可继续检查的结果,不是自动补齐剩余工作,也不是把内容永久保存到外部存储。
配置为raise时仍会以ToolExecutionFailedError中止;ignore虽然不记录这条失败或发失败事件,循环停止本身却仍然生效。重复保护属于Agent循环,不是某个工具自己的故障,相关策略按任务、Agent、Crew层级处理,不能指望只改工具级策略就覆盖它。通用warn的“继续”也不能理解成此处继续无限调用工具。
这一点会影响验收看板。官方测试中,计划步骤可以带着已有结果返回success,同时失败收集器保存重复调用记录;ignore下甚至没有该记录。企业若只看是否有最终文本、步骤布尔值或异常是否抛出,可能把保护性收尾误当成完整交付。任务完成标准仍应由应用检查,例如材料是否齐全、订单状态是否更新、需要审批的动作是否获准。
原生工具的并行批次会先收集执行结果,再按模型提出调用的顺序计数,而不是按线程返回的快慢计数。因此同批多个相同调用可以一起把连续计数推到上限;即使随后还有不同调用,也不会把已经触发的停止状态清掉。但这不是发起调用前逐个拦截的预算闸门,已执行或在批次中的副作用不能因此回滚。
正式标签的相关测试覆盖同步、异步、原生与文本调用、独立Agent、并行批次和计划步骤,并检查结果变化、交替调用、None及不同失败策略。测试使用脚本化模型和示例工具,不是生产订单或真实客户实验。本站核对了相关实现、文档与测试差异,未运行上游测试、调用模型、部署服务或执行任何外部工具任务。
这次调整面向AgentExecutor与StepExecutor的相应路径,不代表已弃用LiteAgent新增同等保护。已有result_as_answer等提前结束路径仍有各自条件,不能把局部机制写成所有工具的统一安全封顶。同版还有依赖、登录、结构化输出等变化,升级时仍需单独阅读迁移说明,本文不对全版本作兼容性背书。
企业Agent需要两份彼此独立的交代:为什么停止,以及已经完成什么。重复保护能避免一种无进展循环,保留材料也能让人工接手少从头来过;但最终答案仍可能不完整。上线前应同时检查停止原因、失败策略、已得证据和业务验收项,并为写入动作设置独立幂等、权限与成本边界。把刹车装好,是为了安全交接,不是替任务盖上完成章。
