| 91 | } |
| 92 | |
| 93 | pub(super) fn parse_token_usage(value: Option<&Value>) -> Option<DroidTokenUsage> { |
| 94 | let usage = value?.as_object()?; |
| 95 | let raw_usage = TokenUsageRaw { |
| 96 | input_tokens: json_value_u64(usage.get("inputTokens")), |
| 97 | output_tokens: json_value_u64(usage.get("outputTokens")), |
| 98 | cache_creation_input_tokens: json_value_u64(usage.get("cacheCreationTokens")), |
| 99 | cache_read_input_tokens: json_value_u64(usage.get("cacheReadTokens")), |
| 100 | speed: None, |
| 101 | cache_creation: None, |
| 102 | }; |
| 103 | let thinking_tokens = json_value_u64(usage.get("thinkingTokens")); |
| 104 | let total_tokens = json_value_u64(usage.get("totalTokens")); |
| 105 | let (raw_usage, thinking_tokens) = |
| 106 | apply_total_token_fallback(raw_usage, thinking_tokens, total_tokens); |
| 107 | let tokens = DroidTokenUsage { |
| 108 | input_tokens: raw_usage.input_tokens, |
| 109 | output_tokens: raw_usage.output_tokens, |
| 110 | cache_creation_tokens: raw_usage.cache_creation_input_tokens, |
| 111 | cache_read_tokens: raw_usage.cache_read_input_tokens, |
| 112 | thinking_tokens, |
| 113 | }; |
| 114 | (tokens.input_tokens |
| 115 | + tokens.output_tokens |
| 116 | + tokens.cache_creation_tokens |
| 117 | + tokens.cache_read_tokens |
| 118 | + tokens.thinking_tokens |
| 119 | > 0) |
| 120 | .then_some(tokens) |
| 121 | } |
| 122 | |
| 123 | fn settings_timestamp( |
| 124 | settings: &serde_json::Map<String, Value>, |