以前このブログで、Antigravity CLI(agy)で画像を連続生成しようとすると制限にぶつかること、そしてGeminiの画像生成はもう無料では作れないことを、実際に手を動かして確かめた体験談として書きました。今回はその“続き”——「じゃあ、どうやって実用レベルに持っていったのか」という解決編です。
私は同じ問題に毎日ぶつかるのが嫌で、自分用に小さなMCPツール(nano-banana-mcp)を作って対処しました。この記事は、想像でも伝聞でもなく、自分でコードを書いて動かして確かめた一次情報です。同じところでつまずいている人の役に立てば幸いです。
- agy が返してくる「偽のダミー画像」は、ファイルサイズで機械的に弾ける(自作ツールでは20KB未満を拒否)。
- 429(枯渇)を検知したらクールダウンを記録して、次回は無駄に呼ばない。これでエラーの連打が止まる。
- `–wait-quota` で「枯渇したら自動で待って再開」。張り付かなくても勝手にリカバリする。
- 魔法ではありません。制限そのものは消えない——でも「偽物を掴む」「無駄に叩いて怒られる」事故はほぼゼロにできました。
おさらい:何が「事故」だったのか
まず、何に困っていたかを一言で。詳しくは前の2本(記事末の「あわせて読みたい」)に書きましたが、ポイントはこの2つです。
- ① レート制限(429):少し連続させると `RESOURCE_EXHAUSTED` で弾かれる。無料の画像枠は事実上ほぼ「0」。
- ② 偽のダミー画像:枯渇したのにエラーを返さず、単色や数KBの”それっぽい偽画像”を平然と返してくる。これが一番たちが悪い。
特に②が厄介でした。エラーなら気づけますが、偽物を「成功」として返されると、自動化の中にゴミ画像が静かに混ざる。気づいた頃には何枚も無駄になっています。そこで「偽物を弾く」「枯渇を覚える」「待って再開する」の3つを自作ツールに実装しました。順番に見ていきます。
仕組み1:偽ダミー画像を「サイズ」で機械的に弾く
一番効いたのが、これです。agy が返す偽ダミー画像は、本物の生成画像に比べて極端にファイルサイズが小さい(単色やほぼ空っぽの画像なので当然です)。逆に言えば、サイズを見れば本物か偽物かはかなり正確に区別できるということ。
そこで自作ツールでは、生成結果のファイルサイズがしきい値を下回ったら「偽物」とみなして採用せず拒否するようにしました。実際のコードはこれだけです。
const DUMMY_IMAGE_MAX_BYTES = 20000;
function looksLikeDummyImage(filePath) {
return fs.statSync(filePath).size < DUMMY_IMAGE_MAX_BYTES; // 20KB未満は偽物
}
20,000バイト(約20KB)未満なら偽ダミーと判定します。本物の生成画像はまず数百KB〜数MBになるので、この線引きで取り違えはほぼ起きません。下が、実際に「偽物(数KB)」と「本物(数百KB)」を並べた比較です。

さらに大事なのが「本物優先」の判定です。429のエラー痕がログに残っていても、本物サイズの画像がちゃんと生成できていれば、それは成功として採用する。逆に、サイズが小さい”ゴミ”しか無ければ、429が無くても問答無用で拒否してエラーを返します。「偽物を成功と偽らない」——これが自動化を壊さないための肝でした。
仕組み2:429を検知したら「クールダウン」を覚える
偽物を弾けても、毎回エラーを叩きにいくのは無駄です。そこで2つ目は、枯渇(429)を一度踏んだら、それを記録しておく仕組みです。
具体的には、生成直後に agy の会話ログ(DB)を走査して、RESOURCE_EXHAUSTED / QUOTA_EXHAUSTED といった枯渇マーカーが出ていないかをチェックします。出ていたら、レスポンスに含まれる「あと何秒で回復するか(reset delay)」から復帰時刻を計算して保存。次にツールが呼ばれたときは、その時刻までそもそも agy を起動しません(=また偽物を作らせない・また怒られない)。
| 状況 | 素のagy | 自作ツール(クールダウン記録あり) |
|---|---|---|
| 枯渇直後にまた生成 | また叩いて429/偽物を返す | 復帰時刻まで起動をスキップ |
| 無駄なリトライ | エラーの連打になりがち | クールダウン中は即座に「待機中」と返す |
| 誤検知のリスク | — | DB走査は直近分だけに限定して低減 |
ちなみに走査は直近のログだけに絞っています。古い別セッションの429を拾って「枯渇していないのに枯渇判定」してしまう誤検知を避けるためです。地味ですが、ここを雑にやると逆に使えなくなります。
仕組み3:--wait-quota で「枯渇しても自動で待って再開」
3つ目は、運用をラクにするための仕上げです。枯渇を検知して止まるのは安全ですが、毎回手動で時間を計って叩き直すのは面倒。そこで「枯渇したら、回復まで自動で待って続きをやる」オプションを付けました。
--wait-quota(短縮 -W)を付けて実行すると、クールダウン中でも回復時刻まで自動でスリープしてから再開します。張り付いて待つ必要はありません。下が実際の動作ログです。

