Skip to content

Python Agent

Filter this guidePick generator option values to hide sections that don't apply.

ツールを使用してエージェントを構築するためのPython AIエージェントを生成し、オプションでAmazon Bedrock AgentCore Runtimeにデプロイします。frameworkオプションでエージェントフレームワークを選択します:Strands(デフォルト)またはLangChainLangGraph上に構築)。

ジェネレーターは、サーバーprotocolを介してエージェントを公開します。両方のフレームワークは、HTTP(デフォルト)、他のA2A互換エージェントとの相互運用性のためのAgent-to-Agent (A2A)プロトコル、およびCopilotKitを介した直接的なフロントエンド統合のためのAG-UIプロトコルをサポートしています。

Python Agentは2つの方法で生成できます:

Terminal window
pnpm nx g @aws/nx-plugin:py#agent
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:py#agent --dry-run
パラメータデフォルト説明
project 必須string-Agentを追加するプロジェクト
framework strands | langchainstrands使用するエージェントSDK。
name string-Agentの名前(デフォルト: agent)
auth iam | cognitoiamエージェントとの認証に使用する方法。infraが設定されている場合にのみ適用されます(infraがnoneの場合は無視されます)。
protocol http | a2a | ag-uihttpAgentのサーバープロトコル。HTTPはFastAPI HTTPサーバーを公開します。A2AはAgent-to-Agentプロトコルサーバーを公開します。AG-UIは直接フロントエンド統合のためのAgent-User Interactionプロトコルサーバーを公開します。
iac inherit | cdk | terraforminherit優先するIaCプロバイダー。デフォルトでは、初期選択から継承されます。
infra agentcore | noneagentcoreエージェントをホストするインフラストラクチャのタイプ。
session s3 | dynamodb-s3 | in-memorys3Agentのセッションを永続化するために使用されるストレージ。LangChainは's3'または'dynamodb-s3'をサポートし、Strandsは's3'をサポートします。'in-memory'は両方で有効です。
preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

ジェネレーターは、既存のPythonプロジェクトに以下のファイルを追加します。生成されるファイルは、選択したprotocolによって異なります:

protocol = http
  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • init.py FastAPI application setup with CORS and error handling middleware
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • main.py FastAPI entry point for Bedrock AgentCore Runtime
        • Dockerfile Entry point for hosting your agent (excluded when infra is set to None)
    • pyproject.toml Updated with Strands dependencies
    • project.json Updated with agent serve targets
protocol = a2a

エントリーポイントは、A2Aプロトコルを介してエージェントを公開します(StrandsはStrands A2A Serverを使用し、LangChainはグラフをa2a-sdkエグゼキューターでラップします)、FastAPIアプリにマウントされます:

  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • main.py A2A server entry point
        • Dockerfile Entry point for hosting your agent (excluded when infra is set to None)
    • pyproject.toml Updated with framework and A2A dependencies
    • project.json Updated with agent serve targets
protocol = ag-ui

エントリーポイントは、CopilotKitとの直接的なフロントエンド統合のために、AG-UIプロトコルを介してエージェントを公開します。Strandsエージェントはag-ui-strands統合を使用し、LangChainエージェントはag-ui-langgraphを使用します:

  • Directoryyour-project/
    • Directoryyour_module/
      • Directoryagent/ (or custom name if specified)
        • __init__.py Python package initialization
        • agent.py Main agent definition with sample tools
        • session.py Resolves the framework-specific session persistence implementation
        • main.py AG-UI server entry point
        • Dockerfile Entry point for hosting your agent (excluded when infra is set to None)
    • pyproject.toml Updated with framework and AG-UI dependencies
    • project.json Updated with agent serve targets
infra = agentcore

このジェネレーターは、選択した iac に基づいてインフラストラクチャをコードとして提供するため、関連する CDK コンストラクトまたは Terraform モジュールを含む packages/common にプロジェクトを作成します。

