This is the only part that is an algorithm. Everything else on this page is a
census — what these fixtures were observed to carry, counted. This is computed per
span: each dialect counts the attributes only it would write, the highest total wins, and
the number stamped on the span as interlingua.dialect.confidence is
winner − runner-up. An integer margin, not a probability, because there is no
denominator to make one out of.
None of these is a spelling problem. Renaming
prompt_tokens to gen_ai.usage.input_tokens is the part that
looks like the work and is the part a lookup table can do. Every band above is the
other kind: no field means the conventions have no concept for it,
not merely no name for it; unstructured is a blob the schema cannot type;
flattened is structure that existed in the source and has no canonical form;
and ambiguous is one attribute that could have meant two different fields,
recorded rather than guessed at. Matching names is not matching meaning, and this
is where the difference is measured.
Lost to the vocabulary, not deleted. Under the default
originals: keep every attribute above is still on the span, under the
name its library gave it. What it lacks is a gen_ai.* name, so a query
written in the conventions’ vocabulary will not find it and one written in the
library’s will. originals: dedupe removes only exact copies a rename
already made redundant. Only originals: prune takes them off the span,
and that is a choice somebody has to make.
LiteLLM's 53 is not noise. It is an entire cost model — gen_ai.cost.input_cost,
output_cost, margin_percent, discount_amount — plus
every user_api_key_* field it records about who spent what. The conventions have no
home for any of it, which is a finding about the conventions rather than about LiteLLM.
A filled cell means that dialect's fixtures carried the field. A blank is silence, not a denial: the emitter may have had nothing to put there, or the fixture may not exercise it. Read a mark as evidence.
Both are defensible. Neither is correct. What is not defensible is making the choice silently — which is what a normalizer with a hardcoded attribute table does, and why the target here is a flag rather than a constant.