إنشاء "مهام" لخدمة "مساعد Google" باستخدام حزمة تطوير البرامج (SDK) الخاصة بـ "المهام" (المستوى 2)

1. نظرة عامة

تتيح لك منصة المطوّرين في "مساعد Google" إنشاء برامج لتوسيع وظائف "مساعد Google"، وهو مساعد شخصي افتراضي، على أكثر من مليار جهاز، بما في ذلك مكبرات الصوت الذكية والهواتف والسيارات وأجهزة التلفزيون وسماعات الرأس وغيرها. يتفاعل المستخدمون مع "مساعد Google" في محادثة لإنجاز المهام، مثل شراء البقالة أو حجز رحلة. بصفتك مطوّرًا، يمكنك استخدام "منصة المطوّرين في مساعد Google" لإنشاء تجارب محادثة فعّالة وممتعة بين المستخدمين وخدمة التنفيذ التابعة لجهة خارجية وإدارتها بسهولة.

يغطّي هذا الدرس التطبيقي حول الترميز المفاهيم المتوسّطة المستوى لتطوير التطبيقات باستخدام "مساعد Google"، ويستند إلى "الإجراء" الذي تم إنشاؤه في الدرس التطبيقي حول الترميز إنشاء "إجراءات" في "مساعد Google" باستخدام حزمة تطوير البرامج (SDK) الخاصة بـ "الإجراءات" (المستوى 1). ننصحك بشدة بإكمال المستوى 1 من الدرس العملي قبل البدء في هذا الدرس.

يخبر الإجراء الذي ستنشئه في هذا الدرس التعليمي المستخدمين عن حظهم في رحلتهم في أرض أسطورية، وهي Gryffinberg، استنادًا إلى المساعدة التي يختارونها.

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستنشئ "إجراءً حواريًا" متطوّرًا يتضمّن الوظائف التالية:

  • تجمع هذه الوظيفة البيانات من المستخدم، وتعدّل الطلبات الحوارية استنادًا إلى القيمة.
  • الردّ بأسئلة متابعة لمواصلة المحادثة
  • تنشئ هذه السمة حلقة لعب حتى يتمكّن المستخدم من التفاعل مع الإجراء مرة أخرى بعد تلقّي رسالة حظ.

قبل البدء في إنشاء مهمة، يمكنك التفاعل معها مباشرةً على جهازك المزوّد بخدمة "مساعد Google" من خلال قول "Ok Google، أريد التحدث مع Fate and Fortune". يبدو المسار التلقائي خلال هذا الإجراء للمستخدم المكرر الزيارة على النحو التالي:

dd6f5c61296b8b50.png

eba043f546aa8c51.png

أهداف الدورة التعليمية

  • كيفية استخدام الفتحات لجمع البيانات من المستخدم
  • كيفية استخدام الشروط لإضافة منطق إلى مشهد
  • كيفية إضافة حلقة ألعاب
  • كيفية إضافة مسار داعم

المتطلبات

تشمل المتطلبات الأساسية لهذا الدرس التطبيقي حول الترميز ما يلي:

  • بيئة تطوير متكاملة (IDE) أو محرِّر نصوص من اختيارك
  • وحدة طرفية لتنفيذ أوامر shell مع تثبيت NodeJS وnpm وgit
  • متصفّح ويب، مثل Google Chrome
  • يجب أن يكون لديك مشروع Actions بالمستوى 1 من Codelab.

ننصحك بشدة، ولكن ليس بشكل إلزامي، بأن تكون على دراية بلغة JavaScript (الإصدار ES6) لفهم رمز التنفيذ لهذا الدرس التطبيقي حول الترميز.

اختياري: الحصول على رمز نموذجي

يمكنك اختياريًا الحصول على رمز المشروع الكامل من المستوى 1 من درس Actions Builder التطبيقي حول الترميز مستودع GitHub حتى تتمكّن من متابعة هذا الدرس التطبيقي حول الترميز. يمكنك أيضًا الاطّلاع على رمز المشروع الكامل من المستوى 2 في مستودع Github هذا.

2. مواصلة إنشاء واجهة محادثة

في الدرس التطبيقي الأول حول الترميز، أنشأت "إجراءًا حواريًا" بسيطًا يتضمّن مشهدًا واحدًا، Start.