共通のインフラストラクチャコードプロジェクトは、次のように構成されています:

  • Directorypackages/common/constructs
    • Directorysrc
      • Directoryapp/ プロジェクト/ジェネレーター固有のインフラストラクチャ用のコンストラクト
      • Directorycore/ app 内のコンストラクトによって再利用される汎用コンストラクト
      • index.ts app からコンストラクトをエクスポートするエントリーポイント
    • project.json プロジェクトのビルドターゲットと設定

Agentをデプロイするために、以下のファイルが生成されます:

  • Directorypackages/common/constructs/src
    • Directoryapp
      • Directoryagents
        • Directory<project-name>
          • <project-name>.ts CDK construct for deploying your agent
infra = none

infranoneを選択した場合、CDKコンストラクトやTerraformモジュールは生成されません。Agentはローカルでのみ実行できます。このモードでは、認証するホストされたエンドポイントがないため、authオプションは無視されます。

Bedrock AgentCore Runtimeにデプロイされると、エージェントはコンテナイメージにビルドされ、Amazon ECRにプッシュされ、AgentCore Runtimeで実行されます。クライアントはAgentCore Runtimeデータプレーンエンドポイントを呼び出し、リクエストをエージェントに転送します。エージェントはモデル推論のためにAmazon Bedrockを呼び出し、ツール、MCPサーバー、またはダウンストリームAPIを呼び出すことができます。

ClientECRStrands Agent(AgentCore Runtime)Bedrock(Model Inference)CloudWatch(Logs, Metrics) Containerimage InvokeModel

agent.pyを編集して、ツールの追加、モデルの設定、システムプロンプトのカスタマイズができます。APIは選択したフレームワークによって異なります。

ツールは、AIエージェントがアクションを実行するために呼び出すことができる関数です。両方のフレームワークは、ツールを定義するためのデコレーターベースのアプローチを使用し、関数名とdocstringからツール名と説明を導出し、型ヒントから入力スキーマを生成します。

from strands import Agent, tool
@tool
def calculate_sum(numbers: list[int]) -> int:
"""Calculate the sum of a list of numbers"""
return sum(numbers)
@tool
def get_weather(city: str) -> str:
"""Get weather information for a city"""
# Your weather API integration here
return f"Weather in {city}: Sunny, 25°C"
# Add tools to your agent
agent = Agent(
system_prompt="You are a helpful assistant with access to various tools.",
tools=[calculate_sum, get_weather],
)

Strandsは、strands-toolsパッケージを通じて事前構築されたツールのコレクションを提供します:

from strands_tools import current_time, http_request, file_read
agent = Agent(
system_prompt="You are a helpful assistant.",
tools=[current_time, http_request, file_read],
)

デフォルトでは、StrandsエージェントはClaude 4 Sonnetを使用しますが、モデルプロバイダーをカスタマイズできます。設定オプションについては、Strandsのモデルプロバイダーに関するドキュメントを参照してください:

from strands import Agent
from strands.models import BedrockModel
# Create a BedrockModel
bedrock_model = BedrockModel(
model_id="anthropic.claude-sonnet-4-20250514-v1:0",
region_name="us-west-2",
temperature=0.3,
)
agent = Agent(model=bedrock_model)

py#mcp-serverまたはts#mcp-serverジェネレーターを使用して作成したMCPサーバーを使用するには、connectionジェネレーターを使用できます。これにより、両方のフレームワークでMCPサーバーのツールがエージェントに組み込まれます。

Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

接続の設定方法の詳細については、connectionジェネレーターガイドを参照してください。

他のMCPサーバーについては、StrandsまたはLangChainのMCPドキュメントを参照してください。

エージェントの作成に関するより詳細なガイドについては、StrandsまたはLangChainのドキュメントを参照してください。

