Files
Wei (Jack) Sun 1c64a41b53 feat: ADK 2.0 alpha
Introduces two major capabilities:
- Workflow runtime: graph-based execution engine for composing
  deterministic execution flows for agentic apps, with support for
  routing, fan-out/fan-in, loops, retry, state management, dynamic
  nodes, human-in-the-loop, and nested workflows
- Task API: structured agent-to-agent delegation with multi-turn
  task mode, single-turn controlled output, mixed delegation
  patterns, human-in-the-loop, and task agents as workflow nodes

Co-Authored-By: Bo Yang <ybo@google.com>
Co-Authored-By: George Weale <gweale@google.com>
Co-Authored-By: Sean Zhou <seanzhougoogle@google.com>
Co-Authored-By: Shangjie Chen <deanchen@google.com>
Co-Authored-By: Swapnil Agarwal <swapnilag@google.com>
Co-Authored-By: Wei Sun <weisun@google.com>
Co-Authored-By: Xuan Yang <xygoogle@google.com>
Co-Authored-By: Yifan Wang <wanyif@google.com>
Change-Id: I35932c50cfe29ff68559e3781713dbb5eb7b3382
2026-03-17 23:24:58 -07:00

2.3 KiB

ADK Workflow Request Input Sample

Overview

This sample demonstrates how to create a Human-in-the-Loop workflow in ADK Workflows using the RequestInput event.

It shows a customer support scenario where an LLM agent (draft_email) drafts a response to a customer complaint. The workflow then halts execution and prompts a human user for review (request_human_review). Depending on the human's input (approve, reject, or custom feedback), the workflow either completes, aborts, or loops back to the AI for revisions.

This pattern is crucial for tasks where AI actions require human verification before proceeding.

Sample Inputs

  • My phone battery drains too fast
  • I never received my order
  • The software crashes when I open the settings

Graph

       [ START ]
           |
           v
    [draft_email] <--------------------+
           |                           |
           v                           |
[request_human_review]                 |
           |                           |
           v                           |
 [handle_human_review] -- (revise) ----+
        /    \
       /      \
      v        v
[send_email]  [END (rejected)]

How To

  1. Yield a RequestInput event from a node to halt the workflow and prompt the user for input.

    from google.adk.events import RequestInput
    
    def request_human_review(draft: str):
        yield RequestInput(
            message="Please review the draft...",
        )
    
  2. The subsequent node will receive the user's input as its argument (node_input). You can use this input to determine the next routing step.

    def handle_human_review(node_input: str):
        if node_input == "approve":
            yield Event(route="approved")
        elif node_input == "reject":
            yield Event(route="rejected")
        else:
            yield Event(state={"feedback": node_input}, route="revise")
    
  3. Define the edges in your workflow to handle the different routes, including looping back for revisions.

    Workflow(
        name="request_input",
        edges=[
            ("START", ..., draft_email, request_human_review, handle_human_review),
            (handle_human_review, {"revise": draft_email, "approved": send_email}),
        ],
    )