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
相关产品推荐
相关产品推荐

