계정
오류
api14 게이트웨이가 돌려주는 HTTP 상태 코드와 오류 코드를 OpenAI 오류 형식 기준으로 정리하고, 업스트림 오류의 원인, 대응 방법, 재시도해도 되는 경우를 코드와 함께 안내합니다. 코드에서 오류를 처리하는 예제도 있습니다.
오류는 OpenAI 오류 형식을 사용하므로 공식 SDK가 이를 일반적인 예외(APIError, RateLimitError, AuthenticationError 등)로 변환합니다. 분기 처리에는 code를 사용하세요. message는 사람이 읽을 수 있도록 영어로 작성된 설명입니다.
{
"error": {
"message": "This request may cost up to $0.0123 but your balance is $0.0040. Add funds at /pricing.",
"type": "insufficient_quota",
"code": "insufficient_balance"
}
}
실패한 요청에는 요금이 부과되지 않습니다. 4xx 또는 5xx 상태의 응답은 무료입니다.
게이트웨이 오류 코드
| 상태 | code | type | 의미 |
|---|---|---|---|
| 400 | model_required | invalid_request_error | model 필드가 없습니다. |
| 400 | invalid_json | invalid_request_error | 본문이 JSON 객체가 아닙니다. |
| 400 | invalid_body | invalid_request_error | multipart 본문을 읽을 수 없습니다. |
| 400 | max_tokens_too_large | invalid_request_error | 플레이그라운드 체험 요청에서 출력 토큰을 너무 많이 요청했습니다. |
| 401 | invalid_api_key | authentication_error | 키가 없거나, 형식이 잘못되었거나, 폐기되었습니다. |
| 402 | insufficient_balance | insufficient_quota | USD 잔액이 $0이거나 요청의 예상 최대 비용(입력, 출력 한도, 이미지 또는 동영상 길이)보다 적습니다. 요청은 전송되지 않습니다. |
| 403 | model_not_allowed | permission_error | 키의 모델 허용 목록에 이 모델이 없습니다. |
| 403 | plan_required | permission_error | 요금제에 이 모델 카테고리가 포함되어 있지 않습니다. |
| 404 | model_not_found | not_found_error | 모델 ID를 알 수 없거나, 비활성화되었거나, 삭제되었습니다. |
| 404 | not_found | not_found_error | 알 수 없는 엔드포인트이거나, 본인 소유가 아닌 동영상 작업 또는 생성 내역입니다. |
| 413 | payload_too_large | invalid_request_error | 요청 본문이 크기 한도(기본 25 MB)를 초과합니다. |
| 429 | rate_limited | rate_limit_error | 분당 요청 수를 초과했습니다. Retry-After: 60이 함께 옵니다. |
| 429 | daily_limit_reached | rate_limit_error | 키가 일일 USD 지출 한도에 도달했습니다. |
| 409 | idempotency_conflict | api_error | 이 Idempotency-Key로 이미 요청을 보냈습니다. 다른 요청에는 새 키를 쓰세요. 요청 한도. |
| 403 | site_not_allowed | permission_error | 위젯 전용: 페이지의 사이트가 허용된 위젯 사이트에 없습니다. 위젯. |
| 429 | widget_daily_limit | rate_limit_error | 위젯 전용: 위젯 또는 전체 위젯이 일일 USD 지출 한도에 도달했습니다. |
| 429 | visitor_daily_limit | rate_limit_error | 위젯 전용: 이 방문자가 위젯 관리에서 정한 일일 요청 한도에 도달했습니다. |
| 502 | upstream_unavailable | api_error | 업스트림 제공업체에 연결할 수 없습니다. |
| 4xx/502 | content_unavailable | 상황에 따라 다름 | 동영상 콘텐츠를 아직 가져올 수 없습니다(상태는 업스트림과 같고, 없으면 502). |
| 503 | maintenance | service_unavailable | 점검 모드, 생성 엔드포인트는 일시 중지되지만 GET 엔드포인트는 계속 동작합니다. |
| 503 | not_configured | service_unavailable | 게이트웨이가 아직 설정되지 않았습니다. |
업스트림 오류
업스트림 제공업체가 반환한 오류(예: 특정 모델에 대한 잘못된 파라미터, 컨텍스트 길이 초과, 콘텐츠 정책에 따른 거부, 제공업체 자체의 429)는 원래 상태 코드와 동일한 { error: { ... } } 형식으로 그대로 전달됩니다.
대응 방법
| 상태 | 재시도 여부 | 조치 |
|---|---|---|
| 400 | 아니요 | 요청 본문을 수정하세요. |
| 401 | 아니요 | 키와 Authorization: Bearer 헤더를 확인하세요. 인증을 참고하세요. |
| 402 | 아니요 | 잔액을 충전하거나 자동 충전을 켜세요. |
| 403 | 아니요 | 허용된 모델을 사용하거나, 키의 허용 목록을 수정하거나, 요금제를 업그레이드하세요. |
| 404 | 아니요 | 모델 페이지에서 모델 ID를 확인하세요. |
| 413 | 아니요 | 더 작은 본문을 보내거나, 파일을 base64 대신 URL로 전달하세요. |
| 429 | 나중에 | rate_limited: Retry-After만큼 기다리세요. daily_limit_reached: 다음 UTC 날짜까지 기다리거나 키 한도를 높이세요. 속도 제한을 참고하세요. |
| 502 | 예 | 백오프를 적용해 재시도하거나 모델 폴백을 추가하세요. |
| 503 | 예 | 나중에 다시 시도하세요. |
코드에서 오류 처리하기
import OpenAI from 'openai'
const client = new OpenAI({ baseURL: 'https://api14.com/api/v1', apiKey: process.env.API14_API_KEY })
try {
await client.chat.completions.create({ model: 'openai/gpt-5-mini', messages: [{ role: 'user', content: 'Hi' }] })
} catch (err) {
if (err instanceof OpenAI.APIError) {
console.error(err.status, err.code, err.message)
if (err.code === 'insufficient_balance') {
// prompt the user to add funds
}
} else {
throw err
}
}
from openai import OpenAI, APIStatusError
client = OpenAI(base_url="https://api14.com/api/v1", api_key="sk-api14-...")
try:
client.chat.completions.create(model="openai/gpt-5-mini", messages=[{"role": "user", "content": "Hi"}])
except APIStatusError as e:
print(e.status_code, e.code, e.message)
스트림이 시작된 뒤 발생한 오류는 스트림 안으로 전달됩니다. 스트리밍을 참고하세요.