في هذا الدرس العملي، ستوسّع نطاق محادثة الإجراء. في الأقسام التالية، يمكنك ضبط الإجراء لتنفيذ ما يلي:

  • الانتقال إلى مشهد Fortune جديد عندما يريد المستخدم معرفة طالعه
  • اسأل المستخدم عن المساعدة التي يريد اختيارها لرحلته
  • عرض رسالة حظ مخصّصة استنادًا إلى اختيار المستخدم

الانتقال إلى مشهد Fortune وإنشاؤه

في هذا القسم، يمكنك إجراء ما يلي:

  • أزِل الطلب الحالي من مشهد Start الذي يستجيب للمستخدم وينهي المحادثة.
  • حدِّد الانتقال من المشهد Start إلى المشهد Fortune
  • إنشاء Fortune المشهد

لتعديل المشهد Start وإضافة انتقال إلى المشهد Fortune، اتّبِع الخطوات التالية:

  1. افتح مشروع Actions من الدرس العملي المستوى 1 في محرِّر النصوص.
  2. افتح ملف custom/scenes/Start.yaml.
  3. عدِّل handler للغرض yes ليتطابق الرمز مع المقتطف أدناه:

Start.yaml

intentEvents:
- intent: "yes"
  transitionToScene: Fortune
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: I understand, stranger. Best of luck on your quest! Farewell.
  intent: "no"
  transitionToScene: actions.scene.END_CONVERSATION
  1. احفظ الملف.

لإنشاء مشهد جديد باسم Fortune، اتّبِع الخطوات التالية:

  1. انتقِل إلى مشروع "الإجراءات" من المستوى 1 في codelab في نافذة الوحدة الطرفية.
  2. أنشئ ملفًا جديدًا باسم Fortune.yaml في الدليل scenes:
touch custom/scenes/Fortune.yaml

ستعدّل هذا الملف في القسم التالي.

تحديد منطق المحادثة لمشهد Fortune

في هذا الدرس التطبيقي حول الترميز، عليك ضبط مشهد Fortune لطرح السؤال التالي على المستخدم: "ماذا تختار لمساعدتك في مهمتك، تنينًا أم مترجمًا أم بوصلة؟" يمكنك استخدام ميزة ملء الخانات لجمع المعلومات اللازمة من المستخدم قبل المتابعة.

تقدّم "الإجراء" الخاص بك تنبؤات لثلاثة مساعدين: تنين ومترجم وبوصلة. لضبط "الإجراء" من أجل التعرّف على هذه الخيارات الثلاثة في إدخال المستخدم، عليك إنشاء نوع جديد.

يمكنك استخدام الأنواع ضمن مرحلة ملء الخانات في المشهد لتحديد المعلومات التي تريد الحصول عليها من المستخدم. عندما يرصد محرّك الفهم اللغوي الطبيعي تطابقًا لخانة في بيانات أدخلها المستخدم، يستخرج الخانة كمعلَمة مكتوبة، ما يتيح لك تنفيذ منطق باستخدامها في مشهد.

إنشاء نوع available_options

في هذا القسم، يمكنك إنشاء نوع جديد باسم available_options، والذي يحدّد الخيارات الثلاثة التي يمكن للمستخدمين اختيارها (التنين والمترجم والبوصلة) استجابةً للطلب. يمكنك أيضًا تحديد بعض المرادفات لهذه الخيارات في حال قال المستخدم شيئًا مشابهًا. في قسم لاحق، ستضيف النوع available_options إلى خانة لتحديد أنّك تريد الحصول على اختيار المستخدم.

لإنشاء النوع available_options، اتّبِع الخطوات التالية:

  1. أنشئ دليلاً جديدًا باسم types:
mkdir custom/types
  1. أنشئ ملفًا جديدًا باسم available_options.yaml في الدليل types:
touch custom/types/available_options.yaml
  1. افتح custom/types/available_options.yaml في محرِّر النصوص.

يتم ضبط الأنواع كأزواج من المفاتيح والقيم، حيث يكون المفتاح هو اسم النوع والقيم هي مرادفات لهذا المفتاح. عند تحديد المفتاح، تتم إضافته تلقائيًا كقيمة. باستخدام Actions SDK، يمكنك تمثيل المفاتيح على النحو entities، والقيم على النحو synonyms.

