React vers Agent Python Strands
Nx Plugin for AWS fournit un générateur pour intégrer rapidement votre Python Strands Agent avec un site web React. Il configure tous les éléments nécessaires pour se connecter à votre agent via un client généré par OpenAPI et type-safe, incluant la prise en charge de l’authentification AWS IAM et Cognito.
Prérequis
Section intitulée « Prérequis »Avant d’utiliser ce générateur, assurez-vous d’avoir :
- Un site web React (généré en utilisant le générateur
ts#react-website) - Un Python Strands Agent (généré en utilisant le générateur
py#strands-agent) - Cognito Auth ajouté via le générateur
ts#react-website-auth
Utilisation
Section intitulée « Utilisation »Exécuter le générateur
Section intitulée « Exécuter le générateur »- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - connection - Remplissez les paramètres requis
- Cliquez sur
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:connectionVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:connection --dry-runyarn nx g @aws/nx-plugin:connection --dry-runnpx nx g @aws/nx-plugin:connection --dry-runbunx nx g @aws/nx-plugin:connection --dry-runVous serez invité à sélectionner votre site web React comme projet source et le projet contenant votre Python Strands Agent comme projet cible. Si votre projet cible contient plusieurs composants (tels que plusieurs agents ou d’autres types de composants), vous serez invité à spécifier un targetComponent pour lever l’ambiguïté.
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| sourceProject Requis | string | - | Le projet source |
| targetProject Requis | string | - | Le projet cible auquel se connecter |
| sourceComponent | string | - | Le composant source depuis lequel se connecter (nom du composant, chemin relatif à la racine du projet source, ou identifiant du générateur). Utilisez '.' pour sélectionner explicitement le projet comme source. |
| targetComponent | string | - | Le composant cible auquel se connecter (nom du composant, chemin relatif à la racine du projet cible, ou identifiant du générateur). Utilisez '.' pour sélectionner explicitement le projet comme cible. |
Sortie du générateur
Section intitulée « Sortie du générateur »Le générateur crée les éléments suivants dans votre projet Python Strands Agent :
Répertoirescripts
- <agent_name>_openapi.py Script pour générer une spécification OpenAPI à partir de l’application FastAPI de l’agent
- project.json Une nouvelle cible
<agent-name>-openapiest ajoutée
Le générateur crée la structure suivante dans votre application React :
Répertoiresrc
Répertoirecomponents
- <AgentName>Provider.tsx Provider pour le client OpenAPI
- QueryClientProvider.tsx Provider du client TanStack React Query
Répertoirehooks
- useSigV4.tsx Hook pour signer les requêtes avec SigV4 (IAM uniquement)
- use<AgentName>.tsx Hook retournant le proxy d’options TanStack Query pour l’API de votre agent
- use<AgentName>Client.tsx Hook retournant le client API vanilla
Répertoiregenerated
Répertoire<agent-name>
- types.gen.ts Types générés à partir des modèles Pydantic de l’agent
- client.gen.ts Client type-safe pour appeler l’API de votre agent
- options-proxy.gen.ts Options des hooks TanStack Query pour interagir avec votre agent
- project.json Cibles ajoutées pour la génération du client et la surveillance des changements
- .gitignore Les fichiers client générés sont ignorés par défaut
Fonctionnement
Section intitulée « Fonctionnement »Génération du client OpenAPI
Section intitulée « Génération du client OpenAPI »Au moment de la compilation, l’application FastAPI du Python Strands Agent est introspectée pour générer une spécification OpenAPI. Cette spécification est ensuite utilisée pour générer un client TypeScript type-safe avec des hooks TanStack Query, suivant le même modèle que la connexion React vers FastAPI.
Chaque agent obtient son propre script OpenAPI isolé (par exemple, scripts/agent_openapi.py) afin que les projets avec plusieurs agents puissent générer des spécifications individuelles.
Authentification
Section intitulée « Authentification »Le code généré gère l’authentification en fonction de la configuration de votre agent :
- IAM (par défaut) : Utilise AWS SigV4 pour signer les requêtes HTTP. Les identifiants sont obtenus à partir du Cognito Identity Pool configuré avec l’authentification de votre site web
- Cognito : Intègre le jeton d’accès JWT dans un en-tête Authorization
- None : Aucune authentification
Utilisation du code généré
Section intitulée « Utilisation du code généré »Utilisation du hook API
Section intitulée « Utilisation du hook API »Le hook use<AgentName> fournit les options TanStack Query pour appeler les endpoints de l’API de votre agent :
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 = (message: string) => { invoke.mutate({ prompt: message, sessionId: 'my-session', }); };
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> );}Utilisation du client vanilla
Section intitulée « Utilisation du client vanilla »Le hook use<AgentName>Client fournit un accès direct au 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 (message: string) => { setChunks([]); for await (const chunk of client.invoke({ prompt: message, sessionId: 'my-session', })) { setChunks((prev) => [...prev, chunk]); } };
return ( <div> <button onClick={() => handleSend('Hello!')}>Send</button> {chunks.map((chunk, i) => ( <span key={i}>{chunk.content}</span> ))} </div> );}Développement local
Section intitulée « Développement local »Le générateur de connexion configure automatiquement l’intégration serve-local :
- L’exécution de
nx serve-local <website>démarrera également le serveur FastAPI local de l’agent - La configuration d’exécution est remplacée pour pointer vers l’URL HTTP locale (par exemple,
http://localhost:8081/) - Le client TypeScript est automatiquement régénéré lorsque l’API de l’agent change
pnpm nx serve-local <WebsiteProject>yarn nx serve-local <WebsiteProject>npx nx serve-local <WebsiteProject>bunx nx serve-local <WebsiteProject>Infrastructure
Section intitulée « Infrastructure »Si votre agent utilise l’authentification IAM, le rôle authentifié du Cognito Identity Pool doit obtenir la permission d’invoquer l’agent. Consultez la construction d’infrastructure de votre agent pour la méthode grantInvokeAccess appropriée.
Plus d’informations
Section intitulée « Plus d’informations »Pour plus d’informations, veuillez consulter :