use agentkit_loop::{AgentEvent, LoopObserver};
#[derive(Default)]
pub struct TracingReporter {
_private: (),
}
impl TracingReporter {
pub fn new() -> Self {
Self::default()
}
}
impl LoopObserver for TracingReporter {
fn handle_event(&self, event: AgentEvent) {
match &event {
AgentEvent::RunStarted { session_id } => {
tracing::info!(target: "agentkit_reporting", session_id = %session_id, "agent run started");
}
AgentEvent::TurnStarted {
session_id,
turn_id,
} => {
tracing::info!(target: "agentkit_reporting", session_id = %session_id, turn_id = %turn_id, "turn started");
}
AgentEvent::InputAccepted { session_id, items } => {
tracing::debug!(target: "agentkit_reporting", session_id = %session_id, item_count = items.len(), "input accepted");
}
AgentEvent::ContentDelta(delta) => {
tracing::trace!(target: "agentkit_reporting", ?delta, "content delta");
}
AgentEvent::ToolCallRequested(call) => {
tracing::info!(target: "agentkit_reporting", tool = %call.name, "tool call requested");
}
AgentEvent::ToolResultReceived(result) => {
tracing::info!(
target: "agentkit_reporting",
call_id = %result.call_id,
is_error = result.is_error,
"tool result received"
);
}
AgentEvent::ApprovalRequired(request) => {
tracing::info!(target: "agentkit_reporting", summary = %request.summary, reason = ?request.reason, "approval required");
}
AgentEvent::ApprovalResolved { approved } => {
tracing::info!(target: "agentkit_reporting", approved, "approval resolved");
}
AgentEvent::ToolCatalogChanged(event) => {
tracing::info!(
target: "agentkit_reporting",
source = %event.source,
added = event.added.len(),
removed = event.removed.len(),
changed = event.changed.len(),
"tool catalog changed"
);
}
AgentEvent::MutationStarted {
session_id,
turn_id,
mutator,
point,
} => {
let turn = turn_id.as_ref().map(|t| t.to_string()).unwrap_or_default();
tracing::debug!(
target: "agentkit_reporting",
session_id = %session_id,
turn_id = %turn,
mutator = %mutator,
point = ?point,
"mutation started"
);
}
AgentEvent::MutationFinished {
session_id,
turn_id,
mutator,
dirty,
..
} => {
let turn = turn_id.as_ref().map(|t| t.to_string()).unwrap_or_default();
tracing::debug!(
target: "agentkit_reporting",
session_id = %session_id,
turn_id = %turn,
mutator = %mutator,
dirty,
"mutation finished"
);
}
AgentEvent::UsageUpdated(usage) => {
if let Some(tokens) = &usage.tokens {
tracing::debug!(
target: "agentkit_reporting",
input_tokens = tokens.input_tokens,
output_tokens = tokens.output_tokens,
"usage updated"
);
}
}
AgentEvent::Warning { message } => {
tracing::warn!(target: "agentkit_reporting", message, "agent warning");
}
AgentEvent::RunFailed { message } => {
tracing::error!(target: "agentkit_reporting", message, "agent run failed");
}
AgentEvent::TurnFinished(result) => {
tracing::info!(
target: "agentkit_reporting",
finish_reason = ?result.finish_reason,
item_count = result.items.len(),
"turn finished"
);
}
}
}
}