Strands Agentsとは
Strands AgentsはAWSがOSSとして公開しているAIエージェント開発用のSDKです。AWSが開発していますが、AWSに限定せずOpenAI等のほかのモデルにも対応しています。
2025年5月に公開され、これまでPythonで利用可能でした。
2025年12月にStrands AgentsはTypeScript (Node.js 20+)でも利用可能になったため、触ってみます。
TypeScript版Strands Agentsのサンプル
Pythonと同じようにコード自体はほとんど数行で書けて便利です。
使い方は次のようなステップでできます。
環境構築
Strands Agentsを実行するプロジェクトを作成
node.jsはv20以上であれば利用可能です。今回v24.12.0で触ってみました。
mkdir custom-agent
cd custom-agent
npm init -y
npm install @strands-agents/sdk
これらを実行するとできる環境は
$ ls
node_modules/ package.json package-lock.json
$ cat package.json
{
"name": "custom-agent",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@strands-agents/sdk": "^0.1.2"
}
}
このようになります。Strands Agentsのモジュール0.1.2がインストールされていることが確認できます。
package.jsonの編集
簡易的に動作を確認するためには、package.jsonに以下の追記をします。
"type": "module"
この設定は通常利用する場合、必要ありません。
今回、動作確認するために(後述しますが、3行で実装するために)追記しています。
環境変数設定
以下の環境変数を設定します。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
またBedrockを利用するため以下の変数も設定します。
- AWS_BEARER_TOKEN_BEDROCK
AWS上の環境を利用する場合は、IAMロールを付与してください。
また、Bedrockを利用するための利用申請も実施してください。
デフォルトではClaude 4 modelを利用します。
Bedrockへのアクセス設定が十分できていない場合はCredentialsProviderErrorといったエラーが出ることがあります。
TypeScriptファイルの作成
src/agent.tsを作成し、以下の内容を記載します。(たった3行!!)
import { Agent } from "@strands-agents/sdk";
const agent = new Agent();
await agent.invoke("AWSってなんですか?");
実行
プロジェクトのルートディレクトリで、以下のコマンドをで実行します。
npx tsx src/agent.ts
この結果は以下のようになり、簡単にAIエージェントを構築できました!
# AWSとは
**AWS(Amazon Web Services)** は、Amazon社が提供する世界最大規模の**クラウドコンピューティングサービス**です。
## 主な特徴
- **インターネット経由で利用できる**ITインフラサービス
- サーバー、ストレージ、データベースなどを必要な時に必要な分だけ利用可能
- **従量課金制**:使った分だけ支払う料金体系
## 代表的なサービス
- **EC2**:仮想サーバー
- **S3**:データストレージ
- **RDS**:データベース
- **Lambda**:サーバーレス実行環境
## メリット
1. **初期費用が不要** - 物理サーバーを購入する必要がない
2. **柔軟性** - 必要に応じてリソースを増減できる
3. **高い信頼性** - Amazonの堅牢なインフラを利用
4. **グローバル展開** - 世界中にデータセンターがある
個人から大企業まで幅広く利用されており、Netflix、Airbnbなど多くの有名企業もAWSを活用しています。
TypeScript版で利用可能な主要機能
TypeScript版で利用可能な主要機能は以下です。
- Agent Loop
- State Management
- 会話履歴管理やagentやリクエストの状態を管理するものです。
- Prompts
- Agentに対して事前にAgentがどういう役割を果たすものかのインプットとなるものです。(例:「あなたは英会話教室の先生です。~~」)
- Conversation Managers
- 履歴管理するものです。履歴を管理しないNullConversationManagerと履歴をN件管理するSlidingWindowConversationManagerがあります。
この中でもAgent Loopについては少し取り上げます。
Agent Loop
Strands AgentsといえばAgent Loopを利用したレスポンス生成であり、TypeScript版でも組み込まれています。
Agent Loopとは
Agent Loopに関する記事は多く出回っているので、ここでは概要レベルで記載します。
Agent Loopとはインプットやコンテキスト情報をLLMに問い合わせて応答を得るだけでなく、「ツールを利用」または「ユーザに回答」を応答結果から判断し、必要に応じてツールの実行を繰り返し行って最終的な応答結果を返すものです。Strands Agents利用者はツールの利用に対して都度複雑なロジックを書く必要がなく、LLMに任せることができます。
ツールの利用
Pythonと同様にツールも簡単に定義して利用可能です。Agentに対して、決まったロジックを組み込みたい場合は、ツールを利用するとよいです。たとえば、大きな数字同士の計算はそのままAgentに投げても適切な回答が得られないことがあります。
インプットの内容
"12919411121割る423232したときのあまりは?"
単にagentに問い合わせた結果
12919411121を423232で割ったときの余りを計算します。
12919411121 ÷ 423232 を計算すると:
12919411121 ÷ 423232 = 30526(商)
検算:
30526 × 423232 = 12917387632
余り:
12919411121 - 12917387632 = 2023489
正しくは254321ですので誤りです。そこで、以下のようにtoolを定義するだけで決まった処理を実行することができます。
import { Agent, tool } from "@strands-agents/sdk";
import z from "zod";
const remainderCalculator = tool({
name: 'remainder_calculator',
description: 'Calculate the remainder when A is divided by B.',
inputSchema: z
.object({
A: z.number().describe('The dividend'),
B: z.number().describe('The divisor'),
})
.refine((data) => data.B !== 0, {
message: "The 'B' parameter must not be zero",
}),
callback: (input) => {
const { A, B } = input
const remainder = A % B
return `The remainder of ${A} / ${B} is ${remainder}`
},
})
メッセージの中から二つの数字を受け取ってそれに対する余りをA%Bという確実な方法で算出しています。
このツールの利用の仕方は、以下のようにAgentの定義の時に指定するだけです(とっても簡単!)。
const agent = new Agent({
tools: [remainderCalculator],
});
ツールを利用した結果の出力は明示的に記載しないとコンソール上に出てこないため、出力は以下のように指定します。
- なぜ明示的に記載しないと出てこないのかは現在調査中です。。。
const result = await agent.invoke("12919411121割る423232したときのあまりは?");
console.log(result.lastMessage);
これにより出力結果は、以下のように正しい結果になります。
$ npx tsx src/agent.ts
🔧 Tool #1: remainder_calculator
✓ Tool completed
12919411121を423232で割ったときの**あまりは254321**です。Message {
type: 'message',
role: 'assistant',
content: [
TextBlock {
type: 'textBlock',
text: '12919411121を423232で割ったときの**あまりは254321**です。'
}
]
}
ということでツール利用もPython同様にとても簡単に実装できました。皆さんぜひ使ってみてください。
TypeScript版でまだサポートしていない主要機能
TypeScript版のStrands Agentsはプレビュー版ということもあり、一部機能はサポートされておりません。といっても、個人開発で利用する分には十分すぎるほど機能が提供されていますが、、、
サポートされていない主要機能は以下です。
- Structured Output
- 通常非構造化LLM出力をアプリケーションの型システムや検証に統合できるプログラムのデータ構造に変換して出力する機能です。実行するときのagentの引数にメッセージだけでなく、どのクラスや型で出力するかを指定し、結果を得る形です。
- Session Management
- アプリケーションの再起動時や分散環境での利用でセッション情報を保持し、コンテキストを維持する機能です。公式ドキュメントでは
but will be coming soon!と記載があるので、すぐにサポートされると思います(楽しみですね)。
- アプリケーションの再起動時や分散環境での利用でセッション情報を保持し、コンテキストを維持する機能です。公式ドキュメントでは
- SummarizingConversationManager
- 過去の会話内容を要約して管理する機能です。
現時点で利用可能なモデルプロバイダ
PythonではAmazonBedrockをはじめOpenAI, Anthropic, Gemini, LiteLLM等多くのモデルプロバイダをサポートしています。一方で、TypeScriptでは2025年12月17日現在、Amazon Bedrock, OpenAI, Custom Providersのみサポートとなっています。
詳細や最新のサポート状況は公式ドキュメントを参照してください。
これらのモデルプロバイダを利用するのはPython同様とても簡潔に記載できます。例えばOpenAIのモデルを利用する場合、次のように定義するだけです(OPENAI_API_KEYにはOpenAIにアクセスするためのAPIキーを事前に環境変数として設定していただく必要があります)。
import { Agent } from '@strands-agents/sdk'
import { OpenAIModel } from '@strands-agents/sdk/models/openai'
const openaiModel = new OpenAIModel({
apiKey: process.env.OPENAI_API_KEY,
modelId: 'gpt-4o',
})
agent = new Agent({ model: openaiModel })
最後に
今回Strands AgentsのTypeScript版がプレビュー版で公開されたので触れてみました。まだまだPythonのほうが機能が豊富ということもありますが、TypeScript版でも十分Strands Agentsの使いやすさが分かったのではないかと思います。今後GAされたときにはPython版と同等の機能やサポートが提供されるのを期待しますね。
