Gemini APIで『The response.text quick accessor…』エラーが出る理由とSafety Settingsの正しい扱い方

AWS Lambda (Python) で Gemini API を利用した機能を実装していた際、ローカルでのテスト時は正常に動作していたコードが、特定のプロンプト入力時のみ不規則にクラッシュする現象にハマったので備忘録として残します。

この記事でわかること

  • ValueError: The response.text quick accessor… の根本原因
  • Gemini API の Safety Settings(安全性設定)の仕組み
  • APIがブロックされた際の実践的なエラーハンドリング方法

[現象] 特定のプロンプトで発生する ValueError

開発環境では問題なく動いていた Lambda 関数が、本番に近い入力データを与えた際、以下のエラーを出して停止しました。

ValueError: The response.text quick accessor only works when the response
finished successfully and contains a single candidate.
Check response.parts to see if it contains any text.

HTTPステータスコードは 200 OK にもかかわらず、Python SDK の内部で response.text にアクセスしようとした瞬間に例外が発生します。

[環境]

  • Runtime: Python 3.9+
  • Platform: AWS Lambda
  • Library: google-generativeai

[原因] Gemini API の Safety Settings によるブロック

このエラーの正体は、Gemini API 側の 「Safety Settings(安全性設定)」 です。生成された回答が API の安全性基準(ハラスメント、ヘイトスピーチ、性的な内容など)に抵触してブロックされた場合、レスポンスオブジェクトは返ってくるものの、text 属性へのアクセスが制限される という SDK の仕様があります。

厄介なのは、API が 400 や 500 の HTTP エラーを返さず、一見正常なレスポンスに見えるため、コード上のバグと誤認しやすい点です。

[解決策] 安全性設定の緩和とハンドリングの実装

解決には、安全性設定をユースケースに合わせて調整するか、ブロックされたことを検知するロジックを追加する必要があります。

Before: クラッシュする実装

response = model.generate_content(prompt)
print(response.text) # ここで例外が発生

After: 安全な実装

import google.generativeai as genai
from google.generativeai.types import HarmCategory, HarmBlockThreshold

# 安全性設定を明示的に緩和、または調整
safety_settings = {
    HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
    HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
}

response = model.generate_content(
    prompt,
    safety_settings=safety_settings
)

# response.text を直接参照せず、finish_reason を先に確認する
if response.candidates[0].finish_reason == 3: # 3 は SAFETY(ブロック)
    return {
        'statusCode': 200,
        'body': '回答が安全性フィルターによりブロックされました。'
    }

print(response.text)

主要な finish_reason の値は以下の通りです:

理由 内容
1 STOP 正常終了
3 SAFETY 安全性フィルターによるブロック
4 RECITATION 著作権などの引用制限によるブロック

[まとめ]

Gemini API において response.text でエラーが出る場合、そのほとんどは Safety Settings によるフィルタリング が原因です。

  • 開発時: safety_settingsBLOCK_NONE にして挙動を確認する。
  • 運用時: finish_reason をチェックし、ユーザーに適切なメッセージを返す。

この2点を守ることで、AWS Lambda 上での不規則なクラッシュを防ぎ、安定した AI 機能を構築できます。

タイトルとURLをコピーしました