エージェントのサーバープロトコルは、通信方法を決定します。すべてのオプションはFastAPIによって提供されます。エントリーポイントが異なります:

  • HTTP(デフォルト):カスタム/invocationsエンドポイント、CORS、ストリーミングを備えた標準のFastAPIサーバー。カスタムクライアント統合に最適です。
  • A2A:FastAPIアプリにマウントされたAgent-to-Agentサーバー(StrandsはStrands A2A Serverを使用し、LangChainはフレームワークに依存しないa2a-sdkを使用します)。エージェントが他のA2A互換エージェントによって検出可能で呼び出し可能である必要がある場合に最適です。
  • AG-UI:SSE経由のAG-UIプロトコル(Strandsはag-ui-strandsを使用し、LangChainはag-ui-langgraphを使用します)。ReactウェブサイトでのCopilotKitとの直接的なフロントエンド統合に最適です。

サーバーのエントリーポイントはフレームワークによって異なります(Strandsはコンテキスト管理されたAgentを生成し、LangChainはコンパイルされたcreate_agentグラフを駆動します)が、各プロトコルの外部契約は同じです。

すべてのプロトコルは、AgentCoreランタイムのヘルスチェック契約のために/pingを公開します。A2Aエージェントはポート9000でリッスンし、HTTPおよびAG-UIエージェントはポート8080でリッスンします。生成されたDockerfileとインフラストラクチャは自動的に設定されます。

protocol = http

FastAPIサーバー(HTTPプロトコル)

Section titled “FastAPIサーバー(HTTPプロトコル)”

