始めた処理を最後まで終わらせる Replicate Webhook。
ハンドラーは出力を保存し、ユーザーに通知し、場合によっては次の実行をつなげます。AnyHook がエッジで Replicate に応答するので、そのどれも Replicate の配信期限内に終わらせる必要はありません。
タイミングの問題
Replicate はモデルの実行が完了すると Webhook を送ります。そこは問題なく動きます。問題は、その結果で何をしたいかです。生成物を永続化する、ユーザーに通知する、別のモデルにも渡す、Slack にメッセージを投稿する、といった処理です。
どれもネットワークの往復が必要で、合わせるとリクエストの持ち時間を超えることがあります。Replicate はリトライしますが、最後のリトライは prediction の完了から約 1 分後です。下流の副作用は 2 回起きるか、まったく起きないかのどちらかになります。AnyHook はこのタイミングの問題を境界で解決するので、ハンドラーは素直で分かりやすいままです。
60 秒〜5 分
Replicate の実行時間(動画モデル)
約 1 分
prediction の完了から Replicate が最後のリトライを送るまで
再送
過去の実行を 1 クリックで再処理
暗号化
出力 URL を AES-256-GCM で保存
Replicate の完了コールバックを AnyHook 経由で受ける
prediction の `webhook` パラメーターに AnyHook の受信 URL を渡します。下流のハンドラーは、複数の処理に振り分けるのに必要なだけ時間をかけられます。
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 });
}よくある質問
- Replicate のすべての種類のモデルで使えますか?
- はい。画像、動画、音声、言語のどれでも使えます。Webhook の仕様は同じです。AnyHook はペイロードを中身を解釈しない JSON として扱い、そのまま転送します。
- Replicate にはすでにリトライがあります。なぜ AnyHook が必要なのですか?
- Replicate は通信の失敗に対してリトライしますが、その期間は短く、リトライするのは Webhook の配信だけで、下流のビジネスロジックはリトライしません。AnyHook は指数バックオフでハンドラーにリトライし(Scale プランで最大 10 回)、再送可能期間内であれば、どのイベントも 1 クリックで再送できます。
- Replicate を再度確認しなくても、prediction の出力を見られますか?
- はい。`output` の URL を含む Webhook のペイロード全体が、AnyHook のイベントログに暗号化して保存されています。ダッシュボードで開くか、GET /api/v1/events/{id} で読み取れます。
- AnyHook は Replicate の署名を検証しますか?
- はい、設定すれば検証します。Replicate は Standard Webhooks 方式(webhook-id、webhook-timestamp、webhook-signature)で署名します。App(Webhook の送信元ごとに作る受信設定)の送信元を Standard Webhooks にして、Replicate の GET /v1/webhooks/default/secret で取得したシークレットを貼り付けると、偽造リクエストはエッジで拒否されます。
変えるのは URL 1 つだけ。Replicate のハンドラーはそのまま。
Free プランには月 10,000 件が含まれます。SDK は不要です。Replicate の Webhook を AnyHook の受信 URL に向けるだけです。