deepseek 可通过 vercel ai sdk 集成,但需安装 @ai-sdk/deepseek 并正确配置模型、api key、endpoint 和 system 提示词,且必须使用 converttomodelmessages 转换消息格式及 touimessagestreamresponse 返回流式响应。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

DeepSeek 能直接用 Vercel AI SDK 集成,但必须注意:官方 @ai-sdk/deepseek 包只支持 deepseek-chat 和 deepseek-r1 两类模型,且不兼容 Web UI 直连(比如直接调用 deepseek.com 的前端接口),必须走其官方 API 或经由 ds2api 这类协议中转层。
安装对应 provider 包,别装错名字
很多人卡在第一步——执行 npm install @ai-sdk/deepseek 后发现 createDeepSeek 报错或类型缺失。这是因为:
-
@ai-sdk/deepseek是独立 provider 包,不是ai主包的内置能力,必须显式安装 - 不能只装
ai或@ai-sdk/react就以为够了 - 如果要用
deepseek-r1-67b,还得额外配DEEPSEEK_MODEL环境变量,否则默认 fallback 到deepseek-chat
正确命令是:
npm install ai @ai-sdk/deepseek @ai-sdk/react
并且确保你的 route.ts 里 import 的是 createDeepSeek,不是 createOpenAI。
convertToModelMessages 不是可选项,是强制转换步骤
前端 useChat 发来的 messages 是 React 组件管理的结构,含 id、createdAt、content 字段,而 DeepSeek API 只认标准 OpenAI 格式:{ role: 'user' | 'assistant', content: string }。
漏掉 convertToModelMessages(messages) 会导致:
- 400 错误,提示
"messages[0] is not valid" - 流式响应中断在第一个 chunk,
toUIMessageStreamResponse()抛出类型错误 - 系统提示词
system被忽略(因为没被包裹进 message 数组)
务必写成:
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
const result = streamText({<br> model: deepSeek('deepseek-chat'),<br> messages: convertToModelMessages(messages),<br> system: '你是一个高级程序员'<br>});
API Key 和 endpoint 必须匹配模型类型
DeepSeek 官方提供了两套可用 endpoint:
- 标准版(
deepseek-chat):用官网申请的 API Key + 默认 endpoint(https://api.deepseek.com/v1) - R1 满血版(
deepseek-r1-67b):需设置DEEPSEEK_MODEL=r1-67b且 endpoint 改为https://alt-api.deepseek.com/v1,否则会返回model_not_found
环境变量示例(src/app/api/chat/key.ts):
export const DEEPSEEK_API_KEY = process.env.DEEPSEEK_API_KEY;<br>export const DEEPSEEK_ENDPOINT = process.env.DEEPSEEK_ENDPOINT || 'https://api.deepseek.com/v1';
注意:@ai-sdk/deepseek 的 createDeepSeek 构造函数目前不接受 endpoint 参数,所以 endpoint 必须通过环境变量传入,或自行 patch fetch 行为。
流式响应要接对,别在客户端自己解析 SSE
result.toUIMessageStreamResponse() 返回的是符合 Vercel AI SDK 协议的 text/event-stream 响应,前端 useChat 依赖这个格式做增量渲染。如果你手动用 fetch + ReadableStream 解析,容易:
- 丢 chunk(尤其网络抖动时)
- 把
data: { ... }当成纯 JSON 解析,实际每行前面还有event: text、data:前缀 - 无法触发
useChat内置的 loading / error / completion 状态流转
所以后端必须原样返回:
return result.toUIMessageStreamResponse();
前端保持 useChat({ api: '/api/chat' }) 即可,不要重写数据消费逻辑。
最容易被忽略的一点:DeepSeek 的 deepseek-r1 模型对 system 提示词敏感度远高于 deepseek-chat,如果没传或格式不对(比如写成 systemMessage),R1 会直接忽略指令、回复泛泛而谈。务必确认 system 是顶层参数,且字符串非空。










