Blog

Primeros pasos con Elastic Agent Builder y Strands Agents SDK

Aprende a crear un agente con Elastic Agent Builder y, a continuación, descubre cómo utilizar el agente a través del protocolo A2A orquestado con el SDK de Strands Agents.

¿Tienes una idea para un agente de IA? Probablemente implica hacer algo con datos porque, si un agente va a iniciar una acción útil, necesita tomar una decisión y necesita los datos correctos para tomar la decisión correcta.

Elastic Agent Builder facilita la creación de agentes de IA conectados a datos. Te mostraremos cómo hacerlo en esta publicación de blog. Veamos todos los pasos necesarios para crear un agente con una herramienta MCP que acceda a los datos almacenados en Elastic. Luego usaremos el SDK de Strands Agents y sus capacidades Agent2Agent (A2A) para operar el agente. El SDK de Strands Agents es una plataforma de desarrollo de IA multiagente que puedes usar para crear apps de agentes con el código justo para asegurarte de obtener el resultado que quieres.

Construyamos un agente de IA que juegue el juego de RPS+, que es una versión del clásico juego de "Piedra, papel o tijeras" con un toque adicional; les da a los jugadores del juego un par de opciones adicionales.

Requisitos previos

Aquí está lo que se requiere para seguir los pasos en esta publicación de blog:

  • Un editor de texto ejecutándose en tu computadora local

    • Visual Studio Code es lo que usaremos para las instrucciones de ejemplo en esta publicación de blog

  • Python 3.10 o superior funcionando en tu computadora local

Crea un proyecto Serverless

Lo primero que necesitamos es un proyecto Elasticsearch Serverless, que incluye Elastic Agent Builder.

Ve a cloud.elastic.co y crea un nuevo proyecto de Elasticsearch Serverless.

Crea un índice y agrega datos

A continuación, vamos a agregar algunos datos a nuestro proyecto de Elasticsearch. Abre Developer Tools, donde podemos ejecutar comandos para crear un nuevo índice e insertar algunos datos en él. Selecciona Herramientas para desarrolladores en el menú de navegación de nivel superior.

Copia y pega el siguiente comando PUT en el área de entrada de solicitud de la consola de Developer Tools. Esta declaración crea un índice de Elasticsearch llamado “game-docs”.

PUT /game-docs
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "content": { 
        "type": "text"
      },
      "filename": { "type": "keyword" },
      "last_modified": { "type": "date" }
    }
  }
}

Haz clic en el botón Enviar solicitud que aparece en el lado derecho de la declaración en Herramientas para desarrolladores. Deberías ver una notificación que confirme que el índice game-docs se creó en el área de respuesta de Herramientas para desarrolladores.

Un índice llamado game-docs es el lugar ideal para almacenar los datos del juego que estamos creando. Pongamos un documento llamado rps+-md en este índice que contiene todos los datos que requiere nuestro juego. Copia y pega el siguiente comando PUT en la consola de Herramientas para desarrolladores.

PUT /game-docs/_doc/rps+-md
{
  "title": "Rock Paper Scissors +",
  "content": "
# Game Name
RPS+

# Starting Prompt
Let's play RPS+ !
---
What do you choose?

# Game Objects
1. Rock 🪨 👊
2. Paper 📜 🖐
3. Scissors ✄ ✌️
4. Light ☼ 👍
5. Dark Energy ☄ 🫱

# Judgement of Victory
* Rock beats Scissors
  * because rocks break scissors
* Paper beats Rock
  * because paper covers rock
* Scissors beat Paper
  * because scissors cut paper
* Rock beats Light
  * because you can build a rock structure to block out light
* Paper beats Light
  * because knowledge stored in files and paper books helps us understand light
* Light beats Dark Energy
  * because light enables humans to lighten up and laugh in the face of dark energy as it causes the eventual heat death of the universe
* Light beats Scissors
  * because light is needed to use scissors safely
* Dark Energy beats Rock
  * because dark energy rocks more than rocks. It rocks rocks and everything else in its expansion of the universe
* Dark Energy beats Paper
  * because humans, with their knowledge stored in files and paper books, can't explain dark energy 
* Scissors beat Dark Energy
  * because a human running with scissors is darker than dark energy

# Invalid Input
I was hoping for an worthy opponent
  - but alas it appears that time has past
  - but alas there's little time for your todo list when [todo:fix this] is so vast

# Cancel Game
The future belongs to the bold. Goodbye..
",
  "filename": "RPS+.md",
  "last_modified": "2025-11-25T12:00:00Z"
}

