כלים ב-Playbook

באמצעות כלים, אפשר לחבר את תוכניות הפעולה למערכות חיצוניות. המערכות האלה יכולות להרחיב את הידע של תוכניות הפעולה ולאפשר להן לבצע משימות מורכבות ביעילות.

אתם יכולים להשתמש בכלים מובנים או ליצור כלים מותאמים אישית לפי הדרישות שלכם.

בדיקת כלים

אחרי שיוצרים כלי, אפשר להשתמש בתכונת בדיקת הכלים כדי לוודא שהוא פועל. כשצופים בכלי, לוחצים על הלחצן בדיקה שמעל חלונית הכלי. כך פותחים את הכלי להזנת נתונים בסימולטור. מזינים את הקלט לכלי, ואז לוחצים על הצגת הפלט כדי לוודא שהפלט של הכלי נכון.

אפשר גם להשתמש בתכונת הבדיקה של הכלי כשמוסיפים כלי לדוגמה.

כלים מובנים

הכלים המובנים מתארחים ב-Google. אתם יכולים להפעיל את הכלים האלה בסוכנים בלי שתצטרכו להגדיר אותם ידנית.

הכלים המובנים הנתמכים הם:

  • Code Interpreter: כלי של Google מאינטראקציה ישירה שמשלב את היכולת ליצור קוד ולהריץ קוד, ומאפשר למשתמש לבצע משימות שונות, כולל: ניתוח נתונים, הדמיה של נתונים, עיבוד טקסט, פתרון משוואות או בעיות אופטימיזציה.

הסוכן מותאם לקבוע איך ומתי להפעיל את הכלים האלה, אבל אתם יכולים לספק דוגמאות נוספות שמתאימות לתרחישי השימוש שלכם.

דוגמאות צריכות להיות עם סכימה כמו זו:

{
  "toolUse": {
    "tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/df-code-interpreter-tool",
    "action": "generate_and_execute",
    "inputParameters": [
      {
        "name": "generate_and_execute input",
        "value": "4 + 4"
      }
    ],
    "outputParameters": [
      {
        "name": "generate_and_execute output",
        "value": {
          "output_files": [
            {
              "name": "",
              "contents": ""
            }
          ],
          "execution_result": "8",
          "execution_error": "",
          "generated_code": "GENERATED_CODE"
        }
      }
    ]
  }
}

כלים של OpenAPI

סוכן יכול להתחבר ל-API חיצוני באמצעות כלי OpenAPI על ידי ציון סכימת OpenAPI. כברירת מחדל, הסוכן יתקשר ל-API בשמכם.

כדי לבדוק שהכלי מוגדר בצורה נכונה, אפשר להשתמש בתכונה 'כלי הבדיקה' שזמינה בדף הכלי. התכונה הזו זמינה גם בתצוגת הדוגמה כשמוסיפים קריאה לכלי לדוגמה.

אפשר גם להריץ כלי OpenAPI בצד הלקוח.

סכימה לדוגמה:

openapi: 3.0.0
info:
  title: Simple Pets API
  version: 1.0.0
servers:
  - url: 'https://api.pet-service-example.com/v1'
paths:
  /pets/{petId}:
    get:
      summary: Return a pet by ID.
      operationId: getPet
      parameters:
        - in: path
          name: petId
          required: true
          description: Pet id
          schema:
            type: integer
      responses:
        200:
          description: OK
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      parameters:
        - name: petName
          in: query
          required: false
          description: Pet name
          schema:
            type: string
        - name: label
          in: query
          description: Pet label
          style: form
          explode: true
          required: false
          schema:
            type: array
            items:
              type: string
        - name: X-OWNER
          in: header
          description: Optional pet owner provided in the HTTP header
          required: false
          schema:
            type: string
        - name: X-SESSION
          in: header
          description: Dialogflow session id
          required: false
          schema:
            $ref: "@dialogflow/sessionId"
      responses:
        '200':
          description: An array of pets
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Pet'
    post:
      summary: Create a new pet
      operationId: createPet
      requestBody:
        description: Pet to add to the store
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
      responses:
        '201':
          description: Pet created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        owner:
          type: string
        label:
          type: array
          items:
            type: string

