Repository navigation
fix(responses): warn when stripping previous_response_id without rebuilding referenced history (#1954) - #1976
Conversation
1f2e4bc to
5d2299a
Compare
📦 Built Package ArtifactBranch: Option A — Install this exact build (recommended)npm install -g billion-context@0.0.1993-pr.1976.fcb8433This exact version is immutable and reproducible. The rolling Option B — Download artifact
tar xzf billion-context-pr1976.tgz
npm install -g packageInstall instructions are refreshed on each push. |
Review 完成。结论:可合并(等剩余 CI test matrix 跑绿即可,预期无虞)。 审核过程① 方向关(过):PR 与 owner 在 #1954 的拍板逐条吻合——approach A 只做可见性、不改转发字节、不修根因(chaining 归 #1973);warn 只判 id 非空不看 ② 回归审查(逐项过):
③ 代码审查:新 helper ④ 测试有效性(真测试,有牙):helper 边界值全覆盖;loop adapter 断言「恰好一条点名 id 的 warn」/「KEEP=1 保留且零 warn」/「缺省 no-op」;HTTP e2e 用真 ⑤ diff 整洁度(干净):6 文件 +306/-4,全部与本 PR 目的直接相关(2 个 strip 点 + helper + 测试 + CLIENTS.md/TECHNICAL-NOTES.md 文档),无无关改动、无空白噪音。文档内容与代码事实一致。 结构化七问
CI 状态旧 base 全绿;rebase 后新 head(5d2299a2)重跑中——build-artifact、e2e、codex/dsh/pi/opencode 各 lane、registry e2e (ubuntu)、image-billing、version-guard 已绿,剩标准 test matrix(ubuntu/windows node 22/24)与 registry windows 在跑。 判定:可合并。 方向、代码、测试、diff、文档全部核验通过,唯一的实际问题(stale base 冲突)已在 review 中修复。@ranxianglei 待剩余 CI 项转绿后可自行合并。 |
补充:rebase 后的新 head(5d2299a2)CI 已全部跑完,15/15 checks 全绿(含 ubuntu/windows node 22/24 test matrix、registry e2e 双平台、codex/dsh/pi/opencode 各 lane、build-artifact)。PR 现处于可合并状态,@ranxianglei 可直接合并。 |
范围(Scope)
本 PR 为 #1954 落地 approach A —— 可见性改进,不修复 #1954。
#1954 的根因(bili 的 Responses adapter 是无状态重放压缩器,无法物化
previous_response_id引用的历史)仍然存在;完整 chaining 支持另立 feature #1973。本 PR 只让「丢历史 + 仍返回 200」这件事不再静默。行为(Behavior)
当删除一个非空
previous_response_id时,两条路径现在各打一条warn:src/server.tsprepareResponsessrc/loop/adapter-responses.tsbuildRequest告警条件只判断 id 本身是否非空,不判断显式
store:true—— 因为 Responses 默认存储响应,省略store时上游仍能按 id 解析被引用响应;仅看store会漏掉最常见情形。转发字节不变:仍然删除 id、仍然转发、仍然返回 200。delta(增量)续接请求依旧会丢失其引用历史——本 PR 只是让这次丢失不再静默。
Config surface
无新增配置。
ACP_KEEP_RESPONSE_ID为既有变量,语义未变(=1时保留 id 且不告警)。行为变更披露(Behavior-change disclosure)
无既有可观察行为变化。唯一新增是一条
warn日志行(此前该场景完全静默)。未改阈值 / 默认值 / 时序 / 输出格式 / wire shape。测试
新增
tests/responses-previous-response-id.test.ts:strippedResponseIdWarning):非空 id 触发、缺省 / 空 / 非字符串静默;startServer+ mock upstream):delta 续接(req1 seed + req2 带previous_response_id、省略store)→ 链引用被剥离、turn-1 secret 未被重建、恰好一条 [Bug][Responses HTTP] 删除 previous_response_id 时未重建增量请求历史,导致上下文静默丢失 #1954 warn;KEEP=1 → 保留 id 且静默。typecheck + 定向测试(responses-previous-response-id + loop-adapters)全绿,build 通过。
两个过渡方案(评估,未实现,交由维护者决策)
previous_response_id,在会话更新 / 历史重写前拒绝这类请求。优点是不用猜 payload 是否为 delta;但会改变「full replay + id」这类当前已正确处理情形的兼容行为,需维护者明确选择并给迁移方式;错误信息应要求客户端重发完整 input/output 历史(而非仅去 id 重发原 delta)。属安全边界,非 chaining 支持。两者都属行为变更 / 架构决策,建议并入 #1973 的设计讨论统一拍板。
关联:#1954(可见性,本 PR)、#1973(完整 chaining 支持)。