Seguros Falabella

Arquitectura de la PoC

3 agentes ElevenLabs · 7 tools · Cloudflare Workers + Pages

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:

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

SlugAlcanceAuthToolsConsecuencia del error
sf-auto Asistencia en ruta + denuncio de siniestro de auto, en la misma llamada light sf_asistencia_despachar
sf_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_listar
sf_poliza_coberturas
sf_siniestro_estado
sf_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ónValorPor qué
LLMgemini-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.
TTSeleven_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.
ASRscribe_realtime + keyword boost Boost sobre el vocabulario que se pierde: póliza, siniestro, denuncio, deducible, liquidador, grúa, comuna.
Silencio antes de cortar25 s en sf-auto y sf-asist
15 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áxima900 s Un caso ambos —despacho de grúa y después denuncio— no entra en los 600 s del banco.
Detección de idiomaapagada Deliberado. Si el cliente cambia de idioma, el agente sigue en español y ofrece transferencia.
Retención30 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

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.