1M トークンのコンテキストに対応する Gemini Webhook。

Gemini の長いコンテキストの呼び出しには 30〜60 秒かかります。Webhook ハンドラーから呼ぶには、これまではポーリングかキューが必要でした。AnyHook なら、どちらも要りません。

タイミングの問題

Gemini API は Standard Webhooks の仕様に沿って Webhook を配信し、失敗した配信を指数バックオフで 24 時間リトライします。そのため、遅いハンドラーには何度も繰り返し届きます。

1M トークンのコンテキストに対する Gemini 1.5 Pro の呼び出しには 30〜60 秒かかります。たとえば Stripe のイベントのたびに非公開のコーパスで RAG を行うために、これを Webhook ハンドラーに入れると、期限内に応答できません。リトライが積み重なり、コストも膨らみます。

30〜60 秒
Gemini の長いコンテキストの呼び出しにかかる時間
1M
Gemini のコンテキストに入るトークン数
24 時間
Gemini が失敗した Webhook をリトライし続ける期間
$0
Free プランで月 10,000 件まで

Webhook ハンドラーで長いコンテキストの Gemini を使う

AnyHook が応答して転送します。Gemini の呼び出しは、コーパス全体を対象に実行できます。ポーリングのループも、Redis のキューも、Cloud Tasks も不要です。

import { verifyWebhook } from "anyhook-verify";
import { GoogleGenerativeAI } from "@google/generative-ai";

const gemini = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!);

export async function POST(req: Request) {
  if (!(await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!))) {
    return new Response("invalid", { status: 401 });
  }

  const event = await req.json();

  // Run RAG over the full corpus. 45 seconds. Stripe doesn't care.
  const model = gemini.getGenerativeModel({ model: "gemini-1.5-pro" });
  const result = await model.generateContent([
    fullCorpusFor(tenantOf(event)),
    `Process: ${JSON.stringify(event)}`,
  ]);

  await persistDecision(result.response.text());
  return new Response("ok", { status: 200 });
}

よくある質問

AnyHook は Gemini の Webhook 署名方式に対応していますか?
はい。Gemini は Standard Webhooks 方式で署名します。App(Webhook の送信元ごとに作る受信設定)の送信元を Standard Webhooks にして署名シークレットを貼り付ければ、AnyHook が転送前に各配信をエッジで検証します。
Gemini の呼び出しがレート制限に引っかかったら?
ハンドラーから 429 を返してください。AnyHook はそれをリトライ対象として扱い、指数バックオフを適用し、一連のリトライをダッシュボードに表示します。クォータがリセットされたら、元のイベントを再送できます。
Gemini API の Webhook 専用ですか?Vertex AI にも使えますか?
両方に使えます。HTTP の Webhook を送るものなら何でも AnyHook を経由できます。ドキュメントに載っている方式(Standard Webhooks を含む)の署名はエッジで検証します。それ以外の送信元は Generic(汎用)として扱われ、元のヘッダーが転送されるので、自分で検証できます。

変えるのは URL 1 つだけ。Gemini のハンドラーはそのまま。

Free プランには月 10,000 件が含まれます。SDK は不要です。Gemini の Webhook を AnyHook の受信 URL に向けるだけです。