Amazon Web Services ブログ

Strands Labs の紹介: エージェント開発の最先端実験的アプローチを今すぐ体験

本記事は 2026/02/23 に公開された “Introducing Strands Labs: Get hands-on today with state-of-the-art, experimental approaches to agentic development” を翻訳したものです。

私たちは、開発者がエージェンティック AI 開発のための実験的な最先端のアプローチを実際に試せるように設計された新たな Strands GitHub 組織である Strands Labs を紹介します。PythonTypeScript 両方で利用可能な Strands Agents SDK は、2025 年 5 月のオープンソースリリース以降、開発者コミュニティで大きな支持を集めています。SDK は 1400 万回以上ダウンロードされており、AWS チームは新しい機能を積極的に追加しています。これには、Steering のような実験も含まれています。これは、非常に活発な開発者コミュニティをサポートするためのものです。Strands のモデル駆動型アプローチは、プロトタイピングからエンタープライズの本番ワークロードまで、シンプルで強力かつスケーラブルであることが実証されています。Strands とモデル駆動型アプローチの詳細については、こちらをご覧ください。

私たちは、実験を通じてイノベーションを促進し、エージェンティック開発の最前線を押し進めるために、Strands Labs を別の GitHub 組織にすることを選びました。また、Amazon 全体のすべての開発チームに Strands Labs を開放しました。これは、すべてのチームが革新的なオープンソースプロジェクトに貢献し、コミュニティからの利用とフィードバックを得られます。このモデルは、Strands SDK とその本番リリースサイクルから実験を分離して、Strands の開発者コミュニティのより速い実験、学習、成長を促進します。Strands-Labs のすべてのプロジェクトは、明確なユースケース、機能的なコード、テストとともに提供される予定です。

ローンチ時に、Strands Labs は 3 つのプロジェクトで利用可能になります。最初のプロジェクトは Robots、2 番目のプロジェクトは Robots Sim、そして 3 番目のプロジェクトは AI Functions です。

  1. Robots: Robots では、AI エージェントがエッジや物理世界にどのように拡張されるかを見ていきます。ここでは、AI エージェントは情報を処理するだけでなく、私たちの周りの物理環境と相互作用します。統一された Strands Agents インターフェースを通じて、フィジカル AI エージェントは AI 機能を物理センサーやハードウェアに直接接続することで、多様なロボットを制御できます。
  2. Robots Sim: Robots Sim は、エージェンティックロボットをシミュレートされた 3D 物理学対応の世界と統合します。これにより、物理的なロボットハードウェアを必要とせず、安全なシミュレーション環境で迅速なプロトタイピングとアルゴリズム開発が可能になります。これは、エージェント戦略の反復や Vision-Language-Action(VLA)モデルポリシーのテストに最適です。また、実環境の展開前のアプローチの検証にも適しています。
  3. AI Functions: AI Functions では、開発者はコードの代わりに自然言語仕様を使用してエージェントを定義します。動作を検証し、実装を生成する事前・事後の条件は Python で書きます。この実験は、LLM でコードを生成する際の信頼ギャップを狭めることを目指しています。開発者の時間を意図の検証に集中させ、残りはフレームワークに委ねます。

これらの各プロジェクトがエージェンティック開発の最前線をどのように押し進めているかを以下で詳しく見ていきましょう。

Strands Robots

エージェンティック AI システムは急速にデジタル世界を超えてフィジカル領域に拡大しています。ここで AI エージェントは実際の環境で知覚、推論、そして行動します。AI システムがロボティクス、自律車両、スマートインフラを通じてフィジカル世界と相互作用するにつれて、基本的な疑問が浮かび上がります:物理的なセンシングやアクチュエーションに必要なミリ秒単位の応答性を維持しながら、複雑な推論のために大規模なクラウドコンピューティングを活用するエージェントを、どのように構築すればよいのでしょうか?

Strands Robots は、オーケストレーション、インテリジェンス、そしてインフラストラクチャレイヤーを提供し、個々のエッジデバイスをエージェントと連携してフィジカル AI システムへと変換します。このプロジェクトを通じて、私たちの目標は、シンプルな API、オープンソースライブラリ、そしてマネージドサービスを通じてフィジカル AI を民主化することです。

Strands Robots は、Strands Agents の機能を拡張して、AI エージェントが物理センサーやハードウェアに接続する統一的な Strands Agents インターフェースを通じて物理ロボットを制御できるようにします。また、物理的なロボットハードウェアを必要とせずに、安全なシミュレーション環境で迅速なプロトタイピングとアルゴリズム開発を可能にします。これは、エージェント戦略の反復、VLA ポリシーのテスト、実世界への展開前のアプローチ検証に最適です。

