Hub documentation

Guia de Webhooks: crie um bot de Discussão com respostas de LLM

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Guia de Webhooks: crie um bot de Discussão com respostas de LLM

Aqui está um guia rápido sobre como usar os Hugging Face Webhooks para criar um bot que responde a comentários em Discussões no Hub com uma resposta gerada por um LLM de sua escolha via Hugging Face Inference Providers.

Crie seu Webhook em seu perfil de usuário

Primeiro, vamos criar um Webhook a partir das suas configurações.

  • Insira alguns repositórios de destino para os quais o seu Webhook irá ouvir.
  • Você pode inserir uma URL de Webhook fictícia por enquanto, mas definir seu webhook permitirá que você visualize os eventos que serão enviados a ele (e você pode reproduzi-los, o que será útil para depuração).
  • Insira um segredo, pois será mais seguro.
  • Assine os eventos da Comunidade (PRs & discussões), pois estamos criando um bot de Discussão.

Seu Webhook ficará assim:

webhook-creation

Crie um novo perfil de usuário Bot

Neste guia, criamos uma conta de usuário separada para hospedar um Space e para publicar comentários:

discussion-bot-profile

Ao criar um bot que interagir com outros usuários no Hub, pedimos que você rotule claramente a conta como “Bot” (veja o screenshot do perfil).

Crie um Space que reagirá ao seu Webhook

O terceiro passo é, na verdade, ouvir os eventos do Webhook.

Uma maneira fácil é usar um Space para isso. Usamos a conta de usuário que criamos, mas você pode fazer isso a partir da sua conta de usuário principal, se quiser.

O código do Space está aqui.

Usamos NodeJS e TypeScript para implementá-lo, mas qualquer linguagem ou framework funcionaria igualmente bem. Leia mais sobre Docker Spaces aqui.

O arquivo principal server.ts está aqui

Vamos analisar o que acontece neste arquivo:

app.post("/", async (req, res) => {
	if (req.header("X-Webhook-Secret") !== process.env.WEBHOOK_SECRET) {
		console.error("incorrect secret");
		return res.status(400).json({ error: "incorrect secret" });
	}
	...

Aqui, ouvimos as requisições POST feitas para / e, em seguida, verificamos se o cabeçalho X-Webhook-Secret é igual ao segredo que havíamos definido anteriormente (você também precisa definir o segredo WEBHOOK_SECRET nas configurações do seu Space para poder verificá-lo).

	const event = req.body.event;
	if (
		event.action === "create" &&
		event.scope === "discussion.comment" &&
		req.body.comment.content.includes(BOT_USERNAME)
	) {
		...

O payload do evento é codificado como JSON. Aqui, especificamos que executaremos nosso Webhook apenas quando:

  • o evento diz respeito a um comentário de discussão
  • o evento é uma criação, ou seja, um novo comentário foi publicado
  • o conteúdo do comentário contém @discussion-bot, ou seja, nosso bot acabou de ser mencionado em um comentário.

Nesse caso, continuaremos para a próxima etapa:

	const CHAT_API_URL =
		"https://huggingface.co/proxy/router.huggingface.co/v1/chat/completions";
	const SYSTEM_PROMPT = `You are a helpful bot that replies to discussions about machine learning. Keep your responses concise and friendly.`;

	const response = await fetch(CHAT_API_URL, {
		method: "POST",
		headers: {
			"Authorization": `Bearer ${process.env.HF_TOKEN}`,
			"Content-Type": "application/json",
		},
		body: JSON.stringify({
			model: "moonshotai/Kimi-K2.6",
			messages: [
				{ role: "system", content: SYSTEM_PROMPT },
				{ role: "user", content: req.body.comment.content },
			],
			max_tokens: 500,
		}),
	});
	if (response.ok) {
		const output = await response.json();
		const continuationText = output.choices[0].message.content;
		...

Esta é a parte mais legal: usando Hugging Face Inference Providers, chamamos um modelo de pesos abertos (moonshotai/Kimi-K2.6) com um prompt de sistema e o comentário do usuário. O modelo gera uma resposta, que extraímos de choices[0].message.content.

Você pode escolher qualquer modelo da lista de modelos disponíveis — basta substituir o campo model.

Por fim, publicaremos isso como uma resposta no mesmo tópico de discussão:

	const commentUrl = req.body.discussion.url.api + "/comment";

	const commentApiResponse = await fetch(commentUrl, {
		method: "POST",
		headers: {
			Authorization: `Bearer ${process.env.HF_TOKEN}`,
			"Content-Type": "application/json",
		},
		body: JSON.stringify({ comment: continuationText }),
	});

	const apiOutput = await commentApiResponse.json();

Configure seu Webhook para enviar eventos para seu Space

Por fim, você precisará configurar seu Webhook para enviar solicitações POST para seu Space.

Primeiro, vamos obter a “URL direta” do nosso Space a partir do menu contextual. Clique em “Embed this Space” e copie a “Direct URL”.

embed this Space direct URL

Atualize seu webhook para enviar solicitações para essa URL:

webhook settings

Resultado

discussion-result

Update on GitHub