BLOG

流式转发

2026/04/29 2 min read BLOG 池子 流式转发

流失转发是不能随意中断的

客户端(Codex)

common.js

provider(openai / codex / responses)

把流再转回客户端


流进行中
→ upstream 出一点问题(timeout / chunk error / idle)
→ routing-runner 判断:retryable ✔
→ 进入 retry 分支
→ throw / 重调 provider
→ 原连接被关闭
→ 客户端:stream disconnected

为什么 routing-runner 一定会把流杀掉

✅ 加一个“流锁”(最重要)

在 routing-runner 里:

const streamStarted =
requestContext?.streamStarted ||
res?.headersSent

🧠 一句话定义

流锁 = 一个状态标记,用来告诉系统:
“这条请求已经开始向客户端写数据了,后面不能再乱动(不能 retry / throw / 切 provider)”

🔍 一、为什么需要“流锁”

你现在系统的问题就是:

请求开始 → 已经 write 一部分 → 某处触发 retry → 重启流程 → 原连接被杀

👉 因为系统不知道自己已经进入“不可回头阶段”


重连机制 是重新建立流且自动上下文

🔍 五、为什么“流内续写是安全的”

因为它:

✔ 不切 provider
✔ 不重开整个请求
✔ 只是在同一生成上下文里继续