Cómo usar Python-A2A para crear y conectar agentes financieros con el protocolo de agente a agente (A2A) de Google

Python A2A es una implementación del protocolo de agente a agente (A2A) de Google, que permite a los agentes de IA comunicarse entre sí utilizando un formato compartido y estandarizado, lo que elimina la necesidad de integración personalizada entre los servicios.

En este tutorial, utilizaremos el enfoque basado en el decorador proporcionado por la Biblioteca Python-A2A. Con simple @agente y @habilidad decoradores, puede definir la identidad y el comportamiento de su agente, mientras que la biblioteca se encarga del manejo del protocolo y el flujo de mensajes.

Este método es perfecto para construir rápidamente agentes útiles y centrados en las tareas sin preocuparse por la lógica de comunicación de bajo nivel.

Instalación de las dependencias

Para comenzar, deberá instalar la biblioteca Python-A2A, que proporciona una abstracción limpia para construir y ejecutar agentes que siguen el protocolo A2A.

Abra su terminal y ejecute:

Creando los agentes

Para este tutorial, crearemos dos agentes, uno para calcular los rendimientos de las acciones según la inversión, la tasa y el tiempo, y otro para ajustar una cantidad basada en la inflación durante un período de años.

Agente EMI (emi_agent.py)

from python_a2a import A2AServer, skill, agent, run_server, TaskStatus, TaskState
import re

@agent(
    name="EMI Calculator Agent",
    description="Calculates EMI for a given principal, interest rate, and loan duration",
    version="1.0.0"
)
class EMIAgent(A2AServer):

    @skill(
        name="Calculate EMI",
        description="Calculates EMI given principal, annual interest rate, and duration in months",
        tags=["emi", "loan", "interest"]
    )
    def calculate_emi(self, principal: float, annual_rate: float, months: int) -> str:
        monthly_rate = annual_rate / (12 * 100)
        emi = (principal * monthly_rate * ((1 + monthly_rate) ** months)) / (((1 + monthly_rate) ** months) - 1)
        return f"The EMI for a loan of ₹{principal:.0f} at {annual_rate:.2f}% interest for {months} months is ₹{emi:.2f}"

    def handle_task(self, task):
        input_text = task.message["content"]["text"]

        # Extract values from natural language
        principal_match = re.search(r"₹?(\d{4,10})", input_text)
        rate_match = re.search(r"(\d+(\.\d+)?)\s*%", input_text)
        months_match = re.search(r"(\d+)\s*(months|month)", input_text, re.IGNORECASE)

        try:
            principal = float(principal_match.group(1)) if principal_match else 100000
            rate = float(rate_match.group(1)) if rate_match else 10.0
            months = int(months_match.group(1)) if months_match else 12

            print(f"Inputs → Principal: {principal}, Rate: {rate}, Months: {months}")
            emi_text = self.calculate_emi(principal, rate, months)

        except Exception as e:
            emi_text = f"Sorry, I couldn't parse your input. Error: {e}"

        task.artifacts = [{
            "parts": [{"type": "text", "text": emi_text}]
        }]
        task.status = TaskStatus(state=TaskState.COMPLETED)

        return task

# Run the server
if __name__ == "__main__":
    agent = EMIAgent()
    run_server(agent, port=4737)

Este agente de calculadora EMI está construido utilizando la biblioteca Python-A2A y sigue el enfoque basado en el decorador. En la parte superior, usamos el @agente decorador para definir el nombre, la descripción y la versión del agente. Esto registra al agente para que pueda comunicarse usando el protocolo A2A.

Dentro de la clase, definimos una sola habilidad usando el @SkilL decorador. Esta habilidad, llamada calculación_emirealiza el cálculo de EMI real utilizando la fórmula estándar. La fórmula toma tres parámetros: el principal del préstamo, la tasa de interés anual y la duración del préstamo en meses. Convertimos la tarifa anual en una tarifa mensual y la usamos para calcular el EMI mensual.

El Handle_Task El método es el núcleo del agente. Recibe el mensaje de entrada del usuario, extrae números relevantes utilizando expresiones regulares simples y los pasa al método calculado_emi.

Finalmente, en la parte inferior del archivo, iniciamos el agente utilizando el run_server () función en el puerto 4737haciéndolo listo para recibir mensajes de protocolo A2A. Este diseño mantiene al agente simple, modular y fácil de extender con más habilidades en el futuro.

Agente de inflación (inflation_agent.py)

from python_a2a import A2AServer, skill, agent, run_server, TaskStatus, TaskState
import re

