gen_ai.*, ele pode escrever na Niadra sem chamada nova no caminho da conversa: aponte um exportador OTLP para a Niadra, e cada chamada ao modelo vira as mensagens da conversa, com quem falou e quando. É o jeito mais rápido de começar a construir memória a partir de um agente que você não quer mexer, e um caminho comum para capturar uma plataforma de fornecedor que exporta traces mas não tem integração com a Niadra.
A leitura continua por context(), pelas ferramentas do histórico ou pelo MCP. O OpenTelemetry cobre o lado da escrita.
O endpoint
A Niadra recebe OTLP por HTTP, com o corpo em JSON (Content-Type: application/json) ou em protobuf (application/x-protobuf), com ou sem gzip:
Authorization: Bearer, a mesma que o seu agente usaria no SDK, com o escopo track. A resposta é a do OTLP: cada mensagem recusada conta uma vez em partialSuccess.rejectedSpans, com a posição e o motivo em errorMessage.
Os níveis
O que os spans produzem depende do que eles levam. Com a funcionalidadeturns ligada no espaço, cada turno dos spans vira também um registro de turno:
Um registro bronze guarda os digests do que leu, não os valores: o modo dele é
hash_only, a menos que a gravação do espaço diga outra coisa para a fonte. Um valor que o exportador cortou, por limite de tamanho de atributo ou por atributo descartado, marca a chamada truncated: true.
O que a Niadra lê de um span
As convenções semânticasgen_ai ainda mudam, e várias gerações de atributos convivem nas bibliotecas em uso hoje. A Niadra lê em cascata, então você não precisa travar a versão de biblioteca por nossa causa:
De uma chamada de ferramenta (
gen_ai.operation.name igual a execute_tool), a Niadra lê gen_ai.tool.name, gen_ai.tool.call.id (ou o id do span) e, quando a instrumentação captura conteúdo, os argumentos e o resultado, que viram uma chamada kind: tool do registro com a duração do span. De uma chamada de modelo, o modelo (gen_ai.response.model, ou gen_ai.request.model), gen_ai.usage.input_tokens e gen_ai.usage.output_tokens, a contagem de tokens em cache quando a instrumentação a reporta, e as mensagens de entrada e saída.
Algumas coisas não têm atributo no OpenTelemetry, então você mesmo marca, no span ou no recurso:
Um span ou um evento de span chamado
niadra.exposure, emitido quando uma lista chega à pessoa (não quando a ferramenta a devolve), leva niadra.exposure.id, niadra.exposure.list, niadra.exposure.page, niadra.exposure.offset, niadra.exposure.visible_k e niadra.exposure.items (um JSON com pos, ref e shown), e vira uma interação presented dos sinais do cliente.
Cada span repete a conversa até ali, então cada mensagem ganha a chave de idempotência da posição dela na conversa: um histórico exportado de novo é deduplicado, em vez de duplicado. Os spans de um turno podem chegar em mais de uma exportação: a Niadra os funde no mesmo registro (uma exportação posterior acrescenta as chamadas e as exposições que faltavam e alarga o começo e o fim), e uma exportação que não acrescenta nada conta como duplicata. O SDK pode copiar niadra.turn.id e niadra.pack.hash do baggage do OpenTelemetry para os spans do turno, para eles chegarem a spans que o seu código nunca toca; o baggage viaja nos cabeçalhos de toda chamada de saída, inclusive a terceiros, então só esses dois valores podem ir nele, nunca um handle, uma exposição ou qualquer valor que nomeie uma pessoa.
Passos
1. Aponte um exportador para a Niadra
Acrescente um exportador OTLP/HTTP ao lado do que você já tem, em JSON ou em protobuf: os exportadores de Node.js e de Python servem como estão, direto para a Niadra ou por um OpenTelemetry Collector, quando você prefere manter um pipeline só para ela.2. Marque o canal e o cliente
Marque os atributos da Niadra no span que leva as mensagens, ou uma vez no recurso, para um processo que atende um canal só. Mantenhagen_ai.conversation.id estável durante a conversa inteira: ele vira o conversation_id.
3. Ligue a captura de conteúdo
A maioria das instrumentaçõesgen_ai deixa o conteúdo das mensagens de fora por padrão. A Niadra precisa dele para construir memória, então ligue a captura de conteúdo na instrumentação que você usa (em muitas instrumentações de Python, OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true). Se preferir manter o conteúdo fora dos seus outros destinos, rode um segundo pipeline só para a Niadra.
4. Confira se os eventos chegaram
Um span vira mensagens com as mesmas garantias de um lote: o conteúdo bruto é gravado antes da resposta e os eventos são ordenados pelo momento em que aconteceram. Confira na cobertura da fonte, na tela Sistemas do Console ou porGET /v1/sources/coverage, com uma pessoa do papel integration ou uma chave admin: o que chegou (received) e o que foi recusado (rejected), dia a dia.
Quando usar o SDK
O OpenTelemetry registra o que o modelo viu e disse. O SDK acrescenta o que os traces não levam: o contexto lido antes da resposta e ocontext_stamp de cada turno do agente, a verificação com verify(), a ligação entre handles com identify(), as ações de agente com closes, as transferências e o fim da conversa. É isso que alimenta a medição do aproveitamento do contexto. Um caminho comum é começar pelo OpenTelemetry para construir memória desde o primeiro dia e depois acrescentar context() e as escritas do SDK nos agentes que atendem o cliente.
Próximos passos
Eventos e o lote
o que é um evento e como ele é deduplicado.
Início rápido
ler o contexto com o SDK.
Receber traces OTLP
a referência do endpoint.
Webhooks dos seus sistemas
eventos de CRM, ERP e help desk.

