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

Vercel中OpenRouter AI SDK的streamText报AI_APICallError: Not Found求助

OpenRouter AI SDK streamText 报"AI_APICallError: Not Found"错误排查方案

问题描述

在Vercel项目中使用OpenRouter AI SDK实现AI驱动的聊天流功能时,textGenerate功能运行正常,但调用streamText时出现如下错误:

Error from the streamText: AI_APICallError: Not Found

相关API路由代码如下:

import { type Message, createDataStreamResponse, smoothStream, streamText } from 'ai';

import { auth } from '@/app/(auth)/auth';
import { myProvider, openrouterProvider, MODEL_IDS } from '@/lib/ai/models';
import { systemPrompt } from '@/lib/ai/prompts';
import { deleteChatById, getChatById, saveChat, saveMessages } from '@/lib/db/queries';
import { generateUUID, getMostRecentUserMessage, sanitizeResponseMessages } from '@/lib/utils';

export async function POST(request: Request) {
  const { id, messages, selectedChatModel }: { id: string; messages: Array<Message>; selectedChatModel: string } = await request.json();

  const modelId = MODEL_IDS[selectedChatModel] || MODEL_IDS['chat-model-small'];

  const session = await auth();

  if (!session?.user?.id) {
    return new Response('Unauthorized', { status: 401 });
  }

  const userMessage = getMostRecentUserMessage(messages);
  if (!userMessage) {
    return new Response('No user message found', { status: 400 });
  }

  await saveMessages({ messages: [{ ...userMessage, createdAt: new Date(), chatId: id }] });

  return createDataStreamResponse({
    execute: async (dataStream) => {
      const result = streamText({
        model: openrouterProvider.chat(modelId),
        system: systemPrompt({ selectedChatModel }),
        messages,
        onError({ error }) {
          console.error('Error from the streamText: ' + error);
        },
        experimental_transform: smoothStream({ chunking: 'word' }),
        experimental_generateMessageId: generateUUID,
      });

      await result.consumeStream();
      result.mergeIntoDataStream(dataStream, { sendReasoning: true });
    },
    onError: (e) => {
      return 'Oops, an error occurred! Error: ' + e;
    },
  });
}

已排查步骤

  • 确认textGenerate功能正常,仅streamText出现异常
  • 验证模型ID从MODEL_IDS中获取正确
  • 确认OpenRouter API密钥配置正确,其他API调用无异常
  • 查阅OpenRouter官方文档,未找到streamText的额外配置要求

可能的解决方案

1. 检查模型的流式输出支持

部分OpenRouter平台的模型可能不支持流式响应,即使textGenerate能正常调用,streamText依赖模型的流式接口。需前往OpenRouter模型详情页,确认所选模型是否支持stream参数(即流式输出能力)。若模型不支持流式,会直接返回404类错误。

2. 调整streamText的调用顺序

当前代码中先执行await result.consumeStream()再合并数据流,可能导致流式数据被提前消费,或与createDataStreamResponse的处理逻辑冲突。尝试调整顺序:

const result = streamText({
  model: openrouterProvider.chat(modelId),
  system: systemPrompt({ selectedChatModel }),
  messages,
  onError({ error }) {
    console.error('Error from the streamText: ' + error);
  },
  experimental_transform: smoothStream({ chunking: 'word' }),
  experimental_generateMessageId: generateUUID,
});

// 先合并数据流,再消费
result.mergeIntoDataStream(dataStream, { sendReasoning: true });
await result.consumeStream();

3. 核对openrouterProvider初始化配置

确保openrouterProvider初始化时未禁用流式支持,且配置正确:

import { openrouter } from '@ai-sdk/openrouter';

export const openrouterProvider = openrouter({
  apiKey: process.env.OPENROUTER_API_KEY,
  // 确保无禁用流式的配置,必要时添加流式请求头
  headers: {
    'Accept': 'text/event-stream',
  },
});

4. 验证API请求端点

streamText和textGenerate可能调用OpenRouter的不同端点(或同一端点但参数不同),可通过抓包工具查看实际请求URL是否正确。OpenRouter的流式聊天端点为https://openrouter.ai/api/v1/chat/completions,需确认SDK是否自动添加了stream=true参数。

5. 检查环境变量与权限

确保Vercel项目的环境变量中,OpenRouter API密钥已正确配置且生效,同时该密钥对应的账号有权限调用所选模型的流式接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:38:15