生成されたHTTPサーバーには以下が含まれます:

  • CORSミドルウェアを備えたFastAPIアプリケーションのセットアップ
  • エラーハンドリングミドルウェア
  • OpenAPIスキーマ生成
  • ヘルスチェックエンドポイント(/ping
  • エージェント呼び出しエンドポイント(/invocations

Pydanticを使用した呼び出し入力と出力のカスタマイズ

Section titled “Pydanticを使用した呼び出し入力と出力のカスタマイズ”

エージェントの呼び出しエンドポイントは、Pydanticモデルを使用してリクエストとレスポンスのスキーマを定義および検証します。これらのモデルをmain.pyでカスタマイズして、エージェントの要件に合わせることができます。

デフォルトのInvokeInputモデルはプロンプトを受け入れます。

from pydantic import BaseModel
class InvokeInput(BaseModel):
prompt: str

このモデルを拡張して、エージェントが必要とする追加のフィールドを含めることができます。

セッションIDは、Bedrock AgentCore Runtimeセッション契約と一致するx-amzn-bedrock-agentcore-runtime-session-id HTTPヘッダーから抽出されます。ヘッダーが提供されない場合、フォールバックとしてランダムなUUIDが生成されます。

ストリーミングレスポンスの場合、ジェネレーターはJsonStreamingResponseを提供します。これは、PydanticモデルをJSON Lines形式(application/jsonl)に自動的にシリアル化します。この形式は、OpenAPI 3.2のストリーミング仕様と互換性があり、生成されたTypeScriptクライアントとシームレスに動作します。

デフォルトでは、エージェントはエージェントのレスポンステキストを含むStreamChunkオブジェクトを生成します:

class StreamChunk(BaseModel):
content: str

StreamChunkモデルをニーズに合わせてカスタマイズできます:

from pydantic import BaseModel
class StreamChunk(BaseModel):
content: str
timestamp: str
token_count: int

FastAPIでのネイティブサポートについては、オープンな機能リクエストがあります。

ジェネレーターには、PingStatus定数のためのBedrock AgentCore Python SDKへの依存関係が含まれています。必要に応じて、FastAPIの代わりにBedrockAgentCoreAppを使用することは簡単ですが、型安全性が失われることに注意してください。

SDKの機能の詳細については、こちらのドキュメントを参照してください。

protocol = a2a

生成されたmain.pyは、A2Aサーバーを親FastAPIアプリにマウントし、/pingも公開します。Strandsエージェントは、Strands A2AServerを使用します。LangChainエージェントは、コンパイルされたグラフをa2a-sdk AgentExecutorでラップします。AgentCoreにデプロイされると、エントリーポイントはAppConfigからランタイムのパブリックARNを解決し、エージェントカードでアドバタイズします。

ほとんどのユーザーはこのファイルを変更する必要はありません。ツールやシステムプロンプトを変更するには、agent.pyを編集してください。A2Aサーバーは、エージェントのnamedescriptionからエージェントカード(/.well-known/agent-card.json)を生成します。

protocol = ag-ui

AG-UIサーバー(AG-UIプロトコル)

Section titled “AG-UIサーバー(AG-UIプロトコル)”

生成されたmain.pyは、Server-Sent Events(SSE)を介してAG-UIイベントをストリーミングする単一のPOSTエンドポイントと、AgentCoreランタイムのヘルスチェックのための/pingを公開します。配線はフレームワークによって異なります:

  • StrandsAgentag_ui_strands.StrandsAgentでラップし、FastAPIのlifespanハンドラー内で構築され(インポート時ではなく、コンテナ/セッション起動時に構築が行われます)、手作りのFastAPI /invocationsループから提供されます。
  • LangChain:コンパイルされたグラフをag_ui_langgraph.LangGraphAgentでラップし、同じようにlifespan内で構築され、手作りのFastAPI /invocationsループから提供されます。

ほとんどのユーザーはこのファイルを変更する必要はありません。ツールやシステムプロンプトを変更するには、agent.pyを編集してください。

Agent(およびそれに接続されているすべてのもの)をローカルで実行するには、プロジェクトのdevターゲットを使用します:

Terminal window
pnpm nx dev your-project

プロジェクトに複数のコンポーネント(エージェント、MCPサーバーなど)を追加した場合、これによりすべてが起動します。このエージェントのみを実行するには、その<your-agent-name>-devターゲットをターゲットにします:

Terminal window
pnpm nx agent-dev your-project

これは、uv runを使用してBedrock AgentCore Python SDKを使用してAgentを実行します。

ジェネレーターは、エージェントとの対話型ターミナルチャットに入る<your-agent-name>-chat Nxターゲットを設定します。

チャットターゲットはスタンドアロンで実行されます。デフォルトでは、ローカルで実行されているエージェントに接続するため、まずエージェントの<your-agent-name>-devターゲットを(別のターミナルで)起動します:

Terminal window
pnpm nx agent-dev your-project

次に、別のターミナルでチャットを開始します:

Terminal window
pnpm nx run your-project:agent-chat

ジェネレーターは、すべてのプロトコルに対してscripts/<your-agent-name>/chat.tsを生成します。デフォルトではローカルエージェントに接続しますが、RUNTIME_CONFIG_APP_IDが設定されている場合はデプロイされたエージェントに接続します(以下のデプロイされたエージェントとのチャットを参照)。

HTTPエージェントの場合、チャットスクリプトは、エージェントのOpenAPI仕様から生成された型安全なTypeScriptクライアントを使用します。ジェネレーターは以下も生成します:

  • scripts/<your-agent-name>_openapi.py — エージェントのOpenAPI仕様をエクスポートする小さなスクリプト
  • それを実行する<your-agent-name>-openapi Nxターゲット
  • scripts/<your-agent-name>/generated/の下に型安全なTypeScriptクライアントを生成する<your-agent-name>-generate-client Nxターゲット

エージェントの入力形状をカスタマイズする場合(例:InvokeInputに新しいフィールドを追加)、chat.tsを更新してエージェントを呼び出すときに新しいフィールドを渡すと、残りは自動的に機能します。

infra = agentcore

デプロイされたエージェントとのチャット

Section titled “デプロイされたエージェントとのチャット”

Bedrock AgentCoreにデプロイされたエージェントとチャットするには、RUNTIME_CONFIG_APP_ID環境変数をデプロイのAppConfigアプリケーションID(デプロイされたスタックによってRuntimeConfigApplicationIdとして出力されます)に設定します。チャットスクリプトは、ランタイム設定からエージェントのランタイムARNを解決し、デプロイされたエンドポイントに接続します:

IAM認証されたエージェントの場合、リクエストはデフォルトのAWS認証情報を使用してSigV4で署名されます。環境にランタイムを呼び出す権限を持つAWS認証情報があることを確認してください:

Terminal window
RUNTIME_CONFIG_APP_ID=<app-id> pnpm nx run your-project:agent-chat
infra = agentcore

Bedrock AgentCore RuntimeへのAgentのデプロイ

Section titled “Bedrock AgentCore RuntimeへのAgentのデプロイ”

infraagentcore を選択した場合、関連する CDK または Terraform インフラストラクチャが生成され、これを使用して Agent を Amazon Bedrock AgentCore Runtime にデプロイできます。

Agent 用の CDK コンストラクトが生成されます。名前はジェネレーター実行時に選択した name に基づくか、デフォルトでは <ProjectName>Agent となります。

この CDK コンストラクトを CDK アプリケーションで使用できます:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
new MyProjectAgent(this, 'MyProjectAgent');
}
}

