Webhook Replicate yang menuntaskan apa yang dimulainya.

Handler Anda menyimpan output, memberi tahu pengguna, mungkin merangkai run lain. AnyHook mengonfirmasi penerimaan ke Replicate di edge, jadi tidak satu pun dari itu harus selesai di dalam batas waktu pengiriman Replicate.

Masalah waktu

Replicate mengirim webhook saat run model selesai. Bagian itu berjalan baik. Masalahnya ada pada apa yang ingin Anda lakukan dengan hasilnya: menyimpan artefak, memberi tahu pengguna, fan-out ke model kedua, mengirim pesan Slack.

Masing-masing adalah satu round-trip jaringan, dan bersama-sama bisa lebih lama dari umur permintaannya. Replicate mencoba ulang, dan percobaan ulang terakhirnya datang sekitar satu menit setelah prediksi selesai. Efek samping downstream Anda terjadi dua kali, atau tidak sama sekali. AnyHook memperbaiki masalah waktu itu di perbatasan, jadi handler Anda tetap linear dan mudah dipahami.

60 dtk–5 mnt
Durasi run Replicate (model video)
~1 mnt
Saat Replicate mengirim percobaan ulang terakhirnya, setelah prediksi selesai
Putar ulang
Proses ulang run lama dengan sekali klik
Terenkripsi
URL output disimpan dengan AES-256-GCM

Callback run selesai dari Replicate lewat AnyHook

Berikan URL masuk (inbound URL) AnyHook sebagai parameter `webhook` pada prediksi Anda. Handler downstream Anda mendapat semua waktu yang dibutuhkan untuk fan-out.

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 });
}

Pertanyaan yang sering diajukan tim

Apakah ini berfungsi untuk semua jenis model Replicate?
Ya: gambar, video, audio, bahasa. Kontrak webhook-nya identik. AnyHook tidak menafsirkan payload JSON-nya dan meneruskannya utuh.
Replicate sudah punya percobaan ulang. Mengapa saya butuh AnyHook?
Replicate mencoba ulang saat terjadi kegagalan transport, tetapi rentangnya pendek dan Replicate tidak akan mencoba ulang logika bisnis downstream Anda, hanya pengiriman webhook-nya. AnyHook mencoba ulang handler Anda dengan backoff eksponensial, hingga 10 upaya di paket Scale, dan memutar ulang (replay) event apa pun dengan sekali klik selama paket Anda masih menyimpannya.
Bisakah saya melihat output prediksi tanpa membuka Replicate lagi?
Ya. Payload webhook lengkap, termasuk URL `output`, disimpan terenkripsi di log event AnyHook Anda: buka di dashboard, atau baca dengan GET /api/v1/events/{id}.
Apakah AnyHook memverifikasi tanda tangan Replicate?
Ya, setelah Anda mengaturnya. Replicate menandatangani dengan skema Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature). Atur sumber App ke Standard Webhooks dan tempel secret dari GET /v1/webhooks/default/secret milik Replicate: permintaan palsu ditolak di edge.

Ganti satu URL. Handler Replicate Anda tetap.

Paket Free mencakup 10 rb event / bulan. Tanpa SDK: arahkan Replicate ke URL masuk AnyHook Anda.