Developer tools & API

Field inventory

Every attribute Telmoni reads from a span, at the pinned commit of the GenAI semantic conventions: where it is read, what becomes of it, and the content mode it needs. Anything else is dropped at the door.

Telmoni keeps metadata about an agent's runs and drops everything else at the door. This page is the whole list of what ingest reads from a span and from its resource, and what becomes of each: the column it fills, the attributes it is kept in under its own name, or the drop. Any text, or array, under a name this page does not list is dropped in every content mode, the span kept and the attribute named in the answer — content arrives under names no convention gave it, so what is kept is this list, not a guess at what is content.

The names are the GenAI semantic conventions' at commit 6fd0d763a092db245a54104fc1124031eb3c51d2, pinned on purpose: the conventions have tagged no release and rename what Telmoni sums, so a rename is a change to this page and to ingest, never to what is stored. What the conventions do not name — runs, tags, sample rates — is Telmoni's own, under telmoni.*; the user a span was for is user.id, from OpenTelemetry's general registry.

The list is held to the code: a test in the server fails when ingest reads a name this page lacks, or this page lists one ingest does not read. The console shows the same list on a project's Privacy page, served from the same code.

How to read it

  • On: the spans the attribute belongs on, where Telmoni's SDKs and the conventions put it — every span of a run, the run itself, a model call, a tool call, any span that carries it, or the resource every span of an export shares. Ingest reads it from whichever span carries it, a model's name or tokens on a step among them.
  • Kept as: the column of spans it fills, attributes under its own name, or what the drop does with it.
  • Needs: the project content mode it takes to keep it. Metadata is kept in every mode. Content would need on, or sealed for what Telmoni's SDK encrypted, but no project can be switched from off today, so content is dropped in every mode.
  • Rule: its cap or format. A span whose field breaks its rule is refused whole; an attribute past its cap is dropped and the span kept. The resource's attributes are copied onto every span of its export, so they keep at most 2 KiB together, keys and values; one past that is dropped without a word.

One thing on the wire is not an attribute: the instrumentation scope telmoni, under which a span the conventions give no operation is a step rather than a plain span.

Telmoni's own

AttributeOnKept asNeedsRule
telmoni.run_idevery spanthe column run_idanya UUID, the same on every span of a run; a span without it is refused
telmoni.agentevery spanthe column agent, and a run's name where gen_ai.agent.name and gen_ai.workflow.name are unsetany1 to 128 characters; a span without it is refused
user.idany spanthe column user_id, as its HMAC-SHA-256 under a key of the project's own, the first 16 bytes in hexany1 to 128 characters
telmoni.tag.<key>any spantags, under <key>anyup to 32 tags; a key up to 64 characters, a value up to 256
telmoni.sample_ratethe runthe column sample_rateanyabove 0, up to 1: the share of runs the SDK sends
telmoni.cancelledany spanthe column status, as cancelledanytrue on a span the agent cancelled
telmoni.contentany spanread and not kept: sealed would mark content the SDK encrypted, which no SDK does today and no project can keepanysealed

The coding-agent plugins set one tag of their own: skills on Claude Code's runs, the names of the skills the turn ran, joined by commas. It is kept as any tag is.

The conventions' fields

AttributeOnKept asNeedsRule
gen_ai.operation.nameevery spanthe column kindanyinvoke_agent or invoke_workflow is the run; chat, generate_content, text_completion or embeddings a model call; execute_tool a tool call; any other span a step under the telmoni scope, a plain span elsewhere
gen_ai.agent.namethe runthe column nameany1 to 145 characters
gen_ai.workflow.namethe runthe column name, where gen_ai.agent.name is unsetany1 to 145 characters
gen_ai.tool.namea tool callthe column nameany1 to 145 characters
error.typeany spanthe column error_typeany1 to 128 characters: the exception's class, never its message
gen_ai.response.modela model callthe column modelany1 to 128 characters, as the provider spells it
gen_ai.request.modela model callthe column model, where the response names noneany1 to 128 characters, as the provider spells it
gen_ai.provider.namea model callthe column providerany1 to 128 characters, as the conventions spell it: openai, anthropic, gcp.vertex_ai, aws.bedrock
gen_ai.usage.input_tokensa model callthe column input_tokensanya whole number, 0 or more: every input token, the cache's reads and writes among them
gen_ai.usage.output_tokensa model callthe column output_tokensanya whole number, 0 or more: every output token, reasoning among them
gen_ai.usage.cache_read.input_tokensa model callthe column cache_read_input_tokensanya whole number, 0 or more
gen_ai.usage.cache_write.input_tokensa model callthe column cache_write_input_tokensanya whole number, 0 or more
gen_ai.conversation.idany spanthe column session_idany1 to 200 characters, kept as sent
deployment.environment.namethe resourcethe column environment, on every span of the exportanyup to 128 characters, as sent: production, staging; longer, read as none
service.versionthe resourcethe column release, on every span of the exportanyup to 128 characters, as sent: a version or a commit; longer, read as none