ジェネレーターは Agent の認証を設定するための auth オプションを提供します。エージェント生成時に IAM(デフォルト)または Cognito 認証を選択できます。

デフォルトでは、Agent は IAM 認証を使用して保護されます。引数なしでデプロイするだけです:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
new MyProjectAgent(this, 'MyProjectAgent');
}
}

grantInvokeAccess メソッドを使用して、Bedrock AgentCore Runtime 上のエージェントを呼び出すアクセス権を付与できます。例:

import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const agent = new MyProjectAgent(this, 'MyProjectAgent');
const lambdaFunction = new Function(this, ...);
agent.grantInvokeAccess(lambdaFunction);
}
}

Cognito 認証を選択すると、ジェネレーターは Cognito を使用するようにエージェントを設定します。

生成されたコンストラクトは、Cognito 認証を設定する identity プロパティを受け入れます:

import { MyProjectAgent, UserIdentity } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const identity = new UserIdentity(this, 'Identity');
new MyProjectAgent(this, 'MyProjectAgent', {
identity,
});
}
}

UserIdentity コンストラクトは ts#website#auth ジェネレーターを使用して生成するか、独自の CDK UserPoolUserPoolClient を作成できます。

Bedrock AgentCore Runtime用にAgentをビルドするために、プロジェクトにbundleターゲットが追加されます。これは以下を行います:

  • uv exportを使用してPython依存関係をrequirements.txtファイルにエクスポート
  • uv pip installを使用してターゲットプラットフォーム(aarch64-manylinux_2_28)用の依存関係をインストール

Agentに固有のdockerターゲットも追加され、Dockerfileとバンドルされたアーティファクトをdockerコンテキストディレクトリにコピーします。これにより、Dockerfileがビルド出力と同じ場所に配置され、CDKがAgentRuntimeArtifact.fromAssetを使用してDockerイメージを直接ビルドできます。

このプロジェクト用にビルドされた Docker イメージは、ECR ホスト版 Trivy イメージから実行される Trivy を使用して脆弱性をスキャンできます。

プロジェクトに trivy ターゲットが追加され、ビルドされたイメージをスキャンし、HIGH または CRITICAL の深刻度の脆弱性が見つかった場合は非ゼロで終了します。生成された Dockerfile は、生成時点でこれらの深刻度の既知の修正可能な脆弱性がないベースイメージを使用し、バンドルされたツール(npm など)をアップグレードしてその状態を維持します。

スキャンはイメージビルドと同じコンテナエンジン(docker または finch)を使用するため、追加のツールは必要ありません。スキャンはイメージが変更された場合にのみ再実行されるため、変更されていないイメージは再スキャンされません。提供される trivy ルートスクリプトは、ワークスペース内のすべてのイメージをスキャンします:

Terminal window
pnpm trivy

特定の脆弱性を抑制したい場合があります。たとえば、まだ修正が利用できず、リスクを許容可能と評価した場合などです。

脆弱性 ID(1 行に 1 つ)をプロジェクトのルート(つまり project.json の隣)にある .trivyignore ファイルに追加します:

.trivyignore
# node-tar arbitrary file write - not exploitable in our usage
CVE-2024-XXXXX

