AWS最新情報をAIエージェントが日本語で要約する仕組みをStrands Agentsを使って実装した

はじめに

個人的な日課の一つにAWSの最新情報を確認するというのがあります。日本語の情報を確認することもやるのですが、第一報は英語で行われるため英語の情報を確認することも併せてやっています。たとえば、What's New with AWSなどを日々確認します。

aws.amazon.com

ただ、私自身英語を読むのはあまり得意ではないので、読むのに時間がかかったり読むのを後回しにしてしまいます。この状態をなんとかしたいなと思っているときに、AIエージェントで情報を収集させて日本語で要約させれば良いということを思いつきました。

今回は、このことをStrands Agentsを使って実装してみたのでその紹介を行います。ちなみに、Strands Agentsについては以下のブログを紹介するに留めます。

aws.amazon.com

Python版?TypeScript版?

Strands AgentsはPython版とTypeScript版がありますが、今回はPython版を使います。理由はPython版の方がToolが充実しているからです。Python版には以下のようなToolがあります。

strandsagents.com

TypeScript版は先日のre:Inventで発表されてから間もないということもあり、Toolがかなり少ないので2025年12月現在ではPython版のほうがよいと考えています。

準備

まずはuv initでプロジェクトを新規作成後、以下のコマンドで必要なライブラリをインストールします。

$ uv add strands-agents "strands-agents-tools[rss]"

あとは実装したアプリ(後述)を以下のコマンドで実行します。

$ uv run main.py

実装

実際の実装は以下のとおり。

import os

from strands import Agent
from strands.models import BedrockModel

from strands_tools import rss, file_read, current_time, file_write

os.environ["BYPASS_TOOL_CONSENT"] = "true"

model = BedrockModel(
    model_id="jp.amazon.nova-2-lite-v1:0",
    max_tokens=8192
)

PROMPT = f"""
あなたは、RSSフィードから記事を収集し、日本語で要約・解説するエージェントです。要件は以下のとおりです。

- RSSツールを利用し、 `./feeds.json` に記載されたURLから記事を取得してください。
- 各記事は1000文字以内で日本語で要約してください。
- 1つのRSSフィードからは最大10件の記事を抽出してください。
- このエージェントは1日で複数回実行されます。前回実行したあとに更新された記事のみを要約してください。
- 要約の結果を current_timeツールを利用して現在日付と現在時刻を使って`yyyymmdd-hhmmss_news.md` としてカレントディレクトリにファイル出力してください。
"""

agent = Agent(
    model=model,
    tools=[rss, file_read, current_time, file_write]
)

agent(PROMPT)

30行程度のプログラムで以下のような要約結果を出力してくれます。

# AWS ニュースサマリー (2025年12月20日)

## AWS News Blog から

### 1. AWS Weekly Roundup: Amazon ECS, Amazon CloudWatch, Amazon Cognito など (12月15日)
* **Amazon WorkSpaces Secure Browser**: Webコンテンツフィルタリング機能が導入され、25以上の事前定義カテゴリ、詳細なURLポリシー、コンプライアンスログが利用可能に
* **Amazon Aurora DSQL**: クラスター作成が数秒で可能に、開発者コンソールとAI開発がサポート
* **Amazon Aurora PostgreSQL**: Kiroパワーズとの統合でAIアシストされたコーディングがサポート
* **Amazon ECS**: Fargateタスクでカスタムコンテナストップシグナルがサポート
* **Amazon CloudWatch SDK**: JSONとCBORプロトコルがデフォルトでサポートされ、パフォーマンスが向上
* **Amazon Cognito**: PrivateLink経由のプライベート接続がサポート
* **AWS Application Migration Service**: IPv6がサポート

### 2. AWS Weekly Roundup: AWS re:Invent キーノートリカプ、ビデオオンデマンドなど (12月8日)
* **Kiro Autonomous Agent**: AI開発環境としてAmazonで標準採用
* **Multimodal Retrieval for Bedrock Knowledge Bases**: テキスト、画像、オーディオ、ビデオのマルチモーダル検索がサポート
* **AWS Interconnect – Multicloud**: Google Cloudとのプレビュー開始

