Hub documentation
Guide des Webhooks : créer un bot de Discussion avec des réponses LLM
Guide des Webhooks : créer un bot de Discussion avec des réponses LLM
Voici un guide succinct sur la façon d’utiliser les Webhooks de Hugging Face pour créer un bot qui répond aux commentaires des Discussions sur le Hub avec une réponse générée par un LLM de votre choix via Hugging Face Inference Providers.
Créez votre Webhook dans votre profil utilisateur
Tout d'abord, créons un Webhook depuis vos paramètres.
- Saisissez quelques dépôts cibles auxquels votre Webhook écoutera.
- Vous pouvez saisir une URL Webhook fictive pour l’instant, mais définir votre webhook vous permettra de consulter les événements qui y seront envoyés (et de les rejouer, ce qui sera utile pour le débogage).
- Saisissez un secret, car cela sera plus sécurisé.
- Abonnez-vous aux événements de la Communauté (PR & discussions), car nous sommes en train de créer un bot de Discussion.
Votre Webhook ressemblera à ceci :

Créer un nouveau profil d'utilisateur Bot
Dans ce guide, nous créons un compte utilisateur distinct pour héberger un Space et publier des commentaires :

Lors de la création d'un bot qui interagira avec d'autres utilisateurs sur le Hub, nous vous demandons d'indiquer clairement sur le compte qu'il s'agit d'un « Bot » (voir la capture d'écran du profil).
Créer un Space qui réagira à votre Webhook
La troisième étape consiste en réalité à écouter les événements Webhook.
Une méthode simple consiste à utiliser un Space pour cela. Nous utilisons le compte utilisateur que nous avons créé, mais vous pouvez le faire depuis votre compte utilisateur principal si vous le souhaitez.
Le code de l’espace est ici.
Nous avons utilisé NodeJS et TypeScript pour l’implémenter, mais tout autre langage ou framework fonctionnerait tout aussi bien. En savoir plus sur Docker Spaces ici.
Le fichier principal server.ts se trouve ici
Voici ce qui se passe dans ce fichier :
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" });
}
...Ici, nous écoutons les requêtes POST envoyées à /, puis nous vérifions que l’en-tête X-Webhook-Secret est égal au secret que nous avions défini précédemment (vous devez également définir le secret WEBHOOK_SECRET dans les paramètres de votre Space pour pouvoir le vérifier).
const event = req.body.event;
if (
event.action === "create" &&
event.scope === "discussion.comment" &&
req.body.comment.content.includes(BOT_USERNAME)
) {
...La charge utile de l’événement est encodée en JSON. Ici, nous spécifions que notre Webhook ne sera exécuté que lorsque :
- l'événement concerne un commentaire de discussion
- l'événement est une création, c'est-à-dire qu'un nouveau commentaire a été publié
- le contenu du commentaire contient
@discussion-bot, c’est-à-dire que notre bot vient d’être mentionné dans un commentaire.
Dans ce cas, nous passerons à l'étape suivante :
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;
...C’est la partie la plus intéressante : en utilisant Hugging Face Inference Providers, nous appelons un modèle à poids ouverts (moonshotai/Kimi-K2.6) avec un prompt système et le commentaire de l’utilisateur. Le modèle génère une réponse, que nous extrayons de choices[0].message.content.
Vous pouvez choisir n'importe quel modèle de la liste des modèles disponibles — il suffit de remplacer le champ model.
Enfin, nous le publierons en réponse dans le même fil de discussion :
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();Configurez votre Webhook pour envoyer des événements à votre Space
Enfin, vous devrez configurer votre Webhook pour envoyer des requêtes POST à votre Space.
Commençons par récupérer l’« URL directe » de notre Space depuis le menu contextuel. Cliquez sur « Intégrer ce Space » et copiez l’« URL directe ».

Mettez à jour votre webhook pour envoyer des requêtes vers cette URL :

Résultat
