Semantic Conventions
Mantis SDK provides semantic conventions for consistent attribute naming across traces.
Overview
Semantic conventions are standardized attribute names that ensure consistent data across your traces. Use tracing.semconv to access all available conventions.
import mantisdk.tracing as tracing
with tracing.trace("workflow", input=query) as span:
span.set_attribute(tracing.semconv.USER_ID, "user-123")
span.set_attribute(tracing.semconv.SESSION_ID, "session-456")
span.set_attribute(tracing.semconv.TRACE_OUTPUT, result)Constants are organized by namespace:
| Namespace | Prefix | Purpose |
|---|---|---|
| Insight | insight.* | Primary attributes for the Insight UI |
| Langfuse compat | langfuse.* | Compatibility with Langfuse SDK spans |
| GenAI | gen_ai.* | OpenTelemetry GenAI semantic conventions |
| OpenInference | openinference.*, llm.*, input.*, output.*, tool.* | Arize OpenInference conventions |
| MantisDK | mantis.* | Custom attributes added by MantisDK |
| Claude | claude.* | Claude Agent SDK-specific attributes |
For most use cases, the Insight namespace is all you need. The other namespaces are populated automatically by auto-instrumentation or are useful when integrating with third-party tooling.
Insight Namespace
Trace-Level Attributes
For root spans (traces):
| Constant | Value | Description |
|---|---|---|
TRACE_NAME | insight.trace.name | Name of the trace |
TRACE_INPUT | insight.trace.input | Input to the trace |
TRACE_OUTPUT | insight.trace.output | Output from the trace |
TRACE_METADATA | insight.trace.metadata | Additional metadata (JSON) |
TRACE_TAGS | insight.trace.tags | Tags for filtering |
TRACE_PUBLIC | insight.trace.public | Whether trace is public |
with tracing.trace("my-workflow", input=query) as span:
# These are for root traces
span.set_attribute(tracing.semconv.TRACE_INPUT, query)
span.set_attribute(tracing.semconv.TRACE_OUTPUT, result)
span.set_attribute(tracing.semconv.TRACE_METADATA, '{"source": "api"}')
span.set_attribute(tracing.semconv.TRACE_TAGS, '["production", "v2"]')User & Session
For tracking users and sessions:
| Constant | Value | Description |
|---|---|---|
USER_ID | insight.user.id | Unique user identifier |
SESSION_ID | insight.session.id | Session identifier |
with tracing.trace("workflow") as span:
span.set_attribute(tracing.semconv.USER_ID, "user-123")
span.set_attribute(tracing.semconv.SESSION_ID, "session-456")Run Tracking
For linking traces to Mantis Runs (experiments):
| Constant | Value | Description |
|---|---|---|
RUN_ID | insight.run.id | Run/experiment identifier |
RUN_NAME | insight.run.name | Run name |
These attributes are automatically set when traces are created within a mantisdk.run context:
from mantisdk import run
with run("my-experiment") as r:
# All traces created here automatically have RUN_ID set
with tracing.trace("workflow") as span:
# RUN_ID is injected automatically
passEnvironment & Version
For deployment context:
| Constant | Value | Description |
|---|---|---|
ENVIRONMENT | insight.environment | Deployment environment |
RELEASE | insight.release | Release identifier |
VERSION | insight.version | Version string |
tracing.init()
with tracing.trace("workflow") as span:
span.set_attribute(tracing.semconv.ENVIRONMENT, "production")
span.set_attribute(tracing.semconv.RELEASE, "v1.2.3")
span.set_attribute(tracing.semconv.VERSION, "1.2.3")Observation-Level Attributes
For child spans (observations):
| Constant | Value | Description |
|---|---|---|
OBSERVATION_TYPE | insight.observation.type | Type of observation |
OBSERVATION_INPUT | insight.observation.input | Input to the operation |
OBSERVATION_OUTPUT | insight.observation.output | Output from the operation |
OBSERVATION_METADATA | insight.observation.metadata | Additional metadata |
OBSERVATION_LEVEL | insight.observation.level | Log level |
OBSERVATION_STATUS_MESSAGE | insight.observation.status_message | Status message |
with tracing.span("process_data", input=data) as span:
result = process(data)
span.set_attribute(tracing.semconv.OBSERVATION_OUTPUT, str(result))
span.set_attribute(tracing.semconv.OBSERVATION_METADATA, '{"items": 5}')Model & Generation
For LLM-specific attributes:
| Constant | Value | Description |
|---|---|---|
MODEL_NAME | insight.observation.model.name | Model identifier |
MODEL_PARAMETERS | insight.observation.model.parameters | Model parameters (JSON) |
with tracing.span("llm_call") as span:
span.set_attribute(tracing.semconv.MODEL_NAME, "gpt-4o-mini")
span.set_attribute(tracing.semconv.MODEL_PARAMETERS, '{"temperature": 0.7}')Observation Types
Use ObservationType for the OBSERVATION_TYPE attribute:
from mantisdk.tracing.semconv import ObservationType
with tracing.span("my_span") as span:
span.set_attribute(
tracing.semconv.OBSERVATION_TYPE,
ObservationType.SPAN # or "span"
)
# Available types:
# ObservationType.SPAN = "span"
# ObservationType.GENERATION = "generation"
# ObservationType.EVENT = "event"Observation Levels
Use ObservationLevel for log-level-like severity:
from mantisdk.tracing.semconv import ObservationLevel
with tracing.span("warning_case") as span:
span.set_attribute(
tracing.semconv.OBSERVATION_LEVEL,
ObservationLevel.WARNING # or "WARNING"
)
# Available levels:
# ObservationLevel.DEBUG = "DEBUG"
# ObservationLevel.DEFAULT = "DEFAULT"
# ObservationLevel.WARNING = "WARNING"
# ObservationLevel.ERROR = "ERROR"Langfuse Compatibility
These constants let you emit attributes that Langfuse SDK consumers already expect. If you are migrating from the Langfuse Python SDK, or need traces that are readable by both Insight and Langfuse, use these alongside (or instead of) the Insight equivalents.
Trace Attributes
| Constant | Value | Description |
|---|---|---|
LANGFUSE_TRACE_NAME | langfuse.trace.name | Trace name |
LANGFUSE_TRACE_USER_ID | user.id | User identifier |
LANGFUSE_TRACE_SESSION_ID | session.id | Session identifier |
LANGFUSE_TRACE_TAGS | langfuse.trace.tags | Tags for filtering |
LANGFUSE_TRACE_PUBLIC | langfuse.trace.public | Whether trace is public |
LANGFUSE_TRACE_METADATA | langfuse.trace.metadata | Additional metadata |
LANGFUSE_TRACE_INPUT | langfuse.trace.input | Trace input |
LANGFUSE_TRACE_OUTPUT | langfuse.trace.output | Trace output |
Observation Attributes
| Constant | Value | Description |
|---|---|---|
LANGFUSE_OBSERVATION_TYPE | langfuse.observation.type | Observation type |
LANGFUSE_OBSERVATION_METADATA | langfuse.observation.metadata | Observation metadata |
LANGFUSE_OBSERVATION_LEVEL | langfuse.observation.level | Observation log level |
LANGFUSE_OBSERVATION_STATUS_MESSAGE | langfuse.observation.status_message | Status message |
LANGFUSE_OBSERVATION_INPUT | langfuse.observation.input | Observation input |
LANGFUSE_OBSERVATION_OUTPUT | langfuse.observation.output | Observation output |
Generation Attributes
| Constant | Value | Description |
|---|---|---|
LANGFUSE_OBSERVATION_COMPLETION_START_TIME | langfuse.observation.completion_start_time | Time-to-first-token |
LANGFUSE_OBSERVATION_MODEL | langfuse.observation.model.name | Model name |
LANGFUSE_OBSERVATION_MODEL_PARAMETERS | langfuse.observation.model.parameters | Model parameters |
LANGFUSE_OBSERVATION_USAGE_DETAILS | langfuse.observation.usage_details | Token usage details |
LANGFUSE_OBSERVATION_COST_DETAILS | langfuse.observation.cost_details | Cost details |
LANGFUSE_OBSERVATION_PROMPT_NAME | langfuse.observation.prompt.name | Prompt template name |
LANGFUSE_OBSERVATION_PROMPT_VERSION | langfuse.observation.prompt.version | Prompt template version |
Environment
| Constant | Value | Description |
|---|---|---|
LANGFUSE_ENVIRONMENT | langfuse.environment | Deployment environment |
LANGFUSE_RELEASE | langfuse.release | Release identifier |
LANGFUSE_VERSION | langfuse.version | Version string |
OpenTelemetry GenAI
Standard OpenTelemetry GenAI semantic conventions (opens in a new tab). These are set automatically by OpenTelemetry-based instrumentors and can be read by any OTel-compatible backend.
Request & Response
| Constant | Value | Description |
|---|---|---|
GEN_AI_OPERATION_NAME | gen_ai.operation.name | Operation name (e.g. "chat") |
GEN_AI_SYSTEM | gen_ai.system | AI system (e.g. "openai") |
GEN_AI_REQUEST_MODEL | gen_ai.request.model | Requested model name |
GEN_AI_RESPONSE_MODEL | gen_ai.response.model | Model that actually responded |
GEN_AI_REQUEST_TEMPERATURE | gen_ai.request.temperature | Sampling temperature |
GEN_AI_REQUEST_MAX_TOKENS | gen_ai.request.max_tokens | Maximum tokens requested |
GEN_AI_RESPONSE_FINISH_REASONS | gen_ai.response.finish_reasons | Why the model stopped |
GEN_AI_CONVERSATION_ID | gen_ai.conversation.id | Conversation identifier |
Messages
| Constant | Value | Description |
|---|---|---|
GEN_AI_INPUT_MESSAGES | gen_ai.input.messages | Input messages (JSON) |
GEN_AI_OUTPUT_MESSAGES | gen_ai.output.messages | Output messages (JSON) |
Usage
| Constant | Value | Description |
|---|---|---|
GEN_AI_USAGE_INPUT_TOKENS | gen_ai.usage.input_tokens | Input token count |
GEN_AI_USAGE_OUTPUT_TOKENS | gen_ai.usage.output_tokens | Output token count |
GEN_AI_USAGE_COST | gen_ai.usage.cost | Estimated cost |
Tool Attributes
| Constant | Value | Description |
|---|---|---|
GEN_AI_TOOL_NAME | gen_ai.tool.name | Tool name |
GEN_AI_TOOL_CALL_ARGUMENTS | gen_ai.tool.call.arguments | Tool call arguments (JSON) |
GEN_AI_TOOL_CALL_RESULT | gen_ai.tool.call.result | Tool call result |
OpenInference
OpenInference (opens in a new tab) conventions from Arize AI. These are populated by OpenInference instrumentors (e.g. openinference-instrumentation-openai).
Span Kind
| Constant | Value | Description |
|---|---|---|
OPENINFERENCE_SPAN_KIND | openinference.span.kind | Kind of span (see values below) |
Span kind values are available as top-level constants:
| Constant | Value |
|---|---|
SPAN_KIND_LLM | LLM |
SPAN_KIND_TOOL | TOOL |
SPAN_KIND_AGENT | AGENT |
SPAN_KIND_CHAIN | CHAIN |
SPAN_KIND_EMBEDDING | EMBEDDING |
SPAN_KIND_RETRIEVER | RETRIEVER |
SPAN_KIND_RERANKER | RERANKER |
SPAN_KIND_GUARDRAIL | GUARDRAIL |
SPAN_KIND_EVALUATOR | EVALUATOR |
from mantisdk.tracing import semconv
span.set_attribute(semconv.OPENINFERENCE_SPAN_KIND, semconv.SPAN_KIND_AGENT)LLM Attributes
| Constant | Value | Description |
|---|---|---|
LLM_MODEL_NAME | llm.model_name | Model name |
LLM_INVOCATION_PARAMETERS | llm.invocation_parameters | Parameters as JSON |
LLM_INPUT_MESSAGES | llm.input_messages | Input messages |
LLM_OUTPUT_MESSAGES | llm.output_messages | Output messages |
LLM_TOKEN_COUNT_PROMPT | llm.token_count.prompt | Prompt token count |
LLM_TOKEN_COUNT_COMPLETION | llm.token_count.completion | Completion token count |
LLM_TOKEN_COUNT_TOTAL | llm.token_count.total | Total token count |
LLM_SYSTEM | llm.system | LLM provider system |
LLM_PROVIDER | llm.provider | LLM provider name |
Input / Output
| Constant | Value | Description |
|---|---|---|
INPUT_VALUE | input.value | General input value |
OUTPUT_VALUE | output.value | General output value |
INPUT_MIME_TYPE | input.mime_type | MIME type of the input |
OUTPUT_MIME_TYPE | output.mime_type | MIME type of the output |
MIME type constants for convenience:
| Constant | Value |
|---|---|
MIME_TYPE_TEXT | text/plain |
MIME_TYPE_JSON | application/json |
Tool Attributes
| Constant | Value | Description |
|---|---|---|
TOOL_NAME | tool.name | Tool name |
TOOL_DESCRIPTION | tool.description | Tool description |
TOOL_PARAMETERS | tool.parameters | Tool parameters (JSON) |
MantisDK Custom
Attributes specific to MantisDK. These are set automatically by SDK instrumentation and capture data not covered by the standard namespaces.
| Constant | Value | Description |
|---|---|---|
MANTIS_LLM_THINKING | mantis.llm.thinking | Model thinking/reasoning content |
MANTIS_LLM_COST_USD | mantis.llm.cost_usd | LLM call cost in USD |
MANTIS_DURATION_MS | mantis.duration_ms | Total duration in milliseconds |
MANTIS_DURATION_API_MS | mantis.duration_api_ms | API call duration in milliseconds |
MANTIS_NUM_TURNS | mantis.num_turns | Number of conversational turns |
MANTIS_TOOL_IS_ERROR | mantis.tool.is_error | Whether a tool call errored |
from mantisdk.tracing import semconv
with tracing.span("llm_call") as span:
span.set_attribute(semconv.MANTIS_LLM_COST_USD, 0.0032)
span.set_attribute(semconv.MANTIS_DURATION_API_MS, 1250)Claude-Specific
Attributes for traces produced by the Claude Agent SDK. These are populated automatically when using Claude as the underlying model.
| Constant | Value | Description |
|---|---|---|
CLAUDE_API_ERROR | claude.api_error | API error from Claude |
CLAUDE_PARENT_TOOL_USE_ID | claude.parent_tool_use_id | Parent tool-use ID |
CLAUDE_STRUCTURED_OUTPUT | claude.structured_output | Structured output content |
CLAUDE_THINKING_SIGNATURE | claude.thinking.signature | Thinking block signature |
CLAUDE_MESSAGE_UUID | claude.message.uuid | Message UUID |
CLAUDE_SYSTEM_SUBTYPE | claude.system.subtype | System message subtype |
CLAUDE_SYSTEM_DATA | claude.system.data | System message data |
Complete Example
import mantisdk.tracing as tracing
from mantisdk.tracing.semconv import ObservationType, ObservationLevel
def agent_workflow(user_id: str, session_id: str, query: str):
with tracing.trace("agent_session", input=query) as root:
# User & session context
root.set_attribute(tracing.semconv.USER_ID, user_id)
root.set_attribute(tracing.semconv.SESSION_ID, session_id)
# Environment context
root.set_attribute(tracing.semconv.ENVIRONMENT, "production")
root.set_attribute(tracing.semconv.VERSION, "1.0.0")
# Child operation with observation attributes
with tracing.span("llm_generation") as gen_span:
gen_span.set_attribute(
tracing.semconv.OBSERVATION_TYPE,
ObservationType.GENERATION
)
gen_span.set_attribute(tracing.semconv.MODEL_NAME, "gpt-4o-mini")
gen_span.set_attribute(
tracing.semconv.MODEL_PARAMETERS,
'{"temperature": 0.7, "max_tokens": 1000}'
)
result = call_llm(query)
gen_span.set_attribute(
tracing.semconv.OBSERVATION_OUTPUT,
result
)
# Set trace output
root.set_attribute(tracing.semconv.TRACE_OUTPUT, result)
return resultAll Constants Reference
from mantisdk.tracing import semconv
# --- Insight namespace ---
# Trace-level
semconv.TRACE_NAME
semconv.TRACE_INPUT
semconv.TRACE_OUTPUT
semconv.TRACE_METADATA
semconv.TRACE_TAGS
semconv.TRACE_PUBLIC
# User & Session
semconv.USER_ID
semconv.SESSION_ID
# Run Tracking
semconv.RUN_ID
semconv.RUN_NAME
# Environment
semconv.ENVIRONMENT
semconv.RELEASE
semconv.VERSION
# Observation-level
semconv.OBSERVATION_TYPE
semconv.OBSERVATION_INPUT
semconv.OBSERVATION_OUTPUT
semconv.OBSERVATION_METADATA
semconv.OBSERVATION_LEVEL
semconv.OBSERVATION_STATUS_MESSAGE
# Model
semconv.MODEL_NAME
semconv.MODEL_PARAMETERS
# --- Langfuse compat namespace ---
semconv.LANGFUSE_TRACE_NAME
semconv.LANGFUSE_TRACE_USER_ID
semconv.LANGFUSE_TRACE_SESSION_ID
semconv.LANGFUSE_TRACE_TAGS
semconv.LANGFUSE_TRACE_PUBLIC
semconv.LANGFUSE_TRACE_METADATA
semconv.LANGFUSE_TRACE_INPUT
semconv.LANGFUSE_TRACE_OUTPUT
semconv.LANGFUSE_OBSERVATION_TYPE
semconv.LANGFUSE_OBSERVATION_METADATA
semconv.LANGFUSE_OBSERVATION_LEVEL
semconv.LANGFUSE_OBSERVATION_STATUS_MESSAGE
semconv.LANGFUSE_OBSERVATION_INPUT
semconv.LANGFUSE_OBSERVATION_OUTPUT
semconv.LANGFUSE_OBSERVATION_COMPLETION_START_TIME
semconv.LANGFUSE_OBSERVATION_MODEL
semconv.LANGFUSE_OBSERVATION_MODEL_PARAMETERS
semconv.LANGFUSE_OBSERVATION_USAGE_DETAILS
semconv.LANGFUSE_OBSERVATION_COST_DETAILS
semconv.LANGFUSE_OBSERVATION_PROMPT_NAME
semconv.LANGFUSE_OBSERVATION_PROMPT_VERSION
semconv.LANGFUSE_ENVIRONMENT
semconv.LANGFUSE_RELEASE
semconv.LANGFUSE_VERSION
# --- GenAI namespace ---
semconv.GEN_AI_OPERATION_NAME
semconv.GEN_AI_SYSTEM
semconv.GEN_AI_REQUEST_MODEL
semconv.GEN_AI_RESPONSE_MODEL
semconv.GEN_AI_REQUEST_TEMPERATURE
semconv.GEN_AI_REQUEST_MAX_TOKENS
semconv.GEN_AI_RESPONSE_FINISH_REASONS
semconv.GEN_AI_CONVERSATION_ID
semconv.GEN_AI_INPUT_MESSAGES
semconv.GEN_AI_OUTPUT_MESSAGES
semconv.GEN_AI_USAGE_INPUT_TOKENS
semconv.GEN_AI_USAGE_OUTPUT_TOKENS
semconv.GEN_AI_USAGE_COST
semconv.GEN_AI_TOOL_NAME
semconv.GEN_AI_TOOL_CALL_ARGUMENTS
semconv.GEN_AI_TOOL_CALL_RESULT
# --- OpenInference namespace ---
semconv.OPENINFERENCE_SPAN_KIND
semconv.LLM_MODEL_NAME
semconv.LLM_INVOCATION_PARAMETERS
semconv.LLM_INPUT_MESSAGES
semconv.LLM_OUTPUT_MESSAGES
semconv.LLM_TOKEN_COUNT_PROMPT
semconv.LLM_TOKEN_COUNT_COMPLETION
semconv.LLM_TOKEN_COUNT_TOTAL
semconv.LLM_SYSTEM
semconv.LLM_PROVIDER
semconv.INPUT_VALUE
semconv.OUTPUT_VALUE
semconv.INPUT_MIME_TYPE
semconv.OUTPUT_MIME_TYPE
semconv.TOOL_NAME
semconv.TOOL_DESCRIPTION
semconv.TOOL_PARAMETERS
# Span kind values
semconv.SPAN_KIND_LLM
semconv.SPAN_KIND_TOOL
semconv.SPAN_KIND_AGENT
semconv.SPAN_KIND_CHAIN
semconv.SPAN_KIND_EMBEDDING
semconv.SPAN_KIND_RETRIEVER
semconv.SPAN_KIND_RERANKER
semconv.SPAN_KIND_GUARDRAIL
semconv.SPAN_KIND_EVALUATOR
# MIME types
semconv.MIME_TYPE_TEXT
semconv.MIME_TYPE_JSON
# --- MantisDK namespace ---
semconv.MANTIS_LLM_THINKING
semconv.MANTIS_LLM_COST_USD
semconv.MANTIS_DURATION_MS
semconv.MANTIS_DURATION_API_MS
semconv.MANTIS_NUM_TURNS
semconv.MANTIS_TOOL_IS_ERROR
# --- Claude namespace ---
semconv.CLAUDE_API_ERROR
semconv.CLAUDE_PARENT_TOOL_USE_ID
semconv.CLAUDE_STRUCTURED_OUTPUT
semconv.CLAUDE_THINKING_SIGNATURE
semconv.CLAUDE_MESSAGE_UUID
semconv.CLAUDE_SYSTEM_SUBTYPE
semconv.CLAUDE_SYSTEM_DATA
# --- Classes ---
# from mantisdk.tracing.semconv import ObservationType
# ObservationType.SPAN, ObservationType.GENERATION, ObservationType.EVENT
# from mantisdk.tracing.semconv import ObservationLevel
# ObservationLevel.DEBUG, ObservationLevel.DEFAULT,
# ObservationLevel.WARNING, ObservationLevel.ERRORNext Steps
- Traces & Spans - Creating spans
- Insight Export - View traces in Insight UI