其中,messages 是用户和 AI 的消息记录,包含对话历史;model 是请求的对应模型名称,用于指定要调用的 AI 模型。
2. 边缘函数处理
边缘函数的处理逻辑是在 functions/api/ai/index.js 文件内实现的。该文件接收前端发送的请求,并根据 model 参数调用对应的 AI 模型 API。核心代码如下:
const{ model, messages }=await request.json();
if(!model ||!messages){
returnnewResponse(JSON.stringify({error:"Missing model or messages"}),{
status:400,
headers:{"Content-Type":"application/json"},
});
}
if(model ==="deepseek-chat"|| model ==="deepseek-reasoner"){
returnproxyDeepSeek(messages, model, env);
}
这里以 DeepSeek 为例展示处理逻辑,实际模板内还实现了 Claude、OpenAI、Google 等主流 AI 模型的处理。代码中的 env 参数涵盖了配置的环境变量值。在后续的 AI 真实接口调用中,会通过 env 参数安全地传递这些 API Key,以此规避 API Key 的明文传递,确保密钥的安全。
3. 调用 AI 模型 API
接下来是 API 调用逻辑。边缘函数根据 model 参数调用对应的 AI 模型 API,同样以 DeepSeek 为例,核心代码如下:
const res =awaitPROVIDERS.fetch("https://api.deepseek.com/chat/completions",{
method:"POST",
headers:{
"Content-Type":"application/json",
Authorization:`Bearer ${apiKey}`,
},
body:JSON.stringify(requestBody),
});
通过将 messages(聊天记录)和 apiKey(API 密钥)设置到请求的对应位置,实现了对 AI 模型的调用。其中 messages 作为请求体传递给 AI 模型,apiKey 通过 Authorization 头部进行身份验证。
4. 返回响应
AI 模型处理完成后,边缘函数将响应返回给前端。这里请注意,返回的数据是采用流式输出的模式,这也让前端可以提前让内容进行部分显示,可以让前端等待响应时间缩短,优化体验。
前端接收到 AI 模型的响应后,在 components/MessageItem.jsx 中对返回的数据进行展示。该组件负责渲染聊天消息,将消息列表队列分成 AI 和用户两类进行显示,不同类型的消息,在 UI 样式上作一定的区分即可。
以上就是原生接口调用方式的完整集成过程。从下载模板、配置环境变量,到前端发送请求、边缘函数处理、调用 AI 模型 API、返回响应,最后在前端展示消息,形成了完整的 AI 对话功能实现链路。
AI SDK 封装调用
如果 clone 的项目是 ai-sdk-chatbot-starter 模板。它是采用的 AI SDK 封装调用方式,核心原理是使用 AI SDK UI 和 AI SDK 来实现 AI 对话的过程。AI SDK 提供了统一的接口来调用不同厂商的 AI 模型,而 AI SDK UI 则提供了现成的 React 组件来管理聊天界面的消息列表。该模板的逻辑流程是:创建消息管理器 → 变更消息队列 → AI SDK 封装调用 → 消息管理器更新。
1. 创建消息管理器
AI SDK UI 提供了消息管理器的概念,用于管理聊天记录的状态和交互。消息管理器负责处理用户输入、AI 回复、消息历史等,并提供统一的数据格式来操作消息队列。
通过代码 providerConfig.provider(selectedModel) 的调用,函数会根据用户选择的模型名称自动选择对应的 AI SDK 提供商。API Key 的传递方式也和 AI 原生接口的调用模式一样,通过 env 来传递。
函数中已经支持的大模型列表如下:
import{ deepseek }from"@ai-sdk/deepseek";
import{ anthropic }from"@ai-sdk/anthropic";
import{ google }from"@ai-sdk/google";
import{ openai }from"@ai-sdk/openai";
import{ xai }from"@ai-sdk/xai";
如果用户需要支持更多的模型,可以自行添加。
接下来是具体的 AI SDK 的模型调用过程,核心代码如下:
const result =streamText({
model: providerConfig.provider(selectedModel),
system:
"You are an intelligent AI assistant dedicated to helping users. Please follow these principles:\\n1. Provide accurate, useful, and concise answers\\n2. Maintain a friendly and professional tone\\n3. Be honest when uncertain about answers\\n4. Support both Chinese and English communication\\n5. Provide practical advice and solutions",
messages:convertToModelMessages(uiMessages),
maxOutputTokens:1000,
temperature:0.7,
onError:(error)=> console.error("AI API Error:", error),
onFinish:(result)=>
console.log("AI Response finished:",{
provider: providerConfig.name,
model: selectedModel,
usage: result.usage,
finishReason: result.finishReason,
}),
});
streamText 是 AI SDK 提供的实现 AI 对话的函数,执行 streamText 后,需要将返回的内容转化为 AI SDK UI 标准的数据格式,实现方式是通过 AI SDK 的 toUIMessageStreamResponse 实现的。代码如下:
result.toUIMessageStreamResponse();
此时,AI SDK 调用的过程已经完成,后续过程,只需要在前端代码中处理接口响应的内容即可。
4. 前端处理消息
前端接收到 AI 模型的响应后,在 components/MessageList.jsx 中对返回的数据进行展示。该组件监听 hooks/useChatLogic.ts 传递的 messages 对象变动,当有新的 AI 响应内容时,消息管理器会自动更新消息列表显示。
以上就是 AI SDK 封装调用方式的完整集成过程。从下载模板、配置环境变量,到 AI SDK 封装调用,完成了 AI 对话功能的实现链路。