use crate::types::{ChatMessage, ChatResponse, Tool, ToolCall};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{Duration, SystemTime};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "event_type", content = "data")]
pub enum TracingEvent {
Http(HttpEvent),
Llm(LlmEvent),
Performance(PerformanceEvent),
Error(ErrorEvent),
Stream(StreamEvent),
Tool(ToolEvent),
Chat(ChatEvent),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpEvent {
pub timestamp: SystemTime,
pub request: HttpRequestInfo,
pub response: Option<HttpResponseInfo>,
pub duration: Option<Duration>,
pub error: Option<String>,
pub timing: Option<NetworkTiming>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpRequestInfo {
pub method: String,
pub url: String,
pub headers: HashMap<String, String>,
pub body: Option<String>,
pub body_size: u64,
pub content_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HttpResponseInfo {
pub status_code: u16,
pub headers: HashMap<String, String>,
pub body: Option<String>,
pub body_size: u64,
pub content_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkTiming {
pub dns_lookup: Option<Duration>,
pub tcp_connect: Option<Duration>,
pub tls_handshake: Option<Duration>,
pub time_to_first_byte: Option<Duration>,
pub content_download: Option<Duration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LlmEvent {
pub timestamp: SystemTime,
pub provider: String,
pub model: String,
pub interaction_type: LlmInteractionType,
pub input_messages: Vec<ChatMessage>,
pub tools: Option<Vec<Tool>>,
pub response: Option<ChatResponse>,
pub duration: Option<Duration>,
pub token_usage: Option<TokenUsage>,
pub parameters: HashMap<String, serde_json::Value>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LlmInteractionType {
Chat,
ChatStream,
Embedding,
AudioTranscription,
AudioGeneration,
ImageAnalysis,
ImageGeneration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
pub cached_tokens: Option<u32>,
pub reasoning_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceEvent {
pub timestamp: SystemTime,
pub metric_type: PerformanceMetricType,
pub value: f64,
pub unit: String,
pub context: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PerformanceMetricType {
Latency,
Throughput,
MemoryUsage,
CpuUsage,
ConnectionPoolSize,
CacheHitRate,
TokenGenerationRate,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorEvent {
pub timestamp: SystemTime,
pub error: String,
pub context: HashMap<String, String>,
pub stack_trace: Option<String>,
pub recovery_actions: Vec<String>,
pub retried: bool,
pub retry_attempt: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StreamEvent {
pub timestamp: SystemTime,
pub event_type: StreamEventType,
pub data: String,
pub chunk_size: usize,
pub cumulative_size: usize,
pub position: u64,
pub is_final: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StreamEventType {
TextDelta,
ToolCallDelta,
ThinkingDelta,
StreamStart,
StreamEnd,
StreamError,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolEvent {
pub timestamp: SystemTime,
pub tool_call: ToolCall,
pub result: Option<String>,
pub duration: Option<Duration>,
pub error: Option<String>,
pub parameters: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatEvent {
pub timestamp: SystemTime,
pub session_id: String,
pub exchange: ChatExchange,
pub duration: Duration,
pub token_usage: Option<TokenUsage>,
pub tools_used: Vec<String>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatExchange {
pub input: Vec<ChatMessage>,
pub output: Option<ChatResponse>,
pub streaming: bool,
pub tool_calls_count: u32,
}