2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Strands Agentsを触ってみる

2
Posted at

はじめに:Strands Agents(ストランズ・エージェンツ)とは?

Strands Agentsは、AWSが開発したオープンソースのエージェント開発用Python SDKです。
大規模言語モデル(LLM)を使ったAIエージェントを、数行のコードで簡単に構築・実行できます。
Amazon Bedrock上のClaudeなどのモデルに対応しており、マルチエージェント構成やツール連携も可能です。

公式GitHubを確認したところ以下2つの手順が必要らしい

  • AWS CLIの認証を行っている
  • US Oregon (us-west-2) リージョンのAmazon Bedrock内でClaude 4 Sonnetのモデルアクセスを有効化している

1. AWSCLIの設定をする

AWS Console > IAM > アクセスキーの発行をする
image.png

CMDでAWS CLIの初期設定をする

C:\Users\hoge>aws configure
AWS Access Key ID:アクセスキー
AWS Secret Access Key:シークレットアクセスキー
Default region name:ap-northeast-1
Default output format:text

モデルアクセスを有効化する

Console画面上部でBedrockを検索し、Amazon Bedrockに移動
image.png

1.モデルアクセスをリクエスト
image.png

2.画像箇所をクリックしてモデルアクセスを有効化にする
image.png

3.画像のような状態になったら、画面下部の次へをクリック
image.png

4.Anthropic 用にユースケースの詳細を追加 ※初回のみ

🔷 入力フォームへの記載例(個人開発者・学習目的)

項目 入力例(個人利用)
会社名 Taro Yamada(※自分の本名をローマ字で記載)
会社のウェブサイトのURL https://github.com/****
業界(Industry) Technology または Software Development
対象ユーザー(Intended Audience) 社内(※学習用なので自分のみが使用する想定)
ユースケースの説明(Use case description) 下記を参照(Claudeという単語は使わない)

📝 ユースケースの説明(PII回避済み・Claudeを使わない)
以下をコピペで使用可能です:

大規模言語モデル(LLM)の活用方法を学ぶための学習・実験目的で使用します。
生成AIのプロンプト設計、モデル挙動、応答品質を比較評価し、将来的な業務適用に備えるための知見を得ることを目的としています。業務利用や本番環境での利用は現時点で想定していません。

🚫 Claudeという語を使ってはいけない理由
Amazon公式の申請ページには以下の注意書きがあります:

「ヒント: “Claude” という用語は PII(個人識別情報)として識別され、アクセスが自動的に拒否されるため、使用しないでください。」

そのため、「Claude」は一切使わず、「this model」「large language model(LLM)」などに置き換えて記述します

5.少し待つとアクセスが許可されます。
image.png

実行してみる

Pythonの仮想環境を作成する

C:\Users\hoge>python -m venv 任意の名前(例:agent)
C:\Users\hoge>cd agent
C:\Users\hoge\agent>cd Scripts
C:\Users\hoge\agent\Scripts>.activate

「実行ポリシー」による制限がかかった場合、一時的に実行ポリシーを変更します。

C:\Users\hoge\agent\Scripts>Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

Strands Agentsをインストール

pip install strands-agents

Pythonコード(agent.py)

from strands import Agent

agent = Agent()
agent("Strands Agentsとは?")

Pythonコードを実行!

(agent)C:\Users\hoge\agent> python agent.py

発生したエラー

botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the ConverseStream operation: The provided model identifier is invalid.
└ Bedrock region: ap-northeast-1
└ Model id: us.anthropic.claude-sonnet-4-20250514-v1:0

モデル ID us.anthropic.claude-sonnet-4-20250514-v1:0 は ap-northeast-1(東京リージョン)では使えません。Claude 4 Sonnet は us-west-2(オレゴン)リージョン専用です。

AWSCLIの設定が東京リージョンでしたので変更します。

AWS Access Key ID [****************]: Enterで次へ
AWS Secret Access Key [****************]: Enterで次へ
Default region name [ap-northeast-1]: us-west-2 を入力
Default output format [text]: Enterで次へ

Pythonコードを実行!

(agent)C:\Users\hoge\agent> python agent.py

発生したエラー

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the ConverseStream operation: 
User: arn:aws:iam::<YOUR_ACCOUNT_ID>:user/User is not authorized to perform: bedrock:InvokeModelWithResponseStream 
on resource: arn:aws:bedrock:us-west-2:<YOUR_ACCOUNT_ID>:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0 
because no identity-based policy allows the bedrock:InvokeModelWithResponseStream action

