Hub documentation

Руководство по вебхукам: создание бота для обсуждений с ответами LLM

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Руководство по вебхукам: создание бота для обсуждений с ответами LLM

Ниже приведено краткое руководство по использованию Hugging Face Webhooks для создания бота, который отвечает на комментарии в Discussion на Hub с помощью ответа, сгенерированного LLM на ваш выбор через Hugging Face Inference Providers.

Создайте свой Webhook в профиле пользователя

Сначала создайте Webhook в своих настройках.

  • Введите несколько целевых репозиториев, на которые будет реагировать ваш Webhook.
  • Пока можно указать тестовый URL вебхука, но определение вебхука позволит вам просматривать события, которые будут на него отправлены (а также воспроизводить их, что пригодится при отладке).
  • Введите секрет, так как это будет более безопасно.
  • Подпишитесь на события сообщества (PR & обсуждения), так как мы создаём бота для обсуждений.

Ваш Webhook будет выглядеть так:

webhook-creation

Создать новый профиль пользователя Bot

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

discussion-bot-profile

При создании бота, который будет взаимодействовать с другими пользователями на 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».

embed this Space direct URL

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

webhook settings

Результат

discussion-result

Update on GitHub