Aller au contenu

Agent TypeScript Strands vers Agent A2A

Le générateur connection peut connecter votre Agent Strands TypeScript à un agent A2A distant — soit TypeScript ou Python — afin que votre agent puisse déléguer à un autre agent en tant qu’outil.

Le générateur configure tout le câblage nécessaire pour que votre agent puisse découvrir et invoquer l’agent A2A distant, à la fois lorsqu’il est déployé sur AWS (via Bedrock AgentCore) et lors de l’exécution locale.

Avant d’utiliser ce générateur, assurez-vous d’avoir :

  1. Un projet TypeScript avec un composant Agent (n’importe quel protocole)
  2. Un projet avec un composant Agent généré avec --protocol=A2A et --auth=IAM (soit ts#agent ou py#agent)
  3. Les deux composants créés avec infra: agentcore
  1. Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
  2. Ouvrez la console Nx dans VSCode
  3. Cliquez sur Generate (UI) dans la section "Common Nx Commands"
  4. Recherchez @aws/nx-plugin - connection
  5. Remplissez les paramètres requis
    • Cliquez sur Generate

    Sélectionnez votre projet d’agent hôte comme source et votre projet d’agent A2A comme cible. Si vos projets contiennent plusieurs composants, spécifiez les options sourceComponent et 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.
    preferInstallDependencies boolean true Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir à false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

    Le générateur crée un package partagé agent-connection et modifie le code de votre agent :

    • Répertoirepackages/common/agent-connection
      • Répertoiresrc
        • Répertoireapp
          • <target-agent-name>-client-strands.ts Client Strands de haut niveau pour l’agent A2A connecté
        • Répertoirecore
          • agentcore-endpoints.ts Résolution ARN/URL indépendante du framework
          • agentcore-fetch.ts Fetch SigV4 / JWT / transfert de session indépendant du framework
          • agentcore-a2a-client-config.ts Configuration du client A2A indépendante du framework (clientFactory signé)
          • agentcore-a2a-client-strands.ts Client A2A Strands encapsulant la configuration
        • index.ts Exporte tous les clients
      • project.json
      • tsconfig.json

    De plus, il :

    • Transforme le fichier agent.ts de votre agent pour enregistrer l’agent A2A distant en tant que tool Strands
    • Met à jour la cible serve-local de l’agent pour dépendre de la cible serve-local de l’agent cible
    • Installe les dépendances requises

    Le générateur transforme le fichier agent.ts de votre agent pour encapsuler l’agent A2A distant en tant qu’outil :

    packages/example/src/my-agent/agent.ts
    import { Agent, tool } from '@strands-agents/sdk';
    import { RemoteAgentClientStrands } from ':my-scope/agent-connection';
    import { z } from 'zod';
    export const getAgent = async (sessionId: string) => {
    const remoteAgent = await RemoteAgentClientStrands.create(sessionId);
    const remoteAgentTool = tool({
    name: 'askRemoteAgent',
    description: 'Delegate a question to the remote RemoteAgent A2A agent and return its reply.',
    inputSchema: z.object({ prompt: z.string() }),
    callback: async ({ prompt }) => (await remoteAgent.invoke(prompt)).toString(),
    });
    return new Agent({
    systemPrompt: '...',
    tools: [remoteAgentTool],
    });
    };

    Le paramètre sessionId est transmis depuis l’appelant, garantissant la cohérence pour Bedrock AgentCore Observability.

    En coulisses, RemoteAgentClientStrands.create(sessionId) retourne un A2AAgent Strands configuré avec un clientFactory signant SigV4 lorsqu’il est déployé sur AWS, et un endpoint simple http://localhost:<port>/ lorsque LOCAL_DEV=true. La signature et la résolution des endpoints résident dans le fichier agentcore-a2a-client-config.ts indépendant du framework ; seul le mince agentcore-a2a-client-strands.ts dépend de Strands.

    Après avoir exécuté le générateur de connexion, vous devez accorder à l’agent hôte la permission d’invoquer l’agent A2A distant.

    packages/infra/src/stacks/application-stack.ts
    const remoteAgent = new RemoteAgent(this, 'RemoteAgent');
    const myAgent = new MyAgent(this, 'MyAgent');
    // Grant the host agent permission to invoke the remote A2A agent
    remoteAgent.grantInvokeAccess(myAgent);

    grantInvokeAccess sur un agent A2A configure à la fois bedrock-agentcore:InvokeAgentRuntime et bedrock-agentcore:GetAgentCard — le client A2A a besoin des deux pour récupérer la carte de l’agent et envoyer des messages.

    L’ARN du runtime AgentCore de l’agent distant est automatiquement enregistré dans l’espace de noms agentcore de la Configuration d’Exécution par la construction CDK générée, afin que l’agent hôte puisse le découvrir au moment de l’exécution.

    Le générateur configure la cible serve-local de l’agent hôte pour :

    1. Démarrer automatiquement le(s) agent(s) A2A connecté(s)
    2. Définir SERVE_LOCAL=true afin que le client généré se connecte directement à http://localhost:<port>/ au lieu d’AgentCore

    Exécutez l’agent localement avec :

    Terminal window
    pnpm nx <agent-name>-dev <project-name>

    Cela démarrera à la fois l’agent hôte et tous les agents A2A connectés, l’agent hôte appelant les agents distants via HTTP simple sur leurs ports locaux assignés.