makecindy / makecindy/cindy

环境代理瞬断后 Cindy 将 HTTP fallback 转为 502 并反复断线重连

Open
#2,723 1 comment 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.