本仓库采用「Vite 前端 + Cloudflare Workers 后端」的前后端分离架构:
- 前端只负责 UI、消息状态、读取流式输出
- 后端负责鉴权/业务逻辑/调用大模型,并把流通过 HTTP 返回给前端
- apps/web:React + Vite 前端(默认
http://localhost:5173) - apps/backend:Cloudflare Workers 后端(本地默认
http://localhost:3300)
参考 .env.example。
本地开发(Workers):在 apps/backend/.dev.vars 配置环境变量(wrangler dev 会读取)。
部署到 Cloudflare:使用 wrangler secret put 写入敏感变量。
-
火山引擎(默认 provider):
VOLCENGINE_API_KEY或VOLC_API_KEYVOLCENGINE_BASE_URL(可选;例:https://ark.cn-beijing.volces.com/api/v3)- 火山方舟 Endpoint ID(如
ep-xxxx,按需配置你要用的模型):VOLCENGINE_MODEL_DOUBAO_PROVOLCENGINE_MODEL_DEEPSEEK_R1VOLCENGINE_MODEL_DEEPSEEK_V3VOLCENGINE_MODEL_DOUBAO_SEEDREAM
-
OpenAI(当 provider=openai 时使用):
OPENAI_API_KEYOPENAI_MODEL_ID(可选,默认gpt-4o-mini)
-
后端运行配置:
CORS_ORIGIN(默认http://localhost:5173)
-
前端配置:
VITE_BACKEND_CHAT_API(可选,前端调用地址覆盖;不配则默认http://localhost:3300/chat)
安装依赖:
npm install启动后端(Workers,本地端口 3300):
npm run dev:backend启动前端(Vite):
npm run dev:web访问前端:
用于探活。
curl http://localhost:3000/health后端接口:http://localhost:3300/chat
前端通过 @ai-sdk/react 的 DefaultChatTransport 发送 UIMessage 数组,后端会:
- 将 UIMessage 转为模型消息(ModelMessage)
- 调用
streamText - 使用
toUIMessageStreamResponse以 SSE 形式把 UI message stream 推给前端
默认行为:
- 未传
provider/modelId时,默认使用火山引擎(volcengine) - 未传
modelId时,默认优先使用VOLCENGINE_MODEL_DOUBAO_LITE,其次VOLCENGINE_MODEL_DOUBAO_PRO
请求体示例(可选指定模型):
{
"messages": [
{ "id": "1", "role": "user", "parts": [{ "type": "text", "text": "你好" }] }
],
"data": {
"provider": "volcengine",
"modelId": "ep-20240604-xxxx"
}
}curl 示例:
curl -N \
-H 'Content-Type: application/json' \
-d '{"messages":[{"id":"1","role":"user","parts":[{"type":"text","text":"你好"}]}]}' \
http://localhost:3300/chat返回:
- 成功:SSE 流(AI SDK UI message stream),响应头包含
x-vercel-ai-ui-message-stream: v1 - 失败:JSON
{ "error": "..." }
npm run typecheck:web
npm run typecheck:backend
npm run build:web
npm run dev:backend