0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenAI API が「insufficient_quota」で使えなかった話と解決までの手順

Posted at

背景

AWS Lambda から OpenAI API を叩こうとしたら、こんなエラーが返ってきました。

{
  "error": {
    "message": "You exceeded your current quota, please check your plan and billing details.",
    "type": "insufficient_quota",
    "code": "insufficient_quota"
  }
}

image.png

クレジット残高もある
それでも Dashboard や curl から直接叩いても NG

という状況に数日ハマりました。

余談

ちなみにクレジットカードの登録でもハマりました
BillingのPreferencesの住所とCredit Cardの住所が一致する必要がありました。

やったこと(失敗編)

Usage limits を増額

→ $30 や $100 にしてもダメ

環境変数に新しい API Key を設定

→ Lambda の Key 更新忘れも疑ったが、curl でも同じエラー

プロジェクトの Billing 紐づけ を探す

→ UI 上では「Linked Billing Account」が出てこない
→ 結果、プロジェクトと Billing がつながっていないように見えるが、設定画面自体が存在しない

解決方法(成功編)

Billing を一度キャンセルして、再度 Credit を追加し直したら解決しました。

手順

OpenAI Dashboard → Billing
→ 「Cancel plan」を実行
image.png

ここで一度Creditの表示が消えます(お金なくなった!?と思うけど復活したので大丈夫)

再度 Add to credit balance からクレジットを追加

すると…

「既存の残高」も含めて復元される

Dashboardからのリクエストも通るようになった
image.png

Lambda からも正常レスポンスが返るようになった ✅
image.png

Lambda での動作確認コード

import os, json, urllib.request

OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
MODEL = os.environ.get("OPENAI_MODEL", "gpt-5-nano")

def lambda_handler(event, context):
    text = event.get("text") if isinstance(event, dict) else ""
    if not text:
        return _resp(400, {"error": "text が空です"})
    try:
        reply = call_openai(text)
        return _resp(200, {"reply": reply})
    except Exception as e:
        return _resp(502, {"error": str(e)})

def call_openai(user_text: str) -> str:
    url = "https://api.openai.com/v1/chat/completions"
    body = {
        "model": MODEL,
        "messages": [
            {"role": "system", "content": "日本語で簡潔に答えて"},
            {"role": "user", "content": user_text},
        ],
    }
    data = json.dumps(body).encode()
    req = urllib.request.Request(
        url, data=data,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {OPENAI_API_KEY}",
        },
        method="POST"
    )
    with urllib.request.urlopen(req, timeout=20) as res:
        resp = json.loads(res.read().decode())
        return resp["choices"][0]["message"]["content"]

def _resp(status, body):
    return {"statusCode": status, "headers": {"Content-Type":"application/json"}, "body": json.dumps(body, ensure_ascii=False)}

学び

「Quota exceeded / insufficient_quota」エラーは、レート制限だけじゃなくBilling異常でも発生する

クレジットが残ってても、Billing が壊れていると使えないことがある

キャンセル→再契約 で残高ごと復元される場合がある

まとめ

OpenAI API で insufficient_quota が直らないときは、
→ Billing のキャンセル→再契約 を試してみる価値あり

特に プロジェクトに Billing を紐づけられない UI のときに有効

👉 この現象、自分以外にもハマる人絶対いると思うので、Qiita に残します

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?