Add alias_generator and populate_by_name to RequestInput model_config to match frontend naming conventions and other event models. Change-Id: I5eb4a55185d0113d86407c119050bb9885a7962b
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 fastI never received my orderThe 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
-
Yield a
RequestInputevent 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...", ) -
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") -
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}), ], )