@agent(
    name="Inflation Adjusted Amount Agent",
    description="Calculates the future value adjusted for inflation",
    version="1.0.0"
)
class InflationAgent(A2AServer):

    @skill(
        name="Inflation Adjustment",
        description="Adjusts an amount for inflation over time",
        tags=["inflation", "adjustment", "future value"]
    )
    def handle_input(self, text: str) -> str:
        try:
            # Extract amount
            amount_match = re.search(r"₹?(\d{3,10})", text)
            amount = float(amount_match.group(1)) if amount_match else None

            # Extract rate (e.g. 6%, 7.5 percent)
            rate_match = re.search(r"(\d+(\.\d+)?)\s*(%|percent)", text, re.IGNORECASE)
            rate = float(rate_match.group(1)) if rate_match else None

            # Extract years (e.g. 5 years)
            years_match = re.search(r"(\d+)\s*(years|year)", text, re.IGNORECASE)
            years = int(years_match.group(1)) if years_match else None

            if amount is not None and rate is not None and years is not None:
                adjusted = amount * ((1 + rate / 100) ** years)
                return f"₹{amount:.2f} adjusted for {rate:.2f}% inflation over {years} years is ₹{adjusted:.2f}"

            return (
                "Please provide amount, inflation rate (e.g. 6%) and duration (e.g. 5 years).\n"
                "Example: 'What is ₹10000 worth after 5 years at 6% inflation?'"
            )
        except Exception as e:
            return f"Sorry, I couldn't compute that. Error: {e}"

    def handle_task(self, task):
        text = task.message["content"]["text"]
        result = self.handle_input(text)

        task.artifacts = [{
            "parts": [{"type": "text", "text": result}]
        }]
        task.status = TaskStatus(state=TaskState.COMPLETED)
        return task

if __name__ == "__main__":
    agent = InflationAgent()
    run_server(agent, port=4747)

Este agente ayuda a calcular cuánto valdría una cantidad determinada en el futuro después de ajustar la inflación. Utiliza la misma estructura basada en el decorador proporcionada por la biblioteca Python-A2A. El @agente decorador define los metadatos para este agente y el @habilidad El decorador registra la lógica principal bajo el nombre de “Ajuste de inflación”.

El manejar_input El método es donde ocurre el procesamiento principal. Extrae la cantidad, la tasa de inflación y el número de años de la entrada del usuario utilizando expresiones regulares simples. Si los tres valores están presentes, utiliza la fórmula de valor futuro estándar para calcular la cantidad ajustada por inflación:

Valor ajustado = cantidad × (1 + tasa/100) ^ años.

Si falta algún valor, el agente devuelve un mensaje útil que le dice al usuario qué proporcionar, incluido un ejemplo. El Handle_Task La función conecta todo al tomar el mensaje del usuario, pasarlo a la función de habilidad y devolver el resultado formateado al usuario.

Finalmente, el agente se lanza usando run_server () en el puerto 4747haciéndolo listo para manejar consultas A2A.

Creando la red de agentes

Primero ejecuta ambos agentes en dos terminales separadas

python inflation_agent.py

Cada uno de estos agentes expone un punto final API REST (por ejemplo, http: // localhost: 4737 para EMI, http: // localhost: 4747 para inflación) usando el protocolo A2A. Escuchan tareas entrantes (como “Calcule EMI por ₹ 2,00,000 …”) y responden con respuestas de texto.

Ahora, agregaremos estos dos agentes a nuestra red

from python_a2a import AgentNetwork, A2AClient, AIAgentRouter

# Create an agent network
network = AgentNetwork(name="Economics Calculator")

# Add agents to the network
network.add("EMI", "http://localhost:4737")
network.add("Inflation", "http://localhost:4747")

A continuación, crearemos un enrutador para dirigir de manera inteligente las consultas al mejor agente. Esta es una utilidad central del protocolo A2A: define un formato de tarea estándar para que los agentes puedan ser consultados de manera uniforme, y los enrutadores pueden tomar decisiones de enrutamiento inteligentes utilizando LLM.

router = AIAgentRouter(
    llm_client=A2AClient("http://localhost:5000/openai"),  # LLM for making routing decisions
    agent_network=network
)

Por último, consultaremos a los agentes

query = "Calculate EMI for ₹200000 at 5% interest over 18 months."
agent_name, confidence = router.route_query(query)
print(f"Routing to {agent_name} with {confidence:.2f} confidence")

# Get the selected agent and ask the question
agent = network.get_agent(agent_name)
response = agent.ask(query)
print(f"Response: {response}")
query = "What is ₹1500000 worth if inflation is 9% for 10 years?"
agent_name, confidence = router.route_query(query)
print(f"Routing to {agent_name} with {confidence:.2f} confidence")

# Get the selected agent and ask the question
agent = network.get_agent(agent_name)
response = agent.ask(query)
print(f"Response: {response}")

Mira el Cuadernos inflation_agent.py, network.ipynb y emi_agent.py. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.


Soy un graduado de ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en varias áreas.