Bedrock モデルをストリーミング形式(InvokeModelWithResponseStream)で呼び出す権限が付与されていません。

インラインポリシーで権限を追加する

IAM > 対象のユーザー > 許可を追加 > インラインポリシーを作成
image.png

Bndrockを選択
image.png

InvokeModelとInvokeModelWithResponseStreamを選択
image.png

任意の名前を付けてポリシー追加完了
image.png

Pythonコードを実行!

(agent)C:\Users\hoge\agent> python agent.py

回答が返ってきた!

Strands Agentsについて、私の知識では明確な情報を持っていません。

いくつかの可能性が考えられます:

1. **AI/MLエージェントシステム** - 複数のAIエージェントが連携して動作するプラットフォーム
2. **ソフトウェア開発ツール** - 開発者向けのエージェントベースのツール
3. **ビジネスソリューション** - 企業向けの自動化エージェント

より具体的にお答えするために、以下について教えていただけますか?

- どのような文脈でStrands Agentsについて知りたいのか
- 特定の機能や用途について質問があるか
- どこでこの名前を見つけたか

これらの情報があれば、より適切な回答ができるかもしれません。

ツールを使わせてみる

まずはパッケージをインストール

pip install strands-agents-tools

今回登録しているツールは以下の通り:

  • area_data:都市コードを取得する(気象庁API)
  • weathers_data:都市コードを指定して天気予報を取得
  • current_time:現在時刻(Strands公式ツール)
  • calculator:計算処理(Strands公式ツール)

これらを Agent() に登録することで、自然言語でプロンプトを渡すだけで自動的に実行される。

area_data ツール

@tool
def area_data() -> dict:
    url = "https://www.jma.go.jp/bosai/common/const/area.json"
    response = requests.request("GET", url)
    return response.json()

気象庁のエリアコードJSON(地方・府県・市区)を取得する。天気予報取得の前段に必要なコード。

weathers_data ツール

@tool
def weathers_data(city_code: str) -> dict:
    url = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{city_code}.json"
    response = requests.request("GET", url)
    return response.json()

指定した都市コード(例:東京都は "130000")に基づき、天気予報データをJSON形式で取得。

コールバックハンドラで出力制御

class PrintCallbackHandler:
    def __init__(self):
        self.message_buffer = ""

    def __call__(self, **callback):
        if "event" in callback:
            event = callback["event"]
            if "contentBlockDelta" in event:
                return  # ストリーム中の中間データはスキップ
            if "contentBlockStop" in event:
                print(f"[MESSAGE] : {self.message_buffer.strip()}")
                self.message_buffer = ""
            else:
                print(f"[EVENT] : {callback['event']}")
        elif "data" in callback:
            self.message_buffer += callback["data"]
        elif "result" in callback:
            print(f"[RESULT] : {callback['result']}\n")

LLMからの応答はストリーム形式で細かく送られてくるため、都度出力せず一旦バッファに貯め、contentBlockStop でまとめて表示する形式にした。

実行プロンプト

prompt = """
次のタスクを順に実行し、それぞれの結果を教えてください。
1. 東京の現在の気温を取得する
    1-1. 「area_data」ツールを実行して、都市コードを取得してください。
    1-2. 取得した都市コードを使って、「weathers_data」ツールを実行し、天気予報データを取得してください
2. 現在の時刻を取得する
3. 123456 / 678910 を計算する
"""

実行結果例(出力)

[EVENT] : {'messageStart': {'role': 'assistant'}}
[MESSAGE] : 順番にタスクを実行いたします。

## 1. 東京の現在の気温を取得

### 1-1. 都市コードの取得
[EVENT] : {'contentBlockStart': {'start': {'toolUse': {'toolUseId': 'tooluse_QN7hqBmxR0OsIIFWmCLnUQ', 'name': 'area_data'}}, 'contentBlockIndex': 1}}
[MESSAGE] : 
[EVENT] : {'messageStop': {'stopReason': 'tool_use'}}
[EVENT] : {'metadata': {'usage': {'inputTokens': 3468, 'outputTokens': 83, 'totalTokens': 3551}, 'metrics': {'latencyMs': 2539}}}
[EVENT] : {'messageStart': {'role': 'assistant'}}
[MESSAGE] : 東京の都市コードは **130000** です。

