forked from boos/BoosAPI
fa25a501a8
* feat: 实现全局模型白名单功能 ## 功能概述 实现全局模型白名单,允许管理员配置只启用特定模型的路由,实现精细化的模型访问控制。 ## 主要变更 ### 后端实现 - config.ts: 新增 globalAllowedModels 配置项 - settings.ts: - 新增 RuntimeSettingsBody 类型支持 - 实现数据库加载和持久化 - 配置变更自动触发路由重建 - modelService.ts: - 在路由重建中添加白名单过滤逻辑 - 大小写不敏感匹配,自动trim空格 - 空白名单时允许所有模型(向后兼容) - stats.ts: - 候选API过滤 models/modelsWithoutToken/modelsMissingTokenGroups ### 前端实现 - Settings.tsx: - 新增"全局模型白名单"配置卡片 - 支持手动输入和点击选择两种添加方式 - 绿色徽章显示已选模型,支持删除 - 保存后自动触发路由重建 ## 技术特性 - ✅ 向后兼容(默认为空数组,允许所有模型) - ✅ 大小写不敏感匹配 - ✅ 自动trim和去重 - ✅ 输入验证(类型检查、空值过滤) - ✅ 配置变更自动重建路由 ## 测试验证 - 白名单为空时所有模型可见 - 白名单有值时只显示白名单模型 - 路由重建正确过滤模型 - 候选API正确返回过滤结果 - 前端UI交互正常 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: add getModelTokenCandidates mock to Settings tests * fix: add getModelTokenCandidates mock to proxy-transport test --------- Co-authored-by: Ding <ding@local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
208 lines
4.1 KiB
Markdown
208 lines
4.1 KiB
Markdown
# 本地测试环境搭建指南
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
D:\Code\Projects\Metapi\
|
||
├── metapi # 主仓库(upstream)
|
||
├── metapi-routing-ux-optimization # 开发 worktree (模型白名单功能)
|
||
├── metapi-upstream-latest # 其他 worktree
|
||
└── ...
|
||
```
|
||
|
||
## 快速启动测试服务器
|
||
|
||
### 1. 进入开发 worktree
|
||
|
||
```bash
|
||
cd D:/Code/Projects/Metapi/metapi-routing-ux-optimization
|
||
```
|
||
|
||
### 2. 安装依赖(首次运行)
|
||
|
||
```bash
|
||
pnpm install
|
||
```
|
||
|
||
### 3. 构建项目
|
||
|
||
```bash
|
||
pnpm build
|
||
```
|
||
|
||
### 4. 启动测试服务器
|
||
|
||
```bash
|
||
DATA_DIR="./tmp/test-db" node dist/server/index.js
|
||
```
|
||
|
||
服务器将在 http://localhost:4000 启动
|
||
|
||
**测试Token:** `test-admin-token`
|
||
|
||
### 5. 访问前端
|
||
|
||
打开浏览器访问: http://localhost:4000
|
||
|
||
登录使用 Token: `test-admin-token`
|
||
|
||
## 测试数据准备
|
||
|
||
### 方式1: 导入真实站点
|
||
|
||
在前端"站点管理"中添加真实的 new-api 站点:
|
||
- 站点URL: 真实的 new-api 地址
|
||
- 平台: new-api
|
||
- 添加账号和token
|
||
|
||
然后触发模型发现:
|
||
```bash
|
||
curl -X POST -H "Authorization: Bearer test-admin-token" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"refreshModels": true, "wait": true}' \
|
||
http://localhost:4000/api/routes/rebuild
|
||
```
|
||
|
||
### 方式2: 使用测试脚本(可选)
|
||
|
||
```bash
|
||
DATA_DIR="./tmp/test-db" node scripts/seed-test-data.js
|
||
```
|
||
|
||
## 测试模型白名单功能
|
||
|
||
### 1. 进入设置页面
|
||
|
||
点击左侧导航"设置",滚动到"全局模型白名单"卡片
|
||
|
||
### 2. 测试功能
|
||
|
||
#### 添加模型到白名单
|
||
- **方式1**: 在输入框输入模型名称,按回车
|
||
- **方式2**: 点击"可用模型列表"中的模型
|
||
|
||
#### 删除模型
|
||
- 点击已选模型徽章上的 × 按钮
|
||
|
||
#### 保存配置
|
||
- 点击"保存模型白名单"按钮
|
||
- 系统自动触发路由重建
|
||
|
||
### 3. 验证效果
|
||
|
||
#### 查看路由
|
||
进入"令牌路由"页面,确认只有白名单中的模型有路由
|
||
|
||
#### 查看模型候选
|
||
```bash
|
||
curl -H "Authorization: Bearer test-admin-token" \
|
||
http://localhost:4000/api/models/token-candidates | python -m json.tool
|
||
```
|
||
|
||
应该只返回白名单中的模型
|
||
|
||
### 4. API 测试命令
|
||
|
||
#### 查看当前白名单
|
||
```bash
|
||
curl -H "Authorization: Bearer test-admin-token" \
|
||
http://localhost:4000/api/settings/runtime | python -m json.tool | grep -A 5 "globalAllowedModels"
|
||
```
|
||
|
||
#### 设置白名单
|
||
```bash
|
||
curl -X PUT \
|
||
-H "Authorization: Bearer test-admin-token" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"globalAllowedModels": ["gpt-4", "gpt-4o"]}' \
|
||
http://localhost:4000/api/settings/runtime | python -m json.tool
|
||
```
|
||
|
||
#### 清空白名单(允许所有模型)
|
||
```bash
|
||
curl -X PUT \
|
||
-H "Authorization: Bearer test-admin-token" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"globalAllowedModels": []}' \
|
||
http://localhost:4000/api/settings/runtime | python -m json.tool
|
||
```
|
||
|
||
## 停止测试服务器
|
||
|
||
### 查找进程
|
||
```bash
|
||
# Windows
|
||
netstat -ano | grep ":4000" | grep "LISTENING"
|
||
|
||
# Linux/Mac
|
||
lsof -i :4000
|
||
```
|
||
|
||
### 停止进程
|
||
```bash
|
||
# Windows (替换 PID)
|
||
taskkill //F //PID <PID>
|
||
|
||
# Linux/Mac
|
||
kill <PID>
|
||
```
|
||
|
||
## 开发工作流
|
||
|
||
### 修改代码后重新构建
|
||
|
||
```bash
|
||
pnpm build
|
||
```
|
||
|
||
### 运行测试
|
||
|
||
```bash
|
||
pnpm test
|
||
```
|
||
|
||
### 提交代码
|
||
|
||
```bash
|
||
git add .
|
||
git commit -m "feat: 实现模型白名单功能"
|
||
git push origin routing-ux-optimization
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
### Q: 路由列表为空?
|
||
A: 检查 token_model_availability 表是否有数据,触发模型发现重新加载
|
||
|
||
### Q: 白名单保存后路由消失?
|
||
A: 正常现象,白名单会过滤掉不在列表中的模型路由
|
||
|
||
### Q: 如何恢复所有模型?
|
||
A: 清空白名单(设置为空数组 [])即可
|
||
|
||
## 数据库位置
|
||
|
||
测试数据库存储在: `./tmp/test-db/hub.db`
|
||
|
||
查看数据库:
|
||
```bash
|
||
sqlite3 ./tmp/test-db/hub.db
|
||
```
|
||
|
||
常用查询:
|
||
```sql
|
||
-- 查看所有站点
|
||
SELECT id, name, url, platform FROM sites WHERE status = 'active';
|
||
|
||
-- 查看所有账号
|
||
SELECT id, site_id, username, status FROM accounts;
|
||
|
||
-- 查看所有token
|
||
SELECT id, account_id, name, value_status FROM account_tokens;
|
||
|
||
-- 查看模型可用性
|
||
SELECT COUNT(*) FROM token_model_availability;
|
||
|
||
-- 查看路由
|
||
SELECT COUNT(*) FROM token_routes;
|
||
``` |