Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
@@ -1,52 +1,78 @@
|
|
1 |
import gradio as gr
|
2 |
|
3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
clientes = {
|
5 |
"cliente1": {
|
6 |
"nombre": "Juan Pérez",
|
7 |
-
"
|
8 |
-
"
|
9 |
-
"edad": 35,
|
10 |
-
"objetivos": "ahorro para la jubilación"
|
11 |
},
|
12 |
"cliente2": {
|
13 |
"nombre": "María López",
|
14 |
-
"
|
15 |
-
"
|
16 |
-
|
17 |
-
|
18 |
-
|
|
|
|
|
|
|
19 |
}
|
20 |
|
21 |
-
|
22 |
-
def
|
23 |
-
"""
|
24 |
-
|
25 |
cliente = clientes.get(cliente_id)
|
26 |
if not cliente:
|
27 |
return "Cliente no encontrado."
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
edad = cliente["edad"]
|
32 |
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
36 |
Dirección del Cliente
|
37 |
Ciudad, Estado, Código Postal
|
38 |
|
39 |
Fecha: [Fecha Actual]
|
40 |
|
41 |
-
Estimado/a
|
42 |
|
43 |
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.
|
44 |
|
45 |
-
Dado que actualmente tiene un salario
|
46 |
|
47 |
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.
|
48 |
|
49 |
-
2. **Fondos de Jubilación**: Como su objetivo principal es
|
50 |
|
51 |
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.
|
52 |
|
@@ -65,11 +91,172 @@ def generar_carta_inversion(cliente_id: str, salario_mensual: float, objetivo: s
|
|
65 |
Email: [Correo Electrónico]
|
66 |
"""
|
67 |
|
68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
# Configuración de la interfaz de Gradio
|
71 |
def interfaz_gradio(cliente_id, salario_mensual, objetivo):
|
72 |
-
|
|
|
|
|
73 |
|
74 |
# Configuramos la interfaz de Gradio
|
75 |
with gr.Blocks() as demo:
|
@@ -86,4 +273,4 @@ with gr.Blocks() as demo:
|
|
86 |
generar_btn.click(interfaz_gradio, [cliente_id, salario_mensual, objetivo], output)
|
87 |
|
88 |
# Iniciar la aplicación
|
89 |
-
demo.launch()
|
|
|
1 |
import gradio as gr
|
2 |
|
3 |
+
from crewai import Crew
|
4 |
+
from crewai import Agent
|
5 |
+
from crewai import Task
|
6 |
+
from langchain_aws import ChatBedrock
|
7 |
+
from langchain_core.tools import StructuredTool
|
8 |
+
from textwrap import dedent
|
9 |
+
|
10 |
+
def calculadora_50_30_20(salario: float) -> str:
|
11 |
+
"""Recomienda cómo distribuir el salario en 50% necesario, 30% prescindible y 20% ahorro. Regla 50/30/20"""
|
12 |
+
necessary = salario * 0.50
|
13 |
+
discretionary = salario * 0.30
|
14 |
+
savings = salario * 0.20
|
15 |
+
|
16 |
+
return (
|
17 |
+
f"Para un salario de ${salario:.2f}, se recomienda distribuirlo de la siguiente manera:\n"
|
18 |
+
f" - Gastos necesarios (50%): ${necessary:.2f}\n"
|
19 |
+
f" - Gastos prescindibles (30%): ${discretionary:.2f}\n"
|
20 |
+
f" - Ahorro (20%): ${savings:.2f}"
|
21 |
+
)
|
22 |
+
|
23 |
+
|
24 |
+
tool_calculadora_50_30_20 = StructuredTool.from_function(func=calculadora_50_30_20)
|
25 |
+
|
26 |
+
# Supongamos que tienes un diccionario con los datos del cliente
|
27 |
clientes = {
|
28 |
"cliente1": {
|
29 |
"nombre": "Juan Pérez",
|
30 |
+
"inversiones": 150000,
|
31 |
+
"edad": 30,
|
|
|
|
|
32 |
},
|
33 |
"cliente2": {
|
34 |
"nombre": "María López",
|
35 |
+
"inversiones": 300000,
|
36 |
+
"edad": 25,
|
37 |
+
},
|
38 |
+
"cliente3": {
|
39 |
+
"nombre": "Juana Pérez",
|
40 |
+
"inversiones": 1300000,
|
41 |
+
"edad": 25,
|
42 |
+
},
|
43 |
}
|
44 |
|
45 |
+
|
46 |
+
def consulta_cliente(cliente_id: str) -> str:
|
47 |
+
"""Busca los datos de un cliente """
|
|
|
48 |
cliente = clientes.get(cliente_id)
|
49 |
if not cliente:
|
50 |
return "Cliente no encontrado."
|
51 |
+
return f"Nombre: {cliente['nombre']}\nSalario: \nInversiones: {cliente['inversiones']}"
|
52 |
+
|
53 |
+
tool_consulta_cliente = StructuredTool.from_function(func=consulta_cliente)
|
|
|
54 |
|
55 |
+
def generar_carta_inversion(datos_cliente: str, recomendacion_financiera:str ) -> str:
|
56 |
+
"""Genera una plantilla de carta personalizada para recomendar al cliente cómo invertir."""
|
57 |
+
|
58 |
+
# Plantilla de la carta
|
59 |
+
carta = """
|
60 |
+
|
61 |
+
<nombre/>
|
62 |
Dirección del Cliente
|
63 |
Ciudad, Estado, Código Postal
|
64 |
|
65 |
Fecha: [Fecha Actual]
|
66 |
|
67 |
+
Estimado/a <nombre/>,
|
68 |
|
69 |
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.
|
70 |
|
71 |
+
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}:
|
72 |
|
73 |
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.
|
74 |
|
75 |
+
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.
|
76 |
|
77 |
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.
|
78 |
|
|
|
91 |
Email: [Correo Electrónico]
|
92 |
"""
|
93 |
|
94 |
+
return carta
|
95 |
+
|
96 |
+
tool_carta = StructuredTool.from_function(func=generar_carta_inversion)
|
97 |
+
|
98 |
+
class BankAgents:
|
99 |
+
def __init__(self):
|
100 |
+
self.BedrockClaude = ChatBedrock(model_id="anthropic.claude-3-sonnet-20240229-v1:0")
|
101 |
+
|
102 |
+
def gerente_cuenta_agente(self):
|
103 |
+
return Agent (
|
104 |
+
role = "Gerente de Cuentas",
|
105 |
+
backstory = dedent(
|
106 |
+
f""" El Gerente de Cuenta es el punto de contacto principal para los clientes,
|
107 |
+
gestionando sus necesidades financieras con un enfoque personalizado.
|
108 |
+
Anticipa y resuelve problemas, ofrece soluciones adecuadas,
|
109 |
+
y asegura el cumplimiento normativo.
|
110 |
+
Mantiene una comunicación constante para fortalecer relaciones
|
111 |
+
y busca oportunidades de negocio para expandir su portafolio.
|
112 |
+
Actúa como intermediario entre el cliente y los departamentos
|
113 |
+
internos, garantizando un servicio eficiente y satisfactorio.
|
114 |
+
Su papel combina conocimientos financieros, habilidades interpersonales,
|
115 |
+
y un profundo entendimiento del mercado,
|
116 |
+
asegurando que las metas financieras del cliente se cumplan efectivamente.
|
117 |
+
"""
|
118 |
+
),
|
119 |
+
goal = "Crear una carta al cliente que le recomiende como usar su salario para cumplir sus objetivos",
|
120 |
+
tools = [tool_carta ],
|
121 |
+
verbose=True,
|
122 |
+
llm=self.BedrockClaude
|
123 |
+
)
|
124 |
+
def asesor_financiero_agente(self):
|
125 |
+
return Agent (
|
126 |
+
role = "Asesor Financiero",
|
127 |
+
backstory = dedent(
|
128 |
+
f""" Guía a los clientes en la planificación financiera, ofreciendo
|
129 |
+
recomendaciones personalizadas en inversión, ahorro y gestión de patrimonio.
|
130 |
+
Evalúa metas y riesgos, proponiendo soluciones adaptadas a sus necesidades.
|
131 |
+
Su experiencia se basa en conocimientos financieros profundos y
|
132 |
+
habilidades de comunicación para maximizar el valor y seguridad del cliente.
|
133 |
+
"""
|
134 |
+
),
|
135 |
+
goal = "Calcular como usar el salario mensual de un cliente de acuerdo a la regla 50/30/20",
|
136 |
+
tools = [ tool_calculadora_50_30_20 ],
|
137 |
+
verbose=True,
|
138 |
+
llm=self.BedrockClaude
|
139 |
+
)
|
140 |
+
|
141 |
+
def atencion_cliente_agente(self):
|
142 |
+
return Agent (
|
143 |
+
role = "Gerente Atencion a cliente",
|
144 |
+
backstory = dedent(
|
145 |
+
f""" El gerente de Atención al Cliente asiste a los clientes
|
146 |
+
en consultas y operaciones , resolviendo problemas
|
147 |
+
y guiándolos en el uso de servicios bancarios.
|
148 |
+
Maneja reclamaciones, ofrece información sobre productos
|
149 |
+
y asegura una experiencia positiva.
|
150 |
+
Su enfoque es brindar soluciones rápidas y efectivas,
|
151 |
+
manteniendo la satisfacción y lealtad del cliente.
|
152 |
+
"""
|
153 |
+
),
|
154 |
+
goal="Obtener los datos del cliente para asistirle en cualquier operación bancaria",
|
155 |
+
tools = [ tool_consulta_cliente ],
|
156 |
+
verbose=True,
|
157 |
+
llm=self.BedrockClaude
|
158 |
+
)
|
159 |
+
|
160 |
+
class BankTasks:
|
161 |
+
def escribir_carta(self,agent,objetivo):
|
162 |
+
return Task(
|
163 |
+
description=dedent(
|
164 |
+
f"""
|
165 |
+
**Task**: Escribir una carta personalizada
|
166 |
+
para recomendar al cliente cómo usar sus ingresos mensuales
|
167 |
+
**Description**: A partir de los objetivos del cliente,
|
168 |
+
escribir una carta personalizada para recomendarle cómo
|
169 |
+
manejar sus ingresos mensuales
|
170 |
+
**Parameters**:
|
171 |
+
- Objetivo: {objetivo}
|
172 |
+
"""
|
173 |
+
|
174 |
+
),
|
175 |
+
agent = agent,
|
176 |
+
expected_output = "Texto con recomendacion al cliente"
|
177 |
+
|
178 |
+
)
|
179 |
+
|
180 |
+
def recomendar_inversion(self,agent,salario_mensual):
|
181 |
+
return Task(
|
182 |
+
description=dedent(
|
183 |
+
f"""
|
184 |
+
**Task**: Calcular como distribuir el salario en 50% necesario, 30% prescindible y 20% ahorro
|
185 |
+
**Description**: Calcular los ingresos que un cliente tiene
|
186 |
+
que destinar a cubrir tus necesidades básicas,
|
187 |
+
cuánto a gastos prescindibles, y qué cantidad ahorrar todos los meses.
|
188 |
+
|
189 |
+
**Parameters**:
|
190 |
+
- Salario: {salario_mensual}
|
191 |
+
"""
|
192 |
+
),
|
193 |
+
agent = agent,
|
194 |
+
expected_output = "Texto con la distribucion del salario"
|
195 |
+
)
|
196 |
+
|
197 |
+
def obtener_datos_cliente(self,agent,client_id):
|
198 |
+
return Task(
|
199 |
+
description=dedent(
|
200 |
+
f"""
|
201 |
+
**Task**: Obtener los datos de un cliente
|
202 |
+
**Description**: Dado el identficador de un cliente, obtener sus datos
|
203 |
+
|
204 |
+
**Parameters**:
|
205 |
+
- Identificador del Cliente: {client_id}
|
206 |
+
"""
|
207 |
+
|
208 |
+
),
|
209 |
+
agent = agent,
|
210 |
+
expected_output = "Texto con los datos del cliente"
|
211 |
+
|
212 |
+
)
|
213 |
+
|
214 |
+
class BankCrew:
|
215 |
+
def __init__(self, id_cliente, salario, objetivo):
|
216 |
+
self.id_cliente = id_cliente
|
217 |
+
self.salario = salario
|
218 |
+
self.objetivo = objetivo
|
219 |
+
|
220 |
+
def run(self):
|
221 |
+
# Define your custom agents and tasks in agents.py and tasks.py
|
222 |
+
agents = BankAgents()
|
223 |
+
tasks = BankTasks()
|
224 |
+
|
225 |
+
# Define your agents and tasks here
|
226 |
+
gerente_cuenta = agents.gerente_cuenta_agente()
|
227 |
+
asesor_financiero = agents.asesor_financiero_agente()
|
228 |
+
atencion_cliente = agents.atencion_cliente_agente()
|
229 |
+
|
230 |
+
|
231 |
+
# Custom tasks include agent name and variables as input
|
232 |
+
obtener_datos_cliente = tasks.obtener_datos_cliente(atencion_cliente, self.id_cliente)
|
233 |
+
|
234 |
+
recomendar_inversion = tasks.recomendar_inversion(asesor_financiero, self.salario)
|
235 |
+
|
236 |
+
escribir_carta = tasks.escribir_carta(gerente_cuenta, self.objetivo)
|
237 |
+
|
238 |
+
|
239 |
+
# Define your custom crew here
|
240 |
+
crew = Crew(
|
241 |
+
agents=[gerente_cuenta,
|
242 |
+
asesor_financiero,
|
243 |
+
atencion_cliente
|
244 |
+
],
|
245 |
+
tasks=[ obtener_datos_cliente,
|
246 |
+
recomendar_inversion,
|
247 |
+
escribir_carta
|
248 |
+
],
|
249 |
+
verbose=True,
|
250 |
+
)
|
251 |
+
|
252 |
+
result = crew.kickoff()
|
253 |
+
return result
|
254 |
|
255 |
# Configuración de la interfaz de Gradio
|
256 |
def interfaz_gradio(cliente_id, salario_mensual, objetivo):
|
257 |
+
banco_crew = BankCrew(cliente_id, salario_mensual, objetivo)
|
258 |
+
resultado=banco_crew.run()
|
259 |
+
return resultado
|
260 |
|
261 |
# Configuramos la interfaz de Gradio
|
262 |
with gr.Blocks() as demo:
|
|
|
273 |
generar_btn.click(interfaz_gradio, [cliente_id, salario_mensual, objetivo], output)
|
274 |
|
275 |
# Iniciar la aplicación
|
276 |
+
demo.launch()
|