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

在Node.js中结合Vercel AI SDK处理OpenAI流式响应错误

OpenAI流式响应的错误处理方案

两种错误场景分析

  • 请求阶段错误:调用openai.chat.completions.create时未成功建立流,直接用try-catch包裹调用逻辑即可捕获这类错误。
  • 流传输阶段错误:流已启动后中途出现异常,这类错误无法被外层try-catch捕获,和流式传输的异步特性以及框架(如SvelteKit)的响应处理逻辑相关。

流内错误监听与处理方案

可以通过扩展OpenAIStream的处理逻辑或自定义转换流,实现流传输过程中的错误监听与处理,以下是具体实现方式:

方案1:利用OpenAIStream的错误回调

OpenAIStream支持传入配置参数,其中的onError回调可直接处理流过程中的错误:

import { OpenAIStream } from 'ai';

const stream = OpenAIStream(response, {
  onError: (err) => {
    // 执行自定义错误处理,比如记录日志、触发告警
    console.error('流传输过程中出错:', err);
    // 可选:抛出错误终止响应
    throw err;
  }
});

return new Response(stream);

方案2:自定义TransformStream包装原流

如果需要更灵活的控制,可手动创建转换流拦截数据并监听错误:

const response = await openai.chat.completions.create({
  model,
  stream: true,
  messages
});

// 创建自定义转换流
const errorHandlingStream = new TransformStream({
  transform(chunk, controller) {
    try {
      // 转发或处理数据块
      controller.enqueue(chunk);
    } catch (err) {
      controller.error(err); // 将错误传递给流
    }
  },
  flush(controller) {
    // 流结束时的清理操作
  }
});

// 监听流的错误事件
errorHandlingStream.readable.addEventListener('error', (err) => {
  console.error('流传输出错:', err);
  // 执行自定义处理,比如通知客户端、记录错误日志
});

// 将OpenAI响应流通过自定义转换流处理
const processedStream = response.body.pipeThrough(errorHandlingStream);

return new Response(processedStream);

SvelteKit中的额外处理要点

在SvelteKit的API路由中返回流式响应时,需确保响应头配置正确,同时结合try-catch和流错误回调覆盖全场景:

export async function POST({ request }) {
  try {
    const { messages } = await request.json();
    const response = await openai.chat.completions.create({
      model,
      stream: true,
      messages
    });

    const stream = OpenAIStream(response, {
      onError: (err) => {
        console.error('流错误:', err);
        // 可在此处记录到SvelteKit日志系统
      }
    });

    return new Response(stream, {
      headers: {
        'Content-Type': 'text/plain; charset=utf-8',
        'Transfer-Encoding': 'chunked'
      }
    });
  } catch (err) {
    // 处理请求阶段的错误
    return new Response(JSON.stringify({ error: err.message }), { status: 500 });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:05