Spaces:
Sleeping
Sleeping
File size: 11,329 Bytes
58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad 58691e0 9148cad f7e35da 9ed34ca f7e35da 9148cad f7e35da 9ed34ca f7e35da 9148cad f7e35da 9ed34ca f7e35da 9148cad 58691e0 9148cad 58691e0 ecc5e3f 58691e0 9148cad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
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 = """
<nombre/>
Dirección del Cliente
Ciudad, Estado, Código Postal
Fecha: [Fecha Actual]
Estimado/a <nombre/>,
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 </salario> y ha acumulado inversiones por un total de <inversiones/>, 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 <objetivos/>, 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() |