検出結果のフィルタリングの詳細については、Trivy フィルタリングドキュメントを参照してください。

エージェントは、Dockerfileで自動計装を設定することにより、AWS Distro for Open Telemetry(ADOT)を使用した可観測性で自動的に設定されます。

CloudWatch AWSコンソールで、メニューから「GenAI Observability」を選択することで、トレースを見つけることができます。トレースを入力するには、Transaction Searchを有効にする必要があることに注意してください。

詳細については、AgentCoreの可観測性に関するドキュメントを参照してください。

sessionオプションは、選択したフレームワークに応じて、異なる基礎となる永続化概念にマップされます:strandsフレームワークの場合はStrandsのセッション管理概念、langchainフレームワークの場合はLangGraphのcheckpointer概念です。

framework = strands

sessionオプションは、Strands SDKのSessionManagerを使用して、エージェントが呼び出し間で会話状態(メッセージ履歴、ツール状態など)を永続化する方法を制御します:

  • s3(デフォルト):CDK/Terraformインフラストラクチャは、セッションデータ用の専用S3バケットをプロビジョニングし、専用のKMSキーで暗号化され、すべてのパブリックアクセスがブロックされます。サーバーアクセスログは、同じキーを介してCloudWatch Logsロググループに配信されます。エージェントのIAMロールには、バケットへの読み取り/書き込み/リスト/削除アクセスと、キーへの復号化/データキー生成アクセスが付与され、バケット名はAppConfigランタイム設定でエージェントのARNと一緒に登録されます。
  • in-memory:バケットはプロビジョニングされません。会話状態は、実行中のプロセスの存続期間中のみメモリに保持され、再起動やスケールインには耐えられません。

これは、生成されたsession.pyに実装されており、現在のセッションのSessionManagerを解決するget_session_manager()関数をエクスポートします。

セッションID自体は、AgentCore Runtimeセッション(x-amzn-bedrock-agentcore-runtime-session-idヘッダーを介して伝播)から取得され、contextvars.ContextVarベースのコンテキストにバインドされるため、get_current_session_id()はリクエスト内のどこでもそれを解決できます。これには、connectionジェネレーターを介して配線された下流のMCPまたはA2Aクライアントも含まれるため、呼び出しチェーン全体が一貫したセッションを共有します。

framework = langchain

sessionオプションは、エージェントのLangGraphチェックポインターが会話状態を永続化する方法を制御します:

  • s3(デフォルト):デプロイされたエージェントは、プロビジョニングされたセッションバケットでS3CheckpointSaverを使用し、checkpoints/プレフィックスの下にチェックポイントと保留中の書き込みを保存します。このクラスは、共有エージェント接続プロジェクトのs3_checkpoint_saver_langchain.pyにあります。
  • dynamodb-s3:CDK/Terraformインフラストラクチャは、チェックポイント用のDynamoDBテーブルをプロビジョニングし、LangGraphエージェントのチェックポイントストアとしてDynamoDBを使用することに関するAWSドキュメントで推奨されているように設定されます(統一されたPK/SKスキーマ、PAY_PER_REQUEST課金、ポイントインタイムリカバリ、およびttl属性)、さらに350KBを超えるチェックポイントをオフロードするためのS3バケット。両方とも専用のKMSキーで暗号化されます。バケットのサーバーアクセスログは、同じキーを介してCloudWatch Logsロググループに配信されます。エージェントのIAMロールには、テーブルとバケットへの読み取り/書き込みアクセスが付与され、テーブル/バケット名はAppConfigランタイム設定でエージェントのARNと一緒に登録されます。
  • in-memory:テーブルまたはバケットはプロビジョニングされません。会話状態は、実行中のプロセスの存続期間中のみメモリに保持され、再起動やスケールインには耐えられません。

これは、生成されたsession.pyに実装されており、agent.pycreate_agent(..., checkpointer=get_checkpointer())から呼び出されるget_checkpointer()関数をエクスポートします。

protocol = http

