You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.6 KiB
Markdown
155 lines
5.6 KiB
Markdown
# Human-in-the-Loop: Plan-Execute-Replan Pattern with Review-and-Edit
|
|
|
|
This example demonstrates the **Plan-Execute-Replan** multi-agent pattern combined with the **Review-and-Edit** human-in-the-loop pattern.
|
|
|
|
It showcases how to build a planning agent system where users can review and modify booking parameters before critical actions (like flight and hotel bookings) are executed.
|
|
|
|
## How It Works
|
|
|
|
1. **Plan-Execute-Replan Architecture**: The system consists of three specialized agents:
|
|
- **Planner**: Creates an initial plan based on user requirements
|
|
- **Executor**: Executes each step of the plan using available tools
|
|
- **Replanner**: Adjusts the plan based on execution results
|
|
|
|
2. **Review-Edit Tools**: The `book_flight` and `book_hotel` tools are wrapped in `InvokableReviewEditTool`. This allows users to:
|
|
- Approve the booking as-is
|
|
- Modify the booking parameters (e.g., change dates, room type)
|
|
- Reject the booking entirely
|
|
|
|
3. **Workflow**:
|
|
- User requests a travel plan (e.g., "Plan a 3-day trip to Tokyo")
|
|
- Planner creates a multi-step plan
|
|
- Executor attempts to book flights → **interrupt for review**
|
|
- User reviews/edits booking details → resume
|
|
- Executor attempts to book hotel → **interrupt for review**
|
|
- User reviews/edits → resume
|
|
- Plan completes with all bookings confirmed
|
|
|
|
4. **Iterative Execution**: The plan-execute-replan pattern supports multiple iterations, allowing the replanner to adjust the plan based on execution results or user modifications.
|
|
|
|
## Practical Example
|
|
|
|
Here's what the review-and-edit flow looks like:
|
|
|
|
```
|
|
========================================
|
|
User Query: Plan a 3-day trip to Tokyo starting from New York on 2025-10-15.
|
|
I need to book flights and a hotel. Also recommend some must-see attractions.
|
|
========================================
|
|
|
|
name: Planner
|
|
path: [{PlanExecuteAgent} {Planner}]
|
|
answer: Creating travel plan...
|
|
|
|
name: Executor
|
|
path: [{PlanExecuteAgent} {Executor}]
|
|
tool name: book_flight
|
|
arguments: {"from":"New York","to":"Tokyo","date":"2025-10-15","passengers":1,"preferred_time":"morning"}
|
|
|
|
========================================
|
|
REVIEW REQUIRED
|
|
========================================
|
|
Tool: book_flight
|
|
Arguments: {"from":"New York","to":"Tokyo","date":"2025-10-15","passengers":1,"preferred_time":"morning"}
|
|
----------------------------------------
|
|
Options:
|
|
- Type 'ok' to approve as-is
|
|
- Type 'n' to reject
|
|
- Or enter modified JSON arguments
|
|
----------------------------------------
|
|
Your choice: ok
|
|
|
|
========================================
|
|
Resuming execution...
|
|
========================================
|
|
|
|
name: Executor
|
|
path: [{PlanExecuteAgent} {Executor}]
|
|
tool response: {"booking_id":"FL-2025-10-15-12345","airline":"Japan Airlines",...}
|
|
|
|
name: Executor
|
|
path: [{PlanExecuteAgent} {Executor}]
|
|
tool name: book_hotel
|
|
arguments: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"standard"}
|
|
|
|
========================================
|
|
REVIEW REQUIRED
|
|
========================================
|
|
Tool: book_hotel
|
|
Arguments: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"standard"}
|
|
----------------------------------------
|
|
Your choice: {"city":"Tokyo","check_in":"2025-10-15","check_out":"2025-10-18","guests":1,"room_type":"deluxe"}
|
|
|
|
========================================
|
|
Resuming execution...
|
|
========================================
|
|
|
|
name: Executor
|
|
path: [{PlanExecuteAgent} {Executor}]
|
|
tool response: {"booking_id":"HT-2025-10-15-67890","hotel_name":"Tokyo Grand Hyatt","room_type":"deluxe",...}
|
|
```
|
|
|
|
This trace demonstrates:
|
|
- **Planning Phase**: Planner creates a structured travel plan
|
|
- **Flight Booking Review**: User approves flight booking as-is
|
|
- **Hotel Booking Edit**: User modifies room type from "standard" to "deluxe"
|
|
- **Flexible Input**: Users can approve, reject, or provide modified JSON
|
|
|
|
## How to Configure Environment Variables
|
|
|
|
Before running the example, you need to set up the required environment variables for the LLM API. You have two options:
|
|
|
|
### Option 1: OpenAI-Compatible Configuration
|
|
```bash
|
|
export OPENAI_API_KEY="{your api key}"
|
|
export OPENAI_BASE_URL="{your model base url}"
|
|
# Only configure this if you are using Azure-like LLM providers
|
|
export OPENAI_BY_AZURE=true
|
|
# 'gpt-4o' is just an example, configure the model name provided by your LLM provider
|
|
export OPENAI_MODEL="gpt-4o-2024-05-13"
|
|
```
|
|
|
|
### Option 2: ARK Configuration
|
|
```bash
|
|
export MODEL_TYPE="ark"
|
|
export ARK_API_KEY="{your ark api key}"
|
|
export ARK_MODEL="{your ark model name}"
|
|
```
|
|
|
|
Alternatively, you can create a `.env` file in the project root with these variables.
|
|
|
|
## How to Run
|
|
|
|
Ensure you have your environment variables set (e.g., for the LLM API key). Then, run the following command from the root of the `eino-examples` repository:
|
|
|
|
```sh
|
|
go run ./adk/human-in-the-loop/6_plan-execute-replan
|
|
```
|
|
|
|
You will see the planner creating a travel plan, and when bookings are attempted, you'll be prompted to review and optionally edit the booking parameters.
|
|
|
|
## Workflow Diagram
|
|
|
|
```mermaid
|
|
graph TD
|
|
A[User Request] --> B[Planner Agent];
|
|
B --> C[Create Plan];
|
|
C --> D[Executor Agent];
|
|
D --> E{book_flight Tool};
|
|
E --> F[Interrupt: Review Required];
|
|
F --> G{User Review};
|
|
G -- "ok" --> H[Resume: Original Args];
|
|
G -- "edit" --> I[Resume: Modified Args];
|
|
G -- "n" --> J[Resume: Rejected];
|
|
H --> K[Flight Booked];
|
|
I --> K;
|
|
J --> L[Replanner Adjusts];
|
|
K --> M{book_hotel Tool};
|
|
M --> N[Interrupt: Review Required];
|
|
N --> O{User Review};
|
|
O -- "ok/edit/n" --> P[Process Response];
|
|
P --> Q[Hotel Booked or Replanned];
|
|
Q --> R[Final Response];
|
|
L --> D;
|
|
```
|