Skip to content

fix(openai): 生命周期元数据之后保留 Responses 故障转移 - #645

Open
jxb412 wants to merge 1 commit into
dofastted:mainfrom
jxb412:fix/openai-response-metadata-failover
Open

jxb412 wants to merge 1 commit into
dofastted:mainfrom
jxb412:fix/openai-response-metadata-failover

Conversation

@jxb412

@jxb412 jxb412 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

问题

API 上游的 OpenAI Responses 流式路径当前把任意 data: 行都视为已经向客户端提交输出。上游通常会先发送 response.created、response.queued、response.in_progress、response.metadata 或 keepalive;如果随后返回 server_is_overloaded / slow_down,请求会被错误标记为 committed,现有 failover 无法安全换号重试。

原生 GPT/Codex worker 已有首输出前缓冲,但 API upstream 路径仍存在这个问题。该问题与 Wei-Shaw/sub2api#8139 修复的语义一致。

修改

  • 按 Responses 事件语义判断是否出现真实模型输出,而不是看到任意 data: 就提交。
  • 首个真实输出前缓存生命周期元数据,不提前发送 HTTP headers。
  • 如果真实输出前收到 error / response.failed,返回 committed: false,交给现有 failover 换号重试。
  • 一旦出现真实业务输出或成功终态,再按原顺序 flush 缓存事件。
  • 已经输出真实内容后仍保持 committed: true,不会进行不安全的重放。
  • 非流式路径同步使用相同的 commit 语义。

测试

  • 新增生命周期事件不触发 commit 的单元测试。
  • 新增 created → queued → metadata → overloaded 保持未提交、下游零输出的集成测试。
  • 新增首个 output_text.delta 到来后按顺序 flush 的集成测试。
  • node --check src/lib/pool/api-protocol.mjs 通过。
  • git diff --check 通过。
  • Windows 下 Unix socket 集成测试自动跳过,由 Linux CI 执行。

@jxb412

jxb412 commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

补充 CI 说明:本 PR 新增的两项 API OpenAI Responses 测试均已通过(metadata 后 overload 保持未提交、首个真实输出时再 flush 元数据)。当前 unit job 的失败来自基线 main 同样存在的 cli-hop-body.test.mjs / convert-cache-shape.test.mjs TTL 断言;main 的 CI run 39520817070 可复现,与本 PR 修改的两个文件无关。其余 kernel/web/worker/arm64 检查均通过。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant