Hub documentation
Guia de Webhooks: crie um bot de Discussão com respostas de LLM
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:

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:

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

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

Resultado
