# Make Agent Fast documentation (ar)
---
# سجل التغييرات
Source: /ar/docs/account/changelog.md
{/* docs-visuals */}
## 2026-08-27 [#2026-08-27]
* توثيق إطلاق الوكيل انطلاقًا من عنوان URL: انتظار مرحلة الإنشاء، ثم **المراجعة والنشر**، ثم **الموافقة والنشر**، وتفعيل الوكيل عند أول محادثة لزائر أو أول عميل محتمل (lead).
* توثيق الفرق بين خيار المظهر **استخدام الموقع** وخياري الفاتح/الداكن، وأن حفظ المظهر يحدّث التضمين المباشر (وأي صفحات مستضافة متبقية) دون إعادة النشر.
* مواءمة مقتطفات التضمين مع سمات `embed.js` المعتمدة في النسخة المباشرة ومع معامل تجديد الذاكرة المؤقتة `?v=` في لوحة التحكم.
* توثيق المحادثة الصوتية المباشرة في أداة الاختبار على المنصة مقارنةً بالموقع المنشور والتضمين.
* إزالة النطاق المخصص وشراء النطاقات وإعدادات النطاق الفرعي كمنتج. يتم تضمين الوكيل في موقع العميل الحالي. وتبقى أحداث الإضافة الخاصة بنطاقات Polar المتبقية متجاهَلة أو ملغاة.
## 2026-07-28 [#2026-07-28]
* تبسيط سجل الاستخدام ليعرض الرصيد النهائي المستهلك من الاعتمادات بدلًا من صفوف منفصلة للحجز والاسترداد؛ ويظهر الاستخدام الضئيل الآن بصيغة `<0.001`.
* جعل زوايا التحديد في قائمة إجراءات الوثائق تتكيف مع المحتوى متعدد الأسطر، مع الحفاظ على تطابق هندسة زر التشغيل وإطار القائمة.
* توسيع الأدلة بالإنجليزية والكورية والأوزبكية لتشمل فوترة المكالمات المباشرة، وإدخال الوسائط في المنشئ المرئي، وتغييرات النطاق الفرعي المستضاف، وضوابط الخصوصية والأمان للحساب، وسجل أحداث الإشعارات.
## 2026-07-15 [#2026-07-15]
* إطلاق منصة وثائق Make Agent Fast ثنائية اللغة.
* إضافة Markdown لكل صفحة، وخيارات التنزيل، والبحث، وإجراءات ChatGPT وClaude.
* إضافة المسارات `/docs/llms.txt` و`/docs/llms-full.txt` ومسارات `.md` المعتمدة.
* توثيق واجهة API العامة وعقد SDK وwebhooks والتضمين والموصّلات (connectors) والعمليات والتسعير والأمان والخصوصية.
* إضافة أدلة تنفيذ لأبرز أطر العمل ومنشئي المواقع.
## سياسة الإصدارات [#سياسة-الإصدارات]
قد يتم نشر تصحيحات الوثائق والحقول الإضافية في واجهة API بشكل مستمر. أما التغييرات الجذرية في واجهة API العامة فتتطلب مسارًا رئيسيًا جديدًا أو فترة ترحيل موثّقة.
---
# الخطط والأسعار
Source: /ar/docs/account/pricing.md
{/* docs-visuals */}
## مقارنة الخطط [#مقارنة-الخطط]
| الخطة | الفوترة الشهرية | الإجمالي السنوي | الرصيد الشهري | الوكلاء | الصوت المباشر | شارة العلامة التجارية |
| ------- | --------------: | --------------: | ------------: | ------------------------------: | --------------: | --------------------- |
| Launch | $15/شهريًا | $144/سنويًا | 1000 | 1 | غير متاح | إلزامية |
| Operate | $35/شهريًا | $336/سنويًا | 3000 | 3 | 30 دقيقة/شهريًا | يمكن إزالتها |
| Scale | $79/شهريًا | $758/سنويًا | 8000 | غير محدود، وفق الاستخدام العادل | 90 دقيقة/شهريًا | يمكن إزالتها |
الفوترة السنوية أقل بنسبة 20% من دفع السعر الشهري اثنتي عشرة مرة. تبدأ خطتا Launch وOperate بفترة تجريبية مجانية لمدة سبعة أيام دون الحاجة إلى بطاقة ائتمان؛ أضف بطاقة بعد اليوم السابع لإبقاء الوكيل يعمل. أما خطة Scale فتبدأ فوترتها فورًا وليس لها فترة تجريبية. عند الحاجة إلى بطاقة، تعرض صفحة الدفع السعر الدقيق وفترة التجديد والضريبة والشروط قبل إتمام الشراء.
خطة Launch هي وكيل مضمَّن يعمل بالفعل خلال هذا الأسبوع. وخطة Operate هي الخطوة التالية حين يبدأ العملاء بالتحدث فعليًا مع الوكيل — صوت مباشر وأداة دردشة أكثر اكتمالًا وقنوات مراسلة. أما Scale فهي الاستوديو الكامل: كل عناصر التحكم في المظهر، وأدوار الفريق، ومفاتيح المزوّدين الخاصة بك.
## سلّم الميزات [#سلّم-الميزات]
| الإمكانية | Launch | Operate | Scale |
| --------------- | ----------------------------------------- | --------------------------------------------- | ---------------------------------------------------------- |
| الوكلاء | 1 | 3 | غير محدود، وفق الاستخدام العادل |
| استوديو الأداة | اللون المميز والموضع والوضع الفاتح/الداكن | + تسمية زر الفتح وإعدادات جاهزة وألوان إضافية | جميع عناصر التحكم (نصف القطر والظل والحدود والخط والزجاجي) |
| لغات الصوت | 1 | 2 | جميع اللغات المدعومة |
| استيعاب المعرفة | لصق وURL وملفات | + YouTube وبودكاست وRSS | مثل Operate |
| قنوات المراسلة | تستمر الاتصالات الحالية في العمل | اتصالات جديدة | اتصالات جديدة |
| مفاتيحك الخاصة | تستمر المفاتيح الحالية في العمل | تستمر المفاتيح الحالية في العمل | حفظ مفاتيح جديدة |
| دعوات الفريق | يبقى الأعضاء الحاليون | يبقى الأعضاء الحاليون | دعوات جديدة بأدوار |
نحن لا نبيع نطاقات العملاء ولا نربطها بحساباتهم. ضمّن الوكيل في الموقع الذي تملكه بالفعل.
## متاح في جميع الخطط [#متاح-في-جميع-الخطط]
تتضمن جميع الخطط الحالية ما يلي:
* تضمين في الموقع الذي تملكه بالفعل (`embed.js` + `data-agent`).
* الدردشة النصية والرسائل الصوتية والأصوات الجاهزة واسترجاع المعرفة والأسئلة الشائعة/المنتجات المنظَّمة والتقاط العملاء المحتملين (Leads).
* التضمين في المواقع مع عناصر تحكم دقيقة في المصدر (origin).
* الوصول إلى API العامة بمفاتيح محدودة النطاق، وOAuth للتطبيقات التي تمت مراجعتها، وOpenAPI، وحدود معدل تتناسب مع الخطة.
* التحليلات والمحادثات وتتبع الاستخدام وإمكانية شراء باقات الرصيد.
حد استخدام API العامة هو 120 طلبًا لكل مفتاح API في الدقيقة في Launch، و600 في Operate، و1,800 في Scale. لا تحل حدود الطلبات هذه محل استحقاقات الموارد أو فحوصات الرصيد أو خاصية التكرار الآمن (idempotency) أو الحدود الخاصة بالمزوّدين. راجع [حدود المعدل](/ar/docs/api/rate-limits).
## فهم الرصيد [#فهم-الرصيد]
يُستخدم الرصيد لدفع تكلفة أعمال الذكاء الاصطناعي المقاسة، مثل التوليد وأدوار الوكيل وتضمينات المعرفة (embeddings) والتفريغ النصي وتركيب الكلام. وهو ليس عددًا ثابتًا من الرسائل: فالمزوّد والنموذج وطول المدخلات/المخرجات ومدة الوسائط ونوع العملية كلها تغيّر التكلفة.
يتجدد رصيد الخطة الشهري في كل فترة فوترة. يُرحَّل الرصيد الشهري غير المستخدم لدورة إضافية واحدة ثم تنتهي صلاحيته. أما رصيد الشحن المشترى فلا تنتهي صلاحيته ما دام الاشتراك نشطًا. لا يؤدي وجود رصيد موجب إلى فتح ميزة مقتصرة على خطة معينة، مثل المكالمات المباشرة أو المواقع الإضافية أو إزالة الشارة.
تؤدي مفاتيح المزوّد الخاصة بك (BYOK) إلى رسوم منفصلة من OpenRouter (للنصوص) أو Speko (للصوت)، وهما المزوّدان اللذان يمكن إضافة مفتاح جديد لهما؛ وتستمر مفاتيح المزوّدين المباشرين الأقدم المحفوظة لديك في العمل حتى يتم إلغاؤها. حفظ المفتاح متاح في Scale فقط. عند استخدام مفتاحك الخاص، يكلّف كل إجراء رسم منصة ثابتًا (رصيد واحد لكل رد دردشة) بدلًا من الرسوم المبنية على الرموز (tokens). لا يحوّل BYOK فواتير المزوّدين إلى رصيد Make Agent Fast ولا يلغي فحوصات الاستحقاق الخاصة بالمنصة. راجع [مفاتيح مزوّدي الذكاء الاصطناعي](/ar/docs/account/provider-keys).
## استحقاقات الصوت [#استحقاقات-الصوت]
الرسائل الصوتية مشمولة في جميع الخطط، لكن أعمال التفريغ النصي والنموذج وتركيب الكلام المرتبطة بها قد تستهلك رصيدًا. أما الصوت المباشر في الوقت الفعلي فيستخدم حصة دقائق شهرية منفصلة: لا شيء في Launch، و30 دقيقة في Operate، و90 دقيقة في Scale.
## الوكلاء والعلامة التجارية [#الوكلاء-والعلامة-التجارية]
تدعم Launch وكيلًا واحدًا موجّهًا للعملاء، وتدعم Operate حتى ثلاثة وكلاء. أما وصف الوكلاء غير المحدودين في Scale فيخضع للاستخدام العادل، وليس دعوة لإنشاء أعداد مسيئة أو آلية من المساحات المستقلة (tenants). يتضمن الوكيل معرفته وإعدادات التضمين والموصلات والتحليلات وبيانات المحادثات. يحصل كل وكيل على رابط الوكيل، وهو صفحة دردشة عامة واحدة على نطاق فرعي خاص به. ما زالت صفحات العرض التجريبي المستضافة المتبقية تعمل على نطاقات فرعية؛ أما الوكلاء الجدد فلا يحصلون على صفحة تسويقية مستضافة.
تبقى شارة الإحالة «Made with Make Agent Fast» في Launch. ويمكن لمالكي حسابات Operate وScale إزالتها من المواقع المنشورة المستحقة.
## باقات الرصيد [#باقات-الرصيد]
| عملية الشراء | السعر | ما الذي تغيّره |
| ------------ | ------------: | --------------------------------------------------------- |
| باقة صغيرة | $8 مرة واحدة | تضيف 1000 رصيد لا تنتهي صلاحيتها ما دام الاشتراك قائمًا |
| باقة متوسطة | $35 مرة واحدة | تضيف 5000 رصيد لا تنتهي صلاحيتها ما دام الاشتراك قائمًا |
| باقة كبيرة | $90 مرة واحدة | تضيف 15,000 رصيد لا تنتهي صلاحيتها ما دام الاشتراك قائمًا |
تضيف عمليات الشحن سعة استخدام فقط. ولا تزيد عدد المواقع أو حدود طلبات API أو الدقائق المباشرة أو أذونات العلامة التجارية.
## الفترات التجريبية والتجديد والإلغاء [#الفترات-التجريبية-والتجديد-والإلغاء]
لا تتحول الفترة التجريبية المجانية في Launch/Operate تلقائيًا إلى اشتراك مدفوع: ففي اليوم السابع يتوقف الوكيل مؤقتًا إلى أن تضيف بطاقة. بعد حفظ بطاقة، قد يؤدي الإلغاء أو فشل التجديد إلى إزالة الوصول النشط بعد انتهاء فترة المزوّد أو انتقال الحالة المعمول به. وقد تتوقف عمليات التضمين والموصلات وعملاء API والمكالمات الصوتية رغم بقاء بيانات مساحة العمل المخزنة.
## اختيار خطة [#اختيار-خطة]
* اختر **Launch** لوكيل مضمَّن واحد مع الدردشة النصية والرسائل الصوتية وأداة دردشة أساسية.
* اختر **Operate** عندما يبدأ العملاء بالتحدث: مكالمات مباشرة وقنوات مراسلة وأداة دردشة مخصصة وصوت بلغتين أو إزالة الشارة.
* اختر **Scale** عندما يكون عدة وكلاء قيد الإنتاج: كل عناصر التحكم في الأداة، وصوت بكل اللغات المدعومة، وأدوار الفريق، ومفاتيح API الخاصة بك.
قدّر الاستخدام اعتمادًا على اختبارات قبول حقيقية لا على عدد الرسائل وحده. انشر وكيلًا واحدًا نموذجيًا، وقِس استخدام النصوص والصوت والمعرفة، ثم أسقِط ذلك على حجم الزيارات المتوقع وأضف هامشًا للمحاولات المتكررة والموصلات والأتمتة وذروات الإطلاق.
## المرجع الرسمي للفوترة [#المرجع-الرسمي-للفوترة]
صفحة الدفع الفعلية ولوحة الفوترة هما المرجع الرسمي لأي عملية شراء محددة. قد تختلف الضرائب وطريقة عرض العملة وطرق الدفع وأهلية الفترة التجريبية وصياغة المزوّد بحسب الموقع وحالة الحساب. إذا اختلفت صفحة الدفع عن هذه الصفحة، فتوقف واعتمد شروط صفحة الدفع أو تواصل مع الدعم قبل الدفع.
---
# الخصوصية والبيانات
Source: /ar/docs/account/privacy.md
{/* docs-visuals */}
يقرّر مالك الموقع المعرفة ومدخلات الزوار والتكاملات التي تُستخدم في تجربته. تعالج Make Agent Fast بيانات المنصة لتقديم الخدمة، وذلك وفقًا للشروط المعمول بها وإشعار الخصوصية.
## إشعار الزوار [#إشعار-الزوار]
اشرح استخدام الذكاء الاصطناعي والتسجيل وجمع بيانات العملاء المحتملين والتحليلات والمتابعة بلغة تناسب التجربة والمتطلبات المحلية. لا تطلب من الـ agent جمع بيانات لا تحتاج إليها.
## دورة حياة البيانات [#دورة-حياة-البيانات]
يؤثر حذف أحد المصادر (Sources) في عمليات الاسترجاع المستقبلية. ويؤدي حذف بيانات الاعتماد إلى إيقاف الوصول المصرّح به. أما المحادثات السابقة وملفات التصدير وبيانات القنوات الخارجية وسجلات المزوّدين، فقد تخضع لسياسات احتفاظ منفصلة.
## ضوابط المالك [#ضوابط-المالك]
يمكن من صفحة **التحليلات** (Analytics) في الموقع تصدير العملاء المحتملين (Leads) الذين تم جمع بياناتهم بصيغة JSON، وحذف عميل محتمل بعينه. كما يمكن تصدير تقارير التحليلات بصيغة Markdown أو Excel أو عرض الطباعة/PDF. ينشئ التصدير نسخة جديدة تحت سيطرتك؛ ولا يؤدي حذف سجل المنصة إلى محو أي تنزيل سابق، أو محادثة مرتبطة، أو سجل لدى مزوّد خارجي، أو بيانات يُحتفظ بها لمتطلب قانوني.
استخدم **إعدادات الحساب** لتسجيل الخروج من جميع الأجهزة أو لحذف الحساب نهائيًا. عند حذف الحساب، تُجرى أولًا محاولة إيقاف اشتراك المنصة واشتراكات إضافات النطاق المتبقية في Polar وموارد الموصّلات (Connectors)، ثم تُزال المواقع والـ agents والمعرفة والمحادثات والعملاء المحتملون وبيانات اعتماد API/OAuth والجلسات وسجل الفوترة المخزَّن محليًا الخاصة بالحساب. وإذا تعذّر التأكد من إيقاف الفوترة الخارجية، يفشل الحذف بشكل آمن ويُترك الحساب سليمًا لإعادة المحاولة بأمان أو لمراجعة الدعم.
## الطلبات [#الطلبات]
استخدم عناصر التحكم الذاتية عندما تناسب الطلب. أما بالنسبة إلى طلبات الوصول أو التصحيح أو التصدير أو الحذف الأوسع نطاقًا، فتواصل مع دعم الحساب واتبع الإجراءات الواردة في سياسة الخصوصية الحالية. تحقّق من هوية مقدّم الطلب قبل الإفصاح عن بيانات الحساب، وضمّن عمليات التصدير اللاحقة والمزوّدين الخارجيين في خطة الاستجابة.
---
# مفاتيح مزوّدي الذكاء الاصطناعي
Source: /ar/docs/account/provider-keys.md
{/* docs-visuals */}
تتيح ميزة استخدام مفتاحك الخاص (BYOK) أن تستخدم طلبات الذكاء الاصطناعي المدعومة حسابك لدى مزوّد الذكاء الاصطناعي. لا تحتاج إلى مفتاح: فالمنصة توفّر النماذج افتراضيًا. يتطلب حفظ مفتاح باقة Scale. أما المفاتيح المحفوظة مسبقًا فتواصل العمل في باقتي Launch وOperate. وتظل تدفع اشتراك باقة Make Agent Fast بالإضافة إلى رسم ثابت للمنصة عن كل إجراء، بينما يحاسبك المزوّد مباشرة على استخدام نماذجه.
## المزوّدون المدعومون [#المزوّدون-المدعومون]
يمكن إضافة مفاتيح جديدة لمزوّدين اثنين فقط: أحدهما للنصوص والآخر للصوت:
| المزوّد | الاستخدام | إنشاء مفتاح أو مراجعته |
| ---------- | ----------------------------------------------------------------- | --------------------------------------------------- |
| OpenRouter | توليد نصوص الوكيل عبر النماذج التي يوجّه OpenRouter الطلبات إليها | [مفاتيح OpenRouter API](https://openrouter.ai/keys) |
| Speko | تحويل الكلام إلى نص وتحويل النص إلى كلام | [منصة Speko](https://platform.speko.ai) |
### المفاتيح القديمة [#المفاتيح-القديمة]
تظهر مفاتيح المزوّدين المباشرين المحفوظة قبل الانتقال إلى OpenRouter وSpeko ضمن **المفاتيح القديمة**. تظل تعمل حتى تلغيها، ويمكنك إلغاؤها، لكن لا يمكنك إضافة مفتاح قديم أو استبداله:
| المزوّد القديم | الاستخدام | مرجع المزوّد |
| ----------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Anthropic وOpenAI وGoogle Gemini وxAI وDeepSeek | توليد نصوص الوكيل | [وثائق Anthropic API](https://platform.claude.com/docs/en/api/overview)، [البدء السريع مع OpenAI API](https://developers.openai.com/api/docs/quickstart)، [مفاتيح Gemini API](https://ai.google.dev/gemini-api/docs/api-key) |
| Deepgram | تحويل الكلام إلى نص عندما يكون Deepgram هو مزوّد STT المضبوط | [مفاتيح Deepgram API](https://developers.deepgram.com/docs/create-additional-api-keys) |
| ElevenLabs | تحويل النص إلى كلام عندما يكون ElevenLabs هو المضبوط | [مصادقة ElevenLabs](https://elevenlabs.io/docs/api-reference/authentication) |
يعتمد توفّر المزوّدين أيضًا على مزوّدي النصوص والكلام والوقت الفعلي المضبوطين في المنصة. ولا يعني حفظ مفتاح صالح أن كل ميزة ستستخدم ذلك المزوّد حتمًا.
يفوّض مفتاح المزوّد الرسوم واستدعاءات النماذج لدى مزوّد الذكاء الاصطناعي الخارجي. أما مفتاح `maf_live_...` فيفوّض برنامجك باستدعاء واجهة Make Agent Fast API العامة. لا تلصق أحدهما في حقل الآخر أبدًا.
## إضافة مفتاح مزوّد [#إضافة-مفتاح-مزوّد]
1. أنشئ مفتاحًا في وحدة تحكم OpenRouter أو Speko، وفعّل الفوترة لدى المزوّد أو حدًّا للإنفاق إذا لزم الأمر.
2. افتح **لوحة التحكم ← الإعدادات ← مفاتيح مزوّدي الذكاء الاصطناعي**. وحده مالك الفوترة في مساحة عمل Scale يستطيع حفظ مفتاح.
3. الصق المفتاح في بطاقة **OpenRouter** أو **Speko**.
4. اختر **اختبار وحفظ**.
5. انتظر نتيجة التحقق، ثم اختبر الميزة التي تستخدم المزوّد.
يُجري Make Agent Fast طلب تحقق مباشرًا قبل حفظ المفتاح، ولا يستهلك ذلك أي رموز نماذج أو أرصدة من المنصة. يجب ألا يحتوي المفتاح على مسافات أو فواصل أسطر، وأن يتراوح طوله بين 16 و512 حرفًا. يجب أن تبدأ مفاتيح OpenRouter بـ `sk-or-`، وأن تبدأ مفاتيح Speko بـ `sk_speko_` أو `sk_live_`. ويبقى التحقق المباشر هو المرجع النهائي.
يؤدي حفظ مفتاح آخر صالح للمزوّد نفسه إلى استبدال القيمة المخزّنة سابقًا. أما المفتاح الذي يفشل في التحقق فلا يُحفظ، ولذلك يستمر المفتاح المحفوظ مسبقًا في العمل. ولا تحتفظ لوحة التحكم إلا ببيانات تعريف آمنة، مثل آخر أربعة أحرف ووقت التحقق والحالة.
## كيف يتم اختيار مزوّد النصوص [#كيف-يتم-اختيار-مزوّد-النصوص]
لتوليد النصوص، تكون الأولوية لمفتاح OpenRouter النشط. وإن لم يوجد، يبحث Make Agent Fast عن مفتاح قديم نشط يطابق مزوّد النصوص المضبوط في المنصة، ثم عن بقية مفاتيح النصوص القديمة (Anthropic وOpenAI وGemini وxAI وDeepSeek) بهذا الترتيب. وإذا لم يوجد مفتاح BYOK مناسب، يستخدم مزوّد المنصة متى سمحت الباقة والنشر بذلك.
مفاتيح الكلام خاصة بكل مزوّد. يُستخدم مفتاح Speko عندما يجري الكلام عبر Speko. ويُستخدم مفتاح Deepgram القديم فقط عندما يكون مزوّد تحويل الكلام إلى نص النشط هو Deepgram، ويُستخدم مفتاح ElevenLabs القديم فقط عندما يكون تحويل النص إلى كلام مضبوطًا على ElevenLabs.
لا تحلّ مفاتيح BYOK حاليًا محل بيانات اعتماد تضمين المعرفة الخاصة بالمنصة. يستمر استيعاب المعرفة واسترجاعها في استخدام مزوّد التضمين المضبوط في النشر.
## الفوترة والأرصدة [#الفوترة-والأرصدة]
* يحاسب المزوّد الخارجي استخدام رموز الذكاء الاصطناعي على الحساب الذي أصدر المفتاح.
* يواصل Make Agent Fast احتساب الاشتراك بالإضافة إلى رسم ثابت للمنصة عن كل إجراء يعمل بمفتاحك: رصيد واحد لكل رد في المحادثة بدلًا من الرسوم المبنية على الرموز. يغطي هذا الرسم الاسترجاع والتنسيق والاستضافة المحيطة بالاستدعاء، وهو ليس نسبة من فاتورة الرموز لديك.
* يُطبَّق الرسم على كل استدعاء للمزوّد. أما خطوات الكلام التي تموّلها المنصة (مثل التفريغ النصي عندما يكون لديك مفتاح نصوص فقط) فتُحتسب بالسعر المعتاد، وتستخدم المكالمات المباشرة دائمًا سعر المنصة.
* قد يفشل الطلب عند استنفاد حصة المزوّد حتى مع بقاء أرصدة في Make Agent Fast.
راجع كلًا من **الاستخدام والأرصدة** في Make Agent Fast ولوحة الاستخدام الخاصة بالمزوّد.
## حالات المفتاح ومعالجة الأعطال [#حالات-المفتاح-ومعالجة-الأعطال]
| الحالة | المعنى | ما العمل |
| --------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `active` | نجح التحقق المباشر | اختبر الميزة المعنية وراقب استخدام المزوّد |
| `invalid` | رفض المزوّد المفتاح المخزّن لاحقًا | تحقق من الفوترة لدى المزوّد والقيود والحصة وحالة الإلغاء، ثم احفظ مفتاحًا بديلًا (OpenRouter أو Speko) |
| `revoked` | المفتاح معطّل في Make Agent Fast | احفظ مفتاح OpenRouter أو Speko جديدًا إذا أردت أن تواصل الميزة استخدام BYOK |
إذا فشل طلب لأن المزوّد رفض بيانات الاعتماد أو بسبب الحصة، فقد يضع Make Agent Fast علامة «غير صالح» على المفتاح المخزّن. ولا يؤدي إصلاح المفتاح لدى المزوّد إلى كشف السر المخزّن أو إعادة كتابته؛ ففي حالة مفتاح OpenRouter أو Speko، استخدم **اختبار الاتصال** لإعادة التحقق منه، أو احفظ المفتاح العامل مرة أخرى. أما المفتاح القديم الذي يصبح غير صالح فلا يمكن استبداله بمفتاح قديم آخر؛ انقل ذلك المزوّد إلى OpenRouter أو Speko بدلًا من ذلك.
## تدوير مفتاح المزوّد [#تدوير-مفتاح-المزوّد]
1. أنشئ مفتاحًا جديدًا لدى المزوّد دون حذف المفتاح القديم.
2. احفظ المفتاح الجديد في Make Agent Fast وتأكد من أنه أصبح نشطًا.
3. اختبر محادثة نصية أو رسائل صوتية، بحسب ما يستخدم ذلك المزوّد.
4. ألغِ المفتاح القديم في وحدة تحكم المزوّد.
5. افحص سجلات المزوّد بحثًا عن أي استخدام غير متوقع للمفتاح القديم.
إذا انكشف مفتاح في نظام إدارة الإصدارات أو في شيفرة المتصفح، فألغِه لدى المزوّد فورًا. فحذفه من Make Agent Fast وحده لا يمنع أي طرف آخر يملكه من استخدامه مباشرة لدى المزوّد.
---
# الأمان
Source: /ar/docs/account/security.md
{/* docs-visuals */}
## الوصول إلى الحساب [#الوصول-إلى-الحساب]
استخدم كلمة مرور فريدة، واحمِ حساب البريد الإلكتروني المستخدم للاسترداد، وأنهِ الجلسات التي لا تتعرف عليها، وحدّ من الأشخاص الذين يمكنهم الوصول إلى مواقع الإنتاج.
تحقّق من البريد الإلكتروني للحساب عبر الرابط المرسل بعد التسجيل. يمكن لأصحاب الحسابات المحمية بكلمة مرور استخدام **نسيت كلمة المرور** في صفحة تسجيل الدخول؛ وتؤدي إعادة التعيين الناجحة إلى إلغاء الجلسات الحالية. يمكنك من **إعدادات الحساب** تغيير كلمة المرور المحلية، وربط Google صراحةً عند تفعيله، وتسجيل الخروج من جميع الأجهزة. أما الحسابات التي تعتمد على OAuth فقط فلا تملك كلمة مرور محلية لتغييرها، ولا يؤدي تسجيل الدخول العادي إلى ربط هوية جديدة بصمت.
## الأسرار [#الأسرار]
تُعدّ مفاتيح API ورموز الموصّلات وأسرار التطبيقات وأسرار webhook ومفاتيح مزوّدي الصوت من بيانات الاعتماد. خزّنها في مدير أسرار معتمد، ولا تضعها أبدًا في شيفرة العميل، وبدّلها بعد أي تعرّض لها.
## أقل قدر من الصلاحيات [#أقل-قدر-من-الصلاحيات]
اختر نطاقات API ضيقة، وتطبيقات مخصصة للمنصات الخارجية، ومصادر تضمين دقيقة، ومفاتيح منفصلة للأنظمة المختلفة. أزل بيانات الاعتماد والتكاملات غير المستخدمة.
## المحتوى والخصوصية [#المحتوى-والخصوصية]
ارفع فقط البيانات المسموح للوكيل باستخدامها. اختبر حالات الرفض ومسارات التصعيد، وطبّق قواعد الاحتفاظ على صادرات المحادثات والـ Leads.
## الإبلاغ [#الإبلاغ]
عند الإبلاغ عن ثغرة أمنية مشتبه بها، أرفق عنوان URL أو المكوّن المتأثر، وحجم التأثير، وخطوات إعادة الإنتاج، دون الوصول إلى بيانات مستخدمين آخرين.
---
# استكشاف الأخطاء وإصلاحها
Source: /ar/docs/account/troubleshooting.md
{/* docs-visuals */}
## ابدأ بحالة قابلة لإعادة الإنتاج [#ابدأ-بحالة-قابلة-لإعادة-الإنتاج]
قبل تغيير أي إعدادات، سجّل ما يلي:
* مساحة العمل/الموقع، والمسار العام أو نقطة نهاية API، والوقت الدقيق مع المنطقة الزمنية.
* النتيجة المتوقعة والنتيجة الفعلية.
* المتصفح/الجهاز أو قناة المزوّد الخارجي.
* ما إذا كان العطل يؤثر في معاينة المالك، أو صفحة العرض التجريبي المستضافة المتبقية، أو التضمين، أو الموصّل، و/أو API.
* نص الحالة/الخطأ الآمن، أو قيمة `x-request-id` في الاستجابة، أو آخر خطأ للموصّل، أو معرّف حدث التسليم لدى المزوّد.
* آخر وقت كان يعمل فيه كل شيء بشكل سليم، وأصغر تغيير أُجري مؤخرًا.
لا تُدرج بيانات اعتماد API أو المزوّد أو الموصّل بنص صريح، ولا أسرار webhook، ولا بيانات العملاء الخاصة، ولا ترويسات التفويض كاملة، ولا محتوى المحادثات غير الضروري.
## تغييرات الموقع لا تظهر [#تغييرات-الموقع-لا-تظهر]
1. تأكد من أن عنوان URL في لوحة التحكم يخص الموقع ومساحة العمل المقصودين.
2. تأكد من أن إجراء الحفظ أبلغ عن نجاحه.
3. تُطبَّق التعليمات والمعرفة المفهرسة على المحادثات الجديدة دون إعادة نشر. إذا كانت أداة الدردشة نفسها مخفية، فأعد تفعيلها من قائمة **اجعله متاحًا** في صفحة الـ agent ← **أداة الموقع** (أو من بطاقة **على موقعك** في تبويب **نظرة عامة**).
4. بالنسبة لإعدادات **العرض** (وشارة العلامة التجارية)، تُحفظ التغييرات تلقائيًا وتحدّث التضمين المباشر فورًا — لذا تجاوز إعادة النشر وافتح نافذة خاصة.
5. افتح تضمينًا فعليًا (أو slug مستضافًا متبقيًا إن كان لديك واحد) في نافذة خاصة.
6. إذا كانت المعاينة الاجتماعية فقط هي القديمة، فاستخدم أداة ذاكرة التخزين المؤقت/التصحيح الخاصة بتلك المنصة.
إلغاء النشر والتحرير أمران مختلفان. فقد يستمر موصّل المراسلة المتصل في الرد حتى لو كان التضمين متوقفًا.
## إجابة الـ agent ضعيفة أو خاطئة [#إجابة-الـ-agent-ضعيفة-أو-خاطئة]
اطرح السؤال نفسه في أداة الاختبار الخاصة بالمالك وفي محادثة عامة جديدة. تأكد من أن مصدر المعرفة ذا الصلة قد فُهرس، ويحتوي على إجابة صريحة، وهو محدّث، ولا يتعارض مع مصدر آخر. راجع قواعد اللغة/الشخصية بحثًا عن قيد يمنع الإجابة.
عندما لا يحتوي المصدر على إجابة، حسّن سلوك الإجابة البديلة/التصعيد بدلًا من توجيه الـ agent إلى التخمين. استخدم [مصادر المعرفة](/ar/docs/build/knowledge) لإنشاء مجموعة قبول تشمل الأسئلة المباشرة وإعادة الصياغة والحدود.
## أداة التشغيل الخاصة بالتضمين مفقودة أو محظورة [#أداة-التشغيل-الخاصة-بالتضمين-مفقودة-أو-محظورة]
تأكد من أن الموقع منشور، وأن التضمين مفعّل، وأن السكربت يحمل slug الموقع بدقة، وأن أصل الصفحة الأم النهائي في المتصفح — بما في ذلك المخطط واسم المضيف والمنفذ — مدرج في قائمة السماح. في DevTools، افحص طلب `embed.js`، وأخطاء CSP، وحالة مدير الموافقة، وطلب iframe، ووجود جذر `data-maf-embed` واحد.
إذا كان النص يعمل لكن الميكروفون لا يعمل، فتحقق من HTTPS، وإذن المتصفح، وإذن allow الخاص بـ iframe، وسياسة Permissions Policy للمضيف. اتبع [نظرة عامة على التضمين](/ar/docs/embed/overview) و[الأمان وCSP](/ar/docs/embed/security) كاملتين.
## الصوت لا يعمل [#الصوت-لا-يعمل]
حدّد الوضع المعطّل: رسالة صوتية، أو مكالمة مباشرة، أو صوت الموصّل. نجاح مسار النص يثبت فقط سلامة مفتاح نموذج اللغة.
افحص مفاتيح التفريغ النصي وتحويل النص إلى كلام (TTS) والمزوّد الفوري كلًّا على حدة؛ ثم افحص أهلية الخطة ورصيد الـ credits وحصة الدقائق المباشرة وإذن المتصفح واللغات المهيأة. اختبر تسجيلًا قصيرًا وواضحًا قبل التحقيق في ملف طويل أو مليء بالضوضاء.
## الموصّل لا يتلقى أي رسائل [#الموصّل-لا-يتلقى-أي-رسائل]
استخدم دليل القناة وقارن بين الطرفين. تأكد من أن الموصّل مفعّل، وأن بيانات الاعتماد ما تزال صالحة، وأن عنوان webhook/التفاعل/المهارة لدى المزوّد هو العنوان الحالي، وأن الحدث/الصفحة/الرقم/الكتلة المطلوبة مشترَك بها، وأن وضع التطبيق يشمل مستخدم الاختبار، وأن التسليم عبر HTTPS العام ينجح.
نجاح التحقق من webhook لا يثبت الاشتراك في أحداث وقت التشغيل ولا أذونات الإرسال. قارن سجلات التسليم لدى المزوّد مع **آخر رسالة** والخطأ المحفوظ للموصّل. اختبر النص قبل الصوت.
## النطاقات المخصصة غير متاحة [#النطاقات-المخصصة-غير-متاحة]
نحن لا نبيع نطاقات العملاء ولا نربطها. ضع الـ agent على الموقع الذي تملكه بالفعل عبر [التضمين](/ar/docs/embed/overview). أحداث الإضافة الخاصة بالنطاقات المتبقية في Polar تُتجاهل أو تُلغى ولا تمنح credits أبدًا.
## فشل طلب API [#فشل-طلب-api]
سجّل الأسلوب (method)، والمسار ذا الإصدار، والحالة، ورمز الخطأ الثابت، وقيمة `x-request-id` في الاستجابة، وترويسات حدّ المعدل ذات الصلة. ثم صنّف الحالة:
| الحالة | الإجراء الأرجح |
| ------ | -------------------------------------------------------------------------------------------- |
| `400` | صحّح بنية JSON/النموذج أو تفاصيل التحقق؛ لا تُعد المحاولة دون تغيير |
| `401` | استخدم بيانات اعتماد MAF صالحة وغير منتهية وغير ملغاة؛ ولا تستخدم مفتاح مزوّد أبدًا |
| `403` | أضف النطاق (scope) المطلوب أو استعد صلاحية الوصول إلى الخطة/المورد |
| `404` | تأكد من أن المعرّف ينتمي إلى مساحة العمل المصادَق عليها وأن المسار صحيح |
| `409` | عالج تعارض الحالة أو أعد إرسال المفتاح والحمولة نفسيهما لضمان idempotency |
| `415` | أرسل نوع المحتوى الموثّق |
| `429` | التزم بترويسات `retry-after`/إعادة الضبط مع إضافة jitter؛ ولا تُكرر المحاولة في حلقة متواصلة |
| `500` | أعد محاولة الطلب الآمن/المتماثل (idempotent) واحتفظ بمعرّف الطلب والوقت |
استخدم [بيانات الاعتماد والرموز](/ar/docs/api/credentials) و[النطاقات والأخطاء](/ar/docs/api/scopes-errors) و[حدود المعدل](/ar/docs/api/rate-limits). لا تحلّ خطأ API أبدًا بنقل بيانات اعتماد الخادم إلى كود المتصفح.
## الفوترة أو الاستخدام يبدو غير صحيح [#الفوترة-أو-الاستخدام-يبدو-غير-صحيح]
ميّز بين الوصول إلى المنصة، والـ credits الشهرية، والـ credits المشتراة، وعدد المواقع، والدقائق المباشرة، ومعدل API، وقنوات المراسلة (Operate+)، وBYOK/الفريق (Scale). الشحن الإضافي يغيّر الـ credits فقط. أما رسوم مزوّد BYOK فمنفصلة عن فوترة Make Agent Fast.
في حال الاستخدام غير المتوقع، احتوِ المصدر المرجّح قبل التحقيق: عطّل موصّلًا، أو ألغِ مفتاحًا، أو أزل أصل تضمين غير مقصود، أو أوقف حلقة إعادة محاولة API. احتفظ بالنطاق الزمني ومعرّفات الطلبات/المزوّد دون كشف أي أسرار.
## اجمع تفاصيل دعم آمنة [#اجمع-تفاصيل-دعم-آمنة]
إذا بقيت المشكلة قائمة، فاستخدم عنصر التعليقات في الدليل الأكثر صلة أو تواصل مع الدعم من لوحة التحكم، مع تضمين ما يلي:
* معرّف الموقع/مساحة العمل والميزة المتأثرة.
* الطابع الزمني الدقيق/المنطقة الزمنية وخطوات إعادة الإنتاج.
* النتيجة المتوقعة مقابل الفعلية.
* عنوان URL عام غير سري عند الاقتضاء.
* حالة HTTP، ورمز الخطأ الثابت، وقيمة `x-request-id`، أو معرّف حدث المزوّد.
* لقطة شاشة منقّحة أو حمولة minimal بعد إزالة الأسرار والبيانات الشخصية.
اذكر ما فحصته بالفعل. فهذا يمنع تكرار نصائح الإعداد ويوضّح حدود العطل.
---
# المصادقة
Source: /ar/docs/api/authentication.md
{/* docs-visuals */}
استخدم مفتاح API لخادمك الخلفي أو لأتمتة أعمالك. واستخدم OAuth عندما يطلب تطبيقك من مستخدمين آخرين في Make Agent Fast منحه حق الوصول. يستدعي النوعان من بيانات الاعتماد موارد `/api/v1` نفسها، ويخضعان للنطاقات نفسها، وصلاحيات الخطة، وعزل المستأجرين، وحدود المعدّل.
## مفاتيح API [#مفاتيح-api]
يتطلب إنشاء مفتاح API عام واستخدامه وجود خطة مدفوعة نشطة.
1. افتح **لوحة التحكم ← الإعدادات ← المطوّرون**.
2. أدخل اسمًا يحدد الخدمة والبيئة، مثل `Production lead export`.
3. حدّد أقل النطاقات التي تحتاج إليها الخدمة.
4. اختر مدة الصلاحية: 30 يومًا، أو 90 يومًا، أو سنة واحدة، أو بلا انتهاء.
5. أنشئ المفتاح، وانسخ القيمة `maf_live_...` فورًا.
يخزّن Make Agent Fast تجزئة SHA-256 بدلًا من نص عادي يمكن استرجاعه. وتعرض لوحة التحكم لاحقًا بادئة آمنة للمفتاح، والنطاقات، وتاريخ الانتهاء، ووقت آخر استخدام، وحالة الإلغاء.
```http
Authorization: Bearer maf_live_...
```
أرسل الترويسة من شيفرة الخادم:
```bash
curl --fail-with-body https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
يؤدي غياب بيانات الاعتماد إلى الاستجابة `401 authentication_required`. أما المفاتيح غير الصالحة أو المنتهية أو الملغاة فتُرجع `401 invalid_api_key`. وإذا لم تعد الخطة المدفوعة نشطة في حساب المفتاح، فتُرجع الاستجابة `403 subscription_required`.
### تدوير المفتاح أو إلغاؤه [#تدوير-المفتاح-أو-إلغاؤه]
أنشئ مفتاحًا بديلًا قبل إلغاء المفتاح القديم. انشر المفتاح البديل، وأرسل طلبًا فعليًا، وتحقق من `x-request-id` الخاص به، ثم انقر **إلغاء** على المفتاح القديم. الإلغاء فوري ولا يمكن التراجع عنه.
في إعدادات **المطوّرون**، يتيح لك **تعديل** تغيير اسم المفتاح النشط ونطاقاته؛ ويسري التغيير فورًا على المفتاح نفسه. أما مدة الصلاحية والرمز فلا يمكن تغييرهما، لذا أنشئ مفتاحًا بديلًا للحصول على مدة صلاحية جديدة أو رمز مُدوَّر.
## تطبيقات OAuth [#تطبيقات-oauth]
يُستخدم OAuth للبرمجيات التي تتصل بحسابات يملكها مستخدمون آخرون في Make Agent Fast. ويعتمد على Authorization Code مع PKCE (`S256`)، ولا يُصدر سرّ عميل ولا يتطلبه. معرّف العميل (client ID) عام؛ أما أكواد التفويض، ورموز الوصول، ورموز التحديث، وPKCE verifier فهي بيانات حساسة.
### 1. سجّل التطبيق [#1-سجّل-التطبيق]
افتح **لوحة التحكم ← الإعدادات ← المطوّرون ← تطبيقات OAuth**. ثم أضف:
* اسم التطبيق بطول من 2 إلى 100 حرف.
* ما بين 1 و10 عناوين URL دقيقة لإعادة التوجيه.
* الحد الأقصى للنطاقات التي يجوز لتطبيقك طلبها.
يجب أن تستخدم عناوين URL لإعادة التوجيه في الإنتاج HTTPS، ولا يجوز أن تتضمن بيانات اعتماد أو أجزاء (fragments). ويجب أن يطابق URI الكامل إحدى القيم المسجّلة أثناء التفويض وتبادل الرمز. تكون حالة التطبيقات المقدَّمة حديثًا `pending`، ولا يعمل التفويض إلا بعد مراجعة التطبيق ووسمه `approved`.
يراجع مالك المنصة معرّفات العملاء المعلّقة عبر سير العمل المدقَّق `oauth:review`. احتفظ بمعرّف العميل الظاهر بعد الإرسال؛ إذ تظهر حالته في صفحة المطوّرين، وتتضمن التطبيقات المرفوضة قرار المراجعة قبل أن يمكن إعادة إرسالها.
### 2. أنشئ قيم PKCE [#2-أنشئ-قيم-pkce]
أنشئ verifier جديدًا لكل محاولة تفويض، واحتفظ به في الجلسة المحمية قصيرة الأمد نفسها التي تحتفظ فيها بالقيمة `state`.
```ts
import { createHash, randomBytes } from "node:crypto";
const verifier = randomBytes(48).toString("base64url");
const challenge = createHash("sha256").update(verifier).digest("base64url");
const state = randomBytes(24).toString("base64url");
```
يجب أن يتكون verifier من 43 إلى 128 حرفًا من أحرف PKCE الآمنة في عناوين URL. ولا يُقبل سوى `code_challenge_method=S256`.
### 3. أعد توجيه المستخدم للموافقة [#3-أعد-توجيه-المستخدم-للموافقة]
```text
https://makeagent.fast/oauth/authorize
?client_id=maf_app_...
&redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fcallback
&response_type=code
&scope=sites%3Aread%20leads%3Aread
&state=RANDOM_STATE
&code_challenge=PKCE_CHALLENGE
&code_challenge_method=S256
```
يسجّل المستخدم الدخول، ويراجع النطاقات المطلوبة، ثم يسمح بالوصول أو يرفضه. عند النجاح، يعيد Make Agent Fast التوجيه إلى URI المسجّل نفسه تمامًا مع `code` وقيمة `state` الأصلية. وعند الرفض، يرسل `error=access_denied` مع قيمة `state` الأصلية إن كانت قد أُرسلت.
ارفض استدعاء الرجوع (callback) إذا لم تطابق قيمة `state` تمامًا القيمة المخزّنة لجلسة المتصفح تلك.
### 4. بادل كود التفويض [#4-بادل-كود-التفويض]
ينتهي كود التفويض بعد 10 دقائق، ولا يمكن استخدامه إلا مرة واحدة.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "code=$AUTHORIZATION_CODE" \
--data-urlencode "redirect_uri=https://app.example.com/oauth/callback" \
--data-urlencode "code_verifier=$PKCE_VERIFIER"
```
```json
{
"access_token": "maf_live_...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "maf_refresh_...",
"scope": "sites:read leads:read"
}
```
يظل رمز الوصول صالحًا لمدة ساعة واحدة. ويظل رمز التحديث صالحًا حتى 90 يومًا ما لم يُدوَّر أو يُلغَ قبل ذلك.
### 5. دوّر رمز التحديث [#5-دوّر-رمز-التحديث]
يؤدي كل تحديث ناجح إلى إلغاء رمز التحديث المُرسَل ورمز الوصول السابق المرتبط به، ثم يُرجع زوجًا جديدًا. احفظ الزوج الجديد بشكل ذرّي قبل التخلص من حالة الاستجابة السابقة.
```bash
curl --fail-with-body https://makeagent.fast/api/oauth/token \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=refresh_token" \
--data-urlencode "client_id=maf_app_..." \
--data-urlencode "refresh_token=$REFRESH_TOKEN"
```
يؤدي إعادة استخدام كود تفويض أو رمز تحديث سبق تدويره إلى الاستجابة `invalid_grant`. وتُرجع نقطة نهاية رمز OAuth استجابات بصيغة OAuth هي `{ "error", "error_description" }` بدلًا من غلاف الأخطاء الخاص بواجهة API العامة، وتسمح بـ 30 طلب رمز لكل عنوان IP للمتصل في الدقيقة.
## لا تصادق أبدًا على طلبات الإدارة في شيفرة المتصفح [#لا-تصادق-أبدًا-على-طلبات-الإدارة-في-شيفرة-المتصفح]
لا تضع مفتاح API سريًا أو رمز وصول أو رمز تحديث في مكوّنات React على جهة العميل، أو في JavaScript ثابت، أو في الويب على الجوال، أو في Webflow أو Framer أو Wix أو Shopify Liquid. استخدم خادمك الخلفي المصادَق عليه. يعتمد تضمين الموقع العام على معرّف موقع (site slug) غير سرّي وعلى قائمة سماح للأصول (origins)، لا على بيانات اعتماد واجهة الإدارة البرمجية.
راجع [بيانات الاعتماد والرموز](/ar/docs/api/credentials) و[النطاقات والأخطاء](/ar/docs/api/scopes-errors) و[البدء السريع مع API](/ar/docs/api/quickstart).
---
# بيانات الاعتماد والرموز المميزة
Source: /ar/docs/api/credentials.md
{/* docs-visuals */}
يستخدم Make Agent Fast عدة أنواع من بيانات الاعتماد، ولا يمكن استبدال بعضها ببعض. قبل نسخ أي قيمة، حدّد الجهة التي أصدرتها، والنظام الذي سيستقبلها، وهل يمكن كشفها بأمان في المتصفح.
## خريطة بيانات الاعتماد [#خريطة-بيانات-الاعتماد]
| بيانات الاعتماد | مكان الإنشاء | الجهة المستخدِمة | سرّية؟ | الصيغة أو القيمة المعتادة |
| ------------------------------------------------------- | -------------------------------------------- | --------------------------------- | ------ | ----------------------------------------- |
| المعرّف المختصر (slug) للموقع المنشور | لوحة تحكم الموقع | أداة تحميل التضمين في الموقع | لا | `my-agent` |
| مفتاح API الخاص بـ Make Agent Fast | **الإعدادات ← المطوّرون** | الخادم الخلفي أو الأتمتة لديك | نعم | `maf_live_...` |
| معرّف عميل OAuth | **الإعدادات ← المطوّرون** | التطبيق متعدد الحسابات | لا | `maf_app_...` |
| رمز وصول OAuth | نقطة نهاية رمز OAuth | الخادم الخلفي لتطبيقك | نعم | رمز Bearer، مدة صلاحيته ساعة واحدة |
| رمز تحديث OAuth | نقطة نهاية رمز OAuth | مخزن الرموز الآمن لديك | نعم | `maf_refresh_...`، يُبدَّل عند كل استخدام |
| مفتاح API لمزوّد الذكاء الاصطناعي (اختياري، باقة Scale) | OpenRouter (للنص) أو Speko (للصوت) | الخادم الخلفي لـ Make Agent Fast | نعم | `sk-or-...` أو `sk_speko_...` |
| رمز الموصّل أو سر التطبيق | Telegram أو Meta أو Discord أو Kakao | خدمة الموصّلات في Make Agent Fast | نعم | يختلف حسب المزوّد |
| سر توقيع الـ webhook | إنشاء نقطة نهاية webhook في واجهة API العامة | مستقبِل الـ webhook لديك | نعم | `whsec_...` |
تحتاج أداة تحميل التضمين إلى المعرّف المختصر العام للموقع ونطاق موقع إلكتروني مسموح به فقط. لا تضف أبدًا مفتاح API الخاص بـ Make Agent Fast أو مفتاح مزوّد أو رمز موصّل أو سر webhook إلى وسم script.
## اختيار طريقة التفويض المناسبة [#اختيار-طريقة-التفويض-المناسبة]
استخدم **مفتاح API الخاص بـ Make Agent Fast** لخادم تتحكم فيه وحساب واحد على Make Agent Fast. اختر فقط النطاقات (scopes) التي يحتاجها ذلك الخادم.
استخدم **OAuth Authorization Code مع PKCE** عندما يربط منتجك حسابات تخص مستخدمين آخرين في Make Agent Fast. تخضع تطبيقات OAuth للمراجعة قبل أن ينجح التفويض في بيئة الإنتاج.
استخدم **مفتاح مزوّد الذكاء الاصطناعي** فقط عندما تريد أن يستدعي Make Agent Fast ذلك المزوّد عبر حسابك لديه. لا يمنح مفتاح المزوّد صلاحية الوصول إلى واجهة API العامة لـ Make Agent Fast.
استخدم **بيانات اعتماد الموصّل** فقط في نموذج الموصّل المطابق أو في طلب API الخاص بالموصّل. لا يمكن لرمز بوت Telegram تفويض Discord أو Meta أو طلبات API الخاصة بـ Make Agent Fast.
## تخزين الأسرار بأمان [#تخزين-الأسرار-بأمان]
في بيئة التطوير المحلية، ضع الأسرار في ملف بيئة مستثنى من التتبع أو في بيئة الطرفية لديك:
```bash
export MAF_API_KEY="maf_live_..."
```
عند النشر، استخدم مدير الأسرار المشفّر لدى مزوّد الاستضافة. لا تضع الأسرار في:
* عمليات Git commit، أو وصف المشكلات (issues)، أو لقطات الشاشة، أو خصائص التحليلات، أو رسائل الدعم.
* المتغيرات `NEXT_PUBLIC_*` أو `VITE_*` أو أي متغيرات أخرى تُضمَّن في JavaScript الخاص بالمتصفح.
* Webflow أو Framer أو Wix أو Shopify Liquid أو HTML في WordPress أو حزمة تطبيق ويب للجوال.
* سلاسل الاستعلام (query strings)، إذ يشيع الاحتفاظ بعناوين URL في سجل المتصفح والوسطاء (proxies) والسجلات.
أجرِ استدعاءات API عبر الخادم الخلفي الموثَّق لديك. يجب أن يستدعي المتصفح خادمك الخلفي، وأن يضيف الخادم الخلفي السر.
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites", {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
```
## قواعد الأسرار التي تُعرض مرة واحدة [#قواعد-الأسرار-التي-تُعرض-مرة-واحدة]
يجب نسخ مفاتيح API وأسرار توقيع webhook ورموز تحديث OAuth المُصدَرة حديثًا عند عرضها، إذ لا يمكن استرجاع القيمة الكاملة لاحقًا. إذا فُقدت، أنشئ بديلًا بدلًا من أن تطلب من الدعم كشفها.
تُشفَّر بيانات اعتماد مزوّدي الذكاء الاصطناعي والموصّلات قبل تخزينها ولا تُعاد عبر واجهات API الخاصة بالقوائم. قد تعرض لوحة التحكم تسمية أو بادئة أو آخر أربعة أحرف أو حالة التحقق أو وقت آخر استخدام، حتى تتمكن من تمييز بيانات الاعتماد دون كشفها.
## قائمة التحقق للتبديل [#قائمة-التحقق-للتبديل]
1. أنشئ البديل بالنطاقات أو أذونات المزوّد الدنيا نفسها.
2. حدّث نشرًا واحدًا أو مستقبِلًا واحدًا في كل مرة.
3. تحقق من نجاح طلب حقيقي وسجّل قيمة `x-request-id` الخاصة به.
4. اسحب بيانات الاعتماد القديمة.
5. تأكد من أن الطلبات القديمة تفشل بالخطأ `401 invalid_api_key` أو ما يعادله لدى المزوّد.
في OAuth، احفظ رمز التحديث الجديد الذي تعيده كل استجابة تحديث قبل التخلص من الرمز السابق. وعند تبديل سر webhook، شغّل نقطتي النهاية القديمة والجديدة بالتوازي إلى أن يستخدم كل منتِج ومستقبِل البديلَ.
## إذا انكشف سر [#إذا-انكشف-سر]
اسحبه أو بدّله فورًا. لا يكفي حذفه من أحدث Git commit، فقد يبقى في السجل التاريخي أو الذاكرة المؤقتة أو السجلات أو النسخ المتفرعة (forks). راجع النشاط في Make Agent Fast وعند المزوّد الذي أصدره، ثم استبدل أي بيانات اعتماد تشترك في موقع التخزين أو بيئة النشر نفسها.
تابع مع [المصادقة](/ar/docs/api/authentication) أو [النطاقات والأخطاء](/ar/docs/api/scopes-errors) أو [مفاتيح مزوّدي الذكاء الاصطناعي](/ar/docs/account/provider-keys).
---
# نظرة عامة على API
Source: /ar/docs/api/overview.md
{/* docs-visuals */}
تستخدم واجهة API العامة تنسيق JSON موجَّهًا نحو الموارد عبر HTTPS ضمن المسار `/api/v1`. وهي متاحة في الباقات المدفوعة، وتعتمد على نفس صلاحيات الموقع والرصيد والميزات المعتمدة في لوحة التحكم.
## ما الذي يمكنك أتمتته [#ما-الذي-يمكنك-أتمتته]
* المواقع وحالة النشر
* إعدادات الـ agent والأسئلة الشائعة والمنتجات والمعرفة
* المحادثات (بما في ذلك ردود المالك والإيقاف المؤقت والاستئناف) والـ leads والتحليلات والإشعارات والرسائل الجماعية
* إنشاء الـ leads وتسجيل موافقتهم، ومسارات الفرص، ونتائج CRM، واستعادة المزامنة
* الـ connectors والتسييل والتذاكر والفريق والاستخدام ومعلومات الحساب
* اشتراكات Webhooks الموقَّعة للأحداث المدعومة
تستخدم الإجراءات الحساسة نقاط نهاية صريحة مخصصة للإجراءات بدلًا من التعديل غير المقيّد على قاعدة البيانات. تُقبل أسرار الـ connector عند الكتابة، لكنها لا تُعاد أبدًا.
هذه **واجهة API للإدارة والمزامنة**. يمكنها إنشاء الـ leads وتحديثها،
وقبولها في مسار الفرص، واستيراد نتائج CRM (الفوز/الخسارة) مع نسبتها إلى مصدرها،
وإعادة محاولة عمليات استيراد النتائج الفاشلة، والرد على الزائر بصفة النشاط التجاري،
مع إيقاف الـ agent مؤقتًا في تلك المحادثة واستئنافه. أما إرسال الرسائل بصفة الزائر
فيظل عملية خاصة بالأداة (widget)، وتبقى التحليلات والاستخدام للقراءة فقط. تمت
إزالة النطاقات المخصصة، وتعيد مسارات `/domains` الرمز `409`.
## ابدأ بأمان [#ابدأ-بأمان]
أنشئ مفتاحًا محدود النطاق من لوحة التحكم، ثم استدعِ نقطة نهاية الحساب الحالي، وابنِ تطبيقك أولًا على موقع تجريبي قبل أن تتعامل مع محتوى الإنتاج.
```bash
curl https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer maf_live_YOUR_KEY"
```
راجع [المصادقة](/ar/docs/api/authentication) و[البدء السريع مع API](/ar/docs/api/quickstart) و[مرجع API](/ar/docs/api/reference).
---
# البدء السريع مع API
Source: /ar/docs/api/quickstart.md
{/* docs-visuals */}
يتحقق هذا الدليل السريع من قدرة الواجهة الخلفية على المصادقة وقراءة بيانات حسابك. تحتاج إلى خطة مدفوعة نشطة، وطرفية تدعم `curl`، وصلاحية الوصول إلى **لوحة التحكم ← الإعدادات ← المطوّرون**.
تتيح الإصدار v1 الحالي من API إدارة الموارد ومزامنتها. وهي ليست وسيلة نقل للمحادثات المخصصة: لا يمكنك إرسال رسائل بصفتك زائرًا. يمكن إنشاء العملاء المحتملين (Leads) وتحديثهم وقبولهم (`leads:write`)، ويمكن للمالك الرد على محادثة أو إيقافها مؤقتًا أو استئنافها (`conversations:write`).
## 1. إنشاء مفتاح بأقل الصلاحيات [#1-إنشاء-مفتاح-بأقل-الصلاحيات]
أنشئ مفتاحًا باسم `Local API quickstart`، وحدّد `account:read` و`sites:read`، واختر مدة صلاحية قصيرة. انسخ المفتاح بصيغته الأصلية فورًا؛ فلن يُعرض مرة أخرى.
لا تستخدم مفتاح مزوّد ذكاء اصطناعي مثل مفتاح OpenRouter أو Speko. تتطلب واجهة API العامة مفتاح Make Agent Fast يبدأ بالبادئة `maf_live_`.
## 2. تخزينه لهذه الطرفية [#2-تخزينه-لهذه-الطرفية]
```bash
export MAF_API_KEY="maf_live_..."
```
تأكد من وجود المتغير دون طباعة السر:
```bash
test -n "$MAF_API_KEY" && echo "MAF_API_KEY is set"
```
لا تضف المفتاح إلى `.env` أو أمثلة سجل الأوامر في الطرفية أو بيانات الاختبار الثابتة أو حزمة المتصفح. وفي الشيفرة المنشورة، استخدم مدير الأسرار الخاص بالمضيف.
## 3. فحص الحساب [#3-فحص-الحساب]
```bash
curl --fail-with-body --include https://makeagent.fast/api/v1/me \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
الحالة المتوقعة: `200 OK`. يحتوي نص الاستجابة على `data.id` ومعلومات الخطة والاستحقاقات وملخص المحفظة. كما تحتوي الاستجابة على `x-request-id`؛ احتفظ بهذه القيمة عند الإبلاغ عن طلب فاشل.
```json
{
"data": {
"id": "ACCOUNT_ID",
"email": "owner@example.com",
"plan": { "id": "pro", "status": "active" },
"entitlements": { "site_limit": 3, "live_voice": true },
"wallet": { "balance": 151 }
}
}
```
قد تُضاف حقول جديدة دون تغيير المسار `/v1`. تجاهل الحقول غير المعروفة بدلًا من رفض الاستجابة.
## 4. عرض المواقع [#4-عرض-المواقع]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites?limit=20" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Accept: application/json"
```
تستخدم استجابات المجموعات هذا الغلاف:
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
إذا كانت قيمة `has_more` تساوي true، فأرسل قيمة `next_cursor` كما هي تمامًا كمعامل الاستعلام `cursor` في الطلب التالي. لا تفك ترميز المؤشرات ولا تنشئها بنفسك.
## 5. التعامل مع خطأ منظَّم [#5-التعامل-مع-خطأ-منظَّم]
أزل ترويسة Authorization مؤقتًا وكرر الطلب إلى `/me`. يجب أن تكون الاستجابة `401` مع رمز ثابت:
```json
{
"error": {
"code": "authentication_required",
"message": "Provide an API key in the Authorization bearer header.",
"request_id": "6c0b2f2e-..."
}
}
```
يجب أن تعتمد الشيفرة الإنتاجية في تفرعاتها على `error.code` لا على مقارنة `message`. سجّل العملية ورمز حالة HTTP ومعرّف الطلب دون تسجيل المفتاح.
## 6. تنفيذ أول عملية كتابة بأمان [#6-تنفيذ-أول-عملية-كتابة-بأمان]
أنشئ مفتاحًا منفصلًا يتضمن أيضًا `sites:write` و`agents:write` و`knowledge:write`؛ ولا توسّع صلاحيات مفتاح القراءة الخاص بالبدء السريع. اتبع [وصفات API](/ar/docs/api/recipes) لإنشاء موقع، وإضافة معرفة موثوقة، ونشره باستخدام مفاتيح idempotency صريحة.
## أخطاء شائعة في الطلب الأول [#أخطاء-شائعة-في-الطلب-الأول]
| النتيجة | السبب | الحل |
| ----------------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| `401 authentication_required` | الترويسة مفقودة أو ليست بصيغة `Bearer TOKEN` | أضف ترويسة Authorization الصحيحة من شيفرة الخادم |
| `401 invalid_api_key` | خطأ إملائي، أو مفتاح منتهي الصلاحية أو ملغى، أو نوع بيانات اعتماد خاطئ | أنشئ مفتاح Make Agent Fast API جديدًا وانسخه |
| `403 subscription_required` | لا توجد خطة مدفوعة نشطة | جدّد اشتراك الحساب |
| `403 insufficient_scope` | المفتاح لا يتضمن صلاحية العملية المطلوبة | أنشئ مفتاحًا بديلًا يتضمن الحد الأدنى من الصلاحية الناقصة |
| `403 account_paused` | تم إيقاف الوصول إلى API مؤقتًا لهذا الحساب | استأنف الوصول إلى API أو تواصل مع مالك الحساب |
| `429 rate_limit_exceeded` | استُنفدت حصة المفتاح لمدة دقيقة واحدة | انتظر حسب `Retry-After` وقلّل عدد الطلبات المتزامنة |
تابع مع [الصلاحيات والأخطاء](/ar/docs/api/scopes-errors) و[مرجع API](/ar/docs/api/reference) و[حدود المعدّل](/ar/docs/api/rate-limits).
---
# حدود المعدّل
Source: /ar/docs/api/rate-limits.md
{/* docs-visuals */}
تطبّق واجهة API العامة حصة طلبات متجدّدة مدتها دقيقة واحدة على كل مفتاح API أو رمز وصول OAuth. إنشاء مفاتيح إضافية للالتفاف على أحد الحدود غير مدعوم، وقد يؤدي إلى فرض قيود على بيانات الاعتماد أو الحساب.
## حدود الخطط [#حدود-الخطط]
| الخطة النشطة | الطلبات لكل مفتاح في الدقيقة |
| ------------ | ---------------------------: |
| Launch | 120 |
| Operate | 600 |
| Scale | 1,800 |
تتلقى بيانات الاعتماد التي لا يملك حسابها خطة مدفوعة نشطة الاستجابة `403 subscription_required` قبل منحها أي سعة ضمن حدود المعدّل. يمكن لـ Make Agent Fast تطبيق حدود أدنى خاصة ببعض نقاط النهاية للعمليات المكلفة بشكل غير معتاد، وعند حدوث ذلك سيوضّح مرجع نقطة النهاية هذه الحدود صراحةً.
## استجابة تجاوز حد المعدّل [#استجابة-تجاوز-حد-المعدّل]
عند استنفاد الحصة، تعيد API الاستجابة `429 rate_limit_exceeded` مع:
```http
HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-Request-Id: 6c0b2f2e-...
Content-Type: application/json
```
تمثّل `Retry-After` الحد الأدنى لعدد الثواني التي يجب انتظارها. كما تتضمن كل استجابة موثّقة
الترويسات `X-RateLimit-Limit` و`X-RateLimit-Remaining` و
`X-RateLimit-Reset` (طابع زمني بنظام Unix)، بحيث تستطيع التطبيقات تنظيم معدّل طلباتها قبل الوصول إلى
`429`.
## تنفيذ إعادة المحاولة [#تنفيذ-إعادة-المحاولة]
استخدم التراجع الأسّي مع تباين عشوائي (jitter)، والتزم بقيمة `Retry-After` إذا كانت أكبر، وحدّد سقفًا لإجمالي عدد المحاولات.
```ts
async function requestWithRetry(url: string, init: RequestInit, attempts = 4) {
for (let attempt = 0; attempt < attempts; attempt += 1) {
const response = await fetch(url, init);
if (response.status !== 429 && response.status < 500) return response;
if (attempt === attempts - 1) return response;
const retryAfter = Number(response.headers.get("retry-after") ?? 0) * 1_000;
const exponential = 500 * 2 ** attempt;
const jitter = Math.random() * 250;
await new Promise((resolve) =>
setTimeout(resolve, Math.max(retryAfter, exponential + jitter)),
);
}
throw new Error("unreachable");
}
```
في طلبات `POST` و`PATCH` و`DELETE`، احتفظ بالقيمة الصالحة نفسها للترويسة `Idempotency-Key` عبر كل عمليات إعادة المحاولة الناتجة عن أخطاء الشبكة أو الخادم. قد يؤدي مفتاح idempotency جديد إلى تكرار أثر جانبي اكتمل بالفعل.
## تقليل حجم الطلبات [#تقليل-حجم-الطلبات]
* خزّن مؤقتًا عمليات قراءة الحساب والموقع والإعدادات التي لا تتطلب بيانات محدّثة في الوقت الفعلي.
* اطلب ما يصل إلى `100` سجل في الصفحة بدلًا من طلب صفحات صغيرة جدًا بشكل متكرر.
* عالج أحداث webhook بدلًا من الاستعلام الدوري عن المحادثات أو العملاء المحتملين (Leads) أو رسائل البث.
* حدّد عدد العمليات المتزامنة للعمال (workers) لكل مفتاح API؛ فالدفعات المفاجئة من عدد كبير من استدعاءات serverless تتشارك الحصة نفسها.
* استخدم مفاتيح منفصلة للخدمات المنفصلة لأغراض العزل وسهولة التدقيق، وليس لمضاعفة سعة عبء عمل واحد.
## جدول ما يُعاد وما لا يُعاد [#جدول-ما-يُعاد-وما-لا-يُعاد]
| الاستجابة | هل تُعاد المحاولة؟ | الشرط |
| --------------------------------- | ------------------ | ---------------------------------------------------------------------------- |
| `429` | نعم | انتظر مدة `Retry-After`، وأضف jitter، وحدّد سقفًا للمحاولات |
| `500` | أحيانًا | عمليات القراءة الآمنة أو عمليات التعديل المحمية بمفتاح idempotency نفسه |
| تعارض معالجة `409` | نعم | انتظر وفق الترويسة `Retry-After: 2` واحتفظ بمفتاح idempotency نفسه |
| أي `409` آخر | ليس فورًا | اقرأ الحالة الحالية للمورد وعالج التعارض |
| `503` مع `outcome_unknown` | لا | ربما اكتملت عملية التعديل؛ تحقق من المورد قبل استخدام مفتاح idempotency جديد |
| `400` و`401` و`403` و`404` و`415` | لا | صحّح أولًا المدخلات أو بيانات الاعتماد أو الاستحقاق أو المسار أو نوع المحتوى |
إذا تجاوز عبء عمل مستمر حصة خطتك بشكل مشروع، فقلّل الاستعلام الدوري، أو جمّع العمليات في دفعات، أو تواصل مع الدعم مع معرّفات طلبات تمثيلية وحجم الزيارات المتوقع، بدلًا من إضافة حلقة إعادة محاولة بلا حدود.
---
# وصفات API
Source: /ar/docs/api/recipes.md
{/* docs-visuals */}
تستخدم هذه الوصفات REST الخام، لذا تعمل قبل تثبيت SDK عام. اضبط `MAF_API_KEY` في بيئة الخادم، واستبدل المعرّفات بالقيم التي أعادتها الخطوات السابقة.
## وصفة: إنشاء ونشر وكيل مستند إلى مصادر موثوقة [#وصفة-إنشاء-ونشر-وكيل-مستند-إلى-مصادر-موثوقة]
أنشئ مفتاح API واحدًا بالصلاحيات `sites:write` و`agents:write` و`knowledge:write`. أضف `sites:read` إذا كانت الأتمتة تعرض المواقع أو تتحقق منها أيضًا.
### 1. إنشاء الموقع [#1-إنشاء-الموقع]
```bash
curl --fail-with-body https://makeagent.fast/api/v1/sites \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-site-2026-01" \
-d '{
"title": "Acme support",
"slug": "acme-support",
"type": "business",
"template": "minimal",
"content": {
"headline": "Ask Acme support"
},
"persona_mode": "assistant",
"languages": ["en"]
}'
```
الاستجابة الناجحة هي `201 Created`، وتتضمن الموقع ضمن `data`، وتعيد مسار المورد القياسي في ترويسة `Location`. احفظ `data.id` باسم `SITE_ID`.
### 2. إعداد الوكيل وسياسة التضمين [#2-إعداد-الوكيل-وسياسة-التضمين]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-agent-2026-01" \
-d '{
"display_name": "Acme guide",
"persona_mode": "assistant",
"instructions": "Answer only from confirmed Acme sources. If the answer is missing, say that a teammate will follow up.",
"languages": ["en"],
"embed_enabled": true,
"allowed_origins": ["https://www.acme.example", "https://staging.acme.example"]
}'
```
المصادر المسموح بها (origins) هي مصادر مطابقة تمامًا: المخطط (scheme) واسم المضيف ومنفذ اختياري. لا تُضمّن مسارًا ولا حرفًا بديلًا (wildcard) في النهاية.
### 3. إضافة مصدر معرفة نصي [#3-إضافة-مصدر-معرفة-نصي]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/knowledge" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-returns-2026-01" \
-d '{
"name": "Returns policy 2026-01",
"text": "Customers may request a return within 30 days of delivery. Contact support before sending an item back."
}'
```
يجب أن يتراوح طول النص الملصوق بين 5 و200,000 حرف. يمكن لنقطة النهاية نفسها أيضًا الزحف إلى موقع ويب باستخدام `{ "url", "max_pages", "refresh_hours" }` (بحد أقصى 40 لـ `max_pages`)، أو استيراد `{ "kind": "youtube" | "podcast" | "feed", "url" }`؛ وتتطلب مصادر الوسائط هذه باقة Operate أو Scale، وتعيد `409` على باقة Launch. أما رفع الملفات فيبقى متاحًا في لوحة التحكم.
### 4. إضافة سؤال شائع منظَّم [#4-إضافة-سؤال-شائع-منظَّم]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/faqs" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-faq-returns-2026-01" \
-d '{
"question": "How long do I have to return an order?",
"answer": "You may request a return within 30 days of delivery.",
"approved": true
}'
```
### 5. النشر [#5-النشر]
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/publish" \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-acme-publish-2026-01" \
-d '{"published": true}'
```
يجب أن تحتوي الاستجابة على `{"data":{"id":"...","status":"published"}}`. افتح تضمينًا حقيقيًا واطرح سؤالًا تظهر إجابته في المصدر. يثبت النشر أن حالة الوكيل قد تغيّرت، لكنه لا يثبت أن جودة المصدر أو مصدر التضمين (origin) صحيحان.
## وصفة: تصفّح العملاء المحتملين (Leads) صفحةً بعد صفحة بأمان [#وصفة-تصفّح-العملاء-المحتملين-leads-صفحةً-بعد-صفحة-بأمان]
استخدم مفتاحًا يملك الصلاحية `leads:read`. تعامل مع `next_cursor` على أنه قيمة معتمة (opaque) وقم بترميزه بصيغة URL.
```ts
const base = `https://makeagent.fast/api/v1/sites/${siteId}/leads`;
let cursor: string | null = null;
do {
const url = new URL(base);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.MAF_API_KEY}` },
});
if (!response.ok) throw await response.json();
const page = await response.json();
for (const lead of page.data) await exportLead(lead);
cursor = page.next_cursor;
} while (cursor);
```
لا تفكّ ترميز المؤشر (cursor) ولا تعدّله ولا تفرزه ولا تعِد استخدامه مع مجموعة بيانات مختلفة.
## وصفة: تعطيل التضمين أثناء حادث [#وصفة-تعطيل-التضمين-أثناء-حادث]
استخدم الصلاحية `agents:write` وأبقِ مفتاح idempotency نفسه عبر إعادات المحاولة الناتجة عن مشكلات الشبكة:
```bash
curl --fail-with-body "https://makeagent.fast/api/v1/sites/$SITE_ID/agent" \
-X PATCH \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: incident-2026-07-embed-off" \
-d '{"embed_enabled": false}'
```
بعد نجاح الاستجابة، تحقق من أن أيقونة فتح المحادثة (launcher) لم تعد تعمل على مضيف مسموح به. أعد تفعيله بمفتاح جديد لحل الحادث بعد تصحيح مشكلة المصدر (origin) أو المحتوى أو بيانات الاعتماد.
## قائمة التحقق للإنتاج [#قائمة-التحقق-للإنتاج]
* استخدم مفتاحًا منفصلًا لكل خدمة ولكل بيئة.
* احفظ معرّفات الموارد ومفاتيح idempotency قبل إرسال أي عملية تعديل.
* حدّد مهلات للاتصال وللاستجابة.
* التزم بـ `Retry-After` وضع حدًا أقصى لإعادات المحاولة.
* سجّل اسم العملية ورمز حالة HTTP ومعرّف الطلب دون تسجيل الأسرار أو البيانات الشخصية.
* اختبر على موقع غير إنتاجي قبل منح صلاحيات الكتابة للإنتاج.
---
# مرجع API
Source: /ar/docs/api/reference.md
{/* docs-visuals */}
المرجع المعتمد القابل للقراءة آليًا هو [OpenAPI JSON](/api/openapi.json). هذه الصفحة هي فهرس العمليات المقروء للبشر، وتشرح القواعد المشتركة بين جميع نقاط النهاية.
## عنوان URL الأساسي والإصدار [#عنوان-url-الأساسي-والإصدار]
```text
https://makeagent.fast/api/v1
```
يُعد الإصدار الرئيسي جزءًا من المسار. قد تظهر حقول إضافية دون تغيير الإصدار الرئيسي، لذا تجاهل أي حقول غير معروفة في الاستجابة. تستخدم جميع طلبات الإدارة HTTPS ومفتاح API من نوع bearer أو رمز وصول OAuth.
## الترويسات الشائعة [#الترويسات-الشائعة]
```http
Authorization: Bearer maf_live_...
Accept: application/json
Content-Type: application/json
Idempotency-Key: your-stable-operation-key
```
الترويسة `Content-Type` مطلوبة لأجسام JSON في طلبات `POST` و`PATCH`، بما في ذلك `{}`. أما `Idempotency-Key` فهي اختيارية، لكننا نوصي بها بشدة لكل طلب `POST` و`PATCH` و`DELETE`.
## الحساب والمواقع [#الحساب-والمواقع]
| الأسلوب | المسار | النطاق | الغرض |
| -------- | ---------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/me` | `account:read` | قراءة ملخص الحساب والخطة والاستحقاقات والمحفظة |
| `GET` | `/sites` | `sites:read` | عرض المواقع المملوكة |
| `POST` | `/sites` | `sites:write` | إنشاء موقع ووكيله الافتراضي |
| `GET` | `/sites/{site_id}` | `sites:read` | جلب موقع واحد مملوك |
| `PATCH` | `/sites/{site_id}` | `sites:write` | تحديث حقول الموقع الآمنة |
| `DELETE` | `/sites/{site_id}` | `sites:write` | حذف الموقع والموارد التابعة له |
| `POST` | `/sites/{site_id}/publish` | `sites:write` | النشر أو إلغاء النشر باستخدام `{ "published": boolean }` |
| `GET` | `/sites/{site_id}/agent` | `agents:read` | قراءة إعدادات الوكيل |
| `PATCH` | `/sites/{site_id}/agent` | `agents:write` | تحديث وضع الشخصية والغرض والاسم المعروض والتعليمات والصوت واللغات والنموذج والمظهر وإطار التضمين والشارة وحالة التضمين أو المصادر المسموح بها |
| `GET` | `/sites/{site_id}/billing` | `account:read` | قراءة الخطة والفترة والمحفظة والإضافات وروابط الفوترة في لوحة التحكم |
| `PATCH` | `/sites/{site_id}/workspace` | `team:write` | إعادة تسمية الشركة المالكة للوكيل |
| `PATCH` | `/sites/{site_id}/retention` | `team:write` | تحديد مدة الاحتفاظ بالمحادثات |
يتطلب إنشاء الموقع الحقلين `title` و`content.headline`. وتشمل الحقول الاختيارية `slug` و`type` و`template` ومحتوى إضافيًا و`persona_mode`، ولغة واحدة إلى أربع لغات من `en` و`ko` و`uz` و`ru`.
يمرّر الطلب `PATCH /agent` الحقول `model` و`appearance` و`embed_chrome` و`badge_hidden` عبر فحوصات الخطة نفسها المطبّقة في لوحة التحكم؛ فالقيمة `badge_hidden: true` تتطلب خطة مؤهلة أو إضافة الشارة.
## التثبيت وأداة الموقع [#التثبيت-وأداة-الموقع]
| الأسلوب | المسار | النطاق | الغرض |
| ------- | -------------------------------- | -------------- | ------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/install` | `agents:read` | قراءة وجهة التثبيت وحالة التضمين والمصادر المسموح بها وأدلة التثبيت |
| `PATCH` | `/sites/{site_id}/install` | `agents:write` | تحديد الصفحة التي يجب تثبيت الأداة عليها |
| `POST` | `/sites/{site_id}/install/check` | `agents:write` | التحقق مما إذا كان مقتطف التضمين يعمل في الصفحة المستهدفة |
## المعرفة والأسئلة الشائعة [#المعرفة-والأسئلة-الشائعة]
| الأسلوب | المسار | النطاق | الغرض |
| ------------------ | -------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------ |
| `GET` | `/sites/{site_id}/knowledge` | `knowledge:read` | عرض مصادر المعرفة |
| `POST` | `/sites/{site_id}/knowledge` | `knowledge:write` | استيعاب نص ملصوق، أو زحف موقع إلكتروني، أو استيراد مصدر YouTube أو بودكاست أو تغذية (feed) |
| `PATCH` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | تحديد `refresh_hours` أو `approval_status` الخاص بحزمة المشتري |
| `POST` | `/sites/{site_id}/knowledge/{source_id}/recrawl` | `knowledge:write` | وضع إعادة قراءة مصدر تم جلبه في قائمة الانتظار؛ يعيد `202` |
| `DELETE` | `/sites/{site_id}/knowledge/{source_id}` | `knowledge:write` | حذف مصدر واحد من الاسترجاع مستقبلًا |
| `GET` | `/sites/{site_id}/faqs` | `knowledge:read` | عرض الأسئلة الشائعة المنظَّمة |
| `POST` | `/sites/{site_id}/faqs` | `knowledge:write` | إنشاء `{ "question", "answer", "approved" }` |
| `POST` | `/sites/{site_id}/faqs/generate` | `knowledge:write` | صياغة مسودات أسئلة شائعة من معرفة الوكيل |
| `POST` | `/sites/{site_id}/faqs/approve-all` | `knowledge:write` | اعتماد ونشر كل مسودات الأسئلة الشائعة |
| `PATCH` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | تحديث السؤال أو الإجابة أو حالة الاعتماد |
| `DELETE` | `/sites/{site_id}/faqs/{faq_id}` | `knowledge:write` | حذف سؤال شائع |
| `GET` / `PATCH` | `/sites/{site_id}/fact-sheet` | `knowledge:read` / `knowledge:write` | قراءة صحيفة الحقائق المستخرجة عن النشاط التجاري، أو تعديل الحقائق التي أخطأ الاستخراج فيها |
| `POST` | `/sites/{site_id}/fact-sheet/reextract` | `knowledge:write` | إعادة قراءة الموقع الإلكتروني وإعادة بناء صحيفة الحقائق |
| `POST` | `/sites/{site_id}/qa` | `knowledge:write` | نشر أزواج أسئلة وأجوبة منتقاة |
| `POST` | `/sites/{site_id}/answers/revise` | `knowledge:write` | تعليم الوكيل الإجابة التي كان ينبغي أن يقدّمها |
| `GET` | `/sites/{site_id}/knowledge-connections` | `knowledge:read` | عرض اتصالات المعرفة مع Notion وDrive وMCP |
| `GET` | `/sites/{site_id}/knowledge-connections/connect-links` | `knowledge:read` | الحصول على عناوين URL في لوحة التحكم التي تبدأ اتصال Notion أو Drive |
| `PATCH` / `DELETE` | `/sites/{site_id}/knowledge-connections/{connection_id}` | `knowledge:write` | تحديد وتيرة المزامنة أو العناصر المحددة أو أداة الاستيراد؛ أو فصل الاتصال وحذف بياناته |
| `GET` | `/sites/{site_id}/knowledge-connections/{connection_id}/items` | `knowledge:read` | عرض الصفحات أو قواعد البيانات أو الملفات التي يمكن للاتصال استيرادها |
| `POST` | `/sites/{site_id}/knowledge-connections/{connection_id}/sync` | `knowledge:write` | وضع مزامنة اتصال المعرفة في قائمة الانتظار |
يقبل `POST /knowledge` ثلاثة أنواع من الأجسام: `{ "name", "text" }` بطول من 5 إلى 200,000 حرف؛ و`{ "url", "max_pages", "refresh_hours" }` لزحف موقع إلكتروني (`max_pages` من 1 إلى 40، و`refresh_hours` من 1 إلى 8,760 أو `null`)؛ و`{ "kind": "youtube" | "podcast" | "feed", "url", "refresh_hours" }`. تتطلب مصادر YouTube والبودكاست والتغذية خطة Operate أو Scale؛ وفي خطة Launch تعيد `409 conflict`. أما رفع الملفات فيبقى عملية تتم من لوحة التحكم.
## المحادثات والعملاء المحتملون والتحليلات والاستخدام [#المحادثات-والعملاء-المحتملون-والتحليلات-والاستخدام]
| الأسلوب | المسار | النطاق | الغرض |
| ------- | --------------------------------------------------------- | --------------------- | ----------------------------------------------------- |
| `GET` | `/sites/{site_id}/conversations` | `conversations:read` | عرض سلاسل المحادثات |
| `GET` | `/sites/{site_id}/conversations/{conversation_id}` | `conversations:read` | جلب سلسلة محادثة ورسائلها مقسّمة إلى صفحات |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/reply` | `conversations:write` | الرد على الزائر بصفة النشاط التجاري |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/pause` | `conversations:write` | إيقاف الوكيل مؤقتًا في هذه المحادثة وتولّيها |
| `POST` | `/sites/{site_id}/conversations/{conversation_id}/resume` | `conversations:write` | إعادة المحادثة إلى الوكيل |
| `GET` | `/sites/{site_id}/leads` | `leads:read` | عرض العملاء المحتملين الذين تم التقاطهم |
| `POST` | `/sites/{site_id}/leads` | `leads:write` | إنشاء عميل محتمل معتمد بموافقة صريحة وتفضيلات تواصل |
| `GET` | `/sites/{site_id}/leads/{lead_id}` | `leads:read` | جلب عميل محتمل واحد |
| `PATCH` | `/sites/{site_id}/leads/{lead_id}` | `leads:write` | تحديث عميل محتمل أو تأهيله أو تغيير سياسة التواصل معه |
| `POST` | `/sites/{site_id}/leads/{lead_id}/accept` | `leads:write` | قبول عميل محتمل ضمن مسار الفرص |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup` | `leads:write` | إرسال رسالة المتابعة إلى عميل محتمل |
| `POST` | `/sites/{site_id}/leads/{lead_id}/followup/draft` | `leads:write` | إعادة صياغة رسالة المتابعة دون إرسالها |
| `GET` | `/sites/{site_id}/analytics` | `analytics:read` | عرض أحداث التحليلات |
| `GET` | `/sites/{site_id}/report` | `analytics:read` | قراءة تقرير التحليلات المجمَّع |
| `POST` | `/sites/{site_id}/report/unanswered-faq` | `knowledge:write` | الإجابة عن سؤال بلا إجابة وإضافته كسؤال شائع جديد |
| `GET` | `/sites/{site_id}/usage` | `usage:read` | عرض أحداث الاستخدام المقاس |
تقبل مجموعات الأحداث والأنشطة هذه المعامِلين `limit` و`cursor`. قد تحتوي السجلات المعادة على بيانات شخصية؛ خزّنها وصدّرها وفق التزاماتك في الخصوصية.
ردود المالك مدعومة: تتولى `reply` و`pause` و`resume` سلسلة محادثة على الويب أو محادثة على Telegram أو WhatsApp أو Messenger أو Instagram بالطريقة نفسها التي تعمل بها لوحة التحكم. أما إرسال الرسائل بصفة الزائر فليس عملية عامة في API.
تعديل العملاء المحتملين مدعوم؛ لا تضبط `consent_status: granted` ما لم يكن لدى نظامك
سجل موافقة يمكن الدفاع عنه. تُستبعد الموافقة غير المعروفة من الرسائل الجماعية.
## مسار الفرص ونتائج CRM [#مسار-الفرص-ونتائج-crm]
| الأسلوب | المسار | النطاق | الغرض |
| --------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------- |
| `GET` / `POST` | `/sites/{site_id}/pipeline/stages` | `pipeline:read` / `pipeline:write` | عرض المراحل أو إعدادها |
| `GET` / `POST` | `/sites/{site_id}/pipeline/accounts` | `pipeline:read` / `pipeline:write` | عرض حسابات الأعمال أو إنشاؤها |
| `GET` | `/sites/{site_id}/pipeline/accounts/{account_id}` | `pipeline:read` | جلب حساب أعمال |
| `GET` / `POST` | `/sites/{site_id}/pipeline/opportunities` | `pipeline:read` / `pipeline:write` | عرض الفرص أو إنشاؤها |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline/opportunities/{opportunity_id}` | `pipeline:read` / `pipeline:write` | قراءة النشاط أو تحديث الإسناد والقيمة والمرحلة والإجراء التالي والرد البشري |
| `POST` | `/sites/{site_id}/pipeline/outcomes` | `pipeline:write` | استيراد نتيجة ربح أو خسارة مصدرها CRM بطريقة idempotent |
| `GET` | `/sites/{site_id}/pipeline/sync-records` | `pipeline:read` | عرض حالة المزامنة والمحاولات والأخطاء |
| `POST` | `/sites/{site_id}/pipeline/sync-records/{sync_record_id}/retry` | `pipeline:write` | إعادة محاولة نتيجة فاشلة من حمولتها المخزَّنة |
| `GET` / `PATCH` | `/sites/{site_id}/pipeline-workflow` | `pipeline:read` / `pipeline:write` | قراءة سياسة الرد في المبيعات أو تحديثها |
| `GET` / `POST` | `/sites/{site_id}/pilots` | `pipeline:read` / `pipeline:write` | عرض التجارب التجريبية الموجَّهة أو بدؤها |
| `GET` | `/sites/{site_id}/pilots/{pilot_id}` | `pipeline:read` | قراءة تجربة تجريبية ومرحلتها وأعدادها وقائمة مهامها |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/setup`, `/start`, `/stop`, `/review`, `/decision`, `/complete`, `/delete` | `pipeline:write` | نقل تجربة تجريبية عبر الإعداد والقياس والمراجعة والقرار والإغلاق، أو حذفها مع أدلتها (سبع عمليات) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/outcomes`, `/bookings` | `pipeline:write` | تسجيل نتيجة عميل محتمل أو نتيجة حجز (عمليتان) |
| `POST` | `/sites/{site_id}/pilots/{pilot_id}/report/approve`, `/report/revoke` | `pipeline:write` | اعتماد تقرير التجربة القابل للمشاركة أو إلغاء اعتماده (عمليتان) |
| `GET` / `POST` | `/sites/{site_id}/buyer-packs` | `pipeline:read` / `pipeline:write` | عرض حزم المشتري، أو إنشاء حزمة من مصادر معتمدة |
| `PATCH` | `/sites/{site_id}/buyer-packs/{pack_id}` | `pipeline:write` | استبدال عنوان الحزمة وجمهورها وملخصها ومصادرها وأقسامها |
| `POST` | `/sites/{site_id}/buyer-packs/{pack_id}/approve`, `/revoke` | `pipeline:write` | تفعيل رابط مشاركة الحزمة أو تعطيله (عمليتان) |
يبقى `provider` الخاص بـ CRM الذي تم تقديمه، والمعرّف الخارجي، ومفتاح idempotency
في سجل التدقيق. تتولى إعادة المحاولة سجلًا فاشلًا فقط، ولا تحوّل أبدًا
عملية كتابة خارجية قيد التنفيذ إلى نجاح كاذب.
## الموصّلات [#الموصّلات]
| الأسلوب | المسار | النطاق | الغرض |
| -------- | --------------------------------------------- | ------------------ | -------------------------------------------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/connectors` | `connectors:read` | عرض حالة الموصّلات دون الأسرار |
| `POST` | `/sites/{site_id}/connectors` | `connectors:write` | ربط قناة: التحقق من بيانات الاعتماد مباشرةً، وتهيئة webhook الخاص بها، وإرجاع قائمة مراجعة الإعداد |
| `PATCH` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | تحديد `status` أو `reply_with_voice` |
| `DELETE` | `/sites/{site_id}/connectors/{connector_id}` | `connectors:write` | إلغاء تهيئة موصّل وإزالته |
| `POST` | `/sites/{site_id}/concierge` | `connectors:write` | طلب أن تتولى المنصة ربط قناة مراسلة نيابةً عنك |
| `GET` | `/sites/{site_id}/domains` | `domains:read` | أُزيل — يعيد `409`. النطاقات المخصصة غير متاحة |
| `POST` | `/sites/{site_id}/domains` | `domains:write` | أُزيل — يعيد `409` |
| `PATCH` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | أُزيل — يعيد `409` |
| `POST` | `/sites/{site_id}/domains/{domain_id}/verify` | `domains:write` | أُزيل — يعيد `409` |
| `DELETE` | `/sites/{site_id}/domains/{domain_id}` | `domains:write` | أُزيل — يعيد `409` |
يستخدم إنشاء الموصّل جسمًا يتحدد بحسب القناة. تختلف حقول بيانات الاعتماد بين `telegram` و`whatsapp` و`messenger` و`instagram` و`discord` و`kakao`؛ استخدم دليل الموصّل المطابق قبل إرسال الأسرار.
## الرسائل الجماعية والإشعارات وتحقيق الدخل [#الرسائل-الجماعية-والإشعارات-وتحقيق-الدخل]
| الأسلوب | المسار | النطاق | الغرض |
| -------- | ----------------------------------------------------- | --------------------- | ------------------------------------------------------------- |
| `GET` | `/sites/{site_id}/broadcasts` | `broadcasts:read` | عرض الرسائل الجماعية |
| `POST` | `/sites/{site_id}/broadcasts` | `broadcasts:write` | إنشاء مسودة رسالة جماعية عبر Kakao |
| `POST` | `/sites/{site_id}/broadcasts/{broadcast_id}/send` | `broadcasts:write` | وضع مسودة موجودة في قائمة الانتظار؛ يعيد `202` |
| `GET` | `/sites/{site_id}/notifications` | `notifications:read` | عرض إشعارات المالك |
| `POST` | `/sites/{site_id}/notifications/read-all` | `notifications:write` | تعليم جميع إشعارات المالك لهذا الوكيل كمقروءة |
| `PATCH` | `/sites/{site_id}/notifications/{notification_id}` | `notifications:write` | التعليم كمقروء أو غير مقروء باستخدام `{ "read": boolean }` |
| `GET` | `/sites/{site_id}/alerts` | `notifications:read` | قراءة حالة قناة تنبيهات المالك ورابطها في لوحة التحكم |
| `GET` | `/sites/{site_id}/monetization/products` | `monetization:read` | عرض منتجات الموقع |
| `POST` | `/sites/{site_id}/monetization/products` | `monetization:write` | إنشاء منتج من نوع `access` أو `consult` أو `tip` أو `digital` |
| `PATCH` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | تحديث حقول المنتج وحالة تفعيله |
| `DELETE` | `/sites/{site_id}/monetization/products/{product_id}` | `monetization:write` | حذف منتج |
يقبل إنشاء الرسائل الجماعية حاليًا القناة `kakao` فقط. يفشل وضعها في قائمة الانتظار مع `409 conflict` عندما لا يوجد مستلمون يمكن الوصول إليهم أو عندما لا تعود الرسالة مسودة.
## الإجراءات والتذاكر والفريق [#الإجراءات-والتذاكر-والفريق]
| الأسلوب | المسار | النطاق | الغرض |
| ------------------ | --------------------------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------- |
| `GET` / `PATCH` | `/sites/{site_id}/actions` | `agents:read` / `agents:write` | قراءة أو إعداد الإجراءات وwebhook العام ورابط الحجز وتذاكر الدعم |
| `GET` | `/sites/{site_id}/tickets` | `tickets:read` | عرض تذاكر الدعم |
| `GET` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:read` | قراءة تذكرة ورسائلها |
| `PATCH` | `/sites/{site_id}/tickets/{ticket_id}` | `tickets:write` | تحديد الحالة والأولوية والمسؤول المعيَّن (اختياري) |
| `POST` | `/sites/{site_id}/tickets/{ticket_id}/messages` | `tickets:write` | إضافة ملاحظة داخلية، أو ضبط `internal: false` للرد على العميل عبر البريد الإلكتروني |
| `GET` | `/sites/{site_id}/team` | `team:read` | قراءة الأعضاء والدعوات وأحداث التدقيق المسموح بها |
| `POST` | `/sites/{site_id}/team/invitations` | `team:write` | إنشاء رابط دعوة دون إرسال بريد إلكتروني |
| `DELETE` | `/sites/{site_id}/team/invitations/{invitation_id}` | `team:write` | إلغاء دعوة معلّقة |
| `PATCH` / `DELETE` | `/sites/{site_id}/team/members/{membership_id}` | `team:write` | تغيير دور عضو غير مالك، أو إزالة العضو |
## Webhooks للمطورين وأدوات الإعداد [#webhooks-للمطورين-وأدوات-الإعداد]
| الأسلوب | المسار | النطاق | الغرض |
| -------- | ---------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/webhook-endpoints` | `webhooks:read` | عرض حالة نقاط النهاية دون أسرار التوقيع |
| `POST` | `/webhook-endpoints` | `webhooks:write` | تسجيل عنوان URL عام عبر HTTPS وإظهار سر التوقيع مرة واحدة |
| `DELETE` | `/webhook-endpoints/{endpoint_id}` | `webhooks:write` | حذف نقطة نهاية وإيقاف التسليم مستقبلًا |
| `GET` | `/setup/tools` | أي بيانات اعتماد صالحة | اكتشاف أدوات الإعداد لتكاملات API وMCP وGitHub |
| `POST` | `/setup/tools/{tool_name}` | بحسب الأداة | تشغيل أداة إعداد؛ تتطلب طلبات المنصة نطاقات نقاط النهاية الخاصة بها، ويستخدم فحص GitHub النطاق `integrations:read`، ويستخدم إعداد PR النطاق `integrations:write` |
يجب أن تستخدم عناوين URL الخاصة بـ webhook بروتوكول HTTPS، ولا يجوز أن تتضمن بيانات اعتماد أو منفذًا مخصصًا، ويجب أن تُحلَّ إلى عناوين IP عامة فقط.
## ترقيم الصفحات [#ترقيم-الصفحات]
تقبل المجموعات المقسّمة إلى صفحات المعامِل `limit` من `1` إلى `100`؛ والقيمة الافتراضية `50`. استخدم `next_cursor` المعتم المُعاد مع المجموعة والمرشِّحات نفسها فقط.
```json
{
"data": [],
"has_more": false,
"next_cursor": null
}
```
تعيد بعض مجموعات الإعدادات الصغيرة الغلاف نفسه مع `has_more: false` ولا تحتاج إلى مؤشر (cursor).
## Idempotency [#idempotency]
يجب أن يتكوّن مفتاح idempotency من 8 إلى 200 حرف من الأحرف والأرقام و`.` و`_` و`:` و`-`. تُحفَظ النتائج لمدة 24 ساعة وتُحصر في نطاق مالك بيانات الاعتماد.
* المفتاح نفسه مع الأسلوب والمسار والاستعلام والجسم نفسها: يعيد الاستجابة المخزَّنة مع `x-idempotent-replayed: true`.
* المفتاح نفسه مع مدخلات مختلفة: يعيد `409 conflict`.
* المفتاح نفسه أثناء معالجة الطلب الأول: يعيد `409 conflict` و`Retry-After: 2`.
احفظ المفتاح قبل إرسال عملية التعديل، ولا تعد استخدامه إلا لإعادة محاولات العملية المنطقية نفسها.
## الاستجابات والأخطاء [#الاستجابات-والأخطاء]
تغلّف استجابات النجاح مواردها داخل `data`. تعيد عمليات الإنشاء عادةً `201`؛ وتعيد عمليات إرسال الرسائل الجماعية الموضوعة في قائمة الانتظار `202`؛ وتعيد العمليات الناجحة الأخرى `200`. تتضمن كل استجابة `x-request-id` وتستخدم `Cache-Control: no-store` لبيانات API.
راجع [النطاقات والأخطاء](/ar/docs/api/scopes-errors) للاطلاع على جدول رموز الأخطاء الكامل، و[وصفات API](/ar/docs/api/recipes) لسير عمل جاهزة للنسخ.
## عملاء MCP [#عملاء-mcp]
اربط عميل MCP يدعم Streamable HTTP بالعنوان `https://makeagent.fast/api/mcp`. تفتح العملاء التي تدعم اكتشاف OAuth المتصفح لتسجيل الدخول والموافقة. تحقّق من هوية العميل والشركة والنطاقات المطلوبة قبل الموافقة. تطلب الموافقة الأولى النطاقات التي تستخدمها الأدوات (`sites:read` و`sites:write` و`agents:write` و`analytics:read` و`conversations:read` و`conversations:write` و`leads:read` و`leads:write` و`knowledge:write`)؛ وتُطالَب بيانات الاعتماد التي ينقصها أحدها بالتفويض مرة أخرى. يلزم وجود خطة نشطة.
بالنسبة إلى العملاء الذين يستخدمون بيانات اعتماد مهيأة يدويًا، أنشئ مفتاح API محدد النطاق في [إعدادات المطورين](/dashboard/settings/developer) وأرسله في الترويسة `Authorization: Bearer ...`. أبقِ بيانات الاعتماد بعيدة عن التحكم بالمصدر وعن شيفرة المتصفح. يمكنك إلغاء مفاتيح API أو منح OAuth من إعدادات المطورين.
أدوات القراءة: `list_agents` و`get_agent` و`get_report` و`list_unanswered_questions` و`list_conversations` و`get_conversation` و`list_leads`. أدوات الكتابة: `create_agent_from_website` و`create_agent_from_notes` و`test_agent` و`add_knowledge` و`save_answer` و`reply_to_customer` و`update_lead` و`set_website_widget`. تأخذ كل أداة خاصة بالوكيل `agent_id` من `list_agents`. تستهلك `test_agent` الرصيد (Credits) مثل أي إجابة عادية؛ وترسل `reply_to_customer` رسالة إلى العميل وتوقف الوكيل مؤقتًا في تلك المحادثة؛ وتشغّل `set_website_widget` أداة دردشة الموقع أو تُطفئها؛ أما قنوات المراسلة فتُدار من لوحة التحكم. تحصل العملاء التي فُعّلت لديها MCP Apps (افتراضيًا اتصال Claude المصادَق عليه) أيضًا على `list_pending_approvals` و`list_action_runs` و`decide_approval`، التي توافق على تغيير أكّده العميل أو ترفضه؛ أما العملاء الآخرون فلا يرون سوى الأدوات الخمس عشرة المذكورة أعلاه. بالنسبة إلى أدوات الإعداد وتكامل GitHub، استخدم مساعد الإعداد داخل التطبيق أو `/api/v1/setup/tools`.
مراجعات البروتوكول المدعومة هي `2026-07-28` و`2025-11-25` و`2025-06-18`. يعيد النقل بيانات JSON؛ ولا يوفّر SSE القديم ولا جلسات الخادم. تفوّض رموز MCP OAuth الوصول إلى `/api/mcp` فقط، وليس إلى طلبات REST المباشرة. تدوم رموز وصول OAuth ساعة واحدة؛ وتتجدد بيانات اعتماد التحديث وتنتهي صلاحيتها بعد 90 يومًا. تستخدم مفاتيح API المُنشأة يدويًا مدة الصلاحية التي ضُبطت لها.
---
# النطاقات والأخطاء
Source: /ar/docs/api/scopes-errors.md
{/* docs-visuals */}
تتطلب كل عملية في واجهة API العامة نطاقًا صريحًا واحدًا. وإذا كانت بيانات الاعتماد صالحة لكنها لا تملك هذا النطاق، فستتلقى الخطأ `403 insufficient_scope`؛ ولا تتم ترقيتها أبدًا بصمت إلى صلاحيات أوسع.
## مرجع النطاقات [#مرجع-النطاقات]
| النطاق | ما يتيحه |
| --------------------- | ------------------------------------------------------------------------------------------------------------ |
| `account:read` | قراءة الحساب المصادَق عليه والخطة والاستحقاقات وملخص المحفظة |
| `tickets:read` | قراءة تذاكر الدعم ورسائلها |
| `tickets:write` | تحديث التذاكر وتعيين أعضاء الفريق وإضافة ملاحظات داخلية أو ردود للعملاء |
| `team:read` | قراءة أعضاء الفريق والدعوات المعلّقة وأحداث التدقيق المسموح بها |
| `team:write` | إنشاء الدعوات أو إلغاؤها وإدارة أدوار أعضاء الفريق من غير المالكين |
| `integrations:read` | فحص عمليات تثبيت GitHub App والمستودعات المصرّح بها |
| `integrations:write` | إعداد تغييرات التكامل وإنشاء طلبات سحب مسودة |
| `sites:read` | عرض المواقع واسترجاعها |
| `sites:write` | إنشاء المواقع وتحديثها ونشرها وإلغاء نشرها وحذفها |
| `agents:read` | قراءة إعدادات الـ agent |
| `agents:write` | تحديث سلوك الـ agent ولغته وصوته وإعدادات التضمين |
| `knowledge:read` | عرض مصادر المعرفة والأسئلة الشائعة |
| `knowledge:write` | إنشاء مصادر المعرفة والأسئلة الشائعة وتحديثها وحذفها |
| `conversations:read` | عرض المحادثات واسترجاع رسائلها |
| `conversations:write` | تولّي محادثة: الرد على الزائر باسم النشاط التجاري، وإيقاف الـ agent مؤقتًا فيها، وإعادتها إليه |
| `leads:read` | عرض الـ leads الذين تم جمعهم |
| `leads:write` | إنشاء الـ leads وتحديثهم وتأهيلهم وقبولهم في مسار الفرص |
| `pipeline:read` | قراءة المراحل والحسابات والفرص والأنشطة والإسناد وحالة مزامنة CRM |
| `pipeline:write` | ضبط المراحل؛ وإنشاء الفرص والحسابات أو تحديثها؛ واستيراد نتائج CRM أو إعادة محاولتها |
| `analytics:read` | قراءة أحداث تحليلات الموقع |
| `connectors:read` | عرض حالة الـ connectors دون إرجاع الأسرار |
| `connectors:write` | إنشاء الـ connectors وتحديثها وتفعيلها وتعطيلها وإزالتها |
| `domains:read` | أُزيل. يُحتفظ به لأغراض التوافق فقط؛ إذ تعيد كل مسارات `/domains` الخطأ `409` لأن النطاقات المخصصة غير متاحة |
| `domains:write` | أُزيل. يُحتفظ به لأغراض التوافق فقط؛ إذ تعيد كل مسارات `/domains` الخطأ `409` |
| `broadcasts:read` | عرض الرسائل الجماعية وحالة التسليم |
| `broadcasts:write` | إنشاء المسودات ووضع إرسال رسالة جماعية في قائمة الانتظار |
| `notifications:read` | عرض إشعارات المالك |
| `notifications:write` | تعليم الإشعارات كمقروءة أو غير مقروءة |
| `monetization:read` | عرض منتجات تحقيق الدخل |
| `monetization:write` | إنشاء المنتجات وتحديثها وتفعيلها وإلغاء تفعيلها وحذفها |
| `usage:read` | قراءة أحداث الاستخدام المقاس |
| `webhooks:read` | عرض نقاط نهاية webhook وحالة التسليم |
| `webhooks:write` | إنشاء نقاط نهاية webhook وحذفها |
استخدم نطاقات القراءة لمهام إعداد التقارير. وأضف نطاق الكتابة فقط عندما ينفّذ التكامل هذا التعديل فعلًا. فعلى سبيل المثال، يحتاج تصدير الـ leads عادةً إلى `sites:read` و`leads:read`، لا إلى `sites:write` أو `agents:write`.
## أخطاء النطاقات [#أخطاء-النطاقات]
```json
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}
```
أضف النطاق الناقص إلى المفتاح من **الإعدادات ← المطوّر ← تعديل**، أو أنشئ مفتاحًا بديلًا وحدّث السر المخزَّن على الخادم. يغيّر التعديل اسم المفتاح ونطاقاته في مكانه؛ أما تاريخ انتهاء صلاحيته والرمز المميّز فيبقيان كما هما. لا يمكن تعديل المفاتيح الصادرة عبر OAuth؛ أعد ربط التطبيق لتغيير ما مُنح من صلاحيات.
## غلاف الخطأ [#غلاف-الخطأ]
تستخدم جميع أخطاء API البنية العليا نفسها:
```ts
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};
```
اعتمد في المعالجة على `error.code` لا على `message` الإنجليزية، فقد تتحسن الرسائل دون تغيير الإصدار. سجّل `error.request_id` وترويسة الاستجابة `x-request-id` مع اسم العملية والحالة ورقم محاولة إعادة الطلب، لكن لا تسجّل أبدًا ترويسة التفويض أو أسرار الطلب.
## مرجع الحالات والرموز [#مرجع-الحالات-والرموز]
| HTTP | الرمز الثابت | المعنى | الاستجابة المعتادة |
| ----- | ------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `400` | `invalid_request` | فشل التحقق من الصحة أو أن أحد الحقول غير مدعوم | صحّح الحقول الواردة في `details`؛ ولا تعِد المحاولة بالمدخلات نفسها |
| `400` | `invalid_json` | الجسم ليس كائن JSON أو يحتوي على JSON غير صالح | أرسل كائن JSON صالحًا واحدًا |
| `401` | `authentication_required` | ترويسة Bearer مفقودة | أرفق بيانات اعتماد من جهة الخادم |
| `401` | `invalid_api_key` | المفتاح غير صالح أو منتهي الصلاحية أو ملغى، أو لم يعد مالكه موجودًا | استبدل المفتاح أو دوّره |
| `403` | `subscription_required` | لا يملك المالك خطة مدفوعة نشطة | استعد الاشتراك قبل إعادة المحاولة |
| `403` | `insufficient_scope` | تفتقر بيانات الاعتماد إلى نطاق العملية | أنشئ بيانات اعتماد بديلة بأقل قدر من الصلاحيات |
| `403` | `account_paused` | وصول API متوقف مؤقتًا للحساب | استأنف وصول API أو تواصل مع مالك الحساب |
| `404` | `not_found` | لم يُعثر على نقطة النهاية أو المورد المملوك | تحقق من المسار ومن المعرّف التابع للمستأجر |
| `409` | `conflict` | حالة المورد الحالية تمنع تنفيذ الإجراء | اقرأ الحالة الحالية قبل إعادة المحاولة |
| `413` | `payload_too_large` | جسم JSON يتجاوز حد الطلب البالغ 256 KB | أرسل جسمًا أصغر؛ وقسّم المحتوى الكبير على عدة طلبات |
| `415` | `invalid_request` | جسم التعديل ليس `application/json` | أرسل `Content-Type: application/json` |
| `429` | `rate_limit_exceeded` | استُنفدت حصة الدقيقة الواحدة في خطة المفتاح | انتظر حسب `Retry-After` وأضف تأخيرًا عشوائيًا (jitter) |
| `500` | `internal_error` | تعذّر إكمال الطلب | أعد محاولة العملية الآمنة أو القابلة للتكرار دون أثر جانبي، وأبلغ عن معرّف الطلب |
| `503` | `outcome_unknown` | ربما اكتمل التعديل، لكن تعذّر تسجيل نتيجته؛ وقيمة `details.retryable` هي `false` | لا تعِد المحاولة. اقرأ المورد لمعرفة ما إذا كان التغيير قد حدث؛ ويستمر مفتاح idempotency نفسه في إرجاع هذه النتيجة |
قد تعيد الموارد الواقعة خارج حساب مالك بيانات الاعتماد الخطأ `404` بدلًا من الكشف عمّا إذا كان معرّف يخص مستأجرًا آخر موجودًا.
## تفاصيل التحقق من الصحة [#تفاصيل-التحقق-من-الصحة]
يعيد التحقق من الحقول مسارات يمكن عرضها بجانب عناصر النموذج لديك:
```json
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}
```
يجب أن تكون أجسام التعديل كائنات JSON. وتُرفض المصفوفات والأجسام الفارغة وبيانات النماذج وJSON المرسل بنوع محتوى نصي.
## قرارات إعادة المحاولة [#قرارات-إعادة-المحاولة]
* أعد محاولة `429` بعد عدد الثواني المحدد في `Retry-After`.
* أعد محاولة `500` فقط في عمليات القراءة الآمنة أو عمليات الكتابة المحمية بالمفتاح `Idempotency-Key` نفسه.
* أعد محاولة `409` الخاص بـ idempotency قيد التنفيذ بعد المدة الواردة في الترويسة `Retry-After: 2`.
* لا تعِد محاولة `503 outcome_unknown` بشكل أعمى. تحقق من المورد أولًا؛ ولا تستخدم مفتاح idempotency جديدًا إلا بعد التأكد من أن التغيير لم يحدث.
* لا تعِد محاولة `400` أو `401` أو `403` أو `404` أو `413` أو تعارض الحالة إلا بعد تغيّر السبب.
راجع [حدود المعدل](/ar/docs/api/rate-limits) لمعرفة سلوك التراجع، و[مرجع API](/ar/docs/api/reference) لمعرفة النطاق المطلوب لكل عملية.
---
# حالة SDK
Source: /ar/docs/api/sdks.md
{/* docs-visuals */}
تُعدّ واجهة REST API ذات الإصدارات هي واجهة التكامل العامة المدعومة حاليًا. تتوفر الشيفرة المصدرية لعملاء JavaScript وPython وأطر العمل في مستودع المنتج، لكن الحزم غير منشورة حاليًا على npm أو PyPI.
## التوفر [#التوفر]
| العميل | الحالة | طريقة الاستخدام |
| ---------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------- |
| REST عبر HTTPS | **متاح** | استدعِ `https://makeagent.fast/api/v1` من أي عميل HTTP على الخادم |
| مستند OpenAPI | **متاح** | نزّل [/api/openapi.json](/api/openapi.json) وافحصه قبل توليد أي عميل |
| `@make-agent-fast/sdk` | **معاينة مصدرية — غير متوفر على npm** | لا تضف هذا الاستيراد إلى مشروع إنتاجي إلى أن يُضاف هنا رابط إصدار منشور في سجل الحزم |
| حزمة Python `makeagentfast` | **معاينة مصدرية — غير متوفرة على PyPI** | استخدم `requests` أو `httpx` أو المكتبة القياسية في Python إلى أن يُضاف هنا رابط إصدار على PyPI |
| محولات React وVue وSvelte | **معاينة مصدرية — غير متوفرة على npm** | يُفضّل اتباع نمط تحميل السكربت الموثّق لإطار العمل |
| Web component | **معاينة مصدرية — غير متوفر على npm** | يُفضّل استخدام المحمّل القياسي `embed.js` |
لا تشغّل `npm install @make-agent-fast/sdk` أو `pip install makeagentfast` بالاعتماد على مثال استيراد فقط. ستتضمن هذه الصفحة رابط السجل والإصدار وإرشادات التحقق من السلامة وأمر التثبيت عند نشر حزمة عامة.
## JavaScript بدون SDK [#javascript-بدون-sdk]
```ts
const response = await fetch("https://makeagent.fast/api/v1/sites?limit=100", {
headers: {
Authorization: `Bearer ${process.env.MAF_API_KEY}`,
Accept: "application/json",
},
});
const body = await response.json();
if (!response.ok) {
console.error(body.error.code, body.error.request_id);
throw new Error(`Make Agent Fast request failed (${response.status})`);
}
for (const site of body.data) console.log(site.id, site.title);
```
احتفظ بمفتاح API على الخادم. يجب أن تستدعي حزمة المتصفح في React أو Vue أو Svelte الواجهة الخلفية الخاصة بك أو أن تثبّت محمّل التضمين العام؛ ولا يجوز أن تستدعي واجهة الإدارة البرمجية بمفتاح سري.
## Python بدون SDK [#python-بدون-sdk]
```python
import json
import os
import urllib.request
request = urllib.request.Request(
"https://makeagent.fast/api/v1/sites?limit=100",
headers={
"Authorization": f"Bearer {os.environ['MAF_API_KEY']}",
"Accept": "application/json",
},
)
with urllib.request.urlopen(request, timeout=20) as response:
payload = json.load(response)
for site in payload["data"]:
print(site["id"], site["title"])
```
التقط الاستثناء `urllib.error.HTTPError` في بيئة الإنتاج وحلّل محتوى JSON في الاستجابة وفق [غلاف الأخطاء المستقر](/ar/docs/api/scopes-errors).
## العملاء المولَّدون [#العملاء-المولَّدون]
لا يفيد توليد العملاء من OpenAPI إلا عندما يحتوي المستند على العمليات والمخططات التي يعتمد عليها تطبيقك. ثبّت المواصفة التي نزّلتها، وولّد العميل في مجلد قابل للمراجعة، وافحص كل فروقات التغييرات قبل الترقية.
```bash
curl --fail-with-body https://makeagent.fast/api/openapi.json \
--output make-agent-fast.openapi.json
```
لا تعِد توليد العميل ونشره تلقائيًا من الرابط المباشر. فإضافة حقل جديد لا ينبغي أن تعطّل العميل، لكن سلوك المولِّد وأسماء الدوال المولَّدة قد يتغيران مع ذلك.
## ما يجب أن يتضمنه إصدار SDK عام [#ما-يجب-أن-يتضمنه-إصدار-sdk-عام]
قبل اعتبار أي عميل معاينة متاحًا، يجب أن يتوفر فيه ما يلي:
* صفحة عامة في سجل الحزم وإصدار دلالي (semantic version) غير قابل للتغيير.
* إرشادات التثبيت والترقية وبيئات التشغيل المدعومة.
* نماذج مكتوبة الأنواع للطلبات والاستجابات مولَّدة من عقد API الكامل.
* أخطاء منظَّمة تحتفظ برمز حالة HTTP ومعرّف الطلب.
* أدوات مساعدة للترقيم الصفحي تتعامل مع المؤشرات (cursors) على أنها مبهمة.
* دعم صريح لمفتاح عدم التكرار (idempotency key) في عمليات التعديل.
* اختبارات CI على عقد `/api/v1` الحالي وسجل تغييرات منشور.
إلى أن تتحقق هذه الشروط، استخدم أمثلة REST في [البدء السريع لـ API](/ar/docs/api/quickstart) و[وصفات API](/ar/docs/api/recipes).
---
# Webhooks
Source: /ar/docs/api/webhooks.md
{/* docs-visuals */}
ترسل Webhooks الخاصة بالمطورين أحداث الحساب إلى الخادم لديك، فلا تحتاج إلى الاستعلام الدوري. التسليم يتم مرة واحدة على الأقل: قد تتكرر الأحداث أو تتأخر أو تصل بترتيب مختلف.
## تسجيل نقطة نهاية [#تسجيل-نقطة-نهاية]
أنشئ مفتاحًا بالصلاحية `webhooks:write`، ثم سجّل مستقبِلًا عامًا عبر HTTPS مع أصغر مجموعة أحداث تحتاج إليها.
```bash
curl --fail-with-body https://makeagent.fast/api/v1/webhook-endpoints \
-X POST \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: webhook-production-v1" \
-d '{
"url": "https://api.example.com/webhooks/make-agent-fast",
"events": ["lead.created", "conversation.started"]
}'
```
يجب أن يستخدم عنوان URL بروتوكول HTTPS، ولا يجوز أن يحتوي على اسم مستخدم أو كلمة مرور أو جزء (fragment) أو منفذ مخصص، ويجب أن يُحلَّ إلى عناوين IP عامة فقط. لا تُتبع عمليات إعادة التوجيه أثناء التسليم.
تكشف الاستجابة `201` عن سر التوقيع `whsec_...` مرة واحدة فقط. خزّنه في مدير الأسرار الخاص بالمستقبِل قبل إغلاق الاستجابة. عند عرض نقاط النهاية لاحقًا ستحصل على عنوان URL والأحداث والحالة وآخر عملية تسليم وآخر خطأ، لكن دون السر.
## أنواع الأحداث [#أنواع-الأحداث]
| الحدث | يُرسَل عندما |
| ------------------------------ | ------------------------------------------------------------------------ |
| `site.published` | يصبح الموقع منشورًا |
| `site.unpublished` | يعود الموقع إلى حالة المسودة |
| `lead.created` | يلتقط الـ agent عميلًا محتملًا (Lead) جديدًا |
| `lead.qualified` | يؤهّل الـ agent عميلًا محتملًا، أو يُقبل العميل المحتمل في مسار المبيعات |
| `booking.requested` | يطلب زائر موعدًا أو يحجزه |
| `handoff.requested` | يحوّل الـ agent محادثة إلى شخص (Handoff) |
| `opportunity.created` | يتحول عميل محتمل إلى فرصة في مسار المبيعات |
| `opportunity.updated` | يتغير إسناد الفرصة أو قيمتها أو إجراؤها التالي أو حقول أخرى فيها |
| `opportunity.stage_changed` | تنتقل الفرصة إلى مرحلة أخرى |
| `opportunity.won` | تُغلق الفرصة كصفقة رابحة |
| `opportunity.lost` | تُغلق الفرصة كصفقة خاسرة |
| `conversation.started` | تبدأ سلسلة محادثة جديدة |
| `conversation.message.created` | تُضاف رسالة إلى محادثة |
| `knowledge.ready` | يكتمل تجهيز مصدر معرفة (Source) |
| `broadcast.sent` | تنتهي رسالة جماعية من سير عمل الإرسال |
| `domain.activated` | حدث متقاعد: النطاقات المخصصة غير متاحة، ولا يُرسَل هذا الحدث أبدًا |
## تنسيق الطلب [#تنسيق-الطلب]
يرسل Make Agent Fast طلب `POST` مع `Content-Type: application/json` و`User-Agent: MakeAgentFast-Webhooks/1.0` والترويسات التالية:
```http
maf-event-id: evt_...
maf-event-type: lead.created
maf-signature: t=1784210566,v1=HEX_HMAC_SHA256
```
يتخذ نص JSON غلافًا ثابتًا. تعتمد الحقول داخل `data` على الحدث، ويمكن أن تُضاف إليها حقول جديدة.
```json
{
"id": "evt_2c34...",
"type": "lead.created",
"created_at": "2026-07-16T10:02:46.000Z",
"data": {
"site_id": "SITE_ID",
"lead_id": "LEAD_ID"
}
}
```
استخدم `id` من النص أو `maf-event-id` مفتاحًا لإزالة التكرار. لا تستخدم وقت التسليم ولا معرّف قاعدة بيانات مولَّدًا.
## التحقق من التوقيع في Node.js [#التحقق-من-التوقيع-في-nodejs]
اقرأ البايتات الخام كما وصلت قبل تحليل JSON. القيمة الموقّعة هي `TIMESTAMP + "." + RAW_BODY`.
```ts
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWebhook(rawBody: Buffer, header: string, secret: string) {
const values = Object.fromEntries(header.split(",").map((part) => part.split("=", 2)));
const timestamp = values.t;
const supplied = values.v1;
if (!timestamp || !supplied || !/^[a-f0-9]{64}$/.test(supplied)) return false;
const age = Math.abs(Date.now() / 1_000 - Number(timestamp));
if (!Number.isFinite(age) || age > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${timestamp}.`)
.update(rawBody)
.digest("hex");
return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(supplied, "hex"));
}
```
ارفض التوقيعات المشوّهة والطوابع الزمنية الأقدم من نافذة إعادة التشغيل (replay) المقبولة لديك؛ وخمس دقائق قيمة افتراضية معقولة. قارن البايتات ذات الطول الثابت بزمن ثابت.
## التحقق من التوقيع في Python [#التحقق-من-التوقيع-في-python]
```python
import hashlib
import hmac
import time
def verify_webhook(raw_body: bytes, header: str, secret: str) -> bool:
values = dict(part.split("=", 1) for part in header.split(",") if "=" in part)
timestamp = values.get("t", "")
supplied = values.get("v1", "")
try:
if abs(time.time() - int(timestamp)) > 300:
return False
except ValueError:
return False
signed = timestamp.encode() + b"." + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, supplied)
```
لا تحلّل JSON ولا تعالجه إلا بعد نجاح التحقق من التوقيع.
## الإقرار والمعالجة [#الإقرار-والمعالجة]
1. تحقق من التوقيع والطابع الزمني.
2. أدرج معرّف الحدث في جدول بقيد تفرّد (unique constraint).
3. إذا كان موجودًا مسبقًا، فأعد `204` دون تكرار الأثر الجانبي.
4. ثبّت الحدث (commit) أو أضف مهمتك الداخلية إلى قائمة الانتظار.
5. أعد استجابة `2xx` بسرعة.
ينتهي مهلة المرسِل في Make Agent Fast بعد 10 ثوانٍ. ويعدّ استجابات `2xx` فقط ناجحة، ولا يتبع عمليات إعادة التوجيه.
## سلوك إعادة المحاولة [#سلوك-إعادة-المحاولة]
توضع عمليات التسليم الفاشلة في قائمة انتظار بحد أقصى ثماني محاولات. يبدأ التأخير التراجعي (backoff) عند نحو ثانيتين، ويتضاعف مع تشويش عشوائي (jitter)، ويبلغ حده الأقصى ساعة واحدة؛ وقد يتأخر وقت التسليم الفعلي عندما تكون العمليات المنفِّذة مشغولة. ولأن إعادة المحاولات قد تتجاوز عمر الطلب الذي أطلقها وقد تصل بترتيب مختلف، فلا تعتمد أبدًا على وصول حدث ما مباشرة قبل حدث آخر.
أعد استجابة غير `2xx` فقط عندما تريد أن يعيد Make Agent Fast المحاولة. وفي حالة إصدار حدث غير مدعوم نهائيًا أو وجهة محذوفة، اقبل الحدث وسجّله أو احذف نقطة النهاية، بدلًا من إنتاج إخفاقات مؤقتة لا تنتهي.
## تدوير سر التوقيع [#تدوير-سر-التوقيع]
لا يمكن كشف أسرار التوقيع ولا تعديلها. لتدويرها بأمان:
1. أنشئ نقطة نهاية ثانية تشير إلى مسار مستقبِل مؤقت أو مُرقَّم بإصدار.
2. خزّن السر الجديد الذي كُشف لك.
3. اقبل الأحداث من نقطتي النهاية معًا مع إزالة التكرار.
4. تأكد أن نقطة النهاية الجديدة تتلقى عمليات تسليم صالحة.
5. احذف نقطة النهاية القديمة عبر `DELETE /webhook-endpoints/{endpoint_id}`.
إذا بقي عنوان URL الخاص بالمستقبِل كما هو، فاجعل التطبيق المستقبِل يقبل السرّين خلال فترة التداخل، واستخدم معرّفات الأحداث لمنع تكرار الآثار الجانبية.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | ما يجب فحصه |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| لا توجد عمليات تسليم | حالة نقطة النهاية، والأحداث المحددة، وDNS العام، وشهادة HTTPS، وهل وقع الحدث فعلًا |
| عدم تطابق التوقيع | الوصول إلى النص الخام، والتسلسل الدقيق `timestamp.body`، وسر نقطة النهاية الصحيح، وأي تحويلات يجريها الوكيل (proxy) على النص |
| عمليات تسليم متكررة | رمز الاستجابة، ومهلة 10 ثوانٍ، والاستثناءات الداخلية، وتفرّد معرّف الحدث |
| خطأ عنوان خاص | يجب أن تُحلّ سجلات DNS إلى عناوين عامة فقط؛ يُرفض localhost والنطاقات الداخلية |
| فشل إعادة التوجيه | سجّل عنوان HTTPS النهائي مباشرة؛ لا تُتبع عمليات إعادة التوجيه |
لا تضمّن سر التوقيع أو مفتاح bearer أو الحمولة الكاملة للزائر في أي رسالة إلى الدعم. أرفق معرّف نقطة النهاية ومعرّف الحدث ووقت الفشل وسجلات المستقبِل بعد تنقيتها.
---
# العرض
Source: /ar/docs/build/appearance.md
{/* docs-visuals */}
يتحكم مظهر الأداة في شكل **الدردشة** و**المكالمة المباشرة** للزائر معًا، ويشمل الألوان والسمة والزوايا والظل والتأثير الزجاجي والخطوط. ولا يُنشئ هذا المظهر صفحة تسويقية مستضافة. تُطلَق الوكلاء الجدد كعنصر تضمين داخل موقعك الحالي.
افتح صفحة **الوكيل** الخاصة بالوكيل ثم اختر تبويب **العرض**. تنطبق جميع عناصر التحكم على الواجهتين معًا، وتعرض اللوحة الحية بجانب التبويب الأداة الفعلية.
## تُنشر التغييرات تلقائيًا [#تُنشر-التغييرات-تلقائيًا]
لا يوجد زر حفظ. تُحفظ النصوص والمنزلقات بعد توقف قصير، أما المفاتيح والإعدادات المسبقة والخيارات فتُحفظ فورًا، ويظهر تلميح **تم الحفظ** بجانب عنصر التحكم. يكتب كل حفظ بيانات صف الوكيل ويحدّث عنصر التضمين (وأي صفحة مستضافة قديمة)، فيرى الزوار التغيير دون انتظار إعادة النشر. تحقق من ذلك في نافذة خاصة على عنصر تضمين فعلي.
يعتمد إخفاء الشارة أو إظهارها في باقتَي Operate وScale على آلية التحديث المباشر نفسها.
## استخدام الموقع مقابل الفاتح أو الداكن [#استخدام-الموقع-مقابل-الفاتح-أو-الداكن]
لدى **سمة الوكيل** ثلاثة خيارات:
| الخيار | التأثير |
| ------------------ | ----------------------------------------------------------------------------------------------------- |
| **استخدام الموقع** | يتبع الوضع الفاتح أو الداكن لدى كل زائر (الصفحة المضيفة أولًا ثم نظام التشغيل). وهو الخيار الافتراضي. |
| **فاتح** | يثبّت الدردشة والمكالمة المباشرة على لوحة الألوان الفاتحة. |
| **داكن** | يثبّت الدردشة والمكالمة المباشرة على لوحة الألوان الداكنة. |
**استخدام الموقع** يقابل القيمة `auto`. يؤدي اختيار فاتح أو داكن إلى تثبيت الدردشة والمكالمة المباشرة معًا لجميع الزوار. عدّل لوحتي الألوان الفاتحة والداكنة كلًّا على حدة؛ فمفتاح المعاينة يغيّر فقط اللوحة التي تحرّرها.
في عنصر التضمين، يمكن للمُحمِّل (loader) أن يمرّر `data-theme="light"` أو `data-theme="dark"` لتجاوز الإعداد من جهة الصفحة المضيفة. راجع [نظرة عامة على التضمين](/ar/docs/embed/overview).
## الألوان والإعدادات المسبقة والخطوط [#الألوان-والإعدادات-المسبقة-والخطوط]
* **الإعدادات المسبقة** — Sharp وSoft وGlass وMinimal — تضبط الزوايا والظل والحدود والتأثير الزجاجي معًا.
* **اللون الأساسي** — فقاعات الزائر ولمسات المكالمة والإجراءات الرئيسية. يرث خيار **تلقائي (لون الموقع المميّز)** اللون المميّز للعلامة التجارية الذي جرى استخلاصه من الموقع واستُخدم للأداة.
* اضبط بدقة اللون الثانوي والخلفية وسطح اللوحة والزوايا والظل والحدود والتأثير الزجاجي والخط.
* يُطبَّق خيار **مطابقة الموقع** للخط عند تضمين الوكيل في موقع خارجي، بينما يُبقي **الافتراضي للأداة** على خط الأداة.
احرص على تباين كافٍ وعلى أن تبقى حالات التفاعل متمايزة. عاين المظهر على سطح المكتب وبعرض ضيق، بما في ذلك التسميات الكورية والإنجليزية.
## المكالمة المباشرة في معاينة العرض [#المكالمة-المباشرة-في-معاينة-العرض]
تعرض اللوحة بجانب تبويب **العرض** الأداة الفعلية، فتظهر الدردشة والمكالمة المباشرة بلوحة الألوان الفاتحة أو الداكنة المحددة وبالإطار نفسه الذي يراه الزائر في عنصر التضمين. ويظل التحدث إلى الوكيل هناك اختبارًا من المالك — راجع [الصوت والمكالمات المباشرة](/ar/docs/build/voice).
## شارة العلامة التجارية [#شارة-العلامة-التجارية]
إزالة الشارة متاحة في باقتَي Operate وScale. تحتفظ مواقع باقة Launch بشارة الإحالة الخاصة بـ Make Agent Fast. وتغيير إعداد الشارة (**إظهار شارة «Made with»**) يحدّث أيضًا عنصر التضمين المباشر دون إعادة نشر.
---
# الحجز عبر Cal.com
Source: /ar/docs/build/cal-com.md
{/* docs-visuals */}
## ربط التقويم [#ربط-التقويم]
افتح **الوكيل ← الإجراءات ← Cal.com**. أدخل مفتاح Cal.com API يبدأ بـ `cal_`، ومعرّف نوع الحدث الرقمي الموجب، ومنطقة زمنية بصيغة IANA مثل `Asia/Seoul`. ثم اختر **حفظ الاتصال**. لكل وكيل اتصاله الخاص. يُشفَّر المفتاح على الخادم، ولا تعرض لوحة التحكم سوى آخر أربعة أحرف منه. اترك حقل المفتاح فارغًا عند تحديث اتصال قائم للإبقاء على المفتاح الحالي.
اختر **اختبار الاتصال** لقراءة ما يصل إلى ثلاثة أوقات متاحة قادمة خلال الأيام السبعة التالية باستخدام الإعدادات المُدخلة. لا يحفظ هذا الاختبار الاتصال ولا ينشئ حجزًا. قد يعني غياب الأوقات ببساطة أن نوع الحدث لا يتوفر له أي وقت متاح في هذه الفترة. إذا فشل الاختبار، فتحقق من المفتاح ونوع الحدث والجدول الزمني في Cal.com. يؤدي حذف الاتصال إلى إيقاف حجوزات Cal.com الجديدة، لكنه لا يلغي الحجوزات الموجودة.
المدفوعات خارج النطاق. يمثّل [Google Calendar](/ar/docs/build/google-calendar) خيارًا منفصلًا غير متاح للجميع بعد.
## من الأوقات المتاحة إلى الحجز [#من-الأوقات-المتاحة-إلى-الحجز]
1. يستدعي الوكيل `find_slots` للحصول على الأوقات المستقبلية المتاحة فعلًا. يعرض ما يصل إلى ثمانية أوقات بالمنطقة الزمنية المضبوطة. النطاق الافتراضي من اليوم حتى بعد سبعة أيام، والحد الأقصى لمدى التواريخ هو 14 يومًا. إذا كان هناك وقت متاح واحد فقط، يُعرض وحده.
2. يختار العميل وقتًا ويزوّد الوكيل باسمه وبريده الإلكتروني وملاحظة اختيارية. يتحقق الوكيل مجددًا من أن الوقت ما زال متاحًا وأنه عُرض في هذه المحادثة. تنتهي صلاحية عروض الأوقات بعد 15 دقيقة.
3. تعرض بطاقة التأكيد التاريخ والوقت والمنطقة الزمنية وبيانات الحاضر. يجب على العميل الضغط على **تأكيد**. لا يؤدي إرسال رسالة في المحادثة أو اختيار وقت وحده إلى إجراء أي حجز. تنتهي صلاحية الاقتراح بعد 15 دقيقة، ولا يحجز الوقت.
4. بعد التأكيد فقط يرسل المحوّل طلب الحجز إلى Cal.com. تتحول النتيجة `accepted` من Cal.com إلى `done`، مع معرّف UID للحجز كمرجع. أما `pending` أو `awaiting_host` فتبقى قيد الانتظار، ويتحول الرفض أو الإلغاء إلى حالة فشل.
لا تُتاح اقتراحات الحجز على قنوات المراسلة إلا في المحادثات الخاصة. لا تستدعي المحاكاة Cal.com ولا تنشئ حجزًا. وبدون اتصال Cal.com يظل مسار طلب الحجز الحالي متاحًا، لكنه لا يثبت وجود حجز فعلي في التقويم. يؤدي تغيير المفتاح أو نوع الحدث أو المنطقة الزمنية إلى إبطال هدف تنفيذ الاقتراح، لذا ابدأ من جديد بعد أي تغيير في الاتصال.
## إذا أُخذ الوقت أو كانت النتيجة غير مؤكدة [#إذا-أُخذ-الوقت-أو-كانت-النتيجة-غير-مؤكدة]
قد يحجز عميل آخر الوقت قبل اكتمال التأكيد. إذا لم يعد الوقت متاحًا، يُبلغ الوكيل بعدم توفره، وإذا رفضه Cal.com أثناء الإنشاء، يعرض الإيصال حالة الفشل. اطلب أوقاتًا جديدة وأكّد اقتراحًا جديدًا. لا يرفق إيصال الفشل خيارات جديدة تلقائيًا.
انتهاء مهلة الشبكة ليس دليلًا على الفشل ولا على النجاح. يعرض الإيصال نتيجة غير معروفة بينما تعيد الخدمة الفحص. لا تحتوي نقطة إنشاء الحجز في Cal.com على عقد موثّق لمفتاح عدم التكرار (idempotency key)، لذا يخزّن المحوّل معرّف التشغيل في `metadata.maf_run` ويبحث عن ذلك الحجز في جميع الحالات والصفحات قبل إعادة محاولة الإنشاء. ولا يسمح بحث غير مكتمل أبدًا بإرسال طلب إنشاء آخر. يقلل هذا خطر التكرار، لكنه ليس ضمانًا بالتنفيذ مرة واحدة بالضبط مدعومًا من المزوّد. وقبل إجراء حجز آخر بعد استنفاد المحاولات، تحقق من Cal.com.
تختلف موافقة المضيف في Cal.com عن موافقة المالك على إجراءات التغيير المخصصة. لا يحدّث هذا التكامل حجز Cal.com المعلّق تلقائيًا، فتحقق من حالته النهائية في Cal.com. يمكن لأداة الويب استطلاع إيصال التشغيل المخزّن، وتتلقى القنوات الخاصة المدعومة إيصالات متأخرة وفق نوافذ الخدمة الخاصة بها. راجع [تسليم الإيصالات](/ar/docs/build/change-actions#customer-confirmation-and-receipts).
## إصدارات API وفحوصات الإطلاق [#إصدارات-api-وفحوصات-الإطلاق]
يرسل المحوّل مصادقة Bearer وقيم `cal-api-version` التالية الخاصة بكل نقطة نهاية، وقد جرى التحقق منها مقابل الوثائق الرسمية بتاريخ **2026-10-13**:
| العملية | الإصدار | المرجع |
| --------------------- | ------------ | ------------------------------------------------------------------------------------------------------- |
| قراءة الأوقات المتاحة | `2024-09-04` | [GET /v2/slots](https://cal.com/docs/api-reference/v2/slots/get-available-time-slots-for-an-event-type) |
| إنشاء حجز | `2026-02-25` | [POST /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/create-a-booking) |
| مطابقة الحجز | `2026-05-01` | [GET /v2/bookings](https://cal.com/docs/api-reference/v2/bookings/get-all-bookings) |
قبل استخدامه مع العملاء، اختبر حجزًا مُتحكَّمًا به، وتحقق من UID في Cal.com، وجرّب وقتًا محجوزًا، وافحص الإيصالات على كل قناة تنوي استخدامها. لا يثبت نجاح اختبار الاتصال سوى قراءة الأوقات المتاحة، وليس حجزًا فعليًا ولا جاهزية للإنتاج.
---
# إجراءات التغيير
Source: /ar/docs/build/change-actions.md
{/* docs-visuals */}
## تعريف إجراء تغيير [#تعريف-إجراء-تغيير]
استخدم إجراء التغيير لتحديث سجل في نظامك الخاص، مثل إلغاء طلب. افتح **الوكيل ← الإجراءات**، واضبط السر الخاص بالوكيل في **العملاء المسجّلون للدخول**، ثم أضف **إجراء تغيير**: اسمًا فريدًا، ووصفًا لوقت استخدامه، ونقطة نهاية HTTPS عامة، ومدخلات نصية معرَّفة. الاسم مثل `cancel_order` يصبح أداة النموذج `change_cancel_order`. تُحفظ التعديلات على الإجراءات الحالية تلقائيًا؛ انتظر ظهور مؤشر الحفظ.
أبقِ خيار **يتطلب عميلًا مسجّلًا للدخول** مفعّلًا للسجلات الخاصة. يجب أن تتحقق نقطة النهاية لديك مع ذلك من أن السجل المطلوب يعود إلى معرّف العميل الذي جرى التحقق منه. الاسم أو البريد الإلكتروني أو رقم الطلب المكتوب في المحادثة ليس دليلًا على الهوية. إذا عطّلت هذا الإعداد فقد تكون قيمة `customer` فارغة (null): اسمح فقط بالتغييرات المناسبة للزوار المجهولين. المدفوعات خارج نطاق هذه الميزة.
## اختيار موافقة المالك [#اختيار-موافقة-المالك]
تأكيد العميل مطلوب في كل الأوضاع:
| الوضع | بعد أن يؤكد العميل |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| بلا موافقة (`none`) | التنفيذ دون قرار منفصل من المالك. |
| الموافقة دائمًا (`always`) | انتظار المالك. |
| عند تجاوز حد (`over_limit`) | الانتظار عندما يكون مدخل رقمي معرَّف أكبر تمامًا من الحد؛ المساواة لا تتطلب موافقة. يُرفض المدخل الرقمي غير الصالح. |
راجع الطلبات المنتظرة في **الوكيل ← الإجراءات ← الموافقات**. يمكن لمالك الموقع الموافقة أو الرفض. إذا كانت تنبيهات المالك الخاصة عبر Telegram مرتبطة، فسيتضمن التنبيه أيضًا زرَّي **موافقة / رفض**. لا يمكن استخدامهما إلا من المحادثة الخاصة للمالك المرتبط؛ ولا يمكن للنقرات المنتهية أو المكررة أن تنفّذ الإجراء مرة أخرى. تنتهي صلاحية الموافقة بعد 24 ساعة من تأكيد العميل. يتلقى العميل النتيجة، بما في ذلك الرفض أو انتهاء الصلاحية. تعرض عمليات التشغيل الأخيرة الحالة والطوابع الزمنية والمرجع ومعرّف العميل.
## ما تستقبله نقطة النهاية لديك [#ما-تستقبله-نقطة-النهاية-لديك]
لا يُرسل أي طلب عندما يقترح النموذج التغيير. بعد تأكيد العميل وأي موافقة مطلوبة من المالك، يرسل Make Agent Fast ما يلي:
```http
POST /agent/cancel-order HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
x-maf-idempotency-key: c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b
```
```json
{
"version": 1,
"action": "cancel_order",
"runId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
لا تتضمن قيمة `action` البادئة `change_`. يبقى المعرّفان ورأس مفتاح منع التكرار (idempotency) كما هي عند إعادة المحاولة. يحتوي `input` على سلاسل نصية معرَّفة ومقتطعة المسافات فقط؛ و`customer` إما null أو الكائن الذي جرى التحقق منه ويتضمن `id` و`email`/`name` الاختياريين.
استخدم [أداة التحقق من توقيع عمليات البحث](/ar/docs/build/lookups#verify-the-signature): HMAC-SHA256 باستخدام سر الوكيل على `"maf-webhook-v1:" + timestamp + "." + rawBody`، بحروف سداسية عشرية صغيرة تسبقها `v1=`. تحقق من البايتات الأصلية، وحداثة الطابع الزمني، والموقع/الإجراء المتوقعين، وملكية العميل قبل أي كتابة. **أزل التكرار لقيمة `x-maf-idempotency-key` بشكل ذري مع تغييرك واحتفظ بالنتيجة.** يجب أن يعيد الطلب المكرر النتيجة المحفوظة دون تغيير السجل مرة أخرى. لا يمكن للقفل على مستوى المنصة أن يحل محل إزالة التكرار في نظامك.
## إرجاع النتيجة [#إرجاع-النتيجة]
أرجع JSON بحالة 2xx يتضمن الحقل المطلوب `status` (`done` أو `pending` أو `failed`) والحقول الاختيارية `message` و`reference` و`card`:
```json
{
"status": "done",
"message": "Order cancelled.",
"reference": "A128",
"card": {
"kind": "status",
"title": "Order A128",
"fields": [{ "label": "Order", "value": "A128" }]
}
}
```
تتطلب بطاقة الحالة الاختيارية الحقلين `title` و`fields`؛ أما `kind: "status"` فاختياري. وتدعم `status: { label, tone }` و`reference` و`asOf` و`link: { label, url }`، كما في [عمليات البحث](/ar/docs/build/lookups#return-a-response). النبرات هي `neutral` أو `success` أو `warning` أو `danger`؛ ويجب أن تكون الروابط عناوين HTTPS آمنة. تُرفض حقول المخطط غير المعروفة. اجعل النص قصيرًا وبسيطًا. الحقل الخارجي `status` هو الذي يحدد النتيجة؛ ولا يمكن لصياغة البطاقة أن تحوّل نتيجة معلّقة إلى نجاح.
استخدم `done` فقط بعد اكتمال التغيير، و`pending` عندما لا تزال المعالجة جارية، و`failed` عند حدوث فشل معروف. تُعامل مهلات الانتظار وأخطاء الشبكة واستجابات 5xx والاستجابات غير الصالحة على أنها نتيجة غير مؤكدة (`unknown`). تعيد المطابقة المحاولة بعد دقيقة واحدة ثم بعد خمس دقائق، بحد أقصى ثلاث محاولات تنفيذ وبالمفتاح نفسه؛ وقد تؤخر جدولة قوائم الانتظار هذه الأوقات. تفشل استجابة HTTP 4xx دون إعادة محاولة. عند استنفاد حالات عدم اليقين يفشل التشغيل ويُبلَّغ المالك، لكن هذا لا يثبت أن نظامك لم يُجرِ أي تغيير. حقّق في الأمر قبل بدء تشغيل آخر. لا يؤدي `pending` إلى تنفيذ آخر.
## إرسال استدعاء نهائي موقَّع [#إرسال-استدعاء-نهائي-موقَّع]
عند حسم تشغيل في حالة `pending` أو `unknown`، أرسل بطلب POST استجابة نهائية إلى `https://makeagent.fast/api/agent/actions/RUN_ID/callback`. أرسل عقد الاستجابة نفسه مع `status: "done"` أو `"failed"`؛ ولا تُقبل `pending` هنا.
تحديث عقد الاستدعاء بتاريخ 2026-10-14: وقّع `maf-callback-v1:` + runId + `:` + timestamp + `.` + rawBody. إذا كان الجسم يتضمن `runId` فيجب أن يطابق معرّف التشغيل في المسار؛ وعدم التطابق يعيد 400. التوقيعات الخاصة بتشغيل آخر أو بالصيغة السابقة غير المرتبطة تعيد 403.
```js
import { createHmac } from "node:crypto";
const body = JSON.stringify({ status: "done", reference: "A128" });
const timestamp = String(Math.floor(Date.now() / 1000));
const signature = createHmac("sha256", agentSecret)
.update(`maf-callback-v1:${runId}:${timestamp}.${body}`)
.digest("hex");
const response = await fetch(
`https://makeagent.fast/api/agent/actions/${encodeURIComponent(runId)}/callback`,
{
method: "POST",
headers: {
"content-type": "application/json",
"x-maf-timestamp": timestamp,
"x-maf-signature": `v1=${signature}`,
},
body,
},
);
```
استخدم سر الوكيل المحفوظ على خادمك ومعرّف التشغيل الذي استلمته في الطلب الأصلي. يستخدم الاستدعاء **`maf-callback-v1:`** وليس نطاق تسمية الطلب الصادر. يجب أن يكون فارق الطابع الزمني ضمن خمس دقائق. تعيد التوقيعات غير الصالحة 403؛ وتعيد الأجسام غير الصالحة 400؛ ويعيد التشغيل المنتهي أصلًا أو غير المتوافق 409. لا يؤدي الاستدعاء المكرر إلى استبدال النتيجة النهائية. بدّل هذا السر مع إعدادات الهوية وتوقيع نقطة النهاية لديك.
## تأكيد العميل والإيصالات [#تأكيد-العميل-والإيصالات]
يراجع العميل المدخلات بدقة ثم يضغط **تأكيد** أو **إلغاء** على الاقتراح. تنتهي صلاحية الاقتراح بعد 15 دقيقة؛ والاقتراح الجديد للإجراء/المحادثة نفسيهما يحل محل القديم. يستخدم التأكيد رمزًا مرتبطًا بذلك التشغيل والموقع والزائر. كتابة «نعم» أو النقر على بطاقة تأكيد عامة لا يفوّض بتنفيذ التغيير. أزرار وضع التجربة غير فعّالة ولا تستدعي نقطة النهاية لديك.
على الويب، تستعلم أداة الدردشة المفتوحة بشكل دوري عن الإيصالات غير النهائية، في البداية كل خمس ثوانٍ ثم كل 30 ثانية، لمدة تصل إلى 24 ساعة. قد يظهر الإيصال بحالة: تم الطلب، في انتظار المالك، قيد التشغيل، معلّق، جارٍ التحقق من نتيجة غير معروفة، تم، فشل، مرفوض، ملغى، أو منتهي الصلاحية. فقط `done` يؤكد الاكتمال.
تعمل اقتراحات القنوات **في المحادثات الخاصة فقط**، وليس في المجموعات أو القنوات العامة. تستخدم الإيصالات المتأخرة صندوق الإرسال الدائم (outbox): تُدعم رسائل Telegram الخاصة العادية مع البوت؛ أما WhatsApp وMessenger وInstagram وTelegram Business فتتطلب رسالة واردة مسجّلة خلال 24 ساعة، ويُعاد التحقق منها وقت الإرسال. التسليم المتأخر غير متاح لاستعلامات الضيوف في Telegram ولـ Discord وKakaoTalk. قد تمنع النوافذ المغلقة والاتصالات المعطّلة التسليم؛ ومع ذلك يسجل سجل التشغيل النتيجة.
## الحدود والاختبار [#الحدود-والاختبار]
| العنصر | الحد |
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| إجراءات التغيير | 5 لكل وكيل؛ الأسماء فريدة عبر إجراءات التغيير وعمليات البحث |
| الأسماء | الإجراء: `^[a-z][a-z0-9_]{2,39}$`؛ المدخل: `^[a-z][a-z0-9_]{1,31}$`؛ أسماء الإجراءات المحجوزة غير متاحة |
| الأوصاف | 300 حرف |
| المدخلات | 3 سلاسل نصية معرَّفة، بحد أقصى 200 حرف لكل منها |
| نقطة النهاية | HTTPS عامة، حتى 500 حرف، دون بيانات اعتماد في عنوان URL أو عناوين خاصة أو إعادة توجيه |
| مهلة التنفيذ / الاستجابة / جسم الاستدعاء | 8 ثوانٍ / 32 KiB / 32 KiB |
| عنوان بطاقة الحالة / تسمية الحقل / القيمة / الحقول | 80 / 40 / 200 حرف / 8 حقول |
| انتهاء صلاحية الاقتراح / الموافقة | 15 دقيقة / 24 ساعة بعد التأكيد |
استخدم نقطة نهاية خاضعة للتحكم للتحقق من التأكيد والإلغاء والموافقة والمهلة ومعالجة المفتاح المكرر والاستدعاءات النهائية. افحص سجلاتها وليس نص الإيصال فقط. يثبت وضع التجربة عدم حدوث أي كتابة خارجية؛ وهو ليس اختبارًا لتنفيذ نقطة النهاية. اختبر كل قناة خاصة تنوي استخدامها قبل الاعتماد على الإيصالات.
---
# إنشاء وكيل
Source: /ar/docs/build/create-agent.md
{/* docs-visuals */}
يبدأ الوكيل الأول من **رابط موقع (URL)**. نزحف على الصفحات العامة التي يمكننا الوصول إليها، ونُعدّ مسودة وكيل (بما في ذلك نمط الأداة المضمّنة المستمد من تلك المعلومات)، ونُبقيه بعيدًا عن موقعك حتى الخطوة الأخيرة من الإعداد الأولي. ميزة الإنشاء عبر المحادثة معطّلة. ولا توجد ميزة لإنشاء موقع أو أداة لبناء الأقسام.
## الصق الرابط [#الصق-الرابط]
في الصفحة الرئيسية، الصق الرابط ثم تابع. يحتفظ التسجيل وتسجيل الدخول بالمعامل `next=/onboarding/launch?url=…`، فلا يُطلب منك لصقه مرة أخرى. تتيح الصفحة `/try` للزوار لصق رابط والتحدث مع مسودة تحمل علامة مائية (نصية فقط وبحدود معينة) قبل المطالبة بها عند التسجيل.
إذا كانت لديك مواقع بالفعل، فإن لصق رابط ما ينشئ مسودة **جديدة** غير منشورة. أما إذا كان الرابط نفسه قيد المعالجة، فيُستأنف بدلًا من تكراره. ولا يُعاد استخدام موقع اكتمل في أول تشغيل.
لا تلصق كلمات مرور أو بيانات عملاء خاصة أو رموز موصّلات (connector) في حقل الرابط.
## انتظر في شاشة الإنشاء [#انتظر-في-شاشة-الإنشاء]
أثناء بناء المسودة، تعرض شاشة الإنشاء تقدّمًا حقيقيًا لمراحل الاستيعاب والتركيب والاختبار، وليست مجرد مؤشر تحميل وهمي:
| الخطوة | ما تفعله |
| ------------------- | ------------------------------------------------------------------- |
| **قراءة الموقع** | تجلب الصفحات العامة من الرابط |
| **بناء الوكيل** | تركّب الوكيل ونمط الأداة المضمّنة من المعلومات التي جرى الزحف إليها |
| **اختبار الإجابات** | تُجري اختبارًا ذاتيًا مقابل تلك المعرفة |
يستغرق الانتظار عادةً بضع ثوانٍ، وقد يصل إلى دقيقة تقريبًا للمواقع الأكبر. وإذا كان الزحف محدودًا، تعتمد المسودة على ما عُثر عليه. ويمكنك إضافة المصادر بعد المراجعة.
لا تُنشر المسودة تلقائيًا أبدًا. ولا تحصل الوكلاء الجدد على صفحة تسويقية مستضافة.
## تعرّف على الوكيل وفعّله [#تعرّف-على-الوكيل-وفعّله]
بعد بناء المسودة، يعرض الإعداد الأولي شاشتين إضافيتين:
* **تعرّف على وكيلك** — المحادثة الحقيقية إلى جانب ثلاثة فحوصات سريعة. اسأل، واقرأ الإجابة، ثم اقبلها أو صحّحها. تستهلك التجربة النصية رصيدًا (Credits)، بينما تكون طلبات التواصل والإجراءات محاكاة.
* **ضعه حيث يوجد عملاؤك** — الخطوة الأخيرة. تُفعّل أداة الموقع للموقع الذي لصقت رابطه، وتشغّل **رابط الوكيل** (صفحة محادثة عامة واحدة على عنوان وكيلك الخاص) لتتمكن من التجربة على هاتفك ضمن **جرّب على هاتفك**. أضف كود التثبيت إلى موقعك، ثم اضغط **تحقق من موقعي**.
بعد ذلك يفتح الوكيل على صفحة **الوكيل**، وهي أول عنصر في الشريط الجانبي للوكيل: علامات التبويب **نظرة عامة** و**العرض** و**الصوت** و**الإجراءات** إلى جانب لوحة حيّة تعرض الأداة الحقيقية في الزاوية التي اخترتها. اسأله ما قد يسأله العميل هناك. في **نظرة عامة**، يقيّم **فحص الإجابات** ← **إجراء فحص** الإجابات مقابل معرفتك.
التحدث إلى الوكيل في لوحة التحكم هو اختبار من المالك (Owner). فهو لا يُفعَّل للجمهور ولا يُحتسب ضمن التفعيل.
لإضافة الأداة إلى موقعك لاحقًا، افتح **فعّله** ← **أداة الموقع** في صفحة الوكيل. وإذا لم تكن الأداة مفعّلة بعد، فاختر **تفعيل التضمين**. وبعد تفعيلها، تعرض الورقة نفسها كود التثبيت ومفتاح **اعرضه على موقعي** و**عناوين المواقع المسموح بها**. ويمكنك إخفاء الأداة في أي وقت بهذا المفتاح أو من بطاقة **على موقعك** في تبويب **نظرة عامة**.
## التفعيل [#التفعيل]
بعد التفعيل، أضف كود التضمين أو اربط قناة (Channel). يُعدّ الموقع **مفعّلًا** عند أول محادثة لزائر أو أول عميل محتمل (Lead) يتم التقاطه. ولا تُحتسب أبدًا محادثات الاختبار من لوحة التحكم.
## التعديل بعد المسودة الأولى [#التعديل-بعد-المسودة-الأولى]
لا توجد ميزة إنشاء عبر المحادثة. بعد المراجعة، حدّث ما يلي:
* التعليمات في تبويب **نظرة عامة** بصفحة الوكيل، و**الصوت** و**العرض** في تبويبيهما المجاورين.
* **المعرفة** في صفحتها الخاصة ضمن الشريط الجانبي للوكيل.
* تُحفظ تغييرات **العرض** تلقائيًا وتُحدّث التضمين المباشر دون إعادة نشر.
## البدء دون رابط موقع [#البدء-دون-رابط-موقع]
إذا أرسلت نموذج الصفحة الرئيسية فارغًا، فستظل صفحة **جرّب** تُفتح. يمكن للزوار المجهولين لصق رابط هناك والتحدث إلى مسودة، ثم المطالبة بها عند التسجيل لمتابعة الإعداد الأولي. أما الرابط الملصوق فيسلك دائمًا مسار شاشة الإنشاء الموضّح أعلاه.
---
# الأسئلة الشائعة والمنتجات
Source: /ar/docs/build/faqs-products.md
{/* docs-visuals */}
## استخدم الأسئلة الشائعة للإجابات المعتمدة [#استخدم-الأسئلة-الشائعة-للإجابات-المعتمدة]
أنشئ سؤالًا شائعًا واحدًا لكل غرض من أغراض الزائر. اكتب السؤال بالصياغة التي يستخدمها العملاء، واجعل الإجابة مكتملة بحيث لا تعتمد على سؤال شائع آخر.
## استخدم المنتجات لمعلومات الكتالوج [#استخدم-المنتجات-لمعلومات-الكتالوج]
تناسب المنتجات العروض المسمّاة التي تتضمن حقولًا مثل الوصف أو السعر أو التوفر أو الرابط. حافظ على تحديث المعلومات المتعلقة بالمعاملات، وتجنّب التعهد بتوفر المخزون أو بالتوصيل ما لم يكن مصدرك يُحدَّث بشكل موثوق.
## تجنّب التكرار [#تجنّب-التكرار]
لا تحتفظ بالسعر نفسه في ملاحظة وسؤال شائع وقسم صفحة وسجل منتج في آن واحد. اختر مصدرًا معتمدًا واحدًا، ثم اربط به أو أشِر إليه في المواضع الأخرى.
## تحقّق من سلوك الوكيل أمام العملاء [#تحقّق-من-سلوك-الوكيل-أمام-العملاء]
بعد إجراء أي تغيير، اطرح على الوكيل السؤال الشائع بصياغات متعددة، وتأكد من صحة رابط المنتج وسعره.
---
# المتابعات والتذكيرات
Source: /ar/docs/build/follow-ups.md
{/* docs-visuals */}
## قدّم المساعدة في اللحظة المناسبة [#قدّم-المساعدة-في-اللحظة-المناسبة]
افتح **الوكيل ← الإجراءات ← المتابعات**. أضف ما يصل إلى خمس قواعد لعرض صفحة، أو زائر خامل، أو نيّة المغادرة، أو خطأ في نموذج، أو حدث مخصص. اختر نمط مسار، وتأخيرًا اختياريًا، ورسالة لا تتجاوز 200 حرف، وما يصل إلى ثلاثة ردود سريعة. تُحفظ الإعدادات تلقائيًا. تعرض المعاينة الرسالة دون التواصل مع أي عميل ودون إضافة بيانات إلى التجربة.
استخدم `/pricing` لمسار واحد، و`/products/*` لجزء واحد من المسار، و`/products/**` للمسارات المتداخلة. تُستثنى معاملات الاستعلام والأجزاء بعد علامة التجزئة. التأخير الافتراضي للخمول هو 30 ثانية، وفترة الانتظار الافتراضية بين المحفّزات هي سبعة أيام. لن يقاطع المحفّز استلام إنسان للمحادثة أو محادثة نشطة مفتوحة، ولن يتكرر في الجلسة نفسها، ولن يظهر من جديد بعد إغلاقه في تلك الجلسة.
يبلّغ كود التضمين عن مرات عرض الصفحات والخمول ونيّة المغادرة. يمكن للمطوّر لديك الإبلاغ عن أحداث مخصصة باستخدام `MakeAgentFast.track`؛ راجع [إجراءات الصفحة](/ar/docs/build/page-actions). يكون الإبلاغ التلقائي عن أخطاء النماذج متوقفًا ما لم يستخدم كود التضمين `data-auto-form-error="true"` أو `MakeAgentFastSettings.autoFormError = true`. ويبلّغ عن معرّف النموذج فقط، ولا يبلّغ أبدًا عن قيم الحقول.
## اقرأ نتائج المجموعة الضابطة [#اقرأ-نتائج-المجموعة-الضابطة]
افتراضيًا، يُسنَد 10% من الزوار المؤهلين إلى مجموعة ضابطة ثابتة ولا يرون أي رسالة. يرتبط الإسناد بالزائر والقاعدة؛ ولا تؤدي الزيارات المتكررة إلى تضخيم حجم العيّنة. تقارن لوحة التحكم معدلات التحويل بين الزوار المؤهلين في مجموعة الرسالة والمجموعة الضابطة، وتعرض الارتفاع المطلق بالنقاط المئوية.
التحويل هو عميل محتمل أو حجز أو إجراء مكتمل أو بحث ناجح مسجّل خلال 24 ساعة من تعرّض مؤهل للرسالة. أما فتح الرسالة أو الرد عليها فيُعرضان بشكل منفصل. ولا يمكن للأحداث التي يبلّغ عنها المتصفح أن تعلن عن تحويلات. وإذا كان عدد الزوار أقل من 50 في كل مجموعة، تعرض لوحة التحكم أن البيانات غير كافية؛ وعند هذا الحد أو فوقه تعرض فاصل ثقة بسيطًا بنسبة 95%. ولا تُعدّ الفروق الصغيرة دليلًا على أن الرسالة تسببت في مبيعات أكثر.
## أبلغ العميل عند حدوث تغيير [#أبلغ-العميل-عند-حدوث-تغيير]
يمكن للعملاء أن يطلبوا: «أخبرني عندما يتوفر موعد» أو «دعني أعرف عندما تتغير حالة طلبي». تراقب المراقبة توفر التقويم المتصل، أو حقلًا أو حالة في [عملية بحث](/ar/docs/build/lookups) مهيأة. تتطلب مراقبات البحث عميلًا مسجّلًا الدخول وتم التحقق منه. ولا تراقب صفحات عشوائية ولا تجدول تذكيرات متكررة.
يقترح الوكيل مراقبة مع وجهتها وتاريخ انتهائها. يجب على العميل النقر على زر التأكيد خلال 15 دقيقة. كما يدخل زوار الموقع والمكالمات المباشرة بريدًا إلكترونيًا ويحددون خانة الموافقة على البريد الإلكتروني على الشاشة؛ فكتابة «نعم» أو قولها لا تكفي. يتضمن البريد الإلكتروني إشعارًا عامًا ورابط عودة قصير الصلاحية. لا يسجّل هذا الرابط دخول المستلم ولا يمنحه إمكانية الوصول إلى سجلات العملاء.
يمكن لكل زائر أن يمتلك ثلاث مراقبات نشطة أو معلّقة، بحد أقصى 50 لكل وكيل، ومدة قصوى 14 يومًا. تبدأ الفحوصات بعد 15 دقيقة، ثم تتباعد لتصبح كل ساعة ثم كل ست ساعات. ترسل كل مراقبة محاولة إشعار واحدة ثم تتوقف. يمكن الإلغاء عبر عناصر التحكم في المراقبة أو من قائمة المتابعات لدى المالك. وقد يؤدي تغيير إعدادات البحث أو التقويم الأساسية إلى إيقاف المراقبة. ولا يُعاد إرسال إشعار غير مؤكد التسليم تلقائيًا.
## تابع في المحادثات واسألك عند التعثر [#تابع-في-المحادثات-واسألك-عند-التعثر]
افتح **الوكيل ← الإجراءات ← المتابعات ← متابعات المحادثات**. ينطبق هذان المفتاحان على محادثات Telegram وWhatsApp وMessenger وInstagram.
يكون خيار **المتابعة عندما يتوقف العميل عن الرد** مفعّلًا افتراضيًا لوكلاء المبيعات ومعطّلًا لأنواع الوكلاء الأخرى. عندما يتوقف العميل عن الرد بعد إجابة، يعيد الوكيل قراءة المحادثة ثم يرسل رسالة قصيرة واحدة، أو ينتظر قليلًا أطول، أو يترك العميل وشأنه. يتجه وكيل المبيعات نحو إتمام الشراء، ويتحقق وكيل الخدمة من حل المشكلة، ويقترح وكيل الحجوزات موعدًا. ويعتمد فقط على المعرفة التي اعتمدتها وعلى المحادثة، ويتوقف عندما يرد العميل أو يرفض أو يطلب عدم مراسلته. تقبل قنوات Meta الرسائل الآلية خلال 24 ساعة فقط من آخر رسالة للعميل، لذلك تصل المتابعة هناك خلال ذلك اليوم؛ أما محادثة بوت Telegram فيمكن أن تتلقى ما يصل إلى متابعتين على مدى عدة أيام. تُحتسب كل متابعة كما يُحتسب الرد.
يكون خيار **اسألني عندما لا يستطيع الوكيل الإجابة** مفعّلًا افتراضيًا. فبدلًا من طلب البريد الإلكتروني، يخبر الوكيل العميل بأنه يستفسر من الفريق، وينبّهك برابط إلى المحادثة. ردّ هناك، أو احفظ الإجابة في المعرفة، وسيرسلها الوكيل إلى العميل بلغته. تقبل Instagram وMessenger إجابتك خلال 24 ساعة من آخر رسالة للعميل، أو حتى 7 أيام بمجرد حصول تطبيق Meta الخاص بك على إذن Human Agent.
## التسليم والتوفر [#التسليم-والتوفر]
| الوجهة | الحد الحالي |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| الموقع الإلكتروني / المكالمة المباشرة | بريد إلكتروني بموافقة صريحة؛ لا توجد إشعارات دفع في الخلفية من الودجت |
| Telegram | محادثة بوت خاصة قائمة؛ وتتطلب محادثة Business الخاصة أيضًا نافذة 24 ساعة مفتوحة |
| WhatsApp | رسائل حرة خلال 24 ساعة من آخر رسالة واردة من العميل؛ وخارجها يلزم قالب خدمي (utility) معتمد |
| Messenger / Instagram | فقط خلال 24 ساعة من آخر رسالة واردة من العميل |
| Discord / KakaoTalk | وسيلة نقل المراقبة غير متاحة؛ كما تشترط سياسة Kakao قالب AlimTalk وتستثني الفترة من 20:50 إلى 08:00 بتوقيت كوريا (KST) |
تُفحص قيود القنوات مرة أخرى عند التسليم. ولا تتجاوزها المراقبة التي تمت الموافقة عليها ولا تضمن وصول الرسالة.
---
# Google Calendar
Source: /ar/docs/build/google-calendar.md
{/* docs-visuals */}
## حالة التوفر [#حالة-التوفر]
**Google Calendar غير متاح للجميع بعد.** إلى أن يتم تفعيله، يعرض **الوكيل ← الإجراءات ← Google Calendar** عبارة «قريبًا»، ويظل الربط غير متاح؛ ولا يمكن لإعداد في الوكيل تفعيله. يبقى [Cal.com](/ar/docs/build/cal-com) خيارًا منفصلًا.
## ربط تقويم [#ربط-تقويم]
عند التفعيل، افتح لوحة Google Calendar واختر **ربط**. سجّل الدخول إلى Google وراجع الأذونات المطلوبة لأحداث التقويم ولتوفر الأوقات (مشغول/متاح). هذا الربط منفصل عن تسجيل الدخول إلى Make Agent Fast. يخزّن الخادم رمز التحديث (refresh token) مشفّرًا، ولا تتلقاه لوحة التحكم ولا الوكيل.
النطاقات المطلوبة هي `calendar.events` و`calendar.freebusy` إضافةً إلى النطاقين غير الحساسين `openid` و`email`. تتطلب دالة الاستدعاء (callback) بريدًا إلكترونيًا موثّقًا وتخزّنه مشفّرًا لكي تُطابق `primary` معرّف التقويم نفسه المكتوب بالبريد الإلكتروني الصريح. لا يُطلب أي نطاق للملف الشخصي. يجب على أصحاب الاتصالات الأقدم التي لا تحتوي على بريد إلكتروني موثّق قطع الاتصال ثم إعادة الربط قبل الحجز.
يستخدم الوكيل مزوّد تقويم واحدًا في كل مرة. اقطع اتصال المزوّد الحالي قبل التبديل. اختر معرّف التقويم (`primary` للتقويم الأساسي للحساب المتصل) ومنطقته الزمنية بصيغة IANA، مثل `Asia/Seoul`. يجب أن يكون التقويم المشترك متاحًا بأذونات الحساب المتصل. يؤدي قطع الاتصال إلى إلغاء منح Google وإزالة الربط، ولا يلغي الأحداث الموجودة.
## تحديد ساعات العمل [#تحديد-ساعات-العمل]
لا تحتوي الاتصالات الجديدة على ساعات عمل، لذلك لا تُعرض أي مواعيد إلى أن تضيفها. أضف نوافذ الفتح والإغلاق لكل يوم عمل من أيام الأسبوع. اليوم الذي لا يحتوي على نوافذ يُعدّ يوم إغلاق؛ ويمكن استخدام عدة نوافذ غير متداخلة لتمثيل استراحة الغداء. تُفسَّر الساعات وفق المنطقة الزمنية المحددة. تُحفظ الإعدادات تلقائيًا.
| الإعداد | النطاق المقبول |
| --------------------------- | ------------------------------------- |
| مدة الموعد | 5–240 دقيقة |
| الفاصل حول الأحداث المشغولة | 0–120 دقيقة |
| الحد الأدنى للإشعار المسبق | 0–43,200 دقيقة |
| نطاق الحجز المستقبلي | 1–90 يومًا |
| نوافذ العمل | حتى 28 نافذة غير متداخلة خلال الأسبوع |
التوفر هو ساعات العمل مطروحًا منها الفترات المشغولة في التقويم المحدد، والفاصل، والحد الأدنى للإشعار المسبق، ونطاق الحجز المستقبلي. اضبط الساعات وفق المنطقة الزمنية المقصودة للتقويم، وتحقق من فترات التحول إلى التوقيت الصيفي عند الاقتضاء. قد يعني غياب المواعيد أن الساعات مغلقة أو أن الوقت مشغول، وليس بالضرورة وجود خطأ في الاتصال.
## من التوفر إلى الحجز [#من-التوفر-إلى-الحجز]
يستخدم الوكيل مسار `find_slots` و`book_slot` نفسه المستخدم مع Cal.com: يعرض حتى ثمانية أوقات متاحة، ويجمع الاسم والبريد الإلكتروني وملاحظة اختيارية، ثم يعيد التحقق من الموعد المختار، ثم يعرض بطاقة تأكيد. تنتهي صلاحية العروض والمقترحات بعد 15 دقيقة، ولا يحجز أيٌّ منهما الموعد. ولا يخوّل الحجز إلا نقر العميل على الزر. أما قول «نعم» شفهيًا أثناء مكالمة مباشرة فلا يمكنه إتمام الحجز.
بعد التأكيد، يتلقى Google حدثًا بمعرّف حتمي مرتبط بتشغيل الإجراء، ويرسل دعوات إلى الحاضرين. ينتج عن الحدث المؤكد الذي جرى التحقق منه إيصال مكتمل، بينما تبقى الأحداث المبدئية قيد الانتظار. إذا كان الموعد قد حُجز، فاطلب أوقاتًا جديدة وأكّد مرة أخرى. وإذا كانت نتيجة الشبكة غير مؤكدة، يجري التحقق منها باستخدام معرّف الحدث نفسه؛ لا تعدّ انتهاء المهلة نجاحًا، ولا تُنشئ حجزًا آخر دون تحقق. تؤدي تغييرات الإعدادات إلى إبطال العروض والمقترحات الأقدم.
لتلقي إشعار عند توفر وقت جديد، استخدم [المراقبة](/ar/docs/build/follow-ups) بموافقة العميل. قبل الاستخدام الفعلي مع العملاء، تحقق من حجز حقيقي ودعوة في Google، وجرّب موعدًا محجوزًا، وتحقق من قطع الاتصال وإعادة الربط ومن قناة المراسلة المقصودة.
---
# مصادر المعرفة
Source: /ar/docs/build/knowledge.md
{/* docs-visuals */}
توفّر المعرفة للوكيل مادة مصدرية قابلة للاسترجاع. عند إضافة مصدر، يتم استخراج النص العادي منه وتقسيمه إلى مقاطع وإنشاء التضمينات (embeddings) وربط هذه المقاطع بالموقع الحالي. وعند الإجابة، يسترجع الوكيل المقاطع ذات الصلة بدلًا من تلقي جميع المصادر في كل طلب.
## اختر نوع المصدر المناسب [#اختر-نوع-المصدر-المناسب]
| المصدر | الأنسب لـ | السلوك المهم |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **لصق نص** | السياسات وتفاصيل الاتصال والملاحظات الداخلية القصيرة | من 5 إلى 200,000 حرف؛ دون تحديث تلقائي |
| **من URL** | الصفحات العامة التي تُدار في مكان آخر | صفحة واحدة افتراضيًا؛ ويمكن اختياريًا زحف 5 أو 10 أو 20 أو 40 صفحة من الموقع نفسه |
| **رفع ملف** | PDF وWord (`.docx` و`.doc`) وExcel (`.xlsx` و`.xls`) وPowerPoint (`.pptx`) وملفات Hancom بصيغتي `.hwp` و`.hwpx` وOpenDocument (`.odt` و`.ods` و`.odp`) و`.rtf` و`.txt` و`.md` و`.csv` و`.tsv` و`.json` و`.html` | الحد الأقصى 20 ميغابايت؛ تُرفض الملفات المحمية بكلمة مرور والملفات التي تحتوي على وحدات ماكرو؛ ملفات PDF الممسوحة ضوئيًا التي تتكوّن من صور فقط لا تحتوي على نص قابل للتحديد |
| **YouTube** | مقاطع الفيديو العامة ذات المحتوى المنطوق المفيد | في خطة Operate أو Scale. يجرّب الترجمات أولًا، ثم النسخ النصي إن كان متاحًا؛ بأفضل جهد ممكن |
| **بودكاست** | عنوان URL عام لصوت حلقة أو خلاصة مدعومة | في خطة Operate أو Scale. يتطلب صوتًا يمكن جلبه ومزوّد نسخ نصي متاحًا |
| **مدونة / RSS** | تحديثات المدونات أو البودكاست العامة عبر RSS/Atom | في خطة Operate أو Scale. يستخرج عناصر الخلاصة المتاحة كنص؛ بأفضل جهد ممكن |
استخدم **الأسئلة الشائعة والمنتجات** للأسئلة والأجوبة المتوقعة أو حقول الكتالوج بدلًا من دفنها داخل مستند طويل. راجع [الأسئلة الشائعة والمنتجات](/ar/docs/build/faqs-products).
## إضافة مصدر [#إضافة-مصدر]
1. افتح صفحة **المعرفة** الخاصة بالوكيل من الشريط الجانبي للوكيل، ثم اختر **إضافة مصدر**.
2. اختر **لصق نص** أو **من URL** أو **رفع ملف**. تجد **YouTube** و**بودكاست** و**مدونة / RSS** ضمن **أنواع مصادر أخرى**، وهي تتطلب خطة Operate أو Scale؛ وفي خطة Launch تظهر عليها أيقونة قفل.
3. أدخل المحتوى أو اختر ملفًا.
4. بالنسبة إلى **من URL**، اختر **عدد الصفحات المراد زحفها** (1 أو 5 أو 10 أو 20 أو 40). وبالنسبة إلى المصادر المجلوبة، يمكنك اختياريًا ضبط **التحديث التلقائي** على **يوميًا** أو **أسبوعيًا** أو **أبدًا**.
5. اختر **إضافة إلى المعرفة** وانتظر ظهور النتيجة التي تعرض عدد المقاطع المفهرسة.
6. اطرح سؤالًا لا توجد إجابته إلا في المصدر الجديد.
يستهلك استيعاب المعرفة رصيدًا من الاعتمادات (Credits) لأن مقاطع المصدر يتم تضمينها. ويُرفض الاستيعاب إذا لم يكن لدى مساحة العمل وصول نشط أو رصيد صالح للاستخدام.
## زحف الصفحات العامة بأمان [#زحف-الصفحات-العامة-بأمان]
يقبل الزاحف المحتوى العام عبر HTTP/HTTPS ويحظر الوجهات غير الآمنة في الشبكات الخاصة. ابدأ بصفحة أساسية واحدة. لا تزد عدد الصفحات إلا عندما تكون الصفحات المرتبطة جزءًا من مجموعة المعلومات المفيدة نفسها؛ فقد يضيف الزحف الأكبر عناصر تنقّل ونصوصًا قانونية نمطية ومحتوى مكررًا أو أرشيفات قديمة تُضعف جودة الاسترجاع.
العدد المحدد هو حد أقصى وليس وعدًا. فقد يقلّل عدد الصفحات المجلوبة كلٌّ من سلوك ملف robots والمصادقة والعرض من جهة العميل فقط وعمليات إعادة التوجيه ونوع المحتوى وحجم الاستجابة وبنية الروابط. ويُحدَّد حجم استجابة الصفحة بحد أقصى 5 ميغابايت ويجب أن تحتوي على نص قابل للاستخراج بقدر كافٍ.
وبالنسبة إلى الحقائق المهمة الموجودة خلف تسجيل الدخول، الصق ملخصًا معتمدًا أو ارفع نسخة مُصدَّرة بعد تنقيتها بدلًا من محاولة زحف صفحة تتطلب مصادقة.
## استخدام الملفات والوسائط [#استخدام-الملفات-والوسائط]
يجب أن تحتوي الملفات المرفوعة على نص قابل للاستخراج. لا يتم إجراء OCR على ملف PDF ممسوح ضوئيًا يتكوّن من صور فقط؛ حوِّله إلى نص قابل للبحث قبل الرفع. تُقرأ جداول البيانات ورقةً ورقة، وتحتفظ صفوف الجداول بخلاياها معًا (`Coffee | 3000`)؛ أما التخطيطات الأخرى فتُسطَّح بترتيب القراءة، لذا اجعل الجداول بسيطة. أزل كلمة المرور من المستند قبل رفعه، واحفظ ملفات Office التي تحتوي على وحدات ماكرو (`.docm` و`.xlsm` و`.pptm`) أولًا كملفات `.docx` أو `.xlsx` أو `.pptx` عادية. ويُرفض أي ملف لا يطابق محتواه امتداده.
يفضّل استيعاب YouTube مسار الترجمة المتاح. وإذا لم تتوفر الترجمات، فإن النسخ النصي يعتمد على المزوّد والشبكة. يجب أن يكون صوت البودكاست قابلًا للجلب علنًا. وتعتمد نتائج الخلاصات على مقدار نص المقالات أو الحلقات الذي تعرضه الخلاصة. بعد أي استيراد للوسائط، افحص عنوان المصدر وعدد المقاطع واختبر حقيقة محددة بدلًا من افتراض أنه تم التقاط التسجيل بالكامل.
## تخطيط التحديث والاستبدال [#تخطيط-التحديث-والاستبدال]
تتوفر الجداول اليومية والأسبوعية لمصادر URL وYouTube والبودكاست والخلاصات. يعيد النظام جلب أصل المصدر المحفوظ ويستبدل مقاطعه القابلة للاسترجاع عند نجاح الزحف المجدول. تعرض قائمة المصادر وتيرة التحديث ووقت آخر تحديث.
مصادر اللصق والرفع هي لقطات ثابتة. ولتصحيح أحدها أو استبداله، احذفه وأضف المحتوى المحدَّث. يؤدي حذف المصدر إلى إزالة مقاطعه من الاسترجاع المستقبلي؛ لكنه لا يعدّل الرسائل السابقة التي اقتبست النسخة القديمة أو لخّصتها.
اعتمد جهة مسؤولة واحدة وواضحة عن الأسعار والسياسات والجداول الزمنية. فإذا تعارض مصدران نشطان، فقد يُظهر الاسترجاع أيًّا من العبارتين. أزل النسخ التي حلّ محلها غيرها بدلًا من إضافة نسخ «جديدة» بجانبها.
## اكتب محتوى يمكن للوكيل استرجاعه [#اكتب-محتوى-يمكن-للوكيل-استرجاعه]
* اذكر الموضوع في كل قسم: «سياسة إلغاء خطة Pro» أسهل استرجاعًا من «مزيد من التفاصيل».
* ضع الإجابة بلغة واضحة قرب العنوان ذي الصلة.
* أدرج الوحدات والعملة والمنطقة الزمنية وتاريخ السريان والاستثناءات حيثما كانت مهمة.
* استخدم عناوين URL أساسية ثابتة وأسماء ملفات وصفية.
* افصل المعلومات العامة عن التعليمات الداخلية أو السجلات الخاصة.
* أبقِ سلوك الشخصية في [الشخصية والتعليمات](/ar/docs/build/persona)، وليس داخل المواد المصدرية الواقعية.
## اختبار الإجابات المستندة إلى المصادر [#اختبار-الإجابات-المستندة-إلى-المصادر]
أنشئ مجموعة قبول صغيرة قبل النشر:
1. سؤال مباشر تكون إجابته صريحة في المصدر.
2. صياغة بديلة للسؤال تستخدم كلمات مختلفة.
3. سؤال حدّي لا يجيب عنه المصدر.
4. حقيقة تغيّرت مؤخرًا.
5. صيغة بلغة مختلفة لكل لغة مضبوطة للوكيل.
النتيجة الصحيحة ليست دائمًا إجابة واثقة. فعندما يفتقر المصدر إلى المعلومة، ينبغي أن يتبع الوكيل تعليمات الاحتياط/التصعيد بدلًا من اختلاق إجابة. افحص **المحادثات** بعد الإطلاق بحثًا عن الأسئلة غير المُجاب عنها المتكررة، وحوّل الإجابات المؤكدة إلى مصدر أو إلى أسئلة شائعة منظّمة.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | ما يجب فحصه |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
| يُبلغ URL بعدم وجود نص قابل للاستخدام | الوصول العام ونوع المحتوى المدعوم والنص المعروض من الخادم ووجهة إعادة التوجيه وحجم الصفحة |
| يُبلغ PDF بعدم وجود نص قابل للتحديد | هل هو ممسوح ضوئيًا؛ طبّق عليه OCR أو صدّره إلى PDF قابل للبحث أو ملف نصي |
| رُفض الملف لأنه محمي بكلمة مرور أو لا يطابق نوعه | أزل كلمة المرور، ثم احفظ الملف مجددًا بصيغته الحقيقية بدلًا من إعادة تسميته؛ واحفظ ملفات Office التي تحتوي على ماكرو دون ماكرو |
| فشل استيراد YouTube/البودكاست | عنوان URL العام وتوفر الترجمات/الصوت ومفتاح مزوّد النسخ النصي وقيود الجلب |
| يتم تجاهل معلومة صحيحة | نتيجة المعالجة والصياغة والمصادر المتعارضة وعمر المصدر ونص سؤال الاختبار بدقته |
| يكشف الوكيل أكثر مما ينبغي | أزل المصدر الخاص فورًا وشدّد حدود الشخصية والوصول إلى الحساب |
| تستمر إجابة قديمة | احذف المصدر القديم أو استبدله، وانتظر إعادة الفهرسة، وابدأ محادثة اختبار جديدة |
لا ترفع أبدًا بيانات اعتماد أو مفاتيح خاصة أو ملفات تصدير غير مقيّدة لبيانات العملاء أو سجلات صحية أو أي محتوى يجب ألا يكشفه الوكيل العام مطلقًا.
---
# عمليات البحث
Source: /ar/docs/build/lookups.md
{/* docs-visuals */}
## متى تستخدم عملية البحث [#متى-تستخدم-عملية-البحث]
استخدم عملية البحث للاطلاع على حالة الطلب الحالية أو حجز قائم أو سجل حساب العميل. أبقِ السياسات الثابتة ومعلومات المنتجات في [المعرفة](/ar/docs/build/knowledge). تقرأ عملية البحث من نظامك ولا يجوز لها أن تخصم مبلغًا أو تُلغي أو تحجز أو تُغيّر أي سجل بأي شكل آخر. أما بطاقات الاختيار والتأكيد العامة فترسل رسالة الزائر فقط. للكتابة المؤكَّدة استخدم [إجراءات التغيير](/ar/docs/build/change-actions)، ولحجوزات التقويم استخدم [الحجز عبر Cal.com](/ar/docs/build/cal-com). وحدها بطاقات التأكيد المرتبطة بتشغيل فعلي تخوّل هذه العمليات.
## إعداد الإجراء [#إعداد-الإجراء]
افتح **الوكيل ← الإجراءات**. أنشئ المفتاح السري في **العملاء المسجّلون للدخول**، وخزّنه على خادمك ونفّذ [تحديد هوية العميل](/ar/docs/embed/security#identify-signed-in-customers). في **عمليات البحث** أضف اسمًا مثل `order_status`، واشرح متى ينبغي للوكيل استخدامها، وأدخل نقطة النهاية العامة عبر HTTPS. صرّح فقط بالمدخلات التي تحتاج إليها، مثل سلسلة نصية `order_id`. يرى الوكيل الأداة باسم `lookup_order_status`.
أبقِ خيار **يتطلب عميلًا مسجّلًا للدخول** مفعّلًا للسجلات الخاصة (وهو الإعداد الافتراضي). إذا عطّلته فقد تحتوي الطلبات على `customer: null`؛ أعِد فقط المعلومات المناسبة لزائر مجهول. المعرّف المذكور في المحادثة أو المستخرج من صورة هو مُدخل وليس هوية موثَّقة.
تُحفظ الحقول الحالية تلقائيًا؛ انتظر ظهور مؤشر الحفظ قبل الاختبار. يمكنك تفعيل عملية البحث أو تعطيلها أو تعديلها أو حذفها. تتطلب اللوحة إعداد مفتاح سري. تُهيّأ هذه الإجراءات في لوحة التحكم؛ ولا توفّر الموجة 1 إدارة عمليات البحث عبر API العامة.
## الطلب الذي تستقبله [#الطلب-الذي-تستقبله]
يرسل Make Agent Fast طلب JSON من نوع POST إلى عنوان URL الذي هيّأته. تستخدم الأمثلة أدناه قيمًا نائبة للتوقيع:
```http
POST /agent/order-status HTTP/1.1
Content-Type: application/json
x-maf-timestamp:
x-maf-signature: v1=<64-lowercase-hex-characters>
```
```json
{
"version": 1,
"action": "order_status",
"requestId": "c5c1d94b-e88f-4bf6-8023-2dcd1e7ac67b",
"siteId": "YOUR_SITE_ID",
"input": { "order_id": "A128" },
"customer": { "id": "customer_123", "email": "customer@example.com" }
}
```
`action` هو الاسم المهيَّأ دون البادئة `lookup_`. يحدد `requestId` هذه المحاولة بعينها، ويحدد `siteId` موقعك. يحتوي `input` على المعاملات النصية المصرَّح بها فقط. أما `customer` فهو إما null أو الكائن `{ id, email?, name? }` الذي تحقق منه الخادم؛ ولا يمكن لمدخلات الزائر أو النموذج أن تحل محله. يستخدم **اختبار** في لوحة التحكم عن قصد عميلًا تجريبيًا يُدخله مالك مخوَّل.
## التحقق من التوقيع [#التحقق-من-التوقيع]
التوقيع هو HMAC-SHA256 بصيغة سداسية عشرية بأحرف صغيرة باستخدام **المفتاح السري للوكيل**، ويسبقه `v1=`. وقّع بدقة السلسلة `"maf-webhook-v1:" + timestamp + "." + rawBody`. حافظ على البايتات كما وصلت؛ فتحليل JSON ثم إعادة تسلسله قبل فحص التوقيع قد يغيّرها. تقبل هذه الدالة المساعدة كائن `Request` قياسيًا من جهة الخادم، وتطبّق نافذة صلاحية مدتها خمس دقائق، وتثبّت الموقع:
```js
import { createHmac, timingSafeEqual } from "node:crypto";
export async function verifyLookupRequest(request, expectedSiteId) {
const secret = process.env.MAF_SECRET_KEY;
if (!secret) throw new Error("MAF_SECRET_KEY is required");
const timestamp = request.headers.get("x-maf-timestamp");
const signature = request.headers.get("x-maf-signature");
const now = Math.floor(Date.now() / 1000);
if (!timestamp || !/^\d+$/.test(timestamp) ||
!Number.isSafeInteger(Number(timestamp)) ||
Math.abs(now - Number(timestamp)) > 300) {
throw new Error("Invalid timestamp");
}
if (!signature || !/^v1=[a-f0-9]{64}$/.test(signature)) {
throw new Error("Invalid signature");
}
const rawBody = Buffer.from(await request.arrayBuffer());
const expected = createHmac("sha256", secret)
.update(`maf-webhook-v1:${timestamp}.`)
.update(rawBody)
.digest();
const actual = Buffer.from(signature.slice(3), "hex");
if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {
throw new Error("Invalid signature");
}
const body = JSON.parse(rawBody.toString("utf8"));
if (body?.version !== 1 || body.siteId !== expectedSiteId) {
throw new Error("Invalid lookup scope");
}
return body;
}
```
استدعِها قبل أن يستهلك محلل الجسم (body parser) الطلب. ينبغي أن يرفض معالجك أخطاء التحقق، وأن يتحقق من الإجراء المتوقع وشكل المدخلات، وأن يفحص ملكية السجل مقابل `body.customer.id` قبل إعادة أي بيانات خاصة. على سبيل المثال، اختر الطلب A128 **من بين طلبات ذلك العميل**، لا بمعرّف الطلب وحده. لا تستخدم أبدًا `input.customer_id` أو بريدًا إلكترونيًا مقدَّمًا في المحادثة أو صورة كأساس للتخويل. اشترط عميلًا غير null لنقاط النهاية الخاصة. حدّد حجم الجسم الوارد على خادمك، وتتبّع `requestId` ضمن نافذة الصلاحية إذا كنت تريد رفض إعادة الإرسال؛ فالتحقق من الطابع الزمني وحده لا يرفض إعادة إرسال تقع ضمن تلك النافذة.
استخدم HTTPS وأبقِ نقطة النهاية هذه للقراءة فقط رغم أن وسيلة النقل هي POST. بعد تدوير المفتاح السري للوكيل، حدّث كلًا من خادم توقيع الهوية ومُتحقِّق عمليات البحث لديك.
## إرجاع الاستجابة [#إرجاع-الاستجابة]
أجب بحالة نجاح 2xx وبـ JSON مطابق لهذا العقد. المثال الأول سجل تم العثور عليه، والثاني نتيجة عادية بلا تطابق:
```json
{
"found": true,
"card": {
"title": "Order #A128",
"status": { "label": "Shipped", "tone": "success" },
"fields": [{ "label": "Carrier", "value": "DHL" }],
"reference": "A128",
"asOf": "2026-10-12T09:00:00Z",
"link": { "label": "Track", "url": "https://shop.example.com/orders/A128" }
},
"facts": { "order_id": "A128", "status": "shipped", "carrier": "DHL" }
}
```
```json
{ "found": false }
```
الحقل `found` مطلوب. عندما تكون القيمة `found: true` أدرج `card` أو `facts` أو كليهما. تتطلب البطاقة `title` و`fields` (يُسمح بمصفوفة فارغة). الحقول الاختيارية هي `status` و`reference` و`asOf` و`link`. لا تضف `kind` إلى بطاقة الاستجابة. درجات الحالة هي `neutral` و`success` و`warning` و`danger`. استخدم طابعًا زمنيًا بصيغة ISO للحقل `asOf`، ورابط HTTPS بلا بيانات اعتماد مضمَّنة. تُحذف الروابط الاختيارية غير الصالحة.
`facts` كائن مسطّح قيمه نصوص أو أعداد منتهية أو قيم منطقية أو null؛ وتُرفض الكائنات والمصفوفات المتداخلة. تُرفض الحقول غير المعروفة في مخطط الاستجابة/البطاقة. أعِد فقط المعلومات اللازمة للإجابة: يتلقى النموذج بيانات مُهرَّبة ومحدودة موسومة بأنها غير موثوقة، لا تعليمات. محتوى البطاقة نص عادي وليس HTML.
## الحدود وسلوك الفشل [#الحدود-وسلوك-الفشل]
| البند | الحد |
| ------------------------------------- | --------------------------------------------------------------------------------------------------- |
| عمليات البحث لكل وكيل | 5؛ بأسماء ومعرّفات فريدة |
| الاسم | `^[a-z][a-z0-9_]{2,39}$`؛ أسماء الإجراءات المحجوزة غير متاحة |
| الوصف | 300 حرف |
| المدخلات المصرَّح بها | 3؛ بأسماء فريدة تطابق `^[a-z][a-z0-9_]{1,31}$` |
| أوصاف المدخلات / قيمها | 300 / 200 حرف؛ تُقتطع المسافات الزائدة من القيم |
| نقطة النهاية | HTTPS عامة، حتى 500 حرف، بلا بيانات اعتماد؛ تُحجب العناوين الخاصة/الداخلية؛ لا تُتبع إعادات التوجيه |
| المهلة / جسم الاستجابة | 8 ثوانٍ / 32 KiB (32,768 بايت) |
| بيانات النموذج | 2,000 حرف، منفصلة عن بطاقة الزائر |
| عنوان البطاقة / التسميات / قيم الحقول | 80 / 40 / 200 حرف |
| حقول البطاقة | 8؛ وبحد أقصى 3 بطاقات في كل دور للوكيل |
يؤدي غياب هوية العميل إلى عرض تنبيه بتسجيل الدخول دون استدعاء نقطة النهاية. وتدفع المدخلات المطلوبة المفقودة الوكيل إلى سؤال الزائر عنها. يعرض `found: false` بطاقة محايدة تفيد بعدم وجود تطابق. أما انتهاء المهلة أو حالات غير 2xx أو JSON/مخطط غير صالح أو الاستجابات كبيرة الحجم فتعرض حالة فشل وتطلب من النموذج ألا يخمّن. أعِد `found: false` مع حالة 2xx للسجل المفقود عادةً، بدلًا من HTTP 404. اجعل الحقائق المهمة موجزة: تُقتطع نصوص البطاقة وبيانات النموذج الزائدة.
## الاختبار من لوحة التحكم [#الاختبار-من-لوحة-التحكم]
1. احفظ عملية البحث وافتح **اختبار**. أدخل معرّف عميل تجريبيًا، وبريدًا إلكترونيًا اختياريًا، وجميع المدخلات المطلوبة. استخدم حسابًا تتحكم فيه.
2. شغّل **اختبار**. يرسل هذا طلبًا موقّعًا حقيقيًا حتى لو كانت عملية البحث معطّلة للزوار؛ أما محادثة التجربة العادية فلا تستدعي نقطة النهاية أبدًا. تحدّ لوحة التحكم من محاولات الاختبار لكل مالك.
3. افحص البطاقة/الملخص الذي تم التحقق منه أو الخطأ، ومعرّف الطلب، والمدة، وحالة HTTP عند توفرها. راجع سجلات نقطة النهاية لديك دون تسجيل الأسرار أو رموز العملاء.
4. اختبر حالات: العثور على السجل، وعدم العثور عليه، وحساب خاطئ، ومدخل مفقود، وانتهاء المهلة. ثم اختبر التضمين الفعلي مع عميلين موثَّقين؛ فالعميل التجريبي في لوحة التحكم لا يثبت عزل هوية المتصفح ولا اختيار النموذج الفعلي للأداة.
تعرض الأداة المضمَّنة بطاقات الحالة؛ وتُرسل نقرات الاختيار/التأكيد العامة تسمياتها كرسائل. أما تأكيدات التغيير والحجز المرتبطة بتشغيل فعلي فتستخدم مسار التنفيذ المحمي بدلًا من ذلك. تكيّف الموصّلات البطاقات إلى نصوص/بطاقات أصلية وأزرار أو ردود سريعة أو قوائم، مع بديل نصي رهنًا بحدود كل قناة. اختبر كل قناة مقصودة قبل الاعتماد على التسليم.
---
# أدواتك الخاصة (MCP)
Source: /ar/docs/build/mcp-tools.md
{/* docs-visuals */}
## الربط والاكتشاف [#الربط-والاكتشاف]
افتح **Agent ← الإجراءات ← أدواتك (MCP)**. اربط خادمك البعيد باستخدام تدفّق OAuth أو بيانات اعتماد من نوع bearer، أو استخدم اتصال MCP موجودًا. اختر **اكتشاف** لقراءة كتالوج الأدوات. راجع وصف كل أداة ومعاملاتها وتعليقاتها التوضيحية (annotations) قبل تفعيلها. لا ينفّذ الاكتشاف أي أداة؛ وتكون الأدوات المكتشَفة حديثًا معطّلة.
يمكنك إعداد ثلاثة خوادم للأدوات وتفعيل 20 أداة في المجموع. تبقى بيانات الاعتماد على جانب الخادم. إزالة ربط أداة توقف هذا الربط فقط، لكنها لا تلغي اتصال المعرفة المشترك ولا صلاحية OAuth الممنوحة له؛ أدِر هذا الاتصال بشكل منفصل. لا يمكن عرض خادم MCP الخاص بإدارة المالك في Make Agent Fast كخادم أدوات للعملاء. لإدارة الـ agents الخاصة بك من Claude، راجع [استخدام Claude وChatGPT](/ar/docs/operate/ai-assistants).
## اختيار القراءة أو الكتابة [#اختيار-القراءة-أو-الكتابة]
| التأثير | السلوك |
| ------- | ----------------------------------------------------------------------------------------------------- |
| قراءة | تستدعي الأداة مباشرةً وتتعامل مع النص أو البيانات المنظّمة المُرجَعة على أنها بيانات أعمال غير موثوقة |
| كتابة | تنشئ مقترحًا؛ ويجب على العميل تأكيد المدخلات بدقة عبر أزرار البطاقة قبل التنفيذ |
تتوفر القراءة فقط إذا أعلن الخادم `readOnlyHint: true` ولم يعلن `destructiveHint: true`، وأبقيتَ تصنيف الأداة على أنها قراءة. وإلا فتعامل معها على أنها كتابة. راجع ما يفعله الخادم فعليًا؛ فالتعليقات التوضيحية (annotations) ليست نظام تفويض.
تكون الموافقة من المالك مطلوبة افتراضيًا في كل مرة لعمليات الكتابة. يمكنك اختيار عدم اشتراط موافقة إضافية من المالك، أو اشتراط الموافقة عند تجاوز حدّ معيّن لمعامل رقمي. يظل تأكيد العميل مطلوبًا في جميع الأوضاع. تستخدم موافقة المالك قائمة الموافقات والإيصالات الحالية. تُحفظ الإعدادات تلقائيًا. لا تستدعي تجربة المالك الخادم البعيد أبدًا.
## ربط العميل المسجَّل الدخول [#ربط-العميل-المسجَّل-الدخول]
تتطلب الأدوات عميلًا موثَّقًا افتراضيًا. استخدم [هوية العميل الموقَّعة](/ar/docs/embed/security) على موقعك؛ فالمعرّف الذي يُكتب في المحادثة ليس تحقّقًا. بالنسبة إلى السجلات الخاصة بكل عميل، اختر معامل النص (string) في الأداة الذي يعرّف العميل. يملأ الخادم هذا المعامل من معرّف العميل الموثَّق ويزيله من مدخلات النموذج. لا يمكن استخدام معاملات enum لهذا الربط.
على سبيل المثال، اربط `customer_id` في أداة تقرأ طلبًا. يمكن للنموذج تقديم مرجع الطلب المعلَن، لكنه لا يستطيع استبداله بمعرّف عميل آخر. ومع ذلك يجب على الخادم البعيد أن يتحقق من أن الطلب يخص هذا العميل. اشتراط تسجيل الدخول دون ربط معامل لا يحصر بحد ذاته كل سجل يمكن للأداة البعيدة الوصول إليه.
## الحدود والنتائج غير المؤكدة [#الحدود-والنتائج-غير-المؤكدة]
المخططات المدعومة هي كائنات مسطّحة تضم حتى عشرة معاملات من نوع string أو number أو integer أو boolean أو enum. تبقى الكائنات المتداخلة والمصفوفات وقواعد المخطط غير المدعومة غير متاحة. تُقيَّد النصوص بحد أقصى 200 حرف؛ ولكل استدعاء بعيد مهلة 10 ثوانٍ، وتُقتطع النتائج المرئية للنموذج عند 4 كيلوبايت. محتوى النتيجة بيانات وليس تعليمات للـ agent.
لا يوفّر MCP ضمانًا عامًا لخاصية idempotency. يُستدعى إجراء الكتابة مرة واحدة بعد التأكيد أو الموافقة. وإذا كانت نتيجته غير معروفة، فلا يعيد Make Agent Fast المحاولة تلقائيًا ويُخطر المالك. تحقّق من النظام البعيد قبل إنشاء مقترح آخر. تغيير إعداد الأداة الذي تمت مراجعته يُبطل أي مقترح أقدم.
اختبر كل عملية قراءة وكتابة تنوي استخدامها مع خادمك قبل أن يستخدمها العملاء.
---
# إجراءات الصفحة
Source: /ar/docs/build/page-actions.md
{/* docs-visuals */}
## تسجيل إجراء من الموقع المضيف [#تسجيل-إجراء-من-الموقع-المضيف]
تتيح إجراءات الصفحة لموقعك فتح واجهته الخاصة أو الانتقال إلى صفحة معتمدة. ثبّت أحدث إصدار من التضمين، ثم نفّذ التسجيل بعد تحميل السكربت. احتفظ بالمعالجات (handlers) داخل تطبيقك؛ فالـ agent يتلقى أسماءها وأوصافها وتعريفات معاملاتها فقط، ولا يتلقى شيفرة المعالج أبدًا.
```js
MakeAgentFast.registerAction("show_details", {
description: "Show the details section on this page",
params: { section: { type: "string", description: "Use delivery or returns" } },
confirm: true
}, async ({ section }) => {
const sections = {
delivery: document.getElementById("delivery-details"),
returns: document.getElementById("returns-details")
};
if (!Object.hasOwn(sections, section) || !sections[section]) {
throw new Error("Unknown section");
}
sections[section].scrollIntoView({ block: "start" });
return { shown: section };
});
// Run when the page component unmounts:
// MakeAgentFast.unregisterAction("show_details");
```
تُرجع الدالتان قيمة منطقية تشير إلى ما إذا كان التسجيل أو الإزالة قد قُبل. تتكوّن الأسماء من أحرف إنجليزية صغيرة وأرقام وشرطات سفلية، وتبدأ بحرف، ويتراوح طولها بين 2 و40 حرفًا. هناك تسع خانات تسجيل مخصّصة، إضافة إلى الإجراء المدمج `open_page`. يسمح كل تعريف بخمسة معاملات نصية؛ وجميع المعاملات المعلنة مطلوبة، وتصل قيمها إلى 200 حرف. أما الأوصاف فحدّها الأقصى 200 حرف. يمكن للمعالج أن يُرجع نصًا أو قيمة قابلة للتحويل إلى JSON بحجم يصل إلى 2 كيلوبايت خلال 10 ثوانٍ.
## اعتماد الإجراءات في لوحة التحكم [#اعتماد-الإجراءات-في-لوحة-التحكم]
افتح الموقع الذي ثبّتّ عليه التضمين ليُبلغ عن أسماء الإجراءات وأوصافها، ثم افتح **Agent → الإجراءات → إجراءات الصفحة**. فعّل الميزة واسمح بكل إجراء تريده. أوصاف الإجراءات المُبلَّغ عنها هي بيانات وصفية من الموقع وغير موثوقة؛ والاكتشاف لا يعتمد أي إجراء. تُحفظ الإعدادات تلقائيًا.
يمكن للـ agent اقتراح الإجراءات التي تكون مسجّلة حاليًا ومسموحًا بها فقط. يرى العميل بطاقة قبل التنفيذ. التأكيد مطلوب ما لم يحدّد المالك (Owner) الإجراء على أنه آمن؛ أما `confirm: true` في شيفرة الموقع المضيف فيتطلب دائمًا نقرة تأكيد. ولا يتجاوز `confirm: false` وحده سياسة المالك. خصّص الوضع الآمن لتغييرات الواجهة غير الضارة.
لا يحتاج الإجراء المدمج `open_page` إلى معالج. اسمح به من لوحة التحكم؛ فهو يقبل مسارًا نسبيًا أو عنوان URL بصيغة HTTP(S) ضمن أصول الموقع (origins) المسموح بها للـ agent. كما تتطلب المسارات النسبية أن يكون أصل الموقع الحالي مسموحًا به. ولا يمكنه الانتقال إلى وجهة خارجية عشوائية.
## الإبلاغ عن حدث باستخدام track [#الإبلاغ-عن-حدث-باستخدام-track]
```js
MakeAgentFast.track("form_error", { formId: "contact" });
MakeAgentFast.track("checkout_help", { step: "delivery" });
```
استدعِ هذه الدوال بعد تحميل التضمين وعند وقوع الحدث المقابل فعلًا. اضبط اسم حدث مطابقًا في [المتابعات](/ar/docs/build/follow-ups). تتبع الأسماء الصيغة نفسها (من 2 إلى 40 حرفًا)، ويجب أن تكون البيانات الاختيارية كائن JSON لا يزيد حجمه على 1 كيلوبايت. لا ترسل قيم الحقول أو بيانات الاعتماد أو تفاصيل الدفع. تطابق القواعد الحدث والمسار والمهلة؛ ولا تُخزَّن البيانات الوصفية ولا تُرسل إلى النموذج ولا تُستخدم كادعاء بحدوث تحويل. تعني القيمة المُرجعة `true` أن المُحمِّل (loader) قبل الحدث، وليس أن رسالة قد عُرضت.
## الأمان والتحقق [#الأمان-والتحقق]
تعمل إجراءات الصفحة في أداة الموقع الحية فقط، ولا تعمل في قنوات المراسلة أو تجربة المالك أو الصوت المباشر. يتحقق المُحمِّل والإطار من الأصل والمصدر والـ slug ومعرّفات الطلبات المعلّقة. تعود النتائج إلى المحادثة بوصفها بيانات متصفح غير موثوقة، وليست دليلًا على تغيّر سجل في الخادم. أبقِ المصادقة والتفويض داخل معالجاتك أو خادمك الخلفي؛ واستخدم [إجراءات التغيير](/ar/docs/build/change-actions) لعمليات الكتابة المهمة على بيانات النشاط التجاري.
لا يلغي انتهاء المهلة تنفيذ المعالج، ولا يثبت أن شيئًا لم يحدث. لا تُعِد محاولة إجراء غير مؤكَّد النتيجة تلقائيًا. ألغِ تسجيل المعالجات عندما يغادر مكوّن الصفحة الشاشة. تحتاج نسخ التضمين المخزّنة مؤقتًا إلى إصدار المُحمِّل الحالي `20261014-page-actions` لاستخدام هذه الواجهة البرمجية.
لا تتعامل هذه الواجهة البرمجية مع المدفوعات ولا توفّر موصل Shopify.
---
# الشخصية والتعليمات
Source: /ar/docs/build/persona.md
{/* docs-visuals */}
## افصل الهوية عن المعرفة [#افصل-الهوية-عن-المعرفة]
لا توجد صفحة منفصلة للشخصية. اكتب تعليمات الوكيل في علامة التبويب **نظرة عامة** ضمن صفحة الوكيل، في حقل **التعليمات**؛ وتُحفظ تلقائيًا.
تحدد الشخصية من هو الوكيل وكيف يتصرف، بينما توفّر المعرفة الحقائق. ضع عبارة «تحدّث بصفتك مساعد دعم Acme» في الشخصية، وضع مدة الضمان الحالية في مصدر معرفة.
## ترتيب التعليمات [#ترتيب-التعليمات]
اكتب التعليمات بهذا الترتيب:
1. الهوية والدور
2. الهدف الأساسي للزائر
3. النبرة وطول الردود
4. الإجراءات والأسئلة المطلوبة
5. الادعاءات المحظورة والمواضيع الحساسة
6. شروط التصعيد والتقاط بيانات العملاء المحتملين (Leads)
## الحدود [#الحدود]
أخبر الوكيل متى يقول إنه لا يعرف، ومتى يذكر المصدر أو يضع تحفظات على إجابته، ومتى يعرض المساعدة من موظف بشري. لا تطلب منه أبدًا إخفاء عدم اليقين أو اختلاق بيانات مفقودة.
## اختبر التغييرات [#اختبر-التغييرات]
قد تؤثر تغييرات الشخصية على جميع القنوات. أعد اختبار الأسئلة الشائعة وحالات الرفض والتقاط بيانات العملاء المحتملين واللغات المدعومة قبل نشر أي تغيير كبير.
---
# الصوت والمكالمات المباشرة
Source: /ar/docs/build/voice.md
{/* docs-visuals */}
## فهم أنماط التفاعل الثلاثة [#فهم-أنماط-التفاعل-الثلاثة]
| النمط | تجربة الزائر | الاستحقاق والاستخدام |
| --------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| **الدردشة النصية** | يكتب رسالة ويتلقى ردًا نصيًا | مفعّلة دائمًا؛ وتستهلك رصيد الذكاء الاصطناعي المعتاد |
| **الرسائل الصوتية** | يسجّل رسالة، وينتظر التفريغ النصي ومعالجة الوكيل وتحويل النص إلى كلام، ثم يتلقى ردًا | مشمولة في جميع الخطط؛ ويستهلك التفريغ النصي والنموذج ومعالجة الكلام رصيدًا |
| **مكالمة مباشرة في الوقت الفعلي** | يجري محادثة صوتية بزمن استجابة منخفض | Operate: 30 دقيقة/شهريًا؛ Scale: 90 دقيقة/شهريًا؛ Launch: غير متاحة؛ كما تُخصم الأرصدة مسبقًا مقابل الحد المضبوط للمكالمة |
لا يمكن تعطيل النص. أما مفاتيح الرسائل الصوتية والوقت الفعلي فتتحكم في الواجهات الإضافية التي يمكن للزوار استخدامها. ولا يتجاوز مفتاح الوقت الفعلي المحفوظ استحقاق خطة مساحة العمل ولا نقص إعدادات المزوّد.
## ضبط سلوك التفاعل [#ضبط-سلوك-التفاعل]
1. افتح صفحة **الوكيل** الخاصة بالموقع وابحث عن **الصوت**.
2. أبقِ **الدردشة النصية** مفعّلة، واختر **الرسائل الصوتية** و/أو **الصوت المباشر في الوقت الفعلي**.
3. إذا كان الوكيل متعدد اللغات، فيمكنك اختياريًا تفعيل محاكاة اللغة في المكالمات المباشرة.
4. حدّد الحد التلقائي لكل مكالمة.
5. اختر صوتًا جاهزًا.
6. احفظ، ثم اختبر كل نمط مفعّل على حدة.
يقبل حد المكالمة قيمًا من 30 ثانية إلى 20 دقيقة بخطوات مقدارها 30 ثانية؛ والقيمة الافتراضية 3 دقائق. يُنهي هذا الحد مكالمة بعينها ويحمي الحصة الشهرية، لكنه لا يزيد الدقائق المباشرة المتبقية في الخطة.
## اختيار اللغات والصوت [#اختيار-اللغات-والصوت]
يمكن ضبط الوكلاء للغات الإنجليزية والكورية والأوزبكية والروسية والفرنسية والإسبانية والألمانية والعربية. اللغة الأولى هي اللغة الأساسية. يواصل الوكيل أحادي اللغة الرد بتلك اللغة. أما وكيل النص متعدد اللغات فيحاكي لغة الزائر عندما يستخدم إحدى اللغات المضبوطة.
بالنسبة إلى المكالمات المباشرة، تُعدّ محاكاة اللغة خيارًا صريحًا يظهر فقط عند وجود لغتين أو أكثر. وعندما تكون متوقفة، تستخدم المكالمات المباشرة اللغة الأساسية. الصوت الأوزبكي حاليًا يعمل على أساس بذل أفضل جهد، لأن تغطية الكلام لدى المزوّدين أقل اكتمالًا؛ لذا اختبره مع مزوّدك وجمهورك تحديدًا قبل الإطلاق.
تشمل الأصوات الجاهزة خيارات تعتمد الإنجليزية أولًا، وخيارات متعددة اللغات، وخيارات كورية أصلية. تصف تسمية اللغة الأداء المنتقى، وليست ضمانًا قاطعًا. عاين الصوت المختار عندما يتوفر عنصر المعاينة في لوحة التحكم، واختبر دائمًا الأسماء والاختصارات والعملات وأرقام الهواتف والمصطلحات المتخصصة ضمن مسار الزائر الفعلي.
## مفاتيح المزوّدين والبدائل الاحتياطية [#مفاتيح-المزوّدين-والبدائل-الاحتياطية]
يتطلب الصوت أكثر من مفتاح نموذج:
* يستخدم تحويل الكلام إلى نص مزوّد التفريغ النصي المضبوط في المنصة.
* تحتاج الرسائل الصوتية وردود الصوت في الموصّلات إلى مزوّد تحويل النص إلى كلام المضبوط.
* تحتاج المكالمات في الوقت الفعلي إلى مزوّد الوقت الفعلي المضبوط وإلى حصة ضمن الخطة.
يستخدم الصوت المُدار من المنصة المزوّدين المضبوطين في المنصة؛ ولا تحتاج إلى مفتاح. يمكن لمالكي خطة Scale إضافة مفتاح Speko اختياريًا للتفريغ النصي وتوليد الصوت ضمن **الإعدادات ← مفاتيح مزوّدي الذكاء الاصطناعي**، ثم اتباع [مفاتيح المزوّدين](/ar/docs/account/provider-keys). تُحتسب المكالمات المباشرة دائمًا بسعر المنصة. نجاح الدردشة النصية يثبت مسار النموذج فقط؛ ولا يثبت التفريغ النصي ولا توليد الكلام ولا رفع الوسائط ولا إنشاء جلسة الوقت الفعلي.
## توجيه الكلام والبدائل الاحتياطية [#توجيه-الكلام-والبدائل-الاحتياطية]
اختر نموذجًا ضمن **نماذج الصوت** للتفريغ النصي وتوليد الصوت والمكالمات المباشرة. يحدد كل خيار النموذج وجهة تطويره؛ ويتيح **تلقائي** أن نختار نحن. تتولى Make Agent Fast الاستضافة والتوجيه، لذا لا يوجد خيار منفصل للمنصة. وقد يختلف الصوت الجاهز تحديدًا بحسب النموذج المختار.
إذا تعذّرت خدمة صوتية، فقد يُستخدم بديل احتياطي متاح. وإذا فشل الكلام، يبقى النص متاحًا.
تبث المكالمات المباشرة صوتًا أصليًا من مزوّد البث المباشر المختار باستخدام صوته المدمج. وتظل تنطبق عمليات استرجاع المعرفة وقواعد اللغة والمقاطعة وحصص الدقائق المباشرة والرسوم المسبقة للمكالمة. ولا تُنشئ الردود المباشرة طلبًا إضافيًا لتحويل النص إلى كلام.
## اختبار الرسائل الصوتية [#اختبار-الرسائل-الصوتية]
استخدم تضمينًا حقيقيًا أو رابط الوكيل، وليس معاينة المالك فقط. امنح إذن الميكروفون، وسجّل سؤالًا قصيرًا، وتأكد من معنى النص المفرّغ ومن الرد المنطوق/النصي. ثم اختبر:
* البيئات الهادئة والصاخبة؛
* Safari وChrome على الجوال عند الاقتضاء؛
* سؤالًا طويلًا يقارب الحد الأقصى العام للصوت وهو 25 MB؛
* رفض إذن الميكروفون؛
* صوتًا غير مدعوم أو منخفض الجودة؛
* كل لغة مضبوطة.
بالنسبة إلى المواقع المضمَّنة، يجب أن تسمح CSP وPermissions Policy في الصفحة الأم باستخدام الميكروفون. راجع [الأمان وCSP](/ar/docs/embed/security).
## الحديث المباشر على المنصة مقابل الموقع المنشور [#الحديث-المباشر-على-المنصة-مقابل-الموقع-المنشور]
يستخدم الحديث المباشر عناصر التحكم نفسها في موضعين:
| الواجهة | الموضع | المظهر | هل يُعد تفعيلًا؟ |
| --------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------- | ------------------------------------ |
| **لوحة استوديو الوكيل** | عنصر الدردشة المباشر بجانب علامات التبويب في صفحة **الوكيل** | مظهر عنصر الزائر، معروضًا في لوحة التحكم | لا — اختبارات المالك لا تُفعّل أبدًا |
| **الموقع المنشور والتضمين** | iframe الخاص بـ `embed.js`، والعنصر في رابط الوكيل، وأي صفحة عرض مستضافة متبقية | مظهر المستأجر / العنصر | نعم — مكالمة الزائر محادثة حقيقية |
تعرض اللوحة بجانب علامة التبويب **العرض** مظهر الزائر نفسه. اختبر تضمينًا حقيقيًا قبل الإطلاق؛ فنجاح اختبار لوحة التحكم لا يثبت إذن الميكروفون في التضمين ولا CSP الصفحة المضيفة ولا التفعيل.
يتبع خيار **استخدام الموقع** ضمن **سمة الوكيل** في علامة التبويب **العرض** الوضع الفاتح أو الداكن لدى الزائر في الصفحة المضيفة والتضمين. أما تثبيت الوضع الفاتح أو الداكن فيثبّت الدردشة والمكالمة المباشرة معًا. راجع [المظهر](/ar/docs/build/appearance).
## اختبار المكالمات المباشرة [#اختبار-المكالمات-المباشرة]
تأكد من أن الخطة تتضمن دقائق مباشرة غير مستخدمة، وأن الموقع متاح، وأن مفتاح مزوّد الوقت الفعلي صالح. ابدأ بمكالمة قصيرة، وقاطع الوكيل، ولا تبدّل اللغات إلا عند تفعيل المحاكاة، واترك حد المكالمة المضبوط يُنهي جلسة اختبار واحدة. كرّر مكالمة واحدة على تضمين حقيقي، وليس على لوحة صفحة الوكيل فقط.
الدقائق المباشرة استحقاق شهري منفصل عن الأرصدة العادية. يؤدي إصدار رمز المكالمة المباشرة إلى خصم الأرصدة مقابل أقصى مدة يصرّح بها الخادم، وحجز هذه المدة من الحصة المباشرة الشهرية. ولأن الوسائط تتدفق مباشرة بين المتصفح والمزوّد، لا يمكن التحقق من مكالمة أقصر يبلّغ عنها العميل، ولا تُسترد المدة غير المستخدمة جزئيًا بعد تسليم الرمز. تُحرَّر حالات فشل إنشاء الرمز من جانب الخادم؛ أما الجلسات المهجورة فتُحتسب بحدها المصرّح به. أنهِ الاختبارات بشكل سليم واستخدم حد المكالمة المضبوط عند التنبؤ بالاستهلاك. راجع [الأرصدة والاستخدام](/ar/docs/operate/usage).
## إجراءات الصوت المباشر [#إجراءات-الصوت-المباشر]
يتحكم **الوكيل ← الإجراءات ← إجراءات المكالمة المباشرة** (**السماح للوكيل باتخاذ إجراءات أثناء المكالمات المباشرة**) في استخدام الأدوات أثناء المكالمات المباشرة، التي تعمل على Gemini 3.8 Live بكل اللغات. وهو مفعّل افتراضيًا (`voice.liveActions`)؛ وإيقافه يُبقي ربط الإجابات بالمعرفة متاحًا. وتظل شروط خطة الصوت المباشر والمزوّد والوصول سارية.
يمكن أن تعرض المكالمات نتائج البحث والخيارات ومقترحات التغيير والمواعيد/الحجوزات في التقويم ومراقبات المتابعة وتسليم المحادثة إلى موظف. تتطلب تغييرات النشاط التجاري والحجوزات والمراقبات الضغط على أزرار البطاقة على الشاشة؛ ولا تؤكد كلمة «نعم» المنطوقة أو المكتوبة أي عملية كتابة أبدًا. كما تحتاج المراقبة إلى موافقة بالبريد الإلكتروني على الشاشة. تبقى البطاقات ونتائج الأدوات في سجل المحادثة. أما إجراءات الصفحة وأدوات MCP الخاصة بك فليست ضمن المجموعة الفرعية للمكالمات المباشرة. يظل احتساب المكالمة قائمًا على الحجز المسبق فقط، دون استرداد لوقت المكالمة غير المستخدم بعد تسليم الرمز.
اختبر النتيجة المنطوقة والتأكيد على الشاشة معًا قبل استخدامها مع العملاء. راجع [المتابعات](/ar/docs/build/follow-ups) و[إجراءات التغيير](/ar/docs/build/change-actions).
## الإفصاح والسلامة [#الإفصاح-والسلامة]
أخبر المتصلين بأنهم يتفاعلون مع ذكاء اصطناعي وكلام اصطناعي. حدّد كيفية الاحتفاظ بالتسجيلات والنصوص المفرّغة وبيانات المزوّدين اللاحقين وكيفية حذفها.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | ما يجب التحقق منه |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| يعمل النص لكن عناصر التحكم الصوتية تفشل | مفاتيح مزوّدي التفريغ النصي/تحويل النص إلى كلام/الوقت الفعلي، ومفتاح الميزة، والخطة، ورصيد الأرصدة، وإذن المتصفح |
| لا يمكن بدء التسجيل | HTTPS، وإذن الميكروفون، ومدخل الجهاز، وPermissions Policy للتضمين، ودعم المتصفح |
| النص المفرّغ غير دقيق | جودة الصوت، ومجموعة اللغات المختارة، واللهجة/المصطلحات، وتغطية مزوّد التفريغ النصي |
| الرد المنطوق يبدو غير صحيح | الصوت المختار، والنص المصدر، وعلامات الترقيم، وتسمية اللغة، وتوفر المزوّد |
| تنتهي المكالمة المباشرة فورًا | الدقائق المتبقية، وحد المكالمة، ومفتاح المزوّد، والشبكة، وحالة الجلسات المتزامنة |
تعامل مع الصوت بوصفه واجهة إطلاق مستقلة: اختبارات القبول النصية ضرورية لكنها غير كافية.
---
# Discord
Source: /ar/docs/connectors/discord.md
{/* docs-visuals */}
## إنشاء تطبيق Discord [#إنشاء-تطبيق-discord]
اتبع الدليلين الرسميين من Discord: [البدء السريع للتطبيقات](https://docs.discord.com/developers/quick-start/getting-started) و[نظرة عامة على التفاعلات](https://docs.discord.com/developers/interactions/overview). أنشئ تطبيقًا في بوابة المطورين في Discord (Discord Developer Portal) واجمع القيم التالية:
| حقل Make Agent Fast | موقعه في Discord | الغرض |
| ------------------- | ------------------- | --------------------------------------------------------------------------------- |
| **Application ID** | General Information | يحدد التطبيق والأمر |
| **Public Key** | General Information | يتحقق من تفاعلات موقَّعة بخوارزمية Ed25519؛ يتكوّن من 64 خانة سداسية عشرية بالضبط |
| **Bot token** | صفحة Bot | يتحقق من التطبيق ويسجّل الأمر `/ask`؛ احتفظ به سرًا |
تؤدي إعادة تعيين رمز البوت إلى إبطال الرمز السابق فورًا. المفتاح العام (Public Key) ليس سريًا، لكن يجب أن يعود إلى التطبيق نفسه الذي ينتمي إليه رمز البوت.
## الربط وتسجيل `/ask` [#الربط-وتسجيل-ask]
افتح صفحة **القنوات** الخاصة بالـ agent، واختر **Discord**، وأدخل القيم الثلاث، ثم اضغط **اتصال**.
يتحقق Make Agent Fast من رمز البوت عبر نقطة نهاية التطبيق في Discord، ويرفض أي Public Key لا يطابق التطبيق. كما يصحّح تلقائيًا أي Application ID أُدخل بشكل خاطئ إلى المعرّف الحقيقي للتطبيق الذي جرت مصادقته، ثم ينشئ الأمر العام `/ask question` أو يحدّثه دون حذف أي أوامر أخرى للتطبيق.
بعد الحفظ، انسخ **Interactions Endpoint URL** المعروض إلى الحقل **General Information → Interactions Endpoint URL** في Discord ثم احفظ. يرسل Discord طلب `PING` موقَّعًا؛ يتحقق Make Agent Fast من التوقيع ويعيد الاستجابة المطلوبة `PONG`.
## التثبيت والاختبار [#التثبيت-والاختبار]
استخدم إعدادات التثبيت في Discord لتفويض التطبيق في خادم تجريبي مع الأذونات اللازمة لأوامر التطبيق. قد يستغرق انتشار الأوامر العامة بعض الوقت.
شغّل `/ask`، واملأ الخيار المطلوب `question`، ثم أرسل. يؤكد Make Agent Fast استلام التفاعل قبل انتهاء المهلة القصيرة في Discord، ثم يشغّل الـ agent، ثم يعدّل الرد الأصلي المؤجَّل. يُحفظ سجل المحادثة لكل مستخدم في Discord على حدة، بحيث تحتفظ طلبات `/ask` اللاحقة بالسياق.
الموصّل الحالي نصي فقط. فهو لا يقرأ القنوات الصوتية أو المرفقات أو رسائل القنوات العادية أو الرسائل المباشرة؛ ولا يصل إلى الـ agent سوى تفاعل `/ask` المسجَّل.
## التدوير أو قطع الاتصال [#التدوير-أو-قطع-الاتصال]
إذا تعرّض رمز البوت للكشف، فأعد تعيينه في Discord، ثم حدّث الموصّل، وتحقق من `/ask` مرة أخرى. وإذا تغيّر التطبيق نفسه، فحدّث القيم الثلاث وInteractions Endpoint URL الخاص بذلك التطبيق.
لا يؤدي تعطيل الموصّل أو إزالته إلى حذف تطبيق Discord أو الأمر العام. أزل التطبيق من الخوادم، واحذف بيانات اعتماد المزوّد غير المستخدمة بشكل منفصل عند إيقافه نهائيًا.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| يرفض الموصّل الحقول | استخدم رمز البوت والـ Public Key المكوَّن من 64 خانة من التطبيق نفسه |
| يرفض Discord نقطة النهاية | تأكد من أنها عامة وتعمل عبر HTTPS، والصق نقطة النهاية التي جرى إنشاؤها، وأعد حفظ بيانات الاعتماد قبل المحاولة مجددًا |
| الأمر `/ask` غير ظاهر | تأكد من تثبيت الأمر وتفويضه، وانتظر انتشار الأوامر العامة، ثم أعد الاتصال لتسجيله من جديد |
| يظهر أن التطبيق لم يستجب للتفاعل | تأكد من تفعيل الموصّل، وافحص الأخطاء في Make Agent Fast وDiscord؛ ويجب أن ينجح التحقق من توقيع نقطة النهاية |
| تُتجاهل رسائل الدردشة الأخرى | هذا متوقع؛ فالتكامل يتعامل مع `/ask` فقط |
| الرد مقتطع | رسائل الرد في Discord محدودة بـ 2,000 حرف |
لا تكشف رمز البوت أبدًا في كود العميل أو المستودعات أو السجلات أو لقطات الشاشة.
---
# Instagram
Source: /ar/docs/connectors/instagram.md
{/* docs-visuals */}
## ماذا يفعل هذا الموصل [#ماذا-يفعل-هذا-الموصل]
يرسل العملاء **رسالة مباشرة** إلى حساب Instagram الاحترافي الخاص بك. ويجيب Make Agent Fast بالوكيل نفسه المعتمد على المصادر الذي يعمل في تضمين موقعك، عبر واجهة Meta الرسمية [Instagram API with Instagram Login](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login).
ويمكنه أيضًا الرد على **التعليقات** في منشوراتك وريلزك، علنًا أو برسالة مباشرة خاصة (راجع [التعليقات والردود المحفوظة](#comments-and-saved-replies)). كما تتم الإجابة عن الردود على قصصك (راجع [القصص](#stories)). ما يخرج عن النطاق: استخلاص البيانات (scraping)، والإعجاب بالمنشورات أو التعليقات. فواجهة Instagram الرسمية لا توفر أي وسيلة للإعجاب بالمحتوى، لذلك لا يفعل الوكيل ذلك أبدًا.
كل حساب Instagram يمثل قناة مستقلة، لذا تبقى الفوترة ومحادثات صندوق الوارد وتوجيه الرسائل منفصلة. ويمكن للوكيل الواحد أن يرتبط بما يصل إلى خمسة حسابات Instagram.
## قبل أن تبدأ [#قبل-أن-تبدأ]
تحتاج إلى:
1. حساب Instagram **احترافي** (نشاط تجاري أو منشئ محتوى). لا يمكن ربط الحسابات الشخصية؛ يمكنك التحويل من Instagram عبر **الإعدادات ← نوع الحساب والأدوات**.
2. اسم مستخدم Instagram وكلمة المرور للحساب، أو تطبيق Instagram مسجَّل الدخول إليه مسبقًا في هذا المتصفح.
3. خطة Operate أو Scale لإضافة قناة جديدة.
أنت **لا** تحتاج إلى حساب Facebook، ولا صفحة Facebook، ولا محفظة أعمال Meta، ولا تطبيق مطوّرين من Meta.
## اربط حسابك [#اربط-حسابك]
### 1. افتح بطاقة Instagram [#1-افتح-بطاقة-instagram]
في لوحة التحكم، افتح وكيلك وانتقل إلى **القنوات ← Instagram**.
### 2. سجّل الدخول واسمح بالوصول [#2-سجّل-الدخول-واسمح-بالوصول]
اختر **الربط مع Instagram**. ستفتح Instagram صفحة تسجيل الدخول الخاصة بها. سجّل الدخول إلى الحساب الاحترافي الذي تريد أن يجيب عنه الوكيل، وتأكد من أن النافذة تذكر هذا الحساب، ثم اختر **السماح**. أبقِ خيار **الوصول إلى الرسائل وإدارتها** مفعّلًا؛ فلا يستطيع الوكيل قراءة الرسائل المباشرة أو الإجابة عنها بدونه. أما **الوصول إلى التعليقات وإدارتها** فيُستخدم فقط إذا فعّلت الردود على التعليقات لاحقًا.
ستعيدك Instagram إلى بطاقة Instagram، التي ستعرض الآن الحساب على أنه متصل. لربط حساب آخر، اختر **الربط مع Instagram** مرة أخرى وسجّل الدخول إلى ذلك الحساب.
### 3. أرسل رسالة اختبار [#3-أرسل-رسالة-اختبار]
من حساب Instagram **مختلف**، أرسل رسالة مباشرة جديدة إلى الحساب المتصل. تأكد مما يلي:
1. تظهر الرسالة في صندوق الوارد في Instagram.
2. تعرض بطاقة Instagram حدثًا جديدًا، ويظهر في **المحادثات** مسار محادثة جديد.
3. تنجح خطوة التحقق في البطاقة.
### 4. فعّل ردود الذكاء الاصطناعي [#4-فعّل-ردود-الذكاء-الاصطناعي]
بعد نجاح الاختبار، فعّل ردود الذكاء الاصطناعي من البطاقة. ومن ذلك الحين يجيب الوكيل عن الرسائل المباشرة الجديدة. تتم الإجابة عن الرسائل النصية والرسائل الصوتية المدعومة بنص. أما رسائلك أنت والصور والمرفقات الأخرى غير المدعومة فيتم تجاهلها. وعندما ترد بنفسك من صندوق **المحادثات**، يتوقف الوكيل مؤقتًا عن هذه المحادثة.
## التعليقات والردود المحفوظة [#التعليقات-والردود-المحفوظة]
فعّل **الرد على التعليقات** في قسم **التعليقات** ببطاقة Instagram. عندها تتم الإجابة عن التعليقات الجديدة من المستوى الأعلى على منشوراتك وريلزك بالترتيب التالي:
1. **ردودك المحفوظة.** اكتب ردًا لمنشور واحد، أو لـ **جميع المنشورات**، واختر الكلمات المفتاحية التي تُفعّله (مثل `price, how much`). اترك الكلمات المفتاحية فارغة للرد على كل تعليق في ذلك المنشور. يمكن لكل رد محفوظ أن ينشر ردًا علنيًا أسفل التعليق، أو يرسل رسالة مباشرة خاصة، أو يفعل الاثنين معًا. يتحول `{name}` إلى @handle صاحب التعليق. وتتقدم ردود المنشور نفسه على ردود **جميع المنشورات**، وتتقدم ردود الكلمات المفتاحية على الردود الشاملة. لا تستخدم الردود المحفوظة الذكاء الاصطناعي ولا تستهلك أي رصيد.
2. **الذكاء الاصطناعي، إذا سمحت به.** ضمن **عندما لا يناسب أي رد محفوظ**، اختر **التزام الصمت**، أو **ردود الذكاء الاصطناعي** (جملة أو جملتان قصيرتان تُنشران علنًا)، أو **الذكاء الاصطناعي يرسل رسالة مباشرة** (تذهب الإجابة إلى الرسائل المباشرة لصاحب التعليق، مع سطر علني اختياري تكتبه أنت أسفل التعليق). يُمرَّر نص منشور التعليق إلى الوكيل كسياق. وتستهلك ردود الذكاء الاصطناعي رصيدًا كما تفعل الإجابة عن رسالة مباشرة.
لا يجيب الوكيل أبدًا عن تعليقاته هو، ولا يرد داخل سلسلة تعليقات، ولا يرد على التعليقات التي تكتفي بالإشارة إلى الأصدقاء أو تتكون من رموز تعبيرية فقط، ولا على الأسئلة التي ليس لديه إجابة معتمدة عنها. تظهر محادثات التعليقات في **المحادثات** للقراءة فقط؛ أجب عنها من Instagram. تسمح Instagram برسالة مباشرة خاصة واحدة لكل تعليق، خلال 7 أيام منه.
## القصص [#القصص]
تصل القصص إلى الوكيل في صورة رسائل مباشرة:
* **الرد المكتوب على قصتك** يجيب عنه الذكاء الاصطناعي كأي رسالة مباشرة. وعندما تكون القصة صورة، يراها الوكيل، فيحصل سؤال مثل «كم سعر هذا؟» على إجابة عما تعرضه القصة. أما قصص الفيديو فتتم الإجابة عنها من النص وحده.
* **الإشارة إليك في قصة شخص ما** و**التفاعل برمز تعبيري فقط مع قصتك** لا يتضمنان سؤالًا، لذا لا يجيب عنهما الذكاء الاصطناعي أبدًا. في قسم **القصص** ببطاقة Instagram، اكتب ردًا قصيرًا لكل منهما، أو اتركه فارغًا لالتزام الصمت. لا تستخدم هذه الردود الذكاء الاصطناعي ولا تستهلك رصيدًا، ولا يتلقى الشخص أكثر من رد تفاعل واحد في اليوم.
تظهر الثلاثة جميعها في **المحادثات**. لا تُبلغ Instagram التطبيقات عندما يعجب أحدهم بقصة، ولا يستطيع أي تطبيق الإعجاب بالقصص أو التعليق عليها.
## التوفر [#التوفر]
يظهر **الربط مع Instagram** في البطاقة بمجرد أن توافق Meta على وصول Make Agent Fast إلى المراسلة عبر Instagram. وإلى ذلك الحين قد لا تعرضه البطاقة، ولا تسلّم Instagram الرسائل إلا من الحسابات التي تسمح Meta للتطبيق باختبارها. إذا لم يظهر الزر في بطاقتك بعد، فاستخدم الطريقة المتقدمة أدناه أو عاود المحاولة لاحقًا.
## قطع الاتصال أو إعادة الربط [#قطع-الاتصال-أو-إعادة-الربط]
يجدد Make Agent Fast تسجيل الدخول تلقائيًا. إذا توقفت الردود وعرضت البطاقة خطأ في الاتصال، مثلًا بعد تغيير كلمة المرور، فاختر **إعادة الربط مع Instagram** وسجّل الدخول مجددًا. لقطع الاتصال، أزل الربط من البطاقة. ويمكنك أيضًا إزالة Make Agent Fast من Instagram عبر **الإعدادات ← التطبيقات والمواقع الإلكترونية**؛ وعندها يتوقف الوكيل عن الرد على ذلك الحساب فورًا.
## متقدم: تطبيق Meta الخاص بك [#متقدم-تطبيق-meta-الخاص-بك]
يمكن للمطورين الذين يشغّلون تطبيق Meta خاصًا بهم أن يواصلوا الربط باستخدام رمز وصول صفحة Facebook بدلًا من ذلك. يتطلب هذا حساب Instagram احترافيًا مرتبطًا بصفحة Facebook، وتطبيق مطورين من Meta يملك الأذونات `instagram_basic` و`instagram_manage_messages` و`pages_manage_metadata` و`pages_messaging` و`pages_show_list`، و[إعداد webhook](https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/webhooks/) من Meta.
الصق **رمز وصول الصفحة** و**App secret** الخاص بالتطبيق في النموذج المتقدم بالبطاقة، ثم استخدم **Webhook URL** و**Verify token** اللذين تعرضهما لإعداد webhook الخاص بـ Instagram (الحقل `messages`). اشترك بالصفحة نفسها باستخدام رمز الصفحة:
```text
POST /me/subscribed_apps?subscribed_fields=messages
```
لن يجيب تطبيقك الخاص عن الجمهور إلا بعد اجتيازه مراجعة تطبيقات Meta مع Advanced Access.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| ------------------------------------------------- | ---------------------------------------------------------------------------- |
| لا يظهر زر **الربط مع Instagram** | لا تزال موافقة Meta قيد الانتظار؛ راجع [التوفر](#availability) |
| تقول Instagram إن الحساب لا يمكن استخدامه | حوّله إلى حساب احترافي (نشاط تجاري أو منشئ محتوى) وحاول مرة أخرى |
| «متصل بالفعل بوكيل آخر» | اقطع اتصاله من ذلك الوكيل أولًا، ثم اربطه هنا |
| تم الربط، لكن لا يظهر حدث جديد بعد رسالة الاختبار | أرسل رسالة مباشرة جديدة من حساب مختلف؛ فالرسائل المرسلة قبل الربط لا تُعاد |
| تصل رسالة مباشرة لكن بلا رد | فعّل ردود الذكاء الاصطناعي بعد خطوة التحقق، وتحقق من البطاقة بحثًا عن خطأ |
| لا تتم الإجابة عن التعليقات | فعّل **الرد على التعليقات** وأضف ردًا محفوظًا أو اسمح بردود الذكاء الاصطناعي |
| الرسالة الصوتية تحصل على رد نصي | هذا متوقع؛ الردود الصوتية في Instagram غير مدعومة |
| تعرض البطاقة خطأ في الاتصال | اختر **إعادة الربط مع Instagram** وسجّل الدخول مجددًا |
لا تشارك كلمة مرور Instagram مع أي شخص، بما في ذلك الدعم؛ فالاتصال يستخدم تسجيل الدخول الخاص بـ Instagram نفسه.
---
# KakaoTalk
Source: /ar/docs/connectors/kakao.md
{/* docs-visuals */}
## قائمة الإعداد [#قائمة-الإعداد]
تعرض بطاقة KakaoTalk في Make Agent Fast هذه القائمة وقد مُلئت بقيمك الخاصة، لذا يُنجز معظم المالكين الخطوات من هناك. تتم كل خطوة في وحدة تحكم Kakao باستثناء الحقلين المشار إليهما أدناه.
1. **أنشئ بوتًا** في Kakao i Open Builder. يضم بوت واحد كل كتل السيناريو التي تُجيب بها القناة؛ تخطَّ هذه الخطوة إذا كانت القناة مرتبطة ببوت يمكنك تعديله.
2. **أضف مهارة (skill)** وعيّن عنوانها إلى **Skill URL** الخاص بالموصّل، ثم أضف ترويسة طلب مخصّصة `X-Kakao-Bot-Secret` تحمل **Bot secret** الخاص بك. لا توقّع Kakao طلبات المهارات، لذا فإن هذه الترويسة هي الدليل الوحيد على أن الاستدعاء جاء من بوتك.
3. **وجّه كتلة الاحتياط (fallback) إلى المهارة** حتى يصل إلى الوكيل كل سؤال لا تعالجه سيناريوهاتك. اربط كتلة سيناريو مسمّاة بالمهارة نفسها إذا كان يجب أن يجيب عنها الوكيل أيضًا.
4. **فعّل خيار callback** لتلك الكتلة. تتجاهل Kakao استجابة المهارة التي تستغرق أكثر من خمس ثوانٍ؛ ومع تفعيل callback يعيد Make Agent Fast فقاعة انتظار فورًا ثم ينشر الإجابة النهائية إلى `userRequest.callbackUrl` خلال الدقيقة التي نعدّ فيها هذا العنوان الذي يُستخدم مرة واحدة صالحًا.
5. **اربط قناة KakaoTalk** بالبوت، ثم الصق معرّف القناة نفسه في حقل **Channel ID** الخاص بالموصّل في Make Agent Fast.
6. **انشر البوت.** لا تصل تغييرات Open Builder إلى الزوار إلا بعد النشر، وكل تغيير لاحق في مهارة أو كتلة يحتاج إلى نشر آخر.
تمثّل بقية هذه الصفحة الشرح التفصيلي للخطوات الست نفسها.
## تجهيز أصول Kakao [#تجهيز-أصول-kakao]
أنشئ أو اختر تطبيق Kakao Developers وقناة KakaoTalk وبوت Kakao i Open Builder التي ستتولى التكامل. راجع [وثائق Open Builder](https://i.kakao.com/docs/key-concepts-block#skill) الرسمية من Kakao الخاصة بالمهارات والكتل.
اجمع هذه القيم أو أنشئها:
| حقل Make Agent Fast | المصدر | الغرض |
| ------------------- | ----------------------------------------- | ---------------------------------------------------- |
| **Channel ID** | المعرّف العام/معرّف البحث لقناة KakaoTalk | يربط الموصّل بالقناة المقصودة |
| **REST API key** | مفاتيح تطبيق Kakao Developers | يتحقق من صحة تطبيق Kakao |
| **Bot secret** | سر عشوائي طويل تنشئه بنفسك | يوثّق طلبات المهارة الواردة عبر `X-Kakao-Bot-Secret` |
يُشترط وجود Bot secret في بيئات Make Agent Fast المنشورة لأن استدعاءات مهارات Kakao لا توفّر توقيعًا من المنصة. أنشئ قيمة فريدة عالية الإنتروبيا ولا تعيد استخدام REST API key كسر.
## حفظ الموصّل [#حفظ-الموصّل]
افتح صفحة **القنوات** الخاصة بالوكيل، واختر **KakaoTalk Channel**، وأدخل القيم الثلاث جميعها، ثم اختر **اتصال**. يتحقق Make Agent Fast من REST API key حيثما تسمح أذونات Kakao، ويعرض **Webhook URL** الفريد للموصّل بعد الحفظ.
لا يستطيع Make Agent Fast إنشاء مهارة Open Builder أو ربطها بكتلة نيابةً عنك؛ يتم باقي العمل في وحدة تحكم Kakao.
## ضبط مهارة Open Builder [#ضبط-مهارة-open-builder]
1. في Kakao i Open Builder، أنشئ مهارة للبوت المقصود.
2. عيّن عنوان المهارة إلى **Webhook URL** المنسوخ من الموصّل.
3. أضف ترويسة طلب مخصّصة باسم `X-Kakao-Bot-Secret` تطابق قيمتها تمامًا **Bot secret**.
4. اربط المهارة بكتلة الاحتياط أو كتلة السيناريو التي يجب أن تستدعي الوكيل.
5. فعّل خيار callback لتلك الكتلة حتى تتجاوز الإجابات البطيئة مهلة المهارة في Kakao البالغة خمس ثوانٍ.
6. احفظ إعدادات البوت وانشرها وفق آلية العمل في Kakao.
الترويسة غير حساسة لحالة الأحرف وفق قواعد HTTP، لكن قيمة السر يجب أن تطابق تمامًا. أي شخص يعرف عنوان webhook دون هذا السر يجب أن يتلقى استجابة غير مصرّح بها.
## اختبار القدرات [#اختبار-القدرات]
استخدم أداة الاختبار في Open Builder أولًا، ثم قناة KakaoTalk المرتبطة. أرسل سؤالًا نصيًا واقعيًا بالكورية أو بإحدى اللغات المدعومة، وتأكد من الإجابة المضمّنة ومن **آخر رسالة** ومن سلسلة **المحادثات**.
تنسخ بطاقة الموصّل نص الطلب أدناه؛ ويعمل النص نفسه مع `curl` على Skill URL. وهو لا يتضمن `callbackUrl`، لذا تعود الإجابة مضمّنة، وهذا أبسط ما يمكن التحقق منه أولًا.
```json
{
"intent": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
},
"userRequest": {
"timezone": "Asia/Seoul",
"utterance": "What are your opening hours?",
"lang": "kr",
"user": {
"id": "kakao-test-user",
"type": "botUserKey",
"properties": {
"plusfriendUserKey": "kakao-test-user"
}
},
"block": {
"id": "5a56ec0cf65e53002d34e0f4",
"name": "Fallback block"
}
},
"bot": {
"id": "5a56ec0cf65e53002d34e0f2",
"name": "Your bot"
},
"action": {
"id": "5a56ec0cf65e53002d34e0f6",
"name": "Make Agent Fast skill",
"params": {},
"detailParams": {},
"clientExtra": {}
}
}
```
تستجيب المهارة السليمة ضمن مهلة الخمس ثوانٍ بمخرج `simpleText` واحد:
```json
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "We are open 9:00–18:00 on weekdays."
}
}
]
}
}
```
عند تفعيل خيار callback للكتلة، يضيف Open Builder `userRequest.callbackUrl` إلى الطلب. عندها يردّ Make Agent Fast أولًا بفقاعة انتظار ثم يرسل الرد النهائي بطلب POST إلى ذلك العنوان الذي يُستخدم مرة واحدة:
```json
{
"version": "2.0",
"useCallback": true,
"data": {
"text": "One moment — I am looking that up."
}
}
```
عقد المهارة الحالي نصي فقط. يكون ردّ الوكيل `skillResponse` واحدًا من Kakao بالإصدار `2.0` مع مخرج `simpleText`، ضمن حدّ أقل من حد النص في Kakao، ويُعاد مضمّنًا أو على عنوان callback. الصوت والملفات والصور والإرسال الصوتي المنفصل غير مدعومة.
## التدوير أو قطع الاتصال [#التدوير-أو-قطع-الاتصال]
لتدوير Bot secret، حدّث الموصّل وترويسة Open Builder المخصّصة كتغيير منسّق واحد، ثم اختبر فورًا. أي عدم تطابق يوقف كل الطلبات الواردة. دوِّر REST API key في Kakao Developers وفي Make Agent Fast قبل إلغاء المفتاح القديم.
لا يؤدي تعطيل الموصّل أو إزالته إلى حذف مهارة Open Builder أو الكتلة. أزل هذه العناصر في جانب المزوّد أو افصلها عند إيقاف التكامل نهائيًا.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| -------------------------------------------- | -------------------------------------------------------------------------------------- |
| الموصّل يتطلب Bot secret | أنشئ واحدًا؛ فالبيئات المنشورة ترفض webhook من Kakao غير موثَّق |
| رفض REST API key | استخدم REST API key من تطبيق Kakao المقصود وتأكد من أذونات قناته |
| يتلقى Open Builder استجابة غير مصرّح بها | أضف/حدّث `X-Kakao-Bot-Secret` ليطابق تمامًا قيمة الموصّل |
| تعرض أداة الاختبار كتلة الاحتياط بدل الإجابة | تأكد من أن الكتلة تستدعي عنوان المهارة المحفوظ وافحص سجلات الطلبات/الاستجابات في Kakao |
| انتهاء مهلة الطلبات | فعّل خيار callback للكتلة؛ ودونه تمنح Kakao المهارة خمس ثوانٍ فقط |
| يتم تجاهل الصوت أو الصور | هذا متوقع؛ يقبل الموصّل الحالي النص فقط |
لا تعرض REST API key أو Bot secret في شيفرة العميل أو في الوثائق العامة.
---
# Messenger
Source: /ar/docs/connectors/messenger.md
{/* docs-visuals */}
## تجهيز تطبيق Meta والصفحة [#تجهيز-تطبيق-meta-والصفحة]
اتبع [دليل البدء الرسمي لـ Messenger Platform](https://developers.facebook.com/docs/messenger-platform/get-started) من Meta. أضف Messenger إلى تطبيق Meta، واربط صفحة Facebook التي ستستقبل الرسائل، وتأكد من أن حسابك يملك صلاحية إدارة الأصلين معًا.
اجمع القيم من التطبيق نفسه والصفحة نفسها:
| حقل Make Agent Fast | القيمة لدى المزوّد | الغرض |
| ------------------- | ----------------------------------------------------- | ---------------------------------------- |
| **رمز وصول الصفحة** | الرمز الصادر للصفحة المحددة | قراءة هوية الصفحة وإرسال الردود |
| **سر التطبيق** | سر تطبيق Meta المكوّن من 32 خانة بالنظام السداسي عشري | التحقق من طلبات webhook الواردة الموقّعة |
لا تستخدم رمز وصول مستخدم ولا رمزًا يخص صفحة أخرى. تحدد حالة تطوير التطبيق ومراجعته لدى Meta الأشخاص الذين يمكنهم استخدام التكامل.
## حفظ بيانات الاعتماد والتحقق منها [#حفظ-بيانات-الاعتماد-والتحقق-منها]
افتح صفحة **القنوات** الخاصة بالـ agent، واختر **Messenger**، وأدخل رمز وصول الصفحة وسر التطبيق، ثم اختر **اتصال**.
يستدعي Make Agent Fast واجهة Graph API باستخدام `appsecret_proof`، ويحدد معرّف الصفحة واسمها، ويربط الأحداث الواردة بهذه الصفحة تحديدًا. بعد ذلك تعرض بطاقة الموصّل **عنوان Webhook URL** و**رمز التحقق**.
## إعداد webhook الخاص بالصفحة [#إعداد-webhook-الخاص-بالصفحة]
في تطبيق Meta نفسه:
1. افتح إعدادات webhook الخاصة بـ Messenger.
2. الصق **Webhook URL** و**رمز التحقق** الخاصين بالموصّل.
3. أكمل خطوة التحقق (verification challenge).
4. اختر الاشتراك في أحداث الرسائل المطلوب لسير عمل Messenger لديك.
5. اشترك بصفحة Facebook المقصودة في التطبيق.
6. تأكد من أن اشتراك الصفحة ووضع التطبيق يسمحان لمستخدم الاختبار لديك.
يُستخدم رمز التحقق فقط في خطوة التحقق الأولية. أما أحداث التشغيل فيجب أن تحمل توقيعًا يطابق سر التطبيق. كما يرفض Make Agent Fast الأحداث الموجّهة إلى صفحة مختلفة حتى لو جاءت من تطبيق Meta نفسه.
## اختبار الإمكانات [#اختبار-الإمكانات]
أرسل رسالة عادية إلى الصفحة من حساب اختبار مسموح له وليس مسؤولًا، وتأكد من وصول الرد ومن ظهور المحادثة في **المحادثات**. ثم اختبر مرفق صوت إذا كانت الرسائل الصوتية الواردة مهمة لسير عملك.
تتم معالجة النصوص والصوت الوارد المدعوم. الردود نصية فقط في موصّل Messenger الحالي، حتى لو كانت الرسالة الأصلية صوتية. يتم تجاهل إيصالات التسليم والقراءة، وأصداء رسائل الصفحة نفسها، والصور، وغيرها من المرفقات غير المدعومة.
## الجاهزية للإنتاج [#الجاهزية-للإنتاج]
أكمل الأذونات ومراجعة التطبيق والتحقق من النشاط التجاري ورابط الخصوصية وخطوات نشر الصفحة التي تطلبها Meta لجمهورك. نجاح الاختبار في وضع التطوير بحساب له دور في التطبيق لا يعني أن الجمهور العام قادر على مراسلة تكامل الصفحة.
وثّق تطبيق Meta المالك ومعرّف الصفحة (Page ID) للمشغّلين. قد يتوقف رمز الصفحة عن العمل عند تغيّر مالكه أو أذوناته أو ارتباطه بالنشاط التجاري أو سياسة المزوّد.
## التدوير أو قطع الاتصال [#التدوير-أو-قطع-الاتصال]
أنشئ رمز الصفحة البديل، ثم حدّث الموصّل، واختبر من مستخدم مسموح له، وبعدها أبطل الرمز القديم. حدّث Make Agent Fast فور تدوير سر التطبيق.
لا يؤدي تعطيل الموصّل أو إزالته إلى إلغاء اشتراك الصفحة في Meta. أزل اشتراك الصفحة وبيانات اعتماد المزوّد غير المستخدمة عند إيقاف التكامل نهائيًا.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| ------------------------------- | ------------------------------------------------------------------------------------- |
| رفض الرمز | تأكد من أنه رمز وصول للصفحة المقصودة وأن سر التطبيق يعود للتطبيق نفسه |
| فشل التحقق من webhook | انسخ العنوان الحالي ورمز التحقق كما هما تمامًا، واستخدم HTTPS عامًا |
| ينجح التحقق لكن الرسائل لا تصل | اشترك بالصفحة وبحدث الرسائل، ثم افحص وضع التطبيق ودور المستخدم وسجلات التسليم في Meta |
| الطلبات غير مصرّح بها | صحّح سر التطبيق؛ فطلبات POST الموقّعة لا تستخدم رمز التحقق |
| تظهر الرسالة الواردة دون رد | افحص صلاحية رمز الصفحة وأذونات المراسلة وخطأ الإرسال لدى المزوّد وحالة الموصّل |
| الرسالة الصوتية تحصل على رد نصي | هذا متوقع؛ الرد الصوتي الصادر في Messenger غير مدعوم حاليًا |
يجب ألا تُدخَل بيانات اعتماد المزوّد إلا في نموذج الموصّل بعد تسجيل الدخول أو في استدعاء API موثوق من جهة الخادم.
---
# نظرة عامة على الموصّلات
Source: /ar/docs/connectors/overview.md
{/* docs-visuals */}
تستقبل الموصّلات الأحداث من منصة مراسلة خارجية، وتعالج النص أو الصوت المدعوم وتحوّله إلى صيغة موحّدة، وتشغّل وكيل الموقع نفسه، ثم تعيد ردًا مناسبًا للقناة. يحصل كل مستخدم خارجي على سجل محادثات خاص بالقناة يظهر في **المحادثات**.
يتطلب ربط قناة **جديدة** الاشتراك في باقة Operate أو Scale. تستمر الاتصالات الحالية في العمل على باقة Launch.
## مصفوفة الإمكانات [#مصفوفة-الإمكانات]
| القناة | النص الوارد | الصوت الوارد | النص الصادر | الصوت الصادر | إعداد المزوّد بعد الحفظ |
| --------- | --------------- | ------------ | -------------------- | ------------ | -------------------------------------------------------------- |
| Telegram | نعم | نعم | نعم | اختياري | يُسجَّل الـ webhook تلقائيًا |
| WhatsApp | نعم | نعم | نعم | اختياري | أضف webhook من Meta واشتراك `messages` |
| Messenger | نعم | نعم | نعم | لا | أضف webhook من Meta واشترك في الصفحة |
| Instagram | نعم | نعم | نعم | لا | أضف webhook الخاص بـ Instagram من Meta واشترك في `messages` |
| Discord | سؤال عبر `/ask` | لا | رد عبر `/ask` | لا | الصق نقطة نهاية التفاعلات؛ يتم تسجيل الأمر تلقائيًا |
| KakaoTalk | نعم | لا | رد مضمّن عبر المهارة | لا | أضف عنوان URL الخاص بالمهارة والترويسة والكتلة في Open Builder |
يعني «الصوت الوارد» أنه يتم تنزيل رسالة صوتية أو ملف صوتي مدعوم ثم تحويله إلى نص. أما «الصوت الصادر» فيتطلب مزوّد كلام يعمل بشكل سليم وتفعيل خيار **الرد بالصوت** في الموصّل. تُتجاهل المرفقات غير المدعومة مثل الصور والمواقع الجغرافية ولا تُفسَّر على أنها تعليمات للوكيل.
## قبل الربط [#قبل-الربط]
1. اختبر الوكيل المقصود في لوحة التحكم. يمكن لموصّل في حالة المسودة أن يرد أيضًا.
2. لا تحتاج إلى مفتاح نموذج: توفّر المنصة النماذج. مفاتيح المزوّد اختيارية ومتاحة في باقة Scale فقط؛ راجع [مفاتيح المزوّد](/ar/docs/account/provider-keys).
3. أنشئ تطبيقًا أو بوتًا أو رقمًا أو قناة مخصصة في المزوّد الخارجي. لا تعِد استخدام بيانات اعتماد تخص تكاملًا إنتاجيًا غير مرتبط.
4. تأكد من أن بيئة النشر لديك تحتوي على عنوان أساسي عام للموصّل عبر HTTPS. لا تستطيع webhooks الخاصة بالمزوّدين التسليم إلى `localhost` دون نفق تطوير آمن.
5. افتح صفحة **القنوات** الخاصة بالوكيل واختر القناة.
عند الحفظ، يتصل Make Agent Fast بالمزوّد للتحقق من بيانات الاعتماد المُرسَلة. تعني تسمية «متصل» أن التحقق من بيانات الاعتماد وأي تجهيز تلقائي قد اكتملا؛ ولا تثبت أن خطوة يدوية في وحدة تحكم Meta أو Discord أو Kakao قد أُنجزت.
## التعامل مع بيانات الاعتماد [#التعامل-مع-بيانات-الاعتماد]
تقبل نماذج الموصّلات بيانات اعتماد المزوّد فقط من لوحة التحكم الموثّقة أو من Public API من جهة الخادم. تُشفَّر الأسرار أثناء التخزين ولا تُعاد أبدًا في استجابات قائمة الموصّلات. تعامل مع القيم التالية كما تتعامل مع كلمات المرور:
* رمز بوت Telegram
* رموز الوصول وسر التطبيق في Meta
* رمز بوت Discord
* مفتاح REST API وسر البوت في Kakao
لا تضعها في JavaScript داخل المتصفح، ولا في لقطات الشاشة، ولا في تذاكر الدعم، ولا في نظام التحكم بالإصدارات. عنوان webhook URL ورمز التحقق (verify token) من Meta هما قيم إعداد مخصّصة للنسخ إلى وحدة تحكم المزوّد المطابقة؛ ولا تحل محل بيانات اعتماد المزوّد.
## الربط عبر API [#الربط-عبر-api]
استخدم مفتاح MAF API محفوظًا على الخادم مع النطاق `connectors:write`. الكائن `credentials` الخاص بكل قناة للكتابة فقط. تحذف الاستجابة الأسرار بنصها الصريح وتتضمن عنوان webhook URL المطلوب للإعداد اليدوي لدى المزوّد.
```bash
curl -X POST "https://makeagent.fast/api/v1/sites/$SITE_ID/connectors" \
-H "Authorization: Bearer $MAF_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: connector-telegram-v1" \
-d '{
"channel": "telegram",
"credentials": { "bot_token": "'$TELEGRAM_BOT_TOKEN'" },
"reply_with_voice": false
}'
```
الحقلان `reply_with_voice` و`display_label` الاختياري هما حقلان في المستوى الأعلى، وليسا داخل كائن `config`. يؤدي حفظ البوت أو الحساب نفسه مرة أخرى إلى تحديث بيانات اعتماده وإعداداته مع الحفاظ على رمز التوجيه الخاص به. في Telegram وInstagram، يؤدي استخدام بوت أو حساب مختلف إلى إضافة اتصال جديد بدلًا من ذلك (حتى خمسة اتصالات لكل وكيل)؛ أما في القنوات الأخرى فيستبدل الحفظ الاتصال الحالي. استخدم [مصادقة API](/ar/docs/api/authentication) و[النطاقات والأخطاء](/ar/docs/api/scopes-errors) و[مرجع API](/ar/docs/api/reference) لمعرفة قواعد التكامل في بيئة الإنتاج.
## الاختبار والمراقبة [#الاختبار-والمراقبة]
استخدم مستخدم اختبار لدى المزوّد وسؤالًا واقعيًا يعتمد على معرفة الوكيل. تأكد من كل ما يلي:
* يقبل المزوّد نقطة نهاية webhook أو يتحقق منها.
* تصل الرسالة إلى الوكيل وتتلقى الرد المتوقع.
* يتغير **آخر رسالة** على بطاقة الموصّل.
* تظهر المحادثة في **المحادثات** مع القناة الصحيحة.
* فهم أي قيود مفروضة من المزوّد تتعلق بالمراجعة أو وضع التطوير قبل الإطلاق العام.
* اختبار الصوت بشكل منفصل عن النص عندما تدعمه القناة.
تعرض بطاقة الموصّل آخر خطأ صادر عن المزوّد أو عن التسليم. كما تحتفظ لوحات تحكم المزوّدين بسجلات التسليم؛ قارن الطوابع الزمنية ومعرّفات الأحداث عندما يُبلغ أحد الطرفين فقط عن الطلب.
## التعطيل أو التدوير أو الإزالة [#التعطيل-أو-التدوير-أو-الإزالة]
يؤدي **التعطيل** إلى إيقاف المعالجة مع الاحتفاظ بسجل الموصّل. يبقى webhook الخاص بـ Telegram مسجّلًا أثناء تعطيل الاتصال (لا يستدعي Make Agent Fast الدالة `deleteWebhook`) وتُتجاهل الرسائل الواردة؛ وعند التفعيل يُسجَّل الـ webhook من جديد. تبقى اشتراكات المزوّد التي أُعدّت عبر وحدة التحكم كما هي، ويجب إيقافها من جهة المزوّد أيضًا عند الحاجة. تؤدي **الإزالة** إلى حذف موصّل Make Agent Fast ومحاولة تفكيك الإعداد لدى المزوّد بأفضل جهد، لكنها لا تحذف التطبيق الخارجي، ولا تلغي بيانات اعتماده، ولا تمحو سجل المحادثات الحالي.
لتدوير بيانات الاعتماد، أنشئ رمز المزوّد الجديد، ثم حدّث الموصّل، واختبره، وبعدها ألغِ الرمز القديم. إذا تعرّضت بيانات اعتماد للكشف، فألغِها لدى المزوّد أولًا وتعامل مع الفترة الزمنية المعنية على أنها حادث أمني.
## حالات الفشل الشائعة [#حالات-الفشل-الشائعة]
| العَرَض | ما يجب التحقق منه |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| تعذّر التحقق من بيانات الاعتماد | صحة التطبيق/البوت، ونوع الرمز، وتاريخ الانتهاء، وصلاحية المزوّد المطلوبة، وسلامة الأحرف المنسوخة |
| فشل التحقق من webhook | عنوان HTTPS العام، ورمز التحقق (verify token) المطابق تمامًا، ومنتج المزوّد الصحيح، وسر توقيع الطلبات |
| ينجح التحقق لكن لا تصل أي رسائل | اشتراك الأحداث، وارتباط الصفحة/الرقم/القناة، ووضع تطبيق المزوّد، وحالة تفعيل الموصّل |
| يعمل النص لكن يفشل الصوت | إمكانات القناة، ومفتاح الكلام/النسخ الصوتي، والصوت المدعوم، وصلاحية الوسائط، وانتهاء صلاحية تنزيل المزوّد |
| تتوقف الردود بعد التدوير | حفظ بيانات الاعتماد الجديدة، وإلغاء القديمة بعد الاختبار فقط، وبقاء اشتراك المزوّد اليدوي موجّهًا إلى هذا الـ webhook |
تابع مع دليل القناة لمعرفة حقول المزوّد الدقيقة وتسلسل الخطوات في وحدة التحكم.
---
# Telegram
Source: /ar/docs/connectors/telegram.md
{/* docs-visuals */}
## الإعداد السريع [#الإعداد-السريع]
إذا كان خيار **الإنشاء عبر رمز QR** متاحًا في موصل Telegram، فاخترْه، ثم امسح رمز QR أو اختر **فتح Telegram**، واضغط **إنشاء بوت** في بوت الإعداد. عُد إلى Make Agent Fast، وراجع اسم مستخدم البوت، ثم اختر **ربط هذا البوت**. لا حاجة إلى نسخ أي رمز مميز. تنتهي صلاحية الإعداد بعد 15 دقيقة، ويمكنك إلغاؤه وإعادة بدئه.
إذا لم يكن الإعداد السريع متاحًا، فاستخدم **الربط عبر رمز البوت المميز** أدناه. تستخدم الطريقتان فحوصات الربط نفسها وتأكيد الاستبدال نفسه.
يقترح نموذج الإنشاء الاسم المعروض لوكيلك واسم مستخدم بالصيغة `maf___bot`. يمكن تعديل كليهما؛ فالجزء العشوائي يقلل من تعارض الأسماء، لكن Telegram هو من يجري فحص التوفر النهائي. لا تتم إعادة تسمية البوتات الموجودة.
بعد الإنشاء، يرسل بوت الإعداد زر **ربط هذا البوت** الذي يفتح صفحة مراجعة الربط الموثّقة الخاصة بوكيلك. إنشاء البوت وحده لا يربطه. وبعد نجاح التأكيد، يوصلك **فتح البوت** إلى المحادثة لإجراء الاختبار. يعيد الأمر `/start` أو `/help` عرض الإعداد النشط، أو يُظهر أزرار لوحة التحكم والدليل.
## إنشاء بوت وإعداده يدويًا [#إنشاء-بوت-وإعداده-يدويًا]
اتبع [Introduction to Bots](https://core.telegram.org/bots) الرسمي من Telegram و[BotFather guide](https://core.telegram.org/bots/features#botfather):
1. افتح حساب **@BotFather** الموثّق في Telegram.
2. نفّذ الأمر `/newbot`، واختر اسمًا معروضًا، ثم اختر اسم مستخدم فريدًا ينتهي بـ `bot`.
3. انسخ رمز البوت المميز. أي شخص يملك هذا الرمز يتحكم في البوت.
4. اختياريًا، اضبط الصورة والوصف ونص "حول" ومساعدة الأوامر المحلية في BotFather قبل الإطلاق.
هذا الرمز مخصص لواجهة Telegram Bot API؛ وهو ليس رمز تسجيل دخول إلى Telegram ولا API ID ولا API hash.
## الربط في Make Agent Fast [#الربط-في-make-agent-fast]
افتح صفحة **القنوات** الخاصة بالوكيل، واختر **Telegram**، والصق **رمز البوت المميز**، وحدّد ما إذا كان ينبغي نطق الردود المدعومة صوتيًا أيضًا، ثم اختر **ربط**.
يستدعي Make Agent Fast الدالة `getMe` في Telegram للتحقق من الرمز المميز وعرض اسم مستخدم البوت. ثم يستدعي `setWebhook` مع عنوان URL العام عبر HTTPS الخاص بالموصل، ورمز تحقق سري، وأنواع التحديثات المقبولة `message` و`callback_query` و`my_chat_member`. لا يتم تجاهل التحديثات المعلقة الموجودة.
لا تلزم عادةً أي خطوة يدوية لضبط webhook. أوقف أي خدمة polling قبل الربط. وإذا كان للبوت مستقبِل webhook آخر، فراجع استبداله وأكّده؛ فـ Make Agent Fast لا يستحوذ عليه بصمت. يمكن لوكيل واحد الرد عبر ما يصل إلى خمسة بوتات Telegram في الوقت نفسه؛ ويُعد كل بوت ربطًا مستقلًا. وحفظ بوت مختلف يضيف ربطًا جديدًا بدلًا من استبدال الربط الحالي. أما البوت المرتبط بوكيل آخر فيجب فصله هناك أولًا.
## اختبار المحادثة [#اختبار-المحادثة]
1. افتح رابط `t.me` الخاص بالبوت من حساب Telegram لا يعود للمالك.
2. اختر **Start**؛ فالبوتات لا تستطيع بدء محادثة مع مستخدم.
3. أرسل سؤالًا نصيًا يعتمد على المعرفة.
4. أرسل رسالة صوتية إذا كان الصوت مفعّلًا.
5. تأكد من وصول الردود، ومن تغيّر **آخر رسالة**، ومن ظهور المحادثة في **المحادثات**.
الرسائل الخاصة عامة افتراضيًا: لا يحتاج الزوار إلى موافقة المالك. أما الردود في المجموعات فهي متوقفة إلى أن يفعّل المالك **الرد في المجموعات عند الإشارة إلى البوت أو الرد على رسالته**. ويظل وضع الخصوصية (Privacy Mode) في Telegram وأذونات المجموعة ساريين. اختبر الرسائل المباشرة أولًا.
## سلوك الصوت [#سلوك-الصوت]
يدعم Telegram في هذا الموصل الصوت الوارد والصوت الصادر. يتم تنزيل الرسائل الصوتية الواردة وتحويلها إلى نص قبل أن يعالجها الوكيل. وعند تفعيل **الرد بالصوت** وتوفر مزوّد للكلام، يرسل Make Agent Fast ردًا صوتيًا إضافة إلى النص. وإذا فشل تحويل الصوت إلى نص أو توليد الكلام، فاطلب من المستخدم إعادة المحاولة بالنص وافحص خطأ الموصل.
## تغيير الرمز المميز أو التعطيل أو الإزالة [#تغيير-الرمز-المميز-أو-التعطيل-أو-الإزالة]
إذا تعرّض الرمز المميز للكشف، فأنشئ رمزًا جديدًا أو ألغِ القديم في BotFather فورًا، ثم حدّث الموصل بالرمز البديل واختبر مجددًا. تحديث بيانات الاعتماد للبوت نفسه يحافظ على إعداداته وعلى حالة الإيقاف المؤقت. أما استبداله ببوت مختلف فيتطلب تأكيدًا ويُبقي سجل البوت السابق منفصلًا.
يؤدي التعطيل إلى إيقاف الردود محليًا، بينما تؤدي الإزالة إلى أرشفة الربط مع الاحتفاظ بسجله. لا يحذف أي منهما بوت Telegram ولا يستدعي `deleteWebhook`، إذ قد يعطّل ذلك مستقبِلًا أحدث. تتجاهل الروابط المؤرشفة الرسائل الواردة. يمكن للبوتات المنشأة بالإعداد السريع تحديث بيانات اعتمادها بعد أحداث دورة حياة المدير، لكن البوت الموقوف مؤقتًا يبقى موقوفًا، وتغيير الملكية يعطّل الربط إلى حين مراجعته.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| رفض الرمز المميز عند الحفظ | انسخ الرمز الحالي من BotFather؛ أزل المسافات وتأكد من أنه يخص هذا البوت |
| تصل الرسائل إلى خدمة أقدم | أوقف polling هناك، وأعد الربط هنا، وأكّد صراحةً أي استبدال للمستقبِل |
| تعمل الرسائل المباشرة لكن رسائل المجموعات لا تعمل | فعّل الردود في المجموعات، وأشر إلى البوت أو ردّ عليه، وراجع وضع الخصوصية في Telegram وأذونات المجموعة |
| لا يراسل البوت المستخدم الجديد أولًا | هذا سلوك متوقع في Telegram؛ اطلب من المستخدم فتح البوت واختيار **Start** |
| يعمل النص لكن الصوت يفشل | تحقق من مفاتيح النموذج وتحويل الصوت إلى نص وتوليد الكلام، ثم أعد المحاولة برسالة صوتية مدعومة من Telegram |
لا تلصق أبدًا رمزًا مميزًا فعّالًا في الوثائق أو الشيفرة المصدرية أو أدوات التحليلات أو لقطات شاشة الدعم.
---
# WhatsApp
Source: /ar/docs/connectors/whatsapp.md
{/* docs-visuals */}
## تجهيز تطبيق Meta والرقم [#تجهيز-تطبيق-meta-والرقم]
اتبع [دليل البدء الرسمي لـ WhatsApp Cloud API](https://developers.facebook.com/docs/whatsapp/cloud-api/get-started) من Meta لإنشاء تطبيق Meta أو اختيار تطبيق موجود، وإضافة منتج WhatsApp، وربط حساب WhatsApp Business (WABA) ورقم الهاتف به.
اجمع هذه القيم الثلاث من التطبيق والرقم نفسيهما:
| حقل Make Agent Fast | القيمة لدى المزوّد | ملاحظات |
| ------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Phone number ID** | معرّف رقم الهاتف (Phone Number ID) الرقمي | ليس رقم الهاتف الظاهر الذي يبدأ بـ `+` ولا معرّف WABA |
| **Access token** | رمز وصول Cloud API | تنتهي صلاحية الرموز المؤقتة في لوحة التحكم؛ استخدم رمز مستخدم نظام (system-user) طويل الأمد مناسبًا للإنتاج |
| **App secret** | السر الخاص بتطبيق Meta | سر سداسي عشري من 32 حرفًا يُستخدم للتحقق من توقيع webhook |
امنح الأذونات اللازمة فقط للرقم وسير عمل المراسلة. وأبقِ أصول التطوير والاختبار منفصلة عن رقم الإنتاج.
## حفظ بيانات الاعتماد والتحقق منها [#حفظ-بيانات-الاعتماد-والتحقق-منها]
افتح صفحة **القنوات** الخاصة بالوكيل، واختر **WhatsApp**، وأدخل القيم الثلاث، ثم فعّل **الرد بالصوت** إذا لزم الأمر، واختر **اتصال**.
يتحقق Make Agent Fast من الرقم عبر Graph API باستخدام رمز الوصول مع `appsecret_proof`؛ وبذلك يُكتشف أي خطأ في الرقم أو الرمز أو سر التطبيق قبل بدء وصول حركة webhook. بعد ذلك تعرض بطاقة الموصل **Webhook URL** و**Verify token** فريدين.
## إعداد webhook في Meta [#إعداد-webhook-في-meta]
في تطبيق Meta نفسه:
1. افتح إعدادات webhook الخاصة بـ WhatsApp.
2. الصق **Webhook URL** الخاص بالموصل بوصفه عنوان callback.
3. الصق **Verify token** الخاص بالموصل كما هو تمامًا؛ فهو حساس لحالة الأحرف.
4. أكمل عملية التحقق.
5. اشترك بحساب WhatsApp Business أو الرقم في حقل webhook المسمى `messages`.
6. تأكد من أن التطبيق وأصول النشاط التجاري متاحة للمستخدمين المقصودين للاختبار أو الإنتاج.
يثبت verify token ملكيتك أثناء طلب التحقق GET. أما طلبات POST أثناء التشغيل فتُصادَق بشكل منفصل عبر توقيع سر تطبيق Meta؛ فلا تستبدل أحدهما بالآخر.
## اختبار النص والصوت [#اختبار-النص-والصوت]
أرسل رسالة أولًا من رقم اختبار مسموح به. في وضع التطوير لدى Meta قد لا يتمكن المستخدمون غير المسجلين من الوصول إلى التطبيق. تأكد من ظهور المحادثة والقناة في **المحادثات**، وراقب **آخر رسالة** في بطاقة الموصل.
الرسائل النصية والصوتية الواردة مدعومة. عند تفعيل **الرد بالصوت** وإعداد خدمة الكلام، يرفع Make Agent Fast الصوت المُنشأ عبر Cloud API ويرسله مع الرد النصي. أما الصور والمواقع وجهات الاتصال وأنواع الرسائل الأخرى غير المدعومة فتُتجاهل.
## الجاهزية للإنتاج [#الجاهزية-للإنتاج]
قبل الإعلان عن الرقم، أكمل الخطوات التي تفرضها Meta لحالتك: توثيق النشاط التجاري، ومراجعة التطبيق، واسم العرض، والقوالب، وسياسة المراسلة. هذه المتطلبات تحددها Meta وقد تتغير بمعزل عن Make Agent Fast.
استخدم بيانات اعتماد إنتاجية لها مالك محدد وإجراء واضح لانتهاء الصلاحية والتدوير. سجّل تطبيق Meta ومستخدم النظام وWABA وPhone Number ID الخاصة بهذا الموصل، حتى يتمكن المشغّل من تدويرها دون تخمين.
## التدوير أو قطع الاتصال [#التدوير-أو-قطع-الاتصال]
أنشئ رمزًا بديلًا بصلاحيات الوصول إلى الأصول نفسها، ثم حدّث الموصل، وأرسل رسالة اختبار، وبعد ذلك فقط ألغِ الرمز القديم. وإذا تغيّر سر التطبيق، فحدّثه في Make Agent Fast فورًا، وإلا فستفشل كل طلبات webhook الواردة الموقّعة.
لا يؤدي تعطيل الموصل أو إزالته إلى إلغاء اشتراك webhook في Meta أو حذف إعداده. أزل الاشتراك لدى المزوّد أيضًا عند إيقاف الرقم نهائيًا.
## استكشاف الأخطاء وإصلاحها [#استكشاف-الأخطاء-وإصلاحها]
| العَرَض | الحل |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| رفض بيانات الاعتماد | تأكد من أن الرمز يستطيع قراءة Phone Number ID المحدد بدقة، وأن سر التطبيق من التطبيق نفسه |
| تعذّر تحقق Meta من callback | استخدم عنوان HTTPS المنسوخ وverify token الصحيح تمامًا، وتأكد من أن الموصل لا يزال موجودًا |
| نجح التحقق لكن لا تصل أي رسائل | اشترك في `messages`، وتحقق من ربط WABA والرقم، ووضع التطبيق، وصلاحية وصول مستخدمي الاختبار، وسجلات التسليم لدى المزوّد |
| ترجع webhooks الخطأ unauthorized | أعد إدخال سر التطبيق الصحيح؛ فتوقيعات POST في Meta لا تستخدم verify token |
| فشل الردود الصادرة | تحقق من انتهاء صلاحية الرمز، وأذونات الرقم، وسياسة المستلم أو نافذة المراسلة، وأخطاء Graph API |
| يعمل النص لكن يفشل الصوت | تحقق من مفاتيح مزوّد تحويل الكلام إلى نص/نص إلى كلام، ومن صلاحية الرمز لرفع الوسائط وتنزيلها |
لا تكشف رمز الوصول أو سر التطبيق في شيفرة المتصفح أبدًا. استخدم Public API من خادم موثوق فقط عند أتمتة إنشاء الموصلات.
---
# Astro
Source: /ar/docs/embed/astro.md
{/* docs-visuals */}
## تجهيز نطاق النشر [#تجهيز-نطاق-النشر]
فعّل **إظهاره على موقعي** لوكيل Make Agent Fast (صفحة الوكيل ← **انشره مباشرةً** ← **أداة الموقع**)، ثم أضف نطاقات Astro الدقيقة الخاصة بالتطوير والمعاينة والإنتاج ضمن **عناوين المواقع المسموح بها**. المهم هو المخطط (scheme) واسم المضيف والمنفذ كما تظهر في المتصفح في النهاية، وليس مضيف البناء ولا عنوان URL للمستودع.
## الإضافة إلى تخطيط مشترك [#الإضافة-إلى-تخطيط-مشترك]
ضع أداة التحميل الخارجية القياسية قبل `