Webhook OpenAI yang tetap selamat meski handler butuh 45 detik.
Handler Anda mengerjakan pekerjaan sungguhan: RAG, panggilan model berikutnya, transaksi DB. OpenAI memberinya beberapa detik. AnyHook mengembalikan 200 dalam sekitar 1 detik dan memberi handler Anda waktu hingga batas waktu pengiriman paket Anda untuk selesai, dalam jatah komputasi (compute allowance) paket Anda.
Masalah waktu
Background response, batch job, dan fine-tuning job OpenAI semuanya melapor balik lewat HTTP dan mengharapkan 2xx dalam beberapa detik, lalu mencoba ulang hingga 72 jam. Begitu handler Anda melakukan sesuatu yang menarik, seperti merangkai panggilan model kedua, melakukan vector search, atau memanggil Stripe, Anda langsung melewati batas itu.
Saat batas itu terlewati, OpenAI mencoba ulang. Handler Anda berjalan lagi. Kini Anda membayar token dua kali dan sistem downstream Anda melihat duplikat. Solusinya bukan timeout yang lebih panjang, melainkan pola ack-and-process yang terpisah.
Pengganti drop-in: ganti URL webhook
Handler yang sudah ada tidak perlu diubah. AnyHook mengonfirmasi penerimaan ke OpenAI dalam sekitar 1 detik di edge, lalu meneruskan payload yang sudah diverifikasi ke endpoint Anda, lengkap dengan percobaan ulang (retry), putar ulang (replay), dan log event.
// 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 });
}Pertanyaan yang sering diajukan tim
- Apakah saya kehilangan verifikasi tanda tangan OpenAI?
- Tidak. OpenAI menandatangani dengan skema Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature). Atur sumber App ke Standard Webhooks dan tempel signing secret webhook-nya (whsec_...): AnyHook memeriksanya di edge dan menolak permintaan palsu, lalu menandatangani ulang setiap pengiriman ke endpoint Anda dengan AnyHook-Signature.
- Apa yang terjadi jika handler saya mati selama satu jam?
- AnyHook memasukkan event ke antrean dan mencoba ulang dengan backoff eksponensial: hingga 3 upaya di paket Free, 5 di Pro, 10 di Scale. Setiap upaya dicatat dan dapat diputar ulang dari dashboard. OpenAI melihat satu 200 dan lanjut.
- Event OpenAI apa saja yang dicakup?
- Apa pun yang dikirim OpenAI lewat webhook: background response (response.completed beserta saudaranya, failed, cancelled, dan incomplete), batch job, fine-tuning job, dan eval run. Streaming bukan webhook: streaming adalah aliran yang dibaca langsung oleh kode Anda, jadi tidak pernah melewati AnyHook.
Ganti satu URL. Handler OpenAI Anda tetap.
Paket Free mencakup 10 rb event / bulan. Tanpa SDK: arahkan OpenAI ke URL masuk AnyHook Anda.