Skip to main content

kaizen/interchange/atif/
types.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3use 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}