פריסת סוכן

כשפורסים סוכן ב-Agent Runtime, הוא זמין מרחוק לטיפול בבקשות. במאמר הזה מוסבר איך לפרוס סוכן בהתאם לתהליך הפיתוח שלכם: מאובייקט הפעלה, מקובצי מקור מקומיים, מקובץ Docker, מקובץ אימג' של קונטיינר שמתארח ב-Artifact Registry או ישירות דרך מאגר Git מחובר.

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

Developer Connect

מומלץ לפרויקטים שמנוהלים במאגר Git שמקושר דרך Developer Connect. השיטה הזו מייעלת את פריסת הנציגים ישירות מקוד המקור, ותומכת באופן מובנה בניהול גרסאות, בשיתוף פעולה בצוות ובצינורות עיבוד נתונים של CI/CD. לפני שמשתמשים בשיטה הזו, צריך להגדיר את הקישור למאגר Git לפי ההוראות במאמר הגדרת קישור למאגר Git ב-Developer Connect.

אפשר להשתמש בשיטת הפריסה הזו רק עם Python.

קובצי מקור

מתאים לתהליכי עבודה אוטומטיים כמו צינורות עיבוד נתונים של CI/CD וכלים של תשתית כקוד כמו Terraform, שמאפשרים פריסות אוטומטיות ודקלרטיביות לחלוטין. הוא פורס את הנציג ישירות מקוד המקור המקומי, ולא נדרשת קטגוריה של Cloud Storage.

אפשר להשתמש בשיטת הפריסה הזו רק עם Python.

קובץ Docker

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

אפשר להשתמש בשיטת הפריסה הזו בכל שפה. הדוגמאות בדף הזה הן ב-Python.

קובץ אימג' של קונטיינר

בדומה לפריסה מקובץ Docker. אתם פורסים קובץ אימג' של קונטיינר שמתארח ב-Artifact Registry. כדאי להשתמש בשיטה הזו אם אתם צריכים לשלוט בתהליך ה-build של קובץ האימג' של הקונטיינר, וזמן האחזור של הפריסה קצר יותר. קובץ האימג' של הקונטיינר חייב לעמוד בדרישות של חוזה זמן הריצה.

אפשר להשתמש בשיטת הפריסה הזו בכל שפה. הדוגמאות בדף הזה הן ב-Python.

Agent Platform SDK

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

כדי להתחיל, פועלים לפי השלבים הבאים:

  1. השלמת הדרישות המוקדמות
  2. אופציונלי: הגדרת הנציג לפריסה
  3. יצירת מכונה של Gemini Enterprise Agent Platform
  4. אופציונלי: קבלת מזהה המשאב של הנציג
  5. אופציונלי: רשימת הפעולות הנתמכות
  6. אופציונלי: מתן הרשאות לסוכן שנפרס

דרישות מוקדמות

לפני שפורסים נציג, צריך לבצע את המשימות הבאות:

  1. הגדרת הסביבה
  2. יצירת סוכן

אופציונלי: הגדרת הסוכן לפריסה

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

יצירת מופע של Agent Platform

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

Developer Connect

כדי לפרוס מ-Developer Connect ב-Agent Platform, צריך להשתמש ב-client.runtimes.create ולספק את developer_connect_source,‏ entrypoint_module ו-entrypoint_object במילון ההגדרות האישיות, יחד עם הגדרות אופציונליות אחרות. בשיטה הזו אפשר לפרוס קוד ישירות ממאגר Git מקושר.

אפשר להשתמש בשיטת הפריסה הזו רק עם Python.

remote_agent = client.runtimes.create(
    config={
        "developer_connect_source": {                   # Required.
            "git_repository_link": "projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID/gitRepositoryLinks/REPO_ID",
            "revision": "main",
            "dir": "path/to/dir",
        },
        "entrypoint_module": "agent",                   # Required.
        "entrypoint_object": "root_agent",              # Required.
        "requirements_file": "requirements.txt",        # Optional.
        # Other optional configs:
        # "env_vars": {...},
        # "service_account": "...",
    },
)

