2024年に、ディレクトリ型検索エンジンの検索機能に、Google Gemini APIを使ってAI検索機能を実装してみた話を投稿していました。

実装というとカッコよく聞こえますが、単に検索された文字列をGemini APIにそのまま放り投げてレスポンスを表示させたというだけでしたが、当時はBardからGeminiに切り替わった時期ということもあり、無料枠も大きくて意外と楽しめた記憶があります。

お時間あればその記事もご参照ください。

そのディレクトリ型検索エンジンに実装したAI検索機能で久しぶりに検索してみたところ、Gemini APIからのレスポンスが全く取れなくなっていることに気が付きました。Google Cloudの管理画面を確認すると、リクエストに対してエラーが返っている状態です。

そこで今回は、最新の「Google AI Studio」でAPIキーを再取得し、機能を復旧させたプロセスを、サンプルコードを交えて詳しく解説したいと思います。

Generative Language APIのエラー状況

まずは「Google Cloud」のダッシュボードで「Generative Language API」の状況を確認してみました。

ディレクトリ型検索エンジンdtn自体が超過疎サイトなので分かりにくいと思いますが、画像上のAPIリクエストはチラホラあるようですが、APIメソッド別エラー数のところが常に100%のエラー状態になってしまっていました。

「Google Cloud」のダッシュボードで「Generative Language API」の状況

エラー内容を確認してみる

100%エラーになっている状況は確認できましたので、エラー内容の詳細を確認してみたいと思い、下記のようなサンプルコードでエラー状況を確認してみることにしました。

try {
    $client = Gemini::client($GeminiAPIKey);
    $result = $client
        ->generativeModel(model: 'gemini-2.0-flash') 
        ->generateContent("テスト");

    // 成功時の処理
    echo nl2br($result->text());

} catch (\Gemini\Exceptions\ErrorException $e) {
    // API側から返ってきた具体的なエラー
    $errorMsg = $e->getMessage();
    
    echo "【APIエラー発生】<br>";
    
    if (strpos($errorMsg, '429') !== false || strpos($errorMsg, 'quota') !== false) {
        echo "原因:リクエスト制限(Quota exceeded)です。無料枠の上限に達した可能性があります。";
    } elseif (strpos($errorMsg, '403') !== false) {
        echo "原因:認証エラーまたは権限不足です。APIキーが正しいか、APIが有効か確認してください。";
    } elseif (strpos($errorMsg, '400') !== false) {
        echo "原因:リクエストの形式が不正です(モデル名の間違いなど)。";
    } else {
        echo "詳細メッセージ: " . htmlspecialchars($errorMsg);
    }

} catch (\Gemini\Exceptions\TransporterException $e) {
    // 通信自体に失敗した場合(タイムアウトやネットワーク断など)
    echo "【通信エラー】APIサーバーに接続できませんでした。<br>";
    echo "詳細: " . htmlspecialchars($e->getMessage());

} catch (\Exception $e) {
    // それ以外の予期せぬエラー(ライブラリ自体のバグや設定ミスなど)
    echo "【予期せぬエラー】<br>";
    echo "型: " . get_class($e) . "<br>";
    echo "内容: " . htmlspecialchars($e->getMessage());
}

実行したところ、下記のような表示となりました。

【APIエラー発生】原因:リクエスト制限(Quota exceeded)です。無料枠の上限に達した可能性があります。

無料枠の上限?と言われても、「Google Cloud」ダッシュボードで見たように、APIリクエスト数を考えると、上限に達するほどに誰かが検索しているとも思えないので、やはりAPIキー自体に何か問題がありそうです。

認証情報(APIキー)を確認

APIがコケル場合、たいていAPIキーに何か問題があるというのは、このdtn.jp運営ブログでもおなじみの話ですので、「Google Cloud」ダッシュボードの認証情報ページでAPIキーの状態を確認してみました。

すると、やはり生成したキーに「制限あり」という表示が出ていて、利用不可の状態になっていることがわかりました。APIキーは2025/08/12に生成し直していたようですが、新しいキーも制限ありの状態にされておりました。

「Google Cloud」ダッシュボードの認証情報ページでAPIキーの状態

ちなみに、上部にとの警告が表示されていますが、これは「Googleアカウントでログイン」させるようなアプリを作る際に必要な設定であり、プログラムからAPIキーでGeminiを叩く場合には直接関係しないので無視してOKです。

必ず、アプリケーションに関する情報を使用してOAuth同意画面を構成してください。

Google AI StudioでAPIキーの新規生成

