GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-06-21上級

Gemini Batch API でアプリレビュー8,000件を一晩で分類し、ポーリングを Webhooks に寄せるまで

個人開発の6アプリで溜まった約8,000件のレビューを Gemini Batch API で一晩のうちに分類した実装メモに、2026年6月のイベント駆動 Webhooks で翌朝のポーリングを置き換える設計を加えました。コスト・所要時間の実数値、複合キー設計、ハングジョブの見切り、期限つき非推奨の管理まで、動くコード付きで残します。

gemini-api279batch-api3webhooks個人開発91レビュー分類コスト最適化26

プレミアム記事

レビューが返事を待っている、という感覚があります。個人開発で iOS / Android の壁紙アプリと癒し系アプリを公開し続け、いまは6アプリを並行運用しています。App Store Connect と Google Play Console のレビュー欄を毎朝開くたびに、星1〜2のレビューや具体的な要望のコメントが少しずつ溜まっていきます。1件ずつ目を通すのは大切ですが、6アプリ分を3ヶ月放置したら8,000件近く積み上がっていた、というのが今回の話の入口でした。

通常の Gemini API で1件ずつ処理するのは確かに動きます。けれどコスト、所要時間、そして「夜中にレートリミットで止まって翌朝やり直し」という運用負荷を考えると、Batch API に寄せたほうが圧倒的に楽でした。

本記事は、実際に8,000件を一晩で片付けた実装と実測値に加えて、2026年6月に Gemini API へ入ったイベント駆動の Webhooks で「翌朝のポーリング」そのものを消す設計までを、動くコードとともに残すものです。1人で複数アプリを回す現実のなかで、夜間処理を「動かしてから寝る」だけでなく「完了を勝手に受け取る」段階まで持っていく記録です。

なぜ通常APIではなく Batch API を選んだのか

最初は通常APIでループを回していました。gemini-2.5-flash で1件あたりプロンプトとレビュー本文を渡し、{ "category": "...", "severity": "...", "needs_reply": true|false } の構造化出力を受け取るだけのシンプルな構成です。500件ほどでテストしているうちは何の問題もありませんでした。

8,000件を流し始めて、最初に詰まったのは1分あたりのリクエスト上限でした。Tier 1 で動かしていた時期だったため、429 RESOURCE_EXHAUSTED が頻発します。asyncio で並列度を絞っても、所要時間が読めません。深夜に流し始めて朝起きたら半分しか終わっていない、という日が2回続いた時点で別の手段を考え始めました。

Batch API に切り替えた理由は次の3点です。1つ目は料金が 通常APIの50% であること。2つ目は 24時間以内 に処理が完了することが SLA で示されていて、レートリミットの心配をしなくていいこと。3つ目は JSONL を1ファイル投げて結果を待つだけなので、夜中に進捗を気にする必要がなくなることでした。「動かしてから寝る」と「動かしながら起きている」では、翌日の消耗度が全然違うのです。

実装:JSONL 生成からアップロードまで

実装はとてもシンプルでした。レビューを Firestore から引っ張ってきて、JSONL を1本作り、google-genai SDK で投げます。

import json
from pathlib import Path
from google import genai
 
client = genai.Client(api_key="YOUR_GEMINI_API_KEY")
 
# Firestore などから引っ張ったレビュー配列
reviews = load_reviews_from_last_quarter()  # [{ id, app_id, locale, body }, ...]
 
schema = {
    "type": "object",
    "properties": {
        "category": {
            "type": "string",
            "enum": ["bug", "feature_request", "praise", "billing", "other"],
        },
        "severity": {"type": "string", "enum": ["low", "medium", "high"]},
        "needs_reply": {"type": "boolean"},
        "summary_ja": {"type": "string"},
    },
    "required": ["category", "severity", "needs_reply", "summary_ja"],
}
 
# JSONL を1行ずつ書き出す。key は必ず複合キーにする(理由は後述)
jsonl_path = Path("reviews_batch.jsonl")
with jsonl_path.open("w", encoding="utf-8") as f:
    for r in reviews:
        request = {
            "key": f"{r['app_id']}-{r['id']}",
            "request": {
                "contents": [
                    {
                        "role": "user",
                        "parts": [
                            {"text": f"アプリ: {r['app_id']} / 言語: {r['locale']}\n\n{r['body']}"}
                        ],
                    }
                ],
                "generationConfig": {
                    "responseMimeType": "application/json",
                    "responseSchema": schema,
                    "temperature": 0.1,
                },
                "systemInstruction": {
                    "parts": [{"text": "あなたはアプリレビューを分類する補助役です。"}]
                },
            },
        }
        f.write(json.dumps(request, ensure_ascii=False) + "\n")

そのまま Batch にアップロードして、ジョブを作るだけです。

uploaded = client.files.upload(
    file=str(jsonl_path),
    config={"display_name": "reviews-2026q1-q2", "mime_type": "jsonl"},
)
 
batch_job = client.batches.create(
    model="gemini-2.5-flash",
    src=uploaded.name,
    config={"display_name": "review-classification-overnight"},
)
print(batch_job.name)  # batches/xxxx

ここで PC を閉じて寝ます。翌朝、client.batches.get(name=batch_job.name) を叩いて state == "JOB_STATE_SUCCEEDED" を確認できれば、結果ファイルを client.files.download() でダウンロードし、JSONL を読み戻して Firestore に書き戻すだけです。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
夜間バッチの「翌朝ポーリング」を、2026年6月に追加されたイベント駆動 Webhooks へ置き換え、完了を受け取って自動でダウンロード・書き戻す受信側の実装
通常API と Batch API を同じ8,000件で実測した比較(コスト半額・所要時間約4割短縮・失敗0件)と、見積もりが読みやすくなる理由
複合キーで結果の取りこぼしを防ぐ設計、ハングジョブの見切りどころ、空スキーマ防御、そして6/25の画像プレビュー停止に学ぶ「期限つき非推奨」の管理
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-07-04
一晩のバッチで静かに落ちた数十件をどう拾うか — Gemini Batch API の行単位リトライ台帳
Batch API の「完了」は「全件成功」ではありません。個人開発で夜間バッチを回し続けるなかで見えた、行単位の結果台帳・一時失敗と恒久失敗の切り分け・選択的リトライ・恒久失敗の無限リトライ防止を、SQLite で組んだ状態機械の動くコードとともに残します。
API / SDK2026-05-14
Gemini 2.5 Pro の thinking_budget を制御する — コストを3分の1にしながら推論品質を守る実装パターン
thinking_budgetを未設定のまま使うとGemini 2.5 Proのコストが予想外に膨らみます。タスク別最適値・動的制御・モデルルーティング・本番監視・バッチ事前見積りまで、個人開発での実践知見をコード付きで解説します。
API / SDK2026-07-14
並行して回す実験が共有予算を食い尽くす前に — AI Studio 費用上限をプロジェクト隔離の境界にする設計
個人開発で複数の Gemini 実験を同じ請求アカウントで並行させると、ひとつの暴走が他の全部を巻き添えにします。AI Studio に入ったプロジェクト単位の費用上限を隔離境界として使い、クライアント側のソフト天井と月次照合まで含めた設計を実装込みでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →