You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
11 KiB
328 lines
11 KiB
import asyncio
|
|
from dataclasses import dataclass
|
|
from enum import Enum
|
|
from typing import List, Optional
|
|
|
|
from swarms import Agent
|
|
|
|
|
|
class InsuranceType(Enum):
|
|
AUTO = "auto"
|
|
LIFE = "life"
|
|
HEALTH = "health"
|
|
HOME = "home"
|
|
BUSINESS = "business"
|
|
DENTAL = "dental"
|
|
TRAVEL = "travel"
|
|
|
|
|
|
@dataclass
|
|
class InsuranceProduct:
|
|
code: str
|
|
name: str
|
|
type: InsuranceType
|
|
description: str
|
|
coverage: List[str]
|
|
price_range: str
|
|
min_coverage: float
|
|
max_coverage: float
|
|
payment_options: List[str]
|
|
waiting_period: str
|
|
available: bool
|
|
|
|
|
|
# Simulated product database
|
|
INSURANCE_PRODUCTS = {
|
|
"AUTO001": InsuranceProduct(
|
|
code="AUTO001",
|
|
name="Seguro Auto Total",
|
|
type=InsuranceType.AUTO,
|
|
description="Seguro completo para vehículos con cobertura integral",
|
|
coverage=[
|
|
"Daños por colisión",
|
|
"Robo total",
|
|
"Responsabilidad civil",
|
|
"Asistencia en carretera 24/7",
|
|
"Gastos médicos ocupantes",
|
|
],
|
|
price_range="$800-2000 USD/año",
|
|
min_coverage=10000,
|
|
max_coverage=50000,
|
|
payment_options=["Mensual", "Trimestral", "Anual"],
|
|
waiting_period="Inmediata",
|
|
available=True,
|
|
),
|
|
"LIFE001": InsuranceProduct(
|
|
code="LIFE001",
|
|
name="Vida Protegida Plus",
|
|
type=InsuranceType.LIFE,
|
|
description="Seguro de vida con cobertura extendida y beneficios adicionales",
|
|
coverage=[
|
|
"Muerte natural",
|
|
"Muerte accidental (doble indemnización)",
|
|
"Invalidez total y permanente",
|
|
"Enfermedades graves",
|
|
"Gastos funerarios",
|
|
],
|
|
price_range="$30-100 USD/mes",
|
|
min_coverage=50000,
|
|
max_coverage=1000000,
|
|
payment_options=["Mensual", "Anual"],
|
|
waiting_period="30 días",
|
|
available=True,
|
|
),
|
|
"HEALTH001": InsuranceProduct(
|
|
code="HEALTH001",
|
|
name="Salud Preferencial",
|
|
type=InsuranceType.HEALTH,
|
|
description="Plan de salud premium con cobertura internacional",
|
|
coverage=[
|
|
"Hospitalización",
|
|
"Cirugías",
|
|
"Consultas médicas",
|
|
"Medicamentos",
|
|
"Tratamientos especializados",
|
|
"Cobertura internacional",
|
|
],
|
|
price_range="$100-300 USD/mes",
|
|
min_coverage=100000,
|
|
max_coverage=5000000,
|
|
payment_options=["Mensual", "Anual"],
|
|
waiting_period="90 días",
|
|
available=True,
|
|
),
|
|
}
|
|
|
|
|
|
class WorkflowNode(Enum):
|
|
MAIN_MENU = "main_menu"
|
|
CHECK_AVAILABILITY = "check_availability"
|
|
PRODUCT_DETAILS = "product_details"
|
|
QUOTE_REQUEST = "quote_request"
|
|
CLAIMS = "claims"
|
|
LOCATE_OFFICE = "locate_office"
|
|
PAYMENT_OPTIONS = "payment_options"
|
|
|
|
|
|
LATAM_LOCATIONS = {
|
|
"Brasil": [
|
|
{
|
|
"city": "São Paulo",
|
|
"offices": [
|
|
{
|
|
"address": "Av. Paulista, 1374 - Bela Vista",
|
|
"phone": "+55 11 1234-5678",
|
|
"hours": "Lun-Vie: 9:00-18:00",
|
|
}
|
|
],
|
|
}
|
|
],
|
|
"México": [
|
|
{
|
|
"city": "Ciudad de México",
|
|
"offices": [
|
|
{
|
|
"address": "Paseo de la Reforma 250, Juárez",
|
|
"phone": "+52 55 1234-5678",
|
|
"hours": "Lun-Vie: 9:00-18:00",
|
|
}
|
|
],
|
|
}
|
|
],
|
|
}
|
|
|
|
|
|
class InsuranceBot:
|
|
def __init__(self):
|
|
self.agent = Agent(
|
|
agent_name="LATAM-Insurance-Agent",
|
|
system_prompt="""You are a specialized insurance assistant for Latin America's leading insurance provider.
|
|
|
|
Key Responsibilities:
|
|
1. Product Information:
|
|
- Explain our comprehensive insurance portfolio
|
|
- Provide detailed coverage information
|
|
- Compare plans and benefits
|
|
- Quote estimates based on customer needs
|
|
|
|
2. Customer Service:
|
|
- Process policy inquiries
|
|
- Handle claims information
|
|
- Assist with payment options
|
|
- Locate nearest offices
|
|
|
|
3. Cultural Considerations:
|
|
- Communicate in Spanish and Portuguese
|
|
- Understand LATAM insurance regulations
|
|
- Consider regional healthcare systems
|
|
- Respect local customs and practices
|
|
|
|
Use the following simulated product database for accurate information:
|
|
{INSURANCE_PRODUCTS}
|
|
|
|
When discussing products, always reference accurate prices, coverage amounts, and waiting periods.""",
|
|
model_name="gpt-4",
|
|
max_loops=1,
|
|
verbose=True,
|
|
)
|
|
|
|
self.current_node = WorkflowNode.MAIN_MENU
|
|
self.current_product = None
|
|
|
|
async def process_user_input(self, user_input: str) -> str:
|
|
"""Process user input and return appropriate response"""
|
|
try:
|
|
if self.current_node == WorkflowNode.MAIN_MENU:
|
|
menu_choice = user_input.strip()
|
|
|
|
if menu_choice == "1":
|
|
# Use agent to provide personalized product recommendations
|
|
return await self.agent.run(
|
|
"""Por favor ayude al cliente a elegir un producto:
|
|
|
|
Productos disponibles:
|
|
- AUTO001: Seguro Auto Total
|
|
- LIFE001: Vida Protegida Plus
|
|
- HEALTH001: Salud Preferencial
|
|
|
|
Explique brevemente cada uno y solicite información sobre sus necesidades específicas."""
|
|
)
|
|
|
|
elif menu_choice == "2":
|
|
self.current_node = WorkflowNode.QUOTE_REQUEST
|
|
# Use agent to handle quote requests
|
|
return await self.agent.run(
|
|
"""Inicie el proceso de cotización.
|
|
Solicite la siguiente información de manera conversacional:
|
|
1. Tipo de seguro
|
|
2. Información personal básica
|
|
3. Necesidades específicas de cobertura"""
|
|
)
|
|
|
|
elif menu_choice == "3":
|
|
return await self.agent.run(
|
|
"""Explique el proceso de reclamos para cada tipo de seguro,
|
|
incluyendo documentación necesaria y tiempos estimados."""
|
|
)
|
|
|
|
elif menu_choice == "4":
|
|
self.current_node = WorkflowNode.LOCATE_OFFICE
|
|
# Use agent to provide location guidance
|
|
return await self.agent.run(
|
|
f"""Based on our office locations: {LATAM_LOCATIONS}
|
|
Ask the customer for their location and help them find the nearest office.
|
|
Provide the response in Spanish."""
|
|
)
|
|
|
|
elif menu_choice == "5":
|
|
# Use agent to explain payment options
|
|
return await self.agent.run(
|
|
"""Explique todas las opciones de pago disponibles,
|
|
incluyendo métodos, frecuencias y cualquier descuento por pago anticipado."""
|
|
)
|
|
|
|
elif menu_choice == "6":
|
|
# Use agent to handle advisor connection
|
|
return await self.agent.run(
|
|
"""Explique el proceso para conectar con un asesor personal,
|
|
horarios de atención y canales disponibles."""
|
|
)
|
|
|
|
else:
|
|
return await self.agent.run(
|
|
"Explain that the option is invalid and list the main menu options."
|
|
)
|
|
|
|
elif self.current_node == WorkflowNode.LOCATE_OFFICE:
|
|
# Use agent to process location request
|
|
return await self.agent.run(
|
|
f"""Based on user input: '{user_input}'
|
|
and our office locations: {LATAM_LOCATIONS}
|
|
Help them find the most relevant office. Response in Spanish."""
|
|
)
|
|
|
|
# Check if input is a product code
|
|
if user_input.upper() in INSURANCE_PRODUCTS:
|
|
product = self.get_product_info(user_input.upper())
|
|
# Use agent to provide detailed product information
|
|
return await self.agent.run(
|
|
f"""Provide detailed information about this product:
|
|
{self.format_product_info(product)}
|
|
Include additional benefits and comparison with similar products.
|
|
Response in Spanish."""
|
|
)
|
|
|
|
# Handle general queries
|
|
return await self.agent.run(
|
|
f"""The user said: '{user_input}'
|
|
Provide a helpful response based on our insurance products and services.
|
|
Response in Spanish."""
|
|
)
|
|
|
|
except Exception:
|
|
self.current_node = WorkflowNode.MAIN_MENU
|
|
return await self.agent.run(
|
|
"Explain that there was an error and list the main menu options. Response in Spanish."
|
|
)
|
|
|
|
def get_product_info(
|
|
self, product_code: str
|
|
) -> Optional[InsuranceProduct]:
|
|
"""Get product information from simulated database"""
|
|
return INSURANCE_PRODUCTS.get(product_code)
|
|
|
|
def format_product_info(self, product: InsuranceProduct) -> str:
|
|
"""Format product information for display"""
|
|
return f"""
|
|
Producto: {product.name} (Código: {product.code})
|
|
Tipo: {product.type.value}
|
|
Descripción: {product.description}
|
|
|
|
Cobertura incluye:
|
|
{chr(10).join(f'- {coverage}' for coverage in product.coverage)}
|
|
|
|
Rango de precio: {product.price_range}
|
|
Cobertura mínima: ${product.min_coverage:,.2f} USD
|
|
Cobertura máxima: ${product.max_coverage:,.2f} USD
|
|
|
|
Opciones de pago: {', '.join(product.payment_options)}
|
|
Período de espera: {product.waiting_period}
|
|
Estado: {'Disponible' if product.available else 'No disponible'}
|
|
"""
|
|
|
|
def handle_main_menu(self) -> List[str]:
|
|
"""Return main menu options"""
|
|
return [
|
|
"1. Consultar productos de seguro",
|
|
"2. Solicitar cotización",
|
|
"3. Información sobre reclamos",
|
|
"4. Ubicar oficina más cercana",
|
|
"5. Opciones de pago",
|
|
"6. Hablar con un asesor",
|
|
]
|
|
|
|
|
|
async def main():
|
|
"""Run the interactive session"""
|
|
bot = InsuranceBot()
|
|
|
|
print(
|
|
"Sistema de Seguros LATAM inicializado. Escriba 'salir' para terminar."
|
|
)
|
|
print("\nOpciones disponibles:")
|
|
print("\n".join(bot.handle_main_menu()))
|
|
|
|
while True:
|
|
user_input = input("\nUsted: ").strip()
|
|
|
|
if user_input.lower() in ["salir", "exit"]:
|
|
print("¡Gracias por usar nuestro servicio!")
|
|
break
|
|
|
|
response = await bot.process_user_input(user_input)
|
|
print(f"Agente: {response}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|