Skip to content

v1.0.46

Choose a tag to compare

@github-actions github-actions released this 17 Sep 01:39
· 282 commits to main since this release

新增

  • 临时停用账号(issue #21):账号页每行新增「停用 / 启用」按钮。停用后该账号
    不再被上游加载、不会被选中(复现某个号一直失败或在拖后腿时,先停用它比删掉更
    合适 —— 删除会丢凭证、只能重新扫码,停用完全可逆)。

    实现说明:上游没有禁用/启用的 HTTP 接口(它内部有 Disable/ReviveDisabled,
    但只被自身错误处理调用、未对外暴露),state.json 又每 5 秒被上位机覆盖,改它
    没有意义。所以走的是改文件名:上游用 glob workbuddy*.json 收集账号,加
    .disabled 后缀后就不再匹配、随即从池里消失;启用就是改回原名,凭证一个字节
    都不动
    。上游不监听文件变化,因此改名后会自动触发一次重载使其立即生效。

    界面区分三种「不可用」:面板停用显示灰字「已停用」(用户自己的选择,不是故障),
    上游自动禁用仍是红字「已禁用」,账号文件真有问题才是「未加载」。之前若不加区分,
    刚停用的账号会被报成「未加载 / 账号文件可能有问题」,把用户的主动操作说成故障。

修复

  • 浏览器自动填充密码后登录必定失败(issue #22):登录页两个输入框是受控组件,
    而浏览器自动填充直接改写 DOM 的 value、不派发 input 事件,于是 React state
    始终是空串 —— 界面显示有密码、提交出去的却是
    {"username":"","password":""},服务端只能回「用户名或密码错误」。用户会以为
    自己记错了密码,反复重试直到触发登录失败锁定(连续 5 次锁 10 分钟)。

    改法:提交时从表单元素的实际值读取(form.elements.namedItem),不再只依赖
    state —— 手输、自动填充、密码管理器注入三种情况都覆盖。另外真读到空值时给一句
    指向原因的提示(「若使用了浏览器自动填充,请手动重新输入」),而不是让它落到
    后端报「密码错误」。

    已按报告者的取证方式复现并验证:修复前请求体是空串、修复后为
    {"username":"admin","password":"lgpass"} 且成功进入面板。

适配上游

  • prompt.mode 新增 append 取值(上游 ff64ecd / 51bc469,其 issue #129):
    上游把该枚举从两值扩成三值 —— passthrough(透传客户端 system,默认)/ custom
    (替换为网关提示词)/ append(在开头连续的 system/developer 块之后插入网关
    system,既有消息逐字不动)。

    我们的设置页有一份独立于上游的白名单校验,此前只认前两个,于是用户填上游
    支持的新值会被面板拒掉(「上游支持、面板说不合法」)。这不是小事:那份校验若与
    上游漂移,另一个方向更危险 —— 放行上游不认的值会写进一份让上游启动即失败的
    配置(上游 normalizePrompt 对非法值是 fail fast),表现为「保存成功然后上游
    挂了」,比当场报错难查得多。现在三值对齐,并加了断言把两边的取值集钉在一起。

    上游这次另外两处变化不受影响(已逐项核对):config.json 新增
    cost_explore_interval、/status 新增 cost_explore/events_total/per_model
    三个键(上游注释明确「零回归只增键」);internal/upstream/sse.go 的多次改动都在
    上游自己的 Aggregate(统计与 tool_calls 归并)里,不改变我们代理的 SSE 分帧。

上游核对(截至 5deb3c6,32 个提交)

除上面那项外逐项核对完毕,其余无需适配:

  • Status 结构体、端点注册无变化;任务日志文案无变化(tasklog 不受影响)。
  • config.json 仅新增一个键(cost_explore_interval);/status 仅新增三个
    键 —— 均为只增不改,我们按需读取,不读也不受影响。
  • 其余提交集中在 internal/pool(选号权重、成本台账、竞态修复)、internal/upstream
    (Aggregate 边界、models.dev 负缓存)、internal/auth(并行访问 token 的数据竞争)、
    internal/session、internal/scheduler 及各自测试 —— 都是上游内部实现与其自身
    日志/统计口径的修复,不涉及我们的转发路径或直连路径。