扛得住 45 秒处理程序的 OpenAI Webhook。

你的处理程序在做真正的工作:RAG、再调一次模型、一个数据库事务。OpenAI 给它几秒钟。AnyHook 约 1 秒返回 200,让你的处理程序最长可以跑到套餐的投递超时,不超出套餐的计算额度。

时限问题

OpenAI 的后台响应、批处理任务和微调任务都通过 HTTP 回报结果,要求几秒内返回 2xx,之后最多重试 72 小时。只要你的处理程序做点有意思的事,比如再串一次模型调用、做一次向量检索、调一下 Stripe,就会超时。

一旦超时,OpenAI 就会重试。你的处理程序再跑一遍。现在你要为 token 付两次钱,下游系统也会看到重复数据。解决办法不是把超时调长,而是采用先应答、后处理的模式。

72 小时
OpenAI 持续重试漏掉的 Webhook 的时长
45–90 秒
在处理程序里跑智能体的典型耗时
2×
重试触发时的 token 成本
约 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 的来源设为 Standard Webhooks,粘贴该 Webhook 的签名密钥(whsec_...):AnyHook 在边缘节点验证签名、拒收伪造请求,再用 AnyHook-Signature 为发往你端点的每次投递重新签名。
如果我的处理程序宕机一小时,会怎样?
AnyHook 会把事件放进队列,按指数退避重试:Free 套餐最多 3 次,Pro 套餐 5 次,Scale 套餐 10 次。每次尝试都有日志记录,并且可以在控制台重放。OpenAI 收到一次 200 就不再管了。
支持哪些 OpenAI 事件?
OpenAI 通过 Webhook 发送的所有事件:后台响应(response.completed,以及对应的 failed、cancelled 和 incomplete 事件)、批处理任务、微调任务和评估运行。流式输出不是 Webhook:它是你的代码直接读取的流,所以从不经过 AnyHook。

只改一个 URL。OpenAI 处理程序不用动。

Free 套餐包含每月 10,000 个事件。无需 SDK:把 OpenAI 指向你的 AnyHook 接收 URL。