處理 1M token 上下文的 Gemini Webhook。

Gemini 的長上下文呼叫要 30–60 秒。以前要從 Webhook 處理程式觸發一次,不是輪詢就是佇列。用 AnyHook,兩者都不用。

時限問題

Gemini API 依 Standard Webhooks 規格傳遞 Webhook,失敗的傳遞會以指數退避重試 24 小時,所以慢的處理程式會被一再打到。

對 1M token 的上下文發出一次 Gemini 1.5 Pro 呼叫,要 30 到 60 秒。把它包進 Webhook 處理程式(例如每個 Stripe 事件都對私有語料做 RAG),就代表你無法及時回應。重試越堆越多,成本也跟著疊加。

30–60 秒
Gemini 長上下文呼叫的延遲
1M
單一 Gemini 上下文的 token 數
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 的配額重置後,你可以重播原始事件。
這只適用於 Gemini API 的 Webhook,還是 Vertex AI 也可以?
兩者都可以。任何發送 HTTP Webhook 的服務都能經過 AnyHook。文件列出的簽章機制(包括 Standard Webhooks)會在邊緣節點檢查;不在其中的發送端以 Generic 來源執行,原本的標頭會一併轉送,讓你自己檢查。

換一個網址。Gemini 的處理程式不用改。

Free 方案每月涵蓋 10,000 個事件。不用 SDK:把 Gemini 指向你的 AnyHook 接收網址。