状态码 504上游繁忙与超时(503 / 504)Claude CodeCodex CLIClineCherry StudioSDK / curl 直接调用

报 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. 1

    偶发的先直接重试

    Claude Code 遇到超时会自动重试;其他工具重新发送一次即可。超时的请求没有产生结果,不会扣费。

  2. 2

    自己写代码时改用流式请求

    在请求里加上 stream: true(OpenAI SDK 和 Anthropic SDK 都支持)。流式请求只要上游开始返回第一个字,就不再受首包等待时间限制;非流式请求要等完整结果生成完才返回,长输出最容易 504。

  3. 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/responses
  • API 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,上游忙的时候首字等待会明显变长。处理方法:

  1. 用 /compact 把历史压缩成摘要;话题已经换了就 /clear。
  2. 不要把整个大文件读进对话,只取相关片段。
  3. 一次性要求生成很长内容的任务,拆成几步分别完成。

和客户端自己的超时区分开

  • 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 会扣费吗?

不会。超时的请求在失败时会释放预冻结的费用,不按用量计费。

为什么同样的问题有时快有时超时?

响应时间取决于上下文长度、输出长度和上游当时的负载。高峰时段首字等待会变长,长上下文的非流式请求更容易超过上限。

还是不行?

还没有 CCSub 账号?

注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。