ניהול סוכני נתונים באמצעות A2A

ה-API של ניתוח שיחות ב- Google Cloud מיישם את פרוטוקול Agent-to-Agent (A2A), שהוא פרוטוקול פתוח שמאפשר לסוכנים בתהליכי עבודה מרובי-סוכנים לגלות יכולות, להעביר שאילתות ניתוח ולשדר תגובות מובנות, כמו שאילתות SQL שניתנות להרצה וויזואליזציות של תרשימים.

אתם יכולים להריץ שאילתות על סוכני נתונים שמוטמעים ב-Conversational Analytics API ל-BigQuery ול-Looker על ידי העברת הקשר של מערך הנתונים בבקשת ה-API, או להריץ שאילתות על סוכני נתונים בהתאמה אישית שהוגדרו עם הלוגיקה העסקית של הארגון שלכם.

כדי ליצור סוכני נתונים ולהריץ עליהם שאילתות ישירות, אפשר לעיין במאמרים יצירת סוכן נתונים באמצעות Python SDK או יצירת סוכן נתונים באמצעות HTTP.

איך Gemini for Google Cloud ‎ משתמש בנתונים שלכם, ובאילו מקרים.

איך פועל תיאום של סוכני נתונים

כשמשלבים סוכני נתונים של Conversational Analytics API באפליקציה או במערכת מרובת סוכנים, תהליך העבודה של התיאום כולל את הפעולות הבאות:

  • הסוכן המתזמר מגלה את היכולות והכישורים של סוכן נתונים על ידי בדיקת כרטיס הסוכן שלו לפני שהוא מעביר שאילתות ניתוח.
  • הסוכן לניהול תהליכים שולח הודעה כדי לשאול שאילתה על סוכן נתונים מובנה (agents/bigquery-ca או agents/looker-ca) על ידי ציון מקורות נתונים בבקשה, או על סוכן נתונים מותאם אישית (dataAgents/DATA_AGENT_ID) שהוגדר עם לוגיקה עסקית של דומיין.
  • סוכן הנתונים מעבד את הבקשה, מריץ את השאילתות הנדרשות ומחזיר את התוצאות – כתשובה מלאה או על ידי הזרמת התקדמות הנימוקים וארטיפקטים מובְנים (כמו SQL שניתן להרצה ומפרטים של תרשימי Vega-Lite).

לפני שמתחילים

לפני שמתחילים, צריך לוודא שהתנאים הבאים מתקיימים:

  1. מפעילים את Conversational Analytics API,‏ BigQuery API ו-Looker API בפרויקט Google Cloud .
  2. מוודאים שיש לכם את התפקידים וההרשאות הנדרשים ב-IAM.
  3. מאמתים את הגישה ל-Conversational Analytics API ומתקינים את ספריית הלקוח או מקבלים אסימון הרשאה.

התפקידים הנדרשים

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

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

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

כדי לשלוח שאילתות למקורות הנתונים הבסיסיים, אתם צריכים גם הרשאות קריאה למערכי הנתונים של BigQuery (כמו roles/bigquery.dataViewer) או ל-Looker Explores.

היכולות של הסוכנים

לפני שמקצים שאילתות לסוכן נתונים, סוכן תזמור או אפליקציית לקוח יכולים לבדוק את כרטיס הסוכן כדי לראות את היכולות וההגדרות שלו, כמו התיאור, הכישורים הזמינים והתוספים הנתמכים. אפשר לאחזר כרטיסי סוכנים באמצעות השיטה getCard גם לסוכני נתונים מובנים (agents/bigquery-ca ו-agents/looker-ca) וגם לסוכני נתונים בהתאמה אישית (dataAgents/DATA_AGENT_ID).

אחזור כרטיס של סוכן

בדוגמאות הקוד הבאות אפשר לראות איך מאחזרים כרטיס של סוכן. בדוגמאות האלה נעשה שימוש בסוכן הנתונים המובנה של BigQuery‏ (agents/bigquery-ca), אבל אפשר לאחזר את הכרטיס של סוכן Looker המובנה (agents/looker-ca) או של סוכן נתונים בהתאמה אישית (dataAgents/DATA_AGENT_ID) על ידי שינוי שם משאב הסוכן בבקשה:

