雨天小六

读懂 Codex(4.26):Previous Response 与增量请求对上下文的约束

· 更新于 2026-08-02 · 专栏:读懂 Codex

#Codex#Agent Runtime#Prompt#上下文工程#软件架构

previous_response_id 用于 Responses-over-WebSocket 的机会式增量请求:只有当前请求的非 input 属性与上一请求一致,并且当前 input 严格延续“上一请求 input + 上一响应新增 items”时,客户端才发送尾部 delta。任何检查失败都退回完整请求。

增量基线包含模型刚返回的项目

WebSocketSession 保存 last request,并从 last response channel 取 response ID 与 items_added。比较前缀时,期望基线不是上一请求 input 单独一段,而是上一请求 input 后接模型输出。

previous_response_id 将上一请求和响应项目作为当前增量基线
图 4.26-1:服务端 response 已持有先前输入与本次输出,下一请求只需发送其后的工具结果或新消息。
def incremental_delta(last_request, last_response, current):
    if not properties_match(last_request, current):
        return None
    baseline = last_request.input + last_response.items_added
    if current.input[:len(baseline)] != baseline:
        return None
    return current.input[len(baseline):]

项目比较会忽略 internal chat metadata passthrough,因为它不改变模型可见语义。长度不足、整数长度溢出、空 response ID 或 delta 规则不满足都会返回 None。

失败时完整回退

prepare_websocket_request 只有在成功得到 delta 且 response ID 非空时返回 (id, items);否则 payload 使用完整 request.inputprevious_response_id=None。服务端报告 previous response 不存在时,传输层也可以重新建立状态并完整发送。

增量请求检查失败后回退为完整 input
图 4.26-2:增量是优化路径,不是 History 的唯一副本。客户端始终能从完整 Prompt 重发,避免把服务端缓存当成本地真相来源。
def prepare_ws_payload(request, last):
    delta = incremental_delta(last.request, last.response, request) if last else None
    if delta is not None and last.response.id:
        return WsPayload(previous_response_id=last.response.id, input=delta)
    return WsPayload(previous_response_id=None, input=request.input)

Warmup 的 previous response 还涉及 trace 特例:传输可以复用 response ID,但 Rollout trace 必须记录逻辑上的完整模型可见请求,不能把 wire delta 误当成完整 Prompt。

源码与测试锚点

  • codex-rs/core/src/client.rs::get_incremental_itemsprepare_websocket_request
  • codex-rs/codex-api/src/common.rs::ResponseCreateWsRequest
  • codex-rs/codex-api/src/endpoint/responses_websocket.rs:previous response 错误。
  • codex-rs/core/src/client_tests.rs:前缀、属性变化和回退。

评论


← 返回文章列表