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.
131 lines
4.8 KiB
Markdown
131 lines
4.8 KiB
Markdown
# Human-in-the-Loop: Supervisor Pattern with Approval
|
|
|
|
This example demonstrates the **Supervisor** multi-agent pattern combined with the **Approval** human-in-the-loop pattern.
|
|
|
|
It showcases how to build a hierarchical multi-agent system where a supervisor coordinates specialized sub-agents, and sensitive operations (like fund transfers) require explicit user approval before execution.
|
|
|
|
## How It Works
|
|
|
|
1. **Supervisor Architecture**: A financial advisor supervisor manages two specialized sub-agents:
|
|
- **account_agent**: Handles account-related queries like checking balances
|
|
- **transaction_agent**: Handles financial transactions like fund transfers
|
|
|
|
2. **Approvable Tool**: The `transaction_agent` has a `transfer_funds` tool wrapped in `InvokableApprovableTool`. This ensures that before any fund transfer is executed, the user must explicitly approve it.
|
|
|
|
3. **Workflow**:
|
|
- User requests an action (e.g., "Check balance and transfer $500")
|
|
- Supervisor delegates to `account_agent` for balance check
|
|
- Supervisor delegates to `transaction_agent` for the transfer
|
|
- When `transfer_funds` is called, an **interrupt** is triggered
|
|
- User approves or denies the transaction
|
|
- Agent resumes and completes (or cancels) the operation
|
|
|
|
4. **Targeted Resume**: After user input, `runner.ResumeWithParams` is called with the approval result, allowing the agent to continue execution.
|
|
|
|
## Practical Example
|
|
|
|
Here's what the approval flow looks like:
|
|
|
|
```
|
|
========================================
|
|
User Query: Check my checking account balance, and then transfer $500 from checking to savings account.
|
|
========================================
|
|
|
|
name: financial_supervisor
|
|
path: [{financial_supervisor}]
|
|
action: transfer to account_agent
|
|
|
|
name: account_agent
|
|
path: [{financial_supervisor} {account_agent}]
|
|
tool name: check_balance
|
|
arguments: {"account_id":"checking"}
|
|
|
|
name: account_agent
|
|
path: [{financial_supervisor} {account_agent}]
|
|
tool response: {"account_id":"checking","balance":5000,"currency":"USD"}
|
|
|
|
name: financial_supervisor
|
|
path: [{financial_supervisor}]
|
|
action: transfer to transaction_agent
|
|
|
|
name: transaction_agent
|
|
path: [{financial_supervisor} {transaction_agent}]
|
|
tool name: transfer_funds
|
|
arguments: {"from_account":"checking","to_account":"savings","amount":500,"currency":"USD"}
|
|
|
|
========================================
|
|
APPROVAL REQUIRED
|
|
========================================
|
|
tool 'transfer_funds' interrupted with arguments '{"from_account":"checking","to_account":"savings","amount":500,"currency":"USD"}', waiting for your approval, please answer with Y/N
|
|
|
|
Approve this transaction? (Y/N): Y
|
|
|
|
========================================
|
|
Resuming execution...
|
|
========================================
|
|
|
|
name: transaction_agent
|
|
path: [{financial_supervisor} {transaction_agent}]
|
|
tool response: {"transaction_id":"TXN-2025-001234","status":"completed",...}
|
|
```
|
|
|
|
This trace demonstrates:
|
|
- **Hierarchical Delegation**: Supervisor routes tasks to appropriate sub-agents
|
|
- **Balance Check**: Account agent retrieves balance without approval
|
|
- **Approval Required**: Transfer operation triggers an interrupt for user confirmation
|
|
- **Targeted Resume**: After approval, the transaction completes
|
|
|
|
## 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/5_supervisor
|
|
```
|
|
|
|
You will see the supervisor coordinating between agents, and when a fund transfer is attempted, you'll be prompted to approve or deny the transaction.
|
|
|
|
## Workflow Diagram
|
|
|
|
```mermaid
|
|
graph TD
|
|
A[User Request] --> B{Financial Supervisor};
|
|
B --> C[Delegate to account_agent];
|
|
C --> D[Check Balance];
|
|
D --> E[Return Balance];
|
|
E --> B;
|
|
B --> F[Delegate to transaction_agent];
|
|
F --> G{transfer_funds Tool};
|
|
G --> H[Interrupt: Approval Required];
|
|
H --> I{User Input};
|
|
I -- "Y (Approve)" --> J[Resume: Approved];
|
|
J --> K[Transfer Executed];
|
|
K --> L[Final Response];
|
|
I -- "N (Deny)" --> M[Resume: Denied];
|
|
M --> N[Transfer Cancelled];
|
|
N --> L;
|
|
```
|