use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use crate::core::media::MediaRef;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraceNode {
pub trace_key: String,
#[serde(default)]
pub parent_trace_key: Option<String>,
#[serde(default)]
pub op_name: Option<String>,
pub display_name: String,
pub node_type: String,
pub kind: String,
#[serde(default)]
pub inputs: Map<String, Value>,
#[serde(default)]
pub outputs: Map<String, Value>,
#[serde(default)]
pub start_time: Option<String>,
#[serde(default)]
pub end_time: Option<String>,
#[serde(default)]
pub duration_ms: Option<f64>,
#[serde(default)]
pub metadata: Map<String, Value>,
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub usage: Option<Value>,
#[serde(default)]
pub cost: Option<f64>,
#[serde(default)]
pub thinking_content: Option<String>,
#[serde(default)]
pub media: Vec<MediaRef>,
}
impl Default for TraceNode {
fn default() -> Self {
Self {
trace_key: String::new(),
parent_trace_key: None,
op_name: None,
display_name: String::new(),
node_type: "span".into(),
kind: "batch".into(),
inputs: Map::new(),
outputs: Map::new(),
start_time: None,
end_time: None,
duration_ms: None,
metadata: Map::new(),
model: None,
usage: None,
cost: None,
thinking_content: None,
media: Vec::new(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TraceSummary {
#[serde(default)]
pub total_ops: u32,
#[serde(default)]
pub total_records: u32,
#[serde(default)]
pub total_duration_ms: f64,
#[serde(default)]
pub stream_count: u32,
#[serde(default)]
pub total_yields: u32,
#[serde(default)]
pub loop_iterations: u32,
#[serde(default)]
pub error_count: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TraceData {
pub request_id: String,
pub workflow_name: String,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub session_id: Option<String>,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub summary: TraceSummary,
#[serde(default)]
pub nodes: Vec<TraceNode>,
}