ai-chatbot/开发文档.md
Your Name 53ddb7e585
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Initial commit - clean repository
2025-12-17 20:15:18 +08:00

1332 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI Chatbot 开发文档
## 目录
- [项目概述](#项目概述)
- [技术栈](#技术栈)
- [项目结构](#项目结构)
- [环境配置](#环境配置)
- [核心功能模块](#核心功能模块)
- [数据库设计](#数据库设计)
- [API 路由](#api-路由)
- [认证系统](#认证系统)
- [AI 集成](#ai-集成)
- [Artifact 系统](#artifact-系统)
- [开发指南](#开发指南)
- [部署指南](#部署指南)
- [系统设置和管理员功能](#系统设置和管理员功能)
- [常见问题](#常见问题)
---
## 项目概述
这是一个基于 Next.js 16 和 AI SDK 构建的现代化 AI 聊天机器人应用。项目提供了完整的聊天功能、用户认证、消息持久化、以及多种 AI 工具集成(文档创建、代码编辑、表格处理等)。
### 主要特性
- ✅ Next.js App Router 架构
- ✅ React Server Components (RSCs) 和 Server Actions
- ✅ AI SDK 统一 API,支持多种模型提供商
- ✅ 完整的用户认证系统(支持注册用户和访客模式)
- ✅ 消息历史持久化
- ✅ 多种 Artifact 类型(文本、代码、表格、图片)
- ✅ 实时流式响应
- ✅ 可恢复的流式传输(需要 Redis)
- ✅ 消息投票功能
- ✅ 文档建议系统
- ✅ 响应式 UI(基于 shadcn/ui)
---
## 技术栈
### 核心框架
- **Next.js 16.0.5** - React 框架,使用 App Router
- **React 19.0.0-rc** - UI 库
- **TypeScript 5.6.3** - 类型安全
### AI 相关
- **AI SDK 5.0.26** - Vercel AI SDK,统一 AI 模型接口
- **@ai-sdk/gateway** - Vercel AI Gateway,统一访问多个 AI 模型
- **@ai-sdk/react** - React hooks for AI
- **tokenlens** - Token 使用量统计和分析
### 数据库
- **Drizzle ORM 0.34.0** - 类型安全的 ORM
- **PostgreSQL** - 主数据库(通过 Neon Serverless Postgres)
- **Redis 5.0.0** - 可恢复流式传输(可选)
### 认证
- **NextAuth 5.0.0-beta.25** - 认证框架
- **bcrypt-ts** - 密码加密
### UI 组件
- **shadcn/ui** - UI 组件库
- **Radix UI** - 无障碍组件原语
- **Tailwind CSS 4.1.13** - 样式框架
- **Framer Motion** - 动画库
### 编辑器
- **CodeMirror 6** - 代码编辑器
- **ProseMirror** - 富文本编辑器
- **react-data-grid** - 表格编辑器
### 工具库
- **Zod** - 模式验证
- **date-fns** - 日期处理
- **SWR** - 数据获取和缓存
- **nanoid** - ID 生成
### 开发工具
- **Biome** - 代码格式化和 linting
- **Playwright** - E2E 测试
- **Drizzle Kit** - 数据库迁移工具
---
## 项目结构
```
ai-chatbot-main/
├── app/ # Next.js App Router 目录
│ ├── (auth)/ # 认证相关路由组
│ │ ├── actions.ts # Server Actions
│ │ ├── auth.ts # NextAuth 配置
│ │ ├── auth.config.ts # 认证配置
│ │ ├── login/ # 登录页面
│ │ └── register/ # 注册页面
│ ├── (chat)/ # 聊天相关路由组
│ │ ├── actions.ts # Server Actions
│ │ ├── api/ # API 路由
│ │ │ ├── chat/ # 聊天 API
│ │ │ ├── document/ # 文档 API
│ │ │ ├── files/ # 文件 API
│ │ │ ├── history/ # 历史记录 API
│ │ │ ├── suggestions/ # 建议 API
│ │ │ └── vote/ # 投票 API
│ │ ├── chat/[id]/ # 聊天详情页
│ │ ├── layout.tsx # 聊天布局
│ │ └── page.tsx # 聊天首页
│ ├── layout.tsx # 根布局
│ └── globals.css # 全局样式
├── artifacts/ # Artifact 实现
│ ├── code/ # 代码 Artifact
│ ├── image/ # 图片 Artifact
│ ├── sheet/ # 表格 Artifact
│ └── text/ # 文本 Artifact
├── components/ # React 组件
│ ├── elements/ # 消息元素组件
│ ├── ui/ # shadcn/ui 组件
│ ├── artifact.tsx # Artifact 容器
│ ├── chat.tsx # 聊天主组件
│ ├── messages.tsx # 消息列表
│ └── ...
├── hooks/ # React Hooks
│ ├── use-artifact.ts # Artifact 管理
│ ├── use-chat-visibility.ts # 聊天可见性
│ ├── use-messages.tsx # 消息管理
│ └── ...
├── lib/ # 工具库
│ ├── ai/ # AI 相关
│ │ ├── models.ts # 模型定义
│ │ ├── providers.ts # 模型提供商
│ │ ├── prompts.ts # 提示词模板
│ │ ├── entitlements.ts # 用户权限
│ │ └── tools/ # AI 工具
│ ├── db/ # 数据库
│ │ ├── schema.ts # 数据库模式
│ │ ├── queries.ts # 数据库查询
│ │ ├── migrations/ # 数据库迁移
│ │ └── utils.ts # 数据库工具
│ ├── artifacts/ # Artifact 服务端逻辑
│ ├── editor/ # 编辑器配置
│ ├── errors.ts # 错误处理
│ ├── types.ts # 类型定义
│ └── utils.ts # 工具函数
├── tests/ # 测试文件
│ ├── e2e/ # E2E 测试
│ ├── pages/ # 页面对象模型
│ └── routes/ # API 路由测试
├── public/ # 静态资源
├── biome.jsonc # Biome 配置
├── drizzle.config.ts # Drizzle 配置
├── next.config.ts # Next.js 配置
├── package.json # 依赖配置
└── tsconfig.json # TypeScript 配置
```
---
## 环境配置
### 必需的环境变量
创建 `.env.local` 文件并配置以下变量:
```bash
# 数据库
POSTGRES_URL=postgresql://user:password@host:port/database
# NextAuth
AUTH_SECRET=your-secret-key-here
AUTH_URL=http://localhost:3000
# AI Gateway (非 Vercel 部署时需要)
AI_GATEWAY_API_KEY=your-gateway-api-key
# Redis (可选,用于可恢复流式传输)
REDIS_URL=redis://localhost:6379
# Vercel Blob (文件存储,可选)
BLOB_READ_WRITE_TOKEN=your-blob-token
```
### 环境变量说明
- **POSTGRES_URL**: PostgreSQL 数据库连接字符串(必需)
- **AUTH_SECRET**: NextAuth 加密密钥,使用 `openssl rand -base64 32` 生成(必需)
- **AUTH_URL**: 应用的基础 URL(必需)
- **AI_GATEWAY_API_KEY**: Vercel AI Gateway API 密钥(非 Vercel 部署时必需)
- **REDIS_URL**: Redis 连接字符串(可选,用于可恢复流式传输)
- **BLOB_READ_WRITE_TOKEN**: Vercel Blob 存储令牌(可选)
### 安装和运行
```bash
# 安装依赖
pnpm install
# 运行数据库迁移
pnpm db:migrate
# 启动开发服务器
pnpm dev
```
应用将在 `http://localhost:3000` 运行。
---
## 核心功能模块
### 1. 聊天系统
聊天系统是应用的核心,位于 `app/(chat)/` 目录。
#### 主要组件
- **`components/chat.tsx`**: 聊天主组件,管理消息状态和 UI
- **`components/messages.tsx`**: 消息列表组件
- **`components/message.tsx`**: 单条消息组件
- **`components/multimodal-input.tsx`**: 多模态输入组件(支持文本、文件等)
#### 关键功能
- 实时流式响应
- 消息历史持久化
- 消息投票(点赞/点踩)
- 消息重新生成
- 消息编辑
- 自动滚动到底部
### 2. 用户认证
认证系统使用 NextAuth 5,支持两种用户类型:
- **注册用户**: 通过邮箱和密码注册
- **访客用户**: 临时用户,无需注册
**注意**: 当前版本**没有管理员功能**,所有用户都是普通用户。如需添加管理员功能,需要扩展用户表和认证系统。
#### 认证流程
1. 用户访问应用
2. 未登录用户自动创建访客账户
3. 注册用户通过登录页面登录
4. 会话信息存储在 JWT 中
#### 相关文件
- `app/(auth)/auth.ts`: NextAuth 配置
- `app/(auth)/auth.config.ts`: 认证配置
- `app/(auth)/login/page.tsx`: 登录页面
- `app/(auth)/register/page.tsx`: 注册页面
### 3. 消息系统
消息系统使用新的 `parts` 架构,支持多种内容类型。
#### 消息结构
```typescript
type DBMessage = {
id: string;
chatId: string;
role: "user" | "assistant";
parts: MessagePart[]; // 消息部分数组
attachments: Attachment[];
createdAt: Date;
};
```
#### 消息部分类型
- `text`: 文本内容
- `tool-call`: 工具调用
- `tool-result`: 工具结果
- `data`: 自定义数据
### 4. Artifact 系统
Artifact 是 AI 生成的可编辑文档,支持四种类型:
- **text**: 富文本文档
- **code**: 代码文件
- **sheet**: 表格数据
- **image**: 图片生成
#### Artifact 架构
每个 Artifact 类型包含:
1. **客户端组件** (`artifacts/{kind}/client.tsx`): UI 渲染和交互
2. **服务端处理器** (`artifacts/{kind}/server.ts`): 创建和更新逻辑
#### 创建 Artifact
```typescript
// AI 工具调用
createDocument({
title: "示例代码",
kind: "code"
})
```
#### 更新 Artifact
```typescript
// AI 工具调用
updateDocument({
documentId: "...",
description: "添加错误处理"
})
```
---
## 数据库设计
### 表结构
#### User 表
```typescript
{
id: uuid (主键)
email: varchar(64) (唯一)
password: varchar(64) (可空,访客用户无密码)
}
```
#### Chat 表
```typescript
{
id: uuid (主键)
createdAt: timestamp
title: text
userId: uuid (外键 -> User.id)
visibility: "public" | "private"
lastContext: jsonb (最后的使用统计)
}
```
#### Message_v2 表
```typescript
{
id: uuid (主键)
chatId: uuid (外键 -> Chat.id)
role: "user" | "assistant"
parts: json (消息部分数组)
attachments: json (附件数组)
createdAt: timestamp
}
```
#### Document 表
```typescript
{
id: uuid (主键)
createdAt: timestamp (主键的一部分)
title: text
content: text (可空)
kind: "text" | "code" | "image" | "sheet"
userId: uuid (外键 -> User.id)
}
```
#### Vote_v2 表
```typescript
{
chatId: uuid (主键的一部分)
messageId: uuid (主键的一部分)
isUpvoted: boolean
}
```
#### Suggestion 表
```typescript
{
id: uuid (主键)
documentId: uuid
documentCreatedAt: timestamp
originalText: text
suggestedText: text
description: text (可空)
isResolved: boolean
userId: uuid (外键 -> User.id)
createdAt: timestamp
}
```
#### Stream 表
```typescript
{
id: uuid (主键)
chatId: uuid (外键 -> Chat.id)
createdAt: timestamp
}
```
### 数据库查询
所有数据库查询函数位于 `lib/db/queries.ts`,包括:
- `getUser()`: 获取用户
- `createUser()`: 创建用户
- `createGuestUser()`: 创建访客用户
- `saveChat()`: 保存聊天
- `getChatById()`: 获取聊天
- `getMessagesByChatId()`: 获取消息列表
- `saveMessages()`: 保存消息
- `saveDocument()`: 保存文档
- `getDocumentById()`: 获取文档
- 等等...
### 数据库迁移
使用 Drizzle Kit 管理数据库迁移:
```bash
# 生成迁移文件
pnpm db:generate
# 应用迁移
pnpm db:migrate
# 推送更改(开发环境)
pnpm db:push
# 打开 Drizzle Studio
pnpm db:studio
```
---
## API 路由
### 聊天 API
**路径**: `/api/chat`
#### POST - 发送消息
创建新聊天或继续现有聊天。
**请求体**:
```typescript
{
id: string; // 聊天 ID
message: ChatMessage; // 用户消息
selectedChatModel: string; // 选择的模型 ID
selectedVisibilityType: "public" | "private";
}
```
**响应**: Server-Sent Events (SSE) 流
**功能**:
- 验证用户身份
- 检查速率限制
- 创建或获取聊天
- 流式生成 AI 响应
- 保存消息到数据库
#### DELETE - 删除聊天
**查询参数**:
- `id`: 聊天 ID
**响应**: 删除的聊天对象
### 文档 API
**路径**: `/api/document/[id]`
#### GET - 获取文档
获取指定 ID 的文档。
#### POST - 更新文档
更新文档内容。
### 文件 API
**路径**: `/api/files`
处理文件上传和存储。
### 历史记录 API
**路径**: `/api/history`
获取用户的聊天历史记录(分页)。
### 建议 API
**路径**: `/api/suggestions`
获取文档的建议列表。
### 投票 API
**路径**: `/api/vote`
对消息进行投票(点赞/点踩)。
---
## 认证系统
### NextAuth 配置
认证系统使用 NextAuth 5,配置在 `app/(auth)/auth.ts`。
#### 认证提供者
1. **Credentials Provider**: 邮箱密码登录
2. **Guest Provider**: 访客模式(自动创建临时用户)
#### 会话结构
```typescript
{
user: {
id: string;
email: string | null;
type: "guest" | "regular";
}
}
```
#### 认证中间件
使用 `auth()` 函数获取当前会话:
```typescript
import { auth } from "@/app/(auth)/auth";
const session = await auth();
if (!session?.user) {
// 未登录
}
```
### 用户权限
用户权限定义在 `lib/ai/entitlements.ts`:
```typescript
export const entitlementsByUserType = {
guest: {
maxMessagesPerDay: 10,
},
regular: {
maxMessagesPerDay: 100,
},
};
```
---
## AI 集成
### 模型提供商
项目使用 Vercel AI Gateway 统一访问多个 AI 模型,配置在 `lib/ai/providers.ts`。
#### 可用模型
- **chat-model**: Grok Vision (xai/grok-2-vision-1212)
- **chat-model-reasoning**: Grok Reasoning (xai/grok-3-mini)
- **title-model**: Grok 2 (xai/grok-2-1212)
- **artifact-model**: Grok 2 (xai/grok-2-1212)
#### 切换模型提供商
要切换到其他提供商(如 OpenAI),修改 `lib/ai/providers.ts`:
```typescript
import { openai } from "@ai-sdk/openai";
export const myProvider = customProvider({
languageModels: {
"chat-model": openai("gpt-4"),
// ...
},
});
```
### AI 工具
AI 可以调用以下工具:
1. **getWeather**: 获取天气信息
2. **createDocument**: 创建文档(text/code/sheet/image)
3. **updateDocument**: 更新文档
4. **requestSuggestions**: 请求文档建议
#### 添加新工具
1. 在 `lib/ai/tools/` 创建工具文件
2. 在 `app/(chat)/api/chat/route.ts` 注册工具:
```typescript
tools: {
// ... 现有工具
myNewTool: myNewTool({ session, dataStream }),
}
```
3. 在 `experimental_activeTools` 数组中添加工具名称
### 提示词系统
系统提示词定义在 `lib/ai/prompts.ts`,包括:
- `systemPrompt()`: 主聊天提示词
- `titlePrompt`: 标题生成提示词
- `codePrompt`: 代码生成提示词
- `textPrompt`: 文本生成提示词
- `sheetPrompt`: 表格生成提示词
- `updateDocumentPrompt()`: 文档更新提示词
### 流式响应
使用 AI SDK 的 `streamText()` 和 `createUIMessageStream()` 实现流式响应:
```typescript
const stream = createUIMessageStream({
execute: ({ writer: dataStream }) => {
const result = streamText({
model: myProvider.languageModel(selectedChatModel),
messages: convertToModelMessages(uiMessages),
tools: { /* ... */ },
});
dataStream.merge(result.toUIMessageStream());
},
onFinish: async ({ messages }) => {
// 保存消息到数据库
},
});
```
---
## Artifact 系统
### Artifact 类型
#### 1. Text Artifact
富文本文档,使用 ProseMirror 编辑器。
**文件**:
- `artifacts/text/client.tsx`: 客户端组件
- `artifacts/text/server.ts`: 服务端处理器
**功能**:
- Markdown 支持
- 实时编辑
- 版本历史
#### 2. Code Artifact
代码文件,使用 CodeMirror 编辑器。
**文件**:
- `artifacts/code/client.tsx`: 客户端组件
- `artifacts/code/server.ts`: 服务端处理器
**功能**:
- 语法高亮
- 代码补全
- 多语言支持(JavaScript、Python 等)
- 代码执行(通过 Pyodide)
#### 3. Sheet Artifact
表格数据,使用 react-data-grid。
**文件**:
- `artifacts/sheet/client.tsx`: 客户端组件
- `artifacts/sheet/server.ts`: 服务端处理器
**功能**:
- CSV 导入/导出
- 数据格式化
- 数据清理工具
#### 4. Image Artifact
图片生成和编辑。
**文件**:
- `artifacts/image/client.tsx`: 客户端组件
**功能**:
- 图片生成
- 图片编辑
- 版本历史
### 创建自定义 Artifact
1. **定义 Artifact 类型**
在 `components/artifact.tsx` 中添加类型:
```typescript
export const artifactDefinitions = [
// ... 现有 Artifact
myCustomArtifact,
];
```
2. **创建客户端组件**
`artifacts/my-custom/client.tsx`:
```typescript
import { Artifact } from "@/components/create-artifact";
export const myCustomArtifact = new Artifact({
kind: "my-custom",
description: "我的自定义 Artifact",
initialize: () => null,
onStreamPart: ({ setArtifact, streamPart }) => {
if (streamPart.type === "data-myCustomDelta") {
setArtifact((draft) => ({
...draft,
content: streamPart.data,
isVisible: true,
status: "streaming",
}));
}
},
content: ({ content }) => {
return <MyCustomEditor content={content} />;
},
});
```
3. **创建服务端处理器**
`artifacts/my-custom/server.ts`:
```typescript
import { createDocumentHandler } from "@/lib/artifacts/server";
export const myCustomDocumentHandler = createDocumentHandler({
kind: "my-custom",
onCreateDocument: async ({ title, dataStream }) => {
// 生成内容逻辑
// 使用 dataStream.write() 发送增量更新
return finalContent;
},
onUpdateDocument: async ({ document, description, dataStream }) => {
// 更新内容逻辑
return updatedContent;
},
});
```
4. **注册处理器**
在 `lib/artifacts/server.ts` 中注册:
```typescript
export const documentHandlersByArtifactKind = [
// ... 现有处理器
myCustomDocumentHandler,
];
```
5. **更新数据库模式**
在 `lib/db/schema.ts` 中更新 `Document.kind` 类型:
```typescript
kind: varchar("text", {
enum: ["text", "code", "image", "sheet", "my-custom"]
})
```
---
## 开发指南
### 代码规范
项目使用 Biome 进行代码格式化和 linting,配置继承自 Ultracite。
#### 运行检查
```bash
# 检查代码
pnpm lint
# 自动修复
pnpm format
```
#### 主要规则
- 使用 TypeScript 严格模式
- 遵循 React Hooks 规则
- 使用函数式组件和 Hooks
- 避免使用 `any` 类型
- 使用 Zod 进行数据验证
- 遵循无障碍性 (a11y) 标准
### 添加新功能
#### 1. 添加新的 API 路由
在 `app/(chat)/api/` 下创建新目录和 `route.ts` 文件:
```typescript
import { auth } from "@/app/(auth)/auth";
export async function GET(request: Request) {
const session = await auth();
if (!session?.user) {
return new Response("Unauthorized", { status: 401 });
}
// 处理逻辑
return Response.json({ data: "..." });
}
```
#### 2. 添加新的 Server Action
在 `app/(chat)/actions.ts` 中添加:
```typescript
"use server";
export async function myAction() {
// 服务端逻辑
}
```
#### 3. 添加新的 UI 组件
在 `components/` 目录下创建组件:
```typescript
"use client";
export function MyComponent() {
return <div>...</div>;
}
```
### 测试
项目使用 Playwright 进行 E2E 测试。
#### 运行测试
```bash
pnpm test
```
#### 测试文件结构
- `tests/e2e/`: E2E 测试用例
- `tests/pages/`: 页面对象模型
- `tests/routes/`: API 路由测试
### 调试
#### 开发模式
```bash
pnpm dev
```
#### 数据库调试
使用 Drizzle Studio:
```bash
pnpm db:studio
```
#### 查看日志
- 服务端日志:控制台输出
- 客户端日志:浏览器控制台
---
## 部署指南
### Vercel 部署
1. **连接 GitHub 仓库**
在 Vercel 控制台连接你的 GitHub 仓库。
2. **配置环境变量**
在 Vercel 项目设置中添加环境变量:
- `POSTGRES_URL`
- `AUTH_SECRET`
- `AUTH_URL`
- `REDIS_URL` (可选)
- `BLOB_READ_WRITE_TOKEN` (可选)
3. **部署**
推送代码到 GitHub,Vercel 会自动部署。
### 数据库迁移
在部署前或部署后运行迁移:
```bash
pnpm db:migrate
```
或在 Vercel 的构建命令中:
```json
{
"scripts": {
"build": "tsx lib/db/migrate && next build"
}
}
```
### 环境检查清单
- [ ] PostgreSQL 数据库已配置
- [ ] 环境变量已设置
- [ ] 数据库迁移已运行
- [ ] AI Gateway API 密钥已配置(如需要)
- [ ] Redis 已配置(如需要可恢复流式传输)
---
## 系统设置和管理员功能
### 功能概述
项目已实现完整的管理员系统设置功能,包括:
- ✅ 用户管理(激活/删除/编辑用户)
- ✅ 网站设置(LOGO、网站名、浏览器图标、主题模式LOGO)
- ✅ 工具库管理(启用/禁用 AI 工具)
### 数据库 Schema
#### User 表扩展
已为 User 表添加以下字段:
```typescript
{
role: "guest" | "regular" | "admin" (默认: "regular")
isActive: boolean (默认: true)
createdAt: timestamp
updatedAt: timestamp
}
```
#### SystemSettings 表
用于存储系统配置:
```typescript
{
id: uuid (主键)
key: string (唯一键)
value: jsonb (配置值)
updatedAt: timestamp
updatedBy: uuid (外键 -> User.id)
}
```
支持的配置键:
- `siteName`: 网站名称
- `siteLogo`: 网站 LOGO URL
- `favicon`: 浏览器图标 URL
- `logoLight`: 白天模式 LOGO URL
- `logoDark`: 黑夜模式 LOGO URL
#### ToolConfig 表
用于管理 AI 工具配置:
```typescript
{
id: uuid (主键)
toolName: string (唯一键)
isEnabled: boolean (是否启用)
description: string (工具描述)
config: jsonb (工具配置)
updatedAt: timestamp
updatedBy: uuid (外键 -> User.id)
}
```
### 认证系统
#### 用户类型
系统支持三种用户类型:
- **guest**: 访客用户(临时账户)
- **regular**: 普通注册用户
- **admin**: 管理员用户
#### 管理员权限
管理员拥有以下权限:
- 无限消息数量(`maxMessagesPerDay: Infinity`)
- 访问所有 AI 模型
- 访问系统设置页面
- 管理用户账户
- 配置系统设置
- 管理 AI 工具
### 管理员中间件
使用 `lib/middleware/admin.ts` 中的 `requireAdmin()` 函数保护管理员路由:
```typescript
import { requireAdmin } from "@/lib/middleware/admin";
export async function GET(request: Request) {
const session = await requireAdmin();
// 只有管理员可以访问
}
```
### API 路由
#### 用户管理 API
**路径**: `/api/admin/users`
- **GET**: 获取用户列表(支持分页)
- 查询参数: `limit`, `offset`
- **PATCH**: 更新用户信息
- 请求体: `{ id, email?, role?, isActive? }`
- **DELETE**: 删除用户
- 查询参数: `id`
#### 系统设置 API
**路径**: `/api/admin/settings`
- **GET**: 获取系统设置
- 查询参数: `key` (可选,获取特定设置)
- **POST**: 更新系统设置
- 请求体: `{ key, value }`
#### 工具管理 API
**路径**: `/api/admin/tools`
- **GET**: 获取工具配置列表
- 查询参数: `toolName` (可选,获取特定工具)
- **POST**: 更新工具配置
- 请求体: `{ toolName, isEnabled, description?, config? }`
### 系统设置页面
**路径**: `/admin/settings`
管理员可以通过此页面管理:
#### 1. 用户管理
- 查看所有用户列表
- 修改用户角色(guest/regular/admin)
- 激活/禁用用户账户
- 删除用户账户
#### 2. 网站设置
- 设置网站名称
- 配置网站 LOGO URL
- 配置浏览器图标(Favicon)URL
- 配置白天模式 LOGO URL
- 配置黑夜模式 LOGO URL
#### 3. 工具库管理
- 查看所有可用 AI 工具
- 启用/禁用工具
- 工具状态实时更新
### 工具注册系统
系统使用 `lib/ai/tools-registry.ts` 管理工具启用状态:
```typescript
import { getEnabledTools } from "@/lib/ai/tools-registry";
// 获取启用的工具列表
const enabledTools = await getEnabledTools();
// 返回: ["getWeather", "createDocument", ...]
```
聊天 API 会自动根据工具配置决定哪些工具可用。
### 数据库迁移
运行以下命令创建数据库迁移:
```bash
# 生成迁移文件
pnpm db:generate
# 应用迁移
pnpm db:migrate
```
### 创建管理员账户
要创建管理员账户,可以通过以下方式:
1. **通过数据库直接更新**:
```sql
UPDATE "User" SET role = 'admin' WHERE email = 'admin@example.com';
```
2. **通过系统设置页面**:
- 以管理员身份登录
- 访问 `/admin/settings`
- 在"用户管理"标签页中找到目标用户
- 将角色修改为"管理员"
### 使用示例
#### 访问系统设置页面
1. 以管理员身份登录
2. 访问 `http://localhost:3000/admin/settings`
3. 使用三个标签页管理不同功能
#### 更新网站设置
```typescript
// 通过 API
await fetch("/api/admin/settings", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: "siteName",
value: "我的 AI 聊天机器人",
}),
});
```
#### 禁用工具
```typescript
// 通过 API
await fetch("/api/admin/tools", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
toolName: "getWeather",
isEnabled: false,
description: "获取天气信息",
}),
});
```
### 安全注意事项
- 所有管理员 API 都使用 `requireAdmin()` 中间件保护
- 只有管理员角色的用户才能访问系统设置页面
- 用户删除操作需要确认,防止误操作
- 系统设置更改会记录更新者信息
---
## 常见问题
### 1. 数据库连接失败
**问题**: 无法连接到 PostgreSQL 数据库
**解决方案**:
- 检查 `POSTGRES_URL` 环境变量是否正确
- 确认数据库服务正在运行
- 检查网络连接和防火墙设置
### 2. 认证失败
**问题**: 用户无法登录
**解决方案**:
- 检查 `AUTH_SECRET` 是否设置
- 确认 `AUTH_URL` 与部署 URL 匹配
- 检查数据库中的用户数据
### 3. AI 模型无响应
**问题**: AI 模型不返回响应
**解决方案**:
- 检查 AI Gateway API 密钥(非 Vercel 部署)
- 确认模型 ID 正确
- 检查网络连接
- 查看控制台错误日志
### 4. 流式传输中断
**问题**: 流式响应中途断开
**解决方案**:
- 配置 Redis 以启用可恢复流式传输
- 检查网络稳定性
- 增加超时时间设置
### 5. Artifact 不显示
**问题**: Artifact 创建后不显示
**解决方案**:
- 检查 `dataStream.write()` 调用是否正确
- 确认 Artifact 类型已注册
- 查看浏览器控制台错误
- 检查数据库中的文档记录
### 6. 消息不保存
**问题**: 消息发送后未保存到数据库
**解决方案**:
- 检查数据库连接
- 确认 `saveMessages()` 函数被调用
- 查看服务端日志
- 检查数据库表结构
### 7. 如何添加管理员功能
**问题**: 项目没有管理员功能,如何添加?
**解决方案**:
- 参考文档中的"系统设置和管理员功能"章节
- 扩展数据库 schema 添加角色字段
- 更新认证系统支持管理员类型
- 创建管理员中间件和页面
- 实现管理员专用的 API 路由
---
## 扩展资源
### 官方文档
- [Next.js 文档](https://nextjs.org/docs)
- [AI SDK 文档](https://ai-sdk.dev)
- [Drizzle ORM 文档](https://orm.drizzle.team)
- [NextAuth 文档](https://authjs.dev)
- [shadcn/ui 文档](https://ui.shadcn.com)
### 相关链接
- [Vercel AI Gateway](https://vercel.com/docs/ai-gateway)
- [Neon Serverless Postgres](https://neon.tech)
- [Vercel Blob](https://vercel.com/storage/blob)
---
## 贡献指南
### 代码提交
1. 创建功能分支
2. 编写代码并添加测试
3. 运行 `pnpm lint` 和 `pnpm format`
4. 提交 Pull Request
### 代码审查
- 确保所有测试通过
- 遵循代码规范
- 添加必要的文档
- 更新 CHANGELOG(如适用)
---
## 许可证
查看 `LICENSE` 文件了解许可证信息。
---
## 更新日志
### v3.1.0
- 支持多种 Artifact 类型
- 改进的消息系统(parts 架构)
- 可恢复流式传输支持
- 用户权限系统
- 消息投票功能
---
**最后更新**: 2024年
**维护者**: 项目团队