添加现有代理步骤

您可以将现有的 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 代理(原生)

对于直接实现 Agent-to-Agent (A2A) 协议的代理,请返回处于 input-required 状态且包含 TaskUpdater 的任务,并在消息载荷中提供澄清问题:

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

用户的回答会作为具有相同 taskIdmessage/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?",
    )

后续步骤