הפרמטרים לפריסה של Developer Connect הם:

  • ‫developer_connect_source (dict): ההגדרות לאחזור קוד המקור. פרטים נוספים זמינים במאמר הגדרת קישור למאגר Git ב-Developer Connect.
    • ‫git_repository_link (str): שם המשאב של הקישור למאגר Git ב-Developer Connect.
    • ‫revision (str): הגרסה שצריך לאחזר (ענף, תג או SHA של commit).
    • ‫dir (str): תיקיית השורש של קוד הסוכן במאגר.
  • ‫entrypoint_module (str): השם של מודול Python שמכיל את נקודת הכניסה של הסוכן, ביחס לספרייה שצוינה ב-developer_connect_source.dir.
  • ‫entrypoint_object (str): השם של האובייקט שניתן לקרוא לו בתוך entrypoint_module שמייצג את אפליקציית הנציג (לדוגמה, root_agent).
  • ‫requirements_file (str): אופציונלי: הנתיב לקובץ דרישות של pip ביחס לשורש המקור. ברירת המחדל היא requirements.txt.

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

  1. שירות Agent Runtime מאחזר את קוד המקור מהגרסה שצוינה במאגר Git.
  2. השירות מתקין יחסי תלות מ-requirements_file (אם סופקו).
  3. השירות מפעיל את אפליקציית הנציג באמצעות entrypoint_module ו-entrypoint_object שצוינו.

זמן האחזור של הפריסה תלוי במשך הזמן הכולל שנדרש להתקנת החבילות הנדרשות. אחרי הפריסה, remote_agent תואם למכונה של local_agent שפועלת ב-Agent Platform, ואפשר לשלוח אליה שאילתות או למחוק אותה.

האובייקט remote_agent תואם למחלקה AgentRuntime שמכילה את הפרטים הבאים:

  • remote_agent.api_resource עם מידע על הנציג שנפרס. אפשר גם להפעיל את remote_agent.operation_schemas() כדי להחזיר את רשימת הפעולות שנתמכות על ידי remote_agent. פרטים נוספים זמינים בקטע פעולות נתמכות.
  • remote_agent.api_client שמאפשרת אינטראקציות סינכרוניות בין שירותים
  • remote_agent.async_api_client שמאפשר אינטראקציות אסינכרוניות בין שירותים

קובצי מקור

כדי לפרוס מקובצי מקור ב-Agent Platform, משתמשים ב-client.runtimes.create ומספקים את source_packages,‏ entrypoint_module,‏ entrypoint_object ו-class_methods במילון התצורה, יחד עם הגדרות אופציונליות אחרות. בשיטה הזו, לא צריך להעביר אובייקט של סוכן או קטגוריה של Cloud Storage.

אפשר להשתמש בשיטת הפריסה הזו רק עם Python.

# Example file structure:
# /agent_directory
#     ├── agent.py
#     ├── requirements.txt

# Example agent_directory/agent.py:
# class MyAgent:
#     def ask(self, question: str) -> str:
#         return f"Answer to {question}"
# root_agent = MyAgent()

remote_agent = client.runtimes.create(
    config={
        "source_packages": source_packages,             # Required.
        "entrypoint_module": entrypoint_module,         # Required.
        "entrypoint_object": entrypoint_object,         # Required.
        "class_methods": class_methods,                 # Required.
        "requirements_file": requirements_file,         # Optional.
        "display_name": display_name,                   # Optional.
        "description": description,                     # Optional.
        "labels": labels,                               # Optional.
        "env_vars": env_vars,                           # Optional.
        "build_options": build_options,                 # Optional.
        "identity_type": identity_type,                 # Optional.
        "service_account": service_account,             # Optional.
        "min_instances": min_instances,                 # Optional.
        "max_instances": max_instances,                 # Optional.
        "resource_limits": resource_limits,             # Optional.
        "container_concurrency": container_concurrency, # Optional
        "encryption_spec": encryption_spec,             # Optional.
        "agent_framework": agent_framework,             # Optional.
    },
)

הפרמטרים לפריסת מקור מוטמע הם:

  • ‫source_packages (list[str]): רשימה של נתיבים לקבצים או לספריות מקומיים שצריך לכלול בפריסה. הגודל הכולל של הקבצים והספריות ב-source_packages לא יכול לחרוג מ-8MB.
  • ‫entrypoint_module (str): השם המלא של מודול Python שמכיל את נקודת הכניסה של הסוכן (לדוגמה, agent_dir.agent).
  • ‫entrypoint_object (str): השם של האובייקט שניתן לקרוא לו בתוך entrypoint_module שמייצג את אפליקציית הנציג (לדוגמה, root_agent).
  • ‫class_methods (list[dict]): רשימה של מילונים שמגדירים את השיטות החשופות של הנציג. כל מילון כולל את השדות name, api_mode ואת השדה האופציונלי parameters. במאמר רשימת הפעולות הנתמכות מוסבר על השיטות של סוכן בהתאמה אישית.

    לדוגמה:

    class_methods = [
        {
            "name": "method_name",
            "api_mode": "",  # Options: "", "async", "async_stream", "stream", "bidi_stream"
            "parameters": {
                "type": "object",
                "properties": {
                    "param1": {"type": "string", "description": "Description of param1"},
                    "param2": {"type": "integer"}
                },
                "required": ["param1"]
            }
        }
    ]
  • ‫requirements_file (str): אופציונלי: הנתיב לקובץ דרישות pip בתוך הנתיבים שצוינו ב-source_packages. ברירת המחדל היא requirements.txt בתיקיית השורש של המקור הארוז.

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

  1. ה-SDK של Agent Platform יוצר ארכיון tar.gz של הנתיבים שצוינו ב-source_packages.
  2. הארכיון הזה מקודד ונשלח ישירות ל-Agent Platform API.
  3. שירות Agent Runtime מקבל את הארכיון, מחלץ אותו, מתקין יחסי תלות מ-requirements_file (אם סופקו) ומפעיל את אפליקציית הסוכן באמצעות entrypoint_module ו-entrypoint_object שצוינו.