Haz clic en el botón Enviar solicitud junto a la instrucción para ejecutarlo y agregar el documento rps+-md al índice de documentación del juego.

Ahora deberíamos tener algunos datos para consultar, y con Agent Builder, eso es más simple que nunca.

Selecciona Agentes en el menú de navegación superior.

Luego, todo lo que tienes que hacer es preguntarle al agente de Elastic AI predeterminado: "¿Qué datos tengo?".

El agente de Elastic AI evalúa los datos y devuelve una explicación concisa de los datos que tenemos.

Crear una herramienta

Listo, ahora tenemos algunos datos en Elastic; vamos a ponerlos en práctica. Agent Builder incluye soporte integrado para crear herramientas MCP que ayudan a los agentes a acceder a los datos que necesitan para tener el contexto adecuado para su tarea. Vamos a crear una herramienta sencilla que recupere los datos de nuestro juego.

Haz clic en el menú de acciones de Agent Builder.

Selecciona Ver todas las herramientas en las opciones del menú.

Haz clic en + Nueva herramienta.

En el formulario Crear herramienta, selecciona ES|QL como Tipo de herramienta e ingresa los siguientes valores.

Para el ID de la herramienta:

example.get_game_docs

Para la Descripción:

Get RPS+ doc from Elasticsearch game-docs index.

Para la configuración, ingresa la siguiente consulta en el área de texto Consulta ES|QL :

FROM game-docs | WHERE filename == "RPS+.md"

Tu formulario completado de Crear herramienta debería verse así. Haz clic en Guardar para crear la herramienta.

Tenemos una nueva herramienta disponible en el estante de herramientas. Las herramientas no deberían estar colgadas perpetuamente en un estante; hay que darles un uso digno. Creemos un agente que pueda emplear nuestra nueva herramienta personalizada.

Crea un agente y asígnale una herramienta

Crear un agente es sorprendentemente sencillo con Agent Builder. Solo tienes que ingresar las instrucciones del agente con algunos detalles y eso es todo lo que necesitas. Vamos a crear un agente ahora.

Haz clic en Gestionar agentes.

Haz clic en + Nuevo agente.

Introduce la siguiente información en el formulario Nuevo agente.

Para ID de agente, ingresa el texto a continuación:

rps_plus_agent

En el área de texto de Instrucciones personalizadas , ingresa las siguientes instrucciones:

When prompted, if the prompt contains an integer, then select the corresponding numbered item in the list of "Game Objects" from your documents. Otherwise select a random game object. This is your chosen game object for a single round of the game.

# General Game Rules
* 2 players
    - the user: the person playing the game
    - you: the agent playing the game and serving as the game master
* Each player chooses a game object which will be compared and cause them to tie, win or lose.

# Start the game
1. This is the way each new game always starts. You make the first line of your response only the name of your chosen game object. 

2. The remainder of your response should be the "Starting Prompt" text from your documents and generate a list of "Game Objects" for the person playing the game to choose a game object from.  

# End of Game: The game ends in one of the following three outcomes:
1. Invalid Input: If the player responds with an invalid game object choice, respond with variations of the "Invalid Input" text from your documents and then end the game.

2. Tie: The game ends in a tie if the user chooses the same game object as your game object choice.

3. Win or Lose: The game winner is decided based on the "Judgement of Victory" conditions from your documents. Compare the user's game object choice and your game object choice and determine who chose the winning game object.

# Game conclusion
Respond with a declaration of the winner of the game by outputting the corresponding text in the "Judgement of Victory" section of your documents.

Para el Nombre de visualización, ingresa el texto a continuación:

RPS+ Agent

Para la Descripción de la pantalla, ingresa el texto a continuación:

An agent that plays the game RPS+

Brinda al agente la herramienta personalizada que creamos previamente al hacer clic en la pestaña Herramientas.

Selecciona solo la herramienta example.get_game_docs que creamos anteriormente.

Haz clic en Guardar para crear el nuevo agente.

Probemos nuestro nuevo agente. Hay un enlace útil para iniciar un chat con cualquier agente de la lista de agentes.

Simplemente ingresa “iniciar juego” y el juego comenzará. ¡Funciona!

Puedes ver que el agente muestra su elección de objeto de juego en la parte superior de su respuesta. Esto es útil porque podemos ver la elección del agente y confirmar que el juego funciona como se espera. Sin embargo, conocer la elección de tu oponente antes de elegir no lo convierte en un juego muy divertido de "Piedra, papel o tijeras". Para pulir y perfeccionar el juego hasta su forma final, podemos usar una plataforma de orquestación de agentes que pueda controlar a los agentes con código.