لإضافة الخيارات الثلاثة التي يمكن للمستخدم الاختيار من بينها، اتّبِع الخطوات التالية:

  1. أضِف entities وsynonyms التاليَين في الملف available_options.yaml:

available_options.yaml

synonym:
  entities:
    dragon:
      synonyms:
      - dragon
      - hydra
      - lizard
    translator:
      synonyms:
      - translator
      - communicator
      - machine
      - decoder
      - translate
    compass:
      synonyms:
      - compass
      - direction
      - guide
      - navigator
  matchType: EXACT_MATCH
  1. احفظ الملف.

يفهم تطبيقك الآن أنّ available_options هي تنين ومترجم وبوصلة، ويمكنه أيضًا التعرّف على بعض المرادفات ذات الصلة.

ضبط ملء الخانات

بعد ذلك، عليك ضبط ميزة "ملء الخانات" في مشهد Fortune. لضبط منطق ملء الخانات، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. أضِف بيانات slots التالية إلى ملف Fortune.yaml:

Fortune.yaml

slots:
- commitBehavior:
    writeSessionParam: chosenOptions
  name: chosenOptions
  promptSettings:
    initialPrompt:
      staticPrompt:
        candidates:
        - promptResponse:
            firstSimple:
              variants:
              - speech: What do you choose to help you on your quest, a dragon, a translator, or a compass?
            suggestions:
            - title: Dragon
            - title: Translator
            - title: Compass
  required: true
  type:
    name: available_options
  1. احفظ الملف.

لقد أضفت الآن النوع available_options إلى الخانة، ما يوضّح لإجراءك المعلومات التي تحتاج إلى جمعها من المستخدم (اختياره للمساعدة) قبل المتابعة. لقد أعددت أيضًا طلبًا ضمن الفتحة، والذي تتم إضافته إلى قائمة انتظار الطلبات عندما يصل المستخدم إلى مرحلة ملء الفتحة في المشهد.

عند تسمية الفتحة chosenOptions، يتم تعديل الحقل writeSessionsParam بالاسم نفسه ($session.params.chosenOptions). ويمكنك الوصول إلى هذه المَعلمة بهذا الاسم في الطلب وفي عملية التنفيذ من خلال مكتبة العميل.

إضافة شرط

بعد إضافة خانة تتطلّب من المستخدم اختيار المساعدة، يمكنك إضافة شرط للتأكّد من الحصول على بيانات الخانة قبل أن يتمكّن المستخدم من مواصلة المحادثة.

في هذا القسم، يمكنك إضافة الشرط scene.slots.status == "FINAL" الذي يتحقّق من اكتمال ملء الخانة. بعد ملء جميع الخانات، يضيف الشرط طلبًا (You picked $session.params.chosenOptions.) إلى قائمة انتظار الطلبات.

لضبط شرط scene.slots.status == "FINAL"، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. أضِف بيانات conditionalEvents إلى أعلى ملف Fortune.yaml:

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: You picked $session.params.chosenOptions.
  1. احفظ الملف.

اختبار الإجراء في المحاكي

في هذه المرحلة، تكون قد حدّدت الخيارات التي يجب أن يختارها المستخدم لملء الفتحة. بعد الحصول على هذه المعلومات من المستخدم، يجب أن يقدّم الإجراء طلبًا يشير إلى الخيار المحدّد الذي اختاره.

لاختبار الإجراء، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. انقر على Talk to my test app أو اكتبه في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.

a899d45c542668f6.png

  1. انقر على dragon أو اكتبها أو قلها. يجب أن تظهر لك الرسالة "لقد اخترت التنين".

في القسم التالي، يمكنك تخصيص الطلبات لكل أداة مساعدة يمكن للمستخدم اختيارها.

تخصيص الطلبات باستخدام الشروط

في هذا القسم، يمكنك إضافة شروط لكل خيار يمكن للمستخدم اختياره وإضافة طلب مخصّص لكل شرط.

تخصيص رسالة الحظ dragon

لتعديل الشرط وتخصيص الطلب عندما يختار المستخدم "تنين"، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. استبدِل بيانات conditionalEvents بالمقتطف التالي في ملف Fortune.yaml:

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The people of Gryffinberg will be awestruck by the beauty and
                power of the ancient dragon. Much to your dismay, the townspeople
                fall into dispute over who will receive the honor of riding the dragon
                first. You return home from your quest without everlasting glory or
                a dragon.
  1. احفظ الملف.

الآن، عندما يقول المستخدم "تنين" أو كلمة مشابهة، يقدّم لك الإجراء توقعات استنادًا إلى هذا الاختيار. بعد ذلك، ستضيف الاختيارَين المتبقّيَين.

تخصيص رسائل translator وcompass

لإضافة الشروط وتخصيص الطلبات التي تظهر عندما يقول المستخدم "المترجم" أو "البوصلة"، اتّبِع الخطوات التالية:

  1. في ملف custom/scenes/Fortune.yaml، أضِف الشرطَين الآخرَين ضمن الشرط dragon:

Fortune.yaml

- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: With the help of the translator, the rival factions in Gryffinberg
                are finally able to communicate with each other and resolve their
                disputes. You will complete your quest to restore peace in the town.
                The translator will be used on many other journeys across the
                earth. After its work is done, it retires honorably to a premier location
                in the Gryffinberg History Museum.
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The compass will help you find the mystical and ancient Library
                of Gryffinberg. Among its infinite stacks of dusty books, you find
                one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
                tome, the townspeople have forgotten their problems. You will write
                a second edition of "Wisdom of the Ages", but have limited commercial
                success.
  1. احفظ الملف.

اختبار الإجراء في المحاكي

في هذه المرحلة، يجب أن يقدّم الإجراء الخاص بك تنبؤًا مخصّصًا للمستخدم استنادًا إلى الخيار الذي يحدّده.

لاختبار الإجراء، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. اكتب Talk to my test app في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.
  4. انقر على Translator أو اكتبها أو قلها.

29e17f950bd0dd71.png

يجب أن تتلقّى التوقّعات المناسبة للخيار "المترجم".

3- إضافة حلقة لعبة

في هذا القسم، يمكنك ضبط الإجراء الخاص بك ليتمكّن المستخدم من اختيار خيار آخر والاستماع إلى توقعات مختلفة بعد إجراء عملية اختيار. يشبه هذا التغيير الرسالة "هل تريد اللعب مجددًا؟" التي تظهر في نهاية اللعبة. لإنشاء هذه الحلقة، يمكنك إعادة استخدام نيتي yes وno اللتين تم إنشاؤهما سابقًا وإضافتهما إلى مشهد جديد باسم Again.

إنشاء مشهد Again

في هذا القسم، يمكنك إنشاء Again مشهد جديد وإضافة طلب يسأل المستخدم عمّا إذا كان يريد اختيار خيار مختلف.

لإنشاء مشهد Again وإعداده، اتّبِع الخطوات التالية:

  1. أنشئ ملفًا جديدًا باسم Again.yaml في الدليل scenes:
touch custom/scenes/Again.yaml
  1. افتح custom/scenes/Again.yaml في محرِّر النصوص.
  2. أضِف بيانات onEnter التالية إلى Again.yaml:

Again.yaml

onEnter:
  staticPrompt:
    candidates:
    - promptResponse:
        firstSimple:
          variants:
          - speech: That is what I see for you. Would you like to choose a different option and explore another future?
        suggestions:
        - title: "Yes"
        - title: "No"
  1. احفظ الملف.

إضافة انتقال من المشهد Fortune إلى المشهد Again

بعد أن يتلقّى المستخدم رسالة الحظ، يجب أن تنتقل المحادثة إلى مشهد Again الجديد.

لإضافة انتقال من المشهد Fortune إلى المشهد Again، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. أضِف transitionToScene: Again إلى كل شرط، كما هو موضّح في المقتطف التالي:

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The people of Gryffinberg will be awestruck by the beauty and
                power of the ancient dragon. Much to your dismay, the townspeople
                fall into dispute over who will receive the honor of riding the dragon
                first. You return home from your quest without everlasting glory or
                a dragon.
  transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: With the help of the translator, the rival factions in Gryffinberg
                are finally able to communicate with each other and resolve their
                disputes. You will complete your quest to restore peace in the town.
                The translator will be used on many other journeys across the
                earth. After its work is done, it retires honorably to a premier location
                in the Gryffinberg History Museum.
  transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The compass will help you find the mystical and ancient Library
                of Gryffinberg. Among its infinite stacks of dusty books, you find
                one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
                tome, the townspeople have forgotten their problems. You will write
                a second edition of "Wisdom of the Ages", but have limited commercial
                success.
  transitionToScene: Again
  1. احفظ الملف.

