1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::super::super::common::*;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(tag = "type")]
10pub enum ResponseAnnotation {
11 #[serde(rename = "file_citation")]
12 FileCitation {
13 file_id: String,
14 filename: String,
15 index: u32,
16 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
17 extra: Extra,
18 },
19 #[serde(rename = "url_citation")]
20 UrlCitation {
21 end_index: u32,
22 start_index: u32,
23 title: String,
24 url: String,
25 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
26 extra: Extra,
27 },
28 #[serde(rename = "container_file_citation")]
29 ContainerFileCitation {
30 container_id: String,
31 end_index: u32,
32 file_id: String,
33 filename: String,
34 start_index: u32,
35 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
36 extra: Extra,
37 },
38 #[serde(rename = "file_path")]
39 FilePath {
40 file_id: String,
41 index: u32,
42 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
43 extra: Extra,
44 },
45}
46
47#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
48pub struct FileSearchResult {
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub attributes: Option<FileSearchResultAttributes>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub file_id: Option<String>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub filename: Option<String>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub score: Option<f64>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub text: Option<String>,
59 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
60 pub extra: Extra,
61}
62
63pub type FileSearchResultAttributes = BTreeMap<String, FileSearchResultAttributeValue>;
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66#[serde(untagged)]
67pub enum FileSearchResultAttributeValue {
68 String(String),
69 Number(f64),
70 Boolean(bool),
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74pub struct SafetyCheck {
75 pub id: String,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub code: Option<String>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub message: Option<String>,
80 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
81 pub extra: Extra,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
85#[serde(tag = "type")]
86pub enum ComputerAction {
87 #[serde(rename = "click")]
88 Click {
89 button: ComputerMouseButton,
90 x: f64,
91 y: f64,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 keys: Option<Vec<String>>,
94 },
95 #[serde(rename = "double_click")]
96 DoubleClick { keys: Vec<String>, x: f64, y: f64 },
97 #[serde(rename = "drag")]
98 Drag {
99 path: Vec<ComputerCoordinate>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 keys: Option<Vec<String>>,
102 },
103 #[serde(rename = "keypress")]
104 Keypress { keys: Vec<String> },
105 #[serde(rename = "move")]
106 Move {
107 x: f64,
108 y: f64,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 keys: Option<Vec<String>>,
111 },
112 #[serde(rename = "screenshot")]
113 Screenshot {},
114 #[serde(rename = "scroll")]
115 Scroll {
116 scroll_x: f64,
117 scroll_y: f64,
118 x: f64,
119 y: f64,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 keys: Option<Vec<String>>,
122 },
123 #[serde(rename = "type")]
124 Type { text: String },
125 #[serde(rename = "wait")]
126 Wait {},
127}
128
129#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
130pub enum ComputerMouseButton {
131 #[serde(rename = "left")]
132 Left,
133 #[serde(rename = "right")]
134 Right,
135 #[serde(rename = "wheel")]
136 Wheel,
137 #[serde(rename = "back")]
138 Back,
139 #[serde(rename = "forward")]
140 Forward,
141}
142
143#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
144pub struct ComputerCoordinate {
145 pub x: f64,
146 pub y: f64,
147}
148
149#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
150pub struct ComputerScreenshot {
151 #[serde(rename = "type")]
152 pub type_: ComputerScreenshotType,
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub file_id: Option<String>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub image_url: Option<String>,
157 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
158 pub extra: Extra,
159}
160
161#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
162pub enum ComputerScreenshotType {
163 #[serde(rename = "computer_screenshot")]
164 ComputerScreenshot,
165}
166
167#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
168#[serde(tag = "type")]
169pub enum WebSearchAction {
170 #[serde(rename = "search")]
171 Search {
172 #[serde(skip_serializing_if = "Option::is_none")]
173 queries: Option<Vec<String>>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 query: Option<String>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 sources: Option<Vec<WebSearchSource>>,
178 },
179 #[serde(rename = "open_page")]
180 OpenPage {
181 #[serde(skip_serializing_if = "Option::is_none")]
182 url: Option<String>,
183 },
184 #[serde(rename = "find_in_page")]
185 FindInPage { pattern: String, url: String },
186}
187
188#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
189pub struct WebSearchSource {
190 #[serde(rename = "type")]
191 pub type_: WebSearchSourceType,
192 pub url: String,
193 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
194 pub extra: Extra,
195}
196
197#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
198pub enum WebSearchSourceType {
199 #[serde(rename = "url")]
200 Url,
201}
202
203#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
204pub enum AdditionalToolsRole {
205 #[serde(rename = "unknown")]
206 Unknown,
207 #[serde(rename = "user")]
208 User,
209 #[serde(rename = "assistant")]
210 Assistant,
211 #[serde(rename = "system")]
212 System,
213 #[serde(rename = "critic")]
214 Critic,
215 #[serde(rename = "discriminator")]
216 Discriminator,
217 #[serde(rename = "developer")]
218 Developer,
219 #[serde(rename = "tool")]
220 Tool,
221}
222
223#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
224pub struct ResponseReasoningSummaryPart {
225 pub text: String,
226 #[serde(rename = "type")]
227 pub type_: ResponseReasoningSummaryType,
228 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
229 pub extra: Extra,
230}
231
232#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
233pub enum ResponseReasoningSummaryType {
234 #[serde(rename = "summary_text")]
235 SummaryText,
236}
237
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
239pub struct ResponseReasoningTextPart {
240 pub text: String,
241 #[serde(rename = "type")]
242 pub type_: ResponseReasoningTextType,
243 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
244 pub extra: Extra,
245}
246
247#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
248pub enum ResponseReasoningTextType {
249 #[serde(rename = "reasoning_text")]
250 ReasoningText,
251}
252
253#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
254#[serde(tag = "type")]
255pub enum CodeInterpreterOutput {
256 #[serde(rename = "logs")]
257 Logs { logs: String },
258 #[serde(rename = "image")]
259 Image { url: String },
260}
261
262#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
263pub struct LocalShellAction {
264 pub command: Vec<String>,
265 pub env: BTreeMap<String, String>,
266 #[serde(rename = "type")]
267 pub type_: LocalShellActionType,
268 #[serde(skip_serializing_if = "Option::is_none")]
269 pub timeout_ms: Option<u32>,
270 #[serde(skip_serializing_if = "Option::is_none")]
271 pub user: Option<String>,
272 #[serde(skip_serializing_if = "Option::is_none")]
273 pub working_directory: Option<String>,
274 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
275 pub extra: Extra,
276}
277
278#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
279pub enum LocalShellActionType {
280 #[serde(rename = "exec")]
281 Exec,
282}
283
284#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
285pub struct ShellAction {
286 pub commands: Vec<String>,
287 #[serde(skip_serializing_if = "Option::is_none")]
288 pub max_output_length: Option<u32>,
289 #[serde(skip_serializing_if = "Option::is_none")]
290 pub timeout_ms: Option<u32>,
291 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
292 pub extra: Extra,
293}
294
295#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
296#[serde(tag = "type")]
297pub enum ShellEnvironment {
298 #[serde(rename = "local")]
299 Local {
300 #[serde(skip_serializing_if = "Option::is_none")]
301 skills: Option<Vec<ShellSkillReference>>,
302 },
303 #[serde(rename = "container_reference")]
304 ContainerReference { container_id: String },
305}
306
307#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
308pub struct ShellSkillReference {
309 #[serde(skip_serializing_if = "Option::is_none")]
310 pub skill_id: Option<String>,
311 #[serde(skip_serializing_if = "Option::is_none")]
312 pub version: Option<String>,
313 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
314 pub extra: Extra,
315}
316
317#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
318pub struct ShellCallOutputContent {
319 pub outcome: ShellCallOutcome,
320 pub stderr: String,
321 pub stdout: String,
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub created_by: Option<String>,
324 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
325 pub extra: Extra,
326}
327
328#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
329#[serde(tag = "type")]
330pub enum ShellCallOutcome {
331 #[serde(rename = "timeout")]
332 Timeout {},
333 #[serde(rename = "exit")]
334 Exit { exit_code: i32 },
335}
336
337#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
338#[serde(tag = "type")]
339pub enum ApplyPatchOperation {
340 #[serde(rename = "create_file")]
341 CreateFile { diff: String, path: String },
342 #[serde(rename = "delete_file")]
343 DeleteFile { path: String },
344 #[serde(rename = "update_file")]
345 UpdateFile { diff: String, path: String },
346}
347
348#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
349pub struct McpToolDescription {
350 pub input_schema: Value,
351 pub name: String,
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub annotations: Option<Value>,
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub description: Option<String>,
356 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
357 pub extra: Extra,
358}