Replicate · 長任務 model callback
Replicate webhook 完成它該完成的事。
Handler 儲存輸出、通知用戶、可能再鏈一個 run。AnyHook 在 edge 端 ack Replicate,讓這些都不用在 10 秒內擠完。
時序問題
Replicate 在 model run 完成時發 webhook。這部分沒問題。問題是你想對結果做什麼:存 artifact、通知用戶、fan out 給第二個 model、發 Slack。
每一個都是一次 network round-trip。加起來常常破 10 秒。Replicate 重試,你的下游副作用跑兩次。AnyHook 把時序問題在邊界解掉,handler 維持線性、直覺。
60s–5min
Replicate run 時長(影片 model)
10s
預設 webhook ack 視窗
Replay
舊 run 一鍵重跑
加密
輸出 URL 用 AES-256-GCM 儲存
用 AnyHook 接 Replicate 完成 callback
在你的 prediction 裡把 `webhook` 參數設成 AnyHook inbound URL。Handler 下游有充足時間 fan out。
import Replicate from "replicate";
import { verifyWebhook } from "@anyhook/verify";
const replicate = new Replicate();
// 1. 啟動 prediction,callback 指到 AnyHook。
await replicate.predictions.create({
version: "...",
input: { prompt: "..." },
webhook: `https://in.anyhook.net/${userSlug}/${appSlug}`,
webhook_events_filter: ["completed"],
});
// 2. Handler — AnyHook 已經 ack 過 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 — 沒問題,還有 5 分鐘
return new Response("ok", { status: 200 });
}工程團隊常問的問題
- 支援所有 Replicate model 類型嗎?
- 支援——image、video、audio、language 都行。Webhook contract 相同。AnyHook 把 payload 當不透明 JSON,原封 forward。
- Replicate 自己就會重試了,為什麼還要 AnyHook?
- Replicate 只在 transport 失敗時重試,視窗短,而且只重試 webhook delivery、不重試你的下游商業邏輯。AnyHook 給你 10 次重試加指數退避,還能事後幾週一鍵 replay。
- 可以看 prediction 的輸出而不用回 Replicate 查嗎?
- 可以。完整 webhook payload——包含 `output` URL——加密儲存在你的 AnyHook event log,dashboard 可以檢視。
改一個 URL,保留你的 Replicate handler。
Free tier 每月含 3,000 events。沒有 SDK、沒有 code 變更——把 Replicate 指到你的 AnyHook inbound URL 就好。