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 Inference Providers を介して、選択した LLM によって生成された応答で Hub の Discussion コメントに返信するボットを構築する方法について、Hugging Face Webhooks の使い方を簡潔にご紹介します。

ユーザープロファイルでWebhookを作成します

まず、設定からWebhookを作成します。

  • Webhookが監視する対象のリポジトリをいくつか入力してください。
  • とりあえずダミーのWebhook URLを設定しても構いませんが、Webhookを定義しておくと、そこに送信されるイベントを確認できます(また、イベントの再生も可能であり、デバッグに役立ちます)。
  • より安全なため、シークレットを入力してください。
  • Discussion bot を構築しているため、Community(PR とディスカッション)のイベントに購読してください。

Webhookは次のようになります:

webhook-creation

新しいBotユーザープロファイルを作成します

このガイドでは、Spaceをホストし、コメントを投稿するための別ユーザーアカウントを作成します。

discussion-bot-profile

Hub上で他のユーザーとやり取りするボットを作成する際は、アカウントを明確に「Bot」としてラベル付けしてください(プロフィールのスクリーンショットを参照)。

Webhookに反応するSpaceを作成します

3番目のステップは、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://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;
		...

これが最もクールな部分です。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の「direct URL」を取得しましょう。「Embed this Space」をクリックし、「Direct URL」をコピーします。

embed this Space direct URL

そのURLにリクエストを送信するように、Webhookを更新してください:

webhook settings

結果

discussion-result

Update on GitHub