(省略)

実行したマシンの出力には以下のようなものが出力されました。

$ uv run main.py

Tool #1: file_read

Tool #2: rss

Tool #3: current_time

Tool #4: rss

Tool #5: rss

Tool #6: current_time

Tool #7: file_write
✅ **要約が完了しました!**

`20251220-121946_news.md` に、AWS News Blog と AWS What's New の最新記事から抽出した10件のニュースを日本語で要約しました。

このファイルには、AWSの最新機能やアップデートに関する詳細な要約が含まれており、今後の参考にしていただけます。

ポイントをいくつか解説します。

ツール利用の同意確認

以下のように環境変数BYPASS_TOOL_CONSENTに対してtrueを設定しています。

os.environ["BYPASS_TOOL_CONSENT"] = "true"

これは一部のToolの利用の際に求められる同意をバイパスするための設定です。以下に説明があります。

strandsagents.com

これを設定しておかないと、このエージェントを実行した際にファイル出力のタイミングで以下のように同意が求められます。

$ uv run main.py
(省略)
Tool #7: file_write
Do you want to proceed with the file write? [y/*] y

生成AIのモデル

生成AIのモデルは今回Amazon Nova2としました。理由は料金の安さです。

model = BedrockModel(
    model_id="jp.amazon.nova-2-lite-v1:0",
    max_tokens=8192
)

ある程度動作確認が取れたらClaudeを使おうかなと考えています。

プロンプト

プロンプトは試行錯誤の最中です。

PROMPT = f"""
あなたは、RSSフィードから記事を収集し、日本語で要約・解説するエージェントです。要件は以下のとおりです。

- RSSツールを利用し、 `./feeds.json` に記載されたURLから記事を取得してください。
- 各記事は1000文字以内で日本語で要約してください。
- 1つのRSSフィードからは最大10件の記事を抽出してください。
- このエージェントは1日で複数回実行されます。前回実行したあとに更新された記事のみを要約してください。
- 要約の結果を current_timeツールを利用して現在日付と現在時刻を使って`yyyymmdd-hhmmss_news.md` としてカレントディレクトリにファイル出力してください。
"""

使用して欲しいツールはRSSツールcurrent_timeツールと明記した方が良いと感じています。

また、後述しますが出力するファイルの中身についてはフォーマットを明記していないので出力結果が実行のタイミングで大きく変わります。

課題

非常に簡素なプログラムでAIエージェントを実装できたのですが、課題がいくつかあります。

1. 出力するMarkdownのフォーマットの指定

出力するMarkdownのフォーマットの指定をしていないので、出力する内容が実行のたびに変わります。元ネタのURLぐらいは出力させようかなと考えています。

2. 更新された記事がない時も同じ情報を要約してしまう

プロンプトには、前回実行した後に更新された記事のみを要約してくださいと書いているにも関わらず、複数回実行すると過去の記事も要約してしまいます。

ツールのソースを読むとSTRANDS_RSS_STORAGE_PATHに指定したパスに読み込んだRSSの情報をファイル保存するようです。

github.com

そこでexport STRANDS_RSS_STORAGE_PATH='./strands_rss_storage'を指定した後にAIエージェントを実行します。すると、たまに更新対象はないと返してくれることもあります。たまにしか判定してくれないのが課題です。

$ uv run main.py

Tool #1: file_read

Tool #2: current_time

Tool #3: rss

Tool #4: rss

Tool #5: rss

Tool #6: rss
RSSフィードから記事を取得したところ、両フィード(AWS News BlogとAWS What's New)とも新しい更新された記事はありませんでした。前回の実行以降に新しい記事が公開されていないため、要約処理を行う記事がありません。

次の実行時には、新しい記事がフィードに追加された場合に処理が行われる予定です。

この課題については、生成AIのモデルを変更することで対応できるかもしれません。