OpenAI实时API WebSocket在预约调度流程返回时段后意外断开连接
OpenAI实时API WebSocket在预约调度流程返回时段后意外断开连接
我完全理解你遇到的困扰——在调用getAvailableSlots返回可用时段后,WebSocket连接居然意外断开了(Close Code 1000,属于正常主动关闭,但完全不符合你的流程预期),导致用户根本没法选择时段继续完成预约。咱们来拆解问题并解决它。
问题根源分析
从你的日志和代码来看,连接断开的核心原因是对话上下文没有正确关联,导致OpenAI的Realtime API认为当前对话轮次已经结束,所以主动关闭了连接。具体来说:
- 你在发送
function_call_output时,没有将其关联到之前的function_call(缺少parent_id字段),API无法识别这是函数调用的响应,进而判定对话完成。 - 手动发送
response.create的操作画蛇添足,反而可能触发了API的对话结束逻辑。
解决方案
针对这两个问题,咱们对代码做两处关键修改:
1. 为function_call_output添加parent_id关联
在发送函数调用结果时,必须指定parent_id为触发该函数调用的function_call的ID,这样API才能正确维护对话上下文,知道这是对之前请求的响应,从而保持连接打开。
2. 移除手动触发的response.create
不需要手动发送提示用户选择时段的消息,当API收到function_call_output后,会自动根据你的系统提示和对话历史生成后续的提问(比如让用户选择时段),完全不需要手动干预。
修改后的代码片段
以下是调整后的handleFunctionCall中getAvailableSlots分支的代码:
case "getAvailableSlots": console.log("📅 Handling getAvailableSlots"); const { date: availableDate } = JSON.parse(functionArguments); const availableSlots = await AppointmentSchedulingService.getAvailableSlots(availableDate); // 发送函数调用结果,添加parent_id关联到对应的function_call openAiWs.send( JSON.stringify({ type: "conversation.item.create", item: { type: "function_call_output", role: "assistant", parent_id: functionCall.id, // 关键:关联到触发此函数调用的ID output: `Available slots for ${availableDate}: ${JSON.stringify(availableSlots)}`, }, }) ); console.log("✅ Available slots sent to OpenAI"); // 移除手动发送response.create的代码,让AI自动生成后续提示 break;
额外检查点
- 确保你的
keepAliveInterval正常工作:虽然这不是当前问题的根源,但可以在连接关闭时清除定时器,避免内存泄漏:openAiWs.on("close", () => { clearInterval(keepAliveInterval); console.log("🔌 WebSocket connection closed, keep-alive interval cleared"); }); - 确认你的系统提示中包含引导AI继续对话的逻辑,比如“在返回可用时段后,请提示用户选择合适的时段进行预约”,这样AI会自动生成对应的提示语。
修改完成后,当你返回可用时段后,WebSocket连接会保持打开状态,用户可以正常选择时段,进而触发scheduleAppointment函数完成预约流程。
备注:内容来源于stack exchange,提问作者user29978534




