可用模型列表此前直接用 /admin/accounts/{id}/models 的返回,那是上游渠道挂载的
全量目录,未经账号 model_mapping 投影,导致「上游有但账号没配」的模型(qwen3.6-flash、
qwen3.7-max)被列成可用,而实际调用返回 404 model_not_found;别名式映射
(deepseek-v4-flash => deepseek-v4-flash-0731)还会把上游名列出来、别名反而不可用。
- 新增 projectAccountModels:复刻网关 /v1/models 的 projectAccountModelsBody,
候选为「上游模型 ∪ model_mapping 别名」,逐条解析映射(精确优先、末尾 * 通配最长优先),
未命中即丢弃,命中后校验映射目标确实存在于上游目录,最终输出别名而非上游名
- 过滤链统一为:上游全量 → model_mapping 投影 → 分组 model_allowlist → 账号粒度状态
- 状态判定回到账号粒度(挂它的账号里至少一个在线才算可用),不再按分组任一账号在线放大
- filterModelsByAllowlist 复刻 Sub2API GroupModelAllowlist.FilterForListing
- AdminAccount 补 credentials(model_mapping 不在脱敏清单内,可安全读取),
移除三个 Sub2API 并不存在的 models/model_whitelist/allowed_models 字段
可用模型弹窗:模型名支持点击复制(带 1.5s 对勾反馈,非安全上下文回退 execCommand),
并左对齐——.model-table td 的居中特异性高于 .model-name,需用 td.model-name 覆盖。
Token 排行榜
Sub2API 用户用量排行,支持今日 / 本周 / 本月 / 近 7 天 / 近 30 天和自定义日期区间,页面默认每 5 分钟自动刷新(后台标签页暂停,切回即补拉)。主表默认按参考成本降序(成本、成本占比紧跟用户列),点开一行看该用户每个模型的请求、Token 拆分、参考成本、单价和成本占比,模型明细与「可用模型」弹窗的表头均可排序(默认单价降序)。主表表头可按成本 / Token / 请求 / 输入 / 输出排序,再次点击切换升 / 降序。单价为参考价(统一带 ~ 前缀):优先取管理后台分组配置的模型计费单价,未配置的模型回退 Sub2API 内置计费目录(悬停可见完整价格与来源)。所有用户都计入排行(含 admin),仅无请求的账号不显示。右上角「可用模型」弹窗展示全部上游账号挂载的模型,状态来自账号可用状态。
/groups.html 为分组模型总览,分组配置在 src/groups.config.ts,模型列表默认按区间成本从高到低排列;页首展示「阿里云百炼 · Token Plan」卡片:7 天滚动窗口余量(5 小时窗口官方已取消)、订阅到期时间与剩余天数、重置卡持有数——数据来自服务器定时探针写出的 data/bailian.json(个人版官方无公开用量 API,走控制台网关,需维护会过期的登录 Cookie,见 deploy/DEPLOY.md)。
重置卡「使用」入口默认隐藏(防误触,用卡不可撤销)。需要时在分组页浏览器控制台执行:
// 持久开启(该浏览器以后都显示)
localStorage.setItem('bailian-reset-card', '1'); location.reload()
// 仅当前标签临时显示(刷新后恢复隐藏)
document.documentElement.dataset.resetCards = '1'
显示后点击「重置卡 ×N」仍需二次确认;请求由服务器侧 deploy/reset-card-server.py 校验 Admin Key 与卡归属后代发(见 deploy/DEPLOY.md 第 6 节),控制台 Cookie 不进前端。
开发
cp .env.example .env
# 填入 ADMIN_API_KEY
pnpm install
pnpm dev
开发时 Vite 把 /api 代理到 Sub2API,并用 .env 里的 ADMIN_API_KEY 注入 x-api-key,浏览器里不会带上这把 key。
同域部署
构建:
pnpm build
推荐独立域名部署(例如 token.example.com),Sub2API 现有 nginx 不用改。把 dist/ 内容放到新站点网站目录,并反代 /api/ 到本机 127.0.0.1:8080。详见 deploy/DEPLOY.md。