Hub documentation

Webhook 指南:使用 LLM 回复构建 Discussion 机器人

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Webhook 指南:使用 LLM 回复构建 Discussion 机器人

以下是一份简短指南,介绍如何使用 Hugging Face Webhooks 构建一个机器人,该机器人会在 Hub 的 Discussion 评论区回复由您通过 Hugging Face Inference Providers 选择的 LLM 生成的响应。

在您的用户资料中创建您的 Webhook

首先,让我们从您的设置中创建一个 Webhook。

  • 输入几个您的 Webhook 将监听的目标仓库。
  • 目前你可以先填写一个占位的 Webhook URL,但定义好 webhook 后,你就可以查看将发送到该 webhook 的事件(并且可以重放这些事件,这在调试时会很有用)。
  • 输入密钥,这样会更加安全。
  • 订阅社区(PR 和讨论)事件,因为我们正在构建一个讨论机器人。

您的 Webhook 将如下所示:

webhook-creation

创建新的 Bot 用户配置文件

在本指南中,我们将创建一个独立的用户账户来托管 Space 并发布评论:

discussion-bot-profile

在创建将在 Hub 上与其他用户交互的机器人时,我们要求您明确将该账户标记为“Bot”(参见个人资料截图)。

创建一个能够响应你的 Webhook 的 Space

第三步实际上是监听 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 请求头是否等于我们之前定义的密钥(您还需要在 Space 的设置中设置 WEBHOOK_SECRET 密钥,才能对其进行验证)。

	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,使其向您的 Space 发送 POST 请求。

首先,让我们从上下文菜单中获取我们 Space 的“直接 URL”。点击“嵌入此 Space”,然后复制“直接 URL”。

embed this Space direct URL

更新您的 webhook,以向该 URL 发送请求:

webhook settings

结果

discussion-result

Update on GitHub