GenAI 领域模型 — 约定了哪些字段
本章是「字典内容」本身:做 LLM/agent 可观测时你最常查的字段都在这。每节先说这字段回答什么问题,再给真实定义位置和坑。所有引用都在
model/gen-ai/deprecated/与model/{mcp,openai}/deprecated/(此 commit 下它们带deprecated标记,但定义内容就是约定本身,见第 4 章)。
字段定义 vs 信号组,两个文件: 单个字段(provider.name、token、messages、tool.* 等)的定义都在
registry-deprecated.yaml;span 组(span.gen_ai.*、必填级别、span 名 note)在spans-deprecated.yaml。本章引用按此区分。
2.1 两个判别器:provider.name 与 operation.name
整套 GenAI 约定围着两个字段转,先吃透它们。
gen_ai.provider.name —— 「这是哪家的遥测格式」。 它是枚举,值含 openai / anthropic / aws.bedrock / gcp.gemini / azure.ai.openai / mistral_ai / deepseek 等(model/gen-ai/deprecated/registry-deprecated.yaml:274-351,gen_ai.provider.name)。
关键不是「谁造的模型」,而是**「遥测长成谁家的样子」**。定义里的 note 把这点说死了:
它是一个判别器,标识该 provider 在 GenAI 约定里的遥测格式 flavor;AWS Bedrock 的 span 应设
aws.bedrock并带aws.bedrock.*,不应带openai.*(registry-deprecated.yaml:366-373)。
所以一个用 OpenAI 兼容 API 代理的服务,provider.name 取决于它模仿谁的格式,而非真实模型来源。
gen_ai.operation.name —— 「这是哪种操作」。 它的枚举值直接对应不同的 span 类型(成员定义在 registry-deprecated.yaml:914 起):
| 值 | 含义 | 对应 span |
|---|---|---|
chat | 聊天补全 | span.gen_ai.inference.client |
text_completion | 旧式文本补全 | 同上 |
generate_content | 多模态生成(Gemini) | 同上 |
embeddings | 向量化 | span.gen_ai.embeddings.client |
retrieval | 检索 | span.gen_ai.retrieval.client |
create_agent | 创建 agent | span.gen_ai.create_agent.client |
invoke_agent | 调用 agent | span.gen_ai.invoke_agent.{client,internal} |
execute_tool | 执行工具 | span.gen_ai.execute_tool.internal |
invoke_workflow | 编排多 agent | span.gen_ai.invoke_workflow.internal |
span 名约定几乎都是 {operation.name} {request.model}(如 span.gen_ai.inference.client 的 note,spans-deprecated.yaml:150-152),agent/tool span 则用 {operation} {agent.name|tool.name}。
2.2 Token 用量:四个细分,不是一个数
「这次花了多少 token」在约定里不是一个字段,而是一组,因为缓存和推理改变了成本结构(以下字段定义均在 registry-deprecated.yaml):
| 字段 | 含义 |
|---|---|
gen_ai.usage.input_tokens | 输入总数,含缓存命中的 token(registry-deprecated.yaml:577-593) |
gen_ai.usage.output_tokens | 输出总数(:622-633) |
gen_ai.usage.cache_read.input_tokens | 从 provider 缓存读到的(应包含在 input 内,:594-607) |
gen_ai.usage.cache_creation.input_tokens | 写入 provider 缓存的(:608-621) |
gen_ai.usage.reasoning.output_tokens | 用于推理/思维链的 输出(应包含在 output 内,:634-647) |
最容易踩的坑——provider 口径不一致。 Anthropic 的 input_tokens 不含缓存 token,所以约定明文要求 instrumentation 自己加回去:
gen_ai.usage.input_tokens = input_tokens
+ cache_read_input_tokens
+ cache_creation_input_tokens
这条规则写在 span.anthropic.inference.client 的 note 里(model/gen-ai/deprecated/spans-deprecated.yaml:690-701)。OpenAI 则相反——它的 usage.input_tokens 已含缓存,缓存数另从 input_tokens_details.cached_tokens 取(spans-deprecated.yaml:235-240)。同一个语义字段,各家映射规则不同,这正是约定要统一口径的价值。
聚合侧还有专门的 metric gen_ai.client.token.usage(histogram,单位 {token}),用 gen_ai.token.type(input/output)区分两类(metrics-deprecated.yaml:54-73)。