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)를 설정하세요.