(text: &str)
| 360 | } |
| 361 | |
| 362 | fn usage_from_api_req_started(text: &str) -> Option<Value> { |
| 363 | let payload: Value = serde_json::from_str(text).ok()?; |
| 364 | let mut counters = Map::new(); |
| 365 | map_counter( |
| 366 | &mut counters, |
| 367 | "input_tokens", |
| 368 | &payload, |
| 369 | &["tokensIn", "tokens_in"], |
| 370 | ); |
| 371 | map_counter( |
| 372 | &mut counters, |
| 373 | "output_tokens", |
| 374 | &payload, |
| 375 | &["tokensOut", "tokens_out"], |
| 376 | ); |
| 377 | map_counter( |
| 378 | &mut counters, |
| 379 | "cache_read_input_tokens", |
| 380 | &payload, |
| 381 | &["cacheReads", "cache_reads"], |
| 382 | ); |
| 383 | map_counter( |
| 384 | &mut counters, |
| 385 | "cache_creation_input_tokens", |
| 386 | &payload, |
| 387 | &["cacheWrites", "cache_writes"], |
| 388 | ); |
| 389 | if let Some(total) = payload |
| 390 | .get("totalTokens") |
| 391 | .or_else(|| payload.get("total_tokens")) |
| 392 | .and_then(Value::as_i64) |
| 393 | { |
| 394 | counters.insert("total_tokens".to_string(), Value::from(total)); |
| 395 | } |
| 396 | (!counters.is_empty()).then_some(Value::Object(counters)) |
| 397 | } |
| 398 | |
| 399 | fn map_counter( |
| 400 | counters: &mut Map<String, Value>, |
no test coverage detected