Skip to content

v0.4.3

Choose a tag to compare

@RobbsLuo RobbsLuo released this 13 Oct 16:56
· 184 commits to main since this release

新增

  • 凭证池:筛选与按渠道分组。凭证多了以后,「找到某一个账号」拆成三层:筛选工具条(搜索 × 渠道 × 状态,纯前端收敛,不改后端排序)+ 按渠道分组(组头做成一张紧凑的「渠道仪表盘」:品牌图标 + 渠道名 + 账号数 + 状态分布 + 额度合计占比环 + 到期积分)+ 列头跟着展开区走(没有全局表头,列头渲染在每个展开的组内部并吸顶)。默认全折叠,首屏先看结构;筛选生效时自动展开命中渠道,清空回折叠总览。组顺序默认额度从高到低,可切回固定的全站渠道顺序。「成长中心」列只对支持的渠道(CodeBuddy)出现,其余渠道留空占位格以保持列数恒定(否则 auto 布局会重算列宽、下面展开的组整列错位)。到期积分次窗口只在比主窗口多时才出第二块——CodeArts 每日池当天清零、两窗口恒等,不再把同一个数字说两遍。
  • 模型列表页:available 与「只看当前渠道」。GET /api/model-catalog 每行新增 available 布尔,表示该模型是否当前渠道真能提供(口径与 /v1/models 一致:只算有可用凭证、过当前黑名单的渠道),判定复用价表 / 能力分同一套候选键。页面提供默认关闭的「只看当前渠道」开关,勾选后本地收窄到当前渠道获取到的模型(不重新请求)。「能力分」列头可点排序(按综合智能指数,无分数的行排末尾)。

变更

  • 用量统计默认最近 24 小时(原 7 天):打开统计页的第一问题是「这个池子现在怎么样」,7 天会把当天的波动摊平。仍可切 7 天 / 30 天 / 全部。
  • 测试目录按 src/ 结构重组:tests/ 镜像 src/ 子包(api/ auth/ compat/ config/ db/ deploy/ engine/ provider/<渠道>/ scripts/ stats/ tasks/ webapp/)+ helpers/ + regression/,巨型文件拆分到 600 行以内;「真连上游」豁免从按文件名判定改为 @pytest.mark.real_upstream(...),文件重命名/下沉后不再静默失效。测试数与覆盖门槛不变(后端 100% 行/分支)。
  • 内部重构(行为零变更):api/models.py 拆出 model_merge.py 纯函数层;三个 /v1 出口共用 dispatch_compat;7 个上游端点解析器表驱动化;scripts/ 抽出 _common.py(backup() + 与 Database.transaction 同语义的 DbAdapter,去掉 6 份 backup / 4 份 adapter 副本)。

修复(安全加固批次)

  • 流式首帧后不再换号:已向客户端出过帧还换凭证,会把两个上游的半截内容拼进同一条回复。
  • 登录 CSRF:无 Cookie 的写端点(登录 / /authorize)也校验 Origin/Referer。
  • OAuth state store(codebuddy / codearts / qoder)补 TTL 判定,过期 reservation 不再可轮询 / 重放;TRAE 回调登录按发起人会话绑定 pending(单槽全局态会被并发登录互相覆盖,把 A 的凭证记到 B 名下)。
  • 上游错误体有界读取(7 处非流式错误路径改 read_body_bounded,恶意上游不能撑爆内存);非流式聚合加事件条数上限(上游死循环输出不再无界增长到 OOM)。
  • 出站文案不回上游原文 / 内部 URL:UpstreamProtocolViolation 加受控 public_message,告警 webhook 外发只留 scheme://host 与异常类名。
  • SQLite 写事务显式 BEGIN IMMEDIATE(deferred 下读改写会丢更新);Database.transaction 嵌套调用只有最外层提交 / 回滚;Database.close 关闭所有线程连接。
  • 告警 webhook SSRF 校验(拒内网 / 回环 / 链路本地 / 保留 / 多播 / 未指定),env 提供的 ALERT_WEBHOOK_URL 同样校验;多地址改并发投递并加总预算。
  • 迁移版本护栏:库 user_version 高于本程序时拒绝执行(此前会把版本号写回旧值)。
  • 凭证昵称仅 admin/operator 可见;模型白名单在无法判定模型名时 fail closed;登录限流失败键加数量上限与淘汰(堵用户名维度内存 DoS);APP_SECRET 补低熵拒绝。
  • 管理台:admin-only 路径加 RequireAdmin 守卫(非 admin 直输地址不再落到一片 403);错误文案只透出后端受控 message,不再渲染网络层英文实现细节。
  • 前端:CSP 收紧到 default-src/script-src 'self'(主题初始化移出内联脚本)+ Referrer-Policy: same-origin;/index.html 不再发 immutable 缓存头。
  • CLI:hash_password / create_user 新增 --password-stdin(密码不进 argv / shell 历史);create_user --list 改为只读。

升级

docker compose pull && docker compose up -d

无数据库 schema 变更(PRAGMA user_version 仍为 18),无需迁移。改过 src/ 的本地部署必须重启后端进程。镜像:ghcr.io/robbsluo/coding2api:v0.4.3(同时更新 :latest)。