Skip to main content

replicate-webhooks

Receive and verify Replicate webhooks. Use when setting up Replicate webhook handlers, debugging signature verification, or handling prediction events like start, output, logs, or completed.

소스 정보

저장소
hookdeck/webhook-skills
최근 소스 활동
2026년 5월 11일 12:14
감지된 SKILL.md 언어
영어
스타
89
포크
14

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

파일 탐색기
22 개 파일

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
replicate-webhooks
description
Receive and verify Replicate webhooks. Use when setting up Replicate webhook handlers, debugging signature verification, or handling prediction events like start, output, logs, or completed.
license
MIT
metadata
{"author":"hookdeck","version":"0.1.0","repository":"https://github.com/hookdeck/webhook-skills"}
# Replicate Webhooks ## When to Use This Skill - Setting up Replicate webhook handlers - Debugging signature verification failures - Understanding Replicate event types and payloads - Handling prediction lifecycle events (start, output, logs, completed) ## Essential Code (USE THIS) ### Express Webhook Handler ```javascript const express = require('express'); const crypto = require('crypto'); const app = express(); // CRITICAL: Use express.raw() for webhook endpoint - Replicate needs raw body app.post('/webhooks/replicate', express.raw({ type: 'application/json' }), async (req, res) => { // Get webhook headers const webhookId = req.headers['webhook-id']; const webhookTimestamp = req.headers['webhook-timestamp']; const webhookSignature = req.headers['webhook-signature']; // Verify we have required headers if (!webhookId || !webhookTimestamp || !webhookSignature) { return res.status(400).json({ error: 'Missing required webhook headers' }); } // Manual signature verification (recommended approach) const secret = process.env.REPLICATE_WEBHOOK_SECRET; // whsec_xxxxx from Replicate const signedContent = `${webhookId}.${webhookTimestamp}.${req.body}`; try { // Extract base64 secret after 'whsec_' prefix const secretBytes = Buffer.from(secret.split('_')[1], 'base64'); const expectedSignature = crypto .createHmac('sha256', secretBytes) .update(signedContent) .digest('base64'); // Replicate can send multiple signatures, check each one const signatures = webhookSignature.split(' ').map(sig => { const parts = sig.split(','); return parts.length > 1 ? parts[1] : sig; }); const isValid = signatures.some(sig => { try { return crypto.timingSafeEqual( Buffer.from(sig), Buffer.from(expectedSignature) ); } catch { return false; // Different lengths = invalid } }); if (!isValid) { return res.status(400).json({ error: 'Invalid signature' }); } // Check timestamp to prevent replay attacks (5-minute window) const timestamp = parseInt(webhookTimestamp, 10); const currentTime = Math.floor(Date.now() / 1000); if (currentTime - timestamp > 300) { return res.status(400).json({ error: 'Timestamp too old' }); } } catch (err) { console.error('Signature verification error:', err); return res.status(400).json({ error: 'Invalid signature' }); } // Parse the verified webhook body const prediction = JSON.parse(req.body.toString()); // Handle the prediction based on its status console.log('Prediction webhook received:', { id: prediction.id, status: prediction.status, version: prediction.version }); switch (prediction.status) { case 'starting': console.log('Prediction starting:', prediction.id); break; case 'processing': console.log('Prediction processing:', prediction.id); if (prediction.logs) { console.log('Logs:', prediction.logs); } break; case 'succeeded': console.log('Prediction completed successfully:', prediction.id); console.log('Output:', prediction.output); break; case 'failed': console.log('Prediction failed:', prediction.id); console.log('Error:', prediction.error); break; case 'canceled': console.log('Prediction canceled:', prediction.id); break; default: console.log('Unknown status:', prediction.status); } res.status(200).json({ received: true }); } ); ``` ## Common Prediction Statuses | Status | Description | Common Use Cases | |--------|-------------|------------------| | `starting` | Prediction is initializing | Show loading state in UI | | `processing` | Model is running | Display progress, show logs if available | | `succeeded` | Prediction completed successfully | Process final output, update UI | | `failed` | Prediction encountered an error | Show error message to user | | `canceled` | Prediction was canceled | Clean up resources, notify user | ## Environment Variables ```bash # Your webhook signing secret from Replicate REPLICATE_WEBHOOK_SECRET=whsec_your_secret_here ``` ## Local Development For local webhook testing, install the Hookdeck CLI: ```bash ``` Then start the tunnel: ```bash npx hookdeck-cli listen 3000 replicate --path /webhooks/replicate ``` No account required. Provides local tunnel + web UI for inspecting requests. ## Reference Materials - [What are Replicate webhooks](references/overview.md) — Event types and payload structure - [Setting up webhooks](references/setup.md) — Dashboard configuration and signing secret - [Signature verification](references/verification.md) — Verification algorithm and common issues ## Resources for Implementation ### Framework Examples - [Express implementation](examples/express/) — Node.js with Express - [Next.js implementation](examples/nextjs/) — React framework with API routes - [FastAPI implementation](examples/fastapi/) — Python async framework ### Documentation - [Official Replicate webhook docs](https://replicate.com/docs/topics/webhooks) - [Webhook setup guide](https://replicate.com/docs/topics/webhooks/setup-webhook) - [Webhook verification guide](https://replicate.com/docs/topics/webhooks/verify-webhook) ## Recommended: webhook-handler-patterns Enhance your webhook implementation with these patterns: - [Handler sequence](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/handler-sequence.md) - [Idempotency](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/idempotency.md) - [Error handling](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/error-handling.md) - [Retry logic](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/retry-logic.md) ## Related Skills - [stripe-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/stripe-webhooks) - Stripe payment webhooks - [github-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/github-webhooks) - GitHub repository events - [shopify-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/shopify-webhooks) - Shopify store events - [clerk-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/clerk-webhooks) - Clerk authentication events - [webhook-handler-patterns](https://github.com/hookdeck/webhook-skills/tree/main/skills/webhook-handler-patterns) - Idempotency, error handling, retry logic - [hookdeck-event-gateway](https://github.com/hookdeck/webhook-skills/tree/main/skills/hookdeck-event-gateway) - Webhook infrastructure that replaces your queue — guaranteed delivery, automatic retries, replay, rate limiting, and observability for your webhook handlers
GitHub에서 보기