Python SDK

from google.cloud import geminidataanalytics_v1

client = geminidataanalytics_v1.DataA2AServiceClient()

agent_name = "projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca"

request = geminidataanalytics_v1.GetAgentCardRequest(tenant=agent_name)
card = client.get_agent_card(request=request)

print(card)

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)

HTTP

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  "https://geminidataanalytics.googleapis.com/v1/a2a/projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca/v1/card"

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)

הסבר על מבנה כרטיס הנציג

בקשה שמושלמת בהצלחה מחזירה אובייקט של כרטיס נציג שמכיל מטא-נתונים, כישורים נתמכים ותוספים:

{
  "name": "BigQuery Conversational Analytics Agent",
  "description": "This agent can answer questions about your data using BigQuery.",
  "protocolVersion": "1.0",
  "skills": [
    {
      "id": "data-analysis",
      "name": "Data Analysis",
      "description": "Provides data analysis assistance",
      "examples": [
        "What is the total sales for the last 3 months?"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "text/plain",
        "application/json"
      ]
    }
  ],
  "capabilities": {
    "streaming": true,
    "extensions": [
      {
        "uri": "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1",
        "description": "Google Data Analytics BigQuery Context extension"
      }
    ]
  },
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "text/plain",
    "application/json"
  ]
}

כרטיס הסוכן כולל את השדות הבאים:

  • name: השם המוצג של סוכן הנתונים
  • description: סיכום של יכולות הניתוח של סוכן הנתונים
  • ‫protocolVersion: הגרסה של פרוטוקול A2A שנתמכת על ידי נקודת הקצה (לדוגמה, 1.0)
  • ‫skills: המשימות שסוכן הנתונים יכול לבצע, כולל הנחיות לדוגמה (examples) ופורמטים נתמכים של נתונים (inputModes ו-outputModes, כמו text/plain או application/json)
  • ‫capabilities.streaming: ערך בוליאני שמציין אם סוכן הנתונים תומך בהזרמה בזמן אמת באמצעות ה-method‏ stream
  • capabilities.extensions: התוספים של A2A שהסוכן לנתונים תומך בהם, כמו bigquery_context/v1,‏ stateless/v1 ו-kms/v1
  • ‫defaultInputModes ו-defaultOutputModes: פורמטי הנתונים שמוגדרים כברירת מחדל (כמו text/plain או application/json) עבור מטען ייעודי (payload) של בקשות ותגובות

שליחת הודעה לסוכן נתונים

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

שליחת הודעה

כששולחים הודעה, מציינים את סוכן הנתונים של היעד בנתיב המשאב:

  • עבור סוכני נתונים מובנים (agents/bigquery-ca או agents/looker-ca), מעבירים הפניות לטבלת היעד או לניתוח באמצעות התוסף bigquery_context/v1 או looker_context/v1 בשדה metadata.
  • עבור סוכני נתונים בהתאמה אישית (dataAgents/DATA_AGENT_ID), משמיטים את השדה metadata כי ההקשר, הסכימות וההוראות מוגדרים ישירות במשאב הסוכן.

כדי לעבד שאילתות בלי לשמור את היסטוריית השיחות ב- Google Cloud, צריך לכלול את התוסף stateless/v1 בבקשה. כדי להצפין את נתוני השיחות והמטא-נתונים המאוחסנים באמצעות מפתח הצפנה בניהול הלקוח, צריך להעביר את התוסף kms/v1 עם שם המפתח של Cloud KMS. מידע נוסף מופיע במאמר בנושא מפתחות הצפנה בניהול הלקוח (CMEK).

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

Python SDK

from google.cloud import geminidataanalytics_v1

client = geminidataanalytics_v1.DataA2AServiceClient()

agent_name = "projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca"

