codex_rollout_trace/model/
conversation.rs1use serde::Deserialize;
2use serde::Serialize;
3
4use crate::payload::RawPayloadId;
5
6use super::AgentPath;
7use super::AgentThreadId;
8use super::CodeCellId;
9use super::CodexTurnId;
10use super::CompactionId;
11use super::ConversationItemId;
12use super::EdgeId;
13use super::InferenceCallId;
14use super::ModelVisibleCallId;
15use super::ToolCallId;
16use super::session::ExecutionWindow;
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct ConversationItem {
27 pub item_id: ConversationItemId,
28 pub thread_id: AgentThreadId,
29 pub codex_turn_id: Option<CodexTurnId>,
31 pub first_seen_at_unix_ms: i64,
32 pub role: ConversationRole,
33 pub channel: Option<ConversationChannel>,
35 pub kind: ConversationItemKind,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub agent_message: Option<AgentMessageMetadata>,
39 pub body: ConversationBody,
40 pub call_id: Option<ModelVisibleCallId>,
42 pub produced_by: Vec<ProducerRef>,
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
48pub struct AgentMessageMetadata {
49 pub author: AgentPath,
51 pub recipient: AgentPath,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57#[serde(rename_all = "snake_case")]
58pub enum ConversationRole {
59 System,
60 Developer,
61 User,
62 Assistant,
63 Tool,
64}
65
66#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
68#[serde(rename_all = "snake_case")]
69pub enum ConversationChannel {
70 Analysis,
71 Commentary,
72 Final,
73 Summary,
75}
76
77#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
79#[serde(rename_all = "snake_case")]
80pub enum ConversationItemKind {
81 Message,
82 Reasoning,
83 FunctionCall,
84 FunctionCallOutput,
85 CustomToolCall,
86 CustomToolCallOutput,
87 CompactionMarker,
89}
90
91#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
93pub struct ConversationBody {
94 pub parts: Vec<ConversationPart>,
97}
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
101#[serde(rename_all = "snake_case", tag = "type")]
102pub enum ConversationPart {
103 Text {
104 text: String,
105 },
106 Summary {
112 text: String,
113 },
114 Encoded {
121 label: String,
122 value: String,
123 },
124 Json {
126 summary: String,
127 raw_payload_id: RawPayloadId,
128 },
129 Code {
130 language: String,
131 source: String,
132 },
133 PayloadRef {
135 label: String,
136 raw_payload_id: RawPayloadId,
137 },
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
145#[serde(rename_all = "snake_case", tag = "type")]
146pub enum ProducerRef {
147 UserInput,
148 Inference { inference_call_id: InferenceCallId },
149 Tool { tool_call_id: ToolCallId },
150 CodeCell { code_cell_id: CodeCellId },
151 InteractionEdge { edge_id: EdgeId },
152 Compaction { compaction_id: CompactionId },
153 Harness,
154}
155
156#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
161pub struct InferenceCall {
162 pub inference_call_id: InferenceCallId,
163 pub thread_id: AgentThreadId,
164 pub codex_turn_id: CodexTurnId,
165 pub execution: ExecutionWindow,
166 pub model: String,
167 pub provider_name: String,
168 pub response_id: Option<String>,
170 pub upstream_request_id: Option<String>,
172 pub request_item_ids: Vec<ConversationItemId>,
174 pub response_item_ids: Vec<ConversationItemId>,
176 pub tool_call_ids_started_by_response: Vec<ToolCallId>,
178 pub usage: Option<TokenUsage>,
179 pub raw_request_payload_id: RawPayloadId,
180 pub raw_response_payload_id: Option<RawPayloadId>,
182}
183
184#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
186pub struct TokenUsage {
187 pub input_tokens: u64,
188 pub cached_input_tokens: u64,
189 #[serde(default)]
190 pub cache_write_input_tokens: u64,
191 pub output_tokens: u64,
192 pub reasoning_output_tokens: u64,
193}