اختبار الإجراء في المحاكي

في هذه المرحلة، يجب أن يقدّم تطبيقك على "مساعد Google" الطلب التالي للمستخدم بعد تلقّيه التوقّع: "هذا ما أراه لك. هل تريد اختيار خيار مختلف واستكشاف مستقبل آخر؟"

لاختبار الإجراء، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. اكتب Talk to my test app في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.
  4. انقر على dragon أو اكتبها أو قلها.

b299e9fed9aedb69.png

من المفترض أن تتلقّى التوقّعات الخاصة بخيار التنين والطلب Again.

إضافة نوايا والانتقال إلى المشهد Again

في هذا القسم، يمكنك إضافة الغرضين yes وno إلى المشهد Again لكي يفهم الإجراء ما إذا كان المستخدم يريد اختيار خيار جديد أم لا. يمكنك أيضًا إضافة عمليات الانتقال المناسبة للغرضَين yes وno. ينتقل الغرض yes إلى المشهد Fortune، بينما ينتقل الغرض no إلى مشهد النظام End conversation.

لإضافة نوايا وعمليات انتقال إلى مشهد Again، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Again.yaml في محرِّر النصوص.
  2. أضِف بيانات intentEvents في أعلى ملف Again.yaml، فوق OnEnter:

Again.yaml

intentEvents:
- intent: "yes"
  transitionToScene: Fortune
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: It pleases me that you are satisfied with your choice. Best
                of luck on your quest. Farewell.
  intent: "no"
  transitionToScene: actions.scene.END_CONVERSATION
  1. احفظ الملف.

اختبار الإجراء في المحاكي

يجب أن يفهم تطبيقك الآن ما إذا كان المستخدم يريد اختيار خيار جديد أو إنهاء المحادثة.

لاختبار الغرض yes، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. اكتب Talk to my test app في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.
  4. انقر على أحد الخيارات أو اكتبه أو قُله.
  5. اكتب Yes في حقل الإدخال واضغط على Enter.

5d0690332efe2e29.png

يجب أن يظهر لك الطلب "ماذا تختار لمساعدتك في رحلتك، تنينًا أم مترجمًا أم بوصلة؟"

لاختبار الغرض no، اتّبِع الخطوات التالية:

  1. انقر على أحد الخيارات أو اكتبه أو قُله.
  2. اكتب No في حقل الإدخال واضغط على Enter.

من المفترض أن تتلقّى الطلب End conversation: "يسرّني أنّك راضٍ عن اختيارك. نتمنى لك التوفيق في رحلتك. إلى اللقاء".

4. إضافة مسار داعم

لقد أنشأت الآن المسار الرئيسي الذي يتّبعه معظم المستخدمين في "الإجراء". ومع ذلك، يمكن للمستخدم الردّ على الطلب من المشهد Fortune "ماذا تختار لمساعدتك في مهمتك، تنينًا أم مترجمًا أم بوصلة؟" بخيار ليس من بين الخيارات المقدَّمة.

في هذا القسم، يمكنك ضبط "الإجراء" لفهم ما إذا كان المستخدم يقول "سحر" أو "مال" أو "حصان" أو "هاتف"، وإعادة مطالبة المستخدم بالاختيار من بين الخيارات الثلاثة الأصلية عندما يختار أحد هذه الخيارات. لضبط هذه المنطق، عليك إنشاء type جديد يحتوي على هذه الخيارات الأخرى وطلب جديد، other_option، يتم مطابقته عندما يقول المستخدم أحد هذه الخيارات. عليك أيضًا إضافة تعليقات توضيحية إلى عبارات التدريب ضمن الغرض other_option لتحديد مَعلمات الغرض واستخراجها.