<your-agent-name>-serveターゲットを介してローカルで実行されているAgentを呼び出すには、ローカルエージェントが実行されているポートの/invocationsに簡単なPOSTリクエストを送信できます。たとえば、curlを使用して:

Terminal window
curl -N -X POST http://localhost:8081/invocations \
-d '{"prompt": "what is 3 + 5?"}' \
-H "Content-Type: application/json"

Bedrock AgentCore Runtimeにデプロイされたエージェントを呼び出すには、URLエンコードされたランタイムARNを使用してBedrock AgentCore RuntimeデータプレーンエンドポイントにPOSTリクエストを送信します。

ランタイムARNは、以下のようにインフラストラクチャから取得できます:

import { CfnOutput } from 'aws-cdk-lib';
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
const agent = new MyProjectAgent(this, 'MyProjectAgent');
new CfnOutput(this, 'AgentArn', {
value: agent.agentCoreRuntime.agentRuntimeArn,
});
}
}

ARNは次の形式になります:arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>

その後、:%3Aに、/%2Fに置き換えることでARNをURLエンコードできます。

エージェントを呼び出すためのBedrock AgentCore RuntimeデータプレーンのURLは次のとおりです:

https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations

このURLを呼び出す正確な方法は、使用される認証方法によって異なります。

IAM認証の場合、リクエストはAWS Signature Version 4(SigV4)を使用して署名する必要があります。

Terminal window
acurl <region> bedrock-agentcore -N -X POST \
'https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocations' \
-d '{"prompt": "what is 3 + 5?"}' \
-H 'Content-Type: application/json'
上記のacurlコマンドの設定の詳細についてはこちらをクリックしてください

Reactウェブサイトからエージェントを呼び出すには、connectionジェネレーターを使用できます。これにより、正しい認証(IAMまたはCognito)を持つクライアントが自動的にセットアップされます。

Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

接続の設定方法の詳細については、connectionジェネレーターガイドを参照してください。

protocol = a2a

A2A Agentをツールとして呼び出す

Section titled “A2A Agentをツールとして呼び出す”

このエージェントからリモートA2Aエージェント(TypeScriptまたはPython)に作業を委任するには、connectionジェネレーターを使用します。これにより、ターゲットエージェント用のSigV4認証クライアントが提供され、このエージェントのagent.pyがAST変換されて、リモートA2Aエージェントが@toolデコレートされたデリゲートとして登録されます。

Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

接続の設定方法の詳細については、connectionジェネレーターガイドを参照してください。

protocol = ag-ui

ReactウェブサイトからAG-UIエージェントを呼び出すには、connectionジェネレーターを使用します。これにより、正しい認証(IAMまたはCognito)を持つデプロイされたエージェント用に設定されたCopilotKitクライアントが配線されます。

Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

接続の設定方法の詳細については、connectionジェネレーターガイドを参照してください。

エージェントは信頼できない入力に対して動作し、ツールを通じて実際のアクションを実行できるため、最初からセキュリティを考慮する価値があります。以下のプラクティスは、生成されたエージェントに適用されます。

モデルの入力と出力を信頼できないものとして扱う

Section titled “モデルの入力と出力を信頼できないものとして扱う”

プロンプトには敵対的な指示(プロンプトインジェクション)が含まれる可能性があり、モデルの出力は非決定的です。どちらもセキュリティに敏感なロジックで信頼すべきではありません:

  • 生成されたサンプルツールのように、ツールに対して厳密な入力スキーマを定義します。自由形式の文字列を受け入れるのではなく、ツールが実際に必要とするもの(列挙型、長さ制限、数値範囲)に値を制約します。
  • モデルの出力を検証やエンコーディングなしに、シェルコマンド、SQLクエリ、コード評価、またはレンダリングされたHTMLに直接渡さないでください。
  • ツールおよび下流のサービスで認可チェックを適用します。モデルがアクセス権を持つツールの誤用を防ぐためにシステムプロンプトに依存しないでください。

StrandsのPrompt EngineeringおよびResponsible AIガイドでは、堅牢で安全性を意識したシステムプロンプトの作成について説明しています。

