OpenAI · webhook 可靠性

讓 OpenAI webhook 撐得住 45 秒的 handler。

你的 handler 在做真的工作——RAG、再一次模型呼叫、寫 DB。OpenAI 在等 10 秒。AnyHook 在 50ms 回 200,handler 用自己的時間跑完。

時序問題

OpenAI 的 Assistants、Batch、fine-tuning 事件都走 HTTP,要求 10 秒內回 2xx。一旦 handler 做點實事——鏈一個 model call、跑 vector search、打 Stripe——就會超時。

超時 OpenAI 就重試,handler 跑第二次。Token 算兩次錢,下游收到重複事件。解法不是把 timeout 拉長,是把 ack 跟 process 分開。

10s
OpenAI webhook 回應 SLA
45–90s
Agent-in-handler 的典型延遲
重試觸發時的 token 成本
50ms
AnyHook edge ack 時間

Drop-in 替換:改一個 webhook URL

現有 handler 不用改。AnyHook 在 edge 50ms 回 200 給 OpenAI,然後把驗過簽的 payload 用 AnyHook-Signature 重新簽過 forward 給你,附帶 retry、replay、event log。

// 1. 把 OpenAI 的 webhook URL 指到你的 AnyHook inbound:
//    https://in.anyhook.net/{user-slug}/{app-slug}
//
// 2. Handler 不用改 — 現在有充足時間完成工作。
//    AnyHook 每次 delivery 都用 AnyHook-Signature 重新簽。

import { verifyWebhook } from "@anyhook/verify";

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

  const event = await req.json();

  // 任意花時間都行。AnyHook 已經回過 200 給 OpenAI。
  // 你失敗,AnyHook 用指數退避最多重試 10 次。
  await ragPipeline(event.payload);     // 25s
  await secondModelCall(event.payload); // 18s
  await persistResult(event.payload);   // 2s

  return new Response("ok", { status: 200 });
}

工程團隊常問的問題

我會失去 OpenAI 的 signature 驗證嗎?
不會。AnyHook 在 edge 先驗 OpenAI 的原始簽章,通過才接受事件,然後用 AnyHook-Signature 重新簽過再 forward 給你的 endpoint。你只要驗一個 header,不用記五個。
Handler 掛一小時會發生什麼?
AnyHook 把事件入隊,依照你的 plan 用指數退避最多重試 10 次。每次嘗試都有 log、都可以從 dashboard 一鍵 replay。OpenAI 看到一個 200 就過了。
支援 Assistants v2 的 streaming 事件嗎?
支援。Streaming 完成事件最後會以一般 webhook 形式 deliver。AnyHook 把它當一般事件——驗證、ack、fan out。

改一個 URL,保留你的 OpenAI handler。

Free tier 每月含 3,000 events。沒有 SDK、沒有 code 變更——把 OpenAI 指到你的 AnyHook inbound URL 就好。