La restricción que gobierna todo el diseño
Seguros Falabella es corredora, no aseguradora
Intermedia pólizas que emiten terceros. Ningún agente puede afirmar que un evento está cubierto, estimar indemnizaciones, anticipar el resultado de un siniestro ni interpretar cláusulas, exclusiones o deducibles. Lo único que puede hacer con una cobertura es leer literalmente lo que devuelve la tool y remitir a las condiciones particulares.
Esto no es tono: es el eje del modelo de riesgo, y tiene precedencia sobre cualquier otra instrucción, incluidas las de servicio. Está implementado en tres capas independientes, para que ninguna sola sea el punto de falla:
- Prompt — bloque S4 con las frases prohibidas y las tres frases estándar textuales.
- Descripción de tool — cada tool repite la prohibición; el modelo la lee justo antes de decidir.
- Respuesta del backend —
instruccion_para_el_agentevuelve a recordarla en el último texto que el modelo procesa antes de hablar.
Criterio de evaluación ev_no_afirmo_cobertura en los 3 agentes. Umbral del PoC:
0 afirmaciones en 200 conversaciones. Sin tolerancia.
Los tres agentes
| Slug | Alcance | Auth | Tools | Consecuencia del error |
|---|---|---|---|---|
sf-auto |
Asistencia en ruta + denuncio de siniestro de auto, en la misma llamada | light | sf_asistencia_despacharsf_denuncio_crear |
Alta — cliente varado o denuncio mal tomado |
sf-asist |
Emergencia de hogar + asistencia en viaje | light | sf_asistencia_despachar |
Alta — emergencia domiciliaria sin atender |
sf-poliza |
Pólizas vigentes, coberturas, estado de siniestro, envío de documentos | strong | sf_polizas_listarsf_poliza_coberturassf_siniestro_estadosf_documento_enviar |
Crítica — promesa de cobertura no honrada |
Sin enrutador. Cada agente tiene su propia entrada y su propio alcance. La agrupación no es
arbitraria: sf-auto junta asistencia y denuncio porque el cliente que choca necesita las dos cosas en
la misma llamada, y transferirlo en medio de la crisis es mal diseño. sf-asist agrupa hogar y viaje
porque comparten el patrón de despacho sin evaluación de cobertura. sf-poliza agrupa las cuatro
consultas que comparten autenticación fuerte y modelo de riesgo.
Flujo de una llamada
Navegador (consola demo, Cloudflare Pages)
│ dynamic variables: canal_origen, auth_level, session_token,
│ cliente_nombre, transfer_history
▼
Widget @elevenlabs/convai-widget-embed
│ WebRTC
▼
ElevenLabs Agent ASR scribe_realtime + keyword boost
│ LLM gemini-2.5-flash · temp 0.15 · 300 tok
│ TTS eleven_flash_v2_5 · voz es-CL
│
├── webhook tool ──────▶ Cloudflare Worker (Hono)
│ X-PoC-Token ├─ valida RUT con módulo 11
│ X-Idempotency-Key ├─ rechaza despacho sin comuna
│ Authorization: Bearer ├─ folio determinístico por conversation_id
│ {{session_token}} └─ KV CASOS (TTL 7 días) ──▶ panel de trazabilidad
│
├── transfer_to_agent ─▶ otro agente de la suite (REAL en la demo)
│
└── client tool ───────▶ transferir_humano (SIMULADO: no hay telefonía)
Decisiones de plataforma
| Decisión | Valor | Por qué |
|---|---|---|
| LLM | gemini-2.5-flash, temperature 0.15 |
Latencia. La temperatura es más baja que en la suite del banco: acá una frase de más sobre cobertura es un problema legal, no un problema de tono. |
| TTS | eleven_flash_v2_5, voz lLsDvdl6OjtZfLJPM2HA |
Misma voz es-CL ya validada en BCI Normaliza, Falabella retail y Banco Falabella. La voz del PoC tiene que ser la de producción. |
| ASR | scribe_realtime + keyword boost |
Boost sobre el vocabulario que se pierde: póliza, siniestro, denuncio, deducible, liquidador, grúa, comuna. |
| Silencio antes de cortar | 25 s en sf-auto y sf-asist15 s en sf-poliza |
El cliente puede estar mirando la calle, buscando la patente en el permiso de circulación o hablando con un tercero en el lugar del hecho. Cortarle por silencio en una emergencia es un error grave. |
| Duración máxima | 900 s | Un caso ambos —despacho de grúa y después denuncio— no entra en los 600 s del banco. |
| Detección de idioma | apagada | Deliberado. Si el cliente cambia de idioma, el agente sigue en español y ofrece transferencia. |
| Retención | 30 días, pii_redaction activo |
Provisorio de PoC. RUT y patente enmascarados en el transcript almacenado. El valor definitivo lo define Legal. |
Dos defensas que están en el esquema, no en el prompt
1 · No se puede enviar un documento a un destino dictado
El request_body_schema de sf_documento_enviar no tiene campo para
dirección de correo ni número de teléfono. Solo acepta el canal (email / whatsapp), y el
backend lo resuelve contra los datos ya registrados del cliente. El agente es estructuralmente incapaz de enviar a
un destino dictado en la llamada, incluso si el prompt fallara o alguien lo manipulara.
Es la principal defensa contra ingeniería social en sf-poliza.
Caso de prueba P-04, umbral: 0 envíos a destino no registrado.
2 · No se puede despachar sin comuna
El Worker rechaza sf_asistencia_despachar con falta_comuna si la ubicación no la trae,
y con sin_receptor si es una asistencia de hogar sin nadie mayor de edad para recibir al técnico. En
Chile hay calles con el mismo nombre en muchas comunas: un despacho sin comuna manda al proveedor a la dirección
equivocada mientras el cliente espera.
Casos A-05 y S-03 y S-09. Umbral: 0 despachos sin comuna.
Modo mock del envío de documentos
En Fase 1, sf_documento_enviar no envía nada: registra la intención, devuelve un
identificador simulado y los destinos enmascarados como si fueran reales. El agente se comporta exactamente igual
que en producción — dice que el documento fue enviado.
Es deliberado: lo que se está probando es la conversación, no el canal de entrega. Para que la auditoría pueda
distinguir un envío simulado de uno real, mock_mode: true queda visible en el payload, en el transcript
y en el panel de trazabilidad de la consola.
El paso a producción es cambiar la URL de la tool y el flag. Nada más del agente cambia.
Qué NO construye esta PoC
- Venta o cierre de pólizas por voz. Descartado por el peso regulatorio de la venta de seguros a distancia.
- Anulación o desafiliación. Se deriva a humano en el mismo turno, sin retención ni preguntas: poner fricción acá es un riesgo regulatorio.
- Cobro de prima no reconocido. Toca venta no consentida y venta atada. Se deriva con captura mínima, sin confirmar ni negar que la póliza exista.
- Reclamo formal por rechazo de siniestro, y cualquier tool que modifique una póliza. Fase 1 es solo lectura y creación de casos.
- Enrutador central. Queda para Fase 3, con el corpus de
dc_tipo_consultaque acumule el piloto.
Reproducibilidad
node _scripts/create-segurosfalabella.mjs # 7 tools + 3 agentes → agents.env node _scripts/patch-transferencias.mjs # matriz de transferencias (2º pase) ./_scripts/deploy.sh # Worker + Pages # iterar sin recrear nada, los tres idempotentes y verificados con un GET: node _scripts/update-prompts.mjs # tras editar agent/prompts/*.md node _scripts/update-tools.mjs # tras editar _scripts/tools.mjs node _scripts/patch-transferencias.mjs # tras tocar la matriz
Los agentes se crean y se modifican por API con scripts versionados, nunca a mano
en el dashboard. Los prompts viven en agent/prompts/ y se ensamblan en tiempo de creación: capa común
S1–S7, módulo de RUT si el agente lo captura hablando, módulo de patente solo en sf-auto, y prompt
específico. No hay texto duplicado en el repo.