Hub documentation
Webhook 指南:使用 LLM 回复构建 Discussion 机器人
Webhook 指南:使用 LLM 回复构建 Discussion 机器人
以下是一份简短指南,介绍如何使用 Hugging Face Webhooks 构建一个机器人,该机器人会在 Hub 的 Discussion 评论区回复由您通过 Hugging Face Inference Providers 选择的 LLM 生成的响应。
在您的用户资料中创建您的 Webhook
首先,让我们从您的设置中创建一个 Webhook。
- 输入几个您的 Webhook 将监听的目标仓库。
- 目前你可以先填写一个占位的 Webhook URL,但定义好 webhook 后,你就可以查看将发送到该 webhook 的事件(并且可以重放这些事件,这在调试时会很有用)。
- 输入密钥,这样会更加安全。
- 订阅社区(PR 和讨论)事件,因为我们正在构建一个讨论机器人。
您的 Webhook 将如下所示:

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

在创建将在 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”。

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

结果
