Ir al contenido

Módulo XVI — agentes de voz y en tiempo real

El módulo XVI gobierna agentes conversacionales y en tiempo real. Es un plano de observar-y-gobernar: no reimplementa un SDK de voz (Realtime API, WebRTC, ASR o TTS) y nunca abre un stream de medios por sí mismo. Decide quién puede abrir una sesión de voz, con qué modelo y proveedor, bajo qué política, y rastrea los metadatos de esa sesión — nunca su contenido.

Abrir una interfaz de voz se trata como una acción privilegiada, no una operación libre. La política es default-DENY: una sesión sin política que la permita se rechaza. Una apertura es de dos fases y está sujeta a human-in-the-loop a través de la approval gate; está ligada a un plan_hash para que una aprobación no pueda elevarse en silencio a un modelo más fuerte (anti-TOCTOU), auditada al principal real (nunca system), y evidenciada append-only. El módulo mismo nunca llama a un proveedor — la actuación sale por un seam de despacho separado.

La otra mitad es observación: el módulo rastrea solo metadatos de sesión — estado derivado (live/idle/ended, computado en tiempo de lectura a partir de la recencia de actividad, sin columna de ciclo de vida almacenada), recuento de turnos, duración, latencia (avg y max honestos a partir de muestras reales) e idioma BCP-47. A partir de esto eleva findings de gobernanza: una violación de política cuando la telemetría nombra un agente/modelo/proveedor que ninguna política permite, un finding de latencia degradada cuando la latencia cruza un SLA de política, y un finding de apertura no gobernada cuando se intenta una apertura sin gate cableado — la brecha se expone y la apertura aun así se deniega.

El módulo declara tres entidades en el modelo de datos compartido:

EntidadMutabilidadPropósito
sessionmutable (upsert)metadatos de sesión; cero contenido
policymutabledeclaración de gobernanza — quién puede abrir con qué modelo/proveedor (default-DENY)
decisionappend-onlyledger inmutable de decisiones de apertura/cierre

Una política coincide por agente, modelo permitido y proveedor permitido (cada uno específico o comodín), con límites opcionales de minutos de sesión y de SLA de latencia. Ninguna política coincidente significa DENY. El decision ledger registra cada open_request, open y close con su veredicto de política, estado de gate y estado de resultado. El acceso de lectura es el rol de viewer y superiores; declarar una política y abrir una sesión son acciones administrativas, con ámbito de tenant y auditadas. Estas rutas del módulo se publican en la referencia de rutas de módulos beta separada, no en el contrato estable del núcleo — sus formas a nivel de campo viven en las interfaces tipadas del producto. Los importes en dólares no están aquí; FinOps (módulo XI) es el dueño del coste.

El módulo es dueño de un seam de ingesta deny-closed — su propio evento voice.telemetry.observed — a través del cual una sonda in-process alimentaría metadatos de sesión. El cable es de datos mínimos por construcción: el parser de telemetría lleva una allow-list y rechaza el evento entero si ve una clave prohibida, de modo que nunca puede persistirse audio, texto de transcripción, texto ASR/TTS, contenido de prompt/respuesta ni PII de hablante. La única señal de transcripción que se conserva es un hash de un solo sentido de un localizador de transcripción externo — prueba de que existe una transcripción, nunca la transcripción. Los findings de gobernanza se emiten como finding.reported con detalle hasheado, tras el commit.

Una apertura gobernada despacha en vivo: una vez que el operador aprovisiona un dispatcher de voz, una apertura aprobada acuña una credencial efímera del lado del servidor y devuelve solo esa credencial más las coordenadas de conexión — modelo, voz, herramientas y detección de turnos quedan fijados desde la política, nunca desde el cliente, y la clave maestra del proveedor nunca sale del servidor. Sin ese aprovisionamiento el seam de despacho es deny-closed: una apertura aprobada se registra honestamente como “declarada, no abierta” en lugar de fingirse.