You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Realtime API - 统一接口下WebRTC功能异常问题排查

问题描述
  • 按照OpenAI实时WebRTC官方文档实现的代码无法正常运行
  • 发送POST请求到https://api.openai.com/v1/realtime/calls时,返回无具体信息的错误:

{
"message": "",
"type": "",
"code": "",
"param": ""
}

  • 相关实现代码如下:
app.post("/session", async (req, res) => {
  const fd = new FormData();
  fd.set("sdp", req.body);
  fd.set("session", sessionConfig);
  try {
      const r = await fetch("https://api.openai.com/v1/realtime/calls", {
          method: "POST",
          headers: {
              Authorization: `Bearer ${OPENAI_API_KEY}`,
          },
          body: fd,
      });
      if (!r.ok) {
          const err = await r.text();
          console.error("Token not ok:", err);
          return res.status(500).json({ error: "Token generation failed" });
      }
      const sdp = await r.text();
      res.send(sdp);
  } catch (error) {
      console.error("Token generation error:", error);
      res.status(500).json({ error: "Failed to generate token" });
  }
});
  • 怀疑表单数据(FormData)的创建环节存在问题,请求排查。
排查与修复方案

1. 修正SDP参数的传递方式

fd.set("sdp", req.body)直接传入整个请求体对象会导致格式错误,OpenAI Realtime API要求sdp是字符串格式的SDP内容:

  • 如果前端发送的是JSON请求,需提取出SDP字符串,比如req.body.sdp(假设前端传参结构为{ "sdp": "..." })
  • 如果前端直接发送SDP文本,需用req.text()获取原始字符串,而非req.body

2. 序列化session配置对象

sessionConfig如果是对象,直接传入FormData会被转为[object Object]字符串,不符合API要求,必须先序列化为JSON:

fd.set("session", JSON.stringify(sessionConfig));

3. 避免手动设置Content-Type头

使用FormData作为fetch的body时,环境会自动生成正确的multipart/form-data头(包含boundary),不要手动覆盖该字段,否则会导致请求格式异常。

4. 修正后的完整代码

app.post("/session", async (req, res) => {
  // 提取前端传入的SDP字符串
  const { sdp } = req.body;
  if (!sdp) {
    return res.status(400).json({ error: "缺少SDP内容" });
  }

  const fd = new FormData();
  fd.set("sdp", sdp);
  fd.set("session", JSON.stringify(sessionConfig));

  try {
      const r = await fetch("https://api.openai.com/v1/realtime/calls", {
          method: "POST",
          headers: {
              Authorization: `Bearer ${OPENAI_API_KEY}`,
          },
          body: fd,
      });

      if (!r.ok) {
          // 优先解析JSON格式错误,兼容纯文本错误
          const err = await r.json().catch(() => r.text());
          console.error("API请求错误:", err);
          return res.status(500).json({ error: "创建通话失败", 详情: err });
      }

      const sdpResponse = await r.text();
      res.send(sdpResponse);
  } catch (error) {
      console.error("请求异常:", error);
      res.status(500).json({ error: "创建通话失败", 详情: error.message });
  }
});

5. 额外检查项

  • 确认OPENAI_API_KEY拥有Realtime API的访问权限
  • 确认sessionConfig符合OpenAI要求的结构(必须包含model字段等)
  • 用Postman或curl直接调用API,排除前端数据传递的问题

内容的提问来源于stack exchange,提问作者Student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:12:46