זמן האחזור של הפריסה תלוי במשך הזמן הכולל שנדרש להתקנת החבילות הנדרשות. אחרי הפריסה, remote_agent תואם למכונה של local_agent שפועלת ב-Agent Platform, ואפשר לשלוח אליה שאילתות או למחוק אותה.

האובייקט remote_agent תואם למחלקה AgentRuntime שמכילה את הפרטים הבאים:

  • remote_agent.api_resource עם מידע על הנציג שנפרס. אפשר גם להפעיל את remote_agent.operation_schemas() כדי להחזיר את רשימת הפעולות שנתמכות על ידי remote_agent. פרטים נוספים זמינים בקטע פעולות נתמכות.
  • remote_agent.api_client שמאפשרת אינטראקציות סינכרוניות בין שירותים
  • remote_agent.async_api_client שמאפשר אינטראקציות אסינכרוניות בין שירותים

קובץ Docker

פריסה מקובץ Docker ב-Agent Platform דומה לפריסה מקובצי מקור, אבל משתמשים ב-image_spec בהגדרות במקום ב-entrypoint_module, ב-entrypoint_object וב-requirements_file. הקונטיינר שנוצר מקובץ ה-Dockerfile חייב לעמוד בדרישות של חוזה זמן הריצה.

אפשר להשתמש בשיטת הפריסה הזו בכל שפה. הדוגמה בקטע הזה משתמשת ב-Python.

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

# Example file structure:
# /current_directory
#     ├── agent.py
#     ├── main.py
#     ├── requirements.txt
#     ├── Dockerfile

remote_agent = client.runtimes.create(
    config={
        "source_packages": [
            "agent.py",
            "main.py",
            "requirements.txt",
            "Dockerfile",
        ],
        "image_spec": {},  # tells Agent Runtime to use the Dockerfile
        # Other optional configs
        "display_name": "Dockerfile agent",
    }
)

זמן האחזור של הפריסה תלוי במשך הזמן הכולל שנדרש להתקנת החבילות הנדרשות. אחרי הפריסה, remote_agent תואם למכונה של local_agent שפועלת ב-Agent Platform, ואפשר לשלוח אליה שאילתות או למחוק אותה.

האובייקט remote_agent תואם למחלקה AgentRuntime שמכילה את הפרטים הבאים:

  • remote_agent.api_resource עם מידע על הנציג שנפרס. אפשר גם להפעיל את remote_agent.operation_schemas() כדי להחזיר את רשימת הפעולות שנתמכות על ידי remote_agent. פרטים נוספים זמינים בקטע פעולות נתמכות.
  • remote_agent.api_client שמאפשרת אינטראקציות סינכרוניות בין שירותים
  • remote_agent.async_api_client שמאפשר אינטראקציות אסינכרוניות בין שירותים

קובץ אימג' של קונטיינר

כדי לפרוס מקובץ אימג' של קונטיינר, קודם צריך לפעול לפי הוראות ההגדרה של שימוש בקונטיינר משלכם, ולוודא שמתקינים גרסה של google-cloud-aiplatform שעומדת בדרישות של >=1.144. קובץ האימג' של הקונטיינר חייב לעמוד בחוזה של זמן הריצה.

אפשר להשתמש בשיטת הפריסה הזו בכל שפה. הדוגמה בקטע הזה משתמשת ב-Python.

הדוגמה הבאה ממחישה איך לפרוס נציג באמצעות קובץ אימג' של קונטיינר:

remote_agent = client.runtimes.create(
    config={
        "container_spec": {
            "image_uri": "CONTAINER_IMAGE_URI",
        },
        # Other optional configs
        "display_name": "Container image agent",
    },
)

כאשר CONTAINER_IMAGE_URI תואם ל-URI של קובץ האימג' של הקונטיינר ב-Artifact Registry (למשל us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag).