--wait-quotaで回復まで自動待機し、本物の画像を取得して採用。
暴走防止に待機の上限(既定30分)も設けてあり、それを超える場合は無限待機せずに諦めて明示エラーを返します。あわせて、呼び出し間隔を少し空けるスロットリングも入れて、バースト(一気に叩きすぎ)でレート制限を踏むこと自体を減らしています。
使い方:難しい設定はいらない
仕組みは3つですが、使う側は意識しなくてOKです。MCPツールとして登録しておけば、Claude Code / Codex / Antigravity から画像生成を頼むだけで、偽物拒否もクールダウンも裏で効きます。自動で待たせたいときだけ --wait-quota を足す、という感覚です。
- MCPの起動コマンドを
node bootstrap.jsに向けておくと、再起動のたびに最新へ自動更新される(手動アップデート不要)。 - 自動更新を切りたい人は環境変数
NB_AUTO_UPDATE=0で無効化できる。 - 枯渇時に待ってほしいときだけ
--wait-quota(-W)を付ける。待ち上限は既定30分。
まとめ:制限は消せない。でも「事故」は消せる
正直に書くと、このツールで Antigravity のレート制限そのものが無くなるわけではありません。無料枠の壁は Google 側の話なので、根本解決は「課金(Billing)を有効にする」しかない、というのが前の記事の結論でした。
ただ、「偽のダミー画像を本物と取り違える」「枯渇したのに無駄に叩き続けて怒られる」といった”事故”は、コード側の工夫でほぼ潰せます。
- 偽物は → サイズ(20KB未満)で機械的に拒否
- 枯渇は → 検知してクールダウンを記録、無駄打ちしない
- 復帰は →
--wait-quotaで自動で待って再開
同じように agy の偽画像やレート制限に振り回されている人は、「エラーにする・偽物を弾く・待つ」の3点だけでも自前のラッパーに入れておくと、ぐっと安定します。私の体験が、同じ落とし穴の回避に少しでも役立てば幸いです。
よくある質問
- Q: このツールを使えば無料で大量に画像を作れる? A: いいえ。レート制限・無料枠の壁は Google 側のものなので消えません。このツールが消すのは「偽物を掴む/無駄に叩く」事故のほうです。安定して量産したいなら課金(Billing有効化)が前提です。
- Q: 偽ダミー画像の判定(20KB未満)で、本物を間違って捨てない? A: 本物の生成画像は通常数百KB以上なので、まず誤判定しません。加えて「本物が1枚でもあれば採用」する優先ロジックも入れています。
- Q:
--wait-quotaはずっと待ち続ける? A: いいえ。既定で30分の上限があり、超えたら無限待機せず明示的にエラーを返します。上限は環境変数で変更できます。 - Q: どこで使える? A: MCP対応のクライアント(Claude Code / Codex / Antigravity など)から、画像生成ツールとして呼び出せます。
あわせて読みたい
出典(一次情報・2026年6月確認)
- 本記事の実装・検証ログ:筆者が自作した nano-banana-mcp のソースコードおよび実機での動作(2026-06/偽ダミー判定
DUMMY_IMAGE_MAX_BYTES=20000、429検知・クールダウン永続化、--wait-quotaの自動待機) - Antigravity(Google)公式ドキュメント — MCP
- 関連する画像生成の課金・制限の裏取りは上記「あわせて読みたい」2記事(実機検証+Google公式pricing/rate-limits)を参照