45 秒かかるハンドラーでも失敗しない OpenAI Webhook。
ハンドラーは RAG、別のモデル呼び出し、DB トランザクションといった実際の処理をしています。OpenAI が与える時間は数秒です。AnyHook は約 1 秒で 200 を返し、コンピュート枠の範囲内で、プランのタイムアウトまでハンドラーに処理を終える時間を与えます。
タイミングの問題
OpenAI のバックグラウンドレスポンス、バッチジョブ、ファインチューニングジョブは、どれも HTTP で結果を通知し、数秒以内の 2xx を求め、その後最大 72 時間リトライします。別のモデル呼び出しをつなげる、ベクトル検索をする、Stripe の API を呼ぶなど、ハンドラーで意味のある処理をした途端に期限を超えてしまいます。
期限を超えると OpenAI はリトライし、ハンドラーがもう一度実行されます。トークン代を 2 回払うことになり、下流のシステムには重複が届きます。解決策はタイムアウトを延ばすことではなく、応答と処理を分けるパターンです。
72 時間
OpenAI が失敗した Webhook をリトライし続ける期間
45〜90 秒
ハンドラー内のエージェントの一般的な所要時間
2×
リトライが走ったときのトークンコスト
約 1 秒
AnyHook のエッジの応答時間:リクエストがしばらく途絶えたあとは 1.1 秒、混んでいるときはそれより短い
そのまま置き換え:Webhook の URL を変えるだけ
既存のハンドラーは変更不要です。AnyHook はエッジで約 1 秒で OpenAI に応答し、検証済みのペイロードをエンドポイントに転送します。リトライ、再送、イベントログもすべて付いています。
// 1. Point OpenAI's webhook URL at your AnyHook inbound:
// https://in.anyhook.net/{user-slug}/{app-slug}
//
// 2. Keep your existing handler, it now has all the time it needs.
// AnyHook re-signs every delivery with AnyHook-Signature.
import OpenAI from "openai";
import { verifyWebhook } from "anyhook-verify";
const openai = new OpenAI();
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 });
// OpenAI's own event, byte for byte: { type: "response.completed", data: { id }, ... }
const event = await req.json();
if (event.type !== "response.completed") return new Response("ok");
const response = await openai.responses.retrieve(event.data.id);
// Run anything here. AnyHook already returned 200 to OpenAI.
// If you fail, AnyHook retries with backoff (up to 10 attempts on Scale).
await ragPipeline(response); // 25s
await secondModelCall(response); // 18s
await persistResult(response); // 2s
return new Response("ok", { status: 200 });
}よくある質問
- OpenAI の署名検証はできなくなりますか?
- いいえ。OpenAI は Standard Webhooks 方式(webhook-id、webhook-timestamp、webhook-signature)で署名します。App(Webhook の送信元ごとに作る受信設定)の送信元を Standard Webhooks にして、その Webhook の署名シークレット(whsec_...)を貼り付けてください。AnyHook がエッジで検証して偽造を拒否し、エンドポイントへの配信をすべて AnyHook-Signature で再署名します。
- ハンドラーが 1 時間ダウンしたらどうなりますか?
- AnyHook はイベントをキューに入れ、指数バックオフでリトライします。試行回数は最大で Free が 3 回、Pro が 5 回、Scale が 10 回です。すべての試行はログに残り、ダッシュボードから再送できます。OpenAI は 200 を 1 回受け取り、次に進みます。
- どの OpenAI イベントに対応していますか?
- OpenAI が Webhook で送るものすべてです。バックグラウンドレスポンス(response.completed と、その仲間の failed、cancelled、incomplete)、バッチジョブ、ファインチューニングジョブ、eval の実行です。ストリーミングは Webhook ではありません。コードが直接読み取るストリームなので、AnyHook を経由することはありません。
変えるのは URL 1 つだけ。OpenAI のハンドラーはそのまま。
Free プランには月 10,000 件が含まれます。SDK は不要です。OpenAI の Webhook を AnyHook の受信 URL に向けるだけです。