Skip to content

fix: detect chained bili instances (hop marker) — double processing corrupts session state #299

Description

@ranxianglei

Model: glm-5.3

双 bili 串联无检测:三重处理导致状态搅乱(issue #292 主因)

证据(来自 issue 附带日志 bili (8).log

13:21:22.139Z forward POST → http://127.0.0.1:50157/bili/https://api.anthropic.com/v1/messages?beta=true

请求路径:claude → 8787(MITM,outer session 366af3e19c251c72,窗口 200000)→ 50157(prefix 实例)→ 8787(再次拦截,inner session 4b93227797589299,窗口 1000000)→ Anthropic。同一个 claude-fable-5、同一个 x-claude-code-session-id,两层各自跑 processTurn + 压缩循环 + 独立 kernel 状态:

  • 模型调 compress 只有最内层(inner)折叠;outer 状态从不折叠 → 外层持续全量历史(「上下文涨」)
  • inner 折叠后转发的 body 与 outer/claude 保留的全量历史不一致,跨层 ref 映射错位 → inner 状态被搅乱后 filter 几乎隐藏全部消息(13:28:17 round 1 input=2 cached=0,同时刻仍有真实 Bash 调用被裁决——证明主回合近乎空 body 转发)
  • 已用纯 kernel 复现排除 kernel 嫌疑:compress m00003–m00041 后再 compress m00005–m00044,kernel 安全处理(只为未覆盖增量建块、双摘要注入、无塌缩)。塌缩在 bili 状态层,根因是双重处理。

修复要求

  1. bili 向上游转发请求时加自有标记头(如 x-bili-hop: <instance-uuid>
  2. 收到入站请求若已带 x-bili-hop(非本实例)→ 判定为 bili→bili 串联:
    • 跳过全部处理(不注入工具/标签、不跑 acp-loop、不建 session 状态),原样透传
    • [warn] 醒目日志:检测到下游 bili 串联,建议只保留一个实例
  3. e2e 测试:两个代理实例串联(A forward → B),断言 B 记录告警且请求体未被 B 二次改写(无 acp 标签注入、无工具注入)

验收

  • 串联拓扑下单层处理,压缩正常折叠
  • 单实例正常使用完全不受影响(claude 回传带 acp 标签的消息不误报——标记头只在 bili 自己的转发中出现,客户端不会带)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions