Claude Code "Request timed out": API_TIMEOUT_MS와 프록시 해결 방법

Wokey Team · 2026-09-24

짧은 답: Request timed out은 Claude Code가 기한 안에 API로부터 응답을 받지 못했다는 뜻입니다. 기한은 기본 10분(API_TIMEOUT_MS=600000)입니다. 게이트웨이를 거칠 때 흔한 원인은 모델이 느린 것이 아닙니다. 대개 중간의 무언가가 스트리밍 응답을 붙잡아 두거나, 너무 오래 조용한 연결을 끊습니다. 로컬 프록시, 회사 네트워크, 또는 게이트웨이 자체일 수 있습니다. 먼저 curl로 스트림이 조금씩 도착하는지 확인한 다음, 타임아웃을 늘릴지 결정하세요.

어떤 메시지가 보이나요

메시지 의미
스피너 아래의 Waiting for API response · will retry in … · check your network 20초 동안 데이터 없음. Claude Code는 아직 기다리는 중이며 아직 오류는 아님
Retrying in Ns · attempt x/y 자동 재시도 진행 중, 기본 최대 10회
Request timed out API_TIMEOUT_MS 안에 응답 없음
API Error: No response from API (waited …, then … on the retry) 두 번의 시도 동안 응답의 첫 바이트가 오지 않음
Wokey JSON 본문이 담긴 HTTP 504 Wokey가 업스트림을 기다리다 타임아웃됨
HTTP 408 요청 본문 업로드가 너무 느려 게이트웨이가 기다림을 중단함

앞의 네 가지는 Claude Code 자체에서, 마지막 두 가지는 서버에서 옵니다.

Wokey의 타임아웃 오류

Wokey의 타임아웃 오류는 모두 표준 오류 형식의 504입니다. code로 요청이 어디서 멈췄는지 알 수 있습니다.

code 의미
upstream_gateway_timeout 업스트림 자체의 게이트웨이가 아무것도 출력하기 전에 타임아웃됨
official_exit_first_byte_timeout 업스트림이 응답을 시작하지 않음(다른 경로로 재시도한 시간 포함)
provider_timeout 업스트림과의 연결이 결과 없이 끊기거나 타임아웃됨

예:

{"error":{"code":"upstream_gateway_timeout","message":"Upstream gateway timed out before producing a response.","type":"invalid_request_error"}}

응답 스트리밍이 시작된 뒤에 타임아웃되면 HTTP 504가 아니라 스트림 내 error 이벤트로 전달됩니다.

모델이 오래 생각하는 경우처럼 오랫동안 출력이 없으면, Wokey는 연결을 유지하기 위해 주기적으로 스트림에 SSE 주석을 씁니다.

: wokey-transport-keepalive-v1

클라이언트는 주석 줄을 무시합니다. curl로 테스트하다가 이 줄이 보이면 연결은 살아 있고 모델은 아직 작업 중입니다.

문제 해결 단계

1. curl로 스트림이 조금씩 도착하는지 확인하세요.

curl -N https://api.wokey.ai/v1/messages \
  -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":300,"stream":true,"messages":[{"role":"user","content":"Count from 1 to 60"}]}'

-N은 curl 자체의 버퍼링을 끕니다.

  • event:와 data: 줄이 도착하는 대로 흘러감: 전체 경로가 정상입니다.
  • 한참 기다린 뒤 한꺼번에 나타남: 중간의 무언가가 응답을 버퍼링하고 있으며, 그 경로에서는 Claude Code가 타임아웃되기 쉽습니다.

2. 로컬 프록시를 확인하세요. Claude Code는 HTTPS_PROXY와 시스템 프록시 설정을 따릅니다. TUN 모드, 규칙 기반 프록시, 회사 게이트웨이는 모두 스트리밍 응답을 버퍼링하거나 유휴 연결을 끊을 수 있습니다. 네트워크에서 api.wokey.ai에 직접 연결할 수 있다면 그 도메인을 프록시 대상에서 제외하고 다시 시도하세요. 프록시를 꼭 써야 한다면 다른 노드와 비교해 보세요.

3. 타임아웃을 늘리세요. 경로에 문제가 없고 요청이 정말 길다면 ~/.claude/settings.json의 env 블록에서 한도를 올리세요.

{
  "env": {
    "API_TIMEOUT_MS": "1200000"
  }
}
  • API_TIMEOUT_MS는 요청당 타임아웃이며 단위는 밀리초입니다. 기본값은 600000(10분)입니다.
  • 네트워크의 프록시가 응답이 끝날 때까지 붙잡아 둔다면, Claude Code 오류 메시지는 CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS도 함께 늘리라고 권합니다.
  • 도중에 멈춘 스트림의 감지는 CLAUDE_STREAM_IDLE_TIMEOUT_MS로 제어합니다. 5분 미만의 값은 5분으로 올라가며, 최대는 30분입니다.

4. 컨텍스트를 줄이세요. 컨텍스트가 클수록 업로드가 느려지고 첫 토큰도 늦어집니다. /compact로 세션을 압축하거나 새 세션을 시작하세요.

5. 408을 받았다면. 408은 업로드 중에 요청 본문이 더 이상 도착하지 않아 게이트웨이가 기다림을 포기했다는 뜻입니다. 거의 불안정한 네트워크에서 매우 큰 컨텍스트를 보낼 때만 나타납니다. 단순히 다시 시도하면 대개 성공합니다. 계속 발생한다면 2단계처럼 프록시를 확인한 뒤 /compact로 요청을 줄이세요.

Codex의 타임아웃

Codex의 스트림 유휴 타임아웃은 기본 300000 ms(5분)입니다. 이 타임아웃이 발생하면 idle timeout waiting for SSE 또는 stream disconnected before completion이 표시되고, 자동 재시도 중에는 Reconnecting... n/max가 표시됩니다. 이 설정은 제공업체 테이블에 넣습니다.

[model_providers.wokey]
name = "Wokey"
base_url = "https://api.wokey.ai"
env_key = "WOKEY_API_KEY"
wire_api = "responses"
stream_idle_timeout_ms = 600000
stream_max_retries = 10

stream_max_retries의 기본값은 5, request_max_retries의 기본값은 4이며, 둘 다 최대 100입니다. 전체 설정은 Codex config.toml 가이드를 참고하세요.

자주 묻는 질문

Claude Code의 기본 타임아웃은 얼마인가요?

요청당 10분이며 API_TIMEOUT_MS(기본값 600000)로 정해집니다. ~/.claude/settings.json의 env 블록에서 늘릴 수 있으며, 예를 들면 "API_TIMEOUT_MS": "1200000"입니다.

네트워크 문제인지 모델 문제인지 어떻게 구분하나요?

curl -N으로 "stream":true 요청을 보내세요. data: 줄이 하나씩 도착하면 경로는 정상입니다. 한참 기다린 뒤 한꺼번에 나타난다면 중간의 무언가가 응답을 버퍼링하고 있으며, 그 경로는 타임아웃이 나기 쉽습니다.

Wokey가 반환하는 504는 무슨 뜻인가요?

Wokey의 타임아웃은 모두 504이며, code로 어디서 멈췄는지 알 수 있습니다. upstream_gateway_timeout은 업스트림의 게이트웨이가 타임아웃되었다는 뜻이고, official_exit_first_byte_timeout은 업스트림이 응답을 시작하지 않았다는 뜻이며, provider_timeout은 업스트림과의 연결이 끊겼거나 타임아웃되었다는 뜻입니다.

스트림에 나오는 wokey-transport-keepalive-v1은 무엇인가요?

한동안 출력이 없을 때 중간 장비가 연결을 끊지 않도록 Wokey가 기록하는 SSE 주석입니다. 클라이언트는 이를 무시합니다. 이것이 보인다면 연결은 살아 있고 모델이 아직 작업 중이라는 뜻입니다.

Codex의 타임아웃은 어떻게 바꾸나요?

config.toml의 제공업체 테이블에서 stream_idle_timeout_ms(기본값 300000)와 stream_max_retries(기본값 5)를 설정하세요.