8.0 KiB
8.0 KiB
AI 模型和存储配置指南
功能概述
本系统实现了完整的 AI 模型配置和存储管理功能,无需修改 .env 文件即可在系统设置中动态配置。
核心功能
1. AI 提供商配置
支持配置多个 AI 服务提供商,包括:
- 阿里云通义千问 (Alibaba)
- OpenAI 兼容接口 (OpenAI)
- 自定义提供商 (Custom)
访问路径: /admin/settings → AI 模型 → AI 提供商
配置项:
- 提供商名称:自定义名称,如"阿里云通义千问"
- 提供商类型:选择类型
- API 地址:提供商的 API 基础 URL(例如:https://dashscope.aliyuncs.com/compatible-mode/v1)
- API Key:访问令牌(不回显已保存的密钥)
- 启用状态:勾选启用此提供商
API 端点: /api/admin/ai-providers
GET- 获取所有提供商列表POST- 创建新提供商PUT- 更新提供商配置DELETE?id={id}- 删除提供商
2. AI 模型配置
为每个提供商配置具体的模型,支持设置视觉能力和图片生成能力。
访问路径: /admin/settings → AI 模型 → AI 模型
配置项:
- 所属提供商:选择已配置的提供商
- 模型 ID:提供商中的模型标识(例如:qwen-turbo, qwen-vl-plus)
- 显示名称:用户界面上显示的名称
- 描述:模型的简要说明
- 排序顺序:确定前端显示顺序
- 支持图片输入:模型是否支持视觉(图片识别)
- 支持图片生成:模型是否支持图片生成
- 启用:模型是否可用
- 设为默认:标记为默认使用的模型
API 端点: /api/admin/ai-models
GET- 获取模型列表(可选providerId筛选)POST- 创建新模型PUT- 更新模型配置DELETE?id={id}- 删除模型
用户端 API: /api/models
GET- 获取已启用的模型列表(用于前端选择)
3. S3 存储配置
配置 S3 兼容的对象存储服务,用于图片上传和多媒体处理。
访问路径: /admin/settings → 存储配置
配置项:
- 配置名称:自定义名称
- 存储类型:S3 兼容存储或本地存储
- 端点:S3 服务端点 URL
- 区域:地区代码
- 存储桶:目标存储桶名称
- Access Key ID:访问凭证
- Secret Access Key:秘密凭证(不回显)
- 公开访问 URL 前缀:文件的公开访问地址前缀
- 启用:是否启用此配置
- 设为默认:优先使用的存储配置
API 端点: /api/admin/storage
GET- 获取存储配置列表POST- 创建新配置PUT- 更新配置DELETE?id={id}- 删除配置
4. 前端模型选择
用户在聊天界面选择模型时,系统会:
- 首先加载数据库中配置的动态模型
- 如果没有配置,则显示预定义的静态模型
- 优先显示标记为"默认"的模型
调用流程:
- 前端组件:
components/model-selector.tsx - 调用 API:
/api/models获取可用模型列表 - 支持视觉模型标签显示
- 支持默认模型标签显示
数据库结构
AiProvider 表
CREATE TABLE "AiProvider" (
id uuid PRIMARY KEY,
name varchar(128) NOT NULL, -- 提供商名称
type varchar NOT NULL, -- 类型: alibaba, openai, custom
baseUrl text NOT NULL, -- API 基础 URL
apiKey text NOT NULL, -- API Key
isEnabled boolean DEFAULT true, -- 是否启用
createdAt timestamp DEFAULT now(),
updatedAt timestamp DEFAULT now(),
updatedBy uuid REFERENCES "User"(id)
);
AiModel 表
CREATE TABLE "AiModel" (
id uuid PRIMARY KEY,
providerId uuid NOT NULL REFERENCES "AiProvider"(id) ON DELETE CASCADE,
modelId varchar(128) NOT NULL, -- 模型 ID
displayName varchar(128) NOT NULL, -- 显示名称
description text, -- 描述
supportsVision boolean DEFAULT false, -- 支持图片输入
supportsImageGen boolean DEFAULT false, -- 支持图片生成
isEnabled boolean DEFAULT true,
isDefault boolean DEFAULT false,
sortOrder json DEFAULT 0,
createdAt timestamp DEFAULT now(),
updatedAt timestamp DEFAULT now()
);
StorageConfig 表
CREATE TABLE "StorageConfig" (
id uuid PRIMARY KEY,
name varchar(128) NOT NULL, -- 配置名称
type varchar DEFAULT 's3', -- 类型: s3, local
endpoint text, -- S3 端点
region varchar(64), -- 区域
bucket varchar(128), -- 存储桶
accessKeyId text, -- Access Key
secretAccessKey text, -- Secret Key
publicUrl text, -- 公开访问 URL 前缀
isDefault boolean DEFAULT false,
isEnabled boolean DEFAULT true,
createdAt timestamp DEFAULT now(),
updatedAt timestamp DEFAULT now(),
updatedBy uuid REFERENCES "User"(id)
);
配置优先级
AI 模型使用顺序
- 数据库配置优先 - 从 AiModel 表动态加载
- 环境变量回退 - 使用 DASHSCOPE_API_KEY 等
- 预定义模型 - 最后使用预定义的模型列表
存储服务优先级
- 数据库配置 - 优先使用标记为默认的存储配置
- 环境变量 - 使用 S3_* 系列环境变量
- Vercel Blob - 最后回退到 Vercel Blob
实现示例
配置阿里云通义千问
-
创建提供商
名称: 阿里云通义千问 类型: Alibaba API 地址: https://dashscope.aliyuncs.com/compatible-mode/v1 API Key: sk-xxxxxxxxxxxxxxxxxxxxxxxx -
创建模型
提供商: 阿里云通义千问 模型 ID: qwen-turbo 显示名称: 通义千问 Turbo 支持图片输入: ☑ 设为默认: ☑
配置 S3 存储
配置名称: 阿里云 OSS
类型: S3 兼容存储
端点: https://oss-cn-hangzhou.aliyuncs.com
区域: cn-hangzhou
存储桶: my-chatbot-bucket
Access Key ID: LTAI5t...
Secret Access Key: xxxxxxxxxxxxxxxx
公开访问 URL 前缀: https://my-chatbot-bucket.oss-cn-hangzhou.aliyuncs.com
设为默认: ☑
关键代码位置
后端核心文件
lib/db/schema.ts- 数据库表定义lib/db/queries.ts- 数据库查询函数lib/ai/dynamic-provider.ts- 动态模型加载app/(admin)/api/ai-providers/route.ts- 提供商 APIapp/(admin)/api/ai-models/route.ts- 模型 APIapp/(admin)/api/storage/route.ts- 存储 APIapp/(chat)/api/models/route.ts- 前端模型列表 API
前端核心文件
components/model-selector.tsx- 模型选择组件app/(admin)/settings/admin-settings-client.tsx- 管理设置页面app/(chat)/api/files/upload/route.ts- 文件上传处理
环境变量(可选)
虽然不再需要配置这些,但如果设置了环境变量,系统会作为回退使用:
# AI 配置回退
DASHSCOPE_API_KEY=your_key
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
# S3 存储回退
S3_ENDPOINT=https://s3.amazonaws.com
S3_REGION=us-east-1
S3_BUCKET=my-bucket
S3_ACCESS_KEY_ID=your_access_key
S3_SECRET_ACCESS_KEY=your_secret_key
S3_PUBLIC_URL=https://my-bucket.s3.amazonaws.com
故障排除
模型不显示
- 检查 AiProvider 是否启用 (isEnabled = true)
- 检查 AiModel 是否启用 (isEnabled = true)
- 检查 API 密钥和地址是否正确
- 查看浏览器开发者工具中
/api/models的响应
文件上传失败
- 确认 StorageConfig 已设置为默认 (isDefault = true)
- 验证 S3 凭证和端点
- 检查存储桶权限设置
默认模型不生效
- 确保只有一个模型设置为默认 (isDefault = true)
- 重启应用使缓存更新
- 检查前端是否正确读取 defaultModelId
安全考虑
- API Key 保护 - API Key 在数据库中存储,不在响应中回显
- 权限控制 - 所有管理 API 需要 admin 权限
- 数据加密 - 建议在生产环境中加密存储的敏感信息
- 访问控制 - 限制对
/admin/settings的访问
迁移说明
如果从旧版本升级:
- 运行数据库迁移:
npm run db:migrate - 访问管理设置重新配置 AI 模型和存储
- 删除
.env.local中的旧配置(可选) - 重启应用