عندما يرصد محرّك معالجة اللغة الطبيعية في "مساعد Google" تطابقًا في المَعلمات في بيانات أدخلها المستخدم، يستخرج القيمة كمَعلمة مكتوبة حتى تتمكّن من تنفيذ منطق باستخدامها في مشهد. في هذا الدرس التطبيقي حول الترميز، ستضبط "الإجراء" لاستخراج المساعدة التي يختارها المستخدم والإشارة إلى هذا الخيار في طلب.

إنشاء نوع unavailable_options

يمكنك الآن إنشاء نوع unavailable_options يحتوي على مجموعة متنوعة من الخيارات المختلفة حتى يتمكّن الإجراء من التعرّف على هذه البيانات في إدخال المستخدم.

لإنشاء النوع unavailable_options، اتّبِع الخطوات التالية:

  1. أنشئ ملفًا جديدًا باسم unavailable_options.yaml في الدليل types:
touch custom/types/unavailable_options.yaml
  1. افتح custom/types/unavailable_options.yaml في محرِّر النصوص.
  2. أضِف بيانات synonyms التالية إلى ملف unavailable_options.yaml:

unavailable_options.yaml

synonym:
  entities:
    money:
      synonyms:
      - money
      - cash
      - gold
    horse:
      synonyms:
      - horse
      - stallion
      - steed
    magic:
      synonyms:
      - magic
      - enchanted
      - spells
    phone:
      synonyms:
      - phone
      - cell
      - apps
  matchType: EXACT_MATCH
  1. احفظ الملف.

إنشاء نية other_option

بعد ذلك، يمكنك إنشاء غرض باسم other_option وإضافة عبارات تدريبية تتضمّن الخيارات من النوع unavailable_options. تتم مطابقة هذه النية عندما يختار المستخدم خيارًا مضمّنًا في النوع unavailable_options.

لإنشاء نية other_option وضبطها، اتّبِع الخطوات التالية:

  1. أنشئ ملفًا جديدًا باسم other_option.yaml في الدليل intents:
touch custom/intents/other_option.yaml
  1. افتح custom/intents/other_option.yaml في محرِّر النصوص.
  2. أضِف بيانات parameters وبيانات trainingPhrases التالية إلى ملف other_option.yaml:

other_option.yaml

parameters:
- name: chosenUnavailableOption
  type:
    name: unavailable_options
trainingPhrases:
- I want to use ($chosenUnavailableOption 'spells' auto=true)
- I really really want to use a ($chosenUnavailableOption 'phone' auto=true)
- ($chosenUnavailableOption 'magic' auto=true)!
- ($chosenUnavailableOption 'cash' auto=true)
- I want to ride a ($chosenUnavailableOption 'horse' auto=true)

في هذه الخطوة، يمكنك إضافة تعليقات توضيحية يدويًا إلى عبارات التدريب باستخدام الخيارات غير المتاحة التي حدّدتها في القسم السابق. تتيح لك مَعلمة الغرض، chosenUnavailableOption، استخراج اسم الخيار واستخدامه في طلب، وهو ما ستفعله في القسم التالي.

  1. احفظ الملف.

إضافة النية other_option إلى المشهد Fortune

لديك الآن غرض، other_option، يمكنه التعامل مع مستخدم يحدّد خيارًا ليس من الخيارات الأصلية. في هذا القسم، يمكنك إضافة الغرض other_option إلى المشهد Fortune. يمكنك استخدام مَعلمة النية لتخصيص الطلب استنادًا إلى إدخال المستخدم.

لإضافة نية other_option إلى مشهد Fortune، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. أضِف بيانات intentEvents التالية بين بيانات conditionalEvents وبيانات slots:

Fortune.yaml

intentEvents:
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech:  I have seen the future and a $intent.params.chosenUnavailableOption.original will not aid you on your journey.
  intent: other_option
  1. احفظ الملف.

يشير التعبير $intent.params.chosenUnavailableOption إلى عنصر مَعلمة الغرض، ويشير $intent.params.chosenUnavailableOption.original إلى قيمة هذا العنصر. تشير السمة original إلى الإدخال الأولي الذي يحدّده المستخدم.

عندما يذكر المستخدم خيارًا مُدرَجًا في النوع unavailable_options أثناء المشهد Fortune، يتمّ الربط مع الغرض other_option وتتمّ إضافة طلب إلى قائمة انتظار الطلبات. بما أنّه لم يتم تحديد أي انتقال، تستمر حلقة تنفيذ المشهد من خلال إعادة تقييم مرحلة الشروط. بعد ذلك، يضيف خانة chosenOptions طلبها إلى قائمة انتظار الطلبات، ويتم تسليم قائمة انتظار الطلبات إلى المستخدم.

اختبار الإجراء في المحاكي

يجب أن يستجيب الإجراء الآن بشكل مناسب عندما يختار المستخدم أحد الخيارات المُدرَجة في النوع unavailable_options وأن يحدّد المساعدة التي اختارها المستخدم. يجب أن يطلب تطبيقك من المستخدم مجددًا اختيار أحد الخيارات الأصلية (تنين أو مترجم أو بوصلة).

لاختبار الإجراء في المحاكي، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. اكتب Talk to my test app في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.
  4. اكتب magic في حقل الإدخال واضغط على Enter.

3a42c33eca435f32.png

قد تلاحظ أنّ الطلب لا يبدو صحيحًا عندما يختار المستخدم "السحر" بسبب أداة التعريف "a" الموضوعة قبلها. يمكنك معالجة هذه المشكلة في الأقسام التالية.

إضافة معالج unavailable_options

لوضع أداة التعريف "a" قبل الخيارات المناسبة من النوع unavailable_options، يمكنك ضبط معالج أحداث في منطق التنفيذ للتحقّق مما إذا كان الخيار الذي يحدده المستخدم يحتاج إلى أداة التعريف "a" قبله. أولاً، عليك ضبط الإجراء لاستدعاء المعالج من مشهد Fortune.

لإضافة معالج unavailable_options إلى مشهد Fortune، اتّبِع الخطوات التالية:

  1. افتح custom/scenes/Fortune.yaml في محرِّر النصوص.
  2. عدِّل ملف Fortune.yaml باستخدام بيانات intentEvents التالية:

Fortune.yaml

intentEvents:
- handler:
    webhookHandler: unavailable_options
  intent: other_option
  1. احفظ الملف.

تعديل عملية التنفيذ ونشرها

بعد إعداد الإجراء لاستدعاء معالج الحدث unavailable_options، يمكنك تعديل المعالج في عملية التنفيذ ونشره.

لتعديل معلومات التنفيذ، اتّبِع الخطوات التالية:

  1. افتح webhooks/ActionsOnGoogleFulfillment/index.js في محرِّر النصوص.
  2. أضِف الرمز التالي إلى index.js ضمن معالج greeting:

index.js

app.handle('unavailable_options', conv => {
  const option = conv.intent.params.chosenUnavailableOption.original;
  const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
  let message = 'I have seen the future and ';
  if(optionsNeedA.has(optionKey)){
    message = message + 'a ';
  }
  message = message + `${option} will not aid you on your journey. `;
  conv.add(message);
});
  1. أضِف الرمز التالي ضمن const app = conversation({debug:true});:

index.js

const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
  1. احفظ الملف.

فهم الرمز البرمجي

ينفِّذ معالج unavailable_options ما يلي:

  • يحصل على بيانات option من العنصر conv ويُعيّن option للسمة original، وهي الإدخال الأولي من المستخدم
  • تُعيّن القيمة optionKey للسمة resolved، وهي المفتاح لنوع unavailable_options
  • تتحقّق هذه السمة مما إذا كان optionKey أحد الخيارات التي تحتاج إلى "a"، وإذا كان كذلك، تنشئ الرسالة مع إضافة "a".
  • إضافة الرسالة عبر conv.add(message)

معالجات التحديث

للسماح للإجراء باستخدام unavailable_options، أضِف معالج unavailable_options إلى webhooks/ActionsOnGoogleFulfillment.yaml.

  1. أضِف اسم معالج unavailable_options إلى ActionsOnGoogleFulfillment.yaml:

ActionsOnGoogleFulfillment.yaml

handlers:
- name: greeting
- name: unavailable_options
inlineCloudFunction:
  executeFunction: ActionsOnGoogleFulfillment
  1. احفظ الملف.

اختبار الإجراء في المحاكي

يجب أن يعدّل الإجراء الآن الطلب استنادًا إلى ما إذا كان خيار المستخدم من النوع unavailable_options يتطلّب أداة التعريف "a" قبله.