request = geminidataanalytics_v1.SendMessageRequest(
    tenant=agent_name,
    message=geminidataanalytics_v1.Message(
        role="ROLE_USER",
        # Optional: Pass context_id to continue an existing conversation
        # context_id="projects/PROJECT_ID/locations/LOCATION/conversations/CONVERSATION_ID",
        parts=[
            geminidataanalytics_v1.Part(
                text="What are the top 5 countries where our users are located?"
            )
        ],
    ),
    configuration=geminidataanalytics_v1.SendMessageConfiguration(
        return_immediately=False
    ),
    metadata={
        "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1": {
            "datasource_references": {
                "bq": {
                    "tableReferences": [
                        {
                            "projectId": "DATASET_PROJECT_ID",
                            "datasetId": "DATASET_ID",
                            "tableId": "TABLE_ID",
                        }
                    ]
                }
            }
        },
        # Optional: Process queries without storing conversation history in Google Cloud
        # "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/stateless/v1": {},
        # Optional: Encrypt conversation history and metadata with a customer-managed encryption key (CMEK)
        # "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/kms/v1": {
        #     "kmsKey": "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME"
        # },
    },
)

response = client.send_message(request=request)

print(response)

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)
  • ‫CONVERSATION_ID: (אופציונלי) המזהה של סשן שיחה קיים שרוצים להמשיך
  • What are the top 5 countries where our users are located?: השאלה בשפה טבעית שרוצים לשאול את סוכן הנתונים
  • ‫DATASET_PROJECT_ID: המזהה של Google Cloud הפרויקט שמכיל את מערך הנתונים ב-BigQuery (לדוגמה, bigquery-public-data)
  • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, thelook_ecommerce)
  • ‫TABLE_ID: המזהה של הטבלה ב-BigQuery (לדוגמה, users)
  • ‫KEY_RING: (אופציונלי) השם של אוסף המפתחות ב-Cloud KMS כשמשתמשים ב-CMEK
  • ‫KEY_NAME: (אופציונלי) השם של המפתח הקריפטוגרפי ב-Cloud KMS כשמשתמשים ב-CMEK

HTTP

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json; charset=utf-8" \
  -H "A2A-Extensions: https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1" \
  -d '{
    "message": {
      "role": "ROLE_USER",
      "parts": [
        {
          "text": "What are the top 5 countries where our users are located?"
        }
      ]
    },
    "configuration": {
      "return_immediately": false
    },
    "metadata": {
      "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1": {
        "datasource_references": {
          "bq": {
            "tableReferences": [
              {
                "projectId": "DATASET_PROJECT_ID",
                "datasetId": "DATASET_ID",
                "tableId": "TABLE_ID"
              }
            ]
          }
        }
      }
    }
  }' \
  "https://geminidataanalytics.googleapis.com/v1/a2a/projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca/v1/message:send"

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)
  • What are the top 5 countries where our users are located?: השאלה בשפה טבעית שרוצים לשאול את סוכן הנתונים
  • ‫DATASET_PROJECT_ID: המזהה של Google Cloud הפרויקט שמכיל את מערך הנתונים ב-BigQuery (לדוגמה, bigquery-public-data)
  • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, thelook_ecommerce)
  • ‫TABLE_ID: המזהה של הטבלה ב-BigQuery (לדוגמה, users)

הסבר על מבנה התגובה

בקשה מוצלחת מחזירה אובייקט task שמכיל את הסטטוס הסופי, את מזהה השיחה ואת הארטיפקטים שנוצרו:

{
  "task": {
    "id": "ab12d1f2-e170-4c4f-aff4-be466c6beaaa",
    "contextId": "projects/my-project/locations/us/conversations/conv-67890",
    "status": {
      "state": "TASK_STATE_COMPLETED"
    },
    "artifacts": [
      {
        "artifactId": "synthetic-8a368e8e-378a-4b80-9f07-0b1a397c221d",
        "name": "Final response",
        "description": "Final response from the agent.",
        "parts": [
          {
            "text": "The top 5 countries where our users are located are China (33,783), the United States (22,701), Brasil (14,620), South Korea (5,302), and France (4,645)."
          }
        ]
      },
      {
        "artifactId": "synthetic-50483808-b231-4b30-a859-2c30d0355a8d",
        "name": "Generated SQL",
        "description": "Generated SQL from the agent.",
        "parts": [
          {
            "text": "SELECT country, COUNT(DISTINCT id) AS user_count FROM `bigquery-public-data.thelook_ecommerce.users` GROUP BY country ORDER BY user_count DESC LIMIT 5",
            "mediaType": "text/x-sql"
          }
        ]
      }
    ]
  }
}

