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.
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.