
はじめに
2025年12月3日、AWSはStrands AgentsのTypeScriptサポート(プレビュー版)を発表しました。
これにより、開発者はPythonとTypeScriptのどちらのプログラミング言語でもAIエージェントを構築できるようになりました。
本記事では、この新機能の詳細と、同時に発表された3つの新機能(エッジデバイスサポート、Strands Steering、Strands Evaluations)について解説します。
⚠️ 注意: TypeScript版は現在プレビュー版(v0.1.2)です。APIが変更される可能性があるため、本番環境での使用には注意が必要です。
⚠️ LLMプロバイダーの制限: TypeScript版は現在、Amazon BedrockとOpenAIのみをネイティブサポートしています。ただし、カスタムプロバイダーを実装することで他のLLMも利用可能です。Anthropic、Gemini、Ollama等はPython版でのみネイティブサポートされています。詳細は公式ドキュメントをご確認ください。
Strands Agentsとは
Strands Agentsは、2025年5月にAWSがオープンソース化したAIエージェントSDKです。
わずか数行のコードでAIエージェントを構築・実行できるモデル駆動型アプローチを採用しています。
開発の背景
Strands Agentsは、Amazon Q Developerチームの実際の課題から生まれました。2023年初頭、ReAct(Reasoning and Acting)論文の公開後、同チームはAIエージェント構築を開始しましたが、当時のLLMはエージェントとして動作するよう訓練されておらず、複雑なオーケストレーションロジックが必要でした。エージェントを本番環境に対応させるまでに数ヶ月を要していました。
しかし、LLMの能力が劇的に向上し、ネイティブなツール使用と推論機能を持つようになったことで、複雑なオーケストレーションは不要になりました。むしろ、既存のフレームワークが新しいLLMの機能を十分に活用する妨げになっていたのです。
この課題を解決するために開発されたStrands Agentsは、最新モデルの機能に依存してエージェントを駆動することで、市場投入時間を大幅に短縮しました。プロトタイプから本番環境まで、数ヶ月かかっていたものが数日から数週間で完了するようになりました。
エージェントの3つの核となる要素
Strands Agentsでは、エージェントを以下の3つの要素で定義します:
- モデル:Amazon Bedrock、OpenAI等のLLMプロバイダー(TypeScript版ではBedrock、OpenAI、カスタムプロバイダーをサポート)
- ツール:Model Context Protocol (MCP)サーバー、事前構築済みツール、カスタム関数
- プロンプト:タスクを定義する自然言語のプロンプトとシステムプロンプト
エージェンティックループ
Strands Agentsの核心はエージェンティックループです。エージェントは、プロンプトで提供されたタスクを完了するまで、モデルとツールとのループで相互作用します。
各ループで、Strandsは以下を実行します:
- プロンプト、エージェントのコンテキスト、ツールの説明と共にLLMを呼び出す
- LLMが応答、計画、振り返り、またはツール選択を行う
- ツールが選択された場合、Strandsがツールを実行し結果をLLMに返す
- タスクが完了したら、最終結果を返す
このモデル駆動型アプローチにより、LLMの強力な推論、計画、ツール選択の能力を最大限に活用できます。
モデル駆動型アプローチの利点
従来のフレームワークでは、開発者が複雑なワークフローを定義する必要がありました。Strands Agentsは、最先端モデルの以下の機能を活用することでエージェント開発を簡素化します:
- 計画:タスクを複数ステップに分解
- 思考の連鎖:論理的な推論プロセス
- ツール呼び出し:適切なツールの選択と実行
- リフレクション:過去のステップの振り返りと改善
開発者は、プロンプトとツールのリストをコードで定義するだけで、エージェントを構築し、ローカルでテストしてクラウドにデプロイできます。
実際の活用事例
AWS内部では、複数のチームが既に本番環境でStrands Agentsを使用しています:
- Amazon Q Developer:ソフトウェア開発のための生成AIアシスタント
- AWS Glue:データ統合サービス
- VPC Reachability Analyzer:ネットワーク診断ツール
DNA構造のメタファー
Strands(鎖)という名前は、DNAの二重らせん構造に由来します。DNAが2本の鎖で構成されるように、Strandsはモデルとツールというエージェントの2つの核となる部分を結びつけます。
TypeScriptサポートの詳細
設計思想
TypeScript版のStrands Agentsは、TypeScript/JavaScript開発者にとって自然な体験を提供するよう設計されています。Python版の強力な機能を維持しながら、TypeScriptエコシステムに最適化されています。
主な特徴:
- 🪶 軽量で柔軟:Node.jsとブラウザ環境でシームレスに動作するシンプルなエージェントループ
- 🔒 型安全なツール:Zodスキーマを使用した堅牢な入力検証と型推論
- 🔌 モデル非依存:Amazon BedrockとOpenAIのファーストクラスサポート、カスタムプロバイダーの拡張可能なアーキテクチャ
- 🔗 組み込みMCP:Model Context Protocol (MCP)クライアントのネイティブサポート
- ⚡ ストリーミングサポート:より良いユーザー体験のためのリアルタイム応答ストリーミング
- 🎣 拡張可能なフック:エージェントの動作を監視・カスタマイズするためのライフサイクルフック
- 💬 会話管理:会話履歴とコンテキストウィンドウを管理する柔軟な戦略
実行環境
TypeScript版Strands Agentsは、以下の環境で実行できます:
- Node.js 20+:サーバーサイドアプリケーション
- ブラウザ:クライアントサイドアプリケーション
- AWS Lambda:サーバーレス関数
- Bedrock AgentCore:AWSのエージェント実行環境
- AWS CDK:インフラストラクチャコードでの完全なTypeScriptスタック構築
インストール
npm install @strands-agents/sdk
基本的な使い方
最もシンプルな例:
import { Agent } from '@strands-agents/sdk'; // エージェントの作成(デフォルトでAmazon Bedrockを使用) const agent = new Agent(); // エージェントの実行 const result = await agent.invoke('1764の平方根は何ですか?'); console.log(result);
システムプロンプト付き:
import { Agent } from '@strands-agents/sdk'; const agent = new Agent({ systemPrompt: 'あなたは親切なアシスタントです。', }); const result = await agent.invoke('こんにちは');
モデルプロバイダーの切り替え
Amazon Bedrock(デフォルト):
import { Agent, BedrockModel } from '@strands-agents/sdk'; const model = new BedrockModel({ region: 'us-east-1', modelId: 'anthropic.claude-3-5-sonnet-20240620-v1:0', maxTokens: 4096, temperature: 0.7 }); const agent = new Agent({ model });
OpenAI:
import { Agent } from '@strands-agents/sdk'; import { OpenAIModel } from '@strands-agents/sdk/openai'; // 自動的にprocess.env.OPENAI_API_KEYを使用し、デフォルトでgpt-4oを使用 const model = new OpenAIModel(); const agent = new Agent({ model });
カスタムプロバイダー:
TypeScript版では、独自のモデルプロバイダーを実装することで、Anthropic、Gemini等の他のLLMも利用できます。詳細はCustom Providersドキュメントを参照してください。
注: TypeScript版では現在、BedrockとOpenAIのみがネイティブサポートされています。Anthropic、Gemini、Ollama、Meta Llama等を使用する場合は、カスタムプロバイダーを実装するか、Python版をご利用ください。詳細はModel Providersドキュメントを参照してください。
ストリーミング応答
リアルタイムで応答を取得:
const agent = new Agent(); console.log('エージェント応答ストリーム:'); for await (const event of agent.stream('勇敢なトースターについての物語を教えて')) { console.log('[イベント]', event.type); }
型安全なツールの定義
Zodスキーマを使用した型安全なツール定義:
import { Agent, tool } from '@strands-agents/sdk'; import { z } from 'zod'; const weatherTool = tool({ name: 'get_weather', description: '特定の場所の現在の天気を取得します', inputSchema: z.object({ location: z.string().describe('都市名と都道府県、例: 東京都'), }), callback: (input) => { // inputはZodスキーマに基づいて完全に型付けされています return `${input.location}の天気は晴れで気温は22度です。`; }, }); const agent = new Agent({ tools: [weatherTool], }); await agent.invoke('東京の天気を教えて');
事前構築済みツール
SDKには以下のオプショナルな事前構築済みツールが含まれています:
- Notebook Tool:永続的なメモ取りのためのテキストベースのノートブック管理
- File Editor Tool:ファイルシステム操作(ファイルの読み取り、書き込み、編集)
- HTTP Request Tool:外部APIへのHTTPリクエスト
MCP統合
Model Context Protocol (MCP)サーバーとのシームレスな統合:
import { Agent, McpClient } from "@strands-agents/sdk"; import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; // ローカルMCPサーバー用のクライアントを作成 const documentationTools = new McpClient({ transport: new StdioClientTransport({ command: "uvx", args: ["awslabs.aws-documentation-mcp-server@latest"], }), }); const agent = new Agent({ systemPrompt: "MCPツールを使用する親切なアシスタントです。", tools: [documentationTools], // MCPクライアントを直接ツールソースとして渡す }); await agent.invoke("MCPサーバーからランダムなツールを使用してください。"); await documentationTools.disconnect();
同時発表された3つの新機能
1. エッジデバイスサポート(一般提供開始)
エッジデバイスでのStrands Agents実行が正式にサポートされました。
主な機能:
- 双方向ストリーミング:リアルタイムな対話が可能
- ローカルモデルプロバイダー:llama.cppなどに対応
- 小規模デバイス対応:リソース制約のある環境でも動作
ユースケース:
- IoTデバイス上でのAIエージェント実行
- オフライン環境での動作
- レイテンシが重要なアプリケーション
2. Strands Steering(Experimental)
エージェントのライフサイクルの適切なタイミングでフィードバックを提供し、望ましい結果に導く仕組みです。
特徴:
- モジュラープロンプティング:柔軟なプロンプト制御
- ライフサイクル統合:エージェントの各段階で介入可能
- 柔軟な制御:厳格なワークフローなしで動作を調整
メリット:
- エージェントの動作を細かく制御
- 特定のビジネスルールへの準拠
- 段階的な改善が可能
3. Strands Evaluations(プレビュー)
開発サイクル中にエージェントの動作を体系的に検証する機能です。
主な機能:
- 動作の検証:エージェントが期待通りに動作するか確認
- 改善の測定:変更による影響を定量的に評価
- 信頼性の向上:本番環境へのデプロイ前に品質を保証
評価の観点:
- タスク完了率
- 応答の正確性
- ツール使用の適切性
- レスポンス時間
- エラー率
開発フロー:
- テストケースの作成
- エージェントの実行と評価
- 結果の分析と改善
- 継続的な品質管理
TypeScript版のメリット
1. 型安全性による開発効率の向上
TypeScript版の最大の特徴は、完全な型安全性です。
- コンパイル時のエラー検出:実行前にバグを発見できる
- Zodスキーマによる検証:ツール入力の実行時検証と型推論
- IDEの強力な補完:VSCode等での自動補完が効果的に機能
// 型安全なツール定義 const weatherTool = tool({ name: 'get_weather', inputSchema: z.object({ city: z.string(), // 型が保証される }), callback: async ({ city }) => { // cityは自動的にstring型として推論される return `${city}の天気`; }, });
2. AWS環境との高い親和性
TypeScript版は、AWS環境での開発に最適化されています。
実行環境の柔軟性:
- AWS Lambda:サーバーレス関数として実行
- Amazon Bedrock AgentCore:マネージドエージェント環境
- AWS Fargate:コンテナ環境
- Amazon EKS:Kubernetes環境
- Node.js:従来のサーバーサイドアプリケーション
- ブラウザ:クライアントサイドで直接実行可能
AWS CDKとの完全な統合:
// インフラコード(AWS CDK) import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs'; const agentFunction = new lambda.NodejsFunction(this, 'AgentFunction', { entry: 'src/agent.ts', handler: 'handler', runtime: lambda.Runtime.NODEJS_20_X, }); // エージェントコード(Strands Agents) import { Agent } from '@strands-agents/sdk'; export const handler = async (event: any) => { const agent = new Agent(); return await agent.invoke(event.query); };
エンドツーエンドTypeScript開発:
- インフラ:AWS CDKでTypeScriptで記述
- バックエンド:Strands AgentsでTypeScriptで実装
- フロントエンド:React/Next.jsでTypeScriptで構築
- 型定義の共有:すべてのレイヤーで型を共有可能
これにより、AWS環境でのフルスタック開発を単一言語で完結できます。
3. フロントエンドとのシームレスな統合
同じ言語での開発:
- フロントエンドとバックエンドをTypeScriptで統一
- 型定義やビジネスロジックを共有可能
- React/Next.js/Vue.jsなど既存のWebアプリに簡単に統合
ブラウザでの直接実行:
// クライアントサイドでエージェントを実行 import { Agent } from '@strands-agents/sdk'; const ChatComponent = () => { const agent = new Agent(); const handleSubmit = async (message: string) => { const response = await agent.invoke(message); // UIを更新 }; };
4. モダンなJavaScript/TypeScriptエコシステム
- npm/yarn/pnpm:成熟したパッケージ管理
- async/await:直感的な非同期処理
- ESM:モダンなモジュールシステム
- 豊富なライブラリ:npmの膨大なパッケージエコシステム
PythonとTypeScriptの使い分け
Pythonが適している場合
- データサイエンス・機械学習との統合
- 既存のPythonエコシステムの活用
- Jupyter Notebookでのプロトタイピング
TypeScriptが適している場合
- フロントエンドとの統合
- Node.jsベースのバックエンド
- AWS CDKでのインフラ管理
- 型安全性を重視する開発
実践例:天気情報エージェントの作成
TypeScript版
import { Agent, tool } from '@strands-agents/sdk'; import { z } from 'zod'; // カスタムツールの定義(Zodスキーマで型安全) const weatherTool = tool({ name: 'get_weather', description: '指定された都市の天気を取得します', inputSchema: z.object({ city: z.string().describe('都市名(例: 東京)'), unit: z.enum(['celsius', 'fahrenheit']).optional().describe('温度の単位') }), callback: async ({ city, unit = 'celsius' }) => { // 実際のAPI呼び出しをここに実装 const temp = unit === 'celsius' ? '22°C' : '72°F'; return `${city}の天気は晴れで、気温は${temp}です`; } }); // エージェントの作成 const agent = new Agent({ systemPrompt: '天気情報を提供するアシスタントです。常に正確な情報を提供してください。', tools: [weatherTool] }); // 実行 const result = await agent.invoke('東京の天気を教えて'); console.log(result);
Python版(比較用)
from strands import Agent, tool from typing import Literal # カスタムツールの定義 @tool def get_weather( city: str, unit: Literal['celsius', 'fahrenheit'] = 'celsius' ) -> str: """指定された都市の天気を取得します Args: city: 都市名(例: 東京) unit: 温度の単位 """ temp = '22°C' if unit == 'celsius' else '72°F' return f"{city}の天気は晴れで、気温は{temp}です" # エージェントの作成 agent = Agent( system_prompt="天気情報を提供するアシスタントです。常に正確な情報を提供してください。", tools=[get_weather] ) # 実行 result = agent.invoke("東京の天気を教えて") print(result)
主な違い
| 項目 | TypeScript | Python |
|---|---|---|
| ツール定義 | tool()関数 + Zodスキーマ |
@toolデコレータ + 型ヒント |
| 型安全性 | Zodによる実行時検証 + TypeScript型推論 | 型ヒント(実行時検証なし) |
| 非同期処理 | async/await |
async/await |
| パッケージ名 | @strands-agents/sdk |
strands-agents |
より高度な例:MCP統合とストリーミング
import { Agent, McpClient, tool } from '@strands-agents/sdk'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; import { z } from 'zod'; // AWS Documentation MCPサーバーとの統合 const awsDocTools = new McpClient({ transport: new StdioClientTransport({ command: 'uvx', args: ['awslabs.aws-documentation-mcp-server@latest'] }) }); // カスタムツールの追加 const summarizeTool = tool({ name: 'summarize_content', description: 'コンテンツを要約します', inputSchema: z.object({ content: z.string(), maxLength: z.number().optional().default(200) }), callback: async ({ content, maxLength }) => { // 要約ロジック return content.slice(0, maxLength) + '...'; } }); // エージェントの作成 const agent = new Agent({ systemPrompt: 'AWSドキュメントを検索し、要約を提供するアシスタントです。', tools: [awsDocTools, summarizeTool] }); // ストリーミングで実行 console.log('エージェント応答:'); for await (const event of agent.stream('Amazon S3のバケット命名規則について教えて')) { if (event.type === 'text') { process.stdout.write(event.content); } } // クリーンアップ await awsDocTools.disconnect();
実際に動かしてみた
TypeScript版Strands Agentsを実際に検証してみました。
検証環境
- Node.js: v24.9.0
- @strands-agents/sdk: 最新版
- AWS Region: us-west-2
- Model: Claude 3.7 Sonnet (Amazon Bedrock)
基本的なエージェントの実装
最もシンプルな実装例:
import { Agent } from '@strands-agents/sdk'; const agent = new Agent({ systemPrompt: 'あなたは親切なアシスタントです。簡潔に回答してください。' }); const result = await agent.invoke('Strands Agentsとは何ですか?3行以内で説明してください。'); // テキストコンテンツを抽出 const textContent = result.lastMessage.content .filter((block: any) => block.type === 'text') .map((block: any) => block.text) .join('\n'); console.log('回答:', textContent);
実行結果:
Strands Agentsは、わずか数行のコードでAIエージェントを構築・実行できる、 AWSが開発したオープンソースSDKです。モデル駆動型アプローチを採用し、 最新LLMのネイティブなツール使用と推論機能を最大限に活用します。 プロトタイプから本番環境まで、数日から数週間で開発できます。
✅ 検証結果: エージェントが正常に作成され、Amazon Bedrockとの連携も問題なく動作しました。
ツールを使用するエージェントの実装
次に、カスタムツールを定義してエージェントに使わせてみます:
import { Agent, tool } from '@strands-agents/sdk'; import { z } from 'zod'; // 天気取得ツール const weatherTool = tool({ name: 'get_weather', description: '指定された都市の天気を取得します', inputSchema: z.object({ city: z.string().describe('都市名(例: 東京)'), }), callback: async ({ city }) => { const weatherData: Record<string, string> = { '東京': '晴れ、気温22度', '大阪': '曇り、気温20度', '福岡': '雨、気温18度', }; return weatherData[city] || `${city}の天気情報は取得できませんでした`; }, }); // 計算ツール const calculatorTool = tool({ name: 'calculator', description: '数学的な計算を実行します', inputSchema: z.object({ expression: z.string().describe('計算式(例: 2 + 2)'), }), callback: async ({ expression }) => { const result = Function(`'use strict'; return (${expression})`)(); return `${expression} = ${result}`; }, }); // エージェント作成 const agent = new Agent({ systemPrompt: 'あなたは親切なアシスタントです。利用可能なツールを使って質問に答えてください。', tools: [weatherTool, calculatorTool], }); // 実行 await agent.invoke('東京の天気を教えて'); await agent.invoke('1234 × 5678 を計算して');
実行結果:
質問1: 東京の天気を教えて 🔧 Tool #1: get_weather ✓ Tool completed 東京の天気は晴れで、気温は22度です。 --- 質問2: 1234 × 5678 を計算して 🔧 Tool #2: calculator ✓ Tool completed 1234 × 5678 = 7,006,652 です。
✅ 検証結果: - Zodスキーマによる型安全なツール定義が正常に動作 - エージェントが質問内容から適切なツールを自動選択 - エージェンティックループが期待通りに機能
検証結果まとめ
| 項目 | 状態 | 備考 |
|---|---|---|
| 基本的なエージェント作成 | ✅ | 問題なし |
| Amazon Bedrock連携 | ✅ | デフォルトで動作 |
| 日本語対応 | ✅ | プロンプト・回答ともに対応 |
| ツール定義(Zod) | ✅ | 型安全性が保証される |
| ツール自動選択 | ✅ | エージェンティックループが正常動作 |
| 複数ツール対応 | ✅ | 問題なし |
TypeScript版は、Python版と同等の機能を提供しながら、TypeScriptエコシステムの利点(型安全性、IDEの補完)を活かせることが確認できました。
始め方
前提条件
- Node.js 20以上(TypeScript版)
- Python 3.10以上(Python版)
- AWSアカウント(Amazon Bedrockを使用する場合)
インストール
TypeScript:
npm install @strands-agents/sdk
Python:
uv pip install strands-agents
リソース
- GitHubリポジトリ:https://github.com/strands-agents
- TypeScript SDK:https://github.com/strands-agents/sdk-typescript
- Python SDK:https://github.com/strands-agents/sdk-python
- サンプル集:https://github.com/strands-agents/samples
- ドキュメント:https://github.com/strands-agents/docs
まとめ
Strands AgentsのTypeScriptサポート(プレビュー版 v0.1.1)により、より多くの開発者がAIエージェント開発に参加できるようになりました。完全な型安全性、モダンな非同期処理、そして幅広い実行環境のサポートにより、エンタープライズグレードのAIアプリケーション開発が加速します。
さらに、エッジデバイスサポート、Strands Steering、Strands Evaluationsという3つの新機能により、AIエージェントの開発・運用・品質管理の全体的なエクスペリエンスが向上しています。
TypeScriptとPythonのどちらを選択するかは、プロジェクトの要件や既存のエコシステムによって決まりますが、どちらを選んでも同じパワフルなAIエージェント機能を活用できます。
プレビュー版について: 現在TypeScript版はv0.1.1のプレビュー版です。基本的な機能は安定していますが、APIが変更される可能性があります。本番環境での使用を検討する場合は、バージョンアップ時の変更内容を確認することをお勧めします。
ぜひStrands Agentsを試して、次世代のAIアプリケーション開発を体験してください。
参考リンク
ウォルフ圭 (Kei Wolfe) 記事一覧はコチラ
サーバーワークス・エンタープライズ部のウルフ。
アプリ開発が大好物🐺