Dashboard

0 Total llamadas
0 Completadas
0 Rechazadas
0 Llamadas hoy

Llamadas recientes

Ver historial
Fecha Técnico Estado

Resultados de Llamadas por Técnico

Técnico Total Conf. Rech.
Total llamadas
Completadas
Rechazadas
Duración media
— min

Historial de Llamadas

ID Call SID Técnico Teléfono destino Dirección Estado Duración Fecha Acciones

Arquitectura del Sistema

Twilio
Voice API
Public Tunnel
BASE_URL
WebSocket
TwiML
NORA CORE
FastAPI · Python 3.11 · :8000
Anthropic
claude-haiku-4-5
PostgreSQL
nora_db
REST API
Eventos
Optimaback
Backend maestro
MCP
Context bridge
NORA API Secret (X-Api-Key)
Clave compartida entre el panel web y Optimaback. Se envía como header X-Api-Key en todas las peticiones autenticadas. Mismo valor que NORA_API_SECRET en .env. Se guarda en localStorage del navegador.
Generar JWT para Laravel
Token de vida corta (5 min) firmado con NORA_API_SECRET para que Optimaback dispare llamadas sin exponer la clave maestra. Flujo: Laravel firma JWT → POST /calls/initiate {token} → NORA valida → llama al técnico.
Credenciales Twilio

Cargando...

Para cambiar credenciales, edita .env y reinicia el servidor.
Webhooks
Configura estas URLs en la consola de Twilio → Tu número → Voice Configuration.

Cargando...

Pipeline de Voz (ConversationRelay)
Técnico
Llamada entrante
Twilio STT
es-ES built-in
NORA (Claude)
claude-haiku-4-5 · 200t
Twilio TTS
es-ES · Google Neural
Técnico
Respuesta por voz
SIP Trunk (Conexia)
Estado del trunk y números salientes verificados.

Cargando...

El trunk enruta llamadas salientes por Conexia. El número FROM debe estar verificado en Twilio.
Verificar Caller ID
Twilio llamará al número. Introduce el código cuando contestes.
Optimaback (Laravel)

Cargando...

Token Sanctum
Token de Laravel Sanctum para consumir la API NoraIVR. Se configura en .env como EXTERNAL_API_TOKEN.
Sincronización de OTs
Desactivado en modo productivo. La fuente de verdad de OTs está en el backend maestro + MCP.
Flujo maestro Backend/MCP → NORA
1
Backend maestro prepara contexto de llamada y valida reglas de negocio
$token = JWT::encode(['ot_id' => $otId, 'exp' => time() + 300, 'iss' => 'optimaback'], env('NORA_SECRET'), 'HS256');
2
POST /calls/initiate — NORA ejecuta llamada con datos recibidos
Http::post(env('NORA_URL') . '/calls/initiate', ['token' => $token, 'ot_id' => $otId]);
3
NORA devuelve estado/transcripción y grafica resultados de llamadas
→ Fuente de verdad OT/score: Backend maestro + MCP (no NORA local)
Guía de entorno e integración
Referencia operativa basada en variables y endpoints reales del proyecto.
Editar .env (Nora)
  1. Editar .env en el servidor de Nora (raíz del proyecto).
  2. Actualizar solo variables usadas por Nora para llamadas e integración.
  3. Reiniciar Nora para recargar configuración.
  4. Validar en esta pestaña: Twilio, URL backend y estado MCP.
Valores detectados ahora
BASE_URL
EXTERNAL_API_URL
Webhook Voice
Modo Desarrollo (Backend maestro)
Estado
Teléfono dev
Variable Dónde se usa Destino Formato esperado Qué revisar si falla Estado Acciones
Exportar para Backend
Nota: generar secreto solo crea/copia valor; el pegado y despliegue se hacen manualmente.
Se configura en Backend maestro (Optimaback/MCP)
  • Estado oficial de OT y asignación de técnico.
  • Score oficial de técnico y reglas de negocio.
  • Payload a Nora para iniciar llamada (token, contexto, SLA, datos de OT).
Nora consume desde Backend
  • POST /calls/initiate: token/OT/contexto para ejecutar llamada.
  • Datos de OT y checklist en dynamic_variables para el agente.
  • Nora reporta de vuelta estado de llamada y transcripción a Optimaback.
System Prompt del Agente ElevenLabs
Edita el system prompt del agente y publícalo directamente en ElevenLabs. El badge indica si el texto actual está publicado o tiene cambios pendientes.
Guía de escritura del prompt

Secciones oficiales ElevenLabs — el modelo está entrenado para reconocerlas. # Guardrails recibe atención especial.

# Personality    → quién es el agente, carácter, tono
# Environment    → contexto (llamada de voz, canal, situación)
# Tone           → estilo y longitud de respuestas
# Goal           → objetivo + pasos numerados del flujo
# Guardrails     → reglas no negociables (prioridad máxima)
# Tools          → herramientas MCP con subsecciones ##
# Error handling → qué hacer si fallan las herramientas

Variables dinámicas — solo sustitución de texto con {{variable}}:

{{technician_name}}       → nombre del técnico
{{work_order_id}}         → ID de la OT
{{horario_franja_texto}}  → franja horaria (ej. "entre las 09:00 y las 20:00")
{{es_codigo_rojo}}        → "si" o "no"
{{fecha_sla}}             → fecha límite de la OT

Variables de sistema — disponibles automáticamente sin configurar:

{{system__time_utc}}            → hora UTC actual
{{system__caller_id}}           → número del técnico (voz)
{{system__conversation_id}}    → ID conversación ElevenLabs
{{system__call_sid}}            → Call SID de Twilio
{{system__call_duration_secs}} → duración en segundos

Énfasis en instrucciones críticas — añadir esta frase exacta al final de la línea:

Llamar confirmar_ot cuando el técnico dé fecha y hora claras. This step is important.
Nunca procesar sin verificar identidad. This step is important.

Formato de herramientas — cada tool en subsección ##:

# Tools

## `confirmar_ot`

**When to use:** cuando el técnico proponga o acepte fecha y hora claras.
**Parameters:**
- `ot_id` (required): ID de la OT. Usar {{work_order_id}}.
- `fecha_intervencion_propuesta` (required): formato YYYY-MM-DDTHH:mm:ss.

**Error handling:**
Si falla, di "Tengo un problema técnico. Te llamo en un momento." y end_call.

⚠ No soportado por ElevenLabs:

  • Condicionales {% if %} o {{#if}} — no existen. Usar lenguaje natural en # Goal o # Guardrails
  • Prefijo system__ en variables propias — está reservado
  • Prefijo secret__ — variables secretas, nunca llegan al LLM