gusdelact commited on
Commit
9148cad
·
verified ·
1 Parent(s): f206964

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +214 -27
app.py CHANGED
@@ -1,52 +1,78 @@
1
  import gradio as gr
2
 
3
- # Diccionario de clientes
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  clientes = {
5
  "cliente1": {
6
  "nombre": "Juan Pérez",
7
- "salario": 5000,
8
- "inversiones": 15000,
9
- "edad": 35,
10
- "objetivos": "ahorro para la jubilación"
11
  },
12
  "cliente2": {
13
  "nombre": "María López",
14
- "salario": 7500,
15
- "inversiones": 30000,
16
- "edad": 42,
17
- "objetivos": "compra de una vivienda"
18
- }
 
 
 
19
  }
20
 
21
- # Función para generar la carta de recomendación
22
- def generar_carta_inversion(cliente_id: str, salario_mensual: float, objetivo: str) -> str:
23
- """Genera una carta personalizada para el cliente con base en el salario mensual y su objetivo financiero."""
24
-
25
  cliente = clientes.get(cliente_id)
26
  if not cliente:
27
  return "Cliente no encontrado."
28
-
29
- nombre = cliente["nombre"]
30
- inversiones = cliente["inversiones"]
31
- edad = cliente["edad"]
32
 
33
- # Plantilla de la carta
34
- carta = f"""
35
- {nombre}
 
 
 
 
36
  Dirección del Cliente
37
  Ciudad, Estado, Código Postal
38
 
39
  Fecha: [Fecha Actual]
40
 
41
- Estimado/a {nombre},
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 mensual de ${salario_mensual:.2f} y ha acumulado inversiones por un total de ${inversiones:.2f}, 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 {objetivo}:
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 {objetivo}, 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.
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
- return carta
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
  # Configuración de la interfaz de Gradio
71
  def interfaz_gradio(cliente_id, salario_mensual, objetivo):
72
- return generar_carta_inversion(cliente_id, salario_mensual, objetivo)
 
 
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()