Skip to main content

assay_core/trace/
schema.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4#[serde(untagged)]
5pub enum TraceEntry {
6    V1(TraceEntryV1),
7    V2(TraceEvent),
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct TraceEntryV1 {
12    pub schema_version: u32,
13    #[serde(rename = "type")]
14    pub entry_type: String, // "assay.trace"
15    pub request_id: String,
16    pub prompt: String,
17    pub response: String,
18    #[serde(default)]
19    pub meta: serde_json::Value,
20}
21
22// --- V2 Schema (Streamable) ---
23
24#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
25#[serde(tag = "type")]
26pub enum TraceEvent {
27    #[serde(rename = "episode_start")]
28    EpisodeStart(EpisodeStart),
29    #[serde(rename = "step")]
30    Step(StepEntry),
31    #[serde(rename = "tool_call")]
32    ToolCall(ToolCallEntry),
33    #[serde(rename = "episode_end")]
34    EpisodeEnd(EpisodeEnd),
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
38pub struct EpisodeStart {
39    pub episode_id: String,
40    pub timestamp: u64, // ms
41    #[serde(default)]
42    pub input: serde_json::Value, // { prompt: ... }
43    #[serde(default)]
44    pub meta: serde_json::Value,
45}
46
47// --- Provenance ---
48
49// --- Provenance ---
50
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
52pub struct TruncationMeta {
53    pub field: String,
54    pub original_len: usize,
55    pub kept_len: usize,
56    pub sha256: String,
57    pub strategy: String,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
61pub struct StepEntry {
62    pub episode_id: String,
63    pub step_id: String,
64    #[serde(default)]
65    pub idx: u32,
66    pub timestamp: u64,
67    pub kind: String,
68    pub name: Option<String>,
69    #[serde(default)]
70    pub content: Option<String>,
71    #[serde(default)]
72    pub content_sha256: Option<String>, // Hash of full content
73    #[serde(default)]
74    pub truncations: Vec<TruncationMeta>,
75    #[serde(default)]
76    pub meta: serde_json::Value,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
80pub struct ToolCallEntry {
81    pub episode_id: String,
82    pub step_id: String,
83    pub timestamp: u64,
84    pub tool_name: String,
85    pub call_index: Option<u32>, // Added for uniqueness (step_id, call_index)
86    #[serde(default)]
87    pub args: serde_json::Value,
88    #[serde(default)]
89    pub args_sha256: Option<String>,
90    #[serde(default)]
91    pub result: Option<serde_json::Value>,
92    #[serde(default)]
93    pub result_sha256: Option<String>,
94    #[serde(default)]
95    pub error: Option<String>,
96    #[serde(default)]
97    pub truncations: Vec<TruncationMeta>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
101pub struct EpisodeEnd {
102    pub episode_id: String,
103    pub timestamp: u64,
104    pub outcome: Option<String>, // "pass", "fail", "error"
105    #[serde(default)]
106    pub final_output: Option<String>,
107}