זמן האחזור של הפריסה תלוי במשך הזמן הכולל שנדרש להתקנת החבילות הנדרשות. אחרי הפריסה, remote_agent תואם למכונה של local_agent שפועלת ב-Agent Platform, ואפשר לשלוח אליה שאילתות או למחוק אותה.

האובייקט remote_agent תואם למחלקה AgentRuntime שמכילה את הפרטים הבאים:

  • remote_agent.api_resource עם מידע על הנציג שנפרס. אפשר גם להפעיל את remote_agent.operation_schemas() כדי להחזיר את רשימת הפעולות שנתמכות על ידי remote_agent. פרטים נוספים זמינים בקטע פעולות נתמכות.
  • remote_agent.api_client שמאפשרת אינטראקציות סינכרוניות בין שירותים
  • remote_agent.async_api_client שמאפשר אינטראקציות אסינכרוניות בין שירותים

Agent Platform SDK

כדי לפרוס את הנציג ב-Agent Platform, משתמשים ב-client.runtimes.create כדי להעביר את האובייקט local_agent יחד עם הגדרות אופציונליות:

remote_agent = client.runtimes.create(
    agent=local_agent,                                  # Optional.
    config={
        "requirements": requirements,                   # Optional.
        "extra_packages": extra_packages,               # Optional.
        "gcs_dir_name": gcs_dir_name,                   # Optional.
        "display_name": display_name,                   # Optional.
        "description": description,                     # Optional.
        "labels": labels,                               # Optional.
        "env_vars": env_vars,                           # Optional.
        "build_options": build_options,                 # Optional.
        "identity_type": identity_type,                 # Optional.
        "service_account": service_account,             # Optional.
        "min_instances": min_instances,                 # Optional.
        "max_instances": max_instances,                 # Optional.
        "resource_limits": resource_limits,             # Optional.
        "container_concurrency": container_concurrency, # Optional
        "encryption_spec": encryption_spec,             # Optional.
        "agent_framework": agent_framework,             # Optional.
    },
)

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

  1. חבילה של פריטי המידע שנוצרו באופן מקומי:
  2. החבילה מועלית ל-Cloud Storage (בתיקייה המתאימה) כדי להכין את פריטי המידע שנוצרו בתהליך הפיתוח (Artifacts).
  3. מזהי ה-URI של Cloud Storage לפריטי המידע שנוצרו בתהליך הפיתוח (Artifacts) מצוינים ב-PackageSpec.
  4. שירות Agent Runtime מקבל את הבקשה, יוצר קונטיינרים ומפעיל שרתי HTTP בקצה העורפי.

זמן האחזור של הפריסה תלוי במשך הזמן הכולל שנדרש להתקנת החבילות הנדרשות. אחרי הפריסה, remote_agent תואם למכונה של local_agent שפועלת ב-Agent Platform, ואפשר לשלוח אליה שאילתות או למחוק אותה.

האובייקט remote_agent תואם למחלקה AgentRuntime שמכילה את הפרטים הבאים:

  • remote_agent.api_resource עם מידע על הנציג שנפרס. אפשר גם להפעיל את remote_agent.operation_schemas() כדי להחזיר את רשימת הפעולות שנתמכות על ידי remote_agent. פרטים נוספים זמינים בקטע פעולות נתמכות.
  • remote_agent.api_client שמאפשרת אינטראקציות סינכרוניות בין שירותים
  • remote_agent.async_api_client שמאפשר אינטראקציות אסינכרוניות בין שירותים

אופציונלי: קבלת מזהה המשאב של הנציג

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

remote_agent.api_resource.name

התגובה אמורה להיראות כמו המחרוזת הבאה:

"projects/PROJECT_NUMBER/locations/LOCATION/reasoningEngines/RESOURCE_ID"

כאשר

אופציונלי: הצגת רשימה של הפעולות הנתמכות

לכל נציג פרוס יש רשימה של פעולות נתמכות. אפשר להשתמש ב-AgentRuntime.operation_schemas כדי לקבל את רשימת הפעולות שנתמכות על ידי הנציג שנפרס:

remote_agent.operation_schemas()

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

אופציונלי: מתן הרשאות לסוכן שנפרס

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

אופציונלי: פריסת נציגים עם תשתית ארגונית

כדי לפרוס את הנציג בסביבה מלאה שכוללת שכבות אבטחה ופיקוח, מעתיקים ומתאימים אישית את התבניות הבאות של Application Design Center:

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

מדריך

איך מנהלים סוכנים שנפרסו בסביבת זמן הריצה המנוהלת של Agent Platform.

מדריך

שימוש בסוכן עם Agent Platform Runtime.