previous_response_id 用于 Responses-over-WebSocket 的机会式增量请求:只有当前请求的非 input 属性与上一请求一致,并且当前 input 严格延续“上一请求 input + 上一响应新增 items”时,客户端才发送尾部 delta。任何检查失败都退回完整请求。
增量基线包含模型刚返回的项目
WebSocketSession 保存 last request,并从 last response channel 取 response ID 与 items_added。比较前缀时,期望基线不是上一请求 input 单独一段,而是上一请求 input 后接模型输出。
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.input,previous_response_id=None。服务端报告 previous response 不存在时,传输层也可以重新建立状态并完整发送。
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_items与prepare_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:前缀、属性变化和回退。
评论
登录后即可评论