🚀 Vercel AI SDK使用指南:错误处理 (Error Handling)

在开发 AI 应用时,LLM(大语言模型)的不确定性是开发者必须面对的挑战。网络波动、配额限制(Rate Limits)、模型过载或输出内容被安全策略拦截,都可能导致请求失败。

Vercel AI SDK Core 提供了一套标准化的错误处理机制,无论是普通的文本生成还是流式传输(Streaming),都能优雅地捕获和处理异常。本文将基于官方文档,详细介绍如何在 Vercel AI SDK Core 中构建健壮的错误处理逻辑。

1. 基础文本生成错误处理 (Regular Errors)

对于非流式的 generateTextgenerateObject 方法,错误处理非常直观。SDK 会抛出标准的 JavaScript Error,你只需要使用 try/catch 块即可捕获。

这适用于处理 API 密钥错误、余额不足或网络超时等问题。

代码示例

TypeScript

javascript 复制代码
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';

async function main() {
  try {
    const { text } = await generateText({
      model: openai('gpt-4-turbo'),
      prompt: '为我写一个素食千层面的 4 人份食谱。',
    });
    
    console.log(text);
  } catch (error) {
    // 在这里处理错误
    // 可以在这里判断 error 的类型,例如是否为 APICallError
    console.error('生成文本时发生错误:', error);
  }
}

2. 流式传输错误处理 (Streaming Errors)

在处理流式响应时(streamTextstreamObject),错误处理的逻辑稍微复杂一些,因为错误可能发生在连接建立阶段,也可能发生在流传输的过程中。

场景 A:简单流处理 (Simple Streams)

如果你使用 textStream 进行简单的文本迭代,如果流在传输过程中断开或发生错误(且不支持错误分块),SDK 会抛出一个标准的错误。你应当在 for await...of 循环外层包裹 try/catch

TypeScript

javascript 复制代码
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

async function streamExample() {
  try {
    const { textStream } = await streamText({
      model: openai('gpt-4-turbo'),
      prompt: '为我写一个素食千层面的 4 人份食谱。',
    });

    for await (const textPart of textStream) {
      process.stdout.write(textPart);
    }
  } catch (error) {
    // 捕获流传输过程中的中断或网络错误
    console.error('流传输中断:', error);
  }
}

场景 B:全流处理 (Full Streams with Error Support)

对于更高级的用例,建议使用 fullStream。它可以返回不同类型的"部分"(Parts),包括文本增量、工具调用以及错误信息

这种方式允许你精细地处理流中的特定事件。注意,即使使用了 fullStream,依然建议在外层保留 try/catch 以捕获那些无法作为流部分发送的致命错误(如初始连接失败)。

TypeScript

javascript 复制代码
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

async function fullStreamExample() {
  try {
    const { fullStream } = await streamText({
      model: openai('gpt-4-turbo'),
      prompt: '为我写一个素食千层面的 4 人份食谱。',
    });

    for await (const part of fullStream) {
      switch (part.type) {
        case 'text-delta': {
          process.stdout.write(part.textDelta);
          break;
        }
        
        // 处理流中的错误部分
        case 'error': {
          const error = part.error;
          console.error('流中接收到错误:', error);
          break;
        }
        
        // 处理流中断
        case 'step-finish': {
            // 步骤结束(例如工具调用完成或生成结束)
            break;
        }

        default: {
          // 处理其他类型的 part
          break;
        }
      }
    }
  } catch (error) {
    // 处理流建立失败等致命错误
    console.error('发生致命错误:', error);
  }
}

3. 处理流的中断 (Handling Aborts)

在实际应用中(尤其是聊天机器人),用户可能会在生成完成前点击"停止"按钮。这时你需要处理 abort 事件,以便进行清理工作或更新 UI 状态(例如移除"正在输入"的指示器)。

SDK 提供了 onAbort 回调函数,它会在流被 AbortSignal 中断时触发,而不会触发 onFinish

使用 onAbort 回调

TypeScript

javascript 复制代码
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';

async function abortExample() {
  const { textStream } = await streamText({
    model: openai('gpt-4-turbo'),
    prompt: '写一篇关于量子物理的长文章。',
    // 当流被中止时调用
    onAbort: ({ text }) => {
        // text 参数包含中止前已生成的完整文本
        console.log('生成被用户中止。已生成内容长度:', text.length);
        // 在这里执行清理逻辑,例如保存草稿
    },
    onFinish: ({ text }) => {
        console.log('生成正常完成。');
    },
  });

  try {
    for await (const textPart of textStream) {
      process.stdout.write(textPart);
    }
  } catch (error) {
    // 处理中止以外的错误
  }
}

总结

健壮的 AI 应用离不开完善的错误处理。Vercel AI SDK Core 提供了多层级的错误捕获机制:

  1. Try/Catch : 适用于所有 generate 方法和 stream 方法的外层防护。
  2. Error Parts : 在 fullStream 中精细处理流传输过程中的错误。
  3. onAbort: 专门处理用户主动取消请求的场景。

掌握这些模式,能让你的 AI 应用在面对网络抖动和模型异常时依然保持优雅和稳定。


标签: #Vercel #AI #TypeScript #前端开发 #大模型

相关推荐
G皮T15 小时前
【人工智能】探索 OpenClaw 的实际应用:让 AI Agent 真正改善你的生活
人工智能·ai·agent·skill·openclaw
人工智能小豪15 小时前
LLM的具身鸿沟有解了!微调让大模型真正学会人类的感官与动作感知
人工智能·ai·llm·prompt·embedding·agent·rag
ZzT15 小时前
飞书CLI开源:200+命令让Claude Code直接操控你的飞书
人工智能·llm·claude
深念Y15 小时前
技术选型系列文章(四):从任务清单到接口规格
ai·接口·软件工程·api·agent·任务
云道轩1 天前
告诉 Claude Code 在项目中遵循特定的编程模式/设计模式和技术栈约束
设计模式·ai·agent·claude code
后端小肥肠1 天前
OpenClaw多Agent实战|手把手教你用一只小龙虾接入多个飞书Bot
人工智能·aigc·agent
x-cmd1 天前
[x-cmd] 一切 Web、桌面应用和本地工具皆可 CLI -opencli
前端·ai·github·agent·cli·x-cmd
码农三叔1 天前
(11-4-02)感知-运动耦合与行为理解:人形机器人沉浸式感知运动协同系统(2)人形机器人运动控制
人工智能·机器人·agent·人形机器人
swipe1 天前
向量数据库实战:为什么 AI Agent 离不开 Milvus
前端·面试·agent
Nelson8201251 天前
不只是 Copilot:一个完整 AI 软件交付团队的实践 - iforgeAI - 用更少的Tokens,办大事
agent