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

