与赤狐 Decem 聊天的 AI Web 应用
Decem Chat 是一个基于 React 19 + TypeScript + Vite 的前端聊天应用。前端通过 Netlify Edge Function 代理请求到 阿里云百炼 DashScope,确保 API Key 安全存放在服务端。
- AI 聊天:与 Decem 进行自然语言对话
- 安全代理:前端请求
/api/chat,Edge Function 负责转发并保护 API Key - 打字机动画:收到完整回复后逐字显示
- 图片消息:支持向视觉模型发送图片输入
- 主题切换:深色 / 浅色模式
- 消息持久化:聊天记录保存在浏览器 localStorage
- 设置面板:可以切换模型、更新头像、清空聊天记录
- React 19 + TypeScript
- Vite
- Tailwind CSS
- Netlify Edge Functions
- 阿里云百炼 DashScope 兼容接口
- react-markdown + rehype-highlight + remark-gfm
- localStorage + IndexedDB 图片存储
├── netlify/
│ └── edge-functions/
│ └── chat.ts # Netlify Edge Function 代理 AI 请求
├── public/ # 静态资源
├── src/
│ ├── components/ # UI 组件
│ ├── hooks/ # 自定义 Hook
│ ├── services/ # AI 和图片服务
│ ├── types/ # TypeScript 类型
│ └── main.tsx # 应用入口
├── netlify.toml # Netlify 配置
├── package.json
└── tsconfig.json
项目使用 netlify.toml 配置:
build.command = "pnpm run build"publish = "dist"edge_functions将/api/chat映射到netlify/edge-functions/chat.ts
部署后,前端对 /api/chat 的请求会由 Edge Function 转发到 DashScope。
- 不要将 API Key 写入前端环境变量
VITE_... - 只在服务端环境变量中配置
API_KEY或NETLIFY_API_KEY .env文件应加入.gitignore
netlify/edge-functions/chat.ts 转发 POST 请求到:
https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
请求采用 stream: false,并返回完整结果给前端。
前端请求实现于 src/services/aiApi.ts:
- 请求地址:
/api/chat - 发送模型 ID 和消息历史
- 解析并返回
content
- 聊天消息和用户头像在浏览器本地保存
- 支持将图片发送给视觉模型
- 回复先获取完整文本,再逐字显示为打字机动画
- 系统提示词:
src/services/SYSTEM_PROMPT.ts - 聊天逻辑:
src/hooks/useChat.ts - UI 入口:
src/components/ChatInterface.tsx - 后端代理:
netlify/edge-functions/chat.ts
请先确认 API_KEY 已配置,再使用 pnpm exec netlify dev 进行本地调试。
pnpm install在项目根目录创建 .env 或使用 Netlify 环境变量。必须设置:
API_KEY=sk-xxxxxxxxxxxxxxxxxxxxEdge Function 会读取以下环境变量之一:
API_KEY、DASHSCOPE_API_KEY、NETLIFY_API_KEY
pnpm exec netlify loginpnpm exec netlify initpnpm exec netlify devpnpm run dev 将不会使用Netlify Edge Function
pnpm run buildpnpm run preview部署生产分支:
pnpm exec netlify deploy --prod或先测试预发布:
pnpm exec netlify deploy --dir=dist