### 1-2. 天気予報データの取得
[EVENT] : {'contentBlockStart': {'start': {'toolUse': {'toolUseId': 'tooluse_xv4XRUR9ShWmv-0pc4CjFA', 'name': 'weathers_data'}}, 'contentBlockIndex': 1}}
[MESSAGE] : 
[EVENT] : {'messageStop': {'stopReason': 'tool_use'}}
[EVENT] : {'metadata': {'usage': {'inputTokens': 128251, 'outputTokens': 88, 'totalTokens': 128339}, 'metrics': {'latencyMs': 8087}}}
Fetching weather data for city code: 130000
Requesting URL: https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json
[EVENT] : {'messageStart': {'role': 'assistant'}}
[MESSAGE] : ## 2. 現在の時刻を取得
[EVENT] : {'contentBlockStart': {'start': {'toolUse': {'toolUseId': 'tooluse_UMiTsSfbSEKLut7IArfmdg', 'name': 'current_time'}}, 'contentBlockIndex': 1}}
[MESSAGE] : 
[EVENT] : {'messageStop': {'stopReason': 'tool_use'}}
[EVENT] : {'metadata': {'usage': {'inputTokens': 131236, 'outputTokens': 51, 'totalTokens': 131287}, 'metrics': {'latencyMs': 11297}}}
[EVENT] : {'messageStart': {'role': 'assistant'}}
[MESSAGE] : ## 3. 計算
[EVENT] : {'contentBlockStart': {'start': {'toolUse': {'toolUseId': 'tooluse_Bib1HGl7QCah8Uo8Tai3Ww', 'name': 'calculator'}}, 'contentBlockIndex': 1}}
[MESSAGE] : 
[EVENT] : {'messageStop': {'stopReason': 'tool_use'}}
[EVENT] : {'metadata': {'usage': {'inputTokens': 131318, 'outputTokens': 65, 'totalTokens': 131383}, 'metrics': {'latencyMs': 10910}}}
[EVENT] : {'messageStart': {'role': 'assistant'}}
[MESSAGE] : ## 結果のまとめ

### 1. 東京の気温について
取得した天気予報データから、現在(7月20日17時発表)の東京地方の気温情報:
- **明日(7月21日)の予想気温**: 最低気温25℃、最高気温34℃
- 天気: 晴れ時々くもり、所により夕方から夜のはじめ頃雨で雷を伴い激しく降る
- 風: 南の風、23区西部では南の風やや強く

### 2. 現在の時刻
**2025年7月20日 16時07分30秒(UTC時刻)**
日本時間では **2025年7月20日 01時07分30秒**

### 3. 計算結果
**123456 ÷ 678910 = 0.1818444271**

全てのタスクが正常に実行されました。
[EVENT] : {'messageStop': {'stopReason': 'end_turn'}}
[EVENT] : {'metadata': {'usage': {'inputTokens': 131404, 'outputTokens': 266, 'totalTokens': 131670}, 'metrics': {'latencyMs': 16212}}}
[RESULT] : ## 結果のまとめ

### 1. 東京の気温について
取得した天気予報データから、現在(7月20日17時発表)の東京地方の気温情報:
- **明日(7月21日)の予想気温**: 最低気温25℃、最高気温34℃
- 天気: 晴れ時々くもり、所により夕方から夜のはじめ頃雨で雷を伴い激しく降る
- 風: 南の風、23区西部では南の風やや強く

### 2. 現在の時刻
**2025年7月20日 16時07分30秒(UTC時刻)**
日本時間では **2025年7月20日 01時07分30秒**

### 3. 計算結果
**123456 ÷ 678910 = 0.1818444271**

全てのタスクが正常に実行されました。

公式ツールを使う

先ほど実装したものを公式ツールで再現することもできました

  • http_request:HTTP API に直接アクセス(GET/POST対応)
  • calculator:数式の計算を実行
  • current_time:現在の時刻を取得
from strands import Agent
from strands_tools import http_request, calculator, current_time
agent = Agent(tools=[http_request, calculator, current_time])
prompt = """
次のタスクを順に実行し、それぞれの結果を教えてください。

1.東京の現在の気温を取得する
    1-1.https://www.jma.go.jp/bosai/common/const/area.jsonを取得し、都市コードを取得してください。
    1-2.https://www.jma.go.jp/bosai/forecast/data/forecast/{}.json を取得し、天気予報データを取得してください。
2.現在の時刻を取得してください。
3.123456 / 678910 を計算する
"""
response = agent(prompt)
print(response)

