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. |
|---|
Historial de Llamadas
| ID | Call SID | Técnico | Teléfono destino | Dirección | Estado | Duración | Fecha | Acciones |
|---|
Arquitectura del Sistema
Twilio
Public Tunnel
WebSocket
TwiML
TwiML
NORA CORE
FastAPI · Python 3.11 · :8000
Anthropic
PostgreSQL
REST API
Eventos
Eventos
Optimaback
MCP
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)- Editar
.enven el servidor de Nora (raíz del proyecto). - Actualizar solo variables usadas por Nora para llamadas e integración.
- Reiniciar Nora para recargar configuración.
- 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_variablespara 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# Goalo# Guardrails - Prefijo
system__en variables propias — está reservado - Prefijo
secret__— variables secretas, nunca llegan al LLM