Repository navigation
Conversation
2. 補充 macOS 首次啟動的放行步驟與功能差異說明
1. 新增 Windows / Linux 服务端形态(无界面、命令行安装、注册成系统服务,开机自启、崩溃自动拉起);Linux 服务端包同时用于容器内一键更新 2. 智谱清言接入任务中心:新手任务并入新手福利、每日任务并入每日签到(访客如实跳过) 3. 模型管理页新增「可见性」列与筛选,默认只展示官方客户端会列出的模型;不展示的模型默认关闭(含默认绑定) 4. 说明文件补充 Windows / Linux 服务端部署指引 优化 1. 智谱清言余额改用账户真实积分并修正显示单位;「积分明细」列出真实收支流水 2. 智谱清言单轮对话不再携带标记,官方客户端聊天记录里不再出现 <|user|> 之类的字样 3. 服务端日志支持写入文件,服务形态下不再「起来了却什么都看不到」 修复BUG 1. 智谱清言回答被重复下发两遍 2. 智谱清言账号在模型管理与余额查询里整家消失(升级后自动修复) 3. 智谱清言余额放大一百倍、未参与活动账号余额显示为 0 4. Qoder / WorkBuddy 可见模型被旧默认名单误关,升级后自动重新打开 5. 本地文件订阅导入失败
2. 新增:服务端一键安装脚本 —— 升级重跑脚本,卸载可连数据一起删 3. 新增:Linux 桌面端安装包(deb / AppImage),与 Windows、macOS 对齐 4. 新增:Linux 服务端包 —— 容器内一键原地更新 5. 新增:智谱清言提供商(chatglm.cn) 6. 新增:智谱清言三种添加方式 —— 访客免登录、粘贴令牌、导入客户端登录态(仅 Windows) 7. 新增:智谱清言对话(直连上游 API,不是网页对话) 8. 新增:智谱清言余额读真实积分流水(积分明细逐条列出收支与到期) 9. 新增:智谱清言任务中心 —— 新手任务并入「新手福利」,每日任务并入「每日签到」 10. 新增:智谱清言加入自动签到;访客账号无积分体系,如实跳过 11. 新增:Antigravity 放开 Claude 与 GPT-OSS 家族(此前只接 Gemini) 12. 新增:Antigravity 分组额度窗口读数(Gemini / Claude-GPT 各 5 小时与每周) 13. 新增:模型管理页新增「可见性」列与筛选,不展示的模型默认关闭 14. 更新:OrcaTerm 登录改走官方 OAuth 授权页扫码 15. 更新:更新检查与安装适配 Linux —— deb 走系统安装器、AppImage 换文件 16. 更新:说明文档补充服务端部署指引与网页面板功能差异 17. 更新:发版与协作规范改由 AGENTS.md + release-flow skill 承载 18. 优化:Qoder 清单不再只留一个模型 —— 该关的交给可见性判据 19. 优化:账号页余额格支持一组多窗口的紧凑读数(Antigravity 四条横排) 20. 优化:自定义提供商的静态额外头上限 8 → 16 21. 修复:Loomy 图片适配按模型是否支持识图判断,避免上下文体积翻倍 22. 修复:订阅编辑时换本地文件不生效(字段名与后端读的键不一致) 23. 修复:对话预览把带保活注释行开头的 SSE 响应误判成 JSON 24. 修复:数据库整理(VACUUM)后总占用不降反升 25. 版本:3.0.8 → 3.0.9-beta.1
1. 修复:server crate 关掉 bin 自动发现 —— src/bin/service.rs 是 agent2api-server 的 模块(#[cfg(windows)] pub mod service;),却被打包成一个「没有 main、又依赖 Windows-only crate」的假二进制;docker 与 linux-server 走 cargo build -p(不带 --bin),在 Linux 上直接 E0601 挂掉(实测 E0601: main function not found in crate service) 2. 修复:windows-server 作业改在 desktop-tauri/src-tauri 下构建 —— 产物目录由 src-tauri/.cargo/config.toml 的 target-dir=../../target 决定,而 cargo 只从 CWD 往上找配置文件;从仓库根跑会落到 src-tauri/target,打包步骤找不到 exe 而失败
2. 新增:服务端一键安装脚本 —— 升级重跑脚本,卸载可连数据一起删 3. 新增:Linux 桌面端安装包(deb / AppImage),与 Windows、macOS 对齐 4. 新增:Linux 服务端包 —— 容器内一键原地更新 5. 新增:智谱清言提供商(chatglm.cn) 6. 新增:智谱清言三种添加方式 —— 访客免登录、粘贴令牌、导入客户端登录态(仅 Windows) 7. 新增:智谱清言对话(直连上游 API,不是网页对话) 8. 新增:智谱清言余额读真实积分流水(积分明细逐条列出收支与到期) 9. 新增:智谱清言任务中心 —— 新手任务并入「新手福利」,每日任务并入「每日签到」 10. 新增:智谱清言加入自动签到;访客账号无积分体系,如实跳过 11. 新增:Antigravity 放开 Claude 与 GPT-OSS 家族(此前只接 Gemini) 12. 新增:Antigravity 分组额度窗口读数(Gemini / Claude-GPT 各 5 小时与每周) 13. 新增:模型管理页新增「可见性」列与筛选,不展示的模型默认关闭 14. 更新:OrcaTerm 登录改走官方 OAuth 授权页扫码 15. 更新:更新检查与安装适配 Linux —— deb 走系统安装器、AppImage 换文件 16. 更新:说明文档补充服务端部署指引与网页面板功能差异 17. 更新:发版与协作规范改由 AGENTS.md + release-flow skill 承载 18. 优化:Qoder 清单不再只留一个模型 —— 该关的交给可见性判据 19. 优化:账号页余额格支持一组多窗口的紧凑读数(Antigravity 四条横排) 20. 优化:自定义提供商的静态额外头上限 8 → 16 21. 修复:Loomy 图片适配按模型是否支持识图判断,避免上下文体积翻倍 22. 修复:订阅编辑时换本地文件不生效(字段名与后端读的键不一致) 23. 修复:对话预览把带保活注释行开头的 SSE 响应误判成 JSON 24. 修复:数据库整理(VACUUM)后总占用不降反升 25. 版本:3.0.8 → 3.0.9-beta.1
1. 修复:linux-desktop 附件扫不到 .deb / .AppImage —— 上传侧 path 是
target/release/bundle/{deb,appimage}/*,upload-artifact 以两者的最近公共祖先为
包根,解出来是 linux-desktop/deb/… 与 linux-desktop/appimage/…;脚本原先只扫
一层,于是 Release 建出来了却没有这两个包(2026-10-17 实测)。改为 find -maxdepth 2
2. 修复:附件改逐个 --clobber 上传 —— 一次传一批时 gh 会在某个已存在的附件上报
HTTP 422 ReleaseAsset.name already exists,整批中断,症状是附件少一半
下载回显原写 "${LINUX_PKGS[@]}",本机 Git Bash 的 /usr/bin/basename
是 POSIX 形态(只取一个操作数),数组里后几个被静默吞掉 —— 回显只剩 AppImage 时
看着像「deb 没下载到」。改用 bash 自己的 ${arr[*]##*/}
1. 新增:docs/install.md —— 中文「安装与部署」完整说明(选哪种形态 / 桌面端 /
服务端(Windows Server、Linux systemd、装完之后、无人值守)/ Docker /
验证与客户端接入 / 局域网访问),三块内容由 README 安装段原样搬入,路径与锚点已修
2. 新增:docs/install.{en,zh-Hant,ja,ko,pt-BR}.md —— 五份译文。安装段沿用各语言
README 的既有译文;「服务端(Windows / Linux,无界面)」整节此前只有中文版,
本次补齐;同时纠正「那两份 tar.gz 不是独立部署形态」的过时说法 —— 同一个包
也是 Linux 服务端的安装包(见 selfupdate 的取包逻辑)
3. 更新:六份 README 的安装段瘦身为「快速开始」速查表(形态 / 产物 / 界面三行表
+ 每种形态的最短命令),完整说明走链接;导航里的 Docker 入口换成安装文档入口
4. 更新:README 418 → 219 行,五份译文 295 / 296 → 219 行,六份结构对齐
5. 更新:AGENTS.md 与 release-flow Skill 记下安装文档落点(六份一一对应,
产物名 / 端口 / 环境变量 / 安装脚本参数有改动就一起改),验收清单加一条
「安装文档对得上实际产物」
1. 更新:更新检查的默认仓库(version.rs 的 DEFAULT_REPO)指向 Agent2API/agent2api 2. 更新:package.json / 两个 Cargo.toml / tauri.conf.json 的仓库地址、作者、主页 3. 更新:README 与 5 份译文的徽章、下载与反馈链接、Star History 图源 4. 更新:6 份安装文档里的仓库地址与自建源示例 5. 更新:设置页「反馈与需求」的三个 issue 模板链接(含入库的前端产物) 6. 更新:LICENSE 版权署名、FUNDING.yml 赞赏页链接、systemd 单元 Documentation 地址
2. 新增:手机端 —— 响应式 Web / PWA 与 Android APK,与桌面端共用 ui-kit 3. 新增:AI 助手对话会话(schema v16)—— 会话可翻阅、可命名、可删除 4. 新增:猫猫旅行定时排程 —— 每日按北京时间整点自动派出与领奖 5. 新增:连登管家 —— 签到末尾自动补签、兑换档位、抽完抽奖次数 6. 新增:底部抽屉组件,移动端二级动作统一走它 7. 更新:安装文档六语补「手机端」一节(PWA / APK 两种形态) 8. 更新:README 与赞助页补 Telegram / Discord 群,QQ 群改为优先加群 2 9. 更新:前端产物校验纳入手机端,ui/m/** 一并逐字节比对 10. 优化:面板未登录的 401 不再记 error,首屏并发探测不再刷屏 11. 优化:图标脚本抽出 rasterize(),支持多尺寸与 maskable 图标 12. 修复:APK 签名密钥与密码移出仓库,改从本地 keystore.properties 读 13. 版本:3.0.9-beta.1 → 3.1.0
…npm ci 报 Invalid Version
…号暂以粘贴令牌对添加 1. 新增:`atomcode` provider。上游本身就是 OpenAI Chat Completions,所以转发层只做三件事 —— 模型名映射(客户端点的是展示名,网关只认自己的 id)、补/删 `stream_options`(官方客户端无条件带 `include_usage`)、带自有 User-Agent;messages / tools / tool_choice / temperature / max_tokens / reasoning_effort / 图片分片一律原样透传,`is_stateful` 恒 false 2. 新增:三条平面与四个实测坑都写进模块头 —— ① 网关**刻意**不用官方默认的 `llm-api.atomgit.com/v1`(那个要闭源请求签名),改走 `api-ai.gitcode.com/v1`;② 网关**按 User-Agent** 决定要不要签名,自称 `atomcode/<版本>` 会直接 `403 ATOMCODE_SIG_MISSING`(同 token 同 body 只改 UA 的判别式实测表在 `endpoints.rs`);③ 令牌**不是 JWT**,过期只能由 `createdAt + expiresIn` 推;④ 续期**轮换** refresh token(旧 access 立即失效),所以必须单飞、且新值非空才覆盖 3. 新增:账号层 `account_store/atomcode_accounts.rs`(粘贴令牌对落账号;公开形态**同时摘掉 accessToken 与 refreshToken** —— 只摘前者会让长期有效的续期凭据随账号列表下发)+ 目录(`coding-plan/models-v2`,只注册 `plan_available` 的条目,**不内置任何兜底清单**:实测有几个模型「可达但不在名单里」、还有「在名单里但正文是上游报错页」)+ 额度(`status-v2` 的**每窗口调用次数**,免费档实测 200 次 / 5 小时,归成界面认的 `available/unit/wallets[]` 形状) 4. 新增:登记点按「灵犀」那次接入的先例逐处补齐 —— `providers/mod.rs` 五处(pub mod / ProviderKind / PROVIDERS / kind_from_id / kind_id)、`adapter.rs` 两处(adapter_for / implemented_kinds)、`catalog.rs` refresh_meta、`catalog_cache.rs` scope、`account_store/mod.rs` 两处、`store_view.rs` 公开形态、`api/accounts.rs` 的添加与刷新两个分派、`ui-islands` 两处、`i18n` 五语言 5. 说明:两处**如实留着**的缺口,不假装完成 —— ① 网关把失败包装成 HTTP 200(正文可能是「参数错误」,或一页上游 HTML 报错 `三方请求失败`),识别与渲染已写在 `errors.rs`(含「模型正常复述这些词时不算失败」的误判护栏),但本仓 SSE 出口目前只有「改 model 名」「丢纯换行分片」两个标志位、没有按帧判错误的钩子,**调用点待接**;② 浏览器登录的服务端链路(发起 → 轮询 `auth/check` → 取令牌)已就位,但登录任务表与壳侧未接,故 `supports_web_login()` 保持 false —— 界面会如实提示不支持,而不是弹一个永远转不完的窗口 6. 测试:556 passed / 6 ignored(其中本家 53 条)。过程中单测抓到一个真 bug:`expires_at_from` 把秒与毫秒混用(`createdAt` 是秒、本项目 `addedAt`/`expiresAt` 是毫秒),三条断言当场红;单位口径现已写进该函数的文档
1. 新增:`core/login/atomcode.rs` —— 起后台任务向代理现取授权地址(`GET {broker}/auth/login` 拿 login_url + state)、回填 auth_url 供前端打开、按 3 秒间隔轮询 `auth/check` 判完成、再 `auth/token` 取令牌对落账号。与 OfficeAce / ZCode 同形(那两支也是「轮询云端、壳侧不开回调监听」)
2. 说明:本家的授权回调由代理自己在 `acs.atomgit.com/callback` 终结,**永远不回到**运行网关的这台机器 —— 所以 `supports_web_login` **保持默认 false** 是有意的,不是遗漏:那三个钩子(`build_login_url` / `exchange_login_code`)是给「回调带回一次性 code」那类用的,覆写成 true 会让路由层去等一个永远不会到达的回调。OfficeAce 同样没有覆写这个位。分派走 `api::session::login_start` 的按 provider 分支(响应形状与其余登录链一致:`{state, authUrl, edition, provider}`)
3. 更新:壳侧 `allowed_hosts` 显式放行 atomcode(不设限 = 走 None,因为授权页会按用户选的登录方式继续跳不可穷举的主机)。**不落默认分支**是必须显式写出的选择:落下去会拿到 WorkBuddy 的白名单,症状是窗口白屏而无日志
4. 更新:界面从「只渲染粘贴凭据」改为同时渲染「打开授权页」(webLogin 段 + 五语言键)。此前故意不渲染:服务端链路没通时渲染一个点了就报错的按钮比不渲染更糟
5. 修复:`BrokerLogin::start` 的超时参数由 `i64` 改为 `u64`(与 `LOGIN_TIMEOUT_MS` 同型,避免调用点每次都要转换)
6. 测试:638 passed / 6 ignored(净增 0 条:登录任务表这一层在本仓历来由 `api::session` 的分派路径与 E2E 覆盖,本轮按同样口径不新起单测;`supports_web_login` 那条断言改为钉住「必须保持 false」并写明理由)
1. 新增:`lobsterai` provider。上游是 **OpenAI 兼容的原生协议**(`POST /api/proxy/v1/chat/completions`)且**只收 SSE**(`stream:false` 回 HTTP 500);本网关的转发入口恒以 `stream:true` 请求上游(`core/upstream/mod.rs` 的原文),这条天然满足 —— 适配器**不动** `stream` 字段。**没有任何签名**,纯 Bearer(无 HMAC / DPoP / PKCE,也没有腾讯系那批归属头) 2. 新增:两个 `X-LobsterAI-Client-*` 头是功能性的,不是装饰 —— 少了 `kimi-k3-agentic-v1`,目录从 26 个模型变 25 个(`kimi-k3` 消失);少了 `thinking-level-control-v1`,发 `reasoning_effort:"off"` 直接 500。版本走日期式(`2026.9.4`),从更新接口的 **`data.value.version`** 取 3. 修复我写错的一处并在本提交内改正:`version.rs` 最初把 `data.value` 当**标量**读,而 Go 参考(`version.go:57-71`)是逐层取到 `data.value.version`(**嵌套对象**)。更值得记的是**我的单测夹具是照着自己的错法编的,于是测试全绿、代码全错**(线上表现是版本头永远退化成兜底常量)—— 现夹具按上游真实形状编,并加了一条「标量 value 必须读不到」的反向断言 4. 新增:网页登录是**浏览器授权 + 本机 loopback 回调**(`redirect_uri = http://127.0.0.1:<网关端口>/auth/callback`)。⚠️ 回调路径**刻意不带家名后缀**(与 `/auth/callback-accio` 等不一致):`redirect_uri` 是我们交给上游门户的,门户是否对回调路径有白名单**没有实测支撑**,所以跟随参考实现那条已验证的形状,不为了命名风格赌一次未经验证的兼容性(`http.rs` 那条路由的注释写了原委) 5. 新增:添加账号**只有网页登录一条路**,粘贴分支如实拒绝并说明理由 —— 续期需要 `uuid` 与两个 `keyfrom`,而它们只在换码那一刻由上游下发,用户从别处粘不出来。续期必须把这三样**原样回传**且 `latestKeyfrom` **永不更新**(照参考实现唯一经生产验证的形态);载荷件缺失时按 `canRefresh` 如实标出而不是拒绝落账号(那种账号能用到 access 过期) 6. 新增:出站三处改写,每处都有实测依据 —— `developer` 角色降级成 `system`(否则上游 502「角色信息不正确」)、`tool_choice` 为 `""`/`"none"`/`null` 时删掉、永不发 `prompt_cache_key`;图片**不做转换**(上游只认 `{type:"image_url"}`,转错形状不如让上游如实报错) 7. 新增:目录 `GET /api/models/available`(keyfrom 走 **query**、特意不带 refresh token —— query 会进服务端访问日志;信封是**单层** `data[]` 数组,不复用对象信封解析器)+ 19 条静态兜底(照 Go 参考逐字搬,远端成功时远端优先);余额 `GET /api/user/profile-summary` 的 `totalCreditsRemaining`(**不是** `/api/user/quota` —— 那个只报 300 免费额度,实测少算 5297.72);签到是上游「每日活动」三步(查活动位 → 取上下文 → `check_in`,实测 +100 积分/号/天),幂等靠客户端 `idempotencyKey` + 上游 `claimedToday` **两道预检** 8. 说明:`credits[]`(界面「积分明细」那一列读的键)只写 `name` + `remain` —— 上游明细条目只有 `type` 与 `creditsRemaining`(参考实现也把 total/used 留空,理由是上游没有周期总量概念);**到期那一栏故意不写**:上游给的是**字符串**时刻而界面那一栏要**毫秒数**,格式我们没核实过,宁可留空也不塞错(塞错会渲染成 1970 年)。另:读不到余额时**不写** `available`(沿用上一版在 AtomCode 上踩到的教训:写 0 会被限额判定当成「余额为 0」而拦账号) 9. 登记点:`providers/mod.rs` 五处、`adapter.rs` 两处、`catalog.rs`、`catalog_cache.rs`、账号存储两处 + `lobsterai_accounts.rs`(公开形态把**令牌本体与载荷件三件套一起摘掉**,只留 `canRefresh` 布尔)、`api/accounts.rs` 的添加与刷新两个分派、`api/session.rs` + `core/login.rs` + `http.rs` + `server/mod.rs`(loopback 端口)、`web_shim.rs` 的**远程面板手动回调兜底**(Docker 面板里 loopback 回不去容器)、壳侧 `login.rs` 四处、签到链四处(`CHECKIN_PROVIDERS` 14→15、`PROVIDERS_VERSION` 4→5 及增量登记、`checkin_for` 分支、签到页描述 + 五语言)、`ui-islands` 三处、图标(Go 参考里那份作者已核过来源的 SVG,栅格化成 256×256) 10. 未做(如实列出):**思考档位映射**(线上字段是 `openclawLevel`、`max` 档在线上不存在 ⇒ 客户端设的档位可能被上游忽略,按参考实现的说法是「等同没发」而非报错)、`max_tokens` 兜底填充、「HTTP 200 + 正文是 `{error}`」这种静默失败**仍无调用点**(与 AtomCode 同一个结构性原因:SSE 出口没有按帧判错误的钩子) 11. 测试:本次净增 65 条(本家 64 条 + 1 条 `credits[]` 契约);整条分支相对基点 beta `4f0040f` 的 **638 passed / 8 ignored** 现为 **764 passed / 8 ignored** ⇒ 净增 126 条
1. 新增:`providers/atomcode/checkin.rs`。本家的「签到」不是每天发额,而是**领取一次性授权的免费套餐**(`POST /coding-plan/claim-v2`)——挂在签到链上是因为「新账号必须领一次,否则目录为空、什么都调不动」与「套餐到期要能续领」这两件事都需要一个逐账号、每天跑一次、带台账的调度
2. 新增:领取口径是**按需**。先探测 `status-v2`:`codingplan_free.expires_at` 非空或 `remaining_days>0` 即有效 ⇒ **跳过领取**,只回读套餐名与额度窗口,报中性文案「套餐有效中,无需领取」(`success:false` + 说明,刻意不报成功——那会被日志与界面说成「今天签到了」,而其实什么都没发生;与 chatglm 对访客账号的中性处置同一口径)。无效才走级联
3. 新增:级联 **Max → Pro → Lite**,停规则逐条照官方 `setup.rs:825-918`:`duplicate:true` → **停**(已持有,继续往下会重复报或把用户降级)、`success:true` → **停**(本次发放)、两者皆 false → 记文案试下一档、**传输/5xx/解析失败 → 整条中止**(换档位修不好连接,只会加压)
4. 修复我先前的一处错误结论:曾据插件 README 说「claim-v2 没有幂等标记、重复领取只会再回 success:true」——**读源码后确认线上有 `duplicate` 字段**(`credits.go:149`,官方 `types.rs:526`)。真正的坑是**只看 HTTP 200 判成功**:那会把 `duplicate` 当失败、级联继续下行并降级。判定顺序 `duplicate` 先于 `success` 已钉进单测
5. 新增:领到(或档位变化)后**强制刷目录** —— `models-v2` 的 `plan_available` 是相对被问的档位算的,不刷会出现「领到了却看不到新模型」
6. 更新:签到链登记 —— `CHECKIN_PROVIDERS` 13→14、`PROVIDERS_VERSION` 3→4 并登记 `("atomcode", 4)`(新家对存量定时条目默认在范围内、且只补一次,取消勾选仍然生效)、`checkin_for` 的 atomcode 分支、签到页描述 + 五语言译文
7. 测试:699 passed / 8 ignored(净增 8 条:duplicate 优先于 success、success 终止、双 false 继续、畸形载荷不 panic、有效性判据的四种形态、额度文案只读展示窗口、级联顺序钉死)
本仓转发层用 `client.post(url).body(bytes)` 发包,reqwest 的 `.body()` 不会
自动补 `Content-Type`(只有 `.json()` 会)。LobsterAI 的 chat 端点缺了它就回
`{"code":500,"message":"服务器内部错误"}`(HTTP 500,约 46ms 即返),跨模型
稳定复现,症状像「网关坏了」而不是「少了一个头」。
判据两条:① 伪令牌探针证明上游先鉴权(无论带不带该头都是 401 code 40100),
所以 500 出在鉴权之后;② 同一账号打同一域名的其它 POST(换码 /api/auth/exchange、
签到)都带了这个头且成功。两个参考实现也都把它列在四个基础头里。
同时补一条单测钉住这个头,免得再被静默去掉(原来的头集合里只测了
developer 角色归一)。
1. 修复(用户实测报的现象「领完套餐还是显示余额不足」的真因):`shape_usage` 在没有解析出任何窗口时也写 `available: 0`。而限额判定走 `usage_records::extract_remaining`,它的规则是「`unlimited` → 判不出;否则 `totalLeft`;否则 **`available` 一旦出现就是真实读数**」⇒「这份响应我没读懂」被理解成「余额确实为 0」,账号当场被限制器拦下(dev 库里实测那条记录正是 `available=0 / wallets=[] / error=None`,即查询成功但一个窗口都没解析出来)。现在改为**只在确实解析出窗口时**才写 `available`,并同样收紧了 `subscription` 里的 `remainQuota`/`totalQuota`;读不到就只回 `wallets: []`(记录被 `usage_records` 摘除、不拦账号,余额列留空 —— 与本仓「读不到的数值留空显示」同一口径) 2. 新增:`status-v2` 的**字段形态诊断日志**(详细日志,只记顶层键名与 `rate_limit_windows` / `current_usage` 两条额度数组,不含凭据)。额度是按字段名解析的,名字一变就静默归零 —— 今天就是栽在这,留一条能事后对账的痕迹 3. 测试:atomcode 62 条全绿(净增 2 条,其中一条把错误的旧断言反过来钉住:**读不到窗口时不得写 available**)
上游的路径是三段式 `{code}/context?configRevision=…`,我们把中间那段写丢了,
请求落到 `/api/client-activities/{code}` 上直接被回 HTTP 404,于是签到每次都
落在「活动上下文查询返回 HTTP 404」(dev 的 checkin_records 里就是这么记的)。
对照参考实现(Go `fetchActivityContext`、TS `lobsterai-credits.ts`)逐字同形
之后判定是漏段而不是上游改了路径;同一批 URL 里 `/actions/check_in` 那段是对的。
顺带把断言补到位:原先只有一条「活动码要转义」的用例,它测的是 query 片段,
`/context` 段整个缺失也不报错 —— 现在直接钉住两条 URL 的路径形状。
## 现象
AtomCode 的 CodingPlan 用量窗口耗尽后,上游回的**不是 429**,而是一次
「正常答复」:`200` + 一条 SSE 内容帧(正文是写死的配额话术)+ `[DONE]`,
`finish_reason` 键都不存在(2026-10-18 在 dev 上复现,客户端侧 426 字节)。
坏处有两层:
1. 客户端拿到的「答案」是一句拒绝话术(上一条提交已补收尾帧、不再卡客户端);
2. 我们把它记成**一次成功** ⇒ 账号**不冷却、不换家**,而它现在是第一顺位
⇒ 每一发都先打它、每一发都拿拒绝,**循环整个 5h 窗口**。
## 改法
给适配器加一条与 `stream_refusal_finishes` 并列的钩子 `stream_refusal_markers`
(**正文**拒绝标记,逐字子串),并把它接进既有的流内拒绝门控:
- `core/providers/adapter.rs`:新增 trait 方法,默认空 = 别家逐字节不变;
长注释写明它与 `finish_reason` 那条的**处置不同**(那条是内容策略 → 不罚账号;
这条是账号额度 → 必须罚账号)。
- `core/providers/atomcode/mod.rs`:声明实测那半句
「在当前 CodingPlan 用量窗口内已达上限」(模型名在「」里会变,从「在当前」起截)。
- `core/upstream/refusal.rs`:新增 `matched_refusal_marker`(预读窗口里找标记)。
判据方向与整条门控一致:宁可漏拦,不可误拦。
- `core/upstream/provider_loop.rs`:门控入口条件纳入标记;命中后按**配额**处置 ——
先 `rotate::mark_account_limited(..., 429, reset_at=None, message)`,冷却时长交给
既有的**文本兜底**去解析正文里的窗口重置时刻(拿不到就还是 10 分钟兜底),
再走原有的「顺延下一家」;给客户端的话也分成两类(内容型「换一家或改内容」
与配额型「等窗口重置」)。
## 验证
`cargo check --tests` 通过(exit=0)。端到端:dev 上再打同一发拒绝请求,
预期**不再**返回那句话术,而是换到别的家或给出明确的配额错误;账号页应出现
该账号对 `glm-5.3-flash` 的限流记录(恢复时刻取正文里的窗口重置时间)。
这几家(trae / accio / codearts / autoclaw-intl / lobsterai)的回调是「浏览器 带你回到本机端口」。原实现把 `waitForManualCallback` 直接放进 `Promise.race`, 弹框几乎与授权页同时出现 —— 用户自然会去粘贴,而自动那条往往几秒就完成了。 改成先给自动路径 10 秒窗口:窗口内完成就直接结束、不弹框;超时仍未完成才弹 兜底框(浏览器与网关不同机且没有端口映射时仍能救)。顺带把框里那句说明改成 「授权完成后账号没有自动出现,再粘」的口吻,跟它的兜底身份对齐。 这是让「面板经回环地址访问」(桌面端、或远程机器上做了端口映射)的路径真正 无需人工干预 —— 底层的回调路由本来就通(实测经端口映射打 /oauth/callback 回的是网关自己的页面),卡人的只是这个弹框时机。
改的是 i18n-src 与 ui-islands/src(AtomCode 的界面登记与词典), 产物必须与源码同源 —— CI 的 frontend-artifacts 判「重建后逐字节相同」。
后端 `submit_login_callback` 缺 `LobsterAi` 分支:粘贴进来的 URL 会落到函数末尾 那句「该登录任务不接收授权码回调」,能用的功能变成 400。现按标准 code/state 查询串解析(与 Accio / Antigravity 同形)并复用 `/auth/callback` 的收尾。 前端 `waitForManualCallback` 的称号链与 `needsManualCallback` 白名单对不上: lobsterai 落到 AutoClaw、autoclaw-intl 顶着国内版名字。补齐两支,兜底改用 provider id 本身 —— 宁可不那么好看,也不要给一家安上别家的名字。 两处同属一条路径:声明了要粘贴,收尾就必须有落点。
1. 配额型拒答(本账号额度用完)改回 **429**,并在算得出恢复时刻时挂 `Retry-After`; 内容型仍是 502 —— 换一家也会被拦,回 429 等于让客户端按退避重试同一份内容 (与 Trae 的 `SoftRate | PlanLimit → 429` 同一口径)。`GatewayError` 新增 `retry_after_secs` 与 `with_retry_after_seconds`,`into_response` 与 `payload_response` 合并到同一个响应构造点(免得两条路只改了一条)。 2. 恢复时刻的解析补上「当日 / 今日 HH:MM」这一形:AtomCode 的配额文案就是这个形态 (没有日期、没有秒、也不带 `UTC+8`),先前解析出 0 ⇒ 账号冷却落到 10 分钟兜底, 而不是它自己说的窗口重置点。现在从上游正文里读出来,冷却与 `Retry-After` 是同一个数;算不出就都不给(不编造等待时长),已经过去的时刻不采纳。 3. 客户端 body 里也写明「额度预计在 X 重置」,只读 body 的客户端同样知道等多久。 测试 748 passed / 0 failed / 11 ignored(改动前 742 ⇒ 净增 6 条:解析器的 4 条形态 加两种拒答形态各 1 条)。
改的是 i18n-src 与 ui-islands/src(LobsterAI 的界面登记与词典), 产物必须与源码同源 —— CI 的 frontend-artifacts 判「重建后逐字节相同」。
…cope-intl` 国际版),无状态 OpenAI 兼容转发。一枚 `ms-` 令牌两用:Bearer 调推理、Cookie 值读网页站(身份 / 魔粒 / 签到),所以只有**一个**凭证字段;令牌不透明(不是 JWT),添加账号时出网探活换上游稳定身份(`HavanaId`)做账号 id,否则同一账号换一次令牌就变成两条记录。两个站点是**两套账号体系**(国内令牌打国际站网页接口得 `401 access forbidden`),所以地区做成 provider 身份而不是账号上的字段;拆家还顺带解决「两站模型目录互相覆盖」(各 36 条、内容不同,缓存与刷新排期各占一格)
2. 新增:ModelScope 每日签到 —— 上游**没有独立签到接口**:调一次登录信息接口(`GET {网页站}/api/v1/users/login/info`)本身就触发当日魔粒签到(幂等),纳入自动签到框架(两个站点各打各的网页站)。链路依据是 CPA 的 `modelscope-ratelimit` 插件源码,本实现照同一条链路、把触发时机交给本项目框架
3. 新增:ModelScope 余额读数 —— 魔粒钱包(可用 / 冻结 / 总计)与今日已用调用数;后者是附加读数,取不到时只降级不把整条查询变失败
4. 新增:ModelScope 错误分类 —— 上游把「账号条件不满足」与「速率窗口撞上」都用 429/403 表达、只能靠文案区分而处置完全不同:魔粒耗尽(429 `insufficient balance`)与未验证邮箱(403 + 特征串)冷却到**下一个北京零点**(充值 / 完成验证后次日自动回来),其余 429 才是分钟级速率窗口;裸 401/403 仍归令牌失效(本家无续期,如实报「请重新粘贴」)。判据来自 CPA 插件 `apply.go` 的线上实测口径
5. 修复:流式请求注入 `stream_options.include_usage` —— 上游的流式响应是**非标准形态**(每个 chunk 都带 `usage` 对象且**值全零**),真值只在末尾那个 `choices: []` 的 usage-only 块里,而**那一块只在请求显式带上这个开关时才发**。不注入时:本网关恒以流式请求上游、非流式由聚合器折成完整响应,聚合到的最后一个 usage 就是那串全零 ⇒ **非流式请求的 usage 恒为 0**(内容完全正常,故障只在统计上可见、极难排查)。与 CodeArts 的既有处置一致:总是请求 usage
6. 优化:全部候选账号均限额时,错误文案带上**最早的恢复时刻**(`(所有候选账号对模型 X 均已限额或禁用,最早 2026/10/17 00:00:00 恢复)`)—— 此前客户端只能立刻重试、再撞一次同样的墙,带上之后才能做合法的退避等待。取最早而不是最晚(账号是逐个恢复的,取最晚会让它多睡一段本不必睡的时间);只改文案、不动选路逻辑,取不到时逐字退回原句
7. 优化:给 OrcaTerm 的 6 条中文文案补上英文译文(上游 v3.0.7 新增这些文案但没跑 i18n 扫描,`scan.mjs` 时被扫出空值)
(cherry picked from commit 0b176ea)
…含 Google Antigravity 与腾讯 OrcaTerm 官方客户端的公开凭证(非本仓库机密,改写即断对应登录链路),避免告警反复出现与推送拦截
2. 新增:手机端 —— 响应式 Web / PWA 与 Android APK,与桌面端共用 ui-kit 3. 新增:AI 助手对话会话(schema v16)—— 会话可翻阅、可命名、可删除 4. 新增:猫猫旅行定时排程 —— 每日按北京时间整点自动派出与领奖 5. 新增:连登管家 —— 签到末尾自动补签、兑换档位、抽完抽奖次数 6. 新增:底部抽屉组件,移动端二级动作统一走它 7. 更新:安装文档六语补「手机端」一节(PWA / APK 两种形态) 8. 更新:README 与赞助页补 Telegram / Discord 群,QQ 群改为优先加群 2 9. 更新:前端产物校验纳入手机端,ui/m/** 一并逐字节比对 10. 优化:面板未登录的 401 不再记 error,首屏并发探测不再刷屏 11. 优化:图标脚本抽出 rasterize(),支持多尺寸与 maskable 图标 12. 修复:APK 签名密钥与密码移出仓库,改从本地 keystore.properties 读 13. 修复:升级时「安装前卸载」找不到旧安装目录,不再报「无法卸载」 14. 版本:3.0.9-beta.1 → 3.1.0
…clean 新增:ModelScope(魔搭)渠道(国内版 / 国际版两家 provider)
feat(atomcode):接入 AtomCode(AtomGit / GitCode)—— OpenAI 同方言直通转发 + 滚动次数额度 + 轮换续期
feat(lobsterai):接入网易有道「有道龙虾」LobsterAI(OpenAI 原生直通转发 + 本机 loopback 网页登录 + 每日活动签到)
优化:访客判据只认确凿证据(记录 isGuest / JWT 声明),只粘登录令牌的账号不再被误判踢出签到清单 更新:账号页「限流」列改为弹层明细 —— 逐行列出限流中的模型、还要等多久、恢复时刻与原因,可单条 / 全部清除,表格行高不再忽高忽低 优化:账号页与「网络代理」页共用同一份代理池缓存,禁用节点 / 删订阅后下拉即时刷新,禁用条目置灰不可选 优化:轮询多选支持禁用项置灰(后端取用本就会跳过,列出能选等于让用户白挑) 优化:更新面板检查失败时保留上次成功的版本号与更新日志,标注「来自上次成功检查」,不再整块清空连旧版本都看不到 修复:账号迁移凭证判据改为按凭证键表检查 —— OfficeAce 等用 modelAppKey 的账号不再「导得出去、导不回来」 更新:发版流程接入 Android APK —— CI 新增 android job,Release 挂 APK 与 .sha256,发版文档补第六处版本号与签名密钥配置 优化:删除 Node 版遗留的积分 / 新手任务服务文件,忽略 curl 调试残留文件 更新:五语言 i18n 同步(限流明细、更新面板新文案)
2. 修复部分多语言界面文案显示不准确的问题
2. 优化:恢复时取消文件选择改为静默提示「已取消恢复」,不再误报为失败 3. 优化:统一整库备份 / 恢复在不受支持环境下的提示文案
- swBuildStamp 在哈希与落盘前统一 CRLF→LF,版本号只由内容决定, 不再随检出环境(本机 autocrlf / CI Linux)变化 - 新增 .githooks/pre-commit:本次提交动了前端源码时自动重建三份入库 产物并一并暂存,把「忘了构建」拦在本地,而不是等 CI 报错 - 根 package.json 加 prepare,npm install 时自动启用钩子 - 补回上两次提交漏跑 scan 的三条 settings 译文(源词此前缺键, 重建会把 HEAD 产物里已有的译文丢掉)
1. 账号分组设置弹窗:分组带新增齿轮入口,可配置组内排序规则。 2. 分组排序规则:按积分到期时间或账号添加时间排序,方向可切换,默认关闭。 3. 分组带整条可点击展开 / 收起,按钮与拖动把手除外。 4. 账号合计支持按当前筛选或整组统计。 5. 助手设置移至助手页右上角,可配置默认模型、思考等级与系统提示词。 6. 助手配置变更执行前确认并展示改动,跳过确认时不扩大工具权限。 7. 助手输入框支持粘贴图片,支持 Enter 发送、Shift+Enter 换行。 8. 机器人校验可按桌面端 / 网页端、按提供商分别开关。 9. Antigravity 登录支持粘贴回调地址完成授权。 10. 支持在新标签页完成账号授权,成功后自动加入列表。 11. 网页端支持整库备份与恢复,文件通过浏览器下载 / 上传。 12. 接入 AtomCode:直通转发 + 次数额度 + 轮换续期,支持轮询网页登录与每日领取。 13. 接入 LobsterAI:直通转发 + 网页登录 + 每日签到。 14. 接入 ModelScope 国内版 / 国际版:单一令牌兼作推理与网页站身份,含签到与余额读数。 优化: 15. 限流列改为弹层明细,可查看模型、等待时长与恢复时刻,支持逐条清除。 16. 账号页与网络代理页共用代理池缓存,禁用条目置灰不可选。 17. 账号并发上限支持填 0 使用服务商默认值。 18. 网关地址支持 http/https 前缀,缺端口时按协议自动补全。 19. 记录列表支持下拉刷新,并可继续加载更早记录。 20. 网页登录的「粘贴回调地址」改为兜底入口,不再默认弹出。 21. 更新面板检查失败时保留上次成功的版本与日志。 22. 多语言文案补全并修正多处翻译不准确。 修复: 23. 修复整组拖动时没有落点提示线。 24. 修复登录过期后多标签页操作偶发退出登录。 25. 修复修改密码后其他设备登录未失效。 26. 修复节点监听端口未按账号引用范围分配。 27. 修复配额拒答返回 502 而非 429 + Retry-After。 28. 修复 AtomCode 配额耗尽被当成正常答复。 29. 修复 AtomCode 读不到额度时误判余额为 0。 30. 修复 LobsterAI 签到 404 与请求缺少 Content-Type。 31. 修复账号迁移时凭证判据不全导致导入失败。 32. 修复 sw.js 版本号漂移导致产物校验失败。 移除: 33. 移除智谱清言访客账号的每日签到。 版本:3.1.0 → 3.2.0-beta.1
…issing script "build:apk";改为 `cd ..`
Add account-group storage, routing, failover, HTTP APIs, key binding, UI controls, migrations, tests, and translations for the 3.2.0-beta.1 codebase.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
功能说明
1. 账号组管理
账号组用于把多个 Provider 或单个账号组织成一个独立的账号池。
2. API Key 绑定账号组
3. 请求转发和失败切换
4. 模型目录和模型选择
5. 账号组管理 API
提供账号组的管理接口:
删除仍被 API Key 使用的账号组时,系统会拒绝删除,并返回引用该账号组的 Key 信息。
同时提供对应的桌面端 bridge 方法和 Web shim 方法,供前端界面调用。
6. 前端界面
7. 默认行为
🤖 Generated with Codex