React から AG-UI エージェントへ
Nx Plugin for AWSは、AG-UIプロトコルを公開するStrands AgentにReactウェブサイトを接続するためのジェネレーターを提供します。このジェネレーターは、AWS IAMとCognito認証をサポートし、ウェブサイト上でCopilotKitと@ag-ui/client HttpAgentを配線します。
このジェネレーターを使用する前に、以下を確認してください:
- Reactウェブサイト(
ts#react-websiteジェネレーターを使用して生成) protocol=AG-UIを指定したPython Strands Agent(py#strands-agentジェネレーターを使用して生成)- デプロイされたエージェントの場合、
ts#react-website-authジェネレーターを介して追加されたCognito Auth
ジェネレーターの実行
Section titled “ジェネレーターの実行”- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionソースプロジェクトとしてReactウェブサイトを選択し、ターゲットプロジェクトとしてAG-UI Strands Agentを含むプロジェクトを選択するよう求められます。ターゲットプロジェクトに複数のコンポーネント(複数のエージェントや他のコンポーネントタイプなど)が含まれている場合、曖昧さを解消するためにtargetComponentを指定するよう求められます。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| sourceProject 必須 | string | - | ソース プロジェクト |
| targetProject 必須 | string | - | 接続先のターゲット プロジェクト |
| sourceComponent | string | - | 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。 |
| targetComponent | string | - | 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。 |
ジェネレーターの出力
Section titled “ジェネレーターの出力”ジェネレーターは、単一の共有AguiProviderコンポーネントと、接続されたエージェントごとに1つのフックを作成します:
Directorysrc
Directorycomponents
- AguiProvider.tsx すべてのAG-UIエージェント用の単一の
CopilotKitProvider。最初のconnection実行時に作成され、その後の実行で各新しいエージェントを登録するために更新されます。
- AguiProvider.tsx すべてのAG-UIエージェント用の単一の
Directoryhooks
- useAgui<AgentName>.tsx 1つのAG-UIエージェントを登録します。
connectionの実行ごとに1つのファイル。 - useSigV4.tsx SigV4署名(IAMのみ)
- useAgui<AgentName>.tsx 1つのAG-UIエージェントを登録します。
別のエージェントに対してconnectionを2回目に実行すると、新しいuseAgui<AgentName>.tsxフックが追加され、AguiProvider.tsxが両方のフックを登録するように更新されます — プロバイダーに加えたカスタム編集は保持されます。main.tsxは単一の<AguiProvider>ラッパーを保持します — ネストされたプロバイダーになることはありません。
以下の依存関係がルートのpackage.jsonに追加されます:
@copilotkit/react-core—CopilotKitProviderとチャットコンポーネント(CopilotChat、CopilotSidebar、CopilotPopup)を提供@ag-ui/client— 生成されたフックで使用されるHttpAgentaws4fetch、oidc-client-ts、react-oidc-context、@aws-sdk/credential-providers— IAM認証のみreact-oidc-context— Cognito認証
AG-UI接続
Section titled “AG-UI接続”各useAgui<AgentName>フックは、ランタイム設定からエージェントのランタイム値を読み取り、@ag-ui/client HttpAgentをインスタンス化します:
- デプロイ済み: ランタイム値はBedrock AgentCore Runtime ARNであり、AgentCore HTTPSエンドポイントに変換されます:
https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<encoded-arn>/invocations?qualifier=DEFAULT - ローカル開発:
serve-localは値をエージェントのローカルURL(例:http://localhost:8081)にオーバーライドします
共有AguiProviderは、生成されたすべてのフックを呼び出し、それぞれを単一のCopilotKitProvider上のselfManagedAgentsにスプレッドし、それらすべてをCopilotKitコンポーネントに公開します。
CopilotKit統合
Section titled “CopilotKit統合”CopilotKitは、AG-UIプロトコルのファーストパーティリファレンスReactクライアントであり、すぐに使えるチャットコンポーネントを提供します:
<CopilotChat />— フルチャットインターフェース<CopilotSidebar />— 固定サイドパネルチャット<CopilotPopup />— フローティングチャットポップアップ
これらのいずれかを<AguiProvider>ラッパー内の任意の場所に配置してください(すでにmain.tsxに配線されています)。
生成されたコードは、エージェントの設定に応じて認証を処理します:
- IAM(デフォルト): AWS SigV4署名されたHTTPリクエストを使用します。認証情報は、ウェブサイトの認証で設定されたCognito Identity Poolから取得されます。
- Cognito: JWTアクセストークンをBearerトークンとして
Authorizationヘッダーに埋め込みます。
インフラストラクチャ
Section titled “インフラストラクチャ”エージェントがIAM認証を使用する場合、Cognito Identity Poolの認証済みロールにエージェントを呼び出す権限を付与する必要があります。
const identity = new UserIdentity(this, 'Identity');const myAgent = new MyAgent(this, 'MyAgent');
// Grant the authenticated Cognito role permission to invoke the agentmyAgent.grantInvokeAccess(identity.identityPool.authenticatedRole);grantInvokeAccessは、エージェントのランタイムARNに対して、すべてのAgentCore呼び出しアクション(InvokeAgentRuntime、InvokeAgentRuntimeWithWebSocketStream)を設定します。
module "identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent"}
# Grant the authenticated Cognito role permission to invoke the agentresource "aws_iam_policy" "invoke_my_agent" { name = "InvokeMyAgentPolicy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream", ] Resource = [ module.my_agent.agent_core_runtime_arn, "${module.my_agent.agent_core_runtime_arn}/*", ] }] })}
resource "aws_iam_role_policy_attachment" "invoke_my_agent" { role = module.identity.authenticated_role_name policy_arn = aws_iam_policy.invoke_my_agent.arn}エージェントがCognito認証を使用する場合、ウェブサイトをエージェントに接続するための追加のインフラストラクチャを定義する必要はありません。
生成されたコードの使用
Section titled “生成されたコードの使用”チャットインターフェースの追加
Section titled “チャットインターフェースの追加”agentIdを指定してCopilotKitコンポーネントをインスタンス化し、使用するエージェントを選択します。idはエージェントの名前です — py#strands-agentジェネレーターを実行したときに選択したものと同じです — また、生成されたフックファイル(例: packages/web/src/hooks/useAgui<AgentName>.tsxから返されるキー)でも確認できます:
import { CopilotChat } from '@copilotkit/react-core/v2';
function ChatPage() { return ( <CopilotChat agentId="agent" labels={{ welcomeMessageText: 'How can I help you today?', chatInputPlaceholder: 'Ask me anything...', }} /> );}複数のAG-UIエージェントの接続
Section titled “複数のAG-UIエージェントの接続”エージェントごとにconnectionジェネレーターを1回実行します。共有AguiProviderを介して登録されたすべてのエージェントは、アプリ内のどこからでも見えます — 異なるagentIdでCopilotKitコンポーネントをインスタンス化して、各チャットを目的のエージェントにルーティングします:
<CopilotChat agentId="story" /> {/* talks to StoryAgent */}<CopilotChat agentId="research" /> {/* talks to ResearchAgent */}ルック&フィールのカスタマイズ
Section titled “ルック&フィールのカスタマイズ”<CopilotChat />(および<CopilotSidebar />、<CopilotPopup />)は再帰的なスロットシステムを使用しています — Tailwindクラス文字列、propオブジェクト、またはカスタムReactコンポーネントのいずれかで任意のサブコンポーネントをオーバーライドできます。完全なスロットツリーについては、CopilotKitスロットガイドを参照してください。
スロットによるTailwindスタイリング
Section titled “スロットによるTailwindスタイリング”<CopilotChat agentId="agent" // style the input and its children input={{ textArea: 'text-blue-600', sendButton: 'bg-blue-600 hover:bg-blue-700', }} // style nested message slots messageView={{ assistantMessage: 'bg-blue-50 rounded-xl p-2', userMessage: 'bg-blue-100 rounded-xl', }}/>カスタムコンポーネントでスロットを置き換える
Section titled “カスタムコンポーネントでスロットを置き換える”任意のスロットはclassNameの代わりにReactコンポーネントを受け取ることができるため、デフォルトを完全に置き換えることができます:
import { CopilotChat } from '@copilotkit/react-core/v2';
const MySendButton: React.FC<{ onClick: () => void }> = ({ onClick }) => ( <button onClick={onClick} className="my-send-btn"> ✨ Send </button>);
<CopilotChat agentId="agent" input={{ sendButton: MySendButton }}/>;より深いオーバーライドも同じ形式に従います — 例えば、アシスタントメッセージのコピーボタンだけを置き換える:
<CopilotChat agentId="agent" messageView={{ assistantMessage: { copyButton: ({ onClick }) => <button onClick={onClick}>Copy</button>, }, }}/>ローカル開発
Section titled “ローカル開発”接続ジェネレーターは自動的にserve-local統合を設定します:
nx serve-local <website>を実行すると、エージェントのローカルサーバーも起動します- ランタイム設定がローカルAG-UI URL(例:
http://localhost:8081)を指すようにオーバーライドされます - ウェブサイトとエージェントの両方が一緒にホットリロードされます
pnpm nx serve-local <WebsiteProject>yarn nx serve-local <WebsiteProject>npx nx serve-local <WebsiteProject>bunx nx serve-local <WebsiteProject>