The last two are the deployment a span was sent from, which Telmoni's SDKs set from their environment and release options, or TELMONI_ENVIRONMENT and TELMONI_RELEASE, and never from OTEL_RESOURCE_ATTRIBUTES; the trace list filters by both.

Names the conventions replaced

Exporters lag the conventions, so the names they replaced are read as the current ones.

AttributeOnKept asNeedsRule
gen_ai.systema model callread as gen_ai.provider.nameanya name the conventions replaced, read as the current one
gen_ai.usage.prompt_tokensa model callread as gen_ai.usage.input_tokensanya name the conventions replaced, read as the current one
gen_ai.usage.completion_tokensa model callread as gen_ai.usage.output_tokensanya name the conventions replaced, read as the current one
gen_ai.usage.cache_creation.input_tokensa model callread as gen_ai.usage.cache_write.input_tokensanya name the conventions replaced, read as the current one

Kept under their own names

Each of these is kept in attributes under its own name, whatever its value's type; a named array is kept as its JSON. A key is up to 128 characters and a value up to 1,024, and a span keeps up to 64 attributes, its resource's among them.

AttributeOnKept asNeedsRule
gen_ai.response.ida model callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.response.finish_reasonsa model callattributes, under its own nameanyan array, as its JSON
gen_ai.response.statusa model callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.request.reasoning.levela model callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.agent.versionthe runattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.tool.call.ida tool callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.tool.typea tool callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.output.typea model callattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.prompt.nameany spanattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.prompt.versionany spanattributes, under its own nameanya key up to 128 characters and a value up to 1,024
gen_ai.data_source.idany spanattributes, under its own nameanya key up to 128 characters and a value up to 1,024
server.addressany spanattributes, under its own nameanya key up to 128 characters and a value up to 1,024
service.namethe resourceattributes, under its own nameanya key up to 128 characters and a value up to 1,024
telemetry.sdk.*the resourceattributes, under its own nameanywhat the OpenTelemetry SDK says of itself: its name, language and version
telemetry.distro.*the resourceattributes, under its own nameanywhat the distribution says of itself: telmoni and its version, on everything Telmoni's SDKs send

Content

Content is what a person or a model wrote, and the people a span names. Each of these is dropped at the door in every content mode, the span kept and the field named in the answer, and nothing of it reaches a store: every project's mode is off, and none can be switched to another today.

AttributeOnKept asNeedsRule
gen_ai.input.messagesany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.output.messagesany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.system_instructionsany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.tool.definitionsany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.tool.call.argumentsany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.tool.call.resultany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.retrieval.query.textany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.retrieval.documentsany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.memory.query.textany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.memory.recordsany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
gen_ai.prompt.variableany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKcontent: what a person or a model wrote
user.emailany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKnames a person: content, whatever else the span carries
user.full_nameany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKnames a person: content, whatever else the span carries
user.nameany spandropped in every mode, the span kepton, or sealed from Telmoni's SDKnames a person: content, whatever else the span carries

Everything else

AttributeOnKept asNeedsRule
any other number or booleanany spanattributes, under its own name, except a name under telmoni., which is dropped as unlistedanya measurement no person writes; on the resource, dropped without a word
any other text or arrayany spandropped in every mode, the span kept and the attribute named in the answer as unlistedanycontent arrives under names no convention gave it; on the resource, dropped without a word
the span's events and status messageany spannever keptanywhere an exception writes its message and stack trace