오류, 속도 제한 & 신뢰성
프로덕션 코드는 네트워크 서비스와 통신하므로 반드시 실패를 예상해야 합니다. 여기에 약간의 구조를 더하는 것이 불안정한 통합과 믿을 수 있는 통합을 가르는 차이입니다.
오류 지도
처리하게 될 일반적인 HTTP 상태:
| 상태 | 의미 | 대처 방법 |
|---|---|---|
| 400 | 잘못된 요청 | 페이로드를 수정하세요; 그대로 재시도하지 마세요 |
| 401 | 잘못되거나 누락된 API 키 | 자격 증명을 확인하세요 |
| 403 | 허용되지 않음 | 접근/권한을 확인하세요 |
| 429 | 속도 제한됨 | 백오프 후 재시도(retry-after 준수) |
| 500/529 | 서버 오류 / 과부하 | 백오프를 적용해 재시도 |
SDK는 이러한 오류를 타입이 지정된 예외로 노출하므로, 문자열을 파싱하는 대신 깔끔하게 분기할 수 있습니다.
백오프를 적용한 재시도
일시적 오류(429, 5xx)에는 상한을 둔 지수 백오프 + 지터로 재시도하세요:
import time, random
for attempt in range(5):
try:
return client.messages.create(...)
except (RateLimitError, APIStatusError) as e:
if attempt == 4 or not should_retry(e):
raise
time.sleep(min(2 ** attempt + random.random(), 30))
(많은 SDK가 일시적 오류를 자동으로 재시도합니다 — 직접 재시도를 추가하기 전에 클라이언트의 기본 동작을 파악하세요.)
속도 제한
제한은 계정/등급별로 적용됩니다(분당 요청 수와 토큰 수). 한도에 도달하면 타이밍 힌트와 함께 429를 받습니다. 전략: retry-after를 준수하고, 버스트를 완만하게 하며, 오프라인 작업을 배치 처리하고, 대량 처리 단계에는 더 저렴한 모델(모델 선택)을 사용하세요.
모델 마이그레이션
모델 ID는 날짜/버전이 지정되어 있으며 사용 중단됩니다. 이를 대비해 격리하세요:
- 모델 ID를 설정에서 읽으세요, 여기저기 흩어진 리터럴이 아니라.
- 사용 중단을 주시하세요 — 사용 중단 & 마이그레이션 워치와 모델 표 참고.
- 모델을 전환할 때 평가(eval)를 다시 실행하세요.