You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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后,会自动根据你的系统提示和对话历史生成后续的提问(比如让用户选择时段),完全不需要手动干预。

修改后的代码片段

以下是调整后的handleFunctionCallgetAvailableSlots分支的代码:

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

火山引擎 最新活动