You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
side request(max_tokens<=200)绕过 preflight 且不检查载荷体积,携带全量历史直转上游导致 400 #554
溢出 400 接入 learned 通道:新增 exceed[_ ]context[_ ]size 模式;parseOverflowWindow 识别 (A / B > C) 形式并以 C 为窗口(本 issue 示例可提取出 150,528);forward() 兜底估算在 processedMessages 为空时(side 路径)改用 raw body 估算。这样即使估算偏低漏过一次 400,下一次也会被本地拦截。
Activity
ranxianglei commentedon Sep 5, 2026
Triage 完成:问题已核实(全部在代码中确认)、无重复条目,开始实现。
查重:无重复项。相关条目已逐条比对:#388/#398(引入侧请求透传隔离——本 gap 的源头)、#546/#548(修的是反方向误判「主请求被降级为 side」)、#551 相关观察 1(本 issue 即该观察的独立拆分)、#553(fork 会话估算,机制不同)。均为不同问题,#554 保持打开。
核实结论:
透传确实无任何载荷体积检查。
isSideRequest(src/server.ts:626-632)只看输出预算(max_tokens|max_completion_tokens|max_output_tokens∈ (0,200] 且无 tools);side gate(src/server.ts:1346-1360)把bodyBuffer原样转发,且按设计跳过 preflight(标题生成等侧请求污染主会话状态:prepareAnthropic 缺 isTitleGen 守卫、快照无条件覆盖、survivedCount 每请求空转 #388)。超窗的全历史侧请求必然上游 400,且此类请求会反复发起(标题生成/探测),形成持续 400。「learned 自适应学不到」成立,是三重失效:
exceed_context_size_error不在CONTEXT_OVERFLOW_PATTERNS(src/util.ts:107-123)里 →inspectContextOverflow判 isOverflow=false,根本不进学习路径;estimateCoreMessages(prepared.processedMessages)(src/server.ts:2847),而 side 路径的processedMessages恒为[]→ 估算 ≈0 <1000,学习再次被跳过;reqConfig.modelContextLimit→ 后续侧请求照样裸转,死锁持续。层次判断:根因不是「客户端带全量历史」(历史归客户端自己的 view,代理不可控),而是 side gate 把「小输出预算」与「可跳过所有输入侧护栏」混为一谈;上面三层是阻止自纠的次级缺陷。
方案(实现建议 1+2,建议 3 不采纳):
side_request_payload_too_large,retryable=false),不转发、不截断历史。选 fail-fast 而非截断:截断策略没有可验证语义(丢哪段无从判断),且客户端拥有自己的历史;fix: honor anthropic-beta context-1m to size the context window #301 的 preflight fail-fast 已确立「不转发 guaranteed-400 载荷」先例,保持一致。exceed[_ ]context[_ ]size模式;parseOverflowWindow识别(A / B > C)形式并以 C 为窗口(本 issue 示例可提取出 150,528);forward() 兜底估算在processedMessages为空时(side 路径)改用 raw body 估算。这样即使估算偏低漏过一次 400,下一次也会被本地拦截。实现完成后提交 PR 并在此回帖。
ranxianglei commentedon Sep 5, 2026
实现完成,PR 已提交:#557
变更(分支
2026-09-05_side-request-payload-guard,commit 2d78bf2,4 files +256/−11):src/server.ts新增sideRequestGuard+ side gate 内调用):raw body 估算(CJK-aware 文本计数 + 图片成本)对比有效窗口 = min(resolved 窗口, learned 窗口)− 输出预留(非 Anthropic wire);≥ 有效窗口 → 本地 fail-fast 413(side_request_payload_too_large,retryable=false),不转发、不截断历史;窗口未知(limit≤0)时行为与现在一致。src/util.ts+forward()):新增exceed_context_size_error模式;识别(A / B > W)形式并以 W 为窗口(本 issue 示例可提取出 150,528);kernel view 为空时(side 路径)兜底估算改用 raw body——即使估算偏低漏过一次,上游报出真实窗口后,下一次相同请求即被本地拦截。测试(tests/side-request-isolation.test.ts,+5 个):
estimateRawBodyTokens(字符串叶计数 / data·url·b64_json 排除 / CJK 逐字)、inspectContextOverflow(新模式 +(A/B>W)窗口解析 + status gate + 既有模式回归)、sideRequestGuard(边界值、learned 只缩不放、headroom 预留、图片成本);exceed_context_size_error (… > 150,528)400 → 学到 150,528 并 arm emergency shrink,第二次相同请求被本地 413 拦截、upstream 命中数保持 1。Pre-flight:typecheck ✅;全量测试 1051/1052(唯一失败为 launcher.test.ts 环境性问题——本沙箱 PATH 里存在
/usr/bin/codex,已在干净 master 上验证同样失败,与本变更无关);build ✅。E2E codex 套件需要可达的真实上游,本环境无法运行,已在 PR body 注明。请 review。
fix: tolerate estimator bias in the side-request guard (#554)
Merge pull request #557 from ranxianglei/2026-09-05_side-request-payl…
fix: separate confirmed vs speculative overflow window evidence (#570)
fix: separate confirmed vs speculative overflow window evidence (#570)
ranxianglei commentedon Sep 6, 2026
修复已随 PR#557 合并 (merge commit e992d5e): side request (max_tokens<=200) 现在同样接受载荷体积检查, 携带全量历史直转上游导致 400 的路径已被 guard。PR 标题里的 (#554) 不是 closing 关键字, 所以没有自动关, 手动关闭。
fix: guard side requests against over-window payloads (ranxianglei#554)
test: pin the overflowArmTokens RELEASE direction + restart round-trip (
fix: side-request guard must not clamp on the host usage baseline (ra…
test: align CI expectations with #3900 universal output-headroom rese…