書籍「AIエージェント開発/運用入門」 #AIエージェント開発運用入門
はじめに

「Amazon Bedrock生成AIアプリ開発入門」に続き、今回もみのるんさんから献本をいただきました。 ありがとうございます!
今回は第6章について記載します。
前回の記事はこちら。
各章の感想
第6章 高度なAIエージェントの開発に挑戦しよう
6.5節にてStrandsを利用したマルチエージェント構築のハンズオンが紹介されています。 こちらがすごい面白く為になったので、こちらを紹介します。
6.5 Strands でマルチエージェントを構築して、AgentCore にデプロイしよう
私は複数のProfileを設定しているため、 agentcore configure を実行したところサマリー出力にてデフォルトのAWSアカウントIDが設定されていることがわかりました。
.bedrock_agentcore.yaml が生成されており、こちらの設定ファイルにデプロイ先のAWSアカウントIDが設定されているようです。
設定ファイルを実際にデプロイしたいAWSアカウントIDに書き換えてから agentcore launch コマンドを実行することにより、想定したAWSアカウントにデプロイされました。
Backendのデプロイが完了したので、Frontendのサンプルを動かしてみます。 まず、そのままFrontendのサンプルを動かしたところ以下のエラーが発生しました。
エラーが発生しました: 'AgentsforBedrockRuntime' object has no attribute 'invoke_agent_runtime'
これは、boto3の呼び出し方に問題がありそうです。 まず、シンプルなコードでBackendが正しいか試してみます。 Bedrock AgentCoreのコンソール画面にて、呼び出しコードが表示されているので、こちらを参考にして呼び出してみます。
import boto3 import json client = boto3.client('bedrock-agentcore', region_name='us-west-2') payload = json.dumps({ "input": {"prompt": "さっきAgentCore関連のIAMロールの権限内容を確認したんだけど、その権限内容を確認して、AWSドキュメントに基づいて解説して"} }) response = client.invoke_agent_runtime( agentRuntimeArn='arn:aws:bedrock-agentcore:us-west-2:999999999999:runtime/aws_assistant-999999999', runtimeSessionId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', # Must be 33+ chars payload=payload, qualifier="DEFAULT" # Optional ) response_body = response['response'].read() response_data = json.loads(response_body) print("Agent Response:", response_data)
このままだと再度エラーが発生しました。 Profile設定が有効になっていないことと、レスポンスがストリーミング対応されていないことが原因のようです。 この2点について修正を加えたコードが以下になります。
import boto3 import json # 追加 # AWS プロファイル 'your-profile-name' を使用してセッションを作成 session = boto3.Session(profile_name='your-profile-name') # 変更 # Bedrock呼び出し用のAPIクライアントを作成(オレゴンリージョン) client = session.client("bedrock-agentcore", region_name='us-west-2') payload = json.dumps({ "input": {"prompt": "さっきAgentCore関連のIAMロールの権限内容を確認したんだけど、その権限内容を確認して、AWSドキュメントに基づいて解説して"} }) response = client.invoke_agent_runtime( agentRuntimeArn='arn:aws:bedrock-agentcore:us-west-2:999999999999:runtime/aws_assistant-999999999', runtimeSessionId='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', # Must be 33+ chars payload=payload, qualifier="DEFAULT" # Optional ) # 変更 # ストリーミングレスポンスを処理 print("Agent Response:") for line in response['response'].iter_lines(): decoded = line.decode("utf-8") if not line or not decoded.startswith("data: "): continue try: data = json.loads(decoded[6:]) # "data: "の後のJSON部分を取得 print(json.dumps(data, indent=2, ensure_ascii=False)) except json.JSONDecodeError as e: print(f"JSON decode error: {e}")
この内容で無事に実行することができました。
これでAgenteCoreの初期化に問題がありそうなことがわかったので、Frontendのサンプルコード app.py にも同様の修正を加えれば動作するはずです。
# AgentCore APIクライアントを初期化 # 追加 # AWS プロファイル 'your-profile-name' を使用してセッションを作成 session = boto3.Session(profile_name='your-profile-name') # 変更 # Bedrock呼び出し用のAPIクライアントを作成(オレゴンリージョン) # agent_core = boto3.client('bedrock-agentcore') agent_core = session.client("bedrock-agentcore", region_name='us-west-2')
この対応により、無事にローカルでStreamlitのUI経由でBackendを呼び出すことができました。
Backendのソースで少し気になったのは、すべてのファイルで asyncio をインポートしていることです。
非同期処理を行っている main.py と stream_handler.py 以外のファイルでは、特に非同期処理を行っていないので、Linterで警告が出ておりインポートする必要はないかもしれません。
所感
本章は、AIエージェントをBedrock AgentCoreにデプロイでき、Streamlitで簡単に動かせるようになるまでのハンズオンが紹介されており、非常に実践的で参考になりました。 サンプルどおりの環境で動かす場合は、そのまま動かせると思いますが、ローカルPCを用いて複数のAWSアカウントやProfileを利用している場合は、今回紹介したように設定ファイルを書き換えたり、コードを修正する必要があります。 いくつか修正が必要でしたが、こちらもコーディングエージェントを活用することにより、比較的スムーズに問題点について理解し、修正することができました。 ただ、慣れてないうちは素直に本書のサンプルどおりの環境で動かす方が良いと思います。 皆様も楽しいAIエージェントライフを!