# 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](/answers/tessary-cost-drift/what-is-tessarys-cost-drift-classifier) attaches as evidence when a call site's spend moves.

---

Sources:
- OpenTelemetry semantic-conventions-genai: gen-ai span definitions (registry): https://github.com/open-telemetry/semantic-conventions-genai/blob/main/model/gen-ai/spans.yaml (fetched 2026-09-18)

Source: https://tessary.ai/answers/otel-genai-conventions/which-attributes-should-an-agent-emit-on-an-llm-span
More on Otel genai conventions: https://tessary.ai/answers/otel-genai-conventions
From Tessary, agent reliability for AI agents in production: https://tessary.ai
