添加现有代理步骤

您可以将现有的 AI 智能体添加为工作流中的步骤,以便将任务转移给专用智能体。 这样,您就可以编写多智能体工作流,在不同智能体之间进行编排,每个智能体处理较大流程的特定部分。

准备工作

在使用此功能之前,请完成以下步骤:

  • 确保 Gemini Enterprise 管理员已在应用的功能管理设置中启用 Workflow Builder 功能开关。如需了解详情,请参阅 管理 Web 应用功能。
  • 确保您要添加的智能体在您的组织中可用。 此功能支持添加以下智能体:

添加现有智能体步骤

应用

  1. 在浏览器中打开 Gemini Enterprise Web 应用。
  2. 导航到现有智能体或 创建新智能体。
  3. 在流程构建器中,点击添加步骤 。
  4. 在添加步骤 面板中,点击现有智能体 以展开该部分。
  5. 浏览可用智能体列表。

  6. 点击您要添加的智能体。

    系统会将现有智能体步骤添加到您的工作流中。所选智能体将作为工作流的一部分运行,接收来自先前步骤的输入并将输出传递给后续步骤。

  7. 在画布中,点击现有智能体步骤以打开其配置面板,然后配置以下内容:

    • 提示:输入用于触发 智能体的提示或说明。您可以添加静态文本,也可以引用先前步骤的输出(例如 ${step_name.output})。

智能体步骤是对所选智能体的动态引用。如果源智能体已更新或有新版本发布,您的工作流会自动使用最新版本。

如需详细了解此功能的限制,请参阅 已知问题和限制。

澄清式问题的工作原理

当现有智能体在工作流中运行时,如果需要缺失的信息才能完成任务,它可以暂停执行并向用户提出澄清式问题。 当被引用智能体发出 input-required 信号 (A2A) 或 RequestInput 事件 (ADK) 时,系统会原生支持澄清式问题。

当现有智能体步骤运行并需要其他信息时:

  1. 执行暂停:工作流会在现有智能体 步骤处暂停执行,并启动人机协同 (HITL) 提示。
  2. 用户回答提示:Gemini Enterprise Web 应用 会向用户显示智能体的澄清式问题,以及用于输入回答的文本字段 。
  3. 执行恢复:当用户提交回答后,工作流会 恢复现有智能体,并将用户的回答传递回智能体。
  4. 支持多轮对话:智能体可以在 多轮对话中连续提出多个澄清式问题,直到收集所有必需的信息 并生成最终输出。

上下文隔离

在澄清式问题交流期间,被引用智能体只会收到其与用户的互动历史记录以及为节点配置的初始提示。除非在步骤的提示中明确引用,否则工作流中其他步骤的输出和变量不会自动传递给被引用智能体。

在智能体中实现澄清式问题

如需支持澄清式问题,请将自定义智能体配置为在需要其他信息时发出协议级请求输入信号。

A2A 智能体(原生)

对于直接实现代理对代理 (A2A) 协议的智能体,请使用 TaskUpdater 以 input-required 状态返回任务,并在消息载荷中提供澄清式问题:

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,
        )
    )

用户的回答将作为具有相同 taskId 的 message/send 请求发送回您的智能体。

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)

Agent Engine 上的 ADK 智能体

对于 Agent Engine 上由推理引擎托管的 ADK 智能体,请在生成器工具或自定义智能体步骤中发出 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?",
    )

后续步骤