אפשר גם להשתמש בהפניה לסכימה הפנימית @dialogflow/sessionId כסוג הסכימה של הפרמטר. בסוג הזה של סכימת פרמטרים, מזהה הסשן של Dialogflow לשיחה הנוכחית יסופק כערך פרמטר. לדוגמה:

- name: X-SESSION
   in: header
   description: Dialogflow session id
   required: false
   schema:
     $ref: "@dialogflow/sessionId"

מגבלות של כלי OpenAPI

ההגבלות הבאות חלות:

  • סוגי הפרמטרים הנתמכים הם path, ‏ query, ‏ header. עדיין אין תמיכה בסוג הפרמטר cookie.
  • פרמטרים שמוגדרים על ידי סכימת OpenAPI תומכים בסוגי הנתונים הבאים: string, ‏ number, ‏ integer, ‏ boolean, ‏ array. עדיין אין תמיכה בסוג object.
  • בשלב הזה אי אפשר לציין פרמטרים של שאילתות בכלי לעריכת דוגמאות במסוף.
  • תוכן הבקשה והתגובה חייב להיות ריק או בפורמט JSON.

יצירת סכימה של כלי OpenAPI

כשמספקים סכימה, אפשר ללחוץ על הלחצן שימוש ב-Gemini כדי להשתמש בבינה מלאכותית גנרטיבית ליצירת הסכימה. כדי להנחות את יצירת התמונה, אפשר לספק את הפרטים הבאים:

  • כתובת URL של בקשה
  • שיטת HTTP‏ (GET,‏ POST וכו')
  • קלט לדוגמה
  • פלט לדוגמה
  • פרומפט טקסטואלי שמתאר את הכלי

אחרי שהקוד נוצר, אפשר לערוך אותו לפי הצורך ולהוסיף כתובות URL ושיטות נוספות באופן ידני.

אימות של API בכלי OpenAPI

אלה אפשרויות האימות שנתמכות כשמתקשרים עם API חיצוני:

אימות סוכן שירות של Dialogflow

‫Dialogflow יכול ליצור טוקן של מזהה באמצעות Dialogflow Service Agent. הטוקן מתווסף לכותרת ההרשאה של HTTP כש-Dialogflow קורא ל-API חיצוני.

אפשר להשתמש באסימון מזהה כדי לגשת לפונקציות של Cloud Run ולשירותים של Cloud Run אחרי שמקצים את התפקידים roles/cloudfunctions.invoker ו-roles/run.invoker ל-service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com. אם פונקציות Cloud Run ושירותי Cloud Run נמצאים באותו פרויקט משאבים, לא צריך הרשאת IAM נוספת כדי להפעיל אותם.

אימות באמצעות חשבון שירות

אפשר להשתמש בחשבונות שירות כדי לאמת בקשות של כלי לכל Google API שתומך בכך.

אם עדיין לא עשיתם זאת, צרו חשבון שירות.

מאחר שחשבונות שירות הם חשבונות משתמשים, אפשר לתת להם גישה למשאבים בפרויקט על ידי הקצאת תפקיד, בדיוק כמו שמקצים תפקיד לכל חשבון משתמש אחר. כתובת האימייל בחשבון השירות תשמש ליצירת טוקן גישה שיישלח בכותרת Authorization של בקשת הכלי.

למשתמש שמגדיר את הכלי לשימוש בחשבונות שירות צריכות להיות ההרשאות הבאות:

  • roles/iam.serviceAccountUser

כדי ש-Dialogflow CX יוכל ליצור אסימונים, לסוכן השירות של Dialogflow צריכות להיות ההרשאות הבאות:

  • roles/iam.serviceAccountTokenCreator

בנוסף, לחשבון השירות צריכות להיות הרשאות גישה לשירות שמארח את הכלי.

מפתח API

  • אתם יכולים להגדיר אימות של מפתח API על ידי ציון שם המפתח, מיקום הבקשה (כותרת או מחרוזת שאילתה) ומפתח ה-API, כדי ש-Dialogflow יעביר את מפתח ה-API בבקשה.
  • מומלץ לספק את מפתח ה-API באמצעות Secret Manager. אחרי 15 באוגוסט 2025, סוכנים מיוצאים לא יכללו יותר מפתחות API עם ערכים גולמיים.

OAuth

  • יש תמיכה בתהליך של פרטי כניסה של לקוח OAuth לאימות משרת לשרת:

    • אפשר להשתמש בתהליך הזה אם מסוף Vertex AI Agent Builder הוא הבעלים של המשאב ולא נדרשת הרשאה ממשתמש קצה.
    • צריך להגדיר ב-Dialogflow את מזהה הלקוח, סוד הלקוח ונקודת הקצה של הטוקן מספק ה-OAuth.
      • מומלץ לספק את הסוד של הלקוח באמצעות Secret Manager. אחרי 15 באוגוסט 2025, סודות לקוח של ערכים גולמיים לא ייכללו יותר בסוכנים מיוצאים.
    • ‫Dialogflow מחליף טוקן גישה של OAuth מספק OAuth ומעביר אותו בכותרת האימות של הבקשה.
  • לגבי תהליכי OAuth אחרים שדורשים הרשאה ממשתמש הקצה, כמו הרשאה באמצעות קוד ותהליך PKCE:

    1. תצטרכו להטמיע ממשק משתמש משלכם לכניסה לחשבון ולקבל את אסימון הגישה בצד הלקוח.
    2. לאחר מכן תוכלו:

      א. משתמשים באפשרות האימות Bearer Token כדי להעביר את הטוקן אל OpenAPI Tool. ‫Dialogflow יכלול את האסימון הזה בכותרת ההרשאה כשיפעיל את הכלי.

      ב. משתמשים בכלי הפונקציה כדי להפעיל את הכלי בעצמכם בצד הלקוח ולהעביר את התוצאה של קריאת הכלי אל Dialogflow.

פרטי אסימון

  • אפשר להגדיר אימות באמצעות טוקן למוכ"ז כדי להעביר באופן דינמי את הטוקן למוכ"ז מהלקוח. הטוקן הזה נכלל בכותרת האימות של הבקשה.
  • כשמגדירים אימות של כלי, אפשר להגדיר פרמטר של סשן שישמש כטוקן Bearer. לדוגמה, משתמשים בפקודה $session.params.<parameter-name-for-token> כדי לציין את הטוקן.
  • בזמן הריצה, מקצים את טוקן ה-Bearer לפרמטר הסשן:

    DetectIntentRequest {
      ...
      query_params {
        parameters {
          <parameter-name-for-token>: <the-auth-token>
        }
      }
      ...
    }
    
  • אם אתם צריכים להגדיר אסימון סטטי במקום לאחזר את האסימון מפרמטר של סשן, מומלץ לספק את האסימון באמצעות Secret Manager. אחרי 15 באוגוסט 2025, סוכנים מיוצאים לא יכללו יותר טוקנים של Bearer עם ערכים גולמיים.

אימות TLS בו-זמני (mTLS)

  • מידע נוסף זמין במאמר בנושא אימות TLS בו-זמני (mTLS).
  • יש תמיכה באישורי לקוח בהתאמה אישית. אתם יכולים להגדיר אישורים של לקוחות ברמת הסוכן בכרטיסייה 'אבטחה' בהגדרות הסוכן. האישור (בפורמט PEM) והמפתח הפרטי (בפורמט PEM) הם שדות חובה. אחרי שמגדירים את אישור הלקוח הזה, הוא ישמש במהלך TLS הדדי לכל הכלים ולכל ה-webhook.

אישור CA בהתאמה אישית

אימות ב-Secret Manager

אם אתם משתמשים ב-OAuth, במפתח API או באסימון Bearer, אתם יכולים לאחסן את פרטי הכניסה כסודות באמצעות Secret Manager. כדי לאמת את הכלי באמצעות סודות, צריך לבצע את השלבים הבאים:

  1. אם עדיין אין לכם סוד, צריך ליצור אותו.
  2. מעניקים ל-Dialogflow Service Agent (סוכן שירות של Dialogflow) את התפקיד Secret Manager Secret Accessor (גישה לסודות ב-Secret Manager) (roles/secretmanager.secretAccessor) בסוד החדש.
  3. מעתיקים את פרטי הכניסה ללוח.
  4. מוסיפים גרסה חדשה של הסוד לסוד. מדביקים את פרטי הכניסה בתור ערך הסוד.
    • אין להוסיף תו מעבר לשורה בסוף.
  5. מעתיקים את השם של גרסת הסוד שהוספתם. פורמט השם הוא projects/{project_id}/secrets/{secret_id}/versions/{version_id}".
  6. פותחים את מסך העריכה של הכלי ואז:
    • אם משתמשים ב-OAuth, בוחרים באפשרות OAuth בתור סוג האימות, ואז לוחצים על Secret version (גרסת הסוד) בקטע Client secret (סוד הלקוח) ומדביקים את השם של גרסת הסוד בתיבת הקלט Secret version (גרסת הסוד).
    • אם משתמשים במפתח API, בוחרים באפשרות מפתח API בתור סוג האימות, ואז לוחצים על גרסת סוד בקטע מפתח API. מדביקים את שם הגרסה של הסוד בתיבת הקלט Secret version (גרסת הסוד).
    • אם משתמשים ב-Bearer token, בוחרים באפשרות Bearer token בתור סוג האימות, ואז לוחצים על Secret version (גרסת הסוד) בקטע Bearer token (Bearer token). מדביקים את שם הגרסה של ה-Secret בתיבת הקלט Secret version.
  7. לוחצים על Save.

גישה לרשת פרטית בכלי OpenAPI

כלי OpenAPI משולב עם גישה לרשת פרטית של Service Directory, כך שהוא יכול להתחבר ליעדי API בתוך רשת ה-VPC שלכם. כך התעבורה נשארת בתוך רשת Google Cloud, ומערכות IAM ו-VPC Service Controls פועלות.

כדי להגדיר כלי OpenAPI שמיועד לרשת פרטית:

  1. פועלים לפי ההוראות בנושא הגדרת רשת פרטית ב-Service Directory כדי להגדיר את רשת ה-VPC ואת נקודת הקצה של Service Directory.

  2. חשבון השירות של סוכן השירות של Dialogflow עם הכתובת הבאה צריך להיות קיים בפרויקט של הסוכן:

    service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
    מקצים לחשבון השירות Dialogflow Service Agent את התפקידים הבאים ב-IAM:

    • servicedirectory.viewer של פרויקט Service Directory
    • servicedirectory.pscAuthorizedService של פרויקט הרשת
  3. כשיוצרים את הכלי, צריך לספק את שירות Service Directory, סכימת OpenAPI ופרטי אימות אופציונליים.

גישה לפרמטרים של סשן בכלי OpenAPI

הקלט של כלי Open API נגזר מהשיחה של המשתמש עם מודל ה-LLM, באמצעות הסכימה כמדריך. במקרים מסוימים, יכול להיות שיהיה צורך לגזור את הקלט מפרמטרים של סשן שנאספו במהלך תהליך או שסופקו כפרמטר של שאילתה, יחד עם קלט של משתמשים.

אפשר לציין את פרמטר הסשן שצריך להעביר כקלט באופן הבא:

     parameters:
       - in: query
         name: petId
         required: true
         description: Pet id
         schema:
           type: integer
           x-agent-input-parameter: petId # Reads from the $session.params.petId
       - in: header
         name: X-other
         schema:
           type: string
           x-agent-input-parameter: $request.payload.header # Reads from the header specified in the request payload input
     requestBody:
       required: false
       content:
         application/json:
           schema:
             type: object
             properties:
               name:
                 type: string
                 x-agent-input-parameter: petName # Reads from the $session.params.petName
                 description: Name of the person to greet (optional).
               breed:
                 type: string
                 description: Bread of the pet.

אם אין פרמטר כזה של סשן, הקלט שנוצר על ידי מודל שפה גדול יועבר לכלי.

ערכי ברירת מחדל של כלי OpenAPI

אפשר להשתמש בסכימת Open API כדי לציין ערכי ברירת מחדל. ערכי ברירת המחדל ישמשו רק אם אין ערך קלט שנוצר על ידי LLM או ערך קלט שמבוסס על פרמטר של סשן עבור הפרמטר או המאפיין הזה.

אפשר לציין את ערכי ברירת המחדל כחלק מהסכימה באופן הבא:

     parameters:
       - in: query
         name: zipcode
         required: true
         description: Zip code to search for
         schema:
           type: integer
           default: 94043
     requestBody:
       content:
         application/json:
           schema:
             type: object
             properties:
               breed:
                 type: string
                 description: Bread of the pet.
               page_size:
                 type: integer
                 description: Number of pets to return.
                 default: 10

אם לא קיים ערך שנוצר על ידי LLM, ערך פרמטר של סשן או ערך ברירת מחדל, הקלט לא יצוין.

כלים למאגרי נתונים

מידע על שימוש בכלי מאגר נתונים עם מדריך הפעלה זמין במסמכי העזרה בנושא כלי מאגר נתונים.

כלים למחברים

סוכן יכול להשתמש בכלי מחבר כדי לבצע פעולות באמצעות החיבורים שהגדרתם במחברי שילוב. כל כלי מחבר מוגדר עם חיבור יחיד ועם פעולה אחת או יותר. אם צריך, אפשר ליצור כמה כלים לחיבור אחד כדי לקבץ פעולות שונות שהסוכן יכול להשתמש בהן.

כלי החיבור תומך בסוגי החיבורים הבאים:

אפשר להשתמש בדוגמאות כדי לשפר את השימוש של הסוכן בכלי המחבר. הדוגמאות צריכות להראות איך הסוכן צריך להפעיל את הכלי ולהשתמש בתגובה.

יצירת חיבור

כדי ליצור חיבור ולחבר אותו לסוכן, אפשר לעבור אל כלים > יצירה, לבחור את סוג הכלי מחבר, את סוג המחבר הרצוי ולהשתמש בלחצן יצירת חיבור. פעולה זו תנווט אותך ליצירת Integration Connectors עם מספר שדות שמולאו מראש.

לחלופין, אפשר לעבור אל Integration Connectors (מחברים לשילובים) ולפעול לפי ההוראות ליצירת חיבור.

פעולות של מחברים

לכל כלי מחבר יש שני סוגים של פעולות שאפשר להגדיר כזמינות לסוכן (מידע נוסף זמין במאמר ישויות, פעולות ופעולות):

  1. פעולות CRUD של ישויות

    לכל אחד מהחיבורים יש 'ישויות' שמתאימות לאובייקטים של מקור הנתונים (ב-BigQuery אלה טבלאות, ב-Salesforce אלה אובייקטים כמו Order או Case).

    אפשר לבצע פעולות CRUD בכל ישות:

    • Create: יוצרת ישות עם ערכי שדות שצוינו
    • רשימה: חיפוש מבוסס-מסננים של מופעי ישויות
    • עדכון: שיטה לשינוי ערכים של שדות ישות שמבוססת על סינון
    • מחיקה: מחיקת ישות
    • Get מאחזר ישות יחידה באמצעות entityId

    מידע נוסף על פעולות CRUD של ישויות זמין במסמכי התיעוד של Connectors.

  2. פעולות ספציפיות למחבר

    מחברים רבים תומכים בפעולה ExecuteCustomQuery, שמאפשרת להריץ שאילתת SQL על מקור הנתונים, כאשר כל אחד מהישויות של מקור הנתונים יכול לשמש כטבלה. כאן אפשר לעיין ברשימת המחברים הנתמכים.

    פעולות נוספות משתנות בהתאם לסוג המחבר – לדוגמה, אפשר לעיין בפעולות של מחבר BigQuery או בפעולות של מחבר Salesforce.

הגדרת שדות קלט / פלט לפעולות CRUD

אם בוחרים שדות קלט או פלט ספציפיים לשימוש בפעולה של כלי המחבר, אפשר להגביל את המורכבות של הפעולות האלה עבור הסוכן.

לדוגמה, אם אתם צריכים ליצור ישות עם קבוצת משנה של השדות שלה, הגדרת קבוצת השדות הזו בפעולה מפשטת את הפעולה עבור הסוכן.

ציון של קבוצת שדות פלט מקטין את גודל התגובה של הכלי (שימושי אם יש חשש לגבי מגבלות טוקנים) ומפשט את הטיפול של הסוכן בפלט, כי מוצגים רק השדות הרלוונטיים.

אימות

אם החיבור שבו אתם משתמשים מוגדר לאפשר עקיפה של אימות, אפשר להגדיר את הכלי כך שיעביר את פרטי הכניסה מפרמטרים ספציפיים של הסשן.

אתם, יוצרי הסוכן, אחראים לאופן שבו פרטי הכניסה האלה מאוכלסים בפרמטרים של הסשן, והכלי יעביר אותם באופן אוטומטי למקור הנתונים כדי להשתמש בהם לאימות כשמפעילים את הפעולות של הכלי.

כלים לפונקציות

אם יש לכם פונקציונליות שאפשר לגשת אליה באמצעות קוד הלקוח, אבל אי אפשר לגשת אליה באמצעות כלי OpenAPI, אתם יכולים להשתמש בכלי פונקציות. הפעלת כלי הפונקציות תמיד מתבצעת בצד הלקוח, ולא על ידי הסוכן.

התהליך הוא כזה:

  1. קוד הלקוח שולח בקשה לזיהוי כוונות.
  2. הסוכן מזהה שנדרש כלי פונקציה, והתשובה של זיהוי הכוונה מכילה את שם הכלי יחד עם ארגומנטים של קלט. הסשן הזה מושהה עד שתתקבל בקשה נוספת לזיהוי כוונות עם תוצאת הכלי.
  3. קוד הלקוח שלכם קורא לכלי.
  4. קוד הלקוח שולח בקשה נוספת לזיהוי כוונות, שמספקת את תוצאת הכלי כארגומנטים של פלט.

בדוגמה הבאה מוצגת סכימת הקלט והפלט של כלי פונקציה:

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "The city and state, for example, San Francisco, CA"
    }
  },
  "required": [
    "location"
  ]
}
{
  "type": "object",
  "properties": {
    "temperature": {
      "type": "number",
      "description": "The temperature"
    }
  }
}

