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 に向けるだけです。