El SDK de Strands Agents entra al chat.

SDK de agentes de Strands

Si tienes curiosidad por probar nuevos marcos de trabajo de desarrollo de agentes, entonces vale la pena probar el SDK de Strands Agents. El SDK de Strands Agents fue lanzado por AWS (mayo de 2025) como una implementación de open source Python, y ahora también hay una versión en Typescript.

Introducción al SDK de Strands Agents en Python

Enciende tus motores de programación, ahora vamos a pasar rápidamente por el proceso de clonación y ejecución de una app de ejemplo que usa Strands Agents para controlar el agente de RPS+ mediante el protocolo A2A. Vamos a crear una versión ajustada del juego RPS+ para que la elección del agente se revele después de que hagas tu elección, porque, después de todo, es la adivinación y el resultado sorpresa lo que hace que juegos como "Piedra, papel o tijeras" sean divertidos.

En tu computadora local, abre Visual Studio Code y abre una nueva terminal.

En la terminal recién abierta, ejecuta el siguiente comando para clonar el repositorio de Elasticsearch Labs:

git clone https://github.com/elastic/elasticsearch-labs

Ejecuta el siguiente comando cd para cambiar el directorio al directorio elasticsearch-labs:

cd elasticsearch-labs

A continuación, ejecuta el siguiente comando para abrir el repositorio en Visual Studio Code:

code .

En el Explorador de archivos de Visual Studio, expande las carpetas supporting-blog-content y agent-builder-a2a-strands-agents y luego abre el archivo elastic_agent_builder_a2a_rps+.py. Así es como se ve el archivo abierto en Visual Studio Code:

Aquí tienes el contenido de elastic_agent_builder_a2a_rps+.py que deberías ver en tu editor de texto:

import asyncio
from dotenv import load_dotenv
from uuid import uuid4
import httpx
import os
import random
from a2a.client import A2ACardResolver, ClientConfig, ClientFactory
from a2a.types import Message, Part, Role, TextPart

DEFAULT_TIMEOUT = 60  # set request timeout to 1 minute


def create_message(*, role: Role = Role.user, text: str, context_id=None) -> Message:
    return Message(
        kind="message",
        role="user",
        parts=[Part(TextPart(kind="text", text=text))],
        message_id=uuid4().hex,
        context_id=context_id,
    )


async def main():
    load_dotenv()
    a2a_agent_host = os.getenv("ES_AGENT_URL")
    a2a_agent_key = os.getenv("ES_API_KEY")
    custom_headers = {"Authorization": f"ApiKey {a2a_agent_key}"}

    async with httpx.AsyncClient(
        timeout=DEFAULT_TIMEOUT, headers=custom_headers
    ) as httpx_client:
        # Get agent card
        resolver = A2ACardResolver(httpx_client=httpx_client, base_url=a2a_agent_host)
        agent_card = await resolver.get_agent_card(
            relative_card_path="/rps_plus_agent.json"
        )
        # Create client using factory
        config = ClientConfig(
            httpx_client=httpx_client,
            streaming=True,
        )
        factory = ClientFactory(config)
        client = factory.create(agent_card)
        # Use the client to communicate with the agent
        print("\nSending 'start game' message to Elastic A2A agent...")
        random_game_object = random.randint(1, 5)
        msg = create_message(text=f"start with game object {random_game_object}")
        async for event in client.send_message(msg):
            if isinstance(event, Message):
                context_id = event.context_id
                response_complete = event.parts[0].root.text
                # Get agent choice from the first line of the response
                parsed_response = response_complete.split("\n", 1)
                agent_choice = parsed_response[0]
                print(parsed_response[1])
        # User choice sent for game results from the agent
        prompt = input("Your Choice  : ")
        msg = create_message(text=prompt, context_id=context_id)
        async for event in client.send_message(msg):
            if isinstance(event, Message):
                print(f"Agent Choice : {agent_choice}")
                print(event.parts[0].root.text)


if __name__ == "__main__":
    asyncio.run(main())

Repasemos qué está pasando en este código. A partir del método main() , el código comienza accediendo a las variables de entorno para la URL del agente y la clave de API. Luego, usamos esos valores para crear un httpx client que podamos usar para obtener la tarjeta de agente para el agente. El cliente luego usa los detalles de la tarjeta del agente para enviar una solicitud de "iniciar juego" al agente. Un aspecto interesante a tener en cuenta aquí es que incluimos un valor random_game_object como parte de la solicitud "start game". Este valor es un número aleatorio generado con el módulo aleatorio de la biblioteca estándar de Python. La razón para hacerlo es que resulta que los poderosos LLM (que hacen posibles a los agentes de IA) no son muy buenos en la aleatoriedad. No hay problema, Python viene al rescate.