このようにプロンプト内で エンドポイントURLを明示すれば、http_request ツールが自動で GET を実行し、エージェントが JSON を読み取って適切に処理してくれる。

実行結果例(出力)

順番にタスクを実行いたします。

まず、東京の現在の気温を取得するために、都市コードを取得します。
Tool #1: http_request
都市コードを取得しました。データから東京都の都市コードは「130000」であることがわかります。

次に、この都市コードを使って天気予報データを取得します。
Tool #2: http_request
東京の天気予報データを取得しました。

次に、現在の時刻を取得します。
Tool #3: current_time
次に、計算を実行します。
Tool #4: calculator
## 結果の総括

すべてのタスクを実行しましたので、結果をお伝えします:

### 1. 東京の現在の気温について

**1-1. 都市コード取得**
- 気象庁の地域コードAPIから東京都の都市コード「130000」を正常に取得しました。

**1-2. 天気予報データ取得**
- 東京地方の天気予報データを取得しました。
- 発表時刻:2025年7月20日 17:00:00(JST)
- 現在の東京の気温:**明日の予想気温が25℃(最低)から34℃(最高)**となっています
  - 注:リアルタイムの現在気温は含まれておらず、予報気温のデータとなります
- 天気:晴れ、夜遅くから雲り、多摩西部では雨で雷を伴う予報

### 2. 現在の時刻

**現在の時刻:2025年7月20日 16時12分10秒(UTC)**
(日本時間では2025年7月20日 25時12分10秒)

### 3. 数学計算

**123456 ÷ 678910 = 0.1818444271**

すべてのタスクが正常に完了しました。気象庁のAPIからは現在のリアルタイム気温ではなく予報データが提供されているため、明日の予想気温をお示ししました。## 結果の総括

すべてのタスクを実行しましたので、結果をお伝えします:

### 1. 東京の現在の気温について

**1-1. 都市コード取得**
- 気象庁の地域コードAPIから東京都の都市コード「130000」を正常に取得しました。

**1-2. 天気予報データ取得**
- 東京地方の天気予報データを取得しました。
- 発表時刻:2025年7月20日 17:00:00(JST)
- 現在の東京の気温:**明日の予想気温が25℃(最低)から34℃(最高)**となっています
  - 注:リアルタイムの現在気温は含まれておらず、予報気温のデータとなります
- 天気:晴れ、夜遅くから雲り、多摩西部では雨で雷を伴う予報

### 2. 現在の時刻

**現在の時刻:2025年7月20日 16時12分10秒(UTC)**
(日本時間では2025年7月20日 25時12分10秒)

### 3. 数学計算

**123456 ÷ 678910 = 0.1818444271**

すべてのタスクが正常に完了しました。気象庁のAPIからは現在のリアルタイム気温ではなく予報データが提供されているため、明日の予想気温をお示ししました。

公式ツールを使えばこんなにも簡単に実装できるんですね。

別のモデルに変えてみる

pip install strands-agents[openai]

OpenAIのモデルはBedrockにないので(確か。。)、OpenAI用のパッケージをインストールして利用したいモデル名とその他もろもろの設定をすれば使えます。

from strands import Agent
from strands.models.openai import OpenAIModel
from strands_tools import calculator
from dotenv import load_dotenv
load_dotenv()

import os

OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') 

model = OpenAIModel(
    client_args={
        "api_key": OPENAI_API_KEY,
    },
    # **model_config
    model_id="gpt-4o-mini",
    params={
        "max_tokens": 1000,
        "temperature": 0.7,
    }
)

agent = Agent(model=model, tools=[calculator])
response = agent("あなたのモデルは?短く回答してください。")
print(response)

実行結果例(出力)

私はGPT-4です。

ほかにもいろいろツールがあるみたいです。
image.png

感想

LangChainで同じようなことはできますが、コードが短くシンプルにエージェントが作れるのはいいなと思いました。
ほかにもAWSコンソールで細かいセキュリティを設定できたり、AgentCoreというものを作ればサクッとデプロイできるらしいので、試してみたいなと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?