import gradio as gr
from crewai import Crew
from crewai import Agent
from crewai import Task
from langchain_aws import ChatBedrock
from langchain_core.tools import StructuredTool
from textwrap import dedent
def calculadora_50_30_20(salario: float) -> str:
"""Recomienda cómo distribuir el salario en 50% necesario, 30% prescindible y 20% ahorro. Regla 50/30/20"""
necessary = salario * 0.50
discretionary = salario * 0.30
savings = salario * 0.20
return (
f"Para un salario de ${salario:.2f}, se recomienda distribuirlo de la siguiente manera:\n"
f" - Gastos necesarios (50%): ${necessary:.2f}\n"
f" - Gastos prescindibles (30%): ${discretionary:.2f}\n"
f" - Ahorro (20%): ${savings:.2f}"
)
tool_calculadora_50_30_20 = StructuredTool.from_function(func=calculadora_50_30_20)
# Supongamos que tienes un diccionario con los datos del cliente
clientes = {
"cliente1": {
"nombre": "Juan Pérez",
"inversiones": 150000,
"edad": 30,
},
"cliente2": {
"nombre": "María López",
"inversiones": 300000,
"edad": 25,
},
"cliente3": {
"nombre": "Juana Pérez",
"inversiones": 1300000,
"edad": 25,
},
}
def consulta_cliente(cliente_id: str) -> str:
"""Busca los datos de un cliente """
cliente = clientes.get(cliente_id)
if not cliente:
return "Cliente no encontrado."
return f"Nombre: {cliente['nombre']}\nSalario: \nInversiones: {cliente['inversiones']}"
tool_consulta_cliente = StructuredTool.from_function(func=consulta_cliente)
def generar_carta_inversion(datos_cliente: str, recomendacion_financiera:str ) -> str:
"""Genera una plantilla de carta personalizada para recomendar al cliente cómo invertir."""
# Plantilla de la carta
carta = """
Dirección del Cliente
Ciudad, Estado, Código Postal
Fecha: [Fecha Actual]
Estimado/a ,
Espero que este mensaje le encuentre bien. Me dirijo a usted para agradecerle su confianza en nuestro banco y para proporcionarle algunas recomendaciones personalizadas sobre cómo podría invertir de manera más eficiente, con base en sus actuales ingresos y objetivos financieros.
Dado que actualmente tiene un salario de y ha acumulado inversiones por un total de , creo que es un buen momento para evaluar las siguientes estrategias de inversión, teniendo en cuenta su edad de {edad} años y su objetivo de {objetivos}:
1. **Diversificación de Portafolio**: Recomiendo considerar la diversificación de sus inversiones en diferentes clases de activos, como acciones, bonos, y bienes raíces. Esto puede ayudar a mitigar riesgos y maximizar sus retornos.
2. **Fondos de Jubilación**: Como su objetivo principal es , le sugiero destinar una parte de sus ingresos a fondos de jubilación o planes de pensiones, aprovechando las ventajas fiscales que estos productos ofrecen.
3. **Inversiones de Bajo Riesgo**: Invertir en bonos o fondos de inversión de bajo riesgo puede ser una buena manera de proteger su capital, especialmente dado el horizonte a largo plazo de su objetivo.
4. **Asesoría Continua**: Finalmente, le recomiendo programar una reunión con uno de nuestros asesores financieros para revisar regularmente su portafolio y ajustar su estrategia de inversión según las condiciones del mercado y sus necesidades personales.
Agradezco nuevamente su confianza en nosotros. Si tiene alguna pregunta o si desea discutir estas recomendaciones con más detalle, no dude en ponerse en contacto conmigo o con su asesor financiero de confianza.
Quedo a su disposición para cualquier consulta.
Atentamente,
[Nombre del Asesor]
Asesor Financiero
Nombre del Banco
Teléfono: [Número de Teléfono]
Email: [Correo Electrónico]
"""
return carta
tool_carta = StructuredTool.from_function(func=generar_carta_inversion)
class BankAgents:
def __init__(self):
self.BedrockClaude = ChatBedrock(model_id="anthropic.claude-3-sonnet-20240229-v1:0")
def gerente_cuenta_agente(self):
return Agent (
role = "Gerente de Cuentas",
backstory = dedent(
f""" El Gerente de Cuenta es el punto de contacto principal para los clientes,
gestionando sus necesidades financieras con un enfoque personalizado.
Anticipa y resuelve problemas, ofrece soluciones adecuadas,
y asegura el cumplimiento normativo.
Mantiene una comunicación constante para fortalecer relaciones
y busca oportunidades de negocio para expandir su portafolio.
Actúa como intermediario entre el cliente y los departamentos
internos, garantizando un servicio eficiente y satisfactorio.
Su papel combina conocimientos financieros, habilidades interpersonales,
y un profundo entendimiento del mercado,
asegurando que las metas financieras del cliente se cumplan efectivamente.
"""
),
goal = "Crear una carta al cliente que le recomiende como usar su salario para cumplir sus objetivos",
tools = [tool_carta ],
verbose=True,
llm=self.BedrockClaude ,
max_execution_time=None,
max_iter=15
)
def asesor_financiero_agente(self):
return Agent (
role = "Asesor Financiero",
backstory = dedent(
f""" Guía a los clientes en la planificación financiera, ofreciendo
recomendaciones personalizadas en inversión, ahorro y gestión de patrimonio.
Evalúa metas y riesgos, proponiendo soluciones adaptadas a sus necesidades.
Su experiencia se basa en conocimientos financieros profundos y
habilidades de comunicación para maximizar el valor y seguridad del cliente.
"""
),
goal = "Calcular como usar el salario mensual de un cliente de acuerdo a la regla 50/30/20",
tools = [ tool_calculadora_50_30_20 ],
verbose=True,
llm=self.BedrockClaude ,
max_execution_time=None,
max_iter=15
)
def atencion_cliente_agente(self):
return Agent (
role = "Gerente Atencion a cliente",
backstory = dedent(
f""" El gerente de Atención al Cliente asiste a los clientes
en consultas y operaciones , resolviendo problemas
y guiándolos en el uso de servicios bancarios.
Maneja reclamaciones, ofrece información sobre productos
y asegura una experiencia positiva.
Su enfoque es brindar soluciones rápidas y efectivas,
manteniendo la satisfacción y lealtad del cliente.
"""
),
goal="Obtener los datos del cliente para asistirle en cualquier operación bancaria",
tools = [ tool_consulta_cliente ],
verbose=True,
llm=self.BedrockClaude ,
max_execution_time=None,
max_iter=15
)
class BankTasks:
def escribir_carta(self,agent,objetivo):
return Task(
description=dedent(
f"""
**Task**: Escribir una carta personalizada
para recomendar al cliente cómo usar sus ingresos mensuales
**Description**: A partir de los objetivos del cliente,
escribir una carta personalizada para recomendarle cómo
manejar sus ingresos mensuales
**Parameters**:
- Objetivo: {objetivo}
"""
),
agent = agent,
expected_output = "Texto con recomendacion al cliente"
)
def recomendar_inversion(self,agent,salario_mensual):
return Task(
description=dedent(
f"""
**Task**: Calcular como distribuir el salario en 50% necesario, 30% prescindible y 20% ahorro
**Description**: Calcular los ingresos que un cliente tiene
que destinar a cubrir tus necesidades básicas,
cuánto a gastos prescindibles, y qué cantidad ahorrar todos los meses.
**Parameters**:
- Salario: {salario_mensual}
"""
),
agent = agent,
expected_output = "Texto con la distribucion del salario"
)
def obtener_datos_cliente(self,agent,client_id):
return Task(
description=dedent(
f"""
**Task**: Obtener los datos de un cliente
**Description**: Dado el identficador de un cliente, obtener sus datos
**Parameters**:
- Identificador del Cliente: {client_id}
"""
),
agent = agent,
expected_output = "Texto con los datos del cliente"
)
class BankCrew:
def __init__(self, id_cliente, salario, objetivo):
self.id_cliente = id_cliente
self.salario = salario
self.objetivo = objetivo
def run(self):
# Define your custom agents and tasks in agents.py and tasks.py
agents = BankAgents()
tasks = BankTasks()
# Define your agents and tasks here
gerente_cuenta = agents.gerente_cuenta_agente()
asesor_financiero = agents.asesor_financiero_agente()
atencion_cliente = agents.atencion_cliente_agente()
# Custom tasks include agent name and variables as input
obtener_datos_cliente = tasks.obtener_datos_cliente(atencion_cliente, self.id_cliente)
recomendar_inversion = tasks.recomendar_inversion(asesor_financiero, self.salario)
escribir_carta = tasks.escribir_carta(gerente_cuenta, self.objetivo)
# Define your custom crew here
crew = Crew(
agents=[gerente_cuenta,
asesor_financiero,
atencion_cliente
],
tasks=[ obtener_datos_cliente,
recomendar_inversion,
escribir_carta
],
verbose=True,
)
result = crew.kickoff()
return result
# Configuración de la interfaz de Gradio
def interfaz_gradio(cliente_id, salario_mensual, objetivo):
banco_crew = BankCrew(cliente_id, salario_mensual, objetivo)
resultado=banco_crew.run()
return resultado
# Configuramos la interfaz de Gradio
with gr.Blocks() as demo:
gr.Markdown("# Generador de Carta de Recomendación Financiera")
cliente_id = gr.Textbox(label="ID del Cliente")
salario_mensual = gr.Number(label="Salario Mensual")
objetivo = gr.Textbox(label="Objetivo Financiero")
output = gr.Textbox(label="Carta de Recomendación Generada")
generar_btn = gr.Button("Generar Carta")
generar_btn.click(interfaz_gradio, [cliente_id, salario_mensual, objetivo], output)
# Iniciar la aplicación
demo.launch()