Skip to main content

Normalization Rules

Beacon normalizes OTLP attributes and hook payloads into the same endpoint contract. The collector exporter looks for common runtime fields, while hook telemetry builds those fields directly from hook payloads.

Source mapping

Source signalNormalized field or action
gen_ai.request.model, gen_ai.response.model, model, ai.modelmodel
gen_ai.tool.name, tool.name, function_name, tool_nametool.name and gen_ai.tool.name
gen_ai.tool.call.arguments, function_args, argumentstool.command when command-like, plus gen_ai.tool.call.arguments
gen_ai.tool.call.id, gen_ai.tool.call.resultgen_ai.tool.call.id, gen_ai.tool.call.result
mcp.tool.namemcp.tool
process.command_linecommand.command
file.pathfile.path
conversation.idsession.id
gen_ai.conversation.idgen_ai.conversation.id
vcs.repository.urlrepository
git.branchbranch
beacon.originorigin
beacon.run.*run.*
Prompt-like eventsprompt.submitted
Shell or exec eventscommand.executed
MCP eventsmcp.tool_invoked
File, write, or edit eventsfile.modified
Approval eventsapproval.requested
Other tool activitytool.invoked

OpenTelemetry GenAI fields

Beacon preserves OpenTelemetry GenAI semantic convention fields under the nested gen_ai object and also projects selected fields into Beacon’s common investigation fields. This keeps the raw GenAI context available without forcing downstream rules to parse runtime-specific attribute names.
Source signalNormalized field
gen_ai.agent.description, gen_ai.agent.id, gen_ai.agent.name, gen_ai.agent.versiongen_ai.agent.*
gen_ai.data_source.idgen_ai.data_source.id
gen_ai.embeddings.dimension.countgen_ai.embeddings.dimension_count
gen_ai.evaluation.name, gen_ai.evaluation.explanation, gen_ai.evaluation.score.label, gen_ai.evaluation.score.valuegen_ai.evaluation.*
gen_ai.input.messages, legacy gen_ai.prompt.*, llm.prompts, gen_ai.promptsgen_ai.input.messages
gen_ai.output.messages, legacy gen_ai.completion.*, llm.completions, gen_ai.completionsgen_ai.output.messages
gen_ai.output.typegen_ai.output.type
gen_ai.operation.namegen_ai.operation.name
gen_ai.prompt.namegen_ai.prompt.name
gen_ai.provider.name, gen_ai.systemgen_ai.provider.name
gen_ai.system_instructionsgen_ai.system_instructions
gen_ai.retrieval.query.text, gen_ai.retrieval.documentsgen_ai.retrieval.*
gen_ai.token.typegen_ai.token.type
gen_ai.workflow.namegen_ai.workflow.name

Request and response metadata

Source signalNormalized field
gen_ai.request.model, llm.request.modelgen_ai.request.model
gen_ai.request.choice.countgen_ai.request.choice_count
gen_ai.request.encoding_formatsgen_ai.request.encoding_formats
gen_ai.request.frequency_penaltygen_ai.request.frequency_penalty
gen_ai.request.max_tokens, llm.request.max_tokensgen_ai.request.max_tokens
gen_ai.request.presence_penaltygen_ai.request.presence_penalty
gen_ai.request.seedgen_ai.request.seed
gen_ai.request.stop_sequencesgen_ai.request.stop_sequences
gen_ai.request.streamgen_ai.request.stream
gen_ai.request.temperature, llm.request.temperaturegen_ai.request.temperature
gen_ai.request.top_k, gen_ai.request.top_pgen_ai.request.top_k, gen_ai.request.top_p
gen_ai.response.id, gen_ai.response.model, llm.response.modelgen_ai.response.id, gen_ai.response.model
gen_ai.response.finish_reasonsgen_ai.response.finish_reasons
gen_ai.response.time_to_first_chunkgen_ai.response.time_to_first_chunk

Usage metadata

Source signalNormalized field
gen_ai.usage.input_tokens, llm.usage.prompt_tokens, gen_ai.usage.prompt_tokensgen_ai.usage.input_tokens
gen_ai.usage.output_tokens, llm.usage.completion_tokens, gen_ai.usage.completion_tokensgen_ai.usage.output_tokens
gen_ai.usage.cache_creation.input_tokensgen_ai.usage.cache_creation.input_tokens
gen_ai.usage.cache_read.input_tokensgen_ai.usage.cache_read.input_tokens
gen_ai.usage.reasoning.output_tokensgen_ai.usage.reasoning.output_tokens

Prompt and content handling

Prompt text can come from gen_ai.prompt, prompt, user_prompt, input.prompt, copilot_chat.user_request, or the first meaningful text value in gen_ai.input.messages. Empty input message arrays do not create prompt events by themselves. Beacon accepts empty content.retention values for compatibility with older records. Truncation can be represented by top-level field_truncated and, for event-specific content state, content.truncated.

Category inference

When a runtime omits event.category, Beacon infers it from event.action:
Action patternInferred category
prompt.*prompt
command.*command
file.*file
mcp.*mcp
approval.* or policy.*approval
metric.*metric
tool.*tool

Endpoint event schema

Return to the schema overview.

Schema fields

Review entities, optional context, and shared top-level fields.

Telemetry pipeline

See where normalization fits in the local telemetry flow.