@@ -2,6 +2,10 @@ import type { Client } from '../../client';
22import { SEMANTIC_ATTRIBUTE_SENTRY_OP , SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes' ;
33import type { Event } from '../../types-hoist/event' ;
44import type { Span , SpanAttributes , SpanAttributeValue , SpanJSON , SpanOrigin } from '../../types-hoist/span' ;
5+ import {
6+ GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE ,
7+ GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE ,
8+ } from '../ai/gen-ai-attributes' ;
59import { spanToJSON } from '../spanUtils' ;
610import { toolCallSpanMap } from './constants' ;
711import type { TokenSummary } from './types' ;
@@ -23,6 +27,7 @@ import {
2327 AI_TOOL_CALL_ID_ATTRIBUTE ,
2428 AI_TOOL_CALL_NAME_ATTRIBUTE ,
2529 AI_TOOL_CALL_RESULT_ATTRIBUTE ,
30+ AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE ,
2631 AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE ,
2732 AI_USAGE_PROMPT_TOKENS_ATTRIBUTE ,
2833 GEN_AI_RESPONSE_MODEL_ATTRIBUTE ,
@@ -107,6 +112,7 @@ function processEndedVercelAiSpan(span: SpanJSON): void {
107112
108113 renameAttributeKey ( attributes , AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE , GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE ) ;
109114 renameAttributeKey ( attributes , AI_USAGE_PROMPT_TOKENS_ATTRIBUTE , GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ) ;
115+ renameAttributeKey ( attributes , AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE , GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE ) ;
110116
111117 if (
112118 typeof attributes [ GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE ] === 'number' &&
@@ -287,7 +293,7 @@ function addProviderMetadataToAttributes(attributes: SpanAttributes): void {
287293 if ( providerMetadataObject . openai ) {
288294 setAttributeIfDefined (
289295 attributes ,
290- 'gen_ai.usage.input_tokens.cached' ,
296+ GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE ,
291297 providerMetadataObject . openai . cachedPromptTokens ,
292298 ) ;
293299 setAttributeIfDefined (
@@ -309,35 +315,34 @@ function addProviderMetadataToAttributes(attributes: SpanAttributes): void {
309315 }
310316
311317 if ( providerMetadataObject . anthropic ) {
312- setAttributeIfDefined (
313- attributes ,
314- 'gen_ai.usage.input_tokens.cached' ,
315- providerMetadataObject . anthropic . cacheReadInputTokens ,
316- ) ;
317- setAttributeIfDefined (
318- attributes ,
319- 'gen_ai.usage.input_tokens.cache_write' ,
320- providerMetadataObject . anthropic . cacheCreationInputTokens ,
321- ) ;
318+ const cachedInputTokens =
319+ providerMetadataObject . anthropic . usage ?. cache_read_input_tokens ??
320+ providerMetadataObject . anthropic . cacheReadInputTokens ;
321+ setAttributeIfDefined ( attributes , GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE , cachedInputTokens ) ;
322+
323+ const cacheWriteInputTokens =
324+ providerMetadataObject . anthropic . usage ?. cache_creation_input_tokens ??
325+ providerMetadataObject . anthropic . cacheCreationInputTokens ;
326+ setAttributeIfDefined ( attributes , GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE , cacheWriteInputTokens ) ;
322327 }
323328
324329 if ( providerMetadataObject . bedrock ?. usage ) {
325330 setAttributeIfDefined (
326331 attributes ,
327- 'gen_ai.usage.input_tokens.cached' ,
332+ GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE ,
328333 providerMetadataObject . bedrock . usage . cacheReadInputTokens ,
329334 ) ;
330335 setAttributeIfDefined (
331336 attributes ,
332- 'gen_ai.usage.input_tokens.cache_write' ,
337+ GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE ,
333338 providerMetadataObject . bedrock . usage . cacheWriteInputTokens ,
334339 ) ;
335340 }
336341
337342 if ( providerMetadataObject . deepseek ) {
338343 setAttributeIfDefined (
339344 attributes ,
340- 'gen_ai.usage.input_tokens.cached' ,
345+ GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE ,
341346 providerMetadataObject . deepseek . promptCacheHitTokens ,
342347 ) ;
343348 setAttributeIfDefined (
0 commit comments