Skip to content

React から Python Agent への接続

Nx Plugin for AWS は、Python Agent を React ウェブサイトと迅速に統合するためのジェネレーターを提供します。これにより、AWS IAM および Cognito 認証のサポートを含む、型安全な OpenAPI 生成クライアントを介してエージェントに接続するために必要なすべての設定が行われます。

このジェネレーターを使用する前に、以下を確認してください:

  1. React ウェブサイト(ts#website ジェネレーターを使用して生成)
  2. protocol=http を持つ Python Agent(py#agent ジェネレーターを使用して生成)
  3. ts#website#auth ジェネレーターを介して追加された Cognito Auth
Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

React ウェブサイトをソースプロジェクトとして、Python Agent を含むプロジェクトをターゲットプロジェクトとして選択するよう求められます。ターゲットプロジェクトに複数のコンポーネント(複数のエージェントや他のコンポーネントタイプなど)が含まれている場合、曖昧さを解消するために targetComponent を指定するよう求められます。

パラメータデフォルト説明
sourceProject 必須string-ソース プロジェクト
targetProject 必須string-接続先のターゲット プロジェクト
sourceComponent string-接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
targetComponent string-接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。
preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

ジェネレーターは、Python Agent プロジェクトに以下を作成します:

  • Directoryscripts
    • <agent_name>_openapi.py エージェントの FastAPI アプリから OpenAPI 仕様を生成するスクリプト
  • project.json 新しい <agent-name>-openapi ターゲットが追加されます

ジェネレーターは、React アプリケーションに以下の構造を作成します:

  • Directorysrc
    • Directorycomponents
      • <AgentName>Provider.tsx OpenAPI クライアント用のプロバイダー
      • QueryClientProvider.tsx TanStack React Query クライアントプロバイダー
    • Directoryhooks
      • useSigV4.tsx SigV4 でリクエストに署名するためのフック(IAM のみ)
      • use<AgentName>.tsx エージェントの API 用の TanStack Query オプションプロキシを返すフック
      • use<AgentName>Client.tsx バニラ API クライアントを返すフック
    • Directorygenerated
      • Directory<agent-name>
        • types.gen.ts エージェントの Pydantic モデルから生成された型
        • client.gen.ts エージェントの API を呼び出すための型安全なクライアント
        • options-proxy.gen.ts エージェントと対話するための TanStack Query フックオプション
  • project.json クライアント生成と変更の監視用のターゲットが追加されます
  • .gitignore 生成されたクライアントファイルはデフォルトで無視されます

ビルド時に、Python Agent の FastAPI アプリが内省され、OpenAPI 仕様が生成されます。この仕様は、React から FastAPI への接続と同じパターンに従って、TanStack Query フックを持つ型安全な TypeScript クライアントを生成するために使用されます。

各エージェントは独自のスコープ付き OpenAPI スクリプト(例:scripts/agent_openapi.py)を取得するため、複数のエージェントを持つプロジェクトは個別の仕様を生成できます。

この接続ジェネレーターを実行すると、エージェントの生成された CDK/Terraform コンストラクトにパッチが適用され、その AgentCore ランタイム ARN がウェブサイトの runtime-config.jsonconnection 名前空間の下)に公開されるため、明示的に接続したエージェントのみがフロントエンドに公開されます。詳細については、ランタイム設定を参照してください。

生成されたコードは、エージェントの設定に応じて認証を処理します:

  • IAM(デフォルト):AWS SigV4 を使用して HTTP リクエストに署名します。認証情報は、ウェブサイトの認証で設定された Cognito Identity Pool から取得されます
  • Cognito:JWT アクセストークンを Authorization ヘッダーに埋め込みます
  • None:認証なし

エージェントが IAM 認証を使用する場合、Cognito Identity Pool の認証済みロールにエージェントを呼び出す権限を付与する必要があります。

packages/infra/src/stacks/application-stack.ts
const identity = new UserIdentity(this, 'Identity');
const myAgent = new MyAgent(this, 'MyAgent');
// Grant the authenticated Cognito role permission to invoke the agent
myAgent.grantInvokeAccess(identity.identityPool.authenticatedRole);

grantInvokeAccess は、エージェントのランタイム ARN 上のすべての AgentCore 呼び出しアクション(InvokeAgentRuntimeInvokeAgentRuntimeWithWebSocketStream)を接続します。

エージェントが Cognito 認証を使用する場合、ウェブサイトをエージェントに接続するための追加のインフラストラクチャを定義する必要はありません。

use<AgentName> フックは、エージェントの API エンドポイントを呼び出すための TanStack Query オプションを提供します:

import { useState } from 'react';
import { useMutation } from '@tanstack/react-query';
import { useMyAgent } from '../hooks/useMyAgent';
import type { StreamChunk } from '../generated/my-agent/types.gen';
function ChatComponent() {
const api = useMyAgent();
const [chunks, setChunks] = useState<StreamChunk[]>([]);
const invoke = useMutation(api.invoke.mutationOptions({
onSuccess: async (stream) => {
setChunks([]);
for await (const chunk of stream) {
setChunks((prev) => [...prev, chunk]);
}
},
}));
const handleSend = (prompt: string) => {
invoke.mutate({ prompt });
};
return (
<div>
<button onClick={() => handleSend('Hello!')}>Send</button>
{invoke.isPending && <p>Agent is thinking...</p>}
{chunks.map((chunk, i) => (
<span key={i}>{chunk.content}</span>
))}
</div>
);
}

use<AgentName>Client フックは、API クライアントへの直接アクセスを提供します:

import { useState } from 'react';
import { useMyAgentClient } from '../hooks/useMyAgentClient';
import type { StreamChunk } from '../generated/my-agent/types.gen';
function ChatComponent() {
const client = useMyAgentClient();
const [chunks, setChunks] = useState<StreamChunk[]>([]);
const handleSend = async (prompt: string) => {
setChunks([]);
for await (const chunk of client.invoke({ prompt })) {
setChunks((prev) => [...prev, chunk]);
}
};
return (
<div>
<button onClick={() => handleSend('Hello!')}>Send</button>
{chunks.map((chunk, i) => (
<span key={i}>{chunk.content}</span>
))}
</div>
);
}

接続ジェネレーターは自動的に dev 統合を設定します:

  1. nx dev <website> を実行すると、エージェントのローカル FastAPI サーバーも起動します
  2. ランタイム設定は、ローカル HTTP URL(例:http://localhost:8081/)を指すようにオーバーライドされます
  3. エージェントの API が変更されると、TypeScript クライアントが自動的に再生成されます
Terminal window
pnpm nx dev <WebsiteProject>

詳細については、以下を参照してください: