Repository navigation
fix(pi): 解压后校验共享 GPT 请求的模型授权 - #7821
Conversation
Signed-off-by: zqchris <chrisz83@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
[Medium impact] The change is limited to model authorization for shared Pi subscription requests. 合并前需要修复读取 ChatGPT 凭证期间关闭 Fast 仍会发送优先请求的问题。 Findings
Fix with agent prompt### Issue 1
apps/desktop/src/main/maker-host/anthropic-responses-bridge-host.ts:850-851
将 `getChatgptAuth()` 移到请求改写之后,会漏掉读取凭证期间的 Fast 撤权。例如,请求带有 `service_tier: 'priority'`,账号刷新尚未完成时供应商或组关闭 Fast;此时 `outboundBody` 已生成,后面的 `modelAllowed()` 只检查模型权限,仍会发送优先请求,产生本应禁止的额外费用。此前 Fast 检查在读取凭证之后执行。
请在凭证读取和最终模型授权完成后重新检查 Fast,并在需要时重新生成请求体;补充读取凭证期间关闭 Fast 的回归测试。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
|
Signed-off-by: zqchris <chrisz83@gmail.com>
xd-bobo
left a comment
There was a problem hiding this comment.
Approved by compliance check: CI passed and no blocking reviews.
PR #7821 独立审查报告(heavy 档)
Findings
Rule coverage — 读取的规则文件及逐项结论
审查要点核对(共享符号/调用方/错误路径/权限边界):
Verification — 实际运行的命令、结果、未执行项及原因
未执行:Windows 实机与完整 GUI 验证(PR「未执行的验证」已如实注明);完整单测由 CI(client-ci)覆盖。 Intent alignment
Overallpass —— 没有 P0/P1。 |
这次改了什么
摘要
远程或分享使用 Pi + ChatGPT 订阅时,Pi 原生适配器发送 zstd JSON,通用代理此时只能提供
parsedBody = undefined。模型授权检查把尚未解压的请求当成空模型,导致已授权请求返回model '' is not available from the provider shared with you或This model is not available for this remote task.;同账号供应商组内远程执行也受影响。对已认证的原生 ChatGPT zstd 请求,改由原生 handler 解压后核对目录里的精确模型及实时授权,再取得上游凭证;鉴权后复查模型与 Fast 权限,再生成最终请求体;若重新压缩发生异步等待,发送前继续复查,关闭 Fast 时强制使用普通速度。保留原始窗口型号作授权依据,未知、空模型、未授权型号和在途撤回仍拒绝。本机普通请求保留既有行为。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
不涉及。
怎么验证的
自动验证
claudeProxyGuestRoute.test.ts+piNativeSubscriptionForwarding.test.ts,99 项通过,8.05 秒;最初新增的 6 项回归在修复前均失败。pnpm --dir apps/desktop exec vitest run src/main/maker-host/__tests__/piNativeSubscriptionForwarding.test.ts --maxWorkers=1,73 项通过,7.43 秒。新增的凭证读取 / 最终授权检查 × 明文 / zstd 共 4 项先在旧代码复现仍发送priority,修复后均改为default;既有字节保留、编码次数、改写期间 Fast 收紧和 owner 边界回归继续通过。pnpm --dir apps/desktop exec vitest run src/main/maker-host/__tests__/piSharedSubscription.e2e.test.ts --maxWorkers=1:真实 Pi 1.0.2 + 真实回环代理,guest / owner 2 项通过;本轮重新实跑为 7.15 秒。临时还原生产代码后,两项精确复现上述错误;恢复修复后均通过。pnpm check:test-hygiene、git diff --check、pnpm check:dco:通过。测试价值与 tier:
claudeProxyGuestRoute.test.ts(unit,单独运行 3.70 秒):真实路由 transform 入口,最小输入是已认证、已授权的 Pi zstd 请求及未解析的 body。补齐此前只用明文 JSON 的路由覆盖,断言能进入原生解码 handler;原有拒绝错误令牌、跨供应商及不透明请求的断言保留。piNativeSubscriptionForwarding.test.ts(unit,本轮单独运行 7.43 秒):真实原生 handler 入口,guest / owner × 明文 / zstd,检查精确授权、独立[1m]、未知/空模型、撤回与鉴权期间释放绑定,拒绝时不发上游请求。旧计量测试补齐真实目录成员,保留流与计量断言。新增异步鉴权和最终授权期间关闭 Fast 的最小竞态输入,断言实际出站字节降为普通速度且不重复解码。文件收集需约 5–6 秒(已有宿主模块依赖),用例本身约 1 秒,不新增逐用例模块重载或真实等待。piSharedSubscription.e2e.test.ts(e2e,本轮单独运行 7.15 秒,其中用例 0.86 秒):真实 Pi 原生客户端 → 真实代理解析 → 生产路由 transform → 生产 native handler;仅账号状态与云端响应使用 fixture。修复前的最小失败输入是一个已授权 ChatGPT 模型的原生压缩请求。验证收到回复、原始 zstd 编码与 wire ID,并验证撤回后上游调用数不再增加。复用现有 maker-host E2E tier,缺少受管 Pi 时按该 tier 约定跳过;本机实际执行两项。手工验证
macOS arm64,受管 Pi 1.0.2。实际启动独立 Pi 进程,走真实回环 HTTP 代理与生产授权路径;同账号远程和受邀者两条路径均收到模拟上游的回复,撤权后的下一次原生调用被拒绝。临时目录、子进程、代理和测试绑定均已清理。未读取真实供应商凭证、未访问云端推理接口。
未执行的验证
完整 Desktop GUI、原远程机器升级后的复验、真实 OpenAI 云端推理、Windows 实机和全包类型检查未执行;当前核心验证覆盖实际 Pi 到生产代理的故障路径,完整测试交 CI。上游返回“只允许官方 Codex 客户端”的 422 属另一个账号准入问题,本 PR 不宣称解决。
风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)