Claude API prompt_too_long (invalid_request_error): 원인과 해결법
Claude API prompt_too_long invalid_request_error는 단일 messages 또는 누적 conversation이 모델 context window 초과에 발생합니다. 프롬프트가 너무 김이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.
전반적인 Claude API 에러 처리 패턴은 Claude API Error Handling 가이드를 참고하세요.
무엇을 의미하는가?
prompt_too_long 에러 서브타입는 단일 messages 또는 누적 conversation이 모델 context window 초과을 의미합니다. Anthropic API의 에러 응답 본문에는 error.type이 "invalid_request_error"로 명시되며, error.message에 구체적 사유가 옵니다.
응답 예시:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "..."
}
}
흔한 원인 5가지
- 200K context 모델에 250K 토큰 입력
- Long-running 챗봇의 누적 history 미관리
- PDF/문서 첨부 토큰 미계산
- RAG context를 무한정 추가
해결 코드 (Python)
# Trim conversation to fit budget before sending
def trim_to_budget(messages, system, model, output_budget=4096, ctx=200_000):
client = anthropic.Anthropic()
while True:
count = client.messages.count_tokens(
model=model, messages=messages, system=system
).input_tokens
if count + output_budget <= ctx - 1000:
return messages
if len(messages) <= 2:
# Fallback to summarize older content
summary = summarize_old_msgs(messages[:-2])
messages = [{"role": "user", "content": summary}] + messages[-2:]
else:
messages = messages[2:] # drop oldest user+assistant pair
해결 코드 (TypeScript)
async function trimToBudget(messages, system, model, outputBudget = 4096, ctx = 200_000) {
while (true) {
const { input_tokens } = await client.messages.countTokens({ model, messages, system });
if (input_tokens + outputBudget <= ctx - 1000) return messages;
if (messages.length <= 2) {
const summary = await summarizeOldMsgs(messages.slice(0, -2));
messages = [{ role: "user", content: summary }, ...messages.slice(-2)];
} else {
messages = messages.slice(2);
}
}
}
재시도하지 마세요
이 에러는 클라이언트 측 문제라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.
비용 영향
이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.
자세한 비용 절감 패턴은 Claude API Cost and Prompt Caching Break-Even 또는 무료 비용 계산기를 참고하세요.
관련 에러
- 400 invalid_request_error — 잘못된 요청 형식
- 401 authentication_error — 인증 실패
- 403 permission_error — 권한 부족
- 429 rate_limit_error — Rate limit 초과
- 529 overloaded_error — API 일시 과부하
자주 묻는 질문
prompt_too_long 에러가 떴을 때 비용이 청구되나요?
처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.
prompt_too_long와 다른 에러의 차이는?
prompt_too_long는 클라이언트 측 문제로 요청 수정 없이는 재시도해도 같은 결과입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.
Bedrock/Vertex에서도 같은 에러 코드인가요?
네, Anthropic의 error.type 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).
다음 단계
- 프로덕션 코드에 retry 로직을 추가하려면 Production Patterns for Claude Agents를
- 비용을 모니터링하려면 Claude API 비용 모니터링 가이드를
- 에러 분류 자동화는 무료 /cheatsheet-한국어에서 30개 프롬프트로
에러 처리 패턴 30개 + Pydantic 검증 코드 — Claude API Cost Optimization 마스터클래스 ($59)에 retry 미들웨어, 비용 가드레일, 에러 알림 패턴 12편 포함.