AWSが発表したAIエージェント構築SDK「Strands Agents」を5分だけ触ったあとに、もう5分だけ触ってみた

完全に便乗投稿です。

こちらを先にお読みください。

https://qiita.com/minorun365/items/dd05a3e4938482ac6055

簡単にエージェントが作れます。間違いないです。
追加で、いくつか試してみたのでよければ御覧ください

## Bedrockのモデルやリージョンをカスタマイズする

デフォルトでは、オレゴン（us-west-2）リージョンのClaude 3.7 Sonnetが使われるのですが、リージョンやモデルをカスタマイズしたい場合はこんな指定をします。

- バージニア北部（us-east-1）リージョンのAmazon Nova Premierを使用する場合

    ```python
    import boto3
    from strands import Agent
    from strands.models import BedrockModel
    
    session = boto3.Session(
        region_name="us-east-1",
    )
    
    bedrock_model = BedrockModel(
        model_id="us.amazon.nova-premier-v1:0", boto_session=session
    )
    
    agent = Agent(model=bedrock_model)
    agent("Strandsってどういう意味？")
    ```

## Bedrock以外のモデルを使用する

Bedrock以外のモデルを使用する方法も用意されています。

- Anthropic
- LiteLLM
- Ollama
- Llama API

LiteLLMを使えばかなりたくさんのモデルを使用できますし、Ollamaを使うとローカルモデルが使えます。

例として、LiteLLM経由でOpenAIのo4-miniを使用する場合はこのような手順となります。

1. ライブラリーをインストールする
    
    ```shell
    uv add strands-agents[litellm]
    ```

1. `.env`にAPIキーを準備する

    ```text:.env
    OPENAI_API_KEY=sk-*****
    ```

1. Pythonのコードを実装する
    
    ```python
    from dotenv import load_dotenv
    from strands import Agent
    from strands.models.litellm import LiteLLMModel
    
    load_dotenv()
    
    litellm_model = LiteLLMModel(model_id="openai/o4-mini")
    
    agent = Agent(model=litellm_model)
    agent("Strandsってどういう意味？")
    
    ```

## ツールが沢山用意されている

エージェントを作る際に必須なエージェントですが、様々なエージェントが用意されています。

:::note
[ドキュメント](https://strandsagents.com/0.1.x/user-guide/concepts/tools/example-tools-package/)では、「Example Built-in Tools」という表現なので、「あくまでサンプルですよ」という位置づけなのかもしれません。ただ、[GitHubのリポジトリ](https://github.com/strands-agents/tools)では「サンプルだよ」のノリは感じられないので、「オープンソースなので無保証だけど自由に使ってね」のスタンスなのかもしれません。
:::

GitHubに記載のある機能の画面キャプチャです。
もう、ワクワクが止まりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c9c08262-aa58-4ab8-916e-8e78a7d1bf03.png)

### やってみた１：`file_write`ツールと`http_request`を使ってみる。

ツールは別ライブラリーとして用意されているのでインストールします。

```
uv add strands-agents-tools
```

コードはこんな感じです。難しくないですね。

```python
import boto3
from strands import Agent
from strands.models import BedrockModel
from strands_tools import file_write, http_request

session = boto3.Session(
    region_name="us-east-1",
)

bedrock_model = BedrockModel(
    model_id="us.amazon.nova-premier-v1:0", boto_session=session
)

agent = Agent(model=bedrock_model, tools=[file_write, http_request])
agent("http://www.yahoo.co.jpにアクセスして、今日の主要ニュースを「News.md」としてファイルに保存して")
```

実行します。標準出力に途中経過が出力されます。

動作で特徴的なのが、ファイル書き込みツールを使用するタイミングで、ユーザーに許可を求めます。
（黄色い文字の`Do you want to proceed with the file write?`でユーザーの入力待ちになります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/885de1ac-86c3-4359-bf3b-7c4385a0035d.png)

「Y」で回答すると、後続処理が行われ、ファイルへの出力が行われました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0ec0a535-9978-47dd-ad9d-1967d2a6a0d5.png)

### やってみた：`use_aws`ツールと`current_time`を使ってみる。

最後にAWSツールを使ってみました。

```python
import boto3
from strands import Agent
from strands.models import BedrockModel
from strands_tools import current_time, use_aws

session = boto3.Session(
    region_name="us-east-1",
)

bedrock_model = BedrockModel(
    model_id="us.amazon.nova-premier-v1:0", boto_session=session
)

agent = Agent(model=bedrock_model, tools=[use_aws, current_time])
agent("今月作成したLambdaの名称を取得して一覧で出力してください。")
```

出力をお見せするのは恥ずかしいので割愛しますが、ちゃんと動いたことだけお伝えします。


:::note
Strands Agentsがあれば、オレオレQ Developer CLIとか作れそうだな。。
:::


## おまけ

とか思ったところなんですが、 **Strands CLI** がすでに提供されていました！
（リポジトリ名と名前が食い違ってるので、ちょっと気持ち悪いですが。）

https://github.com/strands-agents/agent-builder


デフォルト動作でいい場合は以下で起動

```
uvx --from strands-agents-builder strands
```

これはもう、、Q Developer CLIですな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/15d62d12-aa09-416c-a0be-51ce5d216a22.png)