NodeJS中OpenAI助手API提交工具输出后无法获取回复的问题
问题:OpenAI Assistants API提交工具输出后无法获取助手回复
环境配置
- NodeJS环境中使用OpenAI Assistants API
- 已在OpenAI平台定义助手
- 基于流式SDK编写NodeJS客户端,以Discord作为聊天前端
- 基础聊天功能运行正常
问题场景
在实现自定义function calling时:
- 已在OpenAI平台定义函数请求体
- 成功捕获
thread.run.requires_action事件,完成自定义函数调用后,通过client.beta.threads.runs.submitToolOutputsStream提交工具输出 - 提交后未收到
textDone或其他相关事件,运行看似终止,无法获取助手回复 - 但在OpenAI平台查看对应线程时,助手已收到函数响应并生成了回复消息
解决步骤
调用client.beta.threads.runs.submitToolOutputsStream后,需执行以下操作重新获取运行状态并拿到助手回复:
监听提交工具输出后的流式事件
submitToolOutputsStream本身会返回一个事件流,需直接监听这个流的输出,而非依赖之前的全局线程事件。该流会推送运行状态更新,包括thread.run.completed事件,以及助手生成回复时的thread.message.delta增量事件。示例代码逻辑:const stream = await client.beta.threads.runs.submitToolOutputsStream( threadId, runId, { tool_outputs: [ { tool_call_id: "你的工具调用ID", output: "自定义函数执行结果" } ] } ); for await (const event of stream) { switch(event.event) { case 'thread.message.delta': // 实时接收助手回复的片段内容 const deltaContent = event.data.delta.content[0]?.text?.value; if (deltaContent) { // 将片段内容逐步发送到Discord前端 } break; case 'thread.run.completed': // 运行完成后,可直接拉取线程最新消息确认结果 const latestMessages = await client.beta.threads.messages.list(threadId); const assistantReply = latestMessages.data[0].content[0].text.value; // 将完整回复推送到Discord break; } }主动轮询运行状态
若流式监听未正常触发,可主动查询运行状态:- 调用
client.beta.threads.runs.retrieve(threadId, runId)获取当前运行状态 - 当状态变为
completed时,调用client.beta.threads.messages.list(threadId)拉取最新的助手回复 - 设置合理轮询间隔(1-2秒),避免频繁请求,直到状态脱离
in_progress或requires_action
- 调用
检查全局事件监听逻辑
确认全局线程事件监听是否覆盖了提交工具输出后的状态变化,若之前的监听只针对初始运行事件,需重新订阅线程的事件流,确保能捕获到后续的运行状态更新和消息生成事件。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

