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

# 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;
```