( usage: Readonly<NonNullableUsage>, partUsage: BetaMessageDeltaUsage | undefined, )
| 2949 | * We only update these fields if they have a non-null, non-zero value. |
| 2950 | */ |
| 2951 | export function updateUsage( |
| 2952 | usage: Readonly<NonNullableUsage>, |
| 2953 | partUsage: BetaMessageDeltaUsage | undefined, |
| 2954 | ): NonNullableUsage { |
| 2955 | if (!partUsage) { |
| 2956 | return { ...usage } |
| 2957 | } |
| 2958 | return { |
| 2959 | input_tokens: |
| 2960 | partUsage.input_tokens !== null && partUsage.input_tokens > 0 |
| 2961 | ? partUsage.input_tokens |
| 2962 | : usage.input_tokens, |
| 2963 | cache_creation_input_tokens: |
| 2964 | partUsage.cache_creation_input_tokens !== null && |
| 2965 | partUsage.cache_creation_input_tokens > 0 |
| 2966 | ? partUsage.cache_creation_input_tokens |
| 2967 | : usage.cache_creation_input_tokens, |
| 2968 | cache_read_input_tokens: |
| 2969 | partUsage.cache_read_input_tokens !== null && |
| 2970 | partUsage.cache_read_input_tokens > 0 |
| 2971 | ? partUsage.cache_read_input_tokens |
| 2972 | : usage.cache_read_input_tokens, |
| 2973 | output_tokens: partUsage.output_tokens ?? usage.output_tokens, |
| 2974 | server_tool_use: { |
| 2975 | web_search_requests: |
| 2976 | partUsage.server_tool_use?.web_search_requests ?? |
| 2977 | usage.server_tool_use.web_search_requests, |
| 2978 | web_fetch_requests: |
| 2979 | partUsage.server_tool_use?.web_fetch_requests ?? |
| 2980 | usage.server_tool_use.web_fetch_requests, |
| 2981 | }, |
| 2982 | service_tier: usage.service_tier, |
| 2983 | cache_creation: { |
| 2984 | // SDK type BetaMessageDeltaUsage is missing cache_creation, but it's real! |
| 2985 | ephemeral_1h_input_tokens: |
| 2986 | (partUsage as BetaUsage).cache_creation?.ephemeral_1h_input_tokens ?? |
| 2987 | usage.cache_creation.ephemeral_1h_input_tokens, |
| 2988 | ephemeral_5m_input_tokens: |
| 2989 | (partUsage as BetaUsage).cache_creation?.ephemeral_5m_input_tokens ?? |
| 2990 | usage.cache_creation.ephemeral_5m_input_tokens, |
| 2991 | }, |
| 2992 | // cache_deleted_input_tokens: returned by the API when cache editing |
| 2993 | // deletes KV cache content, but not in SDK types. Kept off NonNullableUsage |
| 2994 | // so the string is eliminated from external builds by dead code elimination. |
| 2995 | // Uses the same > 0 guard as other token fields to prevent message_delta |
| 2996 | // from overwriting the real value with 0. |
| 2997 | ...(feature('CACHED_MICROCOMPACT') |
| 2998 | ? { |
| 2999 | cache_deleted_input_tokens: |
| 3000 | (partUsage as unknown as { cache_deleted_input_tokens?: number }) |
| 3001 | .cache_deleted_input_tokens != null && |
| 3002 | (partUsage as unknown as { cache_deleted_input_tokens: number }) |
| 3003 | .cache_deleted_input_tokens > 0 |
| 3004 | ? (partUsage as unknown as { cache_deleted_input_tokens: number }) |
| 3005 | .cache_deleted_input_tokens |
| 3006 | : ((usage as unknown as { cache_deleted_input_tokens?: number }) |
| 3007 | .cache_deleted_input_tokens ?? 0), |
| 3008 | } |
no outgoing calls
no test coverage detected