Which attributes should an agent emit on an LLM span?
A chat span has exactly two required attributes: gen_ai.operation.name and gen_ai.provider.name. Everything else scales down from there. gen_ai.request.model is conditionally required, only when it’s actually available, and most of the rest, token counts, max tokens, temperature, stop sequences, the response id and finish reasons, are recommended rather than required, so a compliant span can drop any of them and still validate. gen_ai.conversation.id is conditionally required too, but only when the instrumented framework has a real conversation id to hand over; nothing generates one as a fallback.
Content sits in a stricter tier on its own. gen_ai.input.messages, gen_ai.output.messages, gen_ai.system_instructions, and gen_ai.tool.definitions are opt-in rather than recommended, each carrying an explicit spec warning that it’s likely to hold PII. Token counts carry no such warning and ship as recommended by default, the same usage numbers Tessary’s cost_drift classifier attaches as evidence when a call site’s spend moves.