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 就好。