GEMINI LABEN
DESKTOP — Gemini の Windows デスクトップ版が出ました。Windows 10 以降に対応し、Alt + Space でどの画面からでも呼び出せます0.59.0 — Gemini CLI の現在の安定版はこれです。v0.60 と v0.61 は nightly と preview だけで、安定版タグはまだ出ていません9/30 — gemini-omni-flash-preview の停止まで残り16日です。後継の gemini-omni-1.1-flash は video_config に resolution が加わっており、ID を差し替えるだけでは済まない場合があります429 — fileData に外部 URL の画像や PDF を渡すと、クォータを 0.03% しか使っていなくても 429 が返る報告が続いています。テキストだけなら通りますNEW — Drive の原稿を直して聞き直したら、Gemini が直す前の文を返してきました。取り込みの癖と、再添付を決める基準を書きましたSAFETY — 小説の翻訳で PROHIBITED_CONTENT が続くとき、閾値を下げれば通る話と、下げても通らない話があります。その境目を先に見分けたいところですDESKTOP — Gemini の Windows デスクトップ版が出ました。Windows 10 以降に対応し、Alt + Space でどの画面からでも呼び出せます0.59.0 — Gemini CLI の現在の安定版はこれです。v0.60 と v0.61 は nightly と preview だけで、安定版タグはまだ出ていません9/30 — gemini-omni-flash-preview の停止まで残り16日です。後継の gemini-omni-1.1-flash は video_config に resolution が加わっており、ID を差し替えるだけでは済まない場合があります429 — fileData に外部 URL の画像や PDF を渡すと、クォータを 0.03% しか使っていなくても 429 が返る報告が続いています。テキストだけなら通りますNEW — Drive の原稿を直して聞き直したら、Gemini が直す前の文を返してきました。取り込みの癖と、再添付を決める基準を書きましたSAFETY — 小説の翻訳で PROHIBITED_CONTENT が続くとき、閾値を下げれば通る話と、下げても通らない話があります。その境目を先に見分けたいところです
記事一覧/API / SDK
API / SDK/2026-06-12上級

深夜のポーリングをやめる — Gemini Batch API を Webhook 駆動に作り替えた設計記録

Gemini Batch API の完了監視を 60 秒間隔のポーリングから Webhook 駆動へ移行した実作業の記録です。static/dynamic の使い分け、署名検証、実測値をまとめました。

Gemini API239Batch API5Webhook3イベント駆動2運用設計15Python46

プレミアム記事

明け方 4 時のサーバーログを眺めていて、手が止まりました。

夜間に流している Gemini Batch API のジョブはとっくに終わっているのに、結果の取り込みが始まったのは 58 秒後。理由は単純で、完了確認のポーリングが 60 秒間隔だったからです。

ログの大半は「まだ終わっていません」という応答の記録でした。一晩分をざっと数えると、status 確認の GET だけで 1,000 回を超えています。仕事をしていない通信が、ログの約 90% を占めている状態。

2026 年 5 月に Gemini API へ Webhooks が正式に入ったのを機に、この監視層を作り替えることにしました。本稿はその実作業の記録です。

ポーリング監視の実測コスト

作り替えの前に、現状を数字で押さえておきます。私の夜間パイプラインは、個人開発しているアプリの App Store・Google Play 向け説明文と、アプリ内テキストの多言語ローカライズ文言を Batch API でまとめて生成するもので、毎晩 3 ジョブを流しております。

  • ポーリング間隔: 60 秒
  • 1 ジョブの平均所要時間: 約 2 時間(Batch API はベストエフォートのため夜によって大きく揺れます)
  • 一晩の GET 回数: 約 120 回 × 3 ジョブ × リトライ込みで 約 1,080 回
  • 完了から検知までの遅延: 平均 30 秒、最悪 60 秒

GET 自体は無料に近いとはいえ、cron とポーリングスクリプトという「動き続ける部品」を一つ抱えることになります。実際、過去にはポーリング側の例外処理の不備で監視だけが静かに死んでいた朝がありました。ジョブは成功しているのに結果が取り込まれていない。あの空振りの感覚は、いまも指先に残っております。

static と dynamic、どちらで受けるか

Gemini API の Webhook には 2 種類あります。最初にここの設計判断を誤ると後で作り直しになるため、丁寧に整理します。

static webhook はプロジェクト単位の登録です。webhooks.create で一度エンドポイントを登録すると、購読したイベント(batch.succeededbatch.failed など)がプロジェクト全体から飛んできます。署名は対称鍵(signing secret)の HMAC 方式。

dynamic webhook はジョブ単位の指定です。batches.createwebhook_config に URI を渡すと、そのジョブの完了通知だけが届きます。署名は JWKS による非対称鍵方式で、user_metadata に任意のルーティング情報を載せられます。

私の環境では次のルールに落ち着きました。

  1. 定常の夜間バッチ → static。エンドポイントが固定で、Slack 通知やデータベース更新のような「全ジョブ共通の後処理」に繋がるため
  2. 臨時・実験ジョブ → dynamicuser_metadata{"job_group": "experiment"} のような目印を載せ、本番の後処理に混ざらないよう専用エンドポイントで受けるため

逆にしないことが肝心だと感じております。臨時ジョブのために static の購読を増やすと、レシーバー側の分岐が際限なく育ちます。

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

この記事の続きを読む

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

この記事で得られること
一晩あたり約 1,080 回あった status 確認の GET をゼロにした移行手順と、移行後も薄いフォールバックポーリングを残した判断基準
static webhook と dynamic webhook をジョブの性質でどう使い分けるか — 私の環境で固まった具体的な振り分けルール
standardwebhooks ライブラリによる署名検証・5 分の replay 対策・webhook-id での重複排除まで含めた、そのまま動く Flask レシーバーの実装
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-04-02
Gemini API の月額5万円を8,400円まで下げた運用設計 — キャッシュ・モデル使い分け・Batch API の組み合わせ方
Gemini API の月額費用を52,000円から8,400円まで下げた実装と運用の記録です。暗黙・明示キャッシュの使い分け、Flash/Pro の自動ルーティング、Batch API への移行、usage_metadata による実測まで、本番で動かしているコードとともに整理します。
API / SDK2026-09-12
10月2日に止まる gemini-2.5-flash-image の移行先は、公式表のままでは動きません
gemini-2.5-flash-image の停止は2026年10月2日です。ところが公式の推奨移行先として書かれている gemini-3.1-flash-image-preview は6月25日に停止済みでした。移行先を最後まで辿るスクリプトを書いて表の全行を検査し、同じ構造の行が11件あることを確かめた記録です。
API / SDK2026-09-07
Lyria 3.5 が来た日に、音源フォルダの置き方を変えました
Lyria 3.5 のフルレングス生成が来たとき、生成した音と配信する音が同じフォルダに並んでいました。名前ではなくハッシュで線を引く、四十数行の台帳ゲートの作り方をお伝えします。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます