Hub documentation

دليل Webhook: بناء بوت للنقاشات مع ردود من نماذج اللغة

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

دليل Webhook: بناء بوت للنقاشات مع ردود من نماذج اللغة

فيما يلي دليل موجز حول كيفية استخدام Hugging Face Webhooks لبناء بوت يرد على تعليقات النقاشات في Hub بردود يولدها نموذج LLM تختاره عبر Hugging Face Inference Providers.

أنشئ Webhook الخاص بك في ملفك الشخصي

أولاً، لننشئ Webhook من الإعدادات.

  • أدخل مستودعات الهدف التي سيقوم Webhook بالاستماع إليها.
  • يمكنك إدخال رابط Webhook وهمي مؤقتًا، لكن تعريف الـ webhook الخاص بك سيتيح لك الاطلاع على الأحداث التي ستُرسل إليه (ويمكنك إعادة تشغيلها، وهو ما سيكون مفيدًا لاستكشاف الأخطاء وإصلاحها).
  • أدخل كلمة مرور، فسيكون ذلك أكثر أمانًا.
  • اشترك في أحداث المجتمع (طلبات الدمج والمناقشات)، حيث نقوم ببناء روبوت للمناقشات.

سيبدو Webhook الخاص بك على النحو التالي:

webhook-creation

إنشاء ملف مستخدم جديد لروبوت

في هذا الدليل، ننشئ حساب مستخدم منفصل لاستضافة مساحة Space ولإضافة التعليقات:

discussion-bot-profile

عند إنشاء بوت سيتفاعل مع مستخدمين آخرين على Hub، نطلب منك وضع علامة واضحة على الحساب بأنه “Bot” (انظر لقطة شاشة الملف الشخصي).

أنشئ مساحة (Space) تستجيب لـ Webhook الخاص بك

الخطوة الثالثة هي في الواقع الاستماع إلى أحداث Webhook.

طريقة سهلة هي استخدام مساحة (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 في إعدادات مساحتك حتى تتمكن من التحقق منه).

	const event = req.body.event;
	if (
		event.action === "create" &&
		event.scope === "discussion.comment" &&
		req.body.comment.content.includes(BOT_USERNAME)
	) {
		...

يتم ترميز حمولة الحدث بصيغة JSON. هنا، نحدد أننا سنشّغل خطاف الويب الخاص بنا فقط عندما:

  • يتعلق الحدث بتعليق نقاش
  • الحدث هو إنشاء، أي أن تعليقًا جديدًا قد نُشر
  • يحتوي محتوى التعليق على @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 الخاص بك لإرسال طلبات POST إلى مساحتك (Space).

لنبدأ أولاً بالحصول على «الرابط المباشر» الخاص بمساحتنا من القائمة السياقية. انقر على «تضمين هذه المساحة» وانسخ «الرابط المباشر».

embed this Space direct URL

قم بتحديث webhook الخاص بك لإرسال الطلبات إلى ذلك العنوان:

webhook settings

النتيجة

discussion-result

Update on GitHub