Usar un agente Agent2Agent

Antes de empezar

En este tutorial se da por hecho que has leído y seguido las instrucciones de los siguientes artículos:

Obtener una instancia de un agente

Para consultar un A2aAgent, primero debes crear una instancia o obtener una instancia que ya tengas.

Para obtener el A2aAgent correspondiente a un ID de recurso específico, sigue estos pasos:

SDK de Vertex AI para Python

import vertexai
from google.genai import types

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
RESOURCE_ID = "RESOURCE_ID"
RESOURCE_NAME = f"projects/{PROJECT_ID}/locations/{LOCATION}/reasoningEngines/{RESOURCE_ID}"

client = vertexai.Client(
    project=PROJECT_ID,
    location=LOCATION,
    http_options=types.HttpOptions(api_version="v1beta1")
)

remote_agent = client.agent_engines.get(name=RESOURCE_NAME)

print(remote_agent)

donde

SDK de Python A2A

Este método usa el SDK oficial de Python de A2A, que proporciona una biblioteca de cliente para interactuar con agentes compatibles con A2A. Para obtener más información, consulta la documentación del SDK de Python de A2A.

Primero, instala el SDK:

pip install a2a-sdk>=0.3.4

A continuación, obtén la tarjeta del agente para crear una instancia de cliente. La A2AClient se encarga de la detección y la comunicación.

from google.auth import default
from google.auth.transport.requests import Request
from a2a.client import ClientConfig, ClientFactory
from a2a.types import TransportProtocol
import httpx

# We assume 'agent_card' is an existing AgentCard object.

# Fetch credentials for authentication for demo purpose. Use your own auth
credentials, _ = default(scopes=['https://www.googleapis.com/auth/cloud-platform'])
credentials.refresh(Request())

# Create the client by chaining the factory and config initialization.
factory = ClientFactory(
    ClientConfig(
        supported_transports=[TransportProtocol.http_json], # only support http_json
        use_client_preference=True,
        httpx_client=httpx.AsyncClient(
            headers={
                "Authorization": f"Bearer {credentials.token}",
                "Content-Type": "application/json",
            }
        ),
    )
)
a2a_client = factory.create(agent_card)

Biblioteca de solicitudes de Python

El protocolo A2A se basa en endpoints HTTP estándar. Puedes interactuar con estos endpoints mediante cualquier cliente HTTP.

Recupera la URL de A2A de la tarjeta del agente y define los encabezados de la solicitud.

from google.auth import default
from google.auth.transport.requests import Request

# We assume 'agent_card' is an existing object
a2a_url = agent_card.url

# Get an authentication token for demonstration purposes. Use your own authentication mechanism.
credentials, _ = default(scopes=['https://www.googleapis.com/auth/cloud-platform'])
credentials.refresh(Request())

headers = {
    "Authorization": f"Bearer {credentials.token}",
    "Content-Type": "application/json",
}

Cuando se usa el SDK de Vertex AI para Python, el objeto remote_agent corresponde a una clase AgentEngine que contiene lo siguiente:

  • Un agent.api_resource con información sobre el agente implementado. También puedes llamar a agent.operation_schemas() para que se devuelva la lista de operaciones que admite el agente. Consulta Operaciones admitidas para obtener más información.
  • un agent.api_client que permite interacciones de servicio síncronas
  • un agent.async_api_client que permite interacciones de servicio asíncronas

En el resto de esta sección se presupone que tienes una instancia de AgentEngine llamada remote_agent.

Operaciones admitidas

Un agente A2A alojado en Agent Engine expone un conjunto de operaciones que se corresponden directamente con los endpoints de la API del protocolo A2A.

Recuperar la tarjeta del agente

Ten en cuenta que Agent Engine no sirve la tarjeta de agente público. Para obtener la tarjeta del agente autenticado, sigue estos pasos:

SDK de Vertex AI para Python

response = await remote_agent.handle_authenticated_agent_card()

SDK de Python A2A

response = await a2a_client.get_card()

Biblioteca de solicitudes de Python

card_endpoint = f"{a2a_url}/v1/card"
response = httpx.get(card_endpoint, headers=headers)
print(json.dumps(response.json(), indent=4))

Enviar un mensaje

Sigue estos pasos para enviar un mensaje:

SDK de Vertex AI para Python

message_data = {
  "messageId": "remote-agent-message-id",
  "role": "user",
  "parts": [{"kind": "text", "text": "What is the exchange rate from USD to EUR today?"}],
}

response = await remote_agent.on_message_send(**message_data)

SDK de Python A2A

from a2a.types import Message, Part, TextPart
import pprint

message = Message(
    message_id="remote-agent-message-id",
    role="user",
    parts=[Part(root=TextPart(text="What's the currency rate of USD and EUR"))],
)

response_iterator = a2a_client.send_message(message)

async for chunk in response_iterator:
    pprint.pp(chunk)

Biblioteca de solicitudes de Python

import httpx
import json

endpoint = f"{a2a_url}/v1/message:send"

payload = {
    "message": {
        "messageId": "remote-agent-message-id",
        "role": "1",
        "content": [{"text": "What is the exchange rate from USD to EUR today?"}],
    },
    "metadata": {"source": "python_script"},
}

response = httpx.post(endpoint, json=payload, headers=headers)
print(json.dumps(response.json(), indent=4))

Obtener una tarea

Para obtener una tarea y su estado

SDK de Vertex AI para Python

task_data = {
    "id": task_id,
}

response = await remote_agent.on_get_task(**task_data)

SDK de Python A2A

from a2a.types import TaskQueryParams

task_data ={
    "id":task_id,
}
response = await a2a_client.get_task(TaskQueryParams(**task_data))

Biblioteca de solicitudes de Python

task_end_point = f"{a2a_url}/v1/tasks/{task_id}"
response = httpx.get(task_end_point, headers=headers)
print(json.dumps(response.json(), indent=4))

Cancelar una tarea

Para cancelar una tarea, sigue estos pasos:

SDK de Vertex AI para Python

task_data = {
    "id": task_id,
}
response = await remote_agent.on_cancel_task(**task_data)

SDK de Python A2A

from a2a.types import TaskQueryParams

task_data ={
    "id":task_id,
}
response = await a2a_client.cancel_task(TaskQueryParams(**task_data))

Biblioteca de solicitudes de Python

task_end_point = f"{a2a_url}/v1/tasks/{task_id}:cancel"
response = httpx.post(task_end_point, headers=headers)
print(json.dumps(response.json(), indent=4))

Siguientes pasos