Trazas de OpenTelemetry

Exporta trazas de OpenTelemetry a tu stack de observabilidad como JSON OTLP.

ElevenLabs Agents puede exportar conversaciones como trazas de OpenTelemetry codificadas como OTLP JSON (resourceSpans). Reenvíalas a Datadog, Grafana Tempo, Honeycomb o cualquier backend que procese OTLP.

ElevenLabs no envía trazas directamente a tu recopilador OTLP. Recibes JSON con formato OTLP desde un webhook, una API o un WebSocket de monitorización, y lo reenvías a tu backend.

Resumen

Exporta trazas desde tres superficies. Las tres comparten el mismo ID de traza por conversación y la nomenclatura de atributos elevenlabs.*. La estructura y los tiempos de los spans difieren entre post-llamada/GET (basado en transcripciones) y monitorización (basado en eventos).

Superficies de exportación

SuperficieCuándo recibes datosIdeal para
Webhook post-llamadaCuando termina la conversación y se completa el análisisProcesos por lotes, facturación y control de calidad, almacenamiento duradero
API GET de conversaciónBajo demanda, después de que exista la conversaciónRellenar datos, depuración, reprocesamiento
WebSocket de monitorizaciónDurante una conversación en directoPaneles en directo, alertas, intervención humana

Elegir una superficie

  • Todas las llamadas completadas en tu almacén de datos: webhook post-llamada
  • Exportación o reparación puntual: GET de conversación con format=opentelemetry
  • Interfaz de supervisión en directo o alertas: WebSocket de monitorización
  • Cronología completa después de la llamada: webhook post-llamada o GET de conversación
  • Eventos de herramientas, MCP o guardrails a medida que ocurren: WebSocket de monitorización

Usa traceId o elevenlabs.conversation_id para vincular datos entre superficies. Combina la monitorización para operaciones en directo, los webhooks para análisis duraderos y GET para rellenar datos.

Necesitas un recopilador compatible con OTLP o un proveedor de observabilidad para cada superficie. Los webhooks post-llamada requieren un endpoint de webhook del espacio de trabajo. La API GET y el WebSocket de monitorización tienen cada uno sus propios ámbitos de clave API y configuración; consulta las secciones siguientes.

Webhook post-llamada

Cuando finaliza una conversación, ElevenLabs envía una solicitud POST si hay configurado un webhook post-llamada, events incluye transcript y transcript_format es opentelemetry.

El type del webhook es post_call_transcription_otel (no post_call_transcription, que devuelve transcripciones JSON).

Carga útil del webhook

{
"type": "post_call_transcription_otel",
"event_timestamp": 1700000000,
"data": {
"conversation_id": "conv_9001k1zph3fkeh5s8xg9z90swaqa",
"agent_id": "agent_7101k5zvyjhmfg983brhmhkd98n6",
"otlp_traces": {
"resourceSpans": []
}
}
}

Activar transcripciones de OpenTelemetry

1

Crear un webhook del espacio de trabajo

En el panel de ElevenAgents, crea un webhook del espacio de trabajo con tu URL HTTPS y autenticación.

2

Vincular el webhook post-llamada

Abre la configuración de Agents, asigna el webhook como webhook post-llamada, activa el evento Transcripción y habilita las cargas útiles de transcripción de OpenTelemetry.

Configuración del webhook post-llamada

Los webhooks de transcripción de OpenTelemetry no incluyen audio. Usa post_call_audio si necesitas grabaciones.

Devuelve 2xx si se completa correctamente. Los códigos 4xx y 5xx cuentan como errores.

Los reintentos se aplican a los webhooks de transcripción (incluido OpenTelemetry) solo cuando Activar reintentos está activado para el webhook del espacio de trabajo. Los errores transitorios (5xx, 429, 408) se reintentan hasta 5 veces; los 4xx no. Los webhooks de audio nunca se reintentan. Los errores repetidos pueden desactivar automáticamente el webhook. Consulta Webhooks post-llamada para ver los detalles y las excepciones de HIPAA.

Entrega

TemaDetalle
MétodoPOST con cuerpo JSON
AutenticaciónElevenLabs-Signature: t={unix},v0={hmac} sobre {timestamp}.{body}
ReintentosSolo webhooks de transcripción; requiere Activar reintentos en el webhook; consulta la advertencia anterior
TamañoLos parámetros y resultados largos de herramientas se truncan a 4 KB por atributo de span

Estructura de la traza

Cada entrega es una traza completa: un span raíz y sus elementos secundarios.

elevenlabs.conversation
├── elevenlabs.recv.user_transcript
├── elevenlabs.recv.agent_response
│ └── elevenlabs.tool.{name}
└── ...

Los spans de respuesta del agente incluyen elevenlabs.reasoning_content cuando la entrega contiene un resumen del razonamiento.

La temporización procede de time_in_call_secs de la transcripción y de los metadatos de la llamada. El span raíz establece elevenlabs.source = post_call_webhook y el estado ERROR cuando la llamada no terminó con una desconexión normal del cliente.

GET de conversación

Solicita el formato OpenTelemetry en Obtener conversación para recibir el mismo objeto otlp_traces que el webhook post-llamada de OpenTelemetry, además del modelo completo de conversación.

GET /v1/convai/conversations/{conversation_id}?format=opentelemetry

Requiere una clave API con CONVAI_READ. Con format=json (predeterminado), se omite otlp_traces.

