ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-06-14上級

Managed Agents API のバッチを、途中で落ちても作り直さない形にした記録

Managed Agents API で 200 件規模のバッチを回すと、途中失敗のたびに前半をやり直してトークンを溶かしていました。チェックポイントと冪等キーを足して、落ちた箇所から再開できるようにした設計と実装をまとめます。

Antigravity230Managed Agents2エージェント35冪等性3チェックポイント2Python12

プレミアム記事

Managed Agents API でまとまった量の処理を回し始めて、最初に痛い目を見たのは「途中で 1 件こけると、前半の成功分まで巻き添えにしてやり直していた」ことでした。

200 件の記事メタデータを 1 件ずつエージェントに整形させるバッチを組んだとき、137 件目で API が 503 を返しました。スクリプトはそこで例外を投げて停止し、私はつい python batch.py を再実行しました。すると 1 件目から走り出します。前半 136 件分の推論コストが、そのまま二度払いになりました。

クラウド側で実行が完結する Managed Agents は、手元の CLI エージェントと違って「途中状態がプロセスのメモリではなくサービス側にある」ぶん、再開の設計を自分で用意しないと、こうした取りこぼしが静かにコストへ変わります。本稿は、その再開の仕組みを少しずつ足していった記録です。コードは執筆時点(2026年6月14日)の公開プレビュー挙動に基づきます。

何が「やり直し」を生んでいたか

素朴なバッチは、だいたいこういう形をしています。

import os
from google import genai
 
client = genai.Client(api_key=os.environ["YOUR_GEMINI_API_KEY"])
 
def run_batch(items):
    results = []
    for item in items:
        op = client.agents.run(
            agent="managed-default",
            input=item["payload"],
        )
        result = poll_until_done(op)  # 完了までポーリング
        results.append(result)
    return results

このコードには、再開の観点で次の 3 つの穴があります。

  1. 進捗がメモリ上の results にしか無いことです。プロセスが死ねば、どこまで進んだかの記録ごと消えます。
  2. client.agents.run() の呼び出しに識別子が無いことです。同じ item を二度投げれば、サービス側は素直に二度実行します。クラウド実行はここが手元と決定的に違う落とし穴で、後述の冪等キーで回避します。
  3. 失敗の種類を区別していないことです。503(一時的)も、入力不正の 400(恒久的)も、同じ例外として全体を止めます。本来、前者は待って再試行、後者はスキップして記録、という別々の扱いが要ります。

この 3 点は、本番運用に乗せるバッチほど効いてきます。順番に塞いでいきます。

チェックポイントを外部に置く

まず、進捗をプロセスの外に逃がします。大げさな仕組みは要らず、個人開発の規模なら SQLite 一枚で十分でした。

import sqlite3, json, time
 
class Checkpoint:
    def __init__(self, path="batch_state.db"):
        self.db = sqlite3.connect(path)
        self.db.execute("""
            CREATE TABLE IF NOT EXISTS items (
                key TEXT PRIMARY KEY,
                status TEXT NOT NULL,        -- pending / claimed / done / failed
                op_name TEXT,                -- サービス側の実行 ID
                result TEXT,
                updated_at REAL
            )
        """)
        self.db.commit()
 
    def seed(self, items):
        for it in items:
            self.db.execute(
                "INSERT OR IGNORE INTO items(key, status, updated_at) VALUES (?, 'pending', ?)",
                (it["key"], time.time()),
            )
        self.db.commit()
 
    def pending_keys(self):
        cur = self.db.execute(
            "SELECT key FROM items WHERE status IN ('pending', 'claimed')"
        )
        return [row[0] for row in cur.fetchall()]
 
    def set(self, key, status, op_name=None, result=None):
        self.db.execute(
            "UPDATE items SET status=?, op_name=COALESCE(?, op_name), "
            "result=COALESCE(?, result), updated_at=? WHERE key=?",
            (status, op_name, json.dumps(result) if result else None, time.time(), key),
        )
        self.db.commit()

ポイントは statuspending / claimed / done / failed の 4 状態にしたことです。done は再実行で必ず飛ばすので、二度払いがここで止まります。再開時は pending_keys() が返す未完了分だけを処理すれば良く、137 件目で落ちても次回は 137 件目から走り出します。

key には、入力から決まる安定した値(記事スラッグなど)を使います。実行ごとに変わる UUID を振ると、再開時に「同じ仕事」と認識できず、結局やり直しになります。安定キーは再開設計の土台です。

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

この記事の続きを読む

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

この記事で得られること
200 件のバッチを途中失敗から再開できるよう、SQLite を使った最小のチェックポイントストアを動くコードで示します
クラウド実行特有の二重起動を、idempotency key と「予約 → 実行 → 確定」の3状態でどう塞いだかを共有します
再開設計を入れる前と後で、失敗 1 回あたりの無駄トークンが約 60% 減った実測値と、その内訳をお伝えします
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Agents & Manager2026-06-12
Managed Agents API を動かして考えた、クラウド実行と手元実行の境界線
Gemini API の Managed Agents(公開プレビュー)を Python から起動し、ポーリング・アーティファクト回収・コストガードまで実装した記録です。手元の CLI エージェントとの使い分け基準も5項目にまとめました。
Agents & Manager2026-05-24
Antigravity の長時間バッチエージェントを完走させる — 4層の耐久設計と私の実装メモ
数時間〜数日にわたるバッチエージェントは、必ずどこかで落ちます。Antigravity を 5,000万DL アプリ事業の運営自動化に組み込んだ実体験から、チェックポイント粒度・永続化レイヤ・冪等リストア・コンテキスト要約という 4 層の耐久設計を、実装コード・コスト試算・運用判断まで踏み込んでまとめました。
Agents & Manager2026-04-08
Antigravity AgentKit 2.0 実行時エラー完全解決ガイド — tool_call失敗・無限ループ・コンテキスト超過の診断と修正
AgentKit 2.0でエージェントを本番運用する際に発生するランタイムエラーを完全解説。tool_call失敗の診断・無限ループの防止・コンテキストウィンドウ超過の対策・並列エージェントの同期エラーまで実装コード付きで解決します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →