genai:semantic-conventions

SkillMonitoring & ops

OpenTelemetry GenAI semantic conventions for agent instrumentation - the standard attributes for LLM observability

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the genai:semantic-conventions skill

What this skill tells your AI

The instructions your AI receives, as published by rossoctl/rossoctl in .claude/skills/genai:semantic-conventions/SKILL.md and read by ahel’s review.

Reference for instrumenting agents with OpenTelemetry GenAI semantic conventions.

Spec: https://opentelemetry.io/docs/specs/semconv/gen-ai/

Architecture

Agent (gen_ai.* only) → OTEL Collector → Transform → Phoenix (llm.*) + MLflow (mlflow.trace.*)

Agents emit only gen_ai.* attributes. The OTEL Collector transforms these to:

  • OpenInference format (llm.*) for Phoenix
  • MLflow metadata (mlflow.trace.*) for MLflow session tracking

Core Attributes

Request Attributes (on LLM call spans)

AttributeTypeDescriptionExample
gen_ai.systemstringGenAI provider/systemopenai, anthropic, langchain
gen_ai.request.modelstringModel requestedgpt-4, claude-3-opus
gen_ai.request.max_tokensintMax tokens to generate1024
gen_ai.request.temperaturefloatSampling temperature0.7
gen_ai.request.top_pfloatNucleus sampling0.9

Response Attributes

AttributeTypeDescriptionExample
gen_ai.response.modelstringModel that respondedgpt-4-0613
gen_ai.response.idstringResponse identifierchatcmpl-abc123
gen_ai.response.finish_reasonsstring[]Why generation stopped["stop"]
gen_ai.usage.input_tokensintPrompt tokens150
gen_ai.usage.output_tokensintCompletion tokens250

Conversation/Session Attributes

AttributeTypeDescriptionExample
gen_ai.conversation.idstringSession/conversation IDuuid-123-456
gen_ai.promptstringUser prompt (truncated)What is the weather?
gen_ai.completionstringResponse (truncated)The weather is sunny

Agent Attributes (custom, for A2A agents)

AttributeTypeDescriptionExample
gen_ai.agent.namestringAgent nameweather-assistant
gen_ai.agent.idstringAgent/task IDtask-uuid-789

Python Usage

Auto-instrumentation (Recommended)

# Install: pip install opentelemetry-instrumentation-openai
from opentelemetry.instrumentation.openai import OpenAIInstrumentor

# Instruments all OpenAI SDK calls automatically
OpenAIInstrumentor().instrument()

Manual Span Attributes

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span(
    "gen_ai.agent.invoke",
    attributes={
        "gen_ai.conversation.id": context_id,
        "gen_ai.agent.name": "my-agent",
        "gen_ai.system": "langchain",
        "gen_ai.request.model": "gpt-4",
        "gen_ai.prompt": user_input[:500],  # Truncate for size
    }
) as span:
    # Agent logic here
    result = await agent.run(user_input)

    # Add response attributes
    span.set_attribute("gen_ai.completion", str(result)[:500])

Adding to Existing Span

current_span = trace.get_current_span()
if current_span and current_span.is_recording():
    current_span.set_attribute("gen_ai.conversation.id", session_id)
    current_span.set_attribute("gen_ai.agent.name", "weather-assistant")

OTEL Collector Transforms

The collector transforms gen_ai.* to target formats:

GenAI → OpenInference (Phoenix)

GenAI AttributeOpenInference Attribute
gen_ai.request.modelllm.model_name
gen_ai.usage.input_tokensllm.token_count.prompt
gen_ai.usage.output_tokensllm.token_count.completion
gen_ai.systemllm.provider, llm.system

GenAI → MLflow

GenAI AttributeMLflow Metadata
gen_ai.conversation.idmlflow.trace.session (resource)
Span name gen_ai.agent.*mlflow.spanType=AGENT
Span with gen_ai.request.modelmlflow.spanType=LLM
Span name gen_ai.tool.*mlflow.spanType=TOOL

Span Naming Conventions

Use GenAI operation names for spans:

OperationSpan Name
Agent invocationgen_ai.agent.invoke
LLM chat completiongen_ai.chat
Tool callgen_ai.tool.{tool_name}
Embeddinggen_ai.embeddings

Best Practices

  1. Always set gen_ai.conversation.id for session tracking in MLflow
  2. Truncate prompts/completions to ~500 chars to avoid span size issues
  3. Use auto-instrumentation when available (OpenAI, Anthropic SDKs)
  4. Add manual attributes for custom agent spans
  5. Never emit OpenInference (llm.*) directly - let the collector transform

Dependencies

# pyproject.toml
dependencies = [
    "opentelemetry-sdk",
    "opentelemetry-exporter-otlp",
    "opentelemetry-instrumentation-openai>=0.34b0",  # For OpenAI auto-instrumentation
]

Related Skills

Signals

GitHub stars
300
Forks
107
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
genai-semantic-conventions
Source
github.com/rossoctl/rossoctl