ツールの権限を厳密にスコープする

Section titled “ツールの権限を厳密にスコープする”

エージェントのIAMロールには、そのツールが必要とする権限のみを付与します。提供されるCDKコンストラクトとTerraformモジュールは、この目的のためにgrant*メソッドとスコープされたポリシーを公開しています。たとえば、広範な管理ポリシーをアタッチするのではなく、特定のAPIを呼び出すアクセス権をエージェントに付与します。ツールがユーザーの代わりに動作する場合は、エージェント自身の環境権限よりも、呼び出し元ユーザーのアイデンティティ(リクエストコンテキストを通じて渡される)を使用してアクションを認可することを優先します。

モデルの動作は予期しない方法で変化する可能性があるため、コード変更なしでモデルを迅速に無効化または交換できるように計画します:

  • モデルIDを設定から読み取ります(たとえばMODEL_ID環境変数)。これにより、オペレーターは設定を更新することで別のモデルに切り替えたりロールバックしたりできます。
  • エージェントをフィーチャーフラグの背後に配置して、AI機能を完全に無効化できるようにします。無効化された場合は、エラーではなく一般的なメッセージを返し、アプリケーションの残りの部分が適切に劣化することを確認します。

これらのコントロールを切り替える方法を運用ランブックに文書化します。

  • プロンプトと補完のログ記録を避けます。これらにはユーザーデータが含まれる可能性があります。生成されたエージェントのモデルエラーログフックは、会話の内容ではなくエラーメタデータのみをログに記録します。独自のログを追加する際は、このプロパティを維持してください。
  • ユーザーには一般的なエラーメッセージを返します。詳細なエラーはサーバー側でログに記録します。
  • ユーザーとセッション間で会話状態を分離し、永続化されたセッションデータへのアクセスを認可します。
  • プロンプトと出力から個人を特定できる情報(PII)を編集します。Bedrock Guardrailの機密情報フィルター(以下)を使用するか、Strandsエージェントの場合はPII Redactionガイドのアプローチを使用します。

Amazon Bedrock Guardrailsは、モデルの入力と出力で評価される、設定可能なコンテンツフィルター、拒否されたトピック、および機密情報(PII)フィルターを提供します。生成されたエージェントが使用するモデルにガードレールをアタッチできます:

agent.py
import os
from strands import Agent
from strands.models import BedrockModel
model = BedrockModel(
model_id=os.environ.get("MODEL_ID"),
guardrail_id=os.environ["GUARDRAIL_ID"],
guardrail_version=os.environ.get("GUARDRAIL_VERSION", "DRAFT"),
)
agent = Agent(model=model)

詳細については、StrandsのGuardrailsガイドを参照してください。

connectionジェネレーターを使用して、このプロジェクトをワークスペース内の他のプロジェクトと統合します。このプロジェクトに関連する接続は以下のとおりです:

Strands AgentsPython
React to Python AgentReactウェブサイトからPython Agentを呼び出す
CopilotKit
React to AG-UI AgentCopilotKitを介してReactウェブサイトからAG-UIプロトコルを公開するAgentを呼び出す
Strands AgentsPythonModel Context Protocol
Python Agent to MCPPython AgentをMCPサーバーに接続する
Strands AgentsPythonAgent2Agent
Python Agent to A2A AgentPython AgentをリモートA2Aエージェントに接続する
Strands AgentsTypeScriptAgent2Agent
TypeScript Agent to A2A AgentTypeScript AgentをリモートA2Aエージェントに接続する
Strands AgentsPythonAmazon DynamoDBPython
Python Agent to Python DynamoDBPython AgentをDynamoDBテーブルに接続する
Strands AgentsPythonAmazon Bedrock AgentCore Gateway
Python Agent to AgentCore GatewayPython AgentをAgentCore Gatewayに接続する
Amazon Bedrock AgentCore GatewayStrands Agents
AgentCore Gateway to AgentエージェントをランタイムターゲットとしてAgentCore Gatewayでフロントする