הוספת שלב קיים של סוכן

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

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

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

הוספת שלב קיים לסוכן

אפליקציה

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

  6. לוחצים על הנציג שרוצים להוסיף.

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

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

    • פרומפט: מזינים את הפרומפט או ההוראות שמשמשים להפעלת הסוכן. אפשר לכלול טקסט סטטי או הפניות לפלט משלבים קודמים (לדוגמה, ${step_name.output}).

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

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

איך פועלות שאלות ההבהרה

כשסוכן קיים פועל בתהליך עבודה, הוא יכול להשהות את הביצוע כדי לשאול את המשתמש שאלה להבהרה אם חסר לו מידע להשלמת המשימה. שאלות הבהרה נתמכות באופן מובנה כשסוכן שאליו מתייחסים פולט אות input-required (A2A) או אירוע RequestInput (ADK).

כששלב קיים של סוכן פועל ונדרש מידע נוסף:

  1. השהיית הביצוע: תהליך העבודה מושהה בשלב של הסוכן הקיים, ומוצגת הנחיה לאדם שבתהליך (HITL).
  2. המשתמש עונה על ההנחיה: אפליקציית האינטרנט של Gemini Enterprise מציגה למשתמש את שאלת ההבהרה של הסוכן, יחד עם שדה טקסט להזנת התשובה.
  3. המשך הביצוע: כשהמשתמש שולח את התשובה שלו, תהליך העבודה ממשיך את הנציג הקיים ומעביר את התשובה של המשתמש בחזרה לנציג.
  4. תמיכה בשיחה מרובת תפניות: הסוכן יכול לשאול כמה שאלות הבהרה ברצף בכמה תפניות, עד שהוא אוסף את כל המידע הנדרש ומפיק את הפלט הסופי.

בידוד הקשרים

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

הטמעה של שאלות הבהרה בסוכן

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

סוכני A2A (מקוריים)

בסוכנים שמטמיעים את פרוטוקול Agent-to-Agent‏ (A2A) ישירות, מחזירים את המשימה במצב input-required עם TaskUpdater, ומספקים את שאלת ההבהרה במטען הייעודי (payload) של ההודעה:

from a2a.server.tasks import TaskUpdater
from a2a.types import Message, Part, Role, TextPart

# Inside your custom agent's task executor class:
async def execute(self, context, event_queue):
    updater = TaskUpdater(event_queue, context.task_id, context.context_id)
    if context.current_task is None:
        await updater.submit()
    await updater.start_work()

    user_input = context.get_user_input()
    if "weather" in user_input and "tokyo" not in user_input.lower():
        await updater.requires_input(
            Message(
                message_id=f"q-{context.task_id}",
                role=Role.agent,
                parts=[Part(root=TextPart(
                    text="Which city would you like the weather for?"))],
                task_id=context.task_id,
                context_id=context.context_id,
            )
        )
        return

    await updater.complete(
        Message(
            message_id=f"a-{context.task_id}",
            role=Role.agent,
            parts=[Part(root=TextPart(
                text="It is sunny and 72°F in Tokyo."))],
            task_id=context.task_id,
            context_id=context.context_id,
        )
    )

התשובה של המשתמש נשלחת בחזרה לסוכן שלכם כבקשת message/send עם אותו taskId.

סוכני A2A (שנוצרו באמצעות ADK)

אם הסוכן שלכם נוצר באמצעות הערכה לפיתוח סוכנים (ADK) ונחשף דרך A2A (באמצעות to_a2a()), צריך לעטוף את הפונקציה של שאילת השאלות ב-LongRunningFunctionTool:

from google.adk.agents import Agent
from google.adk.tools.long_running_tool import LongRunningFunctionTool
from google.adk.a2a.utils.agent_to_a2a import to_a2a

def get_weather(city: str) -> str:
    """Returns weather information for a city."""
    return f"It is sunny and 72°F in {city}."

def ask_clarifying_question(question: str) -> None:
    """Asks the user a question and waits for their reply."""
    return None

root_agent = Agent(
    model="gemini-2.5-flash",
    name="weather_agent",
    instruction=(
        "If the user asks for weather without specifying a city, call "
        "`ask_clarifying_question` and wait. Do not guess."
    ),
    tools=[get_weather, LongRunningFunctionTool(ask_clarifying_question)],
)

a2a_app = to_a2a(root_agent, port=8000)

סוכני ADK ב-Agent Engine

בסוכני ADK שמתארחים ב-Reasoning Engine ב-Agent Engine, שולחים אירוע RequestInput בכלי ליצירת תוכן או בשלב של סוכן בהתאמה אישית:

from google.adk.events import RequestInput

# Inside a generator tool or custom agent step
def ask_for_details():
    """Requests user input during tool or step execution."""
    yield RequestInput(
        interrupt_id="weather_city",
        message="Which city would you like the weather for?",
    )

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