Saltar a contenido

Inicio rápido: Exponiendo un agente remoto mediante A2A

Supported in ADKGoExperimental

Este inicio rápido cubre el punto de partida más común para cualquier desarrollador: "Tengo un agente. ¿Cómo lo expongo para que otros agentes puedan usar mi agente mediante A2A?". Esto es crucial para construir sistemas multi-agente complejos donde diferentes agentes necesitan colaborar e interactuar.

Descripción general

Este ejemplo demuestra cómo puedes exponer fácilmente un agente ADK para que luego pueda ser consumido por otro agente usando el Protocolo A2A.

En Go, expones un agente usando el lanzador A2A, que genera dinámicamente una tarjeta de agente para ti.

┌─────────────────┐                             ┌───────────────────────────────┐
│   Root Agent    │       A2A Protocol          │ A2A-Exposed Check Prime Agent │
│                 │────────────────────────────▶│      (localhost: 8001)        │
└─────────────────┘                             └───────────────────────────────┘

El ejemplo consiste en:

  • Agente Primo Remoto (remote_a2a/check_prime_agent/main.go): Este es el agente que deseas exponer para que otros agentes puedan usarlo mediante A2A. Es un agente que maneja la verificación de números primos. Se expone usando el lanzador A2A.
  • Agente Raíz (main.go): Un agente simple que simplemente llama al agente primo remoto.

Exponiendo el Agente Remoto con el Lanzador A2A

Puedes tomar un agente existente construido usando el ADK de Go y hacerlo compatible con A2A usando el lanzador A2A.

1. Obteniendo el Código de Ejemplo

Primero, asegúrate de tener Go instalado y tu entorno configurado.

Puedes clonar y navegar al ejemplo a2a_basic aquí:

cd examples/go/a2a_basic

Como verás, la estructura de carpetas es la siguiente:

a2a_basic/
├── remote_a2a/
│   └── check_prime_agent/
│       └── main.go    # Agente Primo Remoto
├── go.mod
├── go.sum
└── main.go            # Agente raíz

Agente Raíz (a2a_basic/main.go)

  • newRootAgent: Un agente local que se conecta al servicio A2A remoto.

Agente Primo Remoto (a2a_basic/remote_a2a/check_prime_agent/main.go)

  • checkPrimeTool: Función para verificación de números primos.
  • main: La función principal que crea el agente e inicia el servidor A2A.

2. Iniciar el servidor del Agente A2A Remoto

Ahora puedes iniciar el servidor del agente remoto, que alojará el check_prime_agent:

# Iniciar el agente remoto
go run remote_a2a/check_prime_agent/main.go

Una vez ejecutado, deberías ver algo como:

2025/11/06 11:00:19 Starting A2A prime checker server on port 8001
2025/11/06 11:00:19 Starting the web server: &{port:8001}
2025/11/06 11:00:19 
2025/11/06 11:00:19 Web servers starts on http://localhost:8001
2025/11/06 11:00:19        a2a:  you can access A2A using jsonrpc protocol: http://localhost:8001

3. Verificar que tu agente remoto está en ejecución

Puedes verificar que tu agente está activo y en ejecución visitando la tarjeta de agente que fue generada automáticamente por el lanzador A2A:

http://localhost:8001/.well-known/agent-card.json

Deberías ver el contenido de la tarjeta del agente.

4. Ejecutar el Agente Principal (Consumidor)

Ahora que tu agente remoto está en ejecución, puedes ejecutar el agente principal.

# En una terminal separada, ejecuta el agente principal
go run main.go

Cómo funciona

El agente remoto se expone usando el lanzador A2A en la función main. El lanzador se encarga de iniciar el servidor y generar la tarjeta del agente.

remote_a2a/check_prime_agent/main.go
func main() {
    ctx := context.Background()
    primeTool, err := functiontool.New(functiontool.Config{
        Name:        "prime_checking",
        Description: "Check if numbers in a list are prime using efficient mathematical algorithms",
    }, checkPrimeTool)
    if err != nil {
        log.Fatalf("Failed to create prime_checking tool: %v", err)
    }

    model, err := gemini.NewModel(ctx, "gemini-2.0-flash", &genai.ClientConfig{})
    if err != nil {
        log.Fatalf("Failed to create model: %v", err)
    }

    primeAgent, err := llmagent.New(llmagent.Config{
        Name:        "check_prime_agent",
        Description: "check prime agent that can check whether numbers are prime.",
        Instruction: `
            You check whether numbers are prime.
            When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string.
            You should not rely on the previous history on prime results.
    `,
        Model: model,
        Tools: []tool.Tool{primeTool},
    })
    if err != nil {
        log.Fatalf("Failed to create agent: %v", err)
    }

    // Create launcher. The a2a.NewLauncher() will dynamically generate the agent card.
    port := 8001
    webLauncher := web.NewLauncher(a2a.NewLauncher())
    _, err = webLauncher.Parse([]string{
        "--port", strconv.Itoa(port),
        "a2a", "--a2a_agent_url", "http://localhost:" + strconv.Itoa(port),
    })
    if err != nil {
        log.Fatalf("launcher.Parse() error = %v", err)
    }

    // Create ADK config
    config := &launcher.Config{
        AgentLoader:    agent.NewSingleLoader(primeAgent),
        SessionService: session.InMemoryService(),
    }

    log.Printf("Starting A2A prime checker server on port %d\n", port)
    // Run launcher
    if err := webLauncher.Run(context.Background(), config); err != nil {
        log.Fatalf("webLauncher.Run() error = %v", err)
    }
}

Ejemplos de Interacciones

Una vez que ambos servicios estén en ejecución, puedes interactuar con el agente raíz para ver cómo llama al agente remoto mediante A2A:

Verificación de Números Primos:

Esta interacción usa un agente remoto mediante A2A, el Agente Primo:

User: roll a die and check if it's a prime
Bot: Okay, I will first roll a die and then check if the result is a prime number.

Bot calls tool: transfer_to_agent with args: map[agent_name:roll_agent]
Bot calls tool: roll_die with args: map[sides:6]
Bot calls tool: transfer_to_agent with args: map[agent_name:prime_agent]
Bot calls tool: prime_checking with args: map[nums:[3]]
Bot: 3 is a prime number.
...

Próximos Pasos

Ahora que has creado un agente que expone un agente remoto mediante un servidor A2A, el siguiente paso es aprender cómo consumirlo desde otro agente.