adk_anthropic/client_logger.rs
1//! Logging trait for Anthropic client operations.
2//!
3//! This module provides the [`ClientLogger`] trait that allows users to capture
4//! and log all API interactions passing through the [`Anthropic`] client.
5
6use crate::{Message, MessageStreamEvent};
7
8/// A trait for logging Anthropic client operations.
9///
10/// Implement this trait to capture and record all API interactions,
11/// including both non-streaming responses and individual streaming events.
12///
13/// # Example
14///
15/// ```rust,ignore
16/// use adk_anthropic::{ClientLogger, Message, MessageStreamEvent};
17/// use std::sync::Mutex;
18///
19/// struct FileLogger {
20/// file: Mutex<std::fs::File>,
21/// }
22///
23/// impl ClientLogger for FileLogger {
24/// fn log_response(&self, message: &Message) {
25/// let mut file = self.file.lock().unwrap();
26/// writeln!(file, "Response: {}", serde_json::to_string(message).unwrap()).unwrap();
27/// }
28///
29/// fn log_stream_event(&self, event: &MessageStreamEvent) {
30/// let mut file = self.file.lock().unwrap();
31/// writeln!(file, "Stream event: {}", serde_json::to_string(event).unwrap()).unwrap();
32/// }
33///
34/// fn log_stream_message(&self, message: &Message) {
35/// let mut file = self.file.lock().unwrap();
36/// writeln!(file, "Stream complete: {}", serde_json::to_string(message).unwrap()).unwrap();
37/// }
38/// }
39/// ```
40pub trait ClientLogger: Send + Sync {
41 /// Log a complete response from a non-streaming `send` call.
42 ///
43 /// This method is called once per successful `send` call with the full
44 /// [`Message`] response from the API.
45 fn log_response(&self, message: &Message);
46
47 /// Log an individual streaming event.
48 ///
49 /// This method is called for each [`MessageStreamEvent`] received during
50 /// a streaming request. Events include message starts, content deltas,
51 /// and message stops.
52 fn log_stream_event(&self, event: &MessageStreamEvent);
53
54 /// Log the reconstructed message from a completed stream.
55 ///
56 /// This method is called once when a stream completes successfully,
57 /// with the full [`Message`] that was reconstructed from all the
58 /// streaming events.
59 fn log_stream_message(&self, message: &Message);
60}