このラボデモンストレーションでは、SO-101 ロボットアームNVIDIA GR00T ビジョン言語アクションモデル(VLA)と連携して操作を処理します。VLA モデルは、単一のモデルで視覚的知覚、言語理解、そしてアクション予測を組み合わせます。GR00T はカメラ画像、ロボットの関節位置、言語命令を入力として受け取り、直接新しいターゲット関節位置を出力します。NVIDIA とのパートナーシップにより、NVIDIA GR00T を Strands Agents と統合しました。これにより、SO-101 ロボットアームを制御するデモンストレーションを NVIDIA Jetson エッジハードウェア上で実行しました。これは、高度な AI 機能が組み込みシステム上で直接実行できることを示しています。

さらに、私たちは Hugging Face の LeRobot と統合しました。これは、ロボットハードウェアの作業を容易にするデータとハードウェアインターフェースを提供します。LeRobot のようなハードウェア抽象化と VLA モデル(例:NVIDIA GR00T)を組み合わせることで、フィジカル世界で知覚、推論、行動するエッジ AI アプリケーションを作成できます。

この取り組みの一環として、ビルダーにとってこれをより簡単にするために、私たちは VLA モデル(例:NVIDIA GR00T)のようなハードウェアに接続するためのシンプルなインターフェースを備えた実験的な Robot クラスをリリースしました。例えば、SO-101 ロボットアームと NVIDIA GR00T VLA モデルを組み合わせて、リンゴをバスケットに拾って置くなどのタスクを実行するには、エッジデバイス上にエージェントをデプロイします。Strands Robot クラスは以下のように使用できます:

from strands import Agent         
from strands_robots import Robot

#カメラ付きロボットの作成
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("place the apple in the basket")

エッジデバイス上で実行される Robot クラスは、必要に応じて LLM やその他のモデルを使用してクラウドに複雑な推論を委任できます。VLA モデルは物理的なアクションに対してミリ秒レベルの制御を提供します。しかし、複数ステップのタスクの計画や過去のパターンに基づく決定の実施など、より深い推論が必要な場合は、クラウドベースのエージェントに相談できます。

Strands Robot Sim

Strands Robot Simulation は、物理的なロボットハードウェアを必要とせずにエージェンティックロボティクスの迅速なプロトタイピングのための環境を提供します。これは、Libero ベンチマーク環境、ZMQ を介した isaac-GR00T VLA ポリシーサポート、VLA プロバイダーのための拡張可能なインターフェース、MP4 ビデオとしてのシミュレーションエピソードのキャプチャ、ステータスモニタリング付きの非ブロッキングシミュレーション、依存関係不要の高速テスト、そして GR00T 推論サービス管理をサポートします。このシミュレーションプロジェクトは、最終結果を含む完全なエピソード実行と、バッチごとの視覚的フィードバック付きの反復制御の 2 つの実行モードをサポートしています。Strands Robot Simulation のモジュラー設計により、開発者はコアロジックを再構築することなく、ポリシー実装やシミュレーション環境を交換できます。制御ループはステップを順次実行し、カメラや関節センサーから観測を収集し、このデータを固定サイズのアクションホライズン内でモーターコマンドを生成するポリシーモデルに供給します。

例えば、以下の例は、strands_robots_sim から SimEnv クラスを利用して、NVIDIA GR00T によって生成されたポリシーを用いて Libero 環境内でシミュレートされたロボットを制御する方法を示しています。この例では、以下の前提条件を満たしていることを想定しています:Libero がインストールされている、GR00T 推論サービスがポート 8000 で動作している、isaac-gr00t コンテナがアクセス可能な Docker が利用可能であることです。

import asyncio
import argparse
import random
from strands import Agent
from strands_robots_sim import SimEnv, gr00t_inference

def main(max_episodes=10):
    # シミュレーション環境の作成
    sim_env = SimEnv(
	    tool_name="my_libero_sim",
		env_type="libero",
		task_suite="libero_10",
		data_config="libero_10"
	)
	# エージェントの作成
	agent = Agent(tools=[sim_env, gr00t_inference])
	
	try:
	    # GR00T 推論の開始 
		result = agent.tool.gr00t_inference(
		    action="start",
			checkpoint_path="/data/checkpoints/gr00t-n1.5-libero-long-posttrain",
			port=8000,
			data_config="examples.Libero.custom_data_config:LiberoDataConfig"
		)
		
		async def init_sim_env():
		    return await sim_env.sim_env.initialize()
			
		if not asyncio.run(init_sim_env()):
		    raise RuntimeError("シミュレーション環境の初期化に失敗しました")

		# タスクをランダムに選択
		selected_task = random.choice(sim_env.sim_env.available_tasks)

		# 環境にタスク名を設定 
		sim_env.sim_env.set_task_name(selected_task)

		# 自然言語でシミュレートされたロボットを制御 
		agent(f"'{selected_task}' タスクを {max_episodes} エピソード実行し、エピソードあたりの最大ステップ数を 500 に設定し、ビデオを記録します")

		# 最終ステータスの確認 
		final_status = agent.tool.my_libero_sim(action="status")
		print(f"最終ステータス: {final_status}")
	except Exception as e:
	    print(f"エラーで例外が発生しました: {e}")
		print("- シミュレーションの依存関係をインストール: pip install strands-robots[sim]")
				
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='GR00T ポリシーで Libero シミュレーションを実行')
	parser.add_argument('--max-episodes', type=int, default=10,
	                    help='実行する最大エピソード数 (デフォルト: 10)')
	args = parser.parse_args()
	main(max_episodes=args.max_episodes)

