Hub documentation
Руководство по вебхукам: создание бота для обсуждений с ответами LLM
Руководство по вебхукам: создание бота для обсуждений с ответами LLM
Ниже приведено краткое руководство по использованию Hugging Face Webhooks для создания бота, который отвечает на комментарии в Discussion на Hub с помощью ответа, сгенерированного LLM на ваш выбор через Hugging Face Inference Providers.
Создайте свой Webhook в профиле пользователя
Сначала создайте Webhook в своих настройках.
- Введите несколько целевых репозиториев, на которые будет реагировать ваш Webhook.
- Пока можно указать тестовый URL вебхука, но определение вебхука позволит вам просматривать события, которые будут на него отправлены (а также воспроизводить их, что пригодится при отладке).
- Введите секрет, так как это будет более безопасно.
- Подпишитесь на события сообщества (PR & обсуждения), так как мы создаём бота для обсуждений.
Ваш Webhook будет выглядеть так:

Создать новый профиль пользователя Bot
В этом руководстве мы создаем отдельную учетную запись пользователя для размещения Space и публикации комментариев:

При создании бота, который будет взаимодействовать с другими пользователями на Hub, мы просим явно указать в аккаунте, что это «Бот» (см. скриншот профиля).
Создайте Space, который будет реагировать на ваш Webhook
Третий шаг — это, собственно, прослушивание событий Webhook.
Простой способ — использовать для этого Space. Мы используем учётную запись пользователя, которую создали, но при желании вы можете сделать это из своей основной учётной записи.
Код Space находится здесь.
Мы использовали NodeJS и TypeScript для реализации, но подойдёт любой язык или фреймворк. Подробнее о Docker Spaces — здесь.
Основной файл server.ts находится здесь
Разберём, что происходит в этом файле:
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" });
}
...Здесь мы слушаем POST-запросы, направленные на /, а затем проверяем, что заголовок X-Webhook-Secret равен секрету, который мы ранее определили (вам также необходимо установить секрет WEBHOOK_SECRET в настройках вашего Space, чтобы иметь возможность его проверить).
const event = req.body.event;
if (
event.action === "create" &&
event.scope === "discussion.comment" &&
req.body.comment.content.includes(BOT_USERNAME)
) {
...Параметры события кодируются в формате JSON. Здесь мы указываем, что наш Webhook будет запускаться только в том случае, если:
- событие касается комментария к обсуждению
- событие представляет собой создание, то есть был опубликован новый комментарий
- содержимое комментария содержит
@discussion-bot, то есть наш бот только что был упомянут в комментарии.
В этом случае мы перейдем к следующему шагу:
const CHAT_API_URL =
"https://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;
...Это самая интересная часть: с помощью Hugging Face Inference Providers мы вызываем модель с открытыми весами (moonshotai/Kimi-K2.6) с системным промптом и комментарием пользователя. Модель генерирует ответ, который мы извлекаем из choices[0].message.content.
Вы можете выбрать любую модель из списка доступных моделей — просто замените значение поля model.
Наконец, мы опубликуем его как ответ в том же потоке обсуждения:
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();Настройте свой Webhook для отправки событий в ваше Space
И наконец, вам нужно настроить ваш Webhook для отправки POST-запросов в ваше Space.
Сначала получим «прямой URL» нашего Space из контекстного меню. Нажмите «Embed this Space» и скопируйте «Direct URL».

Обновите ваш вебхук, чтобы отправлять запросы на этот URL:

Результат
