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

生产环境中WebRTC与OpenAI实时API通过Cloudflare Workers连接失败

问题:Cloudflare Workers部署后WebRTC无法连接OpenAI实时API

我正在开发一个基于WebRTC的实时应用,前端(浏览器)通过部署在Cloudflare Workers上的信令服务器连接OpenAI实时API,项目参考了Cloudflare Workers的示例代码实现信令逻辑。该应用在本地localhost环境下可正常运行,但部署到Cloudflare Workers生产环境后无法建立对等连接,进入failed状态,重试连接也无效。

具体流程如下:

  1. 前端(浏览器)生成SDP Offer并发送至Worker的/rtc-connect端点,代码如下:
peerConnection = new RTCPeerConnection();

dataChannel = peerConnection.createDataChannel('response');

peerConnection.createOffer().then((offer) => {
            peerConnection.setLocalDescription(offer);
            fetch('/rtc-connect', {
                method: 'POST',
                body: offer.sdp,
                headers: {
                    'Content-Type': 'application/sdp',
                },
            })
                .then((r) => r.text())
                .then((answer) => {
                    peerConnection.setRemoteDescription({
                        sdp: answer,
                        type: 'answer',
                    });
                })
                .catch((error) => console.error("Error in signaling:", error));
        });
  1. Worker将SDP Offer转发至OpenAI实时API;
  2. 浏览器设置远程SDP描述并与OpenAI交换ICE候选。

Worker端app.js中的相关代码如下:

app.post('/rtc-connect', async (c) => {
    const body = await c.req.text();
    const url = new URL('https://api.openai.com/v1/realtime');
    url.searchParams.set('model', 'gpt-4o-realtime-preview-2024-12-17');
    url.searchParams.set('instructions', DEFAULT_INSTRUCTIONS);
    url.searchParams.set('voice', 'ash');

    const response = await fetch(url.toString(), {
        method: 'POST',
        body,
        headers: {
            Authorization: `Bearer ${c.env.OPENAI_API_KEY}`,
            'Content-Type': 'application/sdp',
        },
    });

    if (!response.ok) {
        const errorText = await response.text();
        console.error('OpenAI API Error:', errorText);
        return c.text(errorText, 500);
    }
    const sdp = await response.text();
    console.log('OpenAI SDP Answer:', sdp);

    return c.body(sdp, {
        headers: {
            'Content-Type': 'application/sdp',
        },
    });
});

请问我遗漏了什么配置或步骤?


可能的遗漏配置及解决步骤

1. CORS跨域配置缺失

Cloudflare Workers生产环境下的CORS检查远严于本地环境,必须添加明确的跨域响应头。在Worker路由处理前添加全局CORS配置:

// 全局CORS处理
app.use(async (c, next) => {
  // 生产环境建议替换为具体域名,避免使用*
  c.res.headers.set('Access-Control-Allow-Origin', '*');
  c.res.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  c.res.headers.set('Access-Control-Allow-Headers', 'Content-Type');
  
  // 处理OPTIONS预检请求
  if (c.req.method === 'OPTIONS') {
    return new Response(null, { status: 204 });
  }
  
  await next();
});

2. ICE候选交换未正确实现

仅处理SDP Offer/Answer不足以建立WebRTC连接,必须通过信令服务器转发ICE候选:

  • 前端监听icecandidate事件,发送候选到Worker新端点:
peerConnection.onicecandidate = (event) => {
  if (event.candidate) {
    fetch('/ice-candidate', {
      method: 'POST',
      body: JSON.stringify(event.candidate),
      headers: { 'Content-Type': 'application/json' }
    });
  }
};
  • Worker添加/ice-candidate路由,将候选转发给OpenAI(需维护会话关联,可通过请求中的标识匹配对应连接):
app.post('/ice-candidate', async (c) => {
  const candidate = await c.req.json();
  const response = await fetch('https://api.openai.com/v1/realtime/ice-candidate', {
    method: 'POST',
    body: JSON.stringify(candidate),
    headers: {
      Authorization: `Bearer ${c.env.OPENAI_API_KEY}`,
      'Content-Type': 'application/json'
    }
  });
  
  if (!response.ok) {
    console.error('OpenAI ICE Error:', await response.text());
    return c.text('Failed to send ICE candidate', 500);
  }
  
  return c.text('OK', 200);
});

3. Cloudflare Workers请求超时与配额限制

  • Worker默认请求超时为10秒,WebRTC信令交互可能超时,需手动设置更长超时:
const response = await fetch(url.toString(), {
  method: 'POST',
  body,
  headers: { /* ... */ },
  signal: AbortSignal.timeout(30000) // 设置30秒超时
});
  • 检查Worker的CPU时间配额,若超过会被强制中断,可通过Cloudflare控制台查看资源使用情况。

4. SDP内容与ICE服务器兼容性

检查OpenAI返回的SDP中的a=ice-server字段,确保浏览器能访问对应的STUN/TURN服务器。部分服务器可能被Cloudflare网络拦截,需确认连通性。

5. Cloudflare安全规则拦截

检查Cloudflare的WAF、防火墙规则,是否拦截了WebRTC相关的POST请求(比如ICE候选接口)。可临时禁用规则测试,或添加允许Worker端点的放行规则。

6. 生产环境变量配置错误

确认Cloudflare Workers生产环境中已正确配置OPENAI_API_KEY,且该密钥拥有OpenAI实时API的访问权限。本地环境的密钥配置不会自动同步到生产环境,需手动在Cloudflare控制台设置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:35:55