





















@@ -177,6 +177,21 @@ function genAiOperationName(
177177return "chat";
178178}
179179180+function positiveFiniteNumber(value: number | undefined): number | undefined {
181+return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
182+}
183+184+function assignPositiveNumberAttr(
185+attrs: Record<string, string | number>,
186+key: string,
187+value: number | undefined,
188+): void {
189+const normalized = positiveFiniteNumber(value);
190+if (normalized !== undefined) {
191+attrs[key] = normalized;
192+}
193+}
194+180195function assignGenAiModelCallAttrs(
181196attrs: Record<string, string | number | boolean>,
182197evt: ModelCallLifecycleDiagnosticEvent,
@@ -933,6 +948,9 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
933948if (!tracesEnabled) {
934949return;
935950}
951+const genAiInputTokens =
952+usage.promptTokens ??
953+(usage.input ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
936954const spanAttrs: Record<string, string | number> = {
937955 ...attrs,
938956"openclaw.tokens.input": usage.input ?? 0,
@@ -941,6 +959,18 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
941959"openclaw.tokens.cache_write": usage.cacheWrite ?? 0,
942960"openclaw.tokens.total": usage.total ?? 0,
943961};
962+assignPositiveNumberAttr(spanAttrs, "gen_ai.usage.input_tokens", genAiInputTokens);
963+assignPositiveNumberAttr(spanAttrs, "gen_ai.usage.output_tokens", usage.output);
964+assignPositiveNumberAttr(
965+spanAttrs,
966+"gen_ai.usage.cache_read.input_tokens",
967+usage.cacheRead,
968+);
969+assignPositiveNumberAttr(
970+spanAttrs,
971+"gen_ai.usage.cache_creation.input_tokens",
972+usage.cacheWrite,
973+);
944974945975const span = spanWithDuration("openclaw.model.usage", spanAttrs, evt.durationMs, {
946976parentContext: contextForTrustedDiagnosticSpanParent(evt, metadata),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。