( usage: Readonly<NonNullableUsage>, partUsage: BetaMessageDeltaUsage | undefined, )
| 2922 | * We only update these fields if they have a non-null, non-zero value. |
| 2923 | */ |
| 2924 | export function updateUsage( |
| 2925 | usage: Readonly<NonNullableUsage>, |
| 2926 | partUsage: BetaMessageDeltaUsage | undefined, |
| 2927 | ): NonNullableUsage { |
| 2928 | if (!partUsage) { |
| 2929 | return { ...usage } |
| 2930 | } |
| 2931 | return { |
| 2932 | input_tokens: |
| 2933 | partUsage.input_tokens !== null && partUsage.input_tokens > 0 |
| 2934 | ? partUsage.input_tokens |
| 2935 | : usage.input_tokens, |
| 2936 | cache_creation_input_tokens: |
| 2937 | partUsage.cache_creation_input_tokens !== null && |
| 2938 | partUsage.cache_creation_input_tokens > 0 |
| 2939 | ? partUsage.cache_creation_input_tokens |
| 2940 | : usage.cache_creation_input_tokens, |
| 2941 | cache_read_input_tokens: |
| 2942 | partUsage.cache_read_input_tokens !== null && |
| 2943 | partUsage.cache_read_input_tokens > 0 |
| 2944 | ? partUsage.cache_read_input_tokens |
| 2945 | : usage.cache_read_input_tokens, |
| 2946 | output_tokens: partUsage.output_tokens ?? usage.output_tokens, |
| 2947 | server_tool_use: { |
| 2948 | web_search_requests: |
| 2949 | partUsage.server_tool_use?.web_search_requests ?? |
| 2950 | usage.server_tool_use.web_search_requests, |
| 2951 | web_fetch_requests: |
| 2952 | partUsage.server_tool_use?.web_fetch_requests ?? |
| 2953 | usage.server_tool_use.web_fetch_requests, |
| 2954 | }, |
| 2955 | service_tier: usage.service_tier, |
| 2956 | cache_creation: { |
| 2957 | // SDK type BetaMessageDeltaUsage is missing cache_creation, but it's real! |
| 2958 | ephemeral_1h_input_tokens: |
| 2959 | (partUsage as BetaUsage).cache_creation?.ephemeral_1h_input_tokens ?? |
| 2960 | usage.cache_creation.ephemeral_1h_input_tokens, |
| 2961 | ephemeral_5m_input_tokens: |
| 2962 | (partUsage as BetaUsage).cache_creation?.ephemeral_5m_input_tokens ?? |
| 2963 | usage.cache_creation.ephemeral_5m_input_tokens, |
| 2964 | }, |
| 2965 | // cache_deleted_input_tokens: returned by the API when cache editing |
| 2966 | // deletes KV cache content, but not in SDK types. Kept off NonNullableUsage |
| 2967 | // so the string is eliminated from external builds by dead code elimination. |
| 2968 | // Uses the same > 0 guard as other token fields to prevent message_delta |
| 2969 | // from overwriting the real value with 0. |
| 2970 | ...(feature('CACHED_MICROCOMPACT') |
| 2971 | ? { |
| 2972 | cache_deleted_input_tokens: |
| 2973 | (partUsage as unknown as { cache_deleted_input_tokens?: number }) |
| 2974 | .cache_deleted_input_tokens != null && |
| 2975 | (partUsage as unknown as { cache_deleted_input_tokens: number }) |
| 2976 | .cache_deleted_input_tokens > 0 |
| 2977 | ? (partUsage as unknown as { cache_deleted_input_tokens: number }) |
| 2978 | .cache_deleted_input_tokens |
| 2979 | : ((usage as unknown as { cache_deleted_input_tokens?: number }) |
| 2980 | .cache_deleted_input_tokens ?? 0), |
| 2981 | } |
no test coverage detected