环境代理瞬断后 Cindy 将 HTTP fallback 转为 502 并反复断线重连
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 395
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
**提交人**: 午夜乐园管理员
**客户端版本**: 0.1.46
---
## 现象
近期正常使用 Cindy 时经常出现“断线重连”或错误横幅;同一台电脑、同一时段使用 ChatGPT 客户端正常。
重启 Cindy 后可以继续原来的任务,但问题会再次出现。
## 复现步骤
1. 在当前环境代理配置下正常启动 Cindy。
2. 正常运行任务并保持 Cindy 在线,无需主动切换网络。
3. 问题会自然出现:连接短暂中断,随后进入重连、HTTP fallback、密集 502 重试和自动续跑。
用户没有手动验证“主动停止并重启本机代理”是否能稳定复现,因此该项未知。
## 期望行为
- 本机代理短暂不可用几秒时,Cindy 能平滑恢复,并保留正在运行的任务。
- WebSocket 回退 HTTP 后,如果响应不符合 SSE 预期,应进行有界重试并给出准确诊断,不应形成密集 502、自动续跑和错误横幅循环。
- 长时间中断时,应区分本机代理、Cindy 服务端 5xx、心跳或 TLS 链路异常。
## 实际行为
- Cindy 的持久连接在代理瞬断时立即离线并重连。
- Codex WebSocket 失败后回退 HTTP;上游返回状态 200、但缺少 SSE 所需的 Content-Type,Cindy 将其判定为 `non_sse_stream_response` 并对外转成 502。
- 之后按约 2–5 秒间隔成组重试,触发 `interrupted-turn auto-resume` 和用户可见错误横幅。
- 重启 Cindy 后可以继续任务。
## 复现频率
脱敏日志统计显示:
- 两天内确认 15 次约 2.2–4.5 秒的短闪断,其中 13 次明确对应 Cindy 从环境配置采用的本机代理瞬时拒绝连接。
- `non_sse_stream_response` 转 502:第一天 291 次,第二天截至检查时 2023 次,共 2314 次。
- 自动续跑记录:第一天 18 次,第二天 11 次。
- 第二天 15:35–15:42 的一次最新事件中,短暂代理拒绝连接后又连续出现 112 次相关 502。
## 已尝试
重启 Cindy,之后可以继续任务。
## 脱敏诊断摘要
### 与用户可见重连最接近的错误链
1. Cindy 的 ChatGPT/Codex 与 `device-link` 均从环境配置采用本机 HTTP 代理。
2. 代理监听端点瞬时不可用,出现 `ECONNREFUSED` / `ERR_PROXY_CONNECTION_FAILED`。
3. `device-link` 以 WebSocket 关闭码 `1006` 离线,通常数秒后恢复。
4. Codex WebSocket 失败后回退 HTTP;上游返回 200 但没有可识别的 SSE Content-Type。
5. Cindy 将该响应转成 `502 non_sse_stream_response`,随后进入密集重试、自动续跑和错误横幅循环。
这更像 Cindy 对环境代理短暂不可用及 WS→HTTP fallback 的恢复不够健壮,而非 OpenAI 账号或模型整体故障。ChatGPT 客户端可能使用不同网络栈、代理发现和恢复策略,因此其同时正常并不矛盾。
### 独立的长时间中断
同一时间范围内还发现三次不同性质的长中断,不宜与上述主因混为一类:
- 约 7 分钟:心跳丢失后多次 TLS 建连前断开。
- 约 52 分钟:Cindy relay 服务重启后连续返回 HTTP 503,恢复前还出现一次 401;明确偏服务端故障。
- 约 48 分钟:心跳丢失、握手超时及大量 TLS 建连前断开;日志没有整机断网或网络切换事件,不能断言是本机整体断网。
## 建议排查方向
- 修正 HTTP fallback 对“200 但非 SSE/无 Content-Type”响应的处理,避免转成无界 502 重试。
- 为 fallback 和自动续跑增加有界指数退避、去重和熔断,避免重试风暴。
- 对几秒内可恢复的代理瞬断增加连接状态防抖和任务续跑保护。
- 将代理失败、非 SSE 响应、服务端 5xx、心跳/TLS 故障分别呈现,并提供可操作提示。
- 单独检查 relay 服务重启后持续 503 的恢复和健康检查流程。
---
**OS**: darwin arm64 (25.5.0)
**界面语言**: zh-CN
Contributor guide
Research direction
No source files or tests are named in the report. Start by tracing the Codex WebSocket-to-HTTP fallback, device-link connection handling, and interrupted-turn auto-resume paths, using the reported non_sse_stream_response and proxy connection errors as entry points. Done should distinguish proxy, non-SSE, server 5xx, heartbeat, and TLS failures while preventing unbounded retry and resume loops.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, networking
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100