前回記事でも紹介した、「Google AI Studio」というブラウザベースのIDE(統合開発環境)がありますので、こちらで再度キーを取り直してみることにします。

2024年頃は真っ黒背景のβ版らしい管理画面でしたが、今は真っ白背景になっていて、Googleサービスらしい管理画面に変わっていました。

新しくなった「Google AI Studio」のダッシュボード

この「Google AI Studio」自体は、Google APIで毎度おなじみ「Google Cloud」と裏でつながっているようですが、Google Cloudで作成したプロジェクトの設定(制限や割当)が複雑に絡み合っている場合、それを修正するより、AI Studio専用のプロジェクトとして新しくキーを作るのが一番確実で手っ取り早いようなので、既存プロジェクトも無視して新規作成から再度やり直していきます。

Google AI Studio のAPIキー状況

2024年、2025年に真っ黒画面版「Google AI Studio」でAPIキーを作成したはずですが、その履歴も無くなっていて、こちらではAPIキーが無いことになっているようでした。新しい「Google AI Studio」になった際、「Google Cloud」ダッシュボードの認証情報とうまく連携できなかったのかもしれないですね。

「Google AI Studio」APIキー画面

APIキーの新規作成

APIキーの新規作成ボタンを押すとポップアップ画面が立ち上がるので、そこから「Gemini API Key」の新規作成をすることができるので、新規プロジェクトでAPIキーを生成してください。

「Google AI Studio」でAPIキー新規作成

ちなみに、既存のプロジェクトを紐付けることもできたので、試しに「Google Cloud」側にある既存プロジェクトにも紐付けをやってはみましたが、処理エラーになってしまっていたので、新規でやるのが一番ということのようです。

AI自体の機能更新も早すぎて、管理画面側が追い付いてないということなんでしょう。

新APIキーで接続確認

新たに生成したAPIキーでテストを投げてみたところ、無事にレスポンスをとることができました。

try {
    $client = Gemini::client($GeminiAPIKey);
    
    $result = $client
        ->generativeModel(model: 'models/gemini-2.0-flash') 
        ->generateContent("こんにちは、テストです。");

    echo nl2br($result->text());

} catch (\Exception $e) {
    echo "エラー詳細: " . htmlspecialchars($e->getMessage());
}

Gemini APIのレスポンスはこんな感じです。無事成功です。

テストですね。何かお手伝いできますか?

APIキーで利用可能な「生成AIモデル一覧取得」コード

試しに、新たに生成したAPIキーで利用可能なAIモデルも調べておきます。

try {
    $client = Gemini::client($GeminiAPIKey);
    $response = $client->models()->list();

    foreach ($response->models as $model) {
        echo "モデル名: " . $model->name . "<br>";
        echo "対応機能: " . implode(', ', $model->supportedGenerationMethods) . "<br><br>";
    }
} catch (\Exception $e) {
    echo "モデル一覧の取得に失敗: " . $e->getMessage();
}

どうやらgemini-2.5-flashやgemini-2.5-proも使えるようでしたので、利用するモデルをgemini-2.5-flashに変えておきました。

モデル名: models/gemini-2.5-flash
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.5-pro
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.0-flash
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.0-flash-001
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.0-flash-lite-001
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.0-flash-lite
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

モデル名: models/gemini-2.5-flash-lite
対応機能: generateContent, countTokens, createCachedContent, batchGenerateContent

ディレクトリ型検索エンジンdtnに実装

新しいAPIキーと生成AIモデルに変えたコードをディレクトリ型検索エンジンの検索プログラムに再度実装し、無事にレスポンスデータをサイトに表示させることができました。

ディレクトリ型検索エンジンの検索にAI実装

おわりに

本業ではGoogle WorkSpaceを会社で利用していることもあり、バンドル化されたGeminiを日々使いつつ仕事をするのが当たり前になってしまっていました。Geminiには過去のやり取りを残してくれる「Context Caching」機能もあるので、前にやり取りして煮詰めたネタを使って更に聞いたりができるので、これ無しの生活がもう考えられなくなってしまったのがちょっと怖い感じです。

WordPressの記事作成もAIで自動化できるようなので、1年ぶりに記事を更新するような筆不精な私は記事のAI生成化の誘惑に駆られてしまったりもしていますが、特にテーマがあるわけでもない「個人サイトdtn.jpの運営ブログ」ですので、効率は悪いかもしれませんが、これからも私のつたない文章で、一文字ずつ想いを込めてのんびり綴っていこうと思っています。

引き続き、サイト同様にのんびりした更新になるかと思いますが、お付き合いいただければ幸いです。