Gemini APIを使い始めてしばらくすると、ある日突然こんなエラーメッセージに遭遇することがあります。
FAILED_PRECONDITION: Request contains an invalid argument.
あるいは、もう少し具体的に:
FAILED_PRECONDITION: Billing account not found. Please set up a billing account.
このエラーで厄介なのは、「前提条件が満たされていない」という意味のエラーコードなのに、その前提条件が何なのかが状況によって全く異なることです。同じエラーコードで「課金設定の問題」のこともあれば、「キャッシュの有効期限切れ」のこともあります。公式ドキュメントを見てもなかなかすっきり整理されていないので、実際に開発していてかなり戸惑いやすいエラーのひとつです。
ここでは私が実際に遭遇したパターンも含めて、FAILED_PRECONDITIONエラーのケース別の原因と解決策を整理しました。
FAILED_PRECONDITIONとは何か — 他のエラーとの違い
まず、混乱しやすい他のエラーコードと比較しておきます。
PERMISSION_DENIED(403):APIキーや認証情報そのものが無効か、権限が不足しているRESOURCE_EXHAUSTED(429):クォータやレート制限に達したNOT_FOUND(404):モデルやリソースが存在しないFAILED_PRECONDITION(400):認証は通っているが、今の状態では実行できない
FAILED_PRECONDITIONは「あなた自身は問題ないけれど、実行する前提となる状態が整っていない」というニュアンスです。HTTPステータスコードは400で、INVALID_ARGUMENT(無効な引数)とは別物です。
このエラーが返ってくる主なケースは4つあります。
ケース1:課金アカウントが設定されていない
Gemini APIには無料枠がありますが、無料枠でもGoogle Cloudプロジェクトに課金アカウントが紐づいていることを要求するケースがあります。特に以下の状況でこのエラーが出やすいです。
- 新規で作成したGoogle Cloudプロジェクトをそのまま使っている
- 無料トライアル期間が終了した
- AI Studio側のAPIキーを流用しているが、対応するGCPプロジェクトに課金設定がない
診断方法
import google.generativeai as genai
try:
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-2.5-pro")
response = model.generate_content("Hello")
print(response.text)
except Exception as e:
# エラーの詳細を確認する
print(f"Error type: {type(e).__name__}")
print(f"Error message: {str(e)}")
# "Billing account not found" が含まれていればケース1
if "billing" in str(e).lower():
print("→ 課金設定の問題です")解決方法
- Google Cloud Console にアクセス
- 「お支払い」→ 「課金アカウントをリンク」
- 課金アカウントがない場合は新規作成(クレジットカード登録が必要)
Google AI StudioのAPIキーを使っている場合、課金設定はGoogle AI Studio側から「Get API key」→ 該当プロジェクトの設定で確認できます。
ケース2:Gemini APIが有効化されていない
Google Cloudプロジェクトを使っている場合、APIは個別に「有効化」する操作が必要です。課金設定が完了していても、APIが有効でなければFAILED_PRECONDITIONが返ることがあります。
# Cloud SDKでAPIの有効化状態を確認
gcloud services list --enabled | grep generativelanguage
# 有効化されていない場合
gcloud services enable generativelanguage.googleapis.comVertex AI経由で使っている場合はさらに:
# Vertex AI APIも有効化が必要
gcloud services enable aiplatform.googleapis.comVertex AI特有のエラーとして、FAILED_PRECONDITION: The Vertex AI API is not enabled for this project というメッセージが出ることもあります。こちらはほぼこのケースです。
ケース3:コンテキストキャッシュの前提条件違反
Gemini APIのコンテキストキャッシュ機能(Context Caching)を使っているときにFAILED_PRECONDITIONが出る場合、以下のいずれかが原因です。
最小トークン数の不足
コンテキストキャッシュは、最低でも32,768トークン(約5万文字)以上のコンテンツに対してのみ有効です。それ以下のコンテンツをキャッシュしようとするとエラーになります。
import google.generativeai as genai
# ❌ 短すぎるコンテンツはキャッシュ不可
short_content = "これは短いシステム指示です。" # 数十トークン
try:
cache = genai.caching.CachedContent.create(
model="gemini-2.5-pro",
system_instruction=short_content, # 32,768トークン未満でエラー
)
except Exception as e:
print(e) # FAILED_PRECONDITION: ...minimum token count...
# ✅ 十分なコンテンツ量を確保する
# 実用的にはPDFや長文ドキュメントに使うのがコンテキストキャッシュの正しい用途キャッシュの有効期限切れ
FAILED_PRECONDITION: The cached content has expired. というメッセージが出た場合、参照しているキャッシュがTTL(有効期間)を過ぎて削除されています。
import google.generativeai as genai
from datetime import datetime
def get_or_recreate_cache(cache_name, model, content, ttl_seconds=3600):
"""キャッシュが期限切れなら再作成するユーティリティ"""
try:
# 既存のキャッシュを参照してリクエスト
model_with_cache = genai.GenerativeModel.from_cached_content(
cached_content=cache_name
)
response = model_with_cache.generate_content("質問")
return response
except Exception as e:
if "expired" in str(e).lower() or "FAILED_PRECONDITION" in str(e):
print("キャッシュが期限切れです。再作成します...")
# キャッシュを再作成
new_cache = genai.caching.CachedContent.create(
model=model,
contents=content,
ttl={"seconds": ttl_seconds}
)
model_with_cache = genai.GenerativeModel.from_cached_content(
cached_content=new_cache
)
return model_with_cache.generate_content("質問")
raise # その他のエラーは再スローデフォルトのTTLは1時間です。長時間のバッチ処理でキャッシュを使い回す場合は、明示的にTTLを延長するか、処理途中でキャッシュを再作成するロジックが必要です。
ケース4:プレビューモデルへのアクセス権限がない
Gemini 3.xの一部モデルはプレビュー段階で、特定の条件を満たしたGoogleアカウント・プロジェクトのみが利用できます。通常のAPIキーでアクセスしようとするとFAILED_PRECONDITIONが返ることがあります。
FAILED_PRECONDITION: This model is not available for general access.
Please contact Google for access.
この場合の確認手順です。
- Google AI Studioでモデルが選択可能か確認
- AI Studioで動くがAPIで動かない場合、APIキーのプロジェクトと Studio のプロジェクトが異なる可能性
- Vertex AI経由での利用を検討(Enterprise契約ではアクセスできるモデルが増えることがある)
エラーハンドリングのベストプラクティス
FAILED_PRECONDITIONは設定の問題なので、リトライしても解決しません。ただ、コンテキストキャッシュの期限切れなど「状態依存」のエラーは再試行が有効な場合もあります。
import google.generativeai as genai
from google.api_core import exceptions as google_exceptions
import time
def call_gemini_with_error_handling(prompt: str, max_retries: int = 1) -> str:
"""
FAILED_PRECONDITIONを適切にハンドリングするラッパー
- 課金・API有効化のエラー: 即座に終了(リトライ不可)
- キャッシュ期限切れ: 再試行ロジックを別途実装
- その他: エラーメッセージをログに残す
"""
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-2.5-pro")
for attempt in range(max_retries + 1):
try:
response = model.generate_content(prompt)
return response.text
except google_exceptions.FailedPrecondition as e:
error_msg = str(e)
# 課金・API設定の問題 → リトライ不要
if any(keyword in error_msg.lower() for keyword in
["billing", "not enabled", "not available for general access"]):
raise RuntimeError(
f"設定の問題です(リトライ不可): {error_msg}\n"
"Google Cloud Console で課金設定とAPIの有効化を確認してください。"
) from e
# キャッシュ期限切れ → 上位ロジックで再作成が必要
if "expired" in error_msg.lower():
raise RuntimeError(
"コンテキストキャッシュが期限切れです。キャッシュを再作成してください。"
) from e
# その他のFAILED_PRECONDITION
if attempt < max_retries:
print(f"予期しないFAILED_PRECONDITION: {error_msg}")
print(f"30秒後にリトライします... ({attempt + 1}/{max_retries})")
time.sleep(30)
else:
raise
return "" # 到達しない(型チェック用)診断チェックリスト
FAILED_PRECONDITIONが出たときは、まず以下を順番に確認するのが最速です。
エラーメッセージに billing が含まれる場合は課金設定の問題、expired が含まれる場合はキャッシュの期限切れ、not enabled が含まれる場合はAPI有効化の問題、not available や general access が含まれる場合はモデルへのアクセス権限の問題です。
エラーメッセージに該当するキーワードがなく、状況が判断しにくい場合は、Gemini APIエラーのリファレンス集でエラーコードから原因を逆引きするのも有効です。
また、認証関連のエラーと混同しやすい場合はGemini API認証エラーの解決ガイドも合わせて参照してください。
全体を振り返って — 次に取るべきアクション
FAILED_PRECONDITIONはリトライで解決するエラーではなく、設定や状態を修正することで解消します。
今日すぐにできることとして、まずエラーメッセージを正確に読んで、課金・API有効化・キャッシュ・モデルアクセスのどのケースに該当するかを判断してみてください。エラーメッセージを丁寧に見るだけで、大抵は原因が絞り込めます。
コンテキストキャッシュを使っている場合は、長時間処理でのキャッシュ期限切れが起きないよう、あらかじめ再作成ロジックを組み込んでおくことをおすすめします。