Webhooks da Replicate que terminam o que começam.

Seu handler armazena a saída, avisa o usuário e talvez encadeie outra execução. O AnyHook responde à Replicate na edge, então nada disso precisa terminar dentro da janela de entrega da Replicate.

O problema do tempo

A Replicate dispara um webhook quando a execução de um modelo termina. Essa parte funciona bem. O problema é o que você quer fazer com o resultado: gravar o artefato, avisar o usuário, enviar para um segundo modelo, postar uma mensagem no Slack.

Cada uma dessas etapas é uma ida e volta pela rede e, juntas, podem durar mais que a requisição. A Replicate tenta de novo, e a última nova tentativa chega cerca de um minuto depois de a prediction terminar. Seus efeitos colaterais disparam duas vezes, ou nenhuma. O AnyHook resolve o problema do tempo na fronteira, então seu handler continua linear e óbvio.

60 s-5 min
Duração de uma execução na Replicate (modelos de vídeo)
~1 min
Quando a Replicate envia a última nova tentativa, depois que a prediction termina
Replay
Reprocesse uma execução antiga com um clique
Criptografia
URLs de saída armazenadas com AES-256-GCM

Callbacks de execução concluída da Replicate pelo AnyHook

Passe a URL de entrada do AnyHook como o parâmetro `webhook` da sua prediction. Seu handler ganha todo o tempo de que precisa para enviar o resultado a vários serviços.

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

Perguntas que as equipes fazem

Isso funciona com todos os tipos de modelo da Replicate?
Sim: imagem, vídeo, áudio, linguagem. O contrato do webhook é idêntico. O AnyHook trata o payload como JSON opaco e o encaminha intacto.
A Replicate já tem novas tentativas. Por que preciso do AnyHook?
A Replicate tenta de novo em falhas de transporte, mas a janela dela é curta e ela não tenta de novo a sua lógica de negócio, só a entrega do webhook. O AnyHook tenta de novo no seu handler com backoff exponencial, até 10 tentativas no Scale, e faz o replay de qualquer evento com um clique enquanto seu plano o mantiver guardado.
Consigo ver a saída da prediction sem consultar a Replicate de novo?
Sim. O payload inteiro do webhook, incluindo as URLs de `output`, fica armazenado com criptografia no seu log de eventos do AnyHook: abra no painel ou leia com GET /api/v1/events/{id}.
O AnyHook verifica a assinatura da Replicate?
Sim, depois que você configura. A Replicate assina com o padrão Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature). Defina a origem do app como Standard Webhooks e cole o segredo retornado pelo GET /v1/webhooks/default/secret da Replicate: a edge rejeita requisições forjadas.

Troque uma URL. Mantenha seu handler de Replicate.

O plano Free cobre 10 mil eventos / mês. Sem SDK: aponte os webhooks de Replicate para sua URL de entrada do AnyHook.