File size: 11,594 Bytes
e76a6b8
66e9b6f
 
 
 
e76a6b8
66e9b6f
e76a6b8
66e9b6f
e76a6b8
 
66e9b6f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
title: Clara - Seguros Colsubsidio
emoji: 🛡️
colorFrom: green
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
short_description: Agente conversacional de venta de seguros (Reto 2 - 30X)
---

# Clara — Venta automatizada de seguros 🛡️

**Reto 2 · Venta automatizada de seguros** — [Hackathon Colsubsidio × 30X](https://innovacion.colsubsidio.com/)
· 22–26 de julio de 2026 · Club La Colina, Bogotá.

Repositorio: [github.com/Mariana-Codebase/AgenteSeguros](https://github.com/Mariana-Codebase/AgenteSeguros)

> **El reto:** hoy adquirir un seguro en Colsubsidio depende de un asesor que
> identifique la necesidad, cotice, explique y cierre. Ese modelo no escala, no
> opera 24/7 y depende del equipo comercial. **Clara lleva al afiliado desde
> _"no sé qué seguro necesito"_ hasta _"ya quedé asegurado"_ sin un solo humano
> en el medio.**

---

## Qué es Clara

Clara es una **asesora digital de seguros** que conversa en lenguaje natural, en
español colombiano. En una sola conversación:

1. **Diagnostica** la vida del afiliado con preguntas abiertas (con quién vive, si
   tiene carro, moto, mascota, viajes, dependientes…).
2. **Recomienda** el mejor producto de **todo el portafolio Colsubsidio** (14
   productos), explicando por qué encaja, qué cubre y **qué NO cubre**.
3. **Contrata**: reúne los datos, genera el **contrato en PDF**, captura la
   **firma electrónica** y entrega un **enlace de pago** (checkout tipo Wompi).
4. **Emite** la **póliza en PDF** en el instante en que el pago se aprueba y hace
   post-venta (número de póliza, cómo usarla, encuesta de satisfacción).

Todo el recorrido queda en un **registro de auditoría** persistente. La demo web
muestra, en vivo y al lado del chat, **cada decisión, herramienta y escritura en
base de datos** que ocurre detrás — para que un juez vea que no hay magia: hay
arquitectura.

---

## Por qué Clara gana: una arquitectura en la que se puede confiar

Vender seguros con un LLM tiene un riesgo mortal: **que el modelo alucine una
cobertura, un precio o una condición**. En seguros eso no es un bug, es una
**responsabilidad legal y financiera**. Clara está diseñada, de raíz, para que
eso **no pueda pasar**:

| Principio | Cómo lo garantiza Clara |
|-----------|-------------------------|
| **El LLM solo conversa** | Gemini nunca calcula ni inventa. Solo dialoga y **llama herramientas** (function-calling). Toda la lógica dura vive en el backend. |
| **Coberturas ⇒ base de conocimiento (RAG)** | Cada afirmación de amparo/exclusión/condición sale de `consultar_coberturas`, **con cita de la fuente** (cláusula de las condiciones). |
| **Precios ⇒ motor de reglas determinístico** | Ninguna cifra la produce el modelo: salen de un motor auditable (`cotizar`) con factores por edad y dependientes. |
| **Emisión ⇒ backend, no el modelo** | Contrato, firma, pago y póliza los ejecuta el código de forma determinística; el modelo solo confirma en lenguaje natural. |
| **Guardrail de salida** | Una capa basada en reglas revisa cada respuesta: si menciona cobertura o precio sin respaldo en el turno, lo marca en la auditoría. |
| **Cumplimiento por diseño** | Aviso de tratamiento de datos (**Ley 1581 de 2012**) desde el saludo; el prompt rechaza temas fuera de alcance y resiste intentos de jailbreak. |
| **Trazabilidad total** | Cada perfil, cotización, contrato, pago y póliza se registra en SQLite y se muestra en vivo en la interfaz. |

> En una frase: **el modelo pone las palabras, el sistema pone la verdad.**

---

## El recorrido del afiliado

```
  Afiliado                Clara (Gemini)              Backend determinístico
     │                         │                              │
     │  "no sé qué necesito"   │                              │
     ├────────────────────────▶│  diagnóstico (preguntas      │
     │                         │  abiertas, escucha activa)   │
     │                         ├─ registrar_perfil ──────────▶│ SQLite (perfil)
     │                         │                              │
     │                         ├─ recomendar ────────────────▶│ RAG + motor de reglas
     │◀── opciones con precio  │◀─ coberturas + precio real ──┤
     │    y exclusiones reales │                              │
     │                         ├─ consultar_coberturas ──────▶│ RAG (cita fuente)
     │  "quiero ese"           │                              │
     │                         ├─ registrar_datos ───────────▶│ SQLite (contratante)
     │                         ├─ generar_contrato ──────────▶│ PDF contrato
     │  [ firma con botón ] ───┼─────────────────────────────▶│ firma + enlace de pago
     │  [ paga en checkout ] ──┼─────────────────────────────▶│ webhook aprobado
     │◀── "ya quedaste         │◀─ emisión determinística ────┤ PDF póliza + auditoría
     │     asegurado 🎉"       │                              │
```

Estados de la sesión: `DIAGNOSTICO → RECOMENDACION → DUDAS → CIERRE → EMITIDA`.
La conversación soporta un **atajo**: si el afiliado ya sabe lo que quiere
("solo quiero seguro de viaje"), Clara no lo interroga — va directo al producto.

---

## Portafolio cubierto (14 productos reales de Colsubsidio)

Vida · Vida y Ahorro · Plan Complementario de Salud · Asistencias Médicas
Familiares · Accidentes Personales · Exequial · Accidentes + Exequial · Asesorías
Jurídicas · Asistencias Múltiples (hogar, vehículo, salud y mascotas 24/7) ·
Asistencia Médica en Viajes · Hogar · Autos · Moto · Mascotas.

Cada uno con sus amparos, exclusiones, condiciones, fuente citable y prima base
en `app/knowledge.py`. El recomendador **rankea por ajuste al perfil, no por
precio**, y no se limita a vida o mascotas: considera todo el portafolio.

---

## Probar la demo en 2 minutos

```powershell
python -m pip install -r requirements.txt
copy .env.example .env        # y pega tu GEMINI_API_KEY (gratis, sin tarjeta)
python server.py
```

→ Abre **http://localhost:8000** y entra a la pestaña **Demo interactiva**.

Guion sugerido para el jurado:
1. *"Hola, no sé qué seguro necesito."* → deja que Clara diagnostique.
2. Cuéntale algo real: *"vivo con mi pareja y tengo un gato"* → mira cómo aparece
   el seguro de mascotas en la recomendación.
3. Elige un producto, da tus datos, **firma** con el botón y **paga** con la
   tarjeta de prueba `4242 4242 4242 4242` (la `4111…` simula rechazo).
4. Observa cómo se **emite la póliza en PDF** y todo queda en el panel de auditoría.

> **Clave Gemini:** usa una de **Google AI Studio** (`AIza...`,
> [aistudio.google.com/apikey](https://aistudio.google.com/apikey)), gratis y sin
> tarjeta. Evita claves Vertex (`AQ.`) salvo que tengas facturación en Google Cloud.

---

## Estado de ejecución (honestidad de ingeniería)

Esto es un **MVP demostrable** para la hackathon, no un producto en producción.
El flujo principal se recorre completo en local; algunas piezas son
**simulaciones** conscientes que se dejan listas para evolucionar.

| Área | Estado | Notas |
|------|--------|-------|
| **Conversación con Gemini** | ✅ Funcional | Function-calling, escucha activa, manejo de peticiones directas. |
| **Flujo end-to-end** | ✅ Funcional | Diagnóstico → recomendación → contrato → firma → pago → emisión, cableado y recorrible. |
| **Frontend (chat + paneles)** | ✅ Funcional | Chat, estado, perfil y auditoría en vivo. |
| **PDFs (resumen/contrato/póliza)** | ✅ Funcional | Generación real con `fpdf2`, descarga por `/docs/{archivo}`. |
| **Persistencia** | ✅ Funcional | Sesiones y auditoría en SQLite; sobrevive reinicios. |
| **Pago (Wompi)** | 🟡 Simulación | Checkout con tarjetas de prueba y validación Luhn. **No** es la API real de Wompi (webhooks firmados, producción). |
| **Correo / WhatsApp** | 🟡 Simulación | Sin `SMTP_*`/Twilio, la entrega se registra como `[SIMULADO]`. Con credenciales, envía de verdad. |
| **Despliegue** | 🟡 Preparado | Dockerfile + variables de entorno listos; falta hardening cloud. |

---

## Roadmap corto

- **Agente:** pulir tono, consistencia de fases y edge cases de peticiones directas.
- **Pago:** integración real con Wompi (referencias, estados, reintentos, webhook firmado).
- **Entrega:** envío real de PDF por SMTP y WhatsApp (Twilio) con pruebas end-to-end.
- **RAG / catálogo:** enriquecer condiciones desde fuentes oficiales (`data/reference/`).
- **Calidad:** tests automatizados + CI, y observabilidad (métricas de sesión, errores LLM, latencias).

---

## Arquitectura y estructura

```
├── server.py              # Punto de entrada (python server.py)
├── app/                   # Backend (paquete Python)
│   ├── main.py            #   API FastAPI + checkout de pago
│   ├── config.py          #   Configuración central (.env)
│   ├── agent.py           #   Sesión, herramientas y bucle de tool-calling + guardrail
│   ├── llm.py             #   Cliente Gemini (AI Studio + Vertex Express)
│   ├── extraction.py      #   Captura de datos: regex + responseSchema (Gemini)
│   ├── knowledge.py       #   Catálogo, RAG y motor de cotización (fuente de verdad)
│   ├── payments.py        #   Pasarela simulada (tarjetas de prueba, Luhn)
│   ├── pdfgen.py          #   PDFs de resumen, contrato y póliza (fpdf2)
│   ├── notify.py          #   Entrega por correo SMTP / WhatsApp Twilio (opcional)
│   └── store.py           #   SQLite (sesiones + auditoría)
├── static/                # Frontend (chat + paneles de estado/perfil/auditoría)
│   ├── index.html · css/styles.css · js/app.js · img/
├── data/reference/        # Documentos de referencia del reto (política de datos, workflow)
├── var/                   # Runtime: PDFs y DB (ignorado en git)
├── Dockerfile · requirements.txt
```

**Stack:** Python · FastAPI · Gemini (function-calling) · fpdf2 · SQLite · Docker.

---

## Desplegar (Docker / Hugging Face Space)

```powershell
docker build -t clara .
docker run -p 7860:7860 -e GEMINI_API_KEY=AIza... clara
```

En un **Space** (SDK Docker): define `GEMINI_API_KEY` como *secret*. **Nunca**
subas el `.env` real al repo ni al hosting.

### Variables de entorno

| Variable | Por defecto | Descripción |
|----------|-------------|-------------|
| `GEMINI_API_KEY` | — | **Obligatoria.** Preferir clave AI Studio (`AIza...`). |
| `GEMINI_MODEL` | `gemini-2.0-flash` | Modelo Gemini. |
| `APP_ENV` | `development` | `production` desactiva docs OpenAPI y autoreload. |
| `PORT` | `8000` / `7860` (Docker) | Puerto HTTP. |
| `PUBLIC_BASE_URL` | auto | Base para enlaces de pago y PDFs (en Spaces se autodetecta). |
| `SMTP_*` | — | Correo real con PDF adjunto (opcional). |
| `TWILIO_*` | — | WhatsApp/SMS (opcional). |

---

## Autora

**Mariana Sinisterra** · [@MarianaCodebase](https://github.com/MarianaCodebase)

Prototipo para el **Reto 2 · Venta automatizada de seguros** —
Hackathon [Colsubsidio × 30X](https://innovacion.colsubsidio.com/).
</content>