kaizen/interchange/atif/
types.rs1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::BTreeMap;
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct InterchangeTrace {
9 pub session: InterchangeSession,
10 pub events: Vec<InterchangeEvent>,
11}
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14pub struct InterchangeSession {
15 pub id: String,
16 pub agent: String,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub model: Option<String>,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub workspace: Option<String>,
21 pub started_at_ms: u64,
22 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub ended_at_ms: Option<u64>,
24 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
25 pub attributes: BTreeMap<String, Value>,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29pub struct InterchangeEvent {
30 pub session_id: String,
31 pub seq: u64,
32 pub ts_ms: u64,
33 pub kind: String,
34 pub source: String,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 pub tool: Option<String>,
37 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub tool_call_id: Option<String>,
39 #[serde(default)]
40 pub payload: Value,
41 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
42 pub attributes: BTreeMap<String, Value>,
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub struct AtifDocument {
47 pub format: String,
48 pub version: u16,
49 pub session: AtifSession,
50 pub events: Vec<AtifEvent>,
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54pub struct AtifSession {
55 pub id: String,
56 pub agent: String,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub model: Option<String>,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub workspace: Option<String>,
61 pub started_at_ms: u64,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub ended_at_ms: Option<u64>,
64 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
65 pub attributes: BTreeMap<String, Value>,
66}
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
69pub struct AtifEvent {
70 pub id: String,
71 pub sequence: u64,
72 pub timestamp_ms: u64,
73 #[serde(rename = "type")]
74 pub event_type: String,
75 pub source: String,
76 #[serde(default, skip_serializing_if = "Option::is_none")]
77 pub tool: Option<String>,
78 #[serde(default, skip_serializing_if = "Option::is_none")]
79 pub tool_call_id: Option<String>,
80 #[serde(default)]
81 pub payload: Value,
82 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
83 pub attributes: BTreeMap<String, Value>,
84}