Files
BoosAPI/TEST_ENVIRONMENT_SETUP.md
T
Delicious233 fa25a501a8 feat: 实现全局模型白名单功能 (#301)
* 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>
2026-03-30 17:19:02 +08:00

208 lines
4.1 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.
# 本地测试环境搭建指南
## 目录结构
```
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;
```