Skip to main content

gproxy_protocol/protocol/openai/generate_content/response_items/
actions.rs

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}