CrewAI Tools 連携:Agent を「調べる・読む・実行する」状態にする
2 min read
Tool がない Agent は、理論は語れるのにキーボードがないエンジニアのようなものです。
話せるけど作れない。
よく使う組み込み Tool
SerperDevTool:Web 検索FileReadTool:ファイル読み取りFileWriterTool:ファイル書き込みScrapeWebsiteTool:Web ページ取得
Agent に Tool を付ける
from crewai import Agent
from crewai_tools import SerperDevTool
search_tool = SerperDevTool()
researcher = Agent(
role="Researcher",
goal="Find trustworthy sources about the topic",
backstory="You validate facts before writing.",
tools=[search_tool],
allow_delegation=False,
verbose=True,
)💡 同じ
search_toolは複数 Agent で共用できます。毎回作り直す必要はありません(DRY)。
カスタム Tool の最小テンプレート
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
class QueryInput(BaseModel):
keyword: str = Field(description="Search keyword")
class KeywordTool(BaseTool):
name: str = "Keyword Tool"
description: str = "Return a short explanation for a keyword."
args_schema: type[BaseModel] = QueryInput
def _run(self, keyword: str) -> str:
return f"Result for: {keyword}"Tool 設計の 4 原則
- 1 つのことだけやる:検索 Tool がついでに書き込みしない
- 説明を明確にする:
descriptionに用途と入力を明記 - 入力を検証する:Pydantic で制約
- 返却形式を安定させる:後続 Task で扱いやすくする
よくあるエラー
| 現象 | 原因 | 修正 |
|---|---|---|
| Tool が呼ばれない | Task 側に使用条件がない | Task 指示に「先に Tool を使う」を明記 |
| 引数が崩れる | args schema が曖昧 | Field(description=...) を追加 |
| 返却が使いづらい | 自由文が散らかる | 定型段落か JSON 文字列で返す |
次へ
Tool の次は「出力の一貫性」です。
次回は Pydantic で出力を構造化します。
👉 構造化出力 Pydantic