AI Funcions

AI Functions は、コードを書く代わりに自然言語の仕様で Python 関数を書く新しい方法を導入します。@ai_function デコレータを使用して、説明と検証条件を通じて関数に何をさせたいかを定義します。AI Functions は Strands エージェントループを活用して実装を生成し、出力を検証し、検証に失敗した場合は自動的に再試行します。不明な形式のファイルからインボイスデータを読み込むことを考えてみましょう。従来のアプローチでは、ファイル形式を決定し、各形式に対して変換ロジックを書き、プロンプトを構築し、応答を解析し、検証に失敗した場合に再試行を調整する必要があります。これには通常何十行ものコードが必要で、すべてのシナリオを考慮できない場合があります。AI Functions を使用すると、望む出力を説明する小さな関数と、成功の様子を表現するバリデータ関数を書きます。LLM がファイル形式を決定し、変換コードを書き、実際の Python DataFrame オブジェクトを返します。

from ai_functions import ai_function 
from pandas import DataFrame, api

def check_invoice_dataframe(df: DataFrame):
    """事後条件: DataFrame 構造を検証します。"""
	assert {'product_name', 'quantity', 'price', 'purchase_date'}.issubset(df.columns)
	assert api.types.is_integer_dtype(df['quantity']), "quantity は整数でなければなりません"
	assert api.types.is_float_dtype(df['price']), "price は浮動小数点数でなければなりません"
	assert api.types.is_datetime64_any_dtype(df['purchase_date']), "purchase_date は datetime64 でなければなりません"
	assert not df.duplicated(subset=['product_name', 'price', 'purchase_date']).any(), "product_name、price、purchase_date の組み合わせは一意でなければなりません"

# コード実行は明示的に有効にする必要があります
@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) """ @ai_function( code_execution_mode="local", code_executor_additional_imports=["pandas."],
)
def fuzzy_merge_products(invoice: DataFrame) -> DataFrame:
    """
	同じ製品の異なるバージョンを示す製品名を見つけ、バージョンサフィックスを削除し、
	表記の揺れを統一して正規化し、正規化された名前で製品名を更新し、
	同じ構造(同じ列と行)の DataFrame を返します。
	"""

#JSON をロードします(エージェントは JSON を検査して DataFrame にマッピングする方法を理解する必要があります)
df = import_invoice('data/invoice.json')
print("請求書の合計:", df['price'].sum())

#SQLite データベースをロードします。エージェントは動的にスキーマをチェックし、

$それを読み取り、目的の形式に変換するために必要なクエリを生成します)

df = import_invoice('data/invoice.sqlite3')

# 同じ製品のリビジョンをマージします

 df = fuzzy_merge_products(df)

今後、Strands-Labs を通じて Strands 開発者コミュニティとより多くのプロジェクトを共有し、Strands をより良いものにするためのフィードバックを楽しみにしています。

エージェンティック AI の新たなアプローチを体験し、Strands Labs で今すぐ実験を始めましょう。


Joy Chakraborty

Joy Chakraborty

Joy Chakraborty は AWS Agentic AI Foundation のシニアテクニカルプログラムマネージャーです。現在、Strands Agents と AgentCore Integration プログラムを管理しています。以前は、Amazon Retail Store の AWS CloudFormation プログラムと Catalog Variation プログラムを率いていました。

Alessandro Achille

Alessandro Achille

Alessandro Achille は AWS Agentic AI の主任アプリケーションサイエンティストで、自律コーディングエージェント、機械学習の基礎、プライバシー、ハードウェアとソフトウェアの共同設計に取り組んでいます。

Arron Bailiss

Arron Bailiss

Arron Bailiss は AWS のエージェンティック AI に焦点を当てた主任エンジニアで、人工知能、機械学習、ロボティクスの交差点で働いています。彼は、ビルダーが洗練された AI 駆動型アプリケーションを作成できる開発者ツールの未来を形作るのを助けています。

Andrew Shamiya

Andrew Shamiya

Andrew Shamiya は AWS Agentic AI のマーケティングマネージャーです。彼は開発者がエージェントシステムを選択し展開するのを助けることに焦点を当てています。以前は Twitch で Monetization Product Marketing を率いており、フリータイムには読書と絵を描くことを楽しんでいます。

Ryan Coleman

Ryan Coleman

Ryan Coleman は Amazon Web Services の製品マネージャーで、AI 開発者ツールとエージェントフレームワークに焦点を当てています。DevOps とオープンソースのバックグラウンドを持ち、ビルダーが大規模言語モデルの力を活用してインテリジェントでスケーラブルなソフトウェアシステムを作成するのを助けています。