otlphttpexporter straight at the engine - no AgentX SDK needed:
Wire formats
Attribute conventions
Each incoming span becomes one trace row, withinput/output/model/token counts pulled
from whichever convention the instrumentation actually sends:
The framework label resolves from the signal itself:
gen_ai.provider.name, then gen_ai.system, then the instrumentation scope name, then
service.name, then the literal otel - so OTel traffic charts on Monitor’s Platforms chart
and filters in Live Traces without any extra attribute.
Monitor runs against every OTel-ingested span by default; set AGENTX_OTEL_MONITOR=false to
turn that off.
First-class citizenship
Four attributes make OTel traffic part of the full loop, not just rows in Live Traces:- Sessions - set
session.id,gen_ai.conversation.id, oragentx.session_idand traces group into conversations on the Sessions surface, with session judging applying exactly like SDK traffic. Without one, spans still group by OTel trace id. - Prompt identity - set
agentx.prompt_name(and optionallyagentx.version) and the whole Improve loop lights up: prompt-registry evidence gathering and version comparison treat the trace as if the SDK had tagged it. - Span kinds -
openinference.span.kind,gen_ai.operation.name,mlflow.spanType, andlangfuse.observation.typeare read (in that order) and stored as the span’s stated kind, so a span instrumented for OpenInference or the GenAI semconv arrives in the Execution Timeline already classified - LLM, tool, retrieval, guardrail - instead of being inferred from names. - Tool calls - a child span carrying
gen_ai.tool.name(or an MLflowTOOL-typed span) is folded up into its root interaction’stool_calls, withsuccess/errorderived from span status - so Tool quality, the built-in Tool-failure check, and Tool Schema evidence all work on OTel traffic. In-batch only: a parent exported in an earlier OTLP batch isn’t updated retroactively.
Verify it’s flowing
Send one span, then check Observe → Live Traces - OTel spans arrive with their full span tree (Timeline and Graph views) whenever the instrumentation emits parent/child links. OTel traffic is first-class downstream too: online judge scorers sample and score it, low verdicts raise Signals, and the traces carry judge scores in Live Traces - exactly like SDK-ingested traffic. The runnable proof ismonitor_ops/07_otel_ingest_scoring.py in the
sample-scripts repo: pure-OTel export, then the judge’s verdict and the raised Signal read back.

