Ir para a navegação

Rastreamentos do OpenTelemetry

Exporte rastreamentos do OpenTelemetry para sua stack de observabilidade como JSON OTLP.

Os ElevenLabs Agents podem exportar conversas como rastreamentos do OpenTelemetry codificados como JSON OTLP (resourceSpans). Encaminhe-os para Datadog, Grafana Tempo, Honeycomb ou qualquer backend que receba OTLP.

A ElevenLabs não envia rastreamentos diretamente para seu coletor OTLP. Você recebe JSON no formato OTLP de um webhook, API ou WebSocket de monitoramento e o encaminha para seu backend.

Visão geral

Exporte rastreamentos de três superfícies. Todas compartilham o mesmo ID de rastreamento por conversa e a nomenclatura de atributos elevenlabs.*. O formato e o tempo dos spans diferem entre pós-chamada/GET (baseados na transcrição) e monitoramento (baseado em eventos).

Superfícies de exportação

SuperfícieQuando você recebe os dadosIdeal para
Webhook pós-chamadaApós o fim da conversa e a conclusão da análisePipelines em lote, faturamento e QA, armazenamento durável
API GET de conversaSob demanda, após a criação da conversaPreenchimento de dados, depuração, reprocessamento
WebSocket de monitoramentoDurante uma conversa ao vivoPainéis ao vivo, alertas, supervisão humana

Escolhendo uma superfície

  • Todas as chamadas concluídas no seu data warehouse: webhook pós-chamada
  • Exportação ou reparo pontual: GET de conversa com format=opentelemetry
  • Interface de supervisão ao vivo ou alertas: WebSocket de monitoramento
  • Linha do tempo completa e detalhada depois da chamada: webhook pós-chamada ou GET de conversa
  • Eventos de ferramentas, MCP ou proteções à medida que acontecem: WebSocket de monitoramento

Use traceId ou elevenlabs.conversation_id para vincular dados entre as superfícies. Combine o monitoramento para operações ao vivo, webhooks para análises duráveis e GET para preenchimento de dados.

Você precisa de um coletor ou fornecedor de observabilidade compatível com OTLP para cada superfície. Os webhooks pós-chamada exigem um endpoint de webhook do workspace. A API GET e o WebSocket de monitoramento têm, cada um, seus próprios escopos de chave de API e configuração; consulte as seções abaixo.

Webhook pós-chamada

Após o término de uma conversa, a ElevenLabs envia uma solicitação POST quando um webhook pós-chamada está configurado, events inclui transcript e transcript_format é opentelemetry.

O type do webhook é post_call_transcription_otel (não post_call_transcription, que retorna transcrições JSON).

Payload do webhook

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

Ativar transcrições do OpenTelemetry

1

Criar um webhook do workspace

No painel do ElevenAgents, crie um webhook do workspace com sua URL HTTPS e autenticação.

2

Vincular o webhook pós-chamada

Abra as configurações dos Agents, atribua o webhook como webhook pós-chamada, ative o evento Transcript e habilite Payloads de transcrição do OpenTelemetry.

Configurações do webhook pós-chamada

Os webhooks de transcrição do OpenTelemetry não incluem áudio. Use post_call_audio se precisar de gravações.

Retorne 2xx em caso de sucesso. 4xx e 5xx contam como falhas.

As tentativas são aplicadas aos webhooks de transcrição (incluindo OpenTelemetry) e áudio somente quando Ativar novas tentativas está habilitado para o webhook do workspace. Erros transitórios (** 5xx **, **429 **, **408 **) tentam novamente até 5 vezes; 4xx não. Falhas repetidas podem desativar o webhook automaticamente. Consulte Webhooks pós-chamada para ver detalhes e exceções da HIPAA.

Entrega

TópicoDetalhe
MétodoPOST com corpo JSON
AutenticaçãoElevenLabs-Signature: t={unix},v0={hmac} sobre {timestamp}.{body}
TentativasExige Ativar novas tentativas no webhook; veja o aviso acima
TamanhoParâmetros e resultados longos de ferramentas são truncados em 4 KB por atributo de span

Formato do rastreamento

Cada entrega é um rastreamento completo: um span raiz mais spans filhos.

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

Os spans de resposta do agente incluem elevenlabs.reasoning_content quando a entrega contém um resumo de raciocínio.

A temporização vem de time_in_call_secs da transcrição e dos metadados da chamada. O span raiz define elevenlabs.source = post_call_webhook e o status ERROR quando a chamada não terminou com uma desconexão normal do cliente.

GET de conversa

Solicite o formato OpenTelemetry em Obter conversa para receber o mesmo objeto otlp_traces do webhook OpenTelemetry pós-chamada, além do modelo completo da conversa.

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

Exige uma chave de API com CONVAI_READ. Com format=json (padrão), otlp_traces é omitido.

{
"conversation_id": "conv_9001k1zph3fkeh5s8xg9z90swaqa",
"agent_id": "agent_7101k5zvyjhmfg983brhmhkd98n6",
"status": "done",
"transcript": [],
"otlp_traces": {
"resourceSpans": []
}
}
TópicoDetalhe
TemporizaçãoMesmo gerador baseado em transcrição do webhook pós-chamada
Transcriçãotranscript ainda é retornado; otlp_traces é adicional
URLs de arquivoURLs assinadas nos atributos de span expiram após cerca de 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

Os nomes de span esperados incluem elevenlabs.conversation, elevenlabs.recv.user_transcript e elevenlabs.recv.agent_response.

WebSocket de monitoramento

O monitoramento em tempo real exige um workspace Enterprise ou a flag de recurso realtime-monitoring. Consulte Monitoramento em tempo real para configuração, comandos de controle e requisitos de acesso.

Transmita dados de rastreamento do OpenTelemetry como JSON OTLP enquanto uma conversa estiver em andamento. Cada mensagem é um pequeno lote resourceSpans, não um rastreamento único ao fim da chamada.

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

A autenticação exige CONVAI_WRITE, xi-api-key (ou Authorization) e acesso EDITOR ao workspace do agente. Conecte-se após o início da conversa.

1

Ativar o monitoramento no agente

Defina monitoring_enabled: true e configure monitoring_events antes da chamada. Consulte Monitoramento em tempo real.

2

Conectar com o formato OpenTelemetry

Adicione events_format=opentelemetry à URL do WebSocket de monitoramento.

Eventos de VAD, probabilidade de turno e ping não ficam disponíveis quando monitoring_events personalizados são configurados. O stream inclui apenas texto e metadados, não áudio bruto.

Protocolo de sessão

  1. Conecte-se com cabeçalhos de autenticação.
  2. Receba {"type": "connected"}.
  3. Receba um lote de span raiz (elevenlabs.conversation, elevenlabs.source = monitoring).
  4. Receba o histórico em cache (cerca dos últimos 100 eventos), depois {"type": "history_complete"}.
  5. Receba lotes de spans ao vivo à medida que os eventos ocorrem.

Com events_format=json (padrão), o WebSocket retorna eventos brutos do cliente em vez de resourceSpans. Os comandos de controle correspondem a Monitoramento em tempo real.

Formato do rastreamento

elevenlabs.conversation
├── elevenlabs.turn.0
│ ├── elevenlabs.event.user_transcript
│ └── elevenlabs.tool.{name}
└── elevenlabs.turn.1
AspectoPós-chamada e GETMonitoramento
GranularidadeUm rastreamento por webhook ou solicitaçãoMuitas mensagens por conversa
Spans de eventoTurnos da transcriçãoelevenlabs.event.{type}
Agrupamento de turnosImplícito na ordem da transcriçãoelevenlabs.turn.N explícito
OrdemOrdem estável da transcriçãoOs eventos podem chegar fora de ordem cronológica estrita

Eventos estruturados são mapeados para atributos dedicados (por exemplo, elevenlabs.user.text, elevenlabs.agent.text). Eventos desconhecidos usam elevenlabs.event.data com JSON truncado.

Não presuma que a ordem dos eventos corresponde à ordem de fala. Correlacione spans ao vivo com dados pós-chamada usando o mesmo traceId.

Exemplo de conexão

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 });
}
});

Estrutura JSON OTLP

Os rastreamentos do OpenTelemetry de todas as superfícies compartilham o mesmo layout de lote JSON OTLP:

{
"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 }
}
]
}
]
}
]
}

Limitações

  • Não há envio direto para seu endpoint gRPC OTLP.
  • Os payloads são JSON no formato de exportação OTLP, não protobuf bruto em trânsito.

Documentação relacionada