התשובה כוללת את השדות העיקריים הבאים:

  • ‫task.id: המזהה הייחודי של משימת ההפעלה
  • ‫task.contextId: נתיב המשאב של השיחה, שמועבר בשדה message.contextId של בקשות עוקבות כדי להמשיך את הסשן
  • ‫task.status.state: מצב הביצוע של המשימה (למשל TASK_STATE_COMPLETED)
  • ‫task.artifacts[]: נכסים מובְנים שנוצרו על ידי סוכן הנתונים, כמו תשובה בשפה טבעית (Final response), שאילתת SQL שניתנת להרצה (Generated SQL) ושורות תוצאות בטבלה (Data result)

הזרמת תשובות מסוכן נתונים

כדי לקבל עדכונים בזמן אמת בזמן שהסוכן לנתונים מנתח שאילתה, משתמשים בשיטה stream. התשובה כוללת עדכוני סטטוס (status_update) עם מחשבות ביניים וארטיפקטים מצטברים (artifact_update), כמו שאילתות SQL שנוצרו ומפרטים של תרשימי Vega-Lite.

בקשות סטרימינג תומכות גם בשיחה מתמשכת (context_id), בעיבוד בלי שמירת מצב (stateless/v1) ובמפתחות הצפנה בניהול הלקוח (kms/v1).

שליחת הודעה בסטרימינג

דוגמאות הקוד הבאות מראות איך להזרים אירועים מסוכן הנתונים המובנה של BigQuery. כדי להזרים נתונים מסוכן נתונים בהתאמה אישית (dataAgents/DATA_AGENT_ID), צריך להגדיר את נתיב המשאב של הסוכן המותאם אישית ולהשמיט את השדה metadata:

Python SDK

from google.cloud import geminidataanalytics_v1

client = geminidataanalytics_v1.DataA2AServiceClient()

agent_name = "projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca"

request = geminidataanalytics_v1.SendMessageRequest(
    tenant=agent_name,
    message=geminidataanalytics_v1.Message(
        role="ROLE_USER",
        parts=[
            geminidataanalytics_v1.Part(
                text="What are the top 5 countries where our users are located? Please show a pie chart."
            )
        ],
    ),
    metadata={
        "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1": {
            "datasource_references": {
                "bq": {
                    "tableReferences": [
                        {
                            "projectId": "DATASET_PROJECT_ID",
                            "datasetId": "DATASET_ID",
                            "tableId": "TABLE_ID",
                        }
                    ]
                }
            }
        },
        # Optional: Process queries without storing conversation history in Google Cloud
        # "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/stateless/v1": {},
        # Optional: Encrypt conversation history and metadata with a customer-managed encryption key (CMEK)
        # "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/kms/v1": {
        #     "kmsKey": "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME"
        # },
    },
)

# Stream response events
stream = client.send_streaming_message(request=request)

for chunk in stream:
  print(chunk)

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)
  • What are the top 5 countries where our users are located? Please show a pie chart.: השאלה בשפה טבעית שרוצים לשאול את סוכן הנתונים
  • ‫DATASET_PROJECT_ID: המזהה של Google Cloud הפרויקט שמכיל את מערך הנתונים ב-BigQuery (לדוגמה, bigquery-public-data)
  • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, thelook_ecommerce)
  • ‫TABLE_ID: המזהה של הטבלה ב-BigQuery (לדוגמה, users)
  • ‫KEY_RING: (אופציונלי) השם של אוסף המפתחות ב-Cloud KMS כשמשתמשים ב-CMEK
  • ‫KEY_NAME: (אופציונלי) השם של המפתח הקריפטוגרפי ב-Cloud KMS כשמשתמשים ב-CMEK

HTTP

