Webhook Replicate làm trọn việc đã bắt đầu.

Handler (đoạn code xử lý webhook trên server của bạn) lưu output, báo cho người dùng, có khi còn chạy tiếp một lượt khác. AnyHook xác nhận (ack) với Replicate tại edge (lớp máy chủ biên của Cloudflare), nên không việc nào trong số đó phải xong trong thời hạn gửi của Replicate.

Bài toán thời gian

Replicate bắn một webhook khi một lượt chạy mô hình hoàn tất. Phần đó chạy ổn. Vấn đề là những gì bạn muốn làm với kết quả: lưu artifact, báo cho người dùng, đẩy tiếp sang một mô hình thứ hai, đăng một tin nhắn Slack.

Mỗi việc là một vòng gọi mạng, và cộng lại chúng có thể kéo dài hơn cả request. Replicate thử lại (retry), và lần thử lại cuối cùng tới khoảng một phút sau khi prediction hoàn tất. Các side effect downstream của bạn chạy hai lần, hoặc không chạy lần nào. AnyHook xử lý bài toán thời gian ngay tại ranh giới, nên handler của bạn vẫn tuần tự và dễ hiểu.

60 giây–5 phút
Thời gian một lượt chạy trên Replicate (mô hình video)
~1 phút
Lúc Replicate gửi lần thử lại cuối, tính từ khi prediction hoàn tất
Phát lại
Xử lý lại một lượt chạy cũ bằng một cú bấm
Mã hóa
URL output được lưu với AES-256-GCM

Callback lượt chạy hoàn tất của Replicate qua AnyHook

Truyền URL nhận (inbound URL) của AnyHook vào tham số `webhook` của prediction. Handler của bạn ở downstream có đủ thời gian cần thiết để fan-out (gửi một sự kiện tới nhiều đích).

import Replicate from "replicate";
import { verifyWebhook } from "anyhook-verify";

const replicate = new Replicate();

// 1. Start the prediction with AnyHook as the callback target.
await replicate.predictions.create({
  version: "...",
  input: { prompt: "..." },
  webhook: `https://in.anyhook.net/${userSlug}/${appSlug}`,
  webhook_events_filter: ["completed"],
});

// 2. Handler, runs after AnyHook has already acked Replicate.
export async function POST(req: Request) {
  if (!(await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!))) {
    return new Response("invalid", { status: 401 });
  }

  const { id, output } = await req.json();
  await persistOutput(id, output);   //  3s
  await notifyUser(id);              //  2s
  await chainNextModel(output);      // 45s, inside even Free's 60s
  return new Response("ok", { status: 200 });
}

Câu hỏi các team thường đặt ra

Cách này có dùng được với mọi loại mô hình trên Replicate không?
Có: hình ảnh, video, âm thanh, ngôn ngữ. Cơ chế webhook giống hệt nhau. AnyHook coi payload là một khối JSON nguyên vẹn, không đọc bên trong, và chuyển tiếp đúng như vậy.
Replicate đã có cơ chế thử lại. Sao tôi còn cần AnyHook?
Replicate thử lại khi lỗi ở tầng truyền tải, nhưng thời hạn ngắn và nó không thử lại logic nghiệp vụ downstream của bạn, chỉ thử lại lượt gửi webhook. AnyHook thử lại handler của bạn theo exponential backoff (khoảng chờ tăng theo cấp số nhân), tối đa 10 lần trên gói Scale, và phát lại (replay) bất kỳ sự kiện nào bằng một cú bấm trong thời gian gói của bạn còn giữ nó.
Tôi có xem được output của prediction mà không cần vào lại Replicate không?
Có. Toàn bộ payload webhook, gồm cả các URL `output`, được lưu mã hóa trong nhật ký sự kiện AnyHook của bạn: mở nó trong dashboard, hoặc đọc bằng GET /api/v1/events/{id}.
AnyHook có xác minh chữ ký của Replicate không?
Có, sau khi bạn thiết lập. Replicate ký theo cơ chế Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature). Đặt nguồn của App (một URL nhận cho một nguồn webhook, ví dụ “Stripe production”) là Standard Webhooks và dán secret lấy từ GET /v1/webhooks/default/secret của Replicate: request giả mạo bị từ chối tại edge.

Đổi một URL. Giữ nguyên handler Replicate của bạn.

Gói Free gồm 10.000 sự kiện / tháng. Không cần SDK: trỏ Replicate về URL nhận webhook của bạn trên AnyHook.