Continuando con la programación, una vez que el agente responde a la solicitud de "iniciar juego", el código elimina la selección del objeto de juego del agente y lo guarda en la variable agent_choice. El resto de la respuesta se muestra como texto para el usuario final. Luego, se le solicita al usuario su entrada de elección de objeto de juego, la cual se envía al agente. El código muestra la elección del objeto del juego del agente junto con la determinación final del agente sobre el resultado del juego.

Establecer la URL de tu agente y la clave de API como variables de entorno

Dado que la app de ejemplo se ejecutará en tu computadora local, para comunicarla con nuestro agente Agent Builder, debemos proporcionar al SDK de Strands Agents una URL A2A y una clave API para el agente. La app de ejemplo emplea un archivo llamado .env para almacenar estos valores.

Haz una copia del archivo env.example y nombra el nuevo archivo .env

Vuelve a Elastic Agent Builder, donde podrás obtener los dos valores que necesitas.

Selecciona Ver todas las herramientas en el menú de acciones de Agent Builder en la parte superior derecha de la página.

Haz clic en el menú desplegable servidor MCP en la parte superior de la página Herramientas y selecciona Copiar URL del servidor MCP.

Pega la URL del servidor MCP en el archivo .env como reemplazo para el valor de marcador de posición <YOUR-ELASTIC-AGENT-BUILDER-URL> . Ahora necesitamos hacer una actualización a la URL, es decir, reemplazar el texto final “mcp” con “a2a” porque el protocolo A2A es lo que usará el Agent Strands SDK para comunicarse con el agente que se ejecuta en Elastic Agent Builder.

La URL editada debería verse así:

https://rps-game-project-12345a.kb.us-east-1.aws.elastic.cloud/api/agent_builder/a2a

El otro valor que necesitamos obtener mientras estamos aquí en Elastic Cloud es una clave API. Haz clic en Elasticsearch en el menú de navegación superior.

Haz clic en el botón Copiar clave API para copiar la clave API.

Ahora, de vuelta en Visual Studio Code, pega la clave API en el archivo .env para reemplazar el texto del marcador de posición <YOUR-ELASTIC-API-KEY> . Tu archivo .env debería verse algo así:

Ejecuta la app de ejemplo

Abre una nueva terminal en Visual Studio Code.

Empieza ejecutando el siguiente comando cd en la terminal:

cd elasticsearch-labs/supporting-blog-content/agent-builder-a2a-strands-agents

Ejecuta el siguiente comando para crear un entorno virtual en Python.

python -m venv .venv

Dependiendo del sistema operativo de tu computadora local, ejecuta el siguiente comando para activar el entorno virtual.

  • MacOS/Linux

source .venv/bin/activate
  • Windows

.venv\Scripts\activate

La app de ejemplo utiliza Strands Agents SDK, y ahora nos encontramos en el punto de este tutorial en el que debes instalarlo. Ejecuta el siguiente comando para instalar el SDK de Strands Agents junto con todas tus dependencias requeridas de la biblioteca de Python.

pip install -r requirements.txt

Es hora de limpiar la plataforma de lanzamiento y comenzar la cuenta regresiva. Estamos listos para lanzar esta app. Retírate. Vamos a ejecutarla usando el siguiente comando:

python elastic_agent_builder_a2a_rps+.py

Deberías desafiarte con un juego de RPS+. ¡Bien hecho y mucha suerte!

Crea tus apps de IA con contexto relevante

Crear un agente con IA es ahora una habilidad en tu caja de herramientas. Y has visto lo fácil que es usar agentes de Elastic Agent Builder a través de A2A en marcos de trabajo de agentes como Strands Agents SDK. Prueba Elastic para crear agentes de IA conectados al contexto relevante en tus datos personalizados.

Contenido relacionado

Técnicas avanzadas de RAG parte 2: Consultas y pruebas

Han Xiang Choong

Resolución de entidades con Elasticsearch, parte 4: el desafío final

Jessica Moszkowicz

Automatización del análisis de logs en Streams con ML.

Nastia Havriushenko

Construir un agente de IA para RRHH con Elastic Agent Builder y GPT-OSS

Tomás Murúa

Técnicas avanzadas de RAG parte 1: Procesamiento de datos

Han Xiang Choong

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo