报 504 timeout_error「Upstream timed out」怎么解决
API Error: 504 {"type":"error","error":{"type":"timeout_error","message":"Upstream timed out"}}CCSub 返回 504 Upstream timed out,是在等待上游返回结果时超过了时间上限。日志里大部分 504 来自非流式请求:改用 stream: true、压缩超长上下文、把长输出任务拆小,基本都能解决。超时的请求不计费。
3 步解决
- 1
偶发的先直接重试
Claude Code 遇到超时会自动重试;其他工具重新发送一次即可。超时的请求没有产生结果,不会扣费。
- 2
自己写代码时改用流式请求
在请求里加上 stream: true(OpenAI SDK 和 Anthropic SDK 都支持)。流式请求只要上游开始返回第一个字,就不再受首包等待时间限制;非流式请求要等完整结果生成完才返回,长输出最容易 504。
- 3
缩短上下文、拆小任务
上下文越长,上游开始返回第一个字之前的处理时间越长。Claude Code 里用 /compact 压缩历史;一次要生成很长内容的任务,拆成几次请求分别生成。
同一个问题的其他写法
unexpected status 504 Gateway Timeout: {"type":"error","error":{"type":"timeout_error","message":"Upstream timed out"}}, url: https://www.ccsub.net/api/v1/responsesAPI Error: Request timed out
504 是在哪一步超时的
一个请求在 CCSub 里大致经过这几个阶段:鉴权和计费检查 → 选一条上游线路 → 把请求发给上游并等待它开始返回 → 把结果转发给你。504 发生在第三步:
- CCSub 等上游开始返回结果的时间上限约 65 秒。超过就算这条线路超时,会换一条线路再试。
- 所有换线重试共享一个约 90 秒 的时间预算,预算用完仍没有结果,就返回 504
Upstream timed out。 - 流式请求一旦开始输出,就不再受上面的首包限制,单个请求最长可以持续约 5 分钟。
所以 504 的意思不是「CCSub 挂了」,而是「这一次在规定时间内没等到上游开始回应」。
为什么非流式请求更容易 504
CCSub 近 30 天的 504 日志里,绝大部分发生在非流式请求上,而且一半以上来自程序直接调用接口(Go、Node 等的 HTTP 客户端),不是 Claude Code。原因在于非流式请求的工作方式:服务端要把整段回答全部生成完,才一次性返回。如果你让模型写一大段代码或长文,生成本身就可能超过一分钟,在部分线路上就会撞到等待上限。
改成流式之后,模型生成第一个字就开始返回,后面的内容边生成边推送。等待上限只约束「第一个字出现之前」这段时间,长输出不再是问题。
以 OpenAI SDK(Python)为例:
from openai import OpenAI
client = OpenAI(base_url="https://www.ccsub.net/api/v1", api_key="sk-你的密钥")
stream = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "写一个完整的 README"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
Anthropic SDK 同理,用 client.messages.stream(...) 或在请求里传 stream=True。
上下文太长也会拖慢首字
即使是流式请求,模型也要先把整段输入处理完才能吐出第一个字。Claude Code 的长会话动辄十几万 Token,上游忙的时候首字等待会明显变长。处理方法:
- 用
/compact把历史压缩成摘要;话题已经换了就/clear。 - 不要把整个大文件读进对话,只取相关片段。
- 一次性要求生成很长内容的任务,拆成几步分别完成。
和客户端自己的超时区分开
API Error: 504 ... Upstream timed out:CCSub 返回的,按上面的方法处理。Request timed out、No response from API:Claude Code 本地的超时,默认 10 分钟(API_TIMEOUT_MS)。这种情况多半是请求根本没顺利到达 CCSub,比如本地代理卡住了,先看 连接报错。- Codex 的流式空闲超时默认 5 分钟(
stream_idle_timeout_ms),流中途断开时会显示 stream disconnected before completion。
超时失败的请求会释放预冻结的金额,不按用量计费。
常见问题
CCSub 的超时时间是多少?
CCSub 等待上游开始返回的时间上限约 65 秒,期间失败会换线重试,整个换线决策的时间预算约 90 秒。流式响应一旦开始输出,单个请求最长可以持续约 5 分钟。
Claude Code 显示的 Request timed out 和 504 是一回事吗?
不是。504 是 CCSub 返回的,表示 CCSub 等上游超时;Request timed out 是 Claude Code 本地的超时,默认 10 分钟内没等到响应就会报,可以用 API_TIMEOUT_MS 调整。前者看 CCSub 这边,后者通常和本地网络或代理有关。
504 会扣费吗?
不会。超时的请求在失败时会释放预冻结的费用,不按用量计费。
为什么同样的问题有时快有时超时?
响应时间取决于上下文长度、输出长度和上游当时的负载。高峰时段首字等待会变长,长上下文的非流式请求更容易超过上限。
还是不行?
- 按症状查《故障排查》文档
- 联系客服:发邮件到 support@ccsub.net,附上工具名和版本、系统、完整报错文本和注册邮箱(不要发 API Key)。
- 对照接入教程重新检查配置:Claude Code 接入教程、Codex CLI 接入教程、Cline 接入教程、Cherry Studio 接入教程
相关报错
API Error: 503 {"type":"error","error":{"type":"overloaded_error","message":"上游线路暂时不可用,请稍后重试(不是您账户余额的问题) | Upstream temporarily unavailable, please retry shortly (this is not about your account balance)."}}CCSub 已自动换线重试过,这次仍没有可用线路。等一两分钟在原会话里发「继续」,或用 /model 换个型号;不扣费,也不是你的余额问题。API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"Invalid JSON in request body: Unterminated string in JSON at position 10407567 (line 1 column 10407568)"}}position 是上千万的数字 = 请求体太大、传输途中被截断:/compact 或 /clear、别反复贴大截图、大文件分段读。position 很小 = 发出去的 JSON 本身格式不对。stream disconnected before completion: stream closed before response.completed流在结束前断了。确认 base_url 是 https://www.ccsub.net/api/v1,去掉干扰终端的代理,过长的单轮任务调低推理强度或拆小,并在 provider 里调大 stream_max_retries。
还没有 CCSub 账号?
注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。