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()