Back
UPDATE
2 months ago
BennyKokBennyKok

Introducing Webhook

Talk about webhook integration with ComfyDeploy API

Workflow

We have recently added webhook support.

When you create a run, you can also pass in a webhook endpoint to receive the callback.

export async function generate(prompt: string) {
    const headersList = headers();
    const host = headersList.get("host") || "";
    const protocol = headersList.get("x-forwarded-proto") || "";
    const endpoint = `${protocol}://${host}`;

    return await client.run({
        deployment_id: process.env.COMFY_DEPLOYMENT_ID!,
        inputs: {
            "positive_prompt": prompt
        },
        webhook: `${endpoint}/api/webhook`
    })
}

For the webhook route, here’s an example.

import { parseWebhookDataSafe } from "comfydeploy";
import { NextResponse } from "next/server";

export async function POST(request: Request) {
    const [_data, error] = await parseWebhookDataSafe(request);
    if (!_data || error) return error;

    const { status, run_id, outputs } = _data;

    // Do your things
    console.log(status, run_id, outputs);

    return NextResponse.json({ message: "success" }, { status: 200 });
}

p.s. You might want to keep track of some extra metadata for the run, you can also do so with query pararms

webhook: `${endpoint}/api/webhook?userId=b190ce97-d7ae-40fa-948c-79304ae7ac9b`

And here’s how to get it back.

export async function POST(request: Request) {
    const [_data, error] = await parseWebhookDataSafe(request);
    if (!_data || error) return error;

    const { status, run_id, outputs } = _data;

    const url = new URL(request.url);
    const queryParams = Object.fromEntries(url.searchParams);
    const userId = queryParams["userId"]

    // Do your things
    console.log(status, run_id, outputs);

    return NextResponse.json({ message: "success" }, { status: 200 });
}