Skip to content

DIY 代码移植:qwen-web 插件包适配 v3.4.0 SDK 与其余 DIY 项逐项处置 - #3

Open
free6589 wants to merge 25 commits into
betafrom
diy/code-port
Open

free6589 wants to merge 25 commits into
betafrom
diy/code-port

Conversation

@free6589

@free6589 free6589 commented Nov 7, 2026

Copy link
Copy Markdown
Owner

背景

DIY 代码此前全部集中在 feat/omarchy-local-deploy(基于 v3.3.0-beta.6 的 11 个提交)。本分支把它移植到新版架构(基于 upstream/beta 尖端 2c55b92a,v3.4.2 + beta 增量),逐项按 A(保留)/ B(适配后保留)/ C(上游已实现,移除旧实现)/ D(保留在原分支)/ E(废弃) 处置,完整记录见 sync-reports/08-diy-code-port.md(工作区交付物,不入库)。

⚠️ 本分支基于上游 beta 尖端:相对 fork beta 的 diff = 17 个上游提交的同步 + 本任务 8 个移植提交。审核重点在 8 个移植提交(bd36938d..2c55b92a 部分与上游同步任务分支一致)。

8 个移植提交

提交 DIY 项 处置
feat(providers): qwen-web 扩展包适配 v3.4.0 插件 SDK contrib/web-extra(D-19)+ 静态表单退化(D-16) B + C
feat(session): 插件静态登录方式随 provider 摘要下发 loginMethods 生产端(D-13) B
fix(accounts): 凭证未换发但仍在有效期内时不再判为刷新失败 凭证刷新核验(D-11 = C,另取上游 PR aimod-cc#498 思路补误判) C + 补丁
feat(usage): 识别上游账号临时限制并推迟自动余额查询 usage_query 受限识别(D-18) B
fix(ui): 修正商汤日日新预置端点 preset URL(D-12) B
chore(deploy): docker-compose 参数化 compose 加固(D-07) B
ci(server): 增加后端单元测试工作流 server-tests.yml(D-08) B
chore: 忽略本地备份目录 backups/ .gitignore(D-06) A

关键说明

  • qwen-web 插件包:按 agent2api-provider-protocol/sdk tag v3.4.0 重写(与网关 server/Cargo.toml 钉的同一 tag),新增 admin_action("auth.methods") 动态登录表单、账号级代理解析(StoreProxy)、head 通道守卫;cargo check 零警告。未复制旧实现与上游代码之外的任何代码;第三方协议行为出处与修改声明见包内 NOTICE.md。旧包里继承自官方网页包但 qwen 用不到的模块(含 AutoClaw 移植的 crypto.rs)不再携带。
  • D-09/D-10(测试初始化修复)= C:上游 beta 已重构(api/pipeline/tests/recording.rs 用 ..Default::default()、send_with_retry 测试已按新签名改写、CodeArts 日池测试已删除),无需移植。
  • D-14(501 正则)/ D-15(DeepSeek 网页静态表单)= C:上游已有等价或更好实现(isMethodsUnavailable 状态码+文案双判、add-provider-deepseek.ts 独立模块)。
  • D-16(千问静态表单)不移植:插件已实现 auth.methods 动态表单,静态表单成为重复实现(同 D-15 逻辑)。
  • D-17(ui.js 产物重建)不适用:本分支不改 ui-islands 源码(D-13 是服务端字段,前端消费者已存在),前端产物保持上游状态、frontend-artifacts.yml 口径不受影响。
  • Omarchy 部署脚本/文档(D-01/D-02/D-03)另线处理;D-04/D-05(上游审计快照、README 指针)= E,原文保留在 feat/omarchy-local-deploy。
  • 许可证:LICENSE 与上游逐字节相同(blob be3f7b28);新增包带 NOTICE.md(Apache-2.0 出处声明 + 修改标注),未触碰真实数据库/凭证/用户配置。

验证

  • cargo test -p agent2api-server:320 passed / 0 failed / 11 ignored(含新增 2 个 usage_query 单测)。
    注:默认 $HOME 只读的环境下 5 个建临时账号库的测试会因密钥目录不可写而失败,设置 AGENT2API_PROXY_HOME 指向可写目录即可(仅本机执行环境问题,与代码无关)。
  • contrib/web-extra:cargo check --offline 通过(对 v3.4.0 SDK 编译即新旧接口兼容性证据);Cargo.lock 随包入库。
  • docker compose config:通过,默认值与上游一致(0.0.0.0:3065、root)。
  • 端到端转发 / 插件安装探测(需运行中的网关与真实账号):未执行(不触碰真实凭证)。

🤖 本条回复由 AI Agent 生成

Generated by an AI agent.

aimod-cc and others added 25 commits October 31, 2026 18:21
1. 插件安装与更新时,可等待在途请求完成,失败后自动恢复原状。
2. 网络请求增加备用地址与 DNS 解析,提升连接稳定性。
3. 签到状态记录与展示更准确。
4. 模型绑定冲突提示更明确。

修复BUG
1. 修复自定义提供商状态同步失败的问题。
2. 修复部分情况下模型绑定冲突未正确提示的问题。

更新
1. 新增账号设置页面,集中管理提供商连接、凭证、转发行为和出网代理。
2. 新增 DeepSeek 网页账号支持,可通过网页登录或粘贴令牌添加。
3. 模型管理支持思考等级绑定、能力配置、可见性标记和批量操作。
4. 新增全局路由参与范围设置,可选择自动参与或仅限指定提供商。
2. 新增:路由作用范围,支持全局、模型级与提供商级范围分别配置参与账号。
3. 新增:路由策略(顺序 / 轮换 / 提供商优先)与会话粘滞模式(自动 / 会话 / 每轮 / 关闭),可在范围内分别设定。
4. 优化:会话粘滞按模型分别计有效期,列表展示会话标识、活动与剩余时间。
5. 更新:路由接口返回作用范围、配置快照与会话标识,决策回放更完整。
6. 更新:补齐路由相关中英日韩葡繁五语文案;手机端路由页同步适配。
7. 修复:README 支持矩阵中 Raccoon 参考图编辑的描述缺失(已与中文一致)。
   1. 路由工作台:路由页重构为「工作台 / 执行 / 配置」三栏,按路径聚合会话,可按会话或账号搜索。
   2. 路由作用范围:支持全局、模型级与提供商级范围分别配置参与账号。
   3. 路由策略与会话粘滞:新增顺序 / 轮换 / 提供商优先策略,及自动 / 会话 / 每轮 / 关闭粘滞模式,可在范围内分别设定。
   4. 会话粘滞按模型分别计有效期,列表展示会话标识、活动与剩余时间。
   5. 路由接口返回作用范围、配置快照与会话标识,决策回放更完整。
2. 其他更新
   1. 补齐路由相关中英日韩葡繁五语文案。
   2. 手机端路由页同步适配(首页 / 更多 / 代理 / 请求页)。
   3. 修正 README 支持矩阵中 Raccoon 参考图编辑描述缺失。
   4. 网关依赖 reqwest 增加 system-proxy 特性。
2. 新增:路由页模型配置可一键「删除独立配置」,确认后直接回到继承全局,不必先切「继承」再保存。
3. 修复:豆包工作的生图请求被会话式分支截走,导致上游报「messages 必须包含消息」,与账号无关。
4. 更新:设置页左栏分类移除自带的旧选中样式,与主侧栏共用同一套导航外观。
5. 更新:补齐路由相关中英日韩葡繁五语文案,重建桌面前端产物。
…、触发阈值可在「设置 → 网关 → 图片压缩」调整,关掉即恢复原样。

2. 新增:DeepSeek(dsh)客户端接管 —— 按它自己的 settings.yaml 写自定义提供商,密钥单独存到 .credentials.yaml,改完刷新页面即生效。
3. 新增:Trae 模型 ID 收敛 —— 去掉网关照加上去的 -solo 后缀,存量配置(模型规则、路由、Key 白名单、助手、会话、限额、目录缓存)一次性迁移;旧请求名仍然可用。
4. 新增:路由工作台新增「模型」筛选 —— 模型下拉只列当前时间窗内真的发过请求的模型,选中后不再只剩它自己。
5. 新增:路由页模型配置可一键「删除独立配置」,确认后直接回到继承全局,不必先切「继承」再保存。
6. 优化:插件安装 / 卸载 / 启停可等待在途请求完成,失败自动恢复原状。
7. 优化:上游请求增加备用入口与 DNS 解析容错,只作用于可信 HTTPS 来源,不改变账号选择与代理出口。
8. 优化:更新检查补上「有新版本但没有本机安装包」的诊断 —— 说明这一版实际传了哪些文件、本机要什么后缀。
9. 优化:更新页支持说明文案更贴近实际情况,赞助弹窗措辞重写。
10. 优化:账号存储增加快照缓存与变更版本号,减少重复读库。
11. 优化:选路与请求准备搬到阻塞线程池,减少长请求期间的调度抖动。
12. 优化:签到状态记录与展示更准确;模型绑定冲突提示更明确。
13. 修复:豆包工作的生图请求被会话式分支截走,导致上游报「messages 必须包含消息」,与账号无关。
14. 修复:自定义提供商状态同步失败的问题。
15. 修复:部分情况下模型绑定冲突未正确提示的问题。
16. 更新:设置页左栏分类移除自带的旧选中样式,与主侧栏共用同一套导航外观。
17. 更新:补齐路由、图片、更新相关中英日韩葡繁五语文案。
18. 更新:手机端模型页支持未挂载映射提示与清理,签到 / 计划 / 账号页同步桌面端改动。
19. 更新:发版规范对齐新的发布链路说明。
20. 版本:3.3.0-beta.6 → 3.4.0
…管理、提供商选择与连通性测试;视觉分析可绑定提供商、模型与思考等级;面板可把 Skill / MCP 配置安装或卸载到本机客户端,手机端同步工具页。

2. 新增:AI 助手支持文本附件与账号导入 —— 可在对话里上传 JSON / .info 文件,模型能读取附件并把凭证文件导入成账号,整库导出文件走批量导入。
3. 新增:Tabbit 国内版 / 国际版账号入口 —— 支持粘贴网页 Cookie / JWT,国内站支持手机号登录。
4. 新增:Kiro 提供商接入(由插件实现)—— 对话、工具、思考、图片输入、自动续期、在线模型目录与余额;支持网页登录、导入 kiro-cli / Kiro IDE 登录态和 API key。Kiro 已从停用名单移出,界面可见。
5. 新增:AStudio(讯飞星辰)提供商接入(由插件实现)—— 手机号验证码 / 账号密码登录(含极验滑块)与粘贴 modelBearerToken;余额、每日签到、OpenAI Responses 对话。
6. 优化:登录页拆成独立脚本,登录时不再下载整份主面板脚本;构建校验同步覆盖登录脚本。
7. 优化:管理面板启用 gzip 响应压缩,远程打开面板更快。
8. 优化:Kiro / AStudio 余额按额度窗口展示;无分组的长读数窗口改为紧凑行,和 Antigravity / OpenCode Go 的余额样式一致。
9. 优化:AStudio 登录方式收敛为两种,手机号 / 密码登录固定用应用内嵌窗口,不再让用户选择打开方式。
10. 优化:云同步 WebDAV / S3 支持自定义 User-Agent,兼容按 UA 校验客户端类型的服务。
11. 优化:模型映射允许中文等非 ASCII 名称(例如千问办公的「高级 / 标准」)。
12. 优化:日志与请求统计的保留期 / 容量裁剪改为批量执行,列表的三个计数合并为一次扫描,降低长期运行和频繁轮询的开销。
13. 优化:凭证刷新增加结果核验 —— 适配器报成功但凭据没有推进时明确报错;自动维护与手动刷新共用同一判据。
14. 优化:自定义提供商账号可清除单独保存的上游地址,改回跟随提供商;设置页按账号实际地址显示请求端点。
15. 优化:请求统计补充 Loomy 生图积分、Cline 费用等读数;生图响应顶层的积分消耗也计入报表。
16. 修复:提供商适配问题 —— CatPaw 工具参数 / Schema 深度放宽到 32;MonkeyCode 上下行按官方客户端封装并补齐审批;Raccoon 补齐桌面端身份头与请求 id;Accio 必带设备指纹;AutoClaw、WorkBuddy、ZCode、Kuku 的刷新与签到问题(详见插件日志)。
17. 更新:补齐工具页、账号、助手相关五语文案;重建桌面前端、登录脚本与手机端产物。
18. 版本:3.4.0 → 3.4.1
   1. 新增:路由组,跨提供商、跨模型组合成一个对外模型 ID,可配置参与成员、顺序与失败后备选。
   2. 新增:路由草稿预演,不发请求、不耗额度,展示候选、跳过原因与执行路径。
   3. 新增:压缩路由,识别 ZCode 上下文压缩请求时切换到指定模型,普通对话仍走原模型。
   4. 新增:客户端识别,按软件标识归类请求,支持内置规则、自定义规则与来源声明。
   5. 新增:服务端一键更新,Windows 服务与 systemd 由受限升级进程校验、替换并确认新版运行。
   6. 新增:MonkeyCode 提供商,桌面端官方页登录自动读取登录态,含滑块与短信验证。
   7. 新增:签到领取验证,ZCode 与豆包工作需人工验证时给出提示,回查确认避免重复领取。
   8. 优化:网页搜索聚合标准服务与已有账号能力,可绑定账号;工具执行增加超时上限。
   9. 优化:账号余额展示即将到期份额与倒计时,单位未知、仅比例的读数单独标注。

2. 其他更新
   1. 更新:六语文案补齐路由组、压缩路由、客户端识别、服务端更新与签到验证等条目。
   2. 更新:六份安装文档与打包脚本同步一键更新、旧安装接入及环境变量开关。
   3. 更新:重建桌面前端、手机端与 Service Worker 产物,刷新前端 i18n 资源。
   4. 新增:手机端 Android 支持选择 APK 更新来源。
   5. 更新:AGENTS.md 补充反代提供商问题的排查规范。
   6. 更新:网关依赖补齐系统代理、更新源与 GitHub 访问配置所需能力。
2. 优化:路由配置恢复“配置列表、当前配置、账号组”的三栏画布布局,默认打开路由配置;配置卡片垂直居中,外层内边距统一为 10px,精简创建弹窗和冗余说明。
3. 优化:模型筛选支持搜索,默认“全部”展示现有账号,选择具体模型后只展示对应账号组;移除配置卡片中的选路预演区域。
4. 优化:请求回放改为简洁列表与执行时间线,按请求当时的快照展示尝试、切换和跳过原因,区分响应到达与首帧时间。
5. 优化:全局默认直接管理账号启用与禁用,与账号页同步并即时生效;其他路由仍独立控制参与名单。旧版全局参与设置转换前列出受影响账号并要求确认。
6. 优化:恢复账号积分到期倒计时、到期近远排序快捷入口,以及整组和单账号设置按钮;消耗规则修改后同步刷新顺序,保留独立路由顺序和未保存的其他修改。
7. 新增:压缩路由,可为 ZCode 上下文压缩请求指定模型,普通对话仍使用原模型。
8. 新增:客户端识别,支持内置规则、自定义规则和来源声明,并在请求记录与报表中展示识别信息。
9. 新增:标准 Windows 服务与 systemd 部署支持面板一键更新,下载后独立校验、备份替换并确认新版启动;安装脚本兼容旧安装接入并保留已有配置。
10. 新增:MonkeyCode 国内版、国际版桌面内嵌网页登录,登录后自动读取凭证,保留用户手动完成页面验证的流程。
11. 优化:签到与领取补充人工验证提示和结果回查,减少重复领取,完善 ZCode 与豆包工作相关记录。
12. 优化:网页搜索可组合标准搜索服务与已有账号能力,支持账号绑定;工具执行增加超时限制。
13. 优化:账号余额展示即将到期份额和倒计时,单位未知、仅提供比例的读数单独标注;Android 手机端支持选择 APK 更新来源。
14. 移除:桌面端与手机端的 LobsterAI 新增账号入口,已有账号的显示与调用保持不变。
15. 更新:同步六语界面文案、六份安装文档及相关打包脚本,重建桌面前端、手机端与多语言资源。
16. 版本:3.4.1 → 3.4.2
- 设置页网关新增「第三方模型回答完自动折叠过程」开关,默认关闭
- 为 Codex 来源的 /v1/responses 响应补 phase 阶段标记,回答完折叠推理与命令过程
- 新增 GET/PUT /api/reasoning-collapse 管理接口,桌面桥与网页桥同步接线
- 流式、非流式聚合与上游完整响应三条回程共用同一阶段判据
- 输出预算用尽与内容过滤的截断响应不补阶段标记,避免半截答案被当作收尾
- 客户端归类值提取为常量,阶段标记判据与请求日志客户端列同源
- 调试报文限量保留、正文合计与单条体积设上限,超限淘汰最旧记录
- 大请求及时释放原始字节,避免解析与转发期间长期保留多份正文
- 请求终态与限额事件在同一事务内提交,在途状态最多每秒写入一次
- 日志每 64 条、请求统计每 128 次记账或每 60 秒批量维护
- 日志查询与统计加缓存,请求总数用内存缓存,无筛选不再全表计数
- SQLite 检查点阈值提高到 10000 页,新库启用增量回收
- 图片逐张压缩,避免一次性复制全部图片地址
- 调试关闭时清理历史快照并停止详细日志,同类余额查询失败 15 分钟内去重
- 更新检查复用成功结果,减少重复网络请求
   1. 新增:QuWork 接入网关,支持导入本机登录态或粘贴凭证 JSON,区分模型凭证与账号凭证。
   2. 新增:编程会话,连接自有 HAPI 后台,在面板与手机端使用电脑上的 Codex、Claude Code。
   3. 新增:图片兼容,模型不识图时可辅助识图或切换视觉模型,支持按模型配置与备选顺序。
   4. 新增:工具服务生图,复用已有账号经 MCP / Skills 生成或编辑图片,任务编号可回查。
   5. 新增:自动维护,定期刷新临期凭证与更新模型目录,自动和手动共用逐项结果记录。
   6. 新增:活动福利与权益,支持限时活动、权益兑换、月度赠送查询及果办免费套餐开通。
   7. 新增:客户端接入配置可搜索多选模型,自动填入能力,写入前预览改动并备份。
   8. 优化:统计报表重做,新增用量趋势、分布排名、缓存命中率与活跃热力图。
   9. 优化:代理不可用时明确失败且不改走直连,删除代理前列出受影响账号。
   10. 优化:云同步按实质变化自动上传,可设最小间隔,失败退避重试并保留本机改动。

2. 其他更新
   1. 新增:页面自动刷新间隔、阅读模式与未挂载映射批量删除。
   2. 优化:签到与领取结果待确认时只回查不重复提交,人工验证提示更明确。
   3. 优化:搜索、视觉与生图共用网关配置,MCP 安装仍在桌面端完成。
   4. 更新:六语文案补齐上述功能,重建桌面前端、手机端与多语言资源。
   5. 更新:手机端同步生图、编程会话、自动维护与自动刷新页面。
1. AI 客户端接入新增 DSH 支持,可选择网页版、桌面版、旧版共享设置或全局覆盖作为配置目标
2. 账号列表新增批量刷新 Token,可逐个刷新所选账号的凭证
3. 补充多语言界面文案
1. 优化插件页操作入口与诊断信息,集中提供检查更新、刷新、设置、从文件安装、从 npm/GitHub 安装与诊断。
2. 优化更新页对各 GitHub 下载线路的展示,显示限流等待、上次结果与可重试状态。
3. 优化签到中心活动与体验套餐布局,减少重复说明,一屏可查看更多账号。
4. 优化图片兼容设置说明,将通用说明与各模型配置分开呈现。
5. 优化本机 Codex 会话发送体验,结果不确定时不会自动重复执行。
6. 优化脚本插件更新体验,更新前等待在途任务结束,失败时恢复原插件。
7. 优化工具调用兼容性,减少自定义工具或历史记录导致的请求失败。

### 修复BUG
1. 修复更新检查遇到 GitHub 限流时提示不完整的问题,现在会显示等待时间并提示可切换其他线路。
2. 修复部分客户端在对话中调用工具时可能失败的问题。
3. 修复关闭应用后本机 Codex 后台进程可能残留的问题。
4. 修复脚本插件升级失败后可能丢失原插件的问题。

### 更新
1. 对话页新增本机 Codex 支持,可在电脑与手机间继续会话、审批操作并共享官方终端。
2. 插件页支持从 npm、GitHub、Magpie 社区安装与管理脚本插件,提供启停、提供商管理、签到授权、更新与卸载。
3. 新增 MiniMax Code、DeepAI Code、Cloudflare Workers AI、Codar、JoyCode、Agnes Code、River、WPS 灵犀等社区插件入口。
4. 添加账号支持社区插件声明的动态登录方式,包括内嵌窗口登录、设备码/回调提交与本机客户端导入。
5. 图片兼容设置改为按模型名单配置辅助识图或切换视觉模型,支持备选模型、当前路由内优先与统一思考等级。
6. 签到中心活动福利支持按账号查看领取状态,并提供全部、未领取、已领取筛选与批量查询。
7. 路由工作台增强请求回放,展示耗时分段、候选账号、尝试结果、最终承载及当时与当前配置对比。
8. Agent 接管页完善 Claude Code、Codex、Kimi Code 等客户端的模型菜单、上下文、图片与思考等级配置。
9. 账号页额度展示补充剩余天数/小时/分钟、窗口额度与时间、额度详情和数据来源说明。

### 移除
移除侧边栏中的「AI 助手」旧名称,统一使用「对话」。
仅采纳原始请求提前释放、图片逐张处理、调试开关轻量读取、终态与限额同事务提交,以及在途状态限频写入。

补齐异常收尾:直接保存最后实时快照与中断终态,保留首次错误和手动终止原因,迟到状态不覆盖终态。限额维持请求 ID 幂等,统计失败时保留独立台账降级路径。

保持调试正文采集、历史保留上限、批量维护节拍、更新缓存和 SQLite 参数不变。

Co-authored-by: Lucas <57995614+aimod-cc@users.noreply.github.com>
保留原贡献者提交,适配当前 beta。统一正常结束与截断判据,空工具列表按未调用工具处理;阶段兼容仅使用严格客户端识别,不跟随报表规则。补充错误、缺少结束信号和未知结束原因的阶段保护,重新构建设置页和多语言资源。
统一桌面与手机端的模型查询,支持提供商名称、能力来源与自定义模型;恢复 LobsterAI 新增入口,同步前端产物与 Trae 完整性检查说明。
- contrib/web-extra 按 agent2api-provider-protocol/sdk tag v3.4.0 重写:
  Provider trait 新形状(provider_id/admin_action/account 代理)、
  StoreProxy 账号级代理解析、head_sent 错误通道守卫。
- 新增 admin_action("auth.methods"):添加账号渲染正式动态表单
  (accessToken + 可选 Cookie),不再依赖「手动凭证 JSON」兜底。
- 只保留 qwen 用到的模块;旧包继承自官方网页包的 crypto/onboarding 等
  未使用模块不再携带(含 AutoClaw 移植的 safeStorage 解密,一并移出)。
- 新增 NOTICE.md(第三方来源与修改声明)、README.md(构建/打包/安装/
  添加账号/排错);LICENSE 仍为 AGPL-3.0,协议行为出处见 NOTICE。
- 验证:cargo check(v3.4.0 SDK,无警告);协议行为出处与 trait 对接
  见模块头注释。端到端转发需真实账号,未在本分支验证。
- plugin_host::login_methods_of(provider):读握手时申报的
  ProviderInfo.login_methods(SDK with_login),没申报返回 None。
- providers::summary_json 两类条目(内置 id 与插件 runtime id)都带
  loginMethods 字段。
- 背景:动态登录方式走 admin_action("auth.methods"),但只申报静态清单
  的插件在 /api/session/login/methods 上如实回 501;界面 legacyMethods()
  读的是 meta.login_methods ?? meta.loginMethods —— 消费端一直在,缺的
  是这个生产端。补上后网页类插件至少能按申报字段渲染旧版表单。
refresh_checked 的空刷判据(aimod-cc#407)把「指纹没推进」一律记失败,于是
AutoClaw 这类「token 仍有效时刷新接口原样回同一份凭证」的正常情形被打成
红字、提示重新登录(见上游 PR aimod-cc#498)。按同一思路补丁:没写回时再问一次
credentials_expiring_async,不临期就视为无需刷新正常返回;只有确实临期/
已过期却没换发才报 502。复查在刷新之后做,判据是落盘现状不是调用前快照。
- query_usage_for 识别余额响应 raw.accountAccess(state != ACTIVE 且
  restrictedUntil 在未来):本次查询记 provider_restricted 失败,error
  用上游原文;界面不再把「可用 300 积分」当可用。
- write_row_record 把恢复时刻记入内存表;sweep_due 在窗口内跳过该账号,
  别让 60 秒一轮的自动查询把「临时限制」拖成永久停用(上游警告原文
  「勿反复异常使用」)。内存态:重启后最多多查一次,不给记录表加列。
- 附 2 个单测(识别与 ACTIVE/过期/缺失三分支)。
- 背景:LobsterAI 实测该形态(反编译证据原文保留在 feat 分支
  docs/LOBSTERAI_RESTRICTION.md,不随本分支分发)。
预置卡片的 OpenAI 兼容 base URL 从 api.sensenova.cn/compatible-mode/v1
改为 token.sensenova.cn/v1(对应上游 PR aimod-cc#305,至今未合并)。余额查询走
platform.sensenova.cn 控制面,与本 URL 无关。端点正确性未用真实凭证实测
(本分支不触碰真实账号)。
- 镜像名 / 容器名 / 绑定地址 / 宿主端口 / 运行用户全部可用 .env 覆盖:
  AGENT2API_IMAGE、AGENT2API_CONTAINER_NAME、AGENT2API_BIND_ADDRESS、
  AGENT2API_HOST_PORT、AGENT2API_UID/GID(均为 compose 层变量,网关不读)。
- 默认值保持上游行为:0.0.0.0:3065、root、image=agent2api:local;只绑回环
  的写法在文件头说明(AGENT2API_BIND_ADDRESS=127.0.0.1),不改默认暴露面。
- 新增 AGENT2API_PROXY_API_KEY 入口(网关 config/parse.rs 原生支持,
  无人值守部署预置第一把网关 Key)。
- user: 注释写明非 root 必须先 chown ./data、并关闭 SELF_UPDATE。
cargo test -p agent2api-server 跑 main/beta 的 push 与 pull_request +
手动触发;工具链与缓存口径照抄 build.yml(checkout@v7、rust-toolchain@stable、
rust-cache@v2 且 workspaces 逐字一致),触发方式照抄 frontend-artifacts.yml。
只测 server crate:后端全部测试都在这一个 crate,不为 0 个测试背 Tauri
系统库。上游至今没有任何工作流执行 cargo test(对应上游 PR aimod-cc#311,未合并)。
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-07T16:44:54.050866Z bafce3f PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bafce3f117

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

let record = ctx.store_get(ID, &req.account).await.map_err(|_| "千问网页账号不存在")?;
let token = record.secret["accessToken"].as_str().filter(|token| !token.is_empty()).ok_or("千问网页账号缺少访问令牌")?;
let cookie = record.secret["cookie"].as_str().unwrap_or("");
let client = client(req.proxy.as_ref(), &ctx.env.proxy)?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor per-account direct proxy overrides when forwarding

When a Qwen account is explicitly set to direct and the gateway has a non-empty ctx.env.proxy, req.proxy is None, so this call selects the gateway proxy and ignores the account’s direct override. Resolve the client from the stored account proxy or preserve the override flag so that account traffic does not silently use the global proxy.

Useful? React with 👍 / 👎.

Comment on lines +256 to +257
if frame.get("code").and_then(Value::as_str) == Some("RateLimited") {
return Err("千问网页版今日配额已耗尽(RateLimited)".into());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve quota classification for in-band rate-limit frames

When Qwen emits RateLimited in an HTTP-200 SSE frame, this returns a plain error after the stream head has been sent. The plugin classifies HTTP 429 responses, but this stream error reaches the stateful provider loop as a generic 502/Fatal, so it is not recorded as quota cooldown; subsequent requests can hit the exhausted account again before trying others. Preserve the quota classification for this in-band error. .agents/skills/provider-adaptation/SKILL.mdL145-L147

Useful? React with 👍 / 👎.

impl Provider for QwenProvider {
fn meta(&self) -> ProviderMeta {
ProviderMeta::new(ID, "通义千问 网页")
.with_capabilities(proto::Capabilities { chat: true, stateful: true, ..Default::default() })

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enable model refresh for the Qwen provider

The host gates catalog refresh on capabilities.model_refresh; leaving it at its default false makes catalog_refresh skip Qwen as a fixed-list provider, so this new models() handler never fetches /api/models and users only get the three fallback entries despite the package README promising an online list. Set the model-refresh capability so manual and scheduled refreshes can reach the handler. .agents/skills/provider-adaptation/SKILL.mdL111-L115

Useful? React with 👍 / 👎.

if expires_after <= expires_before && updated_after <= updated_before {
// 复查必须在 `refresh_access_token` **之后**做:判断依据是刷新结果
// 落在记录上的现状,不是调用前的快照。
if !adapter.credentials_expiring_async(store, id).await {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Distinguish expiry-check failures from a confirmed valid credential

When a refresh returns Ok without advancing either credential stamp and the follow-up TOKEN_EXPIRING RPC fails or returns a non-boolean value, RpcAdapter::credentials_expiring_async collapses that indeterminate result to false, so this branch reports success even if the token is still expired. Keep RPC failure distinct from a confirmed non-expiring result before treating an unchanged credential as a successful refresh. .agents/skills/provider-adaptation/SKILL.mdL115-L115

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants