What are the OpenTelemetry GenAI semantic conventions?
They’re a shared vocabulary for describing an LLM call, a tool call, or an agent step as a span, so a trace from one framework means the same thing as a trace from another and a backend can read both without a per-framework adapter. Each span carries gen_ai.operation.name, one of a fixed set of values like chat, embeddings, execute_tool, and invoke_agent, plus the provider and model name and token counts for an LLM call, or the tool’s name and call id for a tool call. Grouping related spans into one conversation uses gen_ai.conversation.id, populated only when the framework actually has one to give, never a generated fallback.
None of it is stable yet. Every GenAI span, metric, and attribute still carries OpenTelemetry’s “development” marker, and a name has already changed once: gen_ai.system became gen_ai.provider.name. Anything reading these fields today has to tolerate that churn rather than assume today’s names survive the next revision.