OpenAI API는 계정에 크레딧이 부족하거나 지출 또는 사용 한도를 초과했을 때 429 오류 유형과 함께 insufficient_quota이 반환됩니다. 요청 한도와 동일한 상태 코드이지만 몇 초를 기다려도 해결되지 않습니다. 액세스는 누군가가 크레딧을 추가하거나, 한도를 높이거나, 월별 기간이 재설정된 후에만 다시 제공됩니다. OpenAI는 청구, 지출 또는 할당량 오류를 다시 시도해도 API 액세스가 복원되지 않으며, 특정 원인을 찾기 위해 error.code를 확인해야 한다고 말합니다. 자세한 내용은 오류 코드를 참조하세요.
OpenAI의 할당량 오류가 어떻게 표시되는지
이러한 각 오류는 429를 반환합니다.
error.type는 여전히 insufficient_quota될 수 있으므로 어떤 것을 얻었는지 알려면 error.code를 확인하십시오.
error.code |
의미 | 액세스 권한을 다시 얻는 방법 |
|---|---|---|
credit_balance_exhausted |
조직에 선불 크레딧이 남아 있지 않습니다. | 크레딧 추가 |
organization_spend_limit_exceeded |
조직이 모든 프로젝트에서 월별 지출 한도에 도달했습니다. | 한도를 높이거나 제거하거나 월별 재설정을 기다리세요. |
project_spend_limit_exceeded |
이 프로젝트는 월별 지출 한도에 도달했습니다. 다른 프로젝트는 계속 진행됩니다. | 프로젝트의 한도를 높이거나 제거하거나 월별 재설정을 기다리세요. |
organization_usage_limit_exceeded |
조직에서 OpenAI가 할당한 월별 사용량 한도에 도달했습니다. 설정한 지출 한도와는 별개입니다. | 더 높은 승인된 한도를 요청하거나 OpenAI 지원에 문의하세요. |
이를 "요청 한도에 도달함" 오류(예: rate_limit_exceeded 및 slow_down)와 비교하세요. 이는 일시적이며, 잠시 기다린 후 다시 시도하면 일반적으로 작동합니다. 자세한 내용은 OpenAI '요청 한도에 도달했습니다' 오류를 참조하세요.
OpenAI 할당량 오류를 처리하는 방법
- 상태뿐만 아니라
error.code도 읽어보세요. 단독으로429는 재시도 여부를 알려주지 않습니다. 테이블의 4개 코드를 "중지"로 처리하고 속도 제한 코드를 "기다렸다가 다시 시도"로 처리합니다. - 재시도를 중지합니다. 요청을 다시 보내지 말고 다시 시도 루프가 API를 계속 호출하도록 하지 마세요. 누군가가 청구 문제를 해결할 때까지 모든 요청은 동일한 방식으로 실패합니다.
- 실패할 수 있는 호출을 일시 중지합니다. 하나의 할당량 오류는 동일한 조직 또는 프로젝트의 다음 요청도 실패한다는 것을 의미합니다. 각 항목을 보내고 오류를 기다리는 대신 건너뜁니다.
- 사용자에게 알리세요. 지금은 AI 기능을 사용할 수 없다고 설명하고 나머지 앱이 계속 작동하도록 하세요.
- 스스로에게 알림을 설정하세요. 코드를 높은 심각도로 기록하거나, 청구 담당자에게 연락합니다. 수정 사항은 코드 외부에 있으므로 누군가는 이 사실을 알고 있어야 합니다.
OpenAI Python SDK는 기본적으로 429 응답을 2번 재시도합니다. 무엇을 재시도하든 코드는 결국 청구 코드와 함께 RateLimitError를 받게 되며, 여기서 중지합니다.
import logging
import openai
from openai import OpenAI
client = OpenAI()
logger = logging.getLogger(__name__)
BILLING_CODES = {
"credit_balance_exhausted",
"organization_spend_limit_exceeded",
"project_spend_limit_exceeded",
"organization_usage_limit_exceeded",
}
billing_error: str | None = None
def ask(prompt: str) -> str:
global billing_error
if billing_error:
raise RuntimeError("AI features are paused until billing is fixed.")
try:
response = client.responses.create(model="gpt-4.1", input=prompt)
return response.output_text
except openai.RateLimitError as error:
if error.code in BILLING_CODES:
billing_error = error.code
logger.critical("OpenAI billing error: %s", error.code)
raise
앱이 다시 시작될 때까지 플래그가 설정된 상태로 유지됩니다. 앱이 오랫동안 실행되는 경우(예: 결제 문제를 수정한 후 관리자 작업을 사용하여) 다른 방법으로 지웁니다.
앱이 OpenAI 할당량 오류를 처리하는지 테스트하는 방법
개발하는 동안 할당량 오류를 거의 보지 않습니다. 테스트 계정에 크레딧이 있고 사용량이 낮습니다. 따라서 할당량 처리를 테스트하는 방법은 사용자가 하기 전에 버그를 찾을지 여부를 결정합니다.
| Approach | 찾은 내용 | 당신이 놓친 것 |
|---|---|---|
| 프로덕션 대기 중 | 실제 실패 | 모든 것은 사용자가 건드리기 전까지는 괜찮고, AI 기능은 누군가 알아차릴 때까지 계속 중단된 상태로 남아 있습니다. |
| 테스트에서 API를 모킹하거나 코딩 에이전트가 모의 개체를 작성하도록 허용 | 정지 브랜치 실행 여부 | OpenAI의 실제 오류 본문 및 코드와 SDK의 재시도 정책 또한 모의 환경에 도달하려면 앱에 테스트 전용 스위치가 필요합니다. |
| 실제 크레딧을 사용하거나 작은 지출 한도를 설정 | 실제 동작 | 비용이 들며 조직 또는 프로젝트를 공유하는 다른 모든 앱이 작동하지 못하게 합니다. |
| 앱의 실제 트래픽을 가로채고 요청 시 할당량 오류를 반환합니다. | 실제 URL, 실제 SDK 및 재시도 정책 및 OpenAI 자체 오류 형식 | 앱에서 아무것도 변경되지 않으므로 코드를 격리된 상태에서 테스트하지 않습니다. 그건 단위 테스트로 처리하세요. |
앱에서 직접 써 보기
Dev Proxy는 앱의 요청을 api.openai.com로 가로채 OpenAI 오류를 반환하는 동안, 앱은 실제 URL을 계속 호출합니다. 사전 설정은 credit_balance_exhausted 오류 하나를 openai-throttling 속도 제한 오류와 함께 섞습니다.
Retry-After 유형의 insufficient_quota을(를) 반환하고 429 헤더는 없으므로, 다시 시도하는 대신 앱이 중지되는지 확인할 수 있습니다.
사전 설정을 다운로드하고 다운로드한 사전 설정으로 Dev Proxy를 시작합니다.
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
할당량 오류만 테스트하려면 사전 설정의 openai-errors.json 파일을 편집하고 credit_balance_exhausted 응답만 유지합니다. 지출 및 사용량 제한 코드를 테스트하려면 동일한 형식의 code가 다른 응답을 추가합니다.
그런 다음 평소와 같이 앱을 실행하고 어떻게 동작하는지 확인합니다. Dev Proxy를 설치하려면 Dev Proxy 설정을(를) 참조하세요.
다음 단계
또한, 다음을 참조하세요.
Dev Proxy