介绍一下 原生异步工具和steer是什么
放在 Agent 开发里理解:原生异步工具解决“工具还没跑完,Agent 能不能继续干活”;steer 解决“Agent 还在干活,用户能不能中途改要求”。下面按当前 OpenAI 官方 API 文档解释,其他框架的具体实现可能不同。 先看一个例子 你让编程 Agent:“修复登录问题,然后跑测试。” Agent 启动一套耗时几分钟的测试,同时继续检查代码、整理修改说明,这就是异步工具的用处。 测试还没结束,你又说:“先只修后端,前端不要动。”Agent 接收这个补充,调整后续工作,这就是 steer。 一、原生异步工具是什么 传统工具调用通常是: 模型发起调用 → 应用执行工具 → 返回结果 → 模型继续。 原生异步工具则允许: 模型发起调用 → 应用在后台执行 → 模型先做不依赖结果的工作 → 结果回来后再使用。 这里“原生”强调的是模型/API 的工具调用协议支持结果延后返回,不只是你在 Python 里把函数写成 async def。你的服务器没有被阻塞,不代表模型能在工具返回前继续工作,这是两个层面的异步。 按当前 Responses API 文档,在 function 或 custom 工具定义里设置 async: true;应用负责实际执行,完成后用原来的 call_id 回传结果。模型可以在等待期间继续推理、调用其他工具,或者回答独立的问题。 它和几个相近概念要区分: 并行工具调用,是多个工具一起跑,但模型仍可能需要等这一批结果才能继续;异步工具强调工具未完成时模型也能继续推进。 Background mode,是把模型响应生成放到后台;异步工具,是模型工作和工具执行可以重叠。 异步也不能打破依赖:测试没结束,可以写修改说明,但不能声称“测试全部通过”。真正需要结果时,仍然要等待。 二、steer 是什么 Steer 字面意思是“调整方向”,这里指 mid-turn steering:模型尚未结束当前工作,你就能追加要求、纠正理解或改变任务范围,不必先等它完整回答。 例如它正在写一份详细方案,你插一句:“改成一个人两周能完成的版本。”后续工作就应按新范围继续,而不是把旧方案全部写完再返工。 当前 OpenAI 的实现通过 Responses API 的 WebSocket 连接发送 response.steer,指定目标响应和补充的用户消息。 不过,它不是“瞬间改写正在生成的每一个 token”。官方描述的机制是:接收更新,完成当前输出项及已经运行的托管工具工作,再把更新放入后续响应中继续处理;如果还缺客户端工具结果或审批,更新可能先排队等待。 所以有三个重要边界: 收到 accepted,只代表更新已入队,不代表模型已经按新要求行动。 已经输出的内容不会被改写,已经执行的动作不会被撤销。 已经启动的工具不会因为 steer 自动取消。例如测试已经开始,想终止测试,还需要应用层自己的取消机制。 三、对 Agent engineer 意味着什么 以前可以把 Agent 主循环写成“调用模型、执行工具、等结果、再调用模型”。支持这两种能力后,就需要管理运行中的任务和随时到来的新消息。 比如测试还在跑,用户又要求改代码:应用要记录这次测试对应哪个代码版本,避免把旧版本的通过结果当成新版本验证成功;用户说“不要提交了”,也不能只发一句 steer,还要在真正执行提交前检查当前授权状态。 工程上重点是:跟踪任务状态和 call_id,处理超时、失败、重复回传,以及需求变化后哪些任务应取消、哪些结果已经过时。 一句话记:异步工具让 Agent 不必干等,steer 让用户不必干等;取消、回滚和状态一致性仍然要靠你的运行时设计。 官方文档: https://developers.openai.com/api/docs/guides/async-tool-calling https://developers.openai.com/api/docs/guides/steering