はじめに
こんばんは、mirukyです。
「AIエージェントを作りたい。でもフレームワークが複雑すぎる。」
LangChain、CrewAI、AutoGen——AIエージェントフレームワークは数多くありますが、どれも学習コストが高く、設定ファイルやワークフロー定義に追われがちです。
2025年5月、AWSはその問題に対する答えをオープンソースで公開しました。Strands Agents SDK です。
Kiro CLI / Kiro IDE / Amazon Q Developerの内部で実際に使われているこのSDKは、「モデル駆動」 という哲学のもと、わずか数行のPythonコードでAIエージェントを構築できます。累計1,400万回以上ダウンロードされ、GitHubスター数は5,300+、コントリビューター114名——AWSが本気で育てているOSSです。
本記事では、Strands Agents SDKの全貌を徹底解説します。基本概念からマルチエージェント構築、本番デプロイ、そしてLangChain / CrewAIとの比較まで、このフレームワークを使い倒すために必要な情報をすべてまとめました。
目次
- Strands Agents SDKとは
- セットアップ
- 基本的なエージェントの作成
- ツール — エージェントの「手足」
- モデルプロバイダー
- マルチエージェントシステム
- セーフティとガードレール
- オブザーバビリティと評価
- 本番デプロイ
- Strands Labs — 実験的プロジェクト
- LangChain / CrewAI との比較
- おわりに
1. Strands Agents SDKとは
1-1. 生まれた背景 — Amazon Q Developerでの教訓
Strands Agents SDKは、AWSの社内ニーズから生まれました。
AWS公式ブログ(Arron Bailiss, Principal Engineer)によると、Amazon Q Developer や Kiro の開発チームは当初、従来のオーケストレーションフレームワークを使ってAIエージェントを構築していました。しかし、プロダクト要件やユーザー行動の変化に対応するために、膨大なサイエンスとエンジニアリングの工数が必要でした。
MLルーターやクラシファイアは「申し訳ありませんが、その質問にはお答えできません」といった静的なテキストを返すだけで、代替案を提示したり、インテリジェントに感じるインタラクティブな対話はできませんでした。
転機は、「モデル自体がオーケストレーターになれる」 という気づきでした。
モデル駆動アプローチに切り替えたところ、システムは動的に変化する要件に対応し、何を投げられても一貫性のある応答を返すようになりました。以前は開発に数ヶ月かかっていたものが、数週間で完成するようになったのです。
この哲学をオープンソースSDKとして形にしたのが、Strands Agents SDKです。
1-2. 「モデル駆動」とは何か
従来のフレームワークと Strands の根本的な違いは、「誰がオーケストレーションを行うか」 です。
| アプローチ | 説明 | 例 |
|---|---|---|
| フレームワーク駆動(従来) | 開発者がステートマシン、ワークフロー、分岐ロジックを定義。モデルは指示に従うだけ | LangGraph, CrewAI |
| モデル駆動(Strands) | モデル自身が推論し、ツール選択、タスク分解、エラーリカバリを自律的に決定 | Strands Agents |
モデル駆動の利点は明確です。
- 予期しない状況への対応: API呼び出しが失敗しても、モデルが代替手段を推論する
- 要件変更への耐性: コードを書き換えなくても、ツールやプロンプトの変更だけで対応可能
- シンプルなコード: ワークフロー定義やステートマシンが不要。エージェントの定義が数行で済む
1-3. Kiro / Amazon Q Developerとの関係
Strands Agents SDKは、AWSのAI開発ツール群の基盤フレームワークです。
| プロダクト | Strands SDKの使われ方 |
|---|---|
| Kiro CLI | エージェントループ、ツール実行、マルチエージェント機能の基盤 |
| Kiro IDE | AI支援コーディング、Spec駆動開発のエージェント基盤 |
| Amazon Q Developer | チャット、エージェントコーディング、セキュリティスキャンの基盤 |
| AWS Glue | データパイプラインのAI支援 |
つまり、AWSのAI製品群が実際のプロダクション環境で使っているフレームワークが、そのままオープンソースとして公開されています。
1-4. プロジェクト概要
| 項目 | 詳細 |
|---|---|
| リポジトリ | strands-agents/sdk-python |
| 言語 | Python(プロダクション対応)、TypeScript(実験的) |
| ライセンス | Apache License 2.0 |
| 初回OSS公開 | 2025年5月 |
| 最新バージョン | v1.31.0(2026年3月20日時点) |
| リリース回数 | 48回 |
| GitHub Stars | 5,300+ |
| Forks | 723 |
| コントリビューター | 114名 |
| 総ダウンロード数 | 1,400万回以上 |
| 対応Python | 3.10+ |
2. セットアップ
2-1. インストール
# 仮想環境を作成・有効化
python -m venv .venv
source .venv/bin/activate # Windowsの場合: .venv\Scripts\activate
# Strands SDKとコミュニティツールをインストール
pip install strands-agents strands-agents-tools
特定のモデルプロバイダーを使う場合は、オプション依存関係を追加インストールします。
# 特定のプロバイダーをインストール
pip install 'strands-agents[bedrock]'
pip install 'strands-agents[openai]'
pip install 'strands-agents[anthropic]'
# すべてのプロバイダーをまとめてインストール
pip install 'strands-agents[all]'
2-2. モデルプロバイダーの設定
デフォルトでは Amazon Bedrock(Claude Sonnet 4、us-west-2リージョン)が使用されます。AWSクレデンシャルが設定済みであれば、追加設定なしで動作します。
# AWS CLIが設定済みであればそのまま使える
aws configure list
# または環境変数で設定
export AWS_ACCESS_KEY_ID=your_key
export AWS_SECRET_ACCESS_KEY=your_secret
export AWS_DEFAULT_REGION=us-west-2
Bedrockのモデルアクセスを有効化する必要があります
AWSマネジメントコンソールの Amazon Bedrock → モデルアクセス から、使用するモデル(Claude Sonnet 4など)へのアクセスをリクエストしてください。
3. 基本的なエージェントの作成
3-1. 最小構成のエージェント
Strands Agents SDKの最大の魅力は、たった3行でエージェントが作れることです。
from strands import Agent
from strands_tools import calculator
agent = Agent(tools=[calculator])
agent("1764の平方根を求めてください")
これだけで、エージェントは以下のことを自律的に行います。
- ユーザーの質問を理解する
-
calculatorツールを使うべきだと判断する - ツールを実行し、結果を取得する
- 結果をもとに自然な回答を生成する
3-2. エージェントループの仕組み
Strands の核心はエージェントループです。ReAct(Reasoning and Acting)パラダイムに基づき、以下のサイクルを繰り返します。
入力 → 推論(LLM) → ツール選択 → ツール実行 → 推論(LLM) → ... → 応答
各イテレーションで会話履歴にコンテキストが蓄積され、モデルは元のリクエストだけでなく、これまでに呼び出したすべてのツールとその結果を参照して次のアクションを決定します。
ループの終了条件(Stop Reasons):
| 終了理由 | 説明 |
|---|---|
end_turn |
モデルが最終応答を生成。正常終了 |
tool_use |
ツール実行が必要。ループ継続 |
cancelled |
agent.cancel() による外部キャンセル |
max_tokens |
トークン上限に到達。エラー終了 |
stop_sequence |
設定されたストップシーケンスに到達。正常終了 |
content_filtered |
セーフティメカニズムが応答をブロック |
guardrail_intervened |
ガードレールポリシーが生成を停止 |
3-3. システムプロンプトとカスタマイズ
from strands import Agent
from strands_tools import file_read, shell, calculator
agent = Agent(
system_prompt="""
あなたはPythonバックエンド開発の専門家です。
以下のルールに従ってください:
- 型ヒントを必ず付与する
- docstringはGoogle Styleで記述する
- テストはpytestを使用する
""",
tools=[file_read, shell, calculator]
)
agent("FastAPIでユーザー認証APIのスケルトンを作成してください")
3-4. 会話管理
長い会話ではコンテキストウィンドウが枯渇するリスクがあります。Strands は複数の会話管理戦略を提供しています。
| 戦略 | 説明 | Python | TypeScript |
|---|---|---|---|
| Null Manager | 管理なし(履歴をそのまま保持) | ◎ | ◎ |
| Sliding Window | 最新のメッセージのみ保持、古いものを破棄 | ◎ | ◎ |
| Summarizing | 長い会話を要約して圧縮 | ◎ | - |
3-5. 構造化出力
エージェントの出力を Pydantic モデルなどの型付きオブジェクトとして受け取ることもできます。
from pydantic import BaseModel
from strands import Agent
class CodeReview(BaseModel):
file_name: str
issues: list[str]
severity: str
suggestion: str
agent = Agent(
system_prompt="あなたはコードレビューの専門家です。"
)
# 構造化出力で結果を受け取る
result = agent.structured_output(
CodeReview,
"以下のコードをレビューしてください: def add(a,b): return a+b"
)
print(result.issues)
print(result.severity)
4. ツール — エージェントの「手足」
4-1. ツールの概要
ツールは、エージェントがテキスト生成を超えたアクションを実行するための仕組みです。ファイル操作、API呼び出し、シェルコマンド実行など、現実世界と対話する手段を提供します。
Strands では、主に3つの方法でツールを用意できます。
| 種類 | 説明 |
|---|---|
| カスタムツール |
@tool デコレータで自作する関数ベースのツール |
| コミュニティツール |
strands-agents-tools パッケージの30以上のプリビルトツール |
| MCPツール | Model Context Protocol サーバー経由で外部ツールを接続 |
4-2. @tool デコレータでカスタムツールを作る
from strands import Agent, tool
@tool
def get_weather(location: str) -> str:
"""指定された場所の天気情報を取得します。
Args:
location: 都市名または地域名
"""
# 実際にはAPIを呼び出す
return f"{location}の天気: 晴れ、25°C"
@tool
async def call_external_api() -> str:
"""外部APIを非同期で呼び出します。
Strandsは非同期ツールを自動的に並行実行します。
"""
import asyncio
await asyncio.sleep(1) # APIコール
return "API結果"
agent = Agent(tools=[get_weather, call_external_api])
agent("東京の天気を教えてください")
ポイントは docstring がそのままツールの説明になる ことです。モデルはこの説明を読んで、いつ・どのようにツールを使うかを判断します。質の高い docstring を書くことが、エージェントの性能に直結します。
4-3. コミュニティツールパッケージ
strands-agents-tools には、すぐに使える30以上のプリビルトツールが含まれています。
| カテゴリ | ツール | 説明 |
|---|---|---|
| ファイル操作 |
file_read, file_write, editor
|
ファイルの読み書き、行編集 |
| シェル |
shell, environment, cron
|
シェルコマンド実行、環境変数管理 |
| コード実行 |
python_repl, code_interpreter
|
Pythonコード実行、サンドボックス実行 |
| Web |
http_request, browser, slack, rss
|
API呼び出し、ブラウザ自動化 |
| RAG/メモリ |
retrieve, memory, mem0_memory
|
Bedrock Knowledge Bases、エージェント記憶 |
| マルチモーダル |
image_reader, generate_image, nova_reels, speak
|
画像生成・分析、動画生成、音声合成 |
| AWS | use_aws |
AWSサービスとの対話 |
| エージェント |
graph, swarm, use_agent, think, workflow
|
マルチエージェント、ワークフロー |
| ユーティリティ |
calculator, current_time, diagram
|
計算、時刻取得、図表生成 |
from strands import Agent
from strands_tools import shell, file_read, file_write, editor
# 開発支援エージェント
dev_agent = Agent(
system_prompt="あなたはフルスタック開発者です。",
tools=[shell, file_read, file_write, editor]
)
dev_agent("プロジェクトの構造を分析して、READMEを作成してください")
4-4. ツールの直接呼び出し
自然言語経由ではなく、プログラムから直接ツールを呼び出すことも可能です。
# 自然言語でツールを呼び出す(モデルが判断)
agent("このファイルの内容を読んでください: /path/to/file.txt")
# プログラムから直接ツールを呼び出す(モデルを介さない)
result = agent.tool.file_read(path="/path/to/file.txt", mode="view")
直接呼び出しではキーワード引数のみ使用可能
agent.tool.file_read("/path/to/file.txt", "view") のような位置引数はサポートされていません。必ず path=... のようにキーワード引数を使用してください。
4-5. ツール実行の並行/逐次制御
モデルが複数のツールリクエストを返した場合、デフォルトでは並行実行されます。順序が重要な場合は逐次実行に切り替えられます。
from strands import Agent
from strands.tools.executors import SequentialToolExecutor
# 並行実行(デフォルト)
agent = Agent(tools=[weather_tool, time_tool])
# 逐次実行(順序が重要な場合)
agent = Agent(
tool_executor=SequentialToolExecutor(),
tools=[screenshot_tool, email_tool]
)
4-6. ツールのホットリロード
開発中に便利な機能として、./tools/ ディレクトリに置いたツールが自動的にロード・リロードされます。ツールのコードを変更すると、エージェントは自動的に最新版を使用します。
from strands import Agent
# ./tools/ ディレクトリのツールを自動ロード(デフォルトは無効)
agent = Agent(load_tools_from_directory=True)
ツールのホットリロードはセキュリティに注意
./tools/ ディレクトリに置かれたすべてのPythonファイルがエージェントによって自動実行されます。信頼できるコードのみを配置してください。
4-7. MCP連携
Strands は Model Context Protocol(MCP) をネイティブサポートしています。MCP サーバー経由で数千のプリビルトツールにアクセス可能です。
from strands import Agent
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters
# AWS公式ドキュメントMCPサーバーを接続
aws_docs_client = MCPClient(
lambda: stdio_client(
StdioServerParameters(
command="uvx",
args=["awslabs.aws-documentation-mcp-server@latest"]
)
)
)
with aws_docs_client:
agent = Agent(tools=aws_docs_client.list_tools_sync())
agent("Amazon Bedrockの使い方をPythonで教えてください")
SSE方式のMCPサーバーにも対応しています。
from mcp.client.sse import sse_client
from strands.tools.mcp import MCPClient
sse_mcp_client = MCPClient(
lambda: sse_client("http://localhost:8000/sse")
)
with sse_mcp_client:
tools = sse_mcp_client.list_tools_sync()
agent = Agent(tools=tools)
agent("144の平方根を計算してください")
5. モデルプロバイダー
5-1. 対応プロバイダー一覧
Strands Agents SDK の大きな強みは、モデルプロバイダーに依存しないことです。コードを変更せずにプロバイダーを切り替えられます。
公式サポート:
| プロバイダー | Python | TypeScript |
|---|---|---|
| Amazon Bedrock | ◎ | ◎ |
| Amazon Nova | ◎ | - |
| Anthropic | ◎ | - |
| Gemini | ◎ | ◎ |
| OpenAI | ◎ | ◎ |
| Ollama | ◎ | - |
| LiteLLM | ◎ | - |
| llama.cpp | ◎ | - |
| LlamaAPI | ◎ | - |
| MistralAI | ◎ | - |
| Cohere | ◎ | - |
| SageMaker | ◎ | - |
| Writer | ◎ | - |
| OpenAI Responses API | ◎ | - |
| カスタムプロバイダー | ◎ | ◎ |
コミュニティプロバイダー(Python):
CLOVA Studio、Fireworks AI、MLX、Nebius、NVIDIA NIM、SGLang、vLLM、xAI
5-2. プロバイダーの切り替え
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands.models.openai import OpenAIModel
from strands.models.ollama import OllamaModel
# Amazon Bedrock(デフォルト)
bedrock_model = BedrockModel(
model_id="anthropic.claude-sonnet-4-20250514-v1:0"
)
agent = Agent(model=bedrock_model)
agent("こんにちは")
# OpenAI に切り替え(モデルを差し替えるだけ)
openai_model = OpenAIModel(
client_args={"api_key": "YOUR_API_KEY"},
model_id="gpt-4o"
)
agent = Agent(model=openai_model)
agent("こんにちは")
# ローカルLLMも使える(Ollama)
ollama_model = OllamaModel(
host="http://localhost:11434",
model_id="llama3"
)
agent = Agent(model=ollama_model)
agent("こんにちは")
ローカルLLMでも動く — これが地味にすごい
Ollama や llama.cpp を使えば、クラウドへの通信なしに完全ローカルでエージェントを動かせます。機密データを扱うユースケースや、オフライン環境での開発に最適です。
6. マルチエージェントシステム
Strands Agents SDK は、複数のエージェントを協調させる4つのパターンを提供しています。用途に応じて使い分けましょう。
| パターン | 特徴 | 適したユースケース |
|---|---|---|
| Agents-as-Tools | 階層型。メインエージェントがサブエージェントをツールとして呼ぶ | 明確な専門分野がある場合 |
| Swarm | 自律協調型。エージェント同士が自発的にハンドオフ | 探索的・創造的タスク |
| Graph | ワークフロー型。DAGまたは循環グラフで実行順序を定義 | コンプライアンス、パイプライン |
| A2A(Agent-to-Agent) | リモート分散型。異なるサービスのエージェント間で通信 | マイクロサービス連携 |
6-1. Agents-as-Tools — 階層型マルチエージェント
最もシンプルなパターンです。専門エージェントを @tool として定義し、オーケストレーターエージェントから呼び出します。
from strands import Agent, tool
@tool
def research_analyst(request: str) -> str:
"""市場分析の専門家。リサーチとデータ分析を行います。"""
research_agent = Agent(
system_prompt="あなたはリサーチの専門家です。データを収集・分析します。",
tools=[web_search, calculator]
)
return str(research_agent(request))
@tool
def travel_advisor(request: str) -> str:
"""旅行プランニングの専門家。ロジスティクスと推薦を行います。"""
travel_agent = Agent(
system_prompt="あなたは旅行プランニングの専門家です。",
tools=[flight_search, hotel_search]
)
return str(travel_agent(request))
# オーケストレーターが専門家に委任
executive_assistant = Agent(
system_prompt="あなたは専門家と連携して包括的な支援を提供します。",
tools=[research_analyst, travel_advisor]
)
executive_assistant("東京への出張を計画し、市場調査もしてください")
6-2. Swarm — 自律協調型
Swarm は、エージェントが共有コンテキストを持ちながら、自律的にタスクをハンドオフし合うパターンです。誰がいつ何をするかは、エージェント自身が判断します。
from strands import Agent
from strands.multiagent import Swarm
# 専門エージェントを作成
researcher = Agent(
name="researcher",
system_prompt="あなたはリサーチの専門家です。"
)
analyst = Agent(
name="analyst",
system_prompt="あなたはデータ分析の専門家です。"
)
writer = Agent(
name="writer",
system_prompt="あなたはテクニカルライターです。"
)
# Swarmを作成
market_research_team = Swarm(
[researcher, analyst, writer],
entry_point=researcher, # researcherからスタート
max_handoffs=20, # 最大ハンドオフ回数
max_iterations=20, # 最大イテレーション数
execution_timeout=900.0, # 15分タイムアウト
node_timeout=300.0 # 各エージェント5分タイムアウト
)
# Swarmを実行
result = market_research_team(
"AIがヘルスケアに与える影響を調査し、レポートを作成してください"
)
print(f"ステータス: {result.status}")
print(f"実行履歴: {[node.node_id for node in result.node_history]}")
Swarm では、researcher が情報を集め → analyst に「パターンが見つかった」とハンドオフ → analyst が深掘りして → writer に渡す、といった流れが自律的に発生します。
6-3. Graph — 構造化ワークフロー
Graph は、ノード(エージェント)とエッジ(依存関係)で実行順序を明示的に定義するパターンです。コンプライアンス要件やパイプライン処理に適しています。
from strands import Agent
from strands.multiagent import GraphBuilder
# 専門エージェントを作成
researcher = Agent(name="researcher", system_prompt="リサーチの専門家。")
analyst = Agent(name="analyst", system_prompt="データ分析の専門家。")
fact_checker = Agent(name="fact_checker", system_prompt="ファクトチェックの専門家。")
report_writer = Agent(name="report_writer", system_prompt="レポート作成の専門家。")
# グラフを構築
builder = GraphBuilder()
builder.add_node(researcher, "research")
builder.add_node(analyst, "analysis")
builder.add_node(fact_checker, "fact_check")
builder.add_node(report_writer, "report")
# エッジ(依存関係)を定義
builder.add_edge("research", "analysis") # research → analysis
builder.add_edge("research", "fact_check") # research → fact_check(並列)
builder.add_edge("analysis", "report") # analysis → report
builder.add_edge("fact_check", "report") # fact_check → report
# 実行制限を設定
builder.set_execution_timeout(600) # 10分タイムアウト
builder.set_entry_point("research")
graph = builder.build()
# グラフを実行
result = graph("AIのヘルスケアへの影響を調査し、包括的なレポートを作成してください")
# 結果を確認
print(f"ステータス: {result.status}")
print(f"実行順序: {[node.node_id for node in result.execution_order]}")
print(f"合計ノード数: {result.total_nodes}")
print(f"実行時間: {result.execution_time}ms")
Graph の特徴的な機能:
| 機能 | 説明 |
|---|---|
| 条件付きエッジ | 前のノードの結果に応じて次のパスを動的に選択 |
| 循環グラフ | フィードバックループ(レビュー → 修正 → 再レビュー)に対応 |
| ネスト | Graph の中に Swarm を配置、Swarm の中に Graph を配置可能 |
| カスタムノード | LLMを使わない決定論的な処理ノードも追加可能 |
| マルチモーダル | テキストと画像を混在した入力に対応 |
フィードバックループの例:
def needs_revision(state):
review_result = state.results.get("reviewer")
if not review_result:
return False
return "revision needed" in str(review_result.result).lower()
def is_approved(state):
review_result = state.results.get("reviewer")
if not review_result:
return False
return "approved" in str(review_result.result).lower()
builder = GraphBuilder()
builder.add_node(draft_writer, "draft_writer")
builder.add_node(reviewer, "reviewer")
builder.add_node(publisher, "publisher")
builder.add_edge("draft_writer", "reviewer")
builder.add_edge("reviewer", "draft_writer", condition=needs_revision) # 差し戻し
builder.add_edge("reviewer", "publisher", condition=is_approved) # 承認
# 無限ループ防止
builder.set_max_node_executions(10)
builder.set_execution_timeout(300)
builder.reset_on_revisit(True)
graph = builder.build()
6-4. A2A — Agent-to-Agent プロトコル
A2A は、異なるサービスやプラットフォーム上のエージェント間で通信するためのオープンプロトコルです。Strands エージェントをA2Aサーバーとして公開し、リモートから利用できます。
サーバー側:
from strands import Agent
from strands.multiagent.a2a import A2AServer
from strands_tools.calculator import calculator
# エージェントを作成
agent = Agent(
name="Calculator Agent",
description="基本的な算術演算を行う計算エージェント。",
tools=[calculator],
callback_handler=None
)
# A2AサーバーとしてPORT 9000で公開
a2a_server = A2AServer(agent=agent)
a2a_server.serve()
クライアント側:
from strands.agent.a2a_agent import A2AAgent
# リモートA2Aエージェントに接続
a2a_agent = A2AAgent(endpoint="http://localhost:9000")
# ローカルエージェントと同じように呼び出せる
result = a2a_agent("10 ^ 6 を計算してください")
print(result.message)
A2AAgent は Graph のノードとしても使えるため、ローカルエージェントとリモートエージェントを混在させた分散ワークフローを構築できます。
Graph + A2A = 分散マルチエージェントシステム
ローカルのデータ準備エージェント → リモートのMLサービス → リモートのNLPサービス → ローカルのレポートライター、というような分散アーキテクチャが簡単に構築できます。
7. セーフティとガードレール
7-1. ガードレール連携
Strands は Amazon Bedrock Guardrails とネイティブに統合されています。有害コンテンツのフィルタリング、PII保護、トピック制限などを設定できます。
from strands import Agent
from strands.models import BedrockModel
bedrock_model = BedrockModel(
model_id="global.anthropic.claude-sonnet-4-5-20250929-v1:0",
guardrail_id="your-guardrail-id",
guardrail_version="1",
guardrail_trace="enabled",
)
agent = Agent(
system_prompt="あなたは親切なアシスタントです。",
model=bedrock_model,
)
response = agent("金融計画について教えてください")
if response.stop_reason == "guardrail_intervened":
print("ガードレールによりコンテンツがブロックされました")
7-2. ツールの同意メカニズム
コミュニティツールでは、ファイル変更やシェルコマンドなど潜在的にリスクのある操作を実行する前に、ユーザー確認が求められます。
import os
# 自動化パイプラインではツール同意をバイパス可能
os.environ["BYPASS_TOOL_CONSENT"] = "true"
本番環境での BYPASS_TOOL_CONSENT は慎重に
この設定は重要なセーフティチェックを無効化します。CI/CDパイプラインや開発環境でのみ使用してください。
7-3. Human-in-the-Loop
handoff_to_user ツールで、エージェントの実行を一時停止してユーザーの入力を待つことができます。
from strands import Agent
from strands_tools import handoff_to_user
agent = Agent(tools=[handoff_to_user])
# ユーザーの承認を得て続行
response = agent.tool.handoff_to_user(
message="この操作を承認しますか? 'yes' と入力してください。",
breakout_of_loop=False # 入力後にエージェントが続行
)
# 完全にユーザーに制御を移す
agent.tool.handoff_to_user(
message="タスクが完了しました。結果をご確認ください。",
breakout_of_loop=True # エージェントの実行を停止
)
7-4. PII自動検出・除去
Amazon Bedrock Guardrails の PII(個人情報)検出機能と組み合わせることで、エージェントが生成するレスポンスから住所・電話番号・メールアドレスなどを自動的にマスクできます。
8. オブザーバビリティと評価
8-1. OpenTelemetryによるトレーシング
Strands は OpenTelemetry にネイティブ対応しており、エージェントの各ステップ(モデル呼び出し、ツール実行、ハンドオフ)をトレースとして記録できます。
これにより、以下の情報を可視化できます:
| メトリクス | 説明 |
|---|---|
| トークン使用量 | 入力・出力トークン数、コスト |
| レイテンシ | モデル呼び出し、ツール実行の所要時間 |
| ツール呼び出し履歴 | どのツールが何回、どの順序で呼ばれたか |
| エラー追跡 | ツール実行エラー、ガードレール介入 |
8-2. エバリュエーション(Evals SDK)
Strands は専用の Evals SDK を提供しており、エージェントの品質を体系的に評価できます。
| 機能 | 説明 |
|---|---|
| Evaluators | LLMジャッジによるレスポンス品質の自動評価 |
| Simulators | LLM駆動の模擬ユーザーによる動的テスト |
| Experiment Generator | 評価実験の自動生成 |
| Trace Providers | リモートトレースの記録・分析 |
モデル駆動エージェントの評価で重要なのは、以下の4つの次元です:
- ツール選択の適切さ — 正しいツールを選んだか?
- 推論の質 — アプローチは論理的か?
- 適応性 — 予期しないシナリオにどう対応したか?
- 効率性 — 不要なステップなしにタスクを完了したか?
9. 本番デプロイ
9-1. デプロイ先の選択肢
Strands エージェントは、以下の環境にデプロイできます。
| デプロイ先 | 特徴 |
|---|---|
| Amazon Bedrock AgentCore | サーバーレス、セッション分離(microVM)、自動スケーリング、IDプロバイダー統合 |
| AWS Lambda | サーバーレス、イベント駆動 (New) |
| AWS Fargate | コンテナベース、長時間実行対応 |
| AWS App Runner | コンテナの簡易デプロイ |
| Amazon EKS | Kubernetes、大規模運用 |
| Amazon EC2 | フルコントロール |
| Docker | ポータブルなコンテナ |
| Kubernetes | クラウド非依存のオーケストレーション |
| Terraform | IaCによるインフラ管理 |
9-2. Amazon Bedrock AgentCore Runtime
AgentCore Runtime は、Strands エージェントの本番運用に最適なデプロイ先です。
| 特徴 | 説明 |
|---|---|
| セッション分離 | 各ユーザーセッションが専用のmicroVMで実行。センシティブデータの漏洩を防止 |
| 自動スケーリング | 数千のエージェントセッションを数秒でスケールアップ |
| 認証統合 | Amazon Cognito, Microsoft Entra ID, Okta, Google, GitHub に対応 |
| フレームワーク非依存 | Strands だけでなく、LangChain, LangGraph, CrewAI もデプロイ可能 |
| プロトコル対応 | MCP, A2A をネイティブサポート |
| 使った分だけ課金 | インフラ管理不要 |
# AgentCoreへのデプロイ(Python 3.10+が必要)
pip install 'strands-agents[bedrock]'
AgentCore は Strands 以外のフレームワークもサポート
LangChain、LangGraph、CrewAI で構築したエージェントも AgentCore Runtime にデプロイ可能です。フレームワークの移行先が変わっても、デプロイ環境はそのまま使えます。
10. Strands Labs — 実験的プロジェクト
2026年2月、AWSは Strands Labs を発表しました。Strands SDK の実験的・先端的なプロジェクトを集めた GitHub organization です。
10-1. Robots — AIエージェントでロボットを制御
AIエージェントが物理ロボットを制御するためのフレームワークです。NVIDIA GR00T VLAモデルや Hugging Face LeRobot と統合し、エッジデバイス上でも動作します。
from strands import Agent
from strands_robots import Robot
# SO-101ロボットアームをカメラ付きで構成
robot = Robot(
tool_name="my_arm",
robot="so101_follower",
cameras={
"front": {"type": "opencv", "index_or_path": "/dev/video0", "fps": 30},
"wrist": {"type": "opencv", "index_or_path": "/dev/video2", "fps": 30}
},
port="/dev/ttyACM0",
data_config="so100_dualcam"
)
# ロボットをエージェントのツールとして登録
agent = Agent(tools=[robot])
agent("りんごをかごに入れてください")
自然言語でロボットに指示を出す。SFのような話ですが、Strands Labsではすでに動くデモが公開されています。
10-2. Robots Sim — シミュレーション環境
物理ハードウェアなしでロボットエージェントをプロトタイプ・テストできるシミュレーション環境です。NVIDIA GR00T VLAポリシーをサポートし、3D物理シミュレーション上でエージェントの動作を検証できます。
10-3. AI Functions — 自然言語で関数を定義
@ai_function デコレータで、コードの代わりに自然言語で関数仕様を記述し、LLMが実装を自動生成するという実験的アプローチです。
from ai_functions import ai_function
from pandas import DataFrame, api
def check_invoice_dataframe(df: DataFrame):
"""Post-condition: DataFrameの構造を検証"""
assert {'product_name', 'quantity', 'price', 'purchase_date'}.issubset(df.columns)
assert api.types.is_integer_dtype(df['quantity']), "quantityはint型であること"
assert api.types.is_float_dtype(df['price']), "priceはfloat型であること"
@ai_function(
code_execution_mode="local",
code_executor_additional_imports=["pandas.*", "sqlite3", "json"],
post_conditions=[check_invoice_dataframe],
)
def import_invoice(path: str) -> DataFrame:
"""
ファイル `{path}` から購入ログを抽出し、DataFrameとして返す。
カラム: product_name (str), quantity (int), price (float), purchase_date (datetime)
"""
# JSONファイルを読み込み(LLMがフォーマットを判定してパースコードを生成)
df = import_invoice('data/invoice.json')
print("請求書合計:", df['price'].sum())
開発者は**「何をしたいか」と「どう検証するか」だけ**を書き、実装はLLMに任せるというパラダイムシフトです。
11. LangChain / CrewAI との比較
11-1. フレームワーク比較表
| 項目 | Strands Agents | LangChain / LangGraph | CrewAI |
|---|---|---|---|
| 開発元 | AWS | LangChain Inc. | CrewAI Inc. |
| ライセンス | Apache 2.0 | MIT | MIT |
| 設計思想 | モデル駆動 | フレームワーク駆動 | ロール駆動 |
| 最小コード | 3行 | 数十行 | 数十行 |
| 言語 | Python, TypeScript | Python, TypeScript, Java | Python |
| モデル切替 | 1行で切替 | プロバイダーごとにコード変更 | 設定で切替 |
| マルチエージェント | 4パターン(Swarm/Graph/A2A/Agents-as-Tools) | Graph(LangGraph) | Crew(タスク定義) |
| A2Aプロトコル | ◎ ネイティブ | - | - |
| MCP対応 | ◎ ネイティブ | ◎ | ◎ |
| ガードレール | Bedrock Guardrails連携 | 独自実装 | 限定的 |
| 評価 | Evals SDK内蔵 | LangSmith(外部) | 限定的 |
| デプロイ | AgentCore + 9環境 | LangServe | - |
| Bedrock連携 | ◎ 最高レベル | ◎ | ◎ |
| 双方向ストリーミング | ◎(Nova Sonic, Gemini Live, OpenAI Realtime) | - | - |
| ロボティクス | ◎(Strands Labs) | - | - |
| GitHub Stars | 5,300+ | 130,000+(LangChain) | 46,000+ |
11-2. いつどれを選ぶべきか
| ユースケース | 推奨 | 理由 |
|---|---|---|
| AWSサービスとの深い統合 | Strands | Bedrock、AgentCoreの一級市民。AWSツールがビルトイン |
| 最速プロトタイプ | Strands | 3行でエージェントが動く。学習コスト最小 |
| 既存LangChainプロジェクト | LangChain | エコシステムが成熟。移行コストが高い |
| 複雑なステートマシン | LangGraph | 決定論的ワークフロー定義に特化 |
| ロールプレイ型マルチエージェント | CrewAI | 直感的なCrewメタファー |
| エンタープライズ本番環境 | Strands | AgentCore の microVM 分離、認証統合が強力 |
| ローカルLLM / エッジAI | Strands | Ollama, llama.cpp, ロボティクス対応 |
| リアルタイム音声エージェント | Strands | 双方向ストリーミング(Nova Sonic等) |
AgentCore はフレームワークに依存しない
Strands だけでなく、LangChain, LangGraph, CrewAI で構築したエージェントも AgentCore にデプロイ可能です。「今はLangChainを使っているが、将来Strandsに移行したい」というケースでも、デプロイ環境を変える必要はありません。
12. おわりに
ここまでお読みいただきありがとうございます。
改めて、Strands Agents SDKの強みを整理します。
① モデル駆動アプローチで、ワークフローを事前定義しなくてもモデルが自律的に判断する。コードが圧倒的にシンプル
② 3行で動く手軽さと、AgentCore + A2A + Guardrails のエンタープライズ対応が共存している
③ 15以上のモデルプロバイダーに対応し、Bedrock / OpenAI / Ollama を1行で切り替えられるベンダー非依存性
④ Kiro CLI / Amazon Q Developer で実戦投入済みのフレームワークが、そのままOSSとして使える信頼性
⑤ Strands Labs でロボティクス・AIファンクションなど、次世代のエージェンティックAIに先行投資している
一方で、GitHubスターは LangChain(130K+)や CrewAI(46K+)と比べるとまだ発展途上です。コミュニティの規模やサードパーティの統合ではまだ差があります。しかし、AWSが自社プロダクト群の基盤として使い、1,400万回ダウンロードされている実績を考えると、この差は急速に縮まるでしょう。
AWSを使っているなら、次のエージェントはStrandsで作ってみてください。
3行で始められます。
pip install strands-agents strands-agents-tools
from strands import Agent
from strands_tools import calculator
agent = Agent(tools=[calculator])
agent("42の9乗を計算してください")
ではまた、お会いしましょう。
参考リンク
Strands Agents SDK 公式
- Strands Agents SDK ドキュメント
- Strands Agents SDK — Python GitHub
- Strands Agents SDK — TypeScript GitHub
- Strands Agents Tools (コミュニティ)
- Strands Labs GitHub
- Strands Agents サンプル集
AWS公式ブログ
- Strands Agents and the Model-Driven Approach - AWS Open Source Blog
- Introducing Strands Labs - AWS Open Source Blog