📝

【Amazon Bedrock AgentCore】Streamlit使って簡単なチャットを作成してみた

に公開

Amazon Bedrock AgentCore とは

あらゆるフレームワークとモデルを使用して、非常に効果的なエージェントを安全かつ大規模にデプロイおよび運用できます。
Amazon Bedrock AgentCore を使用すると、開発者は実際のデプロイに不可欠なスケール、信頼性、セキュリティを備えた AI エージェントを迅速に本番環境に導入できます。
AgentCore は、エージェントをより効果的かつ有能にするためのツールと機能、エージェントを安全に拡張するための専用インフラストラクチャ、信頼できるエージェントを運用するためのコントロールを提供します。
Amazon Bedrock AgentCore サービスは構成可能で、一般的なオープンソースフレームワークやあらゆるモデルで動作するため、オープンソースの柔軟性とエンタープライズグレードのセキュリティと信頼性のどちらかを選ぶ必要はありません。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html

主なコンポーネント

AgentCore Runtime
セッション分離機能を備えた低レイテンシサーバレス環境を提供し、CrewAI、LangGraph、LlamaIndex、Strands Agentsなどの人気オープンソースフレームワークをサポートし、マルチモーダルワークロードと長時間実行エージェント(最大8時間)に対応します。

AgentCore Memory
セッションと長期メモリを管理し、モデルに関連コンテキストを提供しながら、エージェントが過去のやり取りから学習できるようにします。

AgentCore Observability
メタデータタグ付け、カスタム評価、軌跡検査、トラブルシューティング・デバッグフィルターを備えたエージェント実行のステップバイステップ可視化を提供します。

AgentCore Identity
AIエージェントがGitHub、Salesforce、Slackなどのサードパーティツールやサービスに、ユーザーに代わって、または事前承認されたユーザーの同意により安全にアクセスできるようにします。

AgentCore Gateway
AIエージェントが幅広いツールにアクセスする必要があり、AgentCore Gatewayは、エージェントがツールを発見・使用する安全な方法を提供し、API、Lambdaファンション、既存サービスをエージェント互換ツールに簡単に変換します。

AgentCore Code Interpreter
AIエージェントが複雑な計算、推論の検証、データ処理、または視覚化の生成を実行するために、サンドボックス環境でコードを安全に書いて実行する機能を提供します。

AgentCore Browser Tool
エージェントがWebベースのサービスとやり取りし、複雑なWebタスクを実行できるよう、安全でクラウドベースのブラウザランタイムを提供します。

ライブラリーの導入

uv とは、Python の超高速なパッケージマネージャ & 仮想環境ツールです。
Rust 製で、以下の複数のツールの機能をひとつに統合したオールインワンツールです:
https://docs.astral.sh/uv/

Strands Agents SDK は AWS(Amazon)がオープンソースとして公開した、モデル駆動型の AI エージェント SDK です。少量のコード(数行)で、モデルとツールをつなげてエージェントを構築・実行できるプラットフォームとなっています
https://strandsagents.com/latest/

uv init
uv add bedrock-agentcore strands-agents

##アプリケーションコードを作成
app.pyとしてバックエンド側のコードを作成します。

app.py
from bedrock_agentcore import RequestContext
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from strands import Agent
from strands.models import BedrockModel

model = BedrockModel(model_id="us.amazon.nova-lite-v1:0", region_name="us-east-1")
agent = Agent(model=model, callback_handler=None)

app = BedrockAgentCoreApp()


@app.entrypoint
def invoke(payload: dict, context: RequestContext):
    """Process user input and return a response"""
    user_message = payload.get("prompt")
    result = agent(user_message)
    return {"result": result.message}


if __name__ == "__main__":
    app.run()

動作確認

以下のコマンドでテストしてみます。

uv run app.py
INFO:     Started server process [29644]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)

cURLでリクエストを送信します。

curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d "{\"prompt\": \"こんにちは!東京スカイツリーははどこにありますか?\"}"
{"result":{"role":"assistant","content":[{"text":"こんにちは!東京スカイツリーは、東京都墨田区押上にある超高層タワーです。東京スカイツリーは、2012年に完成し、その高さは634メートルで、世界で最も高い独立塔となっています。\n\n東京スカイツリーは、東京のランドマークとして有名で、展望デッキやレ ストラン、ショップなど、様々な施設が設けられています。また、東京スカイツリーの周辺には、お台場や浅草など、多くの観光スポットがあります。\n\n東京 スカイツリーは、電車やバスなど、様々な交通手段でアクセスできます。最寄り駅は、東京メトロ半蔵門線・東武スカイツリーラインの押上駅です。また、東武 スカイツリーラインのとうきょうスカイツリー駅も近接しています。"}]}}

このように回答が返ってくれOKです。

このようなエラーが出る場合は、クレデンシャルを登録しているか確認してください。

{"error":"Unable to locate credentials"}
//環境変数
cmd 
AWS_PROFILE=xxxx

powershell
$Env:AWS_PROFILE = "xxxx"

AgentCore Runtimeへデプロイ

AgentCore Runtimeへデプロイしていきます。
AgentCore Runtimeは、ECRに登録したコンテナイメージを使用して起動するようなので、まずコンテナイメージをプッシュしていきます。

コンテナイメージを作成

以下のコードでECRにイメージをプッシュします。

$ACCOUNT_ID = aws sts get-caller-identity --query Account --output text
$AWS_REGION = "us-east-1"
$AGENT_NAME = "agentcore-basic"

docker buildx create --use

aws ecr create-repository --repository-name $AGENT_NAME --region $AWS_REGION
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin "$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"

$TAG = "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AGENT_NAME}:latest"

docker buildx build --platform linux/arm64 -t $TAG --push .

AgentCore Runtimeの設定


先ほど作成したECRを指定します。

これでデプロイが完了しました。

後ほど「agentRuntimeArn」を後で使うのでメモっておきます。

Streamlitでフロントエンドを作成

これでバックエンドは完了しました。
ここからはフロントエンドでagentRuntimeArnを使用して、Agentを呼び出してアプリを作成していきます。

Streamlit は、Python で手軽にインタラクティブな Web アプリケーションを作成できるオープンソースフレームワークです。特に以下のような用途に最適です。

uv add streamlit boto3

以下がStreamlitのコードです。

python
import json
import time
import uuid

import boto3
import streamlit as st

# bedrock-agentcoreのクライアント
agent_core_client = boto3.client("bedrock-agentcore", region_name="us-east-1")

# セッションID。33文字以上ないとエラーになる
session_id = str(int(time.time())) + "_" + str(uuid.uuid4()).replace("-", "")


st.title("Basic Chat")
st.write("Streamlit + Bedrock AgentCore + Strands Agents")

runtime_arn = st.text_input(label="AgentRuntime ARN")


if prompt := st.chat_input():
    with st.chat_message("user"):
        st.write(prompt)

    with st.spinner():
        response = agent_core_client.invoke_agent_runtime(
            agentRuntimeArn=runtime_arn,
            runtimeSessionId=session_id,
            payload=json.dumps({"prompt": prompt}),
            qualifier="DEFAULT",
        )

        response_body = response["response"].read()
        response_data = json.loads(response_body)

        with st.chat_message("assistant"):
            for content in response_data["result"]["content"]:
                st.write(content["text"])

ローカルで動作確認

以下のコマンドを実行します。

uv run streamlit run front.py

うまく実行できていますね!

ログの確認

以下の用にトレースができています。

エラーになっている場合、X-RayのTransaction Searchの有効化を確認してみてください

GitHubで編集を提案

Discussion