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