use serde::{Deserialize, Serialize};
use super::ContractModel;
use super::span::{SpanItem, SpanLinkItem};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct TraceItem {
pub duration_ns: i64,
pub ended_at: String,
#[serde(deserialize_with = "super::null_default")]
pub main_usage: MainUsage,
pub response_preview: String,
pub source: String,
pub span_count: i32,
pub started_at: String,
pub status: String,
pub synthetic: String,
pub trace_id: String,
#[serde(deserialize_with = "super::null_default")]
pub usage: TraceUsage,
pub user_prompt: String,
}
impl ContractModel for TraceItem {
const SCHEMA: &'static str = "TraceItem";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct TraceUsage {
pub cache_creation_tokens: i64,
pub cache_read_tokens: i64,
pub cost_usd: f64,
pub input_tokens: i64,
pub output_tokens: i64,
}
impl ContractModel for TraceUsage {
const SCHEMA: &'static str = "TraceUsage";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct MainUsage {
pub input_tokens: i64,
pub output_tokens: i64,
}
impl ContractModel for MainUsage {
const SCHEMA: &'static str = "MainUsage";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct TraceDetail {
#[serde(deserialize_with = "super::null_default")]
pub links: Vec<SpanLinkItem>,
#[serde(deserialize_with = "super::null_default")]
pub next_cursor: String,
pub schema: String,
#[serde(deserialize_with = "super::null_default")]
pub spans: Vec<SpanItem>,
#[serde(deserialize_with = "super::null_default")]
pub trace: TraceItem,
}
impl ContractModel for TraceDetail {
const SCHEMA: &'static str = "TraceDetail";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StandaloneTraceDetail {
#[serde(default, deserialize_with = "super::null_default")]
pub links: Vec<SpanLinkItem>,
#[serde(default, deserialize_with = "super::null_default")]
pub next_cursor: String,
#[serde(default)]
pub schema: String,
pub session_id: String,
#[serde(default, deserialize_with = "super::null_default")]
pub spans: Vec<SpanItem>,
#[serde(default, deserialize_with = "super::null_default")]
pub trace: TraceItem,
}
impl ContractModel for StandaloneTraceDetail {
const SCHEMA: &'static str = "StandaloneTraceDetail";
}
impl StandaloneTraceDetail {
#[must_use]
pub fn take_page(&mut self) -> crate::page::Page<SpanItem> {
crate::page::Page {
items: std::mem::take(&mut self.spans),
next_cursor: Some(std::mem::take(&mut self.next_cursor)),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct TraceListResponse {
#[serde(deserialize_with = "super::null_default")]
pub items: Vec<TraceItem>,
pub schema: String,
}
impl ContractModel for TraceListResponse {
const SCHEMA: &'static str = "TraceListResponse";
}