Human in the loop (HITL) により、ツール呼び出しを実行する前後にユーザからの入力を取得できます。
Agno : ユーザガイド : コンセプト : ツール – Human in the loop
作成 : クラスキャット・セールスインフォメーション
作成日時 : 07/31/2025
バージョン : Agno 1.7.5
* 本記事は docs.agno.com の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています :
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
クラスキャット 人工知能 研究開発支援サービス ⭐️ リニューアルしました 😉
◆ お問合せ : 下記までお願いします。
- クラスキャット セールス・インフォメーション
- sales-info@classcat.com
- ClassCatJP
Agno ユーザガイド : コンセプト : ツール – Human in the loop
Human in the loop (HITL) により、ツール呼び出しを実行する前後にユーザからの入力を取得できます。
以下の例は、ツールフックを使用して、ツール呼び出しを実行する前にユーザの確認を得る方法を示しています。
例 : ツールフックを使用した Human in the loop
この例は以下を行なう方法を示します :
- ユーザの確認のためにツールにフックを追加する。
- ツール実行中にユーザ入力を処理する。
- ユーザの選択に基づいて操作を適切にキャンセルする。
hitl.py
"""🤝 Human-in-the-Loop: Adding User Confirmation to Tool Calls
This example shows how to implement human-in-the-loop functionality in your Agno tools.
It shows how to:
- Add tool hooks to tools for user confirmation
- Handle user input during tool execution
- Gracefully cancel operations based on user choice
Some practical applications:
- Confirming sensitive operations before execution
- Reviewing API calls before they're made
- Validating data transformations
- Approving automated actions in critical systems
Run `pip install openai httpx rich agno` to install dependencies.
"""
import json
from typing import Any, Callable, Dict, Iterator
import httpx
from agno.agent import Agent
from agno.exceptions import StopAgentRun
from agno.models.openai import OpenAIChat
from agno.tools import FunctionCall, tool
from rich.console import Console
from rich.pretty import pprint
from rich.prompt import Prompt
# This is the console instance used by the print_response method
# We can use this to stop and restart the live display and ask for user confirmation
console = Console()
def confirmation_hook(
function_name: str, function_call: Callable, arguments: Dict[str, Any]
):
# Get the live display instance from the console
live = console._live
# Stop the live display temporarily so we can ask for user confirmation
live.stop() # type: ignore
# Ask for confirmation
console.print(f"\nAbout to run [bold blue]{function_name}[/]")
message = (
Prompt.ask("Do you want to continue?", choices=["y", "n"], default="y")
.strip()
.lower()
)
# Restart the live display
live.start() # type: ignore
# If the user does not want to continue, raise a StopExecution exception
if message != "y":
raise StopAgentRun(
"Tool call cancelled by user",
agent_message="Stopping execution as permission was not granted.",
)
# Call the function
result = function_call(**arguments)
# Optionally transform the result
return result
@tool(tool_hooks=[confirmation_hook])
def get_top_hackernews_stories(num_stories: int) -> Iterator[str]:
"""Fetch top stories from Hacker News.
Args:
num_stories (int): Number of stories to retrieve
Returns:
str: JSON string containing story details
"""
# Fetch top story IDs
response = httpx.get("https://hacker-news.firebaseio.com/v0/topstories.json")
story_ids = response.json()
# Yield story details
final_stories = []
for story_id in story_ids[:num_stories]:
story_response = httpx.get(
f"https://hacker-news.firebaseio.com/v0/item/{story_id}.json"
)
story = story_response.json()
if "text" in story:
story.pop("text", None)
final_stories.append(story)
return json.dumps(final_stories)
# Initialize the agent with a tech-savvy personality and clear instructions
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
tools=[get_top_hackernews_stories],
markdown=True,
)
agent.print_response(
"Fetch the top 2 hackernews stories?", stream=True, console=console
)
以上