Salta ai contenuti

TypeScript Agent to A2A Agent

Il generatore connection può connettere il tuo TypeScript Agent a un agente A2A remoto — sia TypeScript che Python — in modo che il tuo agente possa delegare a un altro agente come strumento.

Il generatore configura tutto il cablaggio necessario affinché il tuo agente possa scoprire e invocare l’agente A2A remoto, sia quando viene distribuito su AWS (tramite Bedrock AgentCore) sia quando viene eseguito localmente.

Prima di utilizzare questo generatore, assicurati di avere:

  1. Un progetto TypeScript con un componente Strands Agent (qualsiasi protocollo)
  2. Un progetto con un componente Agent generato con --protocol=a2a e --auth=iam (sia ts#agent che py#agent)
  3. Entrambi i componenti creati con infra: agentcore
Terminal window
pnpm nx g @aws/nx-plugin:connection
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Seleziona il progetto del tuo agente host come sorgente e il progetto del tuo agente A2A come destinazione. Se i tuoi progetti contengono più componenti, specifica le opzioni sourceComponent e targetComponent per disambiguare.

ParametroTipoPredefinitoDescrizione
sourceProject Obbligatoriostring-Il progetto sorgente
targetProject Obbligatoriostring-Il progetto di destinazione a cui connettersi
sourceComponent string-Il componente sorgente da cui connettersi (nome del componente, percorso relativo alla radice del progetto sorgente, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come sorgente.
targetComponent string-Il componente di destinazione a cui connettersi (nome del componente, percorso relativo alla radice del progetto di destinazione, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come destinazione.
preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.

Il generatore crea un pacchetto condiviso agent-connection e modifica il codice del tuo agente:

  • Directorypackages/common/agent-connection
    • Directorysrc
      • Directoryapp
        • <target-agent-name>-client-strands.ts High-level Strands client for the connected A2A agent
      • Directorycore
        • agentcore-endpoints.ts Framework-agnostic ARN/URL resolution
        • agentcore-fetch.ts Framework-agnostic SigV4 / JWT / session-forwarding fetch
        • agentcore-a2a-client-config.ts Framework-agnostic A2A client config (signed clientFactory)
        • agentcore-a2a-client-strands.ts Strands A2A client wrapping the config
      • index.ts Exports all clients
    • project.json
    • tsconfig.json

Inoltre:

  • Trasforma il file agent.ts del tuo agente per registrare l’agente A2A remoto come tool di Strands
  • Aggiorna il target dev dell’agente per dipendere dal target dev dell’agente di destinazione
  • Installa le dipendenze richieste

Il generatore trasforma il file agent.ts del tuo agente per avvolgere l’agente A2A remoto come strumento:

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],
});
};

Il parametro sessionId viene propagato dal chiamante, garantendo coerenza per Bedrock AgentCore Observability.

Internamente, RemoteAgentClientStrands.create(sessionId) restituisce un A2AAgent di Strands configurato con un clientFactory che firma con SigV4 quando distribuito su AWS, e un semplice endpoint http://localhost:<port>/ quando LOCAL_DEV=true. La firma e la risoluzione degli endpoint risiedono nel file framework-agnostic agentcore-a2a-client-config.ts; solo il sottile agentcore-a2a-client-strands.ts dipende da Strands.

Dopo aver eseguito il generatore di connessioni, è necessario concedere all’agente host il permesso di invocare l’agente A2A remoto.

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 su un agente A2A collega sia bedrock-agentcore:InvokeAgentRuntime che bedrock-agentcore:GetAgentCard — il client A2A ha bisogno di entrambi per recuperare la scheda dell’agente e inviare messaggi.

L’ARN del runtime AgentCore dell’agente remoto viene automaticamente registrato nel namespace agentcore della Configurazione Runtime dal costrutto CDK generato, in modo che l’agente host possa scoprirlo a runtime.

Il generatore configura il target dev dell’agente host per:

  1. Avviare automaticamente gli agenti A2A connessi
  2. Impostare LOCAL_DEV=true in modo che il client generato si connetta direttamente a http://localhost:<port>/ invece che ad AgentCore

Esegui l’agente localmente con:

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

Questo avvierà sia l’agente host che tutti gli agenti A2A connessi, con l’agente host che chiama gli agenti remoti tramite HTTP semplice sulle loro porte locali assegnate.