لاختبار الإجراء، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي:
gactions deploy preview

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. انقر على Talk to my test app أو اكتبه في حقل الإدخال واضغط على Enter.
  3. اكتب Yes في حقل الإدخال واضغط على Enter. يمكنك بدلاً من ذلك النقر على شريحة الاقتراح نعم.
  4. اكتب magic في حقل الإدخال واضغط على Enter. بعد ذلك، اكتب horse في حقل الإدخال واضغط على Enter.

54ee24c5c3c56e.png

يجب أن يضيف الإجراء الخاص بك أداة التعريف "a" قبل الخيار "horse"، مع إنشاء الطلب بدون أداة التعريف "a" للخيار "magic".

5- تصوُّر الإجراء في "وحدة تحكّم المهام"

تتضمّن Actions SDK إمكانية التشغيل التفاعلي مع بيئة تطوير متكاملة مستندة إلى الويب تُسمى Actions Builder ومدمجة في Actions Console. يمكنك نقل نظام الملفات على جهازك إلى مسودة "الإجراء" في وحدة التحكّم باستخدام الأمر gactions push. توفّر "وحدة تحكّم الإجراءات" تمثيلاً مرئيًا لإعدادات الإجراء. يمكن أن يكون عرض "الإجراء" بشكل مرئي مفيدًا أثناء عملية التطوير، ولا يؤثر في إصدار "الإجراء" الذي يتم عرضه للاختبار.

لإرسال مشروع "الإجراءات" وعرضه في وحدة تحكّم "الإجراءات على Google"، اتّبِع الخطوات التالية:

  1. في الوحدة الطرفية، شغِّل الأمر التالي لنقل مشروعك إلى "وحدة تحكّم الإجراءات":
gactions push

من المفترض أن تتلقّى ناتجًا يشبه ما يلي:

✔ Done. Files were pushed to Actions Console, and you can now view your project with this URL: https://console.actions.google.com/project/{project-id}/overview. If you want to test your changes, run "gactions deploy preview", or navigate to the Test section in the Console.
  1. انسخ عنوان URL المقدَّم والصقه في متصفّح.
  2. في وحدة تحكّم الإجراءات، انقر على تطوير في شريط التنقّل العلوي.
  3. انقر على سهم القائمة المنسدلة بجانب المشاهد، ثم انقر على بدء. من المفترض أن يظهر لك تمثيل مرئي لمشهد Start في مهمّتك، كما هو موضّح في لقطة الشاشة التالية:

cae526c647f8d40f.png

تنظيف مشروعك [يُنصح به]

لتجنُّب تحمّل رسوم محتملة، ننصحك بإزالة المشاريع التي لا تنوي استخدامها. لحذف المشاريع التي أنشأتها في هذا الدرس العملي، اتّبِع الخطوات التالية:

  1. لحذف مشروع Cloud والموارد، أكمِل الخطوات الواردة في قسم إيقاف المشاريع (حذفها).
  1. اختياري: لإزالة مشروعك على الفور من وحدة تحكّم "الإجراءات"، أكمِل الخطوات الواردة في قسم حذف مشروع. إذا لم تُكمل هذه الخطوة، ستتم إزالة مشروعك تلقائيًا بعد 30 يومًا تقريبًا.

6. تهانينا!

أصبحت لديك الآن المهارات المتوسطة اللازمة لإنشاء "مهام مع مساعد Google" باستخدام Actions SDK.

المواضيع التي تناولتها

  • كيفية تطوير "إجراءات حوارية" باستخدام مكتبة التنفيذ Node.js
  • كيفية استخدام الخانات لجمع البيانات من المستخدم
  • كيفية استخدام الشروط لإضافة منطق إلى المشهد
  • كيفية إضافة حلقة ألعاب
  • كيفية إضافة مسار داعم

مزيد من المعلومات

يمكنك استكشاف الموارد التالية للتعرّف على كيفية إنشاء "مهام مع مساعد Google":

تابِعنا على Twitter ‎@ActionsOnGoogle للاطّلاع على آخر إشعاراتنا، وشاركنا ما أنشأته من خلال التغريد باستخدام الهاشتاغ #AoGDevs.

استطلاع لجمع الملاحظات

قبل إنهاء المحادثة، يُرجى ملء استطلاع موجز حول تجربتك.