בדוגמה הבאה מוצגת בקשת זיהוי הכוונה הראשונית והתגובה באמצעות REST:

HTTP method and URL:
POST https://REGION_ID-dialogflow.googleapis.com/v3/projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/sessions/SESSION_ID:detectIntent
{
  "queryInput": {
    "text": {
      "text": "what is the weather in Mountain View"
    },
    "languageCode": "en"
  }
}
{
  "queryResult": {
    "text": "what is the weather in Mountain View",
    "languageCode": "en",
    "responseMessages": [
      {
        "source": "VIRTUAL_AGENT",
        "toolCall": {
          "tool": "<tool-resource-name>",
          "action": "get-weather-tool",
          "inputParameters": {
            "location": "Mountain View"
          }
        }
      }
    ]
  }
}

בדוגמה הבאה מוצגת הבקשה השנייה לזיהוי כוונת המשתמש, שכוללת את תוצאת הכלי:

{
  "queryInput": {
    "toolCallResult": {
      "tool": "<tool-resource-name>",
      "action": "get-weather-tool",
      "outputParameters": {
        "temperature": 28.0
      }
    },
    "languageCode": "en"
  }
}

ביצוע בצד הלקוח

בדומה לכלי פונקציות, אפשר להפעיל כלי OpenAPI וכלי מאגר נתונים בצד הלקוח על ידי החלת החלפה של API במהלך האינטראקציה עם הסשן.

לדוגמה:

DetectIntentRequest {
  ...
  query_params {
    playbook_state_override {
      playbook_execution_mode: ALWAYS_CLIENT_EXECUTION
    }
  }
  ...
}

התהליך הוא כזה:

  1. קוד הלקוח שולח בקשה לזיהוי כוונות שמציינת ביצוע בצד הלקוח.
  2. הנציג מזהה שנדרש כלי, והתשובה של זיהוי ה-Intent מכילה את שם הכלי יחד עם ארגומנטים של קלט. הסשן הזה מושהה עד שתתקבל בקשה נוספת לזיהוי כוונות עם תוצאת הכלי.
  3. קוד הלקוח שלכם קורא לכלי.
  4. קוד הלקוח שולח בקשה נוספת לזיהוי כוונות, שמספקת את תוצאת הכלי כארגומנטים של פלט.