{
"conversation_id": "conv_9001k1zph3fkeh5s8xg9z90swaqa",
"agent_id": "agent_7101k5zvyjhmfg983brhmhkd98n6",
"status": "done",
"transcript": [],
"otlp_traces": {
"resourceSpans": []
}
}
TemaDetalle
TemporizaciónMismo generador basado en transcripciones que el webhook post-llamada
Transcripcióntranscript sigue devolviéndose; otlp_traces es adicional
URL de archivosLas URL firmadas de los atributos de span caducan tras unos 15 minutos
import os
from dotenv import load_dotenv
from elevenlabs import ElevenLabs
load_dotenv()
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
conversation = elevenlabs.conversational_ai.conversations.get(
conversation_id="conv_9001k1zph3fkeh5s8xg9z90swaqa",
format="opentelemetry",
)
otlp_traces = conversation.otlp_traces

Los nombres de span esperados incluyen elevenlabs.conversation, elevenlabs.recv.user_transcript y elevenlabs.recv.agent_response.

WebSocket de monitorización

La monitorización en tiempo real requiere un espacio de trabajo Enterprise o la función realtime-monitoring. Consulta Monitorización en tiempo real para ver la configuración, los comandos de control y los requisitos de acceso.

Transmite datos de trazas de OpenTelemetry como OTLP JSON mientras una conversación está en curso. Cada mensaje es un pequeño lote de resourceSpans, no una única traza al finalizar la llamada.

wss://api.elevenlabs.io/v1/convai/conversations/{conversation_id}/monitor?events_format=opentelemetry

La autenticación requiere CONVAI_WRITE, xi-api-key (o Authorization) y acceso EDITOR al espacio de trabajo del agente. Conéctate después de que comience la conversación.

1

Activar la monitorización en el agente

Configura monitoring_enabled: true y monitoring_events antes de la llamada. Consulta Monitorización en tiempo real.

2

Conectar con formato OpenTelemetry

Añade events_format=opentelemetry a la URL del WebSocket de monitorización.

Los eventos de VAD, probabilidad de turno y ping no están disponibles cuando se configuran monitoring_events personalizados. El flujo incluye solo texto y metadatos, no audio sin procesar.

Protocolo de sesión

  1. Conéctate con encabezados de autenticación.
  2. Recibe {"type": "connected"}.
  3. Recibe un lote de span raíz (elevenlabs.conversation, elevenlabs.source = monitoring).
  4. Recibe el historial en caché (aproximadamente los últimos 100 eventos) y, después, {"type": "history_complete"}.
  5. Recibe lotes de spans en directo a medida que se producen los eventos.

Con events_format=json (predeterminado), el WebSocket devuelve eventos de cliente sin procesar en lugar de resourceSpans. Los comandos de control coinciden con Monitorización en tiempo real.

Estructura de la traza

elevenlabs.conversation
├── elevenlabs.turn.0
│ ├── elevenlabs.event.user_transcript
│ └── elevenlabs.tool.{name}
└── elevenlabs.turn.1
AspectoPost-llamada y GETMonitorización
GranularidadUna traza por webhook o solicitudMuchos mensajes por conversación
Spans de eventosTurnos de transcripciónelevenlabs.event.{type}
Agrupación de turnosImplícita en el orden de la transcripciónelevenlabs.turn.N explícito
OrdenOrden estable de la transcripciónLos eventos pueden llegar sin un orden cronológico estricto

Los eventos estructurados se asignan a atributos específicos (por ejemplo, elevenlabs.user.text, elevenlabs.agent.text). Los eventos desconocidos usan elevenlabs.event.data con JSON truncado.

No des por hecho que el orden de los eventos coincide con el orden de habla. Correlaciona los spans en directo con los datos post-llamada mediante el mismo traceId.

Ejemplo de conexión

import WebSocket from "ws";
const ws = new WebSocket(
"wss://api.elevenlabs.io/v1/convai/conversations/conv_9001k1zph3fkeh5s8xg9z90swaqa/monitor?events_format=opentelemetry",
{
headers: {
"xi-api-key": process.env.ELEVENLABS_API_KEY!,
},
}
);
ws.on("message", (raw) => {
const msg = JSON.parse(raw.toString());
if (msg.type === "connected" || msg.type === "history_complete") return;
if (msg.resourceSpans) {
forwardToCollector({ resourceSpans: msg.resourceSpans });
}
});

Estructura de OTLP JSON

Las trazas de OpenTelemetry de todas las superficies comparten el mismo diseño de lote OTLP JSON:

{
"resourceSpans": [
{
"resource": {
"attributes": [
{ "key": "service.name", "value": { "stringValue": "elevenlabs-convai" } },
{
"key": "elevenlabs.conversation_id",
"value": { "stringValue": "conv_9001k1zph3fkeh5s8xg9z90swaqa" }
}
]
},
"scopeSpans": [
{
"scope": { "name": "elevenlabs.convai", "version": "1.0.0" },
"spans": [
{
"traceId": "32_hex_chars",
"spanId": "16_hex_chars",
"name": "elevenlabs.recv.agent_response",
"startTimeUnixNano": "1700000000000000000",
"endTimeUnixNano": "1700000001000000000",
"status": { "code": 1 }
}
]
}
]
}
]
}

Limitaciones

  • No se realiza envío directo a tu endpoint gRPC de OTLP.
  • Las cargas útiles son JSON con formato de exportación OTLP, no protobuf sin procesar en la transmisión.

Documentación relacionada