makecindy / makecindy/cindy

Claude Code 使用 ChatGPT OAuth GPT 模型时,长会话间歇收到空 HTTP 200 并持续重试

Open
#1,244 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
401
Avg merge
21h 48m
Merged PRs (30d)
776

Description

**提交人**: Jiachi Deng
**客户端版本**: 0.1.23

---

## 现象

在 Cindy 中使用 **Claude Code Agent + ChatGPT OAuth 的 GPT 模型**(本次日志确认的模型为 `chatgpt/gpt-5.6-sol`)进行较长时间的连续对话时,会间歇出现以下错误,并可能连续弹出多次:

```
API Error: API returned an empty or malformed response (HTTP 200) — check for a proxy or gateway intercepting the request
```

同一环境下,原生 Codex Agent 通常可以正常使用;OpenAI 登录状态和基础接口连通性也正常。

一个明显的恢复方式是:把发生错误的长会话 fork 成新会话,再发送新一轮消息,通常会立即恢复正常。这表明问题可能与长会话状态或 Claude Code → GPT 的协议桥接链路有关,而不是单纯的账号失效或整体网络中断。

## 复现步骤

1. 在 Cindy 中完成 ChatGPT OAuth 登录。
2. 新建 Claude Code 会话,并选择 ChatGPT OAuth 提供的 GPT 模型(已确认案例:`chatgpt/gpt-5.6-sol`)。
3. 在同一会话中持续进行多轮、较长时间的对话。
4. 继续发送消息,等待问题间歇出现。
5. 出错后重试,可能继续收到相同的 empty/malformed HTTP 200 错误。
6. 将当前会话 fork 为新会话,并在新会话中发送下一轮消息,通常又可以正常响应。

该问题并非每次都能立即复现,但在长会话中出现频率较高。

## 期望行为

- 长会话应能稳定继续,不应因为上游返回异常空流而进入连续报错或盲目重试。
- 对瞬时流式异常应进行有上限的自动恢复;无法恢复时,应展示真实的上游或桥接错误原因,而不是只显示笼统的 malformed HTTP 200。
- 不应要求用户通过 fork 会话才能恢复正常工作。

## 实际行为

- 原会话间歇进入 empty/malformed HTTP 200 错误状态,重试后仍可能重复失败。
- fork 到新会话后立即恢复,导致用户需要人为迁移会话才能继续。
- 2026-07-31 08:44–09:38 的本机日志中,共记录到 **126 次**同类 bridge 警告:

```
[cc-bridge] upstream 2xx with non-SSE content-type
status : 200
contentType : (missing)
```

日志同时确认触发会话为:

```
agentKind: 'claude-code'
model: 'chatgpt/gpt-5.6-sol'
```

## 初步排查信息

- Cindy 的该模型链路会经过 Anthropic Messages → OpenAI Responses → Anthropic SSE 的本地桥接;原生 Codex 不经过同一翻译路径,因此 Codex 正常并不能排除 bridge 问题。
- 当前 bridge 已能处理“正常结束但零事件”和部分流内错误,但如果上游返回 HTTP 200 后迟迟没有首个可翻译 SSE 事件,随后下游取消请求,abort 分支可能不再输出具体错误,只结束响应;这与最终看到的通用 malformed HTTP 200 及重复重试现象相符。
- 当时 Cindy 的出站请求经系统代理解析到本地 Clash HTTP 代理;但使用现有 OAuth 进行的不触发推理探测中,直连与代理路径均能收到一致、有效的 OpenAI 错误响应,因此暂时不能确定代理是根因。建议在日志中补充上游 request ID、首字节/首事件耗时及取消原因,以进一步区分上游异常、网络长流中断和 bridge 超时处理问题。
---
**OS**: darwin arm64 (24.6.0)
**界面语言**: zh-CN

Contributor guide

Open the contributing guide

Research direction

Start with the local Anthropic Messages → OpenAI Responses → Anthropic SSE bridge, focusing on the HTTP 200 path where no first SSE event arrives and the subsequent abort handling. Use the cited bridge warnings and local logs to trace cancellation and retry behavior; done means bounded recovery or a specific upstream/bridge error instead of repeated generic malformed-200 failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
ai, api, backend-api-design
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.