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>
4.1 KiB
4.1 KiB
本地测试环境搭建指南
目录结构
D:\Code\Projects\Metapi\
├── metapi # 主仓库(upstream)
├── metapi-routing-ux-optimization # 开发 worktree (模型白名单功能)
├── metapi-upstream-latest # 其他 worktree
└── ...
快速启动测试服务器
1. 进入开发 worktree
cd D:/Code/Projects/Metapi/metapi-routing-ux-optimization
2. 安装依赖(首次运行)
pnpm install
3. 构建项目
pnpm build
4. 启动测试服务器
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
然后触发模型发现:
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: 使用测试脚本(可选)
DATA_DIR="./tmp/test-db" node scripts/seed-test-data.js
测试模型白名单功能
1. 进入设置页面
点击左侧导航"设置",滚动到"全局模型白名单"卡片
2. 测试功能
添加模型到白名单
- 方式1: 在输入框输入模型名称,按回车
- 方式2: 点击"可用模型列表"中的模型
删除模型
- 点击已选模型徽章上的 × 按钮
保存配置
- 点击"保存模型白名单"按钮
- 系统自动触发路由重建
3. 验证效果
查看路由
进入"令牌路由"页面,确认只有白名单中的模型有路由
查看模型候选
curl -H "Authorization: Bearer test-admin-token" \
http://localhost:4000/api/models/token-candidates | python -m json.tool
应该只返回白名单中的模型
4. API 测试命令
查看当前白名单
curl -H "Authorization: Bearer test-admin-token" \
http://localhost:4000/api/settings/runtime | python -m json.tool | grep -A 5 "globalAllowedModels"
设置白名单
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
清空白名单(允许所有模型)
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
停止测试服务器
查找进程
# Windows
netstat -ano | grep ":4000" | grep "LISTENING"
# Linux/Mac
lsof -i :4000
停止进程
# Windows (替换 PID)
taskkill //F //PID <PID>
# Linux/Mac
kill <PID>
开发工作流
修改代码后重新构建
pnpm build
运行测试
pnpm test
提交代码
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
查看数据库:
sqlite3 ./tmp/test-db/hub.db
常用查询:
-- 查看所有站点
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;