agtrace_types/event/
payload.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4use crate::tool::ToolCallPayload;
5
6/// Event payload variants
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(tag = "type", content = "content")]
9#[serde(rename_all = "snake_case")]
10pub enum EventPayload {
11    /// 1. User input (Trigger)
12    User(UserPayload),
13
14    /// 2. Assistant reasoning/thinking process (Gemini thoughts, etc.)
15    Reasoning(ReasoningPayload),
16
17    /// 3. Tool execution request (Action Request)
18    ///
19    /// Note: TokenUsage can be attached as sidecar to this
20    ToolCall(ToolCallPayload),
21
22    /// 4. Tool execution result (Action Result)
23    ToolResult(ToolResultPayload),
24
25    /// 5. Assistant text response (Final Response)
26    ///
27    /// Note: TokenUsage can be attached as sidecar to this
28    Message(MessagePayload),
29
30    /// 6. Cost information (Sidecar / Leaf Node)
31    ///
32    /// Not included in context, used for cost calculation
33    TokenUsage(TokenUsagePayload),
34
35    /// 7. User-facing system notification (updates, alerts, status changes)
36    Notification(NotificationPayload),
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct UserPayload {
41    /// User input text
42    pub text: String,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct ReasoningPayload {
47    /// Reasoning/thinking content
48    pub text: String,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct ToolResultPayload {
53    /// Tool execution result (text, JSON string, error message, etc.)
54    pub output: String,
55
56    /// Logical parent (Tool Call) reference ID
57    /// Separate from parent_id (time-series parent) to explicitly identify which call this result belongs to
58    pub tool_call_id: Uuid,
59
60    /// Execution success or failure
61    #[serde(default)]
62    pub is_error: bool,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct MessagePayload {
67    /// Response text
68    pub text: String,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct TokenUsagePayload {
73    /// Input tokens (incremental)
74    pub input_tokens: i32,
75    /// Output tokens (incremental)
76    pub output_tokens: i32,
77    /// Total tokens (incremental)
78    pub total_tokens: i32,
79
80    /// Detailed breakdown (optional)
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub details: Option<TokenUsageDetails>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct TokenUsageDetails {
87    /// Cache creation input tokens (Claude/Gemini)
88    pub cache_creation_input_tokens: Option<i32>,
89    /// Cache read input tokens (Claude/Gemini)
90    pub cache_read_input_tokens: Option<i32>,
91    /// Reasoning output tokens (o1/Gemini)
92    pub reasoning_output_tokens: Option<i32>,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct NotificationPayload {
97    /// Notification message text
98    pub text: String,
99    /// Optional severity level (e.g., "info", "warning", "error")
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub level: Option<String>,
102}