curl -X POST \
  -N \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json; charset=utf-8" \
  -H "Accept: text/event-stream, application/json" \
  -H "A2A-Extensions: https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1" \
  -d '{
    "message": {
      "role": "ROLE_USER",
      "parts": [
        {
          "text": "What are the top 5 countries where our users are located? Please show a pie chart."
        }
      ]
    },
    "metadata": {
      "https://docs.cloud.google.com/gemini/docs/conversational-analytics-api/reference/a2a/extensions/bigquery_context/v1": {
        "datasource_references": {
          "bq": {
            "tableReferences": [
              {
                "projectId": "DATASET_PROJECT_ID",
                "datasetId": "DATASET_ID",
                "tableId": "TABLE_ID"
              }
            ]
          }
        }
      }
    }
  }' \
  "https://geminidataanalytics.googleapis.com/v1/a2a/projects/PROJECT_ID/locations/LOCATION/agents/bigquery-ca/v1/message:stream"

בדוגמה הקודמת, מחליפים את הערכים באופן הבא:

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  • ‫LOCATION: המיקום של משאב הסוכן (למשל us,‏ us-east4,‏ eu או global)
  • What are the top 5 countries where our users are located? Please show a pie chart.: השאלה בשפה טבעית שרוצים לשאול את סוכן הנתונים
  • ‫DATASET_PROJECT_ID: המזהה של Google Cloud הפרויקט שמכיל את מערך הנתונים ב-BigQuery (לדוגמה, bigquery-public-data)
  • ‫DATASET_ID: המזהה של מערך הנתונים ב-BigQuery (לדוגמה, thelook_ecommerce)
  • ‫TABLE_ID: המזהה של הטבלה ב-BigQuery (לדוגמה, users)

הסבר על מבנה התגובה של הסטרימינג

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

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

{
  "statusUpdate": {
    "taskId": "f41cd8e3-e665-460c-aceb-7b337f1848ef",
    "status": {
      "state": "TASK_STATE_WORKING",
      "message": {
        "role": "ROLE_AGENT",
        "parts": [
          {
            "text": "Analyzing context"
          },
          {
            "text": "Retrieved context for 1 table."
          }
        ]
      }
    }
  }
}

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

{
  "artifactUpdate": {
    "taskId": "f41cd8e3-e665-460c-aceb-7b337f1848ef",
    "artifact": {
      "artifactId": "synthetic-7ca98286-0a15-4ca0-a8bc-f14dc231b3ba",
      "name": "Chart result",
      "description": "Chart visualization generated by the data agent.",
      "parts": [
        {
          "data": {
            "title": "Top 5 Countries by User Population",
            "mark": "arc",
            "encoding": {
              "color": {
                "field": "country",
                "type": "nominal"
              },
              "theta": {
                "field": "user_count",
                "type": "quantitative"
              }
            },
            "data": {
              "values": [
                {
                  "country": "China",
                  "user_count": 33783
                },
                {
                  "country": "United States",
                  "user_count": 22701
                },
                {
                  "country": "Brasil",
                  "user_count": 14620
                },
                {
                  "country": "South Korea",
                  "user_count": 5302
                },
                {
                  "country": "France",
                  "user_count": 4645
                }
              ]
            }
          }
        }
      }
    },
    "lastChunk": true
  }
}

התגובה בסטרימינג כוללת את השדות העיקריים הבאים:

  • ‫statusUpdate.status.state: המצב הביניים או המצב הסופי של המשימה (למשל TASK_STATE_WORKING או TASK_STATE_COMPLETED)
  • ‫statusUpdate.status.message.parts[]: תיאורים של מחשבות או התקדמות שמוצגים במהלך ההרצה
  • artifactUpdate.artifact: הנכס המובנה שנוצר על ידי סוכן הנתונים, כמו מפרט של תרשים Vega-Lite‏ (data) או שאילתת SQL‏ (text)
  • ‫artifactUpdate.lastChunk: דגל בוליאני שמציין אם זרם הארטיפקטים הושלם

כדי לעבד את מפרט Vega או Vega-Lite שמוחזר ב-Python או באפליקציות frontend, אפשר לעיין במאמר עיבוד תשובה של סוכן כוויזואליזציה.

המאמרים הבאים