1#![allow(clippy::large_enum_variant)]
13
14use std::collections::HashMap;
15
16use serde::{Deserialize, Serialize};
17
18#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
20pub enum ActionEditFileDiffLineLineAction {
21 #[default]
22 Unspecified,
23 Insert,
24 Delete,
25 None,
26 Unknown(String),
32}
33
34impl ActionEditFileDiffLineLineAction {
35 pub fn as_str(&self) -> &str {
37 match self {
38 Self::Unspecified => "LINE_ACTION_UNSPECIFIED",
39 Self::Insert => "LINE_ACTION_INSERT",
40 Self::Delete => "LINE_ACTION_DELETE",
41 Self::None => "LINE_ACTION_NONE",
42 Self::Unknown(s) => s,
43 }
44 }
45}
46
47impl std::fmt::Display for ActionEditFileDiffLineLineAction {
48 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49 f.write_str(self.as_str())
50 }
51}
52
53impl Serialize for ActionEditFileDiffLineLineAction {
54 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
55 s.serialize_str(self.as_str())
56 }
57}
58
59impl<'de> Deserialize<'de> for ActionEditFileDiffLineLineAction {
60 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
61 Ok(match crate::wire::EnumRepr::deserialize(d)? {
62 crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_UNSPECIFIED" => Self::Unspecified,
63 crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_INSERT" => Self::Insert,
64 crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_DELETE" => Self::Delete,
65 crate::wire::EnumRepr::Name(n) if n == "LINE_ACTION_NONE" => Self::None,
66 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
67 crate::wire::EnumRepr::Number(1) => Self::Insert,
68 crate::wire::EnumRepr::Number(2) => Self::Delete,
69 crate::wire::EnumRepr::Number(3) => Self::None,
70 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
71 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
72 })
73 }
74}
75
76#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
78pub enum AudioContentMimeType {
79 #[default]
80 TypeUnspecified,
81 TypeWav,
82 TypeMp3,
83 TypeAiff,
84 TypeAac,
85 TypeOgg,
86 TypeFlac,
87 TypeMpeg,
88 TypeM4a,
89 TypeL16,
90 TypeS16le,
91 TypeOpus,
92 TypeAlaw,
93 TypeMulaw,
94 TypeVideoAudioS16le,
95 Unknown(String),
101}
102
103impl AudioContentMimeType {
104 pub fn as_str(&self) -> &str {
106 match self {
107 Self::TypeUnspecified => "TYPE_UNSPECIFIED",
108 Self::TypeWav => "TYPE_WAV",
109 Self::TypeMp3 => "TYPE_MP3",
110 Self::TypeAiff => "TYPE_AIFF",
111 Self::TypeAac => "TYPE_AAC",
112 Self::TypeOgg => "TYPE_OGG",
113 Self::TypeFlac => "TYPE_FLAC",
114 Self::TypeMpeg => "TYPE_MPEG",
115 Self::TypeM4a => "TYPE_M4A",
116 Self::TypeL16 => "TYPE_L16",
117 Self::TypeS16le => "TYPE_S16LE",
118 Self::TypeOpus => "TYPE_OPUS",
119 Self::TypeAlaw => "TYPE_ALAW",
120 Self::TypeMulaw => "TYPE_MULAW",
121 Self::TypeVideoAudioS16le => "TYPE_VIDEO_AUDIO_S16LE",
122 Self::Unknown(s) => s,
123 }
124 }
125}
126
127impl std::fmt::Display for AudioContentMimeType {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 f.write_str(self.as_str())
130 }
131}
132
133impl Serialize for AudioContentMimeType {
134 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
135 s.serialize_str(self.as_str())
136 }
137}
138
139impl<'de> Deserialize<'de> for AudioContentMimeType {
140 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
141 Ok(match crate::wire::EnumRepr::deserialize(d)? {
142 crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
143 crate::wire::EnumRepr::Name(n) if n == "TYPE_WAV" => Self::TypeWav,
144 crate::wire::EnumRepr::Name(n) if n == "TYPE_MP3" => Self::TypeMp3,
145 crate::wire::EnumRepr::Name(n) if n == "TYPE_AIFF" => Self::TypeAiff,
146 crate::wire::EnumRepr::Name(n) if n == "TYPE_AAC" => Self::TypeAac,
147 crate::wire::EnumRepr::Name(n) if n == "TYPE_OGG" => Self::TypeOgg,
148 crate::wire::EnumRepr::Name(n) if n == "TYPE_FLAC" => Self::TypeFlac,
149 crate::wire::EnumRepr::Name(n) if n == "TYPE_MPEG" => Self::TypeMpeg,
150 crate::wire::EnumRepr::Name(n) if n == "TYPE_M4A" => Self::TypeM4a,
151 crate::wire::EnumRepr::Name(n) if n == "TYPE_L16" => Self::TypeL16,
152 crate::wire::EnumRepr::Name(n) if n == "TYPE_S16LE" => Self::TypeS16le,
153 crate::wire::EnumRepr::Name(n) if n == "TYPE_OPUS" => Self::TypeOpus,
154 crate::wire::EnumRepr::Name(n) if n == "TYPE_ALAW" => Self::TypeAlaw,
155 crate::wire::EnumRepr::Name(n) if n == "TYPE_MULAW" => Self::TypeMulaw,
156 crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_AUDIO_S16LE" => {
157 Self::TypeVideoAudioS16le
158 }
159 crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
160 crate::wire::EnumRepr::Number(1) => Self::TypeWav,
161 crate::wire::EnumRepr::Number(2) => Self::TypeMp3,
162 crate::wire::EnumRepr::Number(3) => Self::TypeAiff,
163 crate::wire::EnumRepr::Number(4) => Self::TypeAac,
164 crate::wire::EnumRepr::Number(5) => Self::TypeOgg,
165 crate::wire::EnumRepr::Number(6) => Self::TypeFlac,
166 crate::wire::EnumRepr::Number(7) => Self::TypeMpeg,
167 crate::wire::EnumRepr::Number(8) => Self::TypeM4a,
168 crate::wire::EnumRepr::Number(9) => Self::TypeL16,
169 crate::wire::EnumRepr::Number(10) => Self::TypeS16le,
170 crate::wire::EnumRepr::Number(11) => Self::TypeOpus,
171 crate::wire::EnumRepr::Number(12) => Self::TypeAlaw,
172 crate::wire::EnumRepr::Number(13) => Self::TypeMulaw,
173 crate::wire::EnumRepr::Number(14) => Self::TypeVideoAudioS16le,
174 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
175 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
176 })
177 }
178}
179
180#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
182pub enum CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
183 #[default]
184 Unspecified,
185 Python,
186 Unknown(String),
192}
193
194impl CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
195 pub fn as_str(&self) -> &str {
197 match self {
198 Self::Unspecified => "LANGUAGE_UNSPECIFIED",
199 Self::Python => "PYTHON",
200 Self::Unknown(s) => s,
201 }
202 }
203}
204
205impl std::fmt::Display for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
206 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
207 f.write_str(self.as_str())
208 }
209}
210
211impl Serialize for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
212 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
213 s.serialize_str(self.as_str())
214 }
215}
216
217impl<'de> Deserialize<'de> for CodeExecutionCallContentCodeExecutionCallArgumentsLanguage {
218 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
219 Ok(match crate::wire::EnumRepr::deserialize(d)? {
220 crate::wire::EnumRepr::Name(n) if n == "LANGUAGE_UNSPECIFIED" => Self::Unspecified,
221 crate::wire::EnumRepr::Name(n) if n == "PYTHON" => Self::Python,
222 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
223 crate::wire::EnumRepr::Number(1) => Self::Python,
224 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
225 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
226 })
227 }
228}
229
230#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
232pub enum DocumentContentMimeType {
233 #[default]
234 TypeUnspecified,
235 TypePdf,
236 TypeCsv,
237 Unknown(String),
243}
244
245impl DocumentContentMimeType {
246 pub fn as_str(&self) -> &str {
248 match self {
249 Self::TypeUnspecified => "TYPE_UNSPECIFIED",
250 Self::TypePdf => "TYPE_PDF",
251 Self::TypeCsv => "TYPE_CSV",
252 Self::Unknown(s) => s,
253 }
254 }
255}
256
257impl std::fmt::Display for DocumentContentMimeType {
258 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
259 f.write_str(self.as_str())
260 }
261}
262
263impl Serialize for DocumentContentMimeType {
264 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
265 s.serialize_str(self.as_str())
266 }
267}
268
269impl<'de> Deserialize<'de> for DocumentContentMimeType {
270 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
271 Ok(match crate::wire::EnumRepr::deserialize(d)? {
272 crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
273 crate::wire::EnumRepr::Name(n) if n == "TYPE_PDF" => Self::TypePdf,
274 crate::wire::EnumRepr::Name(n) if n == "TYPE_CSV" => Self::TypeCsv,
275 crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
276 crate::wire::EnumRepr::Number(1) => Self::TypePdf,
277 crate::wire::EnumRepr::Number(2) => Self::TypeCsv,
278 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
279 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
280 })
281 }
282}
283
284#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
286pub enum GoogleSearchSearchType {
287 #[default]
288 Unspecified,
289 WebSearch,
290 ImageSearch,
291 EnterpriseWebSearch,
292 Unknown(String),
298}
299
300impl GoogleSearchSearchType {
301 pub fn as_str(&self) -> &str {
303 match self {
304 Self::Unspecified => "SEARCH_TYPE_UNSPECIFIED",
305 Self::WebSearch => "SEARCH_TYPE_WEB_SEARCH",
306 Self::ImageSearch => "SEARCH_TYPE_IMAGE_SEARCH",
307 Self::EnterpriseWebSearch => "SEARCH_TYPE_ENTERPRISE_WEB_SEARCH",
308 Self::Unknown(s) => s,
309 }
310 }
311}
312
313impl std::fmt::Display for GoogleSearchSearchType {
314 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
315 f.write_str(self.as_str())
316 }
317}
318
319impl Serialize for GoogleSearchSearchType {
320 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
321 s.serialize_str(self.as_str())
322 }
323}
324
325impl<'de> Deserialize<'de> for GoogleSearchSearchType {
326 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
327 Ok(match crate::wire::EnumRepr::deserialize(d)? {
328 crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_UNSPECIFIED" => Self::Unspecified,
329 crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_WEB_SEARCH" => Self::WebSearch,
330 crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_IMAGE_SEARCH" => Self::ImageSearch,
331 crate::wire::EnumRepr::Name(n) if n == "SEARCH_TYPE_ENTERPRISE_WEB_SEARCH" => {
332 Self::EnterpriseWebSearch
333 }
334 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
335 crate::wire::EnumRepr::Number(1) => Self::WebSearch,
336 crate::wire::EnumRepr::Number(2) => Self::ImageSearch,
337 crate::wire::EnumRepr::Number(3) => Self::EnterpriseWebSearch,
338 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
339 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
340 })
341 }
342}
343
344#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
346pub enum HarnessConfigSessionContinuationMode {
347 #[default]
348 Unspecified,
349 Resume,
350 CreateOrResume,
351 CreateOnly,
352 Unknown(String),
358}
359
360impl HarnessConfigSessionContinuationMode {
361 pub fn as_str(&self) -> &str {
363 match self {
364 Self::Unspecified => "SESSION_CONTINUATION_MODE_UNSPECIFIED",
365 Self::Resume => "RESUME",
366 Self::CreateOrResume => "CREATE_OR_RESUME",
367 Self::CreateOnly => "CREATE_ONLY",
368 Self::Unknown(s) => s,
369 }
370 }
371}
372
373impl std::fmt::Display for HarnessConfigSessionContinuationMode {
374 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
375 f.write_str(self.as_str())
376 }
377}
378
379impl Serialize for HarnessConfigSessionContinuationMode {
380 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
381 s.serialize_str(self.as_str())
382 }
383}
384
385impl<'de> Deserialize<'de> for HarnessConfigSessionContinuationMode {
386 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
387 Ok(match crate::wire::EnumRepr::deserialize(d)? {
388 crate::wire::EnumRepr::Name(n) if n == "SESSION_CONTINUATION_MODE_UNSPECIFIED" => {
389 Self::Unspecified
390 }
391 crate::wire::EnumRepr::Name(n) if n == "RESUME" => Self::Resume,
392 crate::wire::EnumRepr::Name(n) if n == "CREATE_OR_RESUME" => Self::CreateOrResume,
393 crate::wire::EnumRepr::Name(n) if n == "CREATE_ONLY" => Self::CreateOnly,
394 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
395 crate::wire::EnumRepr::Number(1) => Self::Resume,
396 crate::wire::EnumRepr::Number(2) => Self::CreateOrResume,
397 crate::wire::EnumRepr::Number(3) => Self::CreateOnly,
398 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
399 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
400 })
401 }
402}
403
404#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
406pub enum ImageContentMimeType {
407 #[default]
408 TypeUnspecified,
409 TypePng,
410 TypeJpeg,
411 TypeWebp,
412 TypeHeic,
413 TypeHeif,
414 TypeGif,
415 TypeBmp,
416 TypeTiff,
417 TypeVideoFrameJpeg2000,
418 TypeVideoJpeg2000,
419 Unknown(String),
425}
426
427impl ImageContentMimeType {
428 pub fn as_str(&self) -> &str {
430 match self {
431 Self::TypeUnspecified => "TYPE_UNSPECIFIED",
432 Self::TypePng => "TYPE_PNG",
433 Self::TypeJpeg => "TYPE_JPEG",
434 Self::TypeWebp => "TYPE_WEBP",
435 Self::TypeHeic => "TYPE_HEIC",
436 Self::TypeHeif => "TYPE_HEIF",
437 Self::TypeGif => "TYPE_GIF",
438 Self::TypeBmp => "TYPE_BMP",
439 Self::TypeTiff => "TYPE_TIFF",
440 Self::TypeVideoFrameJpeg2000 => "TYPE_VIDEO_FRAME_JPEG2000",
441 Self::TypeVideoJpeg2000 => "TYPE_VIDEO_JPEG2000",
442 Self::Unknown(s) => s,
443 }
444 }
445}
446
447impl std::fmt::Display for ImageContentMimeType {
448 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
449 f.write_str(self.as_str())
450 }
451}
452
453impl Serialize for ImageContentMimeType {
454 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
455 s.serialize_str(self.as_str())
456 }
457}
458
459impl<'de> Deserialize<'de> for ImageContentMimeType {
460 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
461 Ok(match crate::wire::EnumRepr::deserialize(d)? {
462 crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
463 crate::wire::EnumRepr::Name(n) if n == "TYPE_PNG" => Self::TypePng,
464 crate::wire::EnumRepr::Name(n) if n == "TYPE_JPEG" => Self::TypeJpeg,
465 crate::wire::EnumRepr::Name(n) if n == "TYPE_WEBP" => Self::TypeWebp,
466 crate::wire::EnumRepr::Name(n) if n == "TYPE_HEIC" => Self::TypeHeic,
467 crate::wire::EnumRepr::Name(n) if n == "TYPE_HEIF" => Self::TypeHeif,
468 crate::wire::EnumRepr::Name(n) if n == "TYPE_GIF" => Self::TypeGif,
469 crate::wire::EnumRepr::Name(n) if n == "TYPE_BMP" => Self::TypeBmp,
470 crate::wire::EnumRepr::Name(n) if n == "TYPE_TIFF" => Self::TypeTiff,
471 crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_FRAME_JPEG2000" => {
472 Self::TypeVideoFrameJpeg2000
473 }
474 crate::wire::EnumRepr::Name(n) if n == "TYPE_VIDEO_JPEG2000" => Self::TypeVideoJpeg2000,
475 crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
476 crate::wire::EnumRepr::Number(1) => Self::TypePng,
477 crate::wire::EnumRepr::Number(2) => Self::TypeJpeg,
478 crate::wire::EnumRepr::Number(3) => Self::TypeWebp,
479 crate::wire::EnumRepr::Number(4) => Self::TypeHeic,
480 crate::wire::EnumRepr::Number(5) => Self::TypeHeif,
481 crate::wire::EnumRepr::Number(7) => Self::TypeGif,
482 crate::wire::EnumRepr::Number(8) => Self::TypeBmp,
483 crate::wire::EnumRepr::Number(9) => Self::TypeTiff,
484 crate::wire::EnumRepr::Number(10) => Self::TypeVideoFrameJpeg2000,
485 crate::wire::EnumRepr::Number(11) => Self::TypeVideoJpeg2000,
486 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
487 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
488 })
489 }
490}
491
492#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
494pub enum LifecycleHook {
495 #[default]
496 Unspecified,
497 OnSessionStart,
498 OnSessionEnd,
499 PreTurn,
500 PostTurn,
501 PreTool,
502 PostTool,
503 OnToolError,
504 Unknown(String),
510}
511
512impl LifecycleHook {
513 pub fn as_str(&self) -> &str {
515 match self {
516 Self::Unspecified => "LIFECYCLE_HOOK_UNSPECIFIED",
517 Self::OnSessionStart => "LIFECYCLE_HOOK_ON_SESSION_START",
518 Self::OnSessionEnd => "LIFECYCLE_HOOK_ON_SESSION_END",
519 Self::PreTurn => "LIFECYCLE_HOOK_PRE_TURN",
520 Self::PostTurn => "LIFECYCLE_HOOK_POST_TURN",
521 Self::PreTool => "LIFECYCLE_HOOK_PRE_TOOL",
522 Self::PostTool => "LIFECYCLE_HOOK_POST_TOOL",
523 Self::OnToolError => "LIFECYCLE_HOOK_ON_TOOL_ERROR",
524 Self::Unknown(s) => s,
525 }
526 }
527}
528
529impl std::fmt::Display for LifecycleHook {
530 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
531 f.write_str(self.as_str())
532 }
533}
534
535impl Serialize for LifecycleHook {
536 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
537 s.serialize_str(self.as_str())
538 }
539}
540
541impl<'de> Deserialize<'de> for LifecycleHook {
542 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
543 Ok(match crate::wire::EnumRepr::deserialize(d)? {
544 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_UNSPECIFIED" => {
545 Self::Unspecified
546 }
547 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_SESSION_START" => {
548 Self::OnSessionStart
549 }
550 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_SESSION_END" => {
551 Self::OnSessionEnd
552 }
553 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_PRE_TURN" => Self::PreTurn,
554 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_POST_TURN" => Self::PostTurn,
555 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_PRE_TOOL" => Self::PreTool,
556 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_POST_TOOL" => Self::PostTool,
557 crate::wire::EnumRepr::Name(n) if n == "LIFECYCLE_HOOK_ON_TOOL_ERROR" => {
558 Self::OnToolError
559 }
560 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
561 crate::wire::EnumRepr::Number(1) => Self::OnSessionStart,
562 crate::wire::EnumRepr::Number(2) => Self::OnSessionEnd,
563 crate::wire::EnumRepr::Number(3) => Self::PreTurn,
564 crate::wire::EnumRepr::Number(4) => Self::PostTurn,
565 crate::wire::EnumRepr::Number(5) => Self::PreTool,
566 crate::wire::EnumRepr::Number(6) => Self::PostTool,
567 crate::wire::EnumRepr::Number(7) => Self::OnToolError,
568 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
569 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
570 })
571 }
572}
573
574#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
576pub enum McpServerConfigAuthProviderType {
577 #[default]
578 Unspecified,
579 GoogleCredentials,
580 Unknown(String),
586}
587
588impl McpServerConfigAuthProviderType {
589 pub fn as_str(&self) -> &str {
591 match self {
592 Self::Unspecified => "AUTH_PROVIDER_TYPE_UNSPECIFIED",
593 Self::GoogleCredentials => "AUTH_PROVIDER_TYPE_GOOGLE_CREDENTIALS",
594 Self::Unknown(s) => s,
595 }
596 }
597}
598
599impl std::fmt::Display for McpServerConfigAuthProviderType {
600 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
601 f.write_str(self.as_str())
602 }
603}
604
605impl Serialize for McpServerConfigAuthProviderType {
606 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
607 s.serialize_str(self.as_str())
608 }
609}
610
611impl<'de> Deserialize<'de> for McpServerConfigAuthProviderType {
612 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
613 Ok(match crate::wire::EnumRepr::deserialize(d)? {
614 crate::wire::EnumRepr::Name(n) if n == "AUTH_PROVIDER_TYPE_UNSPECIFIED" => {
615 Self::Unspecified
616 }
617 crate::wire::EnumRepr::Name(n) if n == "AUTH_PROVIDER_TYPE_GOOGLE_CREDENTIALS" => {
618 Self::GoogleCredentials
619 }
620 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
621 crate::wire::EnumRepr::Number(1) => Self::GoogleCredentials,
622 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
623 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
624 })
625 }
626}
627
628#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
630pub enum MediaResolution {
631 #[default]
632 Unspecified,
633 Low,
634 Medium,
635 High,
636 UltraHigh,
637 Unknown(String),
643}
644
645impl MediaResolution {
646 pub fn as_str(&self) -> &str {
648 match self {
649 Self::Unspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
650 Self::Low => "LOW",
651 Self::Medium => "MEDIUM",
652 Self::High => "HIGH",
653 Self::UltraHigh => "ULTRA_HIGH",
654 Self::Unknown(s) => s,
655 }
656 }
657}
658
659impl std::fmt::Display for MediaResolution {
660 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
661 f.write_str(self.as_str())
662 }
663}
664
665impl Serialize for MediaResolution {
666 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
667 s.serialize_str(self.as_str())
668 }
669}
670
671impl<'de> Deserialize<'de> for MediaResolution {
672 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
673 Ok(match crate::wire::EnumRepr::deserialize(d)? {
674 crate::wire::EnumRepr::Name(n) if n == "MEDIA_RESOLUTION_UNSPECIFIED" => {
675 Self::Unspecified
676 }
677 crate::wire::EnumRepr::Name(n) if n == "LOW" => Self::Low,
678 crate::wire::EnumRepr::Name(n) if n == "MEDIUM" => Self::Medium,
679 crate::wire::EnumRepr::Name(n) if n == "HIGH" => Self::High,
680 crate::wire::EnumRepr::Name(n) if n == "ULTRA_HIGH" => Self::UltraHigh,
681 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
682 crate::wire::EnumRepr::Number(1) => Self::Low,
683 crate::wire::EnumRepr::Number(2) => Self::Medium,
684 crate::wire::EnumRepr::Number(3) => Self::High,
685 crate::wire::EnumRepr::Number(4) => Self::UltraHigh,
686 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
687 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
688 })
689 }
690}
691
692#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
694pub enum ModelType {
695 #[default]
696 Unspecified,
697 Text,
698 Image,
699 Unknown(String),
705}
706
707impl ModelType {
708 pub fn as_str(&self) -> &str {
710 match self {
711 Self::Unspecified => "MODEL_TYPE_UNSPECIFIED",
712 Self::Text => "MODEL_TYPE_TEXT",
713 Self::Image => "MODEL_TYPE_IMAGE",
714 Self::Unknown(s) => s,
715 }
716 }
717}
718
719impl std::fmt::Display for ModelType {
720 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
721 f.write_str(self.as_str())
722 }
723}
724
725impl Serialize for ModelType {
726 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
727 s.serialize_str(self.as_str())
728 }
729}
730
731impl<'de> Deserialize<'de> for ModelType {
732 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
733 Ok(match crate::wire::EnumRepr::deserialize(d)? {
734 crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_UNSPECIFIED" => Self::Unspecified,
735 crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_TEXT" => Self::Text,
736 crate::wire::EnumRepr::Name(n) if n == "MODEL_TYPE_IMAGE" => Self::Image,
737 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
738 crate::wire::EnumRepr::Number(1) => Self::Text,
739 crate::wire::EnumRepr::Number(2) => Self::Image,
740 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
741 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
742 })
743 }
744}
745
746#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
748pub enum NullValue {
749 #[default]
750 NullValue,
751 Unknown(String),
757}
758
759impl NullValue {
760 pub fn as_str(&self) -> &str {
762 match self {
763 Self::NullValue => "NULL_VALUE",
764 Self::Unknown(s) => s,
765 }
766 }
767}
768
769impl std::fmt::Display for NullValue {
770 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
771 f.write_str(self.as_str())
772 }
773}
774
775impl Serialize for NullValue {
776 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
777 s.serialize_str(self.as_str())
778 }
779}
780
781impl<'de> Deserialize<'de> for NullValue {
782 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
783 Ok(match crate::wire::EnumRepr::deserialize(d)? {
784 crate::wire::EnumRepr::Name(n) if n == "NULL_VALUE" => Self::NullValue,
785 crate::wire::EnumRepr::Number(0) => Self::NullValue,
786 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
787 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
788 })
789 }
790}
791
792#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
794pub enum PolicyDecision {
795 #[default]
796 Unspecified,
797 Allow,
798 Deny,
799 AskUser,
800 Unknown(String),
806}
807
808impl PolicyDecision {
809 pub fn as_str(&self) -> &str {
811 match self {
812 Self::Unspecified => "POLICY_DECISION_UNSPECIFIED",
813 Self::Allow => "POLICY_DECISION_ALLOW",
814 Self::Deny => "POLICY_DECISION_DENY",
815 Self::AskUser => "POLICY_DECISION_ASK_USER",
816 Self::Unknown(s) => s,
817 }
818 }
819}
820
821impl std::fmt::Display for PolicyDecision {
822 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
823 f.write_str(self.as_str())
824 }
825}
826
827impl Serialize for PolicyDecision {
828 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
829 s.serialize_str(self.as_str())
830 }
831}
832
833impl<'de> Deserialize<'de> for PolicyDecision {
834 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
835 Ok(match crate::wire::EnumRepr::deserialize(d)? {
836 crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_UNSPECIFIED" => {
837 Self::Unspecified
838 }
839 crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_ALLOW" => Self::Allow,
840 crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_DENY" => Self::Deny,
841 crate::wire::EnumRepr::Name(n) if n == "POLICY_DECISION_ASK_USER" => Self::AskUser,
842 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
843 crate::wire::EnumRepr::Number(1) => Self::Allow,
844 crate::wire::EnumRepr::Number(2) => Self::Deny,
845 crate::wire::EnumRepr::Number(3) => Self::AskUser,
846 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
847 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
848 })
849 }
850}
851
852#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
854pub enum PolicyEvaluationOutcome {
855 #[default]
856 Unspecified,
857 Allow,
858 Deny,
859 NoMatch,
860 Unknown(String),
866}
867
868impl PolicyEvaluationOutcome {
869 pub fn as_str(&self) -> &str {
871 match self {
872 Self::Unspecified => "POLICY_EVALUATION_OUTCOME_UNSPECIFIED",
873 Self::Allow => "POLICY_EVALUATION_OUTCOME_ALLOW",
874 Self::Deny => "POLICY_EVALUATION_OUTCOME_DENY",
875 Self::NoMatch => "POLICY_EVALUATION_OUTCOME_NO_MATCH",
876 Self::Unknown(s) => s,
877 }
878 }
879}
880
881impl std::fmt::Display for PolicyEvaluationOutcome {
882 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
883 f.write_str(self.as_str())
884 }
885}
886
887impl Serialize for PolicyEvaluationOutcome {
888 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
889 s.serialize_str(self.as_str())
890 }
891}
892
893impl<'de> Deserialize<'de> for PolicyEvaluationOutcome {
894 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
895 Ok(match crate::wire::EnumRepr::deserialize(d)? {
896 crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_UNSPECIFIED" => {
897 Self::Unspecified
898 }
899 crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_ALLOW" => Self::Allow,
900 crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_DENY" => Self::Deny,
901 crate::wire::EnumRepr::Name(n) if n == "POLICY_EVALUATION_OUTCOME_NO_MATCH" => {
902 Self::NoMatch
903 }
904 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
905 crate::wire::EnumRepr::Number(1) => Self::Allow,
906 crate::wire::EnumRepr::Number(2) => Self::Deny,
907 crate::wire::EnumRepr::Number(3) => Self::NoMatch,
908 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
909 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
910 })
911 }
912}
913
914#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
916pub enum PreToolResultDecision {
917 #[default]
918 Unspecified,
919 Allow,
920 Deny,
921 Unknown(String),
927}
928
929impl PreToolResultDecision {
930 pub fn as_str(&self) -> &str {
932 match self {
933 Self::Unspecified => "DECISION_UNSPECIFIED",
934 Self::Allow => "ALLOW",
935 Self::Deny => "DENY",
936 Self::Unknown(s) => s,
937 }
938 }
939}
940
941impl std::fmt::Display for PreToolResultDecision {
942 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
943 f.write_str(self.as_str())
944 }
945}
946
947impl Serialize for PreToolResultDecision {
948 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
949 s.serialize_str(self.as_str())
950 }
951}
952
953impl<'de> Deserialize<'de> for PreToolResultDecision {
954 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
955 Ok(match crate::wire::EnumRepr::deserialize(d)? {
956 crate::wire::EnumRepr::Name(n) if n == "DECISION_UNSPECIFIED" => Self::Unspecified,
957 crate::wire::EnumRepr::Name(n) if n == "ALLOW" => Self::Allow,
958 crate::wire::EnumRepr::Name(n) if n == "DENY" => Self::Deny,
959 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
960 crate::wire::EnumRepr::Number(1) => Self::Allow,
961 crate::wire::EnumRepr::Number(2) => Self::Deny,
962 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
963 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
964 })
965 }
966}
967
968#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
970pub enum PreTurnResultDecision {
971 #[default]
972 Unspecified,
973 Allow,
974 Deny,
975 Unknown(String),
981}
982
983impl PreTurnResultDecision {
984 pub fn as_str(&self) -> &str {
986 match self {
987 Self::Unspecified => "DECISION_UNSPECIFIED",
988 Self::Allow => "ALLOW",
989 Self::Deny => "DENY",
990 Self::Unknown(s) => s,
991 }
992 }
993}
994
995impl std::fmt::Display for PreTurnResultDecision {
996 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
997 f.write_str(self.as_str())
998 }
999}
1000
1001impl Serialize for PreTurnResultDecision {
1002 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1003 s.serialize_str(self.as_str())
1004 }
1005}
1006
1007impl<'de> Deserialize<'de> for PreTurnResultDecision {
1008 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1009 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1010 crate::wire::EnumRepr::Name(n) if n == "DECISION_UNSPECIFIED" => Self::Unspecified,
1011 crate::wire::EnumRepr::Name(n) if n == "ALLOW" => Self::Allow,
1012 crate::wire::EnumRepr::Name(n) if n == "DENY" => Self::Deny,
1013 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1014 crate::wire::EnumRepr::Number(1) => Self::Allow,
1015 crate::wire::EnumRepr::Number(2) => Self::Deny,
1016 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1017 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1018 })
1019 }
1020}
1021
1022#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1024pub enum StepUpdateSource {
1025 #[default]
1026 Unspecified,
1027 System,
1028 User,
1029 Model,
1030 Unknown(String),
1036}
1037
1038impl StepUpdateSource {
1039 pub fn as_str(&self) -> &str {
1041 match self {
1042 Self::Unspecified => "SOURCE_UNSPECIFIED",
1043 Self::System => "SOURCE_SYSTEM",
1044 Self::User => "SOURCE_USER",
1045 Self::Model => "SOURCE_MODEL",
1046 Self::Unknown(s) => s,
1047 }
1048 }
1049}
1050
1051impl std::fmt::Display for StepUpdateSource {
1052 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1053 f.write_str(self.as_str())
1054 }
1055}
1056
1057impl Serialize for StepUpdateSource {
1058 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1059 s.serialize_str(self.as_str())
1060 }
1061}
1062
1063impl<'de> Deserialize<'de> for StepUpdateSource {
1064 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1065 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1066 crate::wire::EnumRepr::Name(n) if n == "SOURCE_UNSPECIFIED" => Self::Unspecified,
1067 crate::wire::EnumRepr::Name(n) if n == "SOURCE_SYSTEM" => Self::System,
1068 crate::wire::EnumRepr::Name(n) if n == "SOURCE_USER" => Self::User,
1069 crate::wire::EnumRepr::Name(n) if n == "SOURCE_MODEL" => Self::Model,
1070 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1071 crate::wire::EnumRepr::Number(1) => Self::System,
1072 crate::wire::EnumRepr::Number(2) => Self::User,
1073 crate::wire::EnumRepr::Number(3) => Self::Model,
1074 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1075 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1076 })
1077 }
1078}
1079
1080#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1082pub enum StepUpdateState {
1083 #[default]
1084 Unspecified,
1085 Active,
1086 Done,
1087 WaitingForUser,
1088 Error,
1089 Unknown(String),
1095}
1096
1097impl StepUpdateState {
1098 pub fn as_str(&self) -> &str {
1100 match self {
1101 Self::Unspecified => "STATE_UNSPECIFIED",
1102 Self::Active => "STATE_ACTIVE",
1103 Self::Done => "STATE_DONE",
1104 Self::WaitingForUser => "STATE_WAITING_FOR_USER",
1105 Self::Error => "STATE_ERROR",
1106 Self::Unknown(s) => s,
1107 }
1108 }
1109}
1110
1111impl std::fmt::Display for StepUpdateState {
1112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1113 f.write_str(self.as_str())
1114 }
1115}
1116
1117impl Serialize for StepUpdateState {
1118 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1119 s.serialize_str(self.as_str())
1120 }
1121}
1122
1123impl<'de> Deserialize<'de> for StepUpdateState {
1124 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1125 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1126 crate::wire::EnumRepr::Name(n) if n == "STATE_UNSPECIFIED" => Self::Unspecified,
1127 crate::wire::EnumRepr::Name(n) if n == "STATE_ACTIVE" => Self::Active,
1128 crate::wire::EnumRepr::Name(n) if n == "STATE_DONE" => Self::Done,
1129 crate::wire::EnumRepr::Name(n) if n == "STATE_WAITING_FOR_USER" => Self::WaitingForUser,
1130 crate::wire::EnumRepr::Name(n) if n == "STATE_ERROR" => Self::Error,
1131 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1132 crate::wire::EnumRepr::Number(1) => Self::Active,
1133 crate::wire::EnumRepr::Number(2) => Self::Done,
1134 crate::wire::EnumRepr::Number(3) => Self::WaitingForUser,
1135 crate::wire::EnumRepr::Number(4) => Self::Error,
1136 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1137 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1138 })
1139 }
1140}
1141
1142#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1144pub enum StepUpdateTarget {
1145 #[default]
1146 Unspecified,
1147 User,
1148 Model,
1149 Environment,
1150 Unknown(String),
1156}
1157
1158impl StepUpdateTarget {
1159 pub fn as_str(&self) -> &str {
1161 match self {
1162 Self::Unspecified => "TARGET_UNSPECIFIED",
1163 Self::User => "TARGET_USER",
1164 Self::Model => "TARGET_MODEL",
1165 Self::Environment => "TARGET_ENVIRONMENT",
1166 Self::Unknown(s) => s,
1167 }
1168 }
1169}
1170
1171impl std::fmt::Display for StepUpdateTarget {
1172 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1173 f.write_str(self.as_str())
1174 }
1175}
1176
1177impl Serialize for StepUpdateTarget {
1178 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1179 s.serialize_str(self.as_str())
1180 }
1181}
1182
1183impl<'de> Deserialize<'de> for StepUpdateTarget {
1184 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1185 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1186 crate::wire::EnumRepr::Name(n) if n == "TARGET_UNSPECIFIED" => Self::Unspecified,
1187 crate::wire::EnumRepr::Name(n) if n == "TARGET_USER" => Self::User,
1188 crate::wire::EnumRepr::Name(n) if n == "TARGET_MODEL" => Self::Model,
1189 crate::wire::EnumRepr::Name(n) if n == "TARGET_ENVIRONMENT" => Self::Environment,
1190 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1191 crate::wire::EnumRepr::Number(1) => Self::User,
1192 crate::wire::EnumRepr::Number(2) => Self::Model,
1193 crate::wire::EnumRepr::Number(3) => Self::Environment,
1194 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1195 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1196 })
1197 }
1198}
1199
1200#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1202pub enum TrajectoryStateUpdateState {
1203 #[default]
1204 Unspecified,
1205 Running,
1206 FullyIdle,
1207 Cancelled,
1208 WaitingForTasks,
1209 Unknown(String),
1215}
1216
1217impl TrajectoryStateUpdateState {
1218 pub fn as_str(&self) -> &str {
1220 match self {
1221 Self::Unspecified => "STATE_UNSPECIFIED",
1222 Self::Running => "STATE_RUNNING",
1223 Self::FullyIdle => "STATE_FULLY_IDLE",
1224 Self::Cancelled => "STATE_CANCELLED",
1225 Self::WaitingForTasks => "STATE_WAITING_FOR_TASKS",
1226 Self::Unknown(s) => s,
1227 }
1228 }
1229}
1230
1231impl std::fmt::Display for TrajectoryStateUpdateState {
1232 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1233 f.write_str(self.as_str())
1234 }
1235}
1236
1237impl Serialize for TrajectoryStateUpdateState {
1238 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1239 s.serialize_str(self.as_str())
1240 }
1241}
1242
1243impl<'de> Deserialize<'de> for TrajectoryStateUpdateState {
1244 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1245 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1246 crate::wire::EnumRepr::Name(n) if n == "STATE_UNSPECIFIED" => Self::Unspecified,
1247 crate::wire::EnumRepr::Name(n) if n == "STATE_RUNNING" => Self::Running,
1248 crate::wire::EnumRepr::Name(n) if n == "STATE_FULLY_IDLE" => Self::FullyIdle,
1249 crate::wire::EnumRepr::Name(n) if n == "STATE_CANCELLED" => Self::Cancelled,
1250 crate::wire::EnumRepr::Name(n) if n == "STATE_WAITING_FOR_TASKS" => {
1251 Self::WaitingForTasks
1252 }
1253 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1254 crate::wire::EnumRepr::Number(1) => Self::Running,
1255 crate::wire::EnumRepr::Number(2) => Self::FullyIdle,
1256 crate::wire::EnumRepr::Number(3) => Self::Cancelled,
1257 crate::wire::EnumRepr::Number(4) => Self::WaitingForTasks,
1258 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1259 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1260 })
1261 }
1262}
1263
1264#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1266pub enum UrlContextResultContentUrlContextResultStatus {
1267 #[default]
1268 Unspecified,
1269 Success,
1270 Error,
1271 Paywall,
1272 Unsafe,
1273 Unknown(String),
1279}
1280
1281impl UrlContextResultContentUrlContextResultStatus {
1282 pub fn as_str(&self) -> &str {
1284 match self {
1285 Self::Unspecified => "STATUS_UNSPECIFIED",
1286 Self::Success => "SUCCESS",
1287 Self::Error => "ERROR",
1288 Self::Paywall => "PAYWALL",
1289 Self::Unsafe => "UNSAFE",
1290 Self::Unknown(s) => s,
1291 }
1292 }
1293}
1294
1295impl std::fmt::Display for UrlContextResultContentUrlContextResultStatus {
1296 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1297 f.write_str(self.as_str())
1298 }
1299}
1300
1301impl Serialize for UrlContextResultContentUrlContextResultStatus {
1302 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1303 s.serialize_str(self.as_str())
1304 }
1305}
1306
1307impl<'de> Deserialize<'de> for UrlContextResultContentUrlContextResultStatus {
1308 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1309 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1310 crate::wire::EnumRepr::Name(n) if n == "STATUS_UNSPECIFIED" => Self::Unspecified,
1311 crate::wire::EnumRepr::Name(n) if n == "SUCCESS" => Self::Success,
1312 crate::wire::EnumRepr::Name(n) if n == "ERROR" => Self::Error,
1313 crate::wire::EnumRepr::Name(n) if n == "PAYWALL" => Self::Paywall,
1314 crate::wire::EnumRepr::Name(n) if n == "UNSAFE" => Self::Unsafe,
1315 crate::wire::EnumRepr::Number(0) => Self::Unspecified,
1316 crate::wire::EnumRepr::Number(1) => Self::Success,
1317 crate::wire::EnumRepr::Number(2) => Self::Error,
1318 crate::wire::EnumRepr::Number(3) => Self::Paywall,
1319 crate::wire::EnumRepr::Number(4) => Self::Unsafe,
1320 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1321 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1322 })
1323 }
1324}
1325
1326#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
1328pub enum VideoContentMimeType {
1329 #[default]
1330 TypeUnspecified,
1331 TypeMp4,
1332 TypeMpeg,
1333 TypeMpg,
1334 TypeMov,
1335 TypeAvi,
1336 TypeXFlv,
1337 TypeWebm,
1338 TypeWmv,
1339 Type3gpp,
1340 TypeYtBeyond,
1341 Unknown(String),
1347}
1348
1349impl VideoContentMimeType {
1350 pub fn as_str(&self) -> &str {
1352 match self {
1353 Self::TypeUnspecified => "TYPE_UNSPECIFIED",
1354 Self::TypeMp4 => "TYPE_MP4",
1355 Self::TypeMpeg => "TYPE_MPEG",
1356 Self::TypeMpg => "TYPE_MPG",
1357 Self::TypeMov => "TYPE_MOV",
1358 Self::TypeAvi => "TYPE_AVI",
1359 Self::TypeXFlv => "TYPE_X_FLV",
1360 Self::TypeWebm => "TYPE_WEBM",
1361 Self::TypeWmv => "TYPE_WMV",
1362 Self::Type3gpp => "TYPE_3GPP",
1363 Self::TypeYtBeyond => "TYPE_YT_BEYOND",
1364 Self::Unknown(s) => s,
1365 }
1366 }
1367}
1368
1369impl std::fmt::Display for VideoContentMimeType {
1370 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1371 f.write_str(self.as_str())
1372 }
1373}
1374
1375impl Serialize for VideoContentMimeType {
1376 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1377 s.serialize_str(self.as_str())
1378 }
1379}
1380
1381impl<'de> Deserialize<'de> for VideoContentMimeType {
1382 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
1383 Ok(match crate::wire::EnumRepr::deserialize(d)? {
1384 crate::wire::EnumRepr::Name(n) if n == "TYPE_UNSPECIFIED" => Self::TypeUnspecified,
1385 crate::wire::EnumRepr::Name(n) if n == "TYPE_MP4" => Self::TypeMp4,
1386 crate::wire::EnumRepr::Name(n) if n == "TYPE_MPEG" => Self::TypeMpeg,
1387 crate::wire::EnumRepr::Name(n) if n == "TYPE_MPG" => Self::TypeMpg,
1388 crate::wire::EnumRepr::Name(n) if n == "TYPE_MOV" => Self::TypeMov,
1389 crate::wire::EnumRepr::Name(n) if n == "TYPE_AVI" => Self::TypeAvi,
1390 crate::wire::EnumRepr::Name(n) if n == "TYPE_X_FLV" => Self::TypeXFlv,
1391 crate::wire::EnumRepr::Name(n) if n == "TYPE_WEBM" => Self::TypeWebm,
1392 crate::wire::EnumRepr::Name(n) if n == "TYPE_WMV" => Self::TypeWmv,
1393 crate::wire::EnumRepr::Name(n) if n == "TYPE_3GPP" => Self::Type3gpp,
1394 crate::wire::EnumRepr::Name(n) if n == "TYPE_YT_BEYOND" => Self::TypeYtBeyond,
1395 crate::wire::EnumRepr::Number(0) => Self::TypeUnspecified,
1396 crate::wire::EnumRepr::Number(1) => Self::TypeMp4,
1397 crate::wire::EnumRepr::Number(2) => Self::TypeMpeg,
1398 crate::wire::EnumRepr::Number(3) => Self::TypeMpg,
1399 crate::wire::EnumRepr::Number(4) => Self::TypeMov,
1400 crate::wire::EnumRepr::Number(5) => Self::TypeAvi,
1401 crate::wire::EnumRepr::Number(6) => Self::TypeXFlv,
1402 crate::wire::EnumRepr::Number(7) => Self::TypeWebm,
1403 crate::wire::EnumRepr::Number(8) => Self::TypeWmv,
1404 crate::wire::EnumRepr::Number(9) => Self::Type3gpp,
1405 crate::wire::EnumRepr::Number(10) => Self::TypeYtBeyond,
1406 crate::wire::EnumRepr::Name(n) => Self::Unknown(n),
1407 crate::wire::EnumRepr::Number(n) => Self::Unknown(n.to_string()),
1408 })
1409 }
1410}
1411
1412#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1414#[serde(rename_all = "camelCase")]
1415pub struct ActionCompaction {}
1416
1417#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1419#[serde(rename_all = "camelCase")]
1420pub struct ActionCreateFile {
1421 #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1422 pub file_path: Option<String>,
1423 #[serde(default, skip_serializing_if = "Option::is_none")]
1424 pub contents: Option<String>,
1425}
1426
1427#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1429#[serde(rename_all = "camelCase")]
1430pub struct ActionCustomTool {
1431 #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
1432 pub tool_call: Option<ToolCall>,
1433 #[serde(
1434 alias = "tool_response",
1435 default,
1436 skip_serializing_if = "Option::is_none"
1437 )]
1438 pub tool_response: Option<ToolResponse>,
1439}
1440
1441#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1443#[serde(rename_all = "camelCase")]
1444pub struct ActionEditFile {
1445 #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1446 pub file_path: Option<String>,
1447 #[serde(alias = "diff_block", default, skip_serializing_if = "Vec::is_empty")]
1448 pub diff_block: Vec<ActionEditFileDiffBlock>,
1449}
1450
1451#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1453#[serde(rename_all = "camelCase")]
1454pub struct ActionEditFileDiffBlock {
1455 #[serde(alias = "start_line", default, skip_serializing_if = "Option::is_none")]
1456 pub start_line: Option<i32>,
1457 #[serde(alias = "end_line", default, skip_serializing_if = "Option::is_none")]
1458 pub end_line: Option<i32>,
1459 #[serde(default, skip_serializing_if = "Vec::is_empty")]
1460 pub lines: Vec<ActionEditFileDiffLine>,
1461}
1462
1463#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1465#[serde(rename_all = "camelCase")]
1466pub struct ActionEditFileDiffLine {
1467 #[serde(default, skip_serializing_if = "Option::is_none")]
1468 pub text: Option<String>,
1469 #[serde(default, skip_serializing_if = "Option::is_none")]
1470 pub action: Option<ActionEditFileDiffLineLineAction>,
1471}
1472
1473#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1475#[serde(rename_all = "camelCase")]
1476pub struct ActionError {
1477 #[serde(
1478 alias = "error_message",
1479 default,
1480 skip_serializing_if = "Option::is_none"
1481 )]
1482 pub error_message: Option<String>,
1483 #[serde(alias = "http_code", default, skip_serializing_if = "Option::is_none")]
1484 pub http_code: Option<u32>,
1485}
1486
1487#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1489#[serde(rename_all = "camelCase")]
1490pub struct ActionFindFile {
1491 #[serde(
1492 alias = "directory_path",
1493 default,
1494 skip_serializing_if = "Option::is_none"
1495 )]
1496 pub directory_path: Option<String>,
1497 #[serde(default, skip_serializing_if = "Option::is_none")]
1498 pub query: Option<String>,
1499 #[serde(default, skip_serializing_if = "Option::is_none")]
1500 pub output: Option<String>,
1501}
1502
1503#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1505#[serde(rename_all = "camelCase")]
1506pub struct ActionFinish {
1507 #[serde(
1508 alias = "output_string",
1509 default,
1510 skip_serializing_if = "Option::is_none"
1511 )]
1512 pub output_string: Option<String>,
1513}
1514
1515#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1517#[serde(rename_all = "camelCase")]
1518pub struct ActionGenerateImage {
1519 #[serde(default, skip_serializing_if = "Option::is_none")]
1520 pub prompt: Option<String>,
1521 #[serde(alias = "image_paths", default, skip_serializing_if = "Vec::is_empty")]
1522 pub image_paths: Vec<String>,
1523 #[serde(alias = "image_name", default, skip_serializing_if = "Option::is_none")]
1524 pub image_name: Option<String>,
1525 #[serde(
1526 alias = "aspect_ratio",
1527 default,
1528 skip_serializing_if = "Option::is_none"
1529 )]
1530 pub aspect_ratio: Option<String>,
1531}
1532
1533#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1535#[serde(rename_all = "camelCase")]
1536pub struct ActionInvokeSubagent {}
1537
1538#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1540#[serde(rename_all = "camelCase")]
1541pub struct ActionListDirectory {
1542 #[serde(
1543 alias = "directory_path",
1544 default,
1545 skip_serializing_if = "Option::is_none"
1546 )]
1547 pub directory_path: Option<String>,
1548 #[serde(default, skip_serializing_if = "Vec::is_empty")]
1549 pub results: Vec<ActionListDirectoryResult>,
1550}
1551
1552#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1554#[serde(rename_all = "camelCase")]
1555pub struct ActionListDirectoryResult {
1556 #[serde(
1557 alias = "is_directory",
1558 default,
1559 skip_serializing_if = "Option::is_none"
1560 )]
1561 pub is_directory: Option<bool>,
1562 #[serde(
1563 alias = "file_size",
1564 default,
1565 skip_serializing_if = "Option::is_none",
1566 with = "crate::wire::opt_int"
1567 )]
1568 pub file_size: Option<u64>,
1569 #[serde(default, skip_serializing_if = "Option::is_none")]
1570 pub name: Option<String>,
1571}
1572
1573#[derive(Debug, Clone, PartialEq)]
1575pub enum ActionListDirectoryResultInfo {
1576 IsDirectory(bool),
1577 FileSize(u64),
1578}
1579
1580impl ActionListDirectoryResult {
1581 pub fn into_info(self) -> Option<ActionListDirectoryResultInfo> {
1583 if let Some(v) = self.is_directory {
1584 return Some(ActionListDirectoryResultInfo::IsDirectory(v));
1585 }
1586 if let Some(v) = self.file_size {
1587 return Some(ActionListDirectoryResultInfo::FileSize(v));
1588 }
1589 None
1590 }
1591
1592 pub fn has_info(&self) -> bool {
1594 self.is_directory.is_some() || self.file_size.is_some()
1595 }
1596}
1597
1598#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1600#[serde(rename_all = "camelCase")]
1601pub struct ActionMcpTool {
1602 #[serde(
1603 alias = "server_name",
1604 default,
1605 skip_serializing_if = "Option::is_none"
1606 )]
1607 pub server_name: Option<String>,
1608 #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
1609 pub tool_name: Option<String>,
1610 #[serde(
1611 alias = "arguments_json",
1612 default,
1613 skip_serializing_if = "Option::is_none"
1614 )]
1615 pub arguments_json: Option<String>,
1616}
1617
1618#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1620#[serde(rename_all = "camelCase")]
1621pub struct ActionReadUrlContent {
1622 #[serde(default, skip_serializing_if = "Option::is_none")]
1623 pub url: Option<String>,
1624 #[serde(default, skip_serializing_if = "Option::is_none")]
1625 pub title: Option<String>,
1626 #[serde(default, skip_serializing_if = "Option::is_none")]
1627 pub summary: Option<String>,
1628 #[serde(
1629 alias = "content_path",
1630 default,
1631 skip_serializing_if = "Option::is_none"
1632 )]
1633 pub content_path: Option<String>,
1634}
1635
1636#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1638#[serde(rename_all = "camelCase")]
1639pub struct ActionRunCommand {
1640 #[serde(
1641 alias = "command_line",
1642 default,
1643 skip_serializing_if = "Option::is_none"
1644 )]
1645 pub command_line: Option<String>,
1646 #[serde(
1647 alias = "working_dir",
1648 default,
1649 skip_serializing_if = "Option::is_none"
1650 )]
1651 pub working_dir: Option<String>,
1652 #[serde(alias = "exit_code", default, skip_serializing_if = "Option::is_none")]
1653 pub exit_code: Option<i32>,
1654 #[serde(
1655 alias = "combined_output",
1656 default,
1657 skip_serializing_if = "Option::is_none"
1658 )]
1659 pub combined_output: Option<String>,
1660}
1661
1662#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1664#[serde(rename_all = "camelCase")]
1665pub struct ActionSearchDirectory {
1666 #[serde(
1667 alias = "directory_path",
1668 default,
1669 skip_serializing_if = "Option::is_none"
1670 )]
1671 pub directory_path: Option<String>,
1672 #[serde(default, skip_serializing_if = "Option::is_none")]
1673 pub query: Option<String>,
1674 #[serde(
1675 alias = "num_results",
1676 default,
1677 skip_serializing_if = "Option::is_none"
1678 )]
1679 pub num_results: Option<i32>,
1680}
1681
1682#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1684#[serde(rename_all = "camelCase")]
1685pub struct ActionSearchWeb {
1686 #[serde(default, skip_serializing_if = "Option::is_none")]
1687 pub query: Option<String>,
1688 #[serde(default, skip_serializing_if = "Option::is_none")]
1689 pub domain: Option<String>,
1690 #[serde(default, skip_serializing_if = "Option::is_none")]
1691 pub summary: Option<String>,
1692}
1693
1694#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1696#[serde(rename_all = "camelCase")]
1697pub struct ActionViewFile {
1698 #[serde(alias = "file_path", default, skip_serializing_if = "Option::is_none")]
1699 pub file_path: Option<String>,
1700 #[serde(alias = "start_line", default, skip_serializing_if = "Option::is_none")]
1701 pub start_line: Option<u32>,
1702 #[serde(alias = "end_line", default, skip_serializing_if = "Option::is_none")]
1703 pub end_line: Option<u32>,
1704}
1705
1706#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1708#[serde(rename_all = "camelCase")]
1709pub struct AppendedSystemInstructions {
1710 #[serde(
1711 alias = "custom_identity",
1712 default,
1713 skip_serializing_if = "Option::is_none"
1714 )]
1715 pub custom_identity: Option<String>,
1716 #[serde(
1717 alias = "appended_sections",
1718 default,
1719 skip_serializing_if = "Vec::is_empty"
1720 )]
1721 pub appended_sections: Vec<AppendedSystemInstructionsSection>,
1722}
1723
1724#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1726#[serde(rename_all = "camelCase")]
1727pub struct AppendedSystemInstructionsSection {
1728 #[serde(default, skip_serializing_if = "Option::is_none")]
1729 pub title: Option<String>,
1730 #[serde(default, skip_serializing_if = "Option::is_none")]
1731 pub content: Option<String>,
1732}
1733
1734#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1736#[serde(rename_all = "camelCase")]
1737pub struct AudioContent {
1738 #[serde(
1739 default,
1740 skip_serializing_if = "Option::is_none",
1741 with = "crate::wire::opt_bytes"
1742 )]
1743 pub data: Option<Vec<u8>>,
1744 #[serde(default, skip_serializing_if = "Option::is_none")]
1745 pub uri: Option<String>,
1746 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
1747 pub mime_type: Option<AudioContentMimeType>,
1748 #[serde(default, skip_serializing_if = "Option::is_none")]
1749 pub channels: Option<i32>,
1750 #[serde(
1751 alias = "sample_rate",
1752 default,
1753 skip_serializing_if = "Option::is_none"
1754 )]
1755 pub sample_rate: Option<i32>,
1756}
1757
1758#[derive(Debug, Clone, PartialEq)]
1760pub enum AudioContentDataOrUri {
1761 Data(Vec<u8>),
1762 Uri(String),
1763}
1764
1765impl AudioContent {
1766 pub fn into_data_or_uri(self) -> Option<AudioContentDataOrUri> {
1768 if let Some(v) = self.data {
1769 return Some(AudioContentDataOrUri::Data(v));
1770 }
1771 if let Some(v) = self.uri {
1772 return Some(AudioContentDataOrUri::Uri(v));
1773 }
1774 None
1775 }
1776
1777 pub fn has_data_or_uri(&self) -> bool {
1779 self.data.is_some() || self.uri.is_some()
1780 }
1781}
1782
1783#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1785#[serde(rename_all = "camelCase")]
1786pub struct CallHookRequest {
1787 #[serde(
1788 alias = "pre_turn_args",
1789 default,
1790 skip_serializing_if = "Option::is_none"
1791 )]
1792 pub pre_turn_args: Option<PreTurnArgs>,
1793 #[serde(
1794 alias = "post_turn_args",
1795 default,
1796 skip_serializing_if = "Option::is_none"
1797 )]
1798 pub post_turn_args: Option<PostTurnArgs>,
1799 #[serde(
1800 alias = "pre_tool_args",
1801 default,
1802 skip_serializing_if = "Option::is_none"
1803 )]
1804 pub pre_tool_args: Option<PreToolArgs>,
1805 #[serde(
1806 alias = "post_tool_args",
1807 default,
1808 skip_serializing_if = "Option::is_none"
1809 )]
1810 pub post_tool_args: Option<PostToolArgs>,
1811 #[serde(
1812 alias = "on_tool_error_args",
1813 default,
1814 skip_serializing_if = "Option::is_none"
1815 )]
1816 pub on_tool_error_args: Option<OnToolErrorArgs>,
1817 #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
1818 pub request_id: Option<String>,
1819 #[serde(default, skip_serializing_if = "Option::is_none")]
1820 pub name: Option<String>,
1821 #[serde(default, skip_serializing_if = "Option::is_none")]
1822 pub r#type: Option<LifecycleHook>,
1823}
1824
1825#[derive(Debug, Clone, PartialEq)]
1827pub enum CallHookRequestArgs {
1828 PreTurnArgs(PreTurnArgs),
1829 PostTurnArgs(PostTurnArgs),
1830 PreToolArgs(PreToolArgs),
1831 PostToolArgs(PostToolArgs),
1832 OnToolErrorArgs(OnToolErrorArgs),
1833}
1834
1835impl CallHookRequest {
1836 pub fn into_args(self) -> Option<CallHookRequestArgs> {
1838 if let Some(v) = self.pre_turn_args {
1839 return Some(CallHookRequestArgs::PreTurnArgs(v));
1840 }
1841 if let Some(v) = self.post_turn_args {
1842 return Some(CallHookRequestArgs::PostTurnArgs(v));
1843 }
1844 if let Some(v) = self.pre_tool_args {
1845 return Some(CallHookRequestArgs::PreToolArgs(v));
1846 }
1847 if let Some(v) = self.post_tool_args {
1848 return Some(CallHookRequestArgs::PostToolArgs(v));
1849 }
1850 if let Some(v) = self.on_tool_error_args {
1851 return Some(CallHookRequestArgs::OnToolErrorArgs(v));
1852 }
1853 None
1854 }
1855
1856 pub fn has_args(&self) -> bool {
1858 self.pre_turn_args.is_some()
1859 || self.post_turn_args.is_some()
1860 || self.pre_tool_args.is_some()
1861 || self.post_tool_args.is_some()
1862 || self.on_tool_error_args.is_some()
1863 }
1864}
1865
1866#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1868#[serde(rename_all = "camelCase")]
1869pub struct CallHookResponse {
1870 #[serde(
1871 alias = "pre_turn_result",
1872 default,
1873 skip_serializing_if = "Option::is_none"
1874 )]
1875 pub pre_turn_result: Option<PreTurnResult>,
1876 #[serde(
1877 alias = "pre_tool_result",
1878 default,
1879 skip_serializing_if = "Option::is_none"
1880 )]
1881 pub pre_tool_result: Option<PreToolResult>,
1882 #[serde(
1883 alias = "empty_result",
1884 default,
1885 skip_serializing_if = "Option::is_none"
1886 )]
1887 pub empty_result: Option<EmptyResult>,
1888 #[serde(
1889 alias = "error_message",
1890 default,
1891 skip_serializing_if = "Option::is_none"
1892 )]
1893 pub error_message: Option<String>,
1894 #[serde(
1895 alias = "on_tool_error_result",
1896 default,
1897 skip_serializing_if = "Option::is_none"
1898 )]
1899 pub on_tool_error_result: Option<OnToolErrorResult>,
1900 #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
1901 pub request_id: Option<String>,
1902}
1903
1904#[derive(Debug, Clone, PartialEq)]
1906pub enum CallHookResponseResult {
1907 PreTurnResult(PreTurnResult),
1908 PreToolResult(PreToolResult),
1909 EmptyResult(EmptyResult),
1910 ErrorMessage(String),
1911 OnToolErrorResult(OnToolErrorResult),
1912}
1913
1914impl CallHookResponse {
1915 pub fn into_result(self) -> Option<CallHookResponseResult> {
1917 if let Some(v) = self.pre_turn_result {
1918 return Some(CallHookResponseResult::PreTurnResult(v));
1919 }
1920 if let Some(v) = self.pre_tool_result {
1921 return Some(CallHookResponseResult::PreToolResult(v));
1922 }
1923 if let Some(v) = self.empty_result {
1924 return Some(CallHookResponseResult::EmptyResult(v));
1925 }
1926 if let Some(v) = self.error_message {
1927 return Some(CallHookResponseResult::ErrorMessage(v));
1928 }
1929 if let Some(v) = self.on_tool_error_result {
1930 return Some(CallHookResponseResult::OnToolErrorResult(v));
1931 }
1932 None
1933 }
1934
1935 pub fn has_result(&self) -> bool {
1937 self.pre_turn_result.is_some()
1938 || self.pre_tool_result.is_some()
1939 || self.empty_result.is_some()
1940 || self.error_message.is_some()
1941 || self.on_tool_error_result.is_some()
1942 }
1943}
1944
1945#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1947#[serde(rename_all = "camelCase")]
1948pub struct ClientInfo {
1949 #[serde(default, skip_serializing_if = "Option::is_none")]
1950 pub language: Option<String>,
1951 #[serde(default, skip_serializing_if = "Option::is_none")]
1952 pub version: Option<String>,
1953 #[serde(
1954 alias = "language_version",
1955 default,
1956 skip_serializing_if = "Option::is_none"
1957 )]
1958 pub language_version: Option<String>,
1959 #[serde(default, skip_serializing_if = "Option::is_none")]
1960 pub os: Option<String>,
1961 #[serde(alias = "os_version", default, skip_serializing_if = "Option::is_none")]
1962 pub os_version: Option<String>,
1963}
1964
1965#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1967#[serde(rename_all = "camelCase")]
1968pub struct CodeExecutionCallContent {
1969 #[serde(default, skip_serializing_if = "Option::is_none")]
1970 pub arguments: Option<CodeExecutionCallContentCodeExecutionCallArguments>,
1971}
1972
1973#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1975#[serde(rename_all = "camelCase")]
1976pub struct CodeExecutionCallContentCodeExecutionCallArguments {
1977 #[serde(default, skip_serializing_if = "Option::is_none")]
1978 pub language: Option<CodeExecutionCallContentCodeExecutionCallArgumentsLanguage>,
1979 #[serde(default, skip_serializing_if = "Option::is_none")]
1980 pub code: Option<String>,
1981}
1982
1983#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1985#[serde(rename_all = "camelCase")]
1986pub struct CodeExecutionResultContent {
1987 #[serde(default, skip_serializing_if = "Option::is_none")]
1988 pub result: Option<String>,
1989 #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
1990 pub is_error: Option<bool>,
1991}
1992
1993#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
1995#[serde(rename_all = "camelCase")]
1996pub struct Content {
1997 #[serde(default, skip_serializing_if = "Option::is_none")]
1998 pub text: Option<TextContent>,
1999 #[serde(default, skip_serializing_if = "Option::is_none")]
2000 pub image: Option<ImageContent>,
2001 #[serde(default, skip_serializing_if = "Option::is_none")]
2002 pub audio: Option<AudioContent>,
2003 #[serde(default, skip_serializing_if = "Option::is_none")]
2004 pub document: Option<DocumentContent>,
2005 #[serde(default, skip_serializing_if = "Option::is_none")]
2006 pub video: Option<VideoContent>,
2007 #[serde(default, skip_serializing_if = "Option::is_none")]
2008 pub thought: Option<ThoughtContent>,
2009 #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
2010 pub tool_call: Option<ToolCallContent>,
2011 #[serde(
2012 alias = "tool_result",
2013 default,
2014 skip_serializing_if = "Option::is_none"
2015 )]
2016 pub tool_result: Option<ToolResultContent>,
2017}
2018
2019#[derive(Debug, Clone, PartialEq)]
2021pub enum ContentType {
2022 Text(TextContent),
2023 Image(ImageContent),
2024 Audio(AudioContent),
2025 Document(DocumentContent),
2026 Video(VideoContent),
2027 Thought(ThoughtContent),
2028 ToolCall(ToolCallContent),
2029 ToolResult(ToolResultContent),
2030}
2031
2032impl Content {
2033 pub fn into_type(self) -> Option<ContentType> {
2035 if let Some(v) = self.text {
2036 return Some(ContentType::Text(v));
2037 }
2038 if let Some(v) = self.image {
2039 return Some(ContentType::Image(v));
2040 }
2041 if let Some(v) = self.audio {
2042 return Some(ContentType::Audio(v));
2043 }
2044 if let Some(v) = self.document {
2045 return Some(ContentType::Document(v));
2046 }
2047 if let Some(v) = self.video {
2048 return Some(ContentType::Video(v));
2049 }
2050 if let Some(v) = self.thought {
2051 return Some(ContentType::Thought(v));
2052 }
2053 if let Some(v) = self.tool_call {
2054 return Some(ContentType::ToolCall(v));
2055 }
2056 if let Some(v) = self.tool_result {
2057 return Some(ContentType::ToolResult(v));
2058 }
2059 None
2060 }
2061
2062 pub fn has_type(&self) -> bool {
2064 self.text.is_some()
2065 || self.image.is_some()
2066 || self.audio.is_some()
2067 || self.document.is_some()
2068 || self.video.is_some()
2069 || self.thought.is_some()
2070 || self.tool_call.is_some()
2071 || self.tool_result.is_some()
2072 }
2073}
2074
2075#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2077#[serde(rename_all = "camelCase")]
2078pub struct CustomAgent {
2079 #[serde(default, skip_serializing_if = "Option::is_none")]
2080 pub name: Option<String>,
2081 #[serde(default, skip_serializing_if = "Option::is_none")]
2082 pub description: Option<String>,
2083 #[serde(
2084 alias = "system_instructions",
2085 default,
2086 skip_serializing_if = "Option::is_none"
2087 )]
2088 pub system_instructions: Option<SystemInstructions>,
2089 #[serde(
2090 alias = "harness_side_tools",
2091 default,
2092 skip_serializing_if = "Option::is_none"
2093 )]
2094 pub harness_side_tools: Option<HarnessSideTools>,
2095 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2096 pub tools: Vec<Tool>,
2097}
2098
2099#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2101#[serde(rename_all = "camelCase")]
2102pub struct CustomEndpoint {
2103 #[serde(
2104 alias = "backend_type",
2105 default,
2106 skip_serializing_if = "Option::is_none"
2107 )]
2108 pub backend_type: Option<String>,
2109 #[serde(
2110 alias = "config_json",
2111 default,
2112 skip_serializing_if = "Option::is_none"
2113 )]
2114 pub config_json: Option<String>,
2115}
2116
2117#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2119#[serde(rename_all = "camelCase")]
2120pub struct CustomSystemInstructions {
2121 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2122 pub part: Vec<CustomSystemInstructionsPart>,
2123}
2124
2125#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2127#[serde(rename_all = "camelCase")]
2128pub struct CustomSystemInstructionsPart {
2129 #[serde(default, skip_serializing_if = "Option::is_none")]
2130 pub text: Option<String>,
2131 #[serde(default, skip_serializing_if = "Option::is_none")]
2132 pub template: Option<CustomSystemInstructionsSystemInstructionTemplate>,
2133}
2134
2135#[derive(Debug, Clone, PartialEq)]
2137pub enum CustomSystemInstructionsPartPart {
2138 Text(String),
2139 Template(CustomSystemInstructionsSystemInstructionTemplate),
2140}
2141
2142impl CustomSystemInstructionsPart {
2143 pub fn into_part(self) -> Option<CustomSystemInstructionsPartPart> {
2145 if let Some(v) = self.text {
2146 return Some(CustomSystemInstructionsPartPart::Text(v));
2147 }
2148 if let Some(v) = self.template {
2149 return Some(CustomSystemInstructionsPartPart::Template(v));
2150 }
2151 None
2152 }
2153
2154 pub fn has_part(&self) -> bool {
2156 self.text.is_some() || self.template.is_some()
2157 }
2158}
2159
2160#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2162#[serde(rename_all = "camelCase")]
2163pub struct CustomSystemInstructionsSystemInstructionTemplate {
2164 #[serde(
2165 alias = "template_name",
2166 default,
2167 skip_serializing_if = "Option::is_none"
2168 )]
2169 pub template_name: Option<String>,
2170 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2171 pub args: Vec<CustomSystemInstructionsSystemInstructionTemplateArg>,
2172}
2173
2174#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2176#[serde(rename_all = "camelCase")]
2177pub struct CustomSystemInstructionsSystemInstructionTemplateArg {
2178 #[serde(default, skip_serializing_if = "Option::is_none")]
2179 pub name: Option<String>,
2180 #[serde(default, skip_serializing_if = "Option::is_none")]
2181 pub value: Option<String>,
2182}
2183
2184#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2186#[serde(rename_all = "camelCase")]
2187pub struct DocumentContent {
2188 #[serde(
2189 default,
2190 skip_serializing_if = "Option::is_none",
2191 with = "crate::wire::opt_bytes"
2192 )]
2193 pub data: Option<Vec<u8>>,
2194 #[serde(default, skip_serializing_if = "Option::is_none")]
2195 pub uri: Option<String>,
2196 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
2197 pub mime_type: Option<DocumentContentMimeType>,
2198}
2199
2200#[derive(Debug, Clone, PartialEq)]
2202pub enum DocumentContentDataOrUri {
2203 Data(Vec<u8>),
2204 Uri(String),
2205}
2206
2207impl DocumentContent {
2208 pub fn into_data_or_uri(self) -> Option<DocumentContentDataOrUri> {
2210 if let Some(v) = self.data {
2211 return Some(DocumentContentDataOrUri::Data(v));
2212 }
2213 if let Some(v) = self.uri {
2214 return Some(DocumentContentDataOrUri::Uri(v));
2215 }
2216 None
2217 }
2218
2219 pub fn has_data_or_uri(&self) -> bool {
2221 self.data.is_some() || self.uri.is_some()
2222 }
2223}
2224
2225#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2227#[serde(rename_all = "camelCase")]
2228pub struct EmptyResult {}
2229
2230#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2232#[serde(rename_all = "camelCase")]
2233pub struct Field {
2234 #[serde(default, skip_serializing_if = "Option::is_none")]
2235 pub name: Option<String>,
2236 #[serde(default, skip_serializing_if = "Option::is_none")]
2237 pub value: Option<Value>,
2238}
2239
2240#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2242#[serde(rename_all = "camelCase")]
2243pub struct FileCitation {
2244 #[serde(
2245 alias = "document_uri",
2246 default,
2247 skip_serializing_if = "Option::is_none"
2248 )]
2249 pub document_uri: Option<String>,
2250 #[serde(alias = "file_name", default, skip_serializing_if = "Option::is_none")]
2251 pub file_name: Option<String>,
2252 #[serde(default, skip_serializing_if = "Option::is_none")]
2253 pub source: Option<String>,
2254 #[serde(
2255 alias = "custom_metadata",
2256 default,
2257 skip_serializing_if = "Option::is_none"
2258 )]
2259 pub custom_metadata: Option<Struct>,
2260 #[serde(
2261 alias = "page_number",
2262 default,
2263 skip_serializing_if = "Option::is_none"
2264 )]
2265 pub page_number: Option<i32>,
2266 #[serde(alias = "media_id", default, skip_serializing_if = "Option::is_none")]
2267 pub media_id: Option<String>,
2268}
2269
2270#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2272#[serde(rename_all = "camelCase")]
2273pub struct FileEditToolConfig {
2274 #[serde(default, skip_serializing_if = "Option::is_none")]
2275 pub enabled: Option<bool>,
2276}
2277
2278#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2280#[serde(rename_all = "camelCase")]
2281pub struct FileSearchCallContent {}
2282
2283#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2285#[serde(rename_all = "camelCase")]
2286pub struct FileSearchResultContent {
2287 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2288 pub result: Vec<FileSearchResultContentFileSearchResult>,
2289}
2290
2291#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2293#[serde(rename_all = "camelCase")]
2294pub struct FileSearchResultContentFileSearchResult {}
2295
2296#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2298#[serde(rename_all = "camelCase")]
2299pub struct FilesystemWorkspace {
2300 #[serde(default, skip_serializing_if = "Option::is_none")]
2301 pub directory: Option<String>,
2302}
2303
2304#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2306#[serde(rename_all = "camelCase")]
2307pub struct FindToolConfig {
2308 #[serde(default, skip_serializing_if = "Option::is_none")]
2309 pub enabled: Option<bool>,
2310}
2311
2312#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2314#[serde(rename_all = "camelCase")]
2315pub struct FunctionCallContent {
2316 #[serde(default, skip_serializing_if = "Option::is_none")]
2317 pub name: Option<String>,
2318 #[serde(default, skip_serializing_if = "Option::is_none")]
2319 pub arguments: Option<Struct>,
2320}
2321
2322#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2324#[serde(rename_all = "camelCase")]
2325pub struct FunctionResultContent {
2326 #[serde(
2327 alias = "struct_result",
2328 default,
2329 skip_serializing_if = "Option::is_none"
2330 )]
2331 pub struct_result: Option<Struct>,
2332 #[serde(
2333 alias = "content_list",
2334 default,
2335 skip_serializing_if = "Option::is_none"
2336 )]
2337 pub content_list: Option<FunctionResultSubcontentList>,
2338 #[serde(
2339 alias = "string_result",
2340 default,
2341 skip_serializing_if = "Option::is_none"
2342 )]
2343 pub string_result: Option<String>,
2344 #[serde(default, skip_serializing_if = "Option::is_none")]
2345 pub name: Option<String>,
2346 #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
2347 pub is_error: Option<bool>,
2348}
2349
2350#[derive(Debug, Clone, PartialEq)]
2352pub enum FunctionResultContentResult {
2353 StructResult(Struct),
2354 ContentList(FunctionResultSubcontentList),
2355 StringResult(String),
2356}
2357
2358impl FunctionResultContent {
2359 pub fn into_result(self) -> Option<FunctionResultContentResult> {
2361 if let Some(v) = self.struct_result {
2362 return Some(FunctionResultContentResult::StructResult(v));
2363 }
2364 if let Some(v) = self.content_list {
2365 return Some(FunctionResultContentResult::ContentList(v));
2366 }
2367 if let Some(v) = self.string_result {
2368 return Some(FunctionResultContentResult::StringResult(v));
2369 }
2370 None
2371 }
2372
2373 pub fn has_result(&self) -> bool {
2375 self.struct_result.is_some() || self.content_list.is_some() || self.string_result.is_some()
2376 }
2377}
2378
2379#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2381#[serde(rename_all = "camelCase")]
2382pub struct FunctionResultSubcontent {
2383 #[serde(default, skip_serializing_if = "Option::is_none")]
2384 pub text: Option<TextContent>,
2385 #[serde(default, skip_serializing_if = "Option::is_none")]
2386 pub image: Option<ImageContent>,
2387}
2388
2389#[derive(Debug, Clone, PartialEq)]
2391pub enum FunctionResultSubcontentType {
2392 Text(TextContent),
2393 Image(ImageContent),
2394}
2395
2396impl FunctionResultSubcontent {
2397 pub fn into_type(self) -> Option<FunctionResultSubcontentType> {
2399 if let Some(v) = self.text {
2400 return Some(FunctionResultSubcontentType::Text(v));
2401 }
2402 if let Some(v) = self.image {
2403 return Some(FunctionResultSubcontentType::Image(v));
2404 }
2405 None
2406 }
2407
2408 pub fn has_type(&self) -> bool {
2410 self.text.is_some() || self.image.is_some()
2411 }
2412}
2413
2414#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2416#[serde(rename_all = "camelCase")]
2417pub struct FunctionResultSubcontentList {
2418 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2419 pub contents: Vec<FunctionResultSubcontent>,
2420}
2421
2422#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2424#[serde(rename_all = "camelCase")]
2425pub struct GeminiAPIEndpoint {
2426 #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
2427 pub base_url: Option<String>,
2428 #[serde(
2429 alias = "http_headers",
2430 default,
2431 skip_serializing_if = "HashMap::is_empty"
2432 )]
2433 pub http_headers: HashMap<String, String>,
2434 #[serde(alias = "api_key", default, skip_serializing_if = "Option::is_none")]
2435 pub api_key: Option<String>,
2436 #[serde(default, skip_serializing_if = "Option::is_none")]
2437 pub options: Option<GeminiModelOptions>,
2438}
2439
2440#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2442#[serde(rename_all = "camelCase")]
2443pub struct GeminiModelOptions {
2444 #[serde(
2445 alias = "thinking_level",
2446 default,
2447 skip_serializing_if = "Option::is_none"
2448 )]
2449 pub thinking_level: Option<String>,
2450 #[serde(
2451 alias = "service_tier",
2452 default,
2453 skip_serializing_if = "Option::is_none"
2454 )]
2455 pub service_tier: Option<String>,
2456}
2457
2458#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2460#[serde(rename_all = "camelCase")]
2461pub struct GemmaEndpoint {
2462 #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
2463 pub base_url: Option<String>,
2464}
2465
2466#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2468#[serde(rename_all = "camelCase")]
2469pub struct GenerateImageToolConfig {
2470 #[serde(default, skip_serializing_if = "Option::is_none")]
2471 pub enabled: Option<bool>,
2472}
2473
2474#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2476#[serde(rename_all = "camelCase")]
2477pub struct GoogleMapsCallContent {
2478 #[serde(default, skip_serializing_if = "Option::is_none")]
2479 pub arguments: Option<GoogleMapsCallContentGoogleMapsCallArguments>,
2480}
2481
2482#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2484#[serde(rename_all = "camelCase")]
2485pub struct GoogleMapsCallContentGoogleMapsCallArguments {
2486 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2487 pub queries: Vec<String>,
2488}
2489
2490#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2492#[serde(rename_all = "camelCase")]
2493pub struct GoogleMapsResultContent {
2494 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2495 pub result: Vec<GoogleMapsResultContentGoogleMapsResult>,
2496}
2497
2498#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2500#[serde(rename_all = "camelCase")]
2501pub struct GoogleMapsResultContentGoogleMapsResult {
2502 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2503 pub places: Vec<GoogleMapsResultContentGoogleMapsResultPlaces>,
2504 #[serde(
2505 alias = "widget_context_token",
2506 default,
2507 skip_serializing_if = "Option::is_none"
2508 )]
2509 pub widget_context_token: Option<String>,
2510}
2511
2512#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2514#[serde(rename_all = "camelCase")]
2515pub struct GoogleMapsResultContentGoogleMapsResultPlaces {
2516 #[serde(alias = "place_id", default, skip_serializing_if = "Option::is_none")]
2517 pub place_id: Option<String>,
2518 #[serde(default, skip_serializing_if = "Option::is_none")]
2519 pub name: Option<String>,
2520 #[serde(default, skip_serializing_if = "Option::is_none")]
2521 pub url: Option<String>,
2522 #[serde(
2523 alias = "review_snippets",
2524 default,
2525 skip_serializing_if = "Vec::is_empty"
2526 )]
2527 pub review_snippets: Vec<ReviewSnippet>,
2528}
2529
2530#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2532#[serde(rename_all = "camelCase")]
2533pub struct GoogleSearchCallContent {
2534 #[serde(default, skip_serializing_if = "Option::is_none")]
2535 pub arguments: Option<GoogleSearchCallContentGoogleSearchCallArguments>,
2536 #[serde(
2537 alias = "search_type",
2538 default,
2539 skip_serializing_if = "Option::is_none"
2540 )]
2541 pub search_type: Option<GoogleSearchSearchType>,
2542}
2543
2544#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2546#[serde(rename_all = "camelCase")]
2547pub struct GoogleSearchCallContentGoogleSearchCallArguments {
2548 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2549 pub queries: Vec<String>,
2550}
2551
2552#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2554#[serde(rename_all = "camelCase")]
2555pub struct GoogleSearchResultContent {
2556 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2557 pub result: Vec<GoogleSearchResultContentGoogleSearchResult>,
2558 #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
2559 pub is_error: Option<bool>,
2560}
2561
2562#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2564#[serde(rename_all = "camelCase")]
2565pub struct GoogleSearchResultContentGoogleSearchResult {
2566 #[serde(
2567 alias = "search_suggestions",
2568 default,
2569 skip_serializing_if = "Option::is_none"
2570 )]
2571 pub search_suggestions: Option<String>,
2572}
2573
2574#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2576#[serde(rename_all = "camelCase")]
2577pub struct GrepSearchToolConfig {
2578 #[serde(default, skip_serializing_if = "Option::is_none")]
2579 pub enabled: Option<bool>,
2580}
2581
2582#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2584#[serde(rename_all = "camelCase")]
2585pub struct HarnessConfig {
2586 #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
2587 pub cascade_id: Option<String>,
2588 #[serde(
2589 alias = "session_continuation_mode",
2590 default,
2591 skip_serializing_if = "Option::is_none"
2592 )]
2593 pub session_continuation_mode: Option<HarnessConfigSessionContinuationMode>,
2594 #[serde(
2595 alias = "system_instructions",
2596 default,
2597 skip_serializing_if = "Option::is_none"
2598 )]
2599 pub system_instructions: Option<SystemInstructions>,
2600 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2601 pub tools: Vec<Tool>,
2602 #[serde(
2603 alias = "harness_side_tools",
2604 default,
2605 skip_serializing_if = "Option::is_none"
2606 )]
2607 pub harness_side_tools: Option<HarnessSideTools>,
2608 #[serde(
2609 alias = "compaction_threshold",
2610 default,
2611 skip_serializing_if = "Option::is_none"
2612 )]
2613 pub compaction_threshold: Option<u32>,
2614 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2615 pub workspaces: Vec<Workspace>,
2616 #[serde(alias = "skills_paths", default, skip_serializing_if = "Vec::is_empty")]
2617 pub skills_paths: Vec<String>,
2618 #[serde(
2619 alias = "finish_tool_schema_json",
2620 default,
2621 skip_serializing_if = "Option::is_none"
2622 )]
2623 pub finish_tool_schema_json: Option<String>,
2624 #[serde(
2625 alias = "initial_trajectory",
2626 default,
2627 skip_serializing_if = "Option::is_none",
2628 with = "crate::wire::opt_bytes"
2629 )]
2630 pub initial_trajectory: Option<Vec<u8>>,
2631 #[serde(
2632 alias = "app_data_dir",
2633 default,
2634 skip_serializing_if = "Option::is_none"
2635 )]
2636 pub app_data_dir: Option<String>,
2637 #[serde(alias = "mcp_servers", default, skip_serializing_if = "Vec::is_empty")]
2638 pub mcp_servers: Vec<McpServerConfig>,
2639 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2640 pub models: Vec<ModelConfig>,
2641 #[serde(
2642 alias = "enabled_hooks",
2643 default,
2644 skip_serializing_if = "Vec::is_empty"
2645 )]
2646 pub enabled_hooks: Vec<LifecycleHook>,
2647 #[serde(
2648 alias = "custom_subagents",
2649 default,
2650 skip_serializing_if = "Vec::is_empty"
2651 )]
2652 pub custom_subagents: Vec<CustomAgent>,
2653 #[serde(
2654 alias = "tool_output_truncation",
2655 default,
2656 skip_serializing_if = "Option::is_none"
2657 )]
2658 pub tool_output_truncation: Option<ToolOutputTruncation>,
2659 #[serde(
2660 alias = "retry_config",
2661 default,
2662 skip_serializing_if = "Option::is_none"
2663 )]
2664 pub retry_config: Option<RetryConfig>,
2665 #[serde(
2666 alias = "policy_config",
2667 default,
2668 skip_serializing_if = "Option::is_none"
2669 )]
2670 pub policy_config: Option<PolicyConfig>,
2671}
2672
2673#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2675#[serde(rename_all = "camelCase")]
2676pub struct HarnessSideTools {
2677 #[serde(default, skip_serializing_if = "Option::is_none")]
2678 pub find: Option<FindToolConfig>,
2679 #[serde(
2680 alias = "run_command",
2681 default,
2682 skip_serializing_if = "Option::is_none"
2683 )]
2684 pub run_command: Option<RunCommandToolConfig>,
2685 #[serde(default, skip_serializing_if = "Option::is_none")]
2686 pub subagents: Option<SubagentsConfig>,
2687 #[serde(
2688 alias = "user_questions",
2689 default,
2690 skip_serializing_if = "Option::is_none"
2691 )]
2692 pub user_questions: Option<UserQuestionsConfig>,
2693 #[serde(alias = "file_edit", default, skip_serializing_if = "Option::is_none")]
2694 pub file_edit: Option<FileEditToolConfig>,
2695 #[serde(alias = "view_file", default, skip_serializing_if = "Option::is_none")]
2696 pub view_file: Option<ViewFileToolConfig>,
2697 #[serde(
2698 alias = "write_to_file",
2699 default,
2700 skip_serializing_if = "Option::is_none"
2701 )]
2702 pub write_to_file: Option<WriteToFileToolConfig>,
2703 #[serde(
2704 alias = "grep_search",
2705 default,
2706 skip_serializing_if = "Option::is_none"
2707 )]
2708 pub grep_search: Option<GrepSearchToolConfig>,
2709 #[serde(alias = "list_dir", default, skip_serializing_if = "Option::is_none")]
2710 pub list_dir: Option<ListDirToolConfig>,
2711 #[serde(default, skip_serializing_if = "Option::is_none")]
2712 pub permissions: Option<PermissionsConfig>,
2713 #[serde(
2714 alias = "generate_image",
2715 default,
2716 skip_serializing_if = "Option::is_none"
2717 )]
2718 pub generate_image: Option<GenerateImageToolConfig>,
2719 #[serde(alias = "search_web", default, skip_serializing_if = "Option::is_none")]
2720 pub search_web: Option<SearchWebToolConfig>,
2721 #[serde(
2722 alias = "read_url_content",
2723 default,
2724 skip_serializing_if = "Option::is_none"
2725 )]
2726 pub read_url_content: Option<ReadUrlContentToolConfig>,
2727 #[serde(
2728 alias = "tool_search_config",
2729 default,
2730 skip_serializing_if = "Option::is_none"
2731 )]
2732 pub tool_search_config: Option<ToolSearchConfig>,
2733}
2734
2735#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2737#[serde(rename_all = "camelCase")]
2738pub struct ImageContent {
2739 #[serde(
2740 default,
2741 skip_serializing_if = "Option::is_none",
2742 with = "crate::wire::opt_bytes"
2743 )]
2744 pub data: Option<Vec<u8>>,
2745 #[serde(default, skip_serializing_if = "Option::is_none")]
2746 pub uri: Option<String>,
2747 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
2748 pub mime_type: Option<ImageContentMimeType>,
2749 #[serde(default, skip_serializing_if = "Option::is_none")]
2750 pub resolution: Option<MediaResolution>,
2751}
2752
2753#[derive(Debug, Clone, PartialEq)]
2755pub enum ImageContentDataOrUri {
2756 Data(Vec<u8>),
2757 Uri(String),
2758}
2759
2760impl ImageContent {
2761 pub fn into_data_or_uri(self) -> Option<ImageContentDataOrUri> {
2763 if let Some(v) = self.data {
2764 return Some(ImageContentDataOrUri::Data(v));
2765 }
2766 if let Some(v) = self.uri {
2767 return Some(ImageContentDataOrUri::Uri(v));
2768 }
2769 None
2770 }
2771
2772 pub fn has_data_or_uri(&self) -> bool {
2774 self.data.is_some() || self.uri.is_some()
2775 }
2776}
2777
2778#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2780#[serde(rename_all = "camelCase")]
2781pub struct InitializeConversationEvent {
2782 #[serde(default, skip_serializing_if = "Option::is_none")]
2783 pub config: Option<HarnessConfig>,
2784}
2785
2786#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2788#[serde(rename_all = "camelCase")]
2789pub struct InitializeConversationResponse {
2790 #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
2791 pub cascade_id: Option<String>,
2792 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2793 pub history: Vec<StepUpdate>,
2794 #[serde(
2795 alias = "cumulative_usage",
2796 default,
2797 skip_serializing_if = "Option::is_none"
2798 )]
2799 pub cumulative_usage: Option<UsageMetadata>,
2800 #[serde(
2801 alias = "trajectory_usage",
2802 default,
2803 skip_serializing_if = "Vec::is_empty"
2804 )]
2805 pub trajectory_usage: Vec<TrajectoryUsageEntry>,
2806}
2807
2808#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2810#[serde(rename_all = "camelCase")]
2811pub struct InputConfig {
2812 #[serde(
2813 alias = "storage_directory",
2814 default,
2815 skip_serializing_if = "Option::is_none"
2816 )]
2817 pub storage_directory: Option<String>,
2818 #[serde(default, skip_serializing_if = "Option::is_none")]
2819 pub port: Option<u32>,
2820 #[serde(
2822 alias = "bind_address",
2823 default,
2824 skip_serializing_if = "Option::is_none"
2825 )]
2826 pub bind_address: Option<String>,
2827 #[serde(
2828 alias = "client_info",
2829 default,
2830 skip_serializing_if = "Option::is_none"
2831 )]
2832 pub client_info: Option<ClientInfo>,
2833 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
2834 pub env: HashMap<String, String>,
2835}
2836
2837#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2839#[serde(rename_all = "camelCase")]
2840pub struct InputEvent {
2841 #[serde(alias = "user_input", default, skip_serializing_if = "Option::is_none")]
2842 pub user_input: Option<String>,
2843 #[serde(
2844 alias = "complex_user_input",
2845 default,
2846 skip_serializing_if = "Option::is_none"
2847 )]
2848 pub complex_user_input: Option<UserInput>,
2849 #[serde(
2850 alias = "tool_confirmation",
2851 default,
2852 skip_serializing_if = "Option::is_none"
2853 )]
2854 pub tool_confirmation: Option<ToolConfirmation>,
2855 #[serde(
2856 alias = "tool_response",
2857 default,
2858 skip_serializing_if = "Option::is_none"
2859 )]
2860 pub tool_response: Option<ToolResponse>,
2861 #[serde(
2862 alias = "question_response",
2863 default,
2864 skip_serializing_if = "Option::is_none"
2865 )]
2866 pub question_response: Option<UserQuestionsResponse>,
2867 #[serde(
2868 alias = "halt_request",
2869 default,
2870 skip_serializing_if = "Option::is_none"
2871 )]
2872 pub halt_request: Option<bool>,
2873 #[serde(
2874 alias = "automated_trigger",
2875 default,
2876 skip_serializing_if = "Option::is_none"
2877 )]
2878 pub automated_trigger: Option<String>,
2879 #[serde(
2880 alias = "call_hook_response",
2881 default,
2882 skip_serializing_if = "Option::is_none"
2883 )]
2884 pub call_hook_response: Option<CallHookResponse>,
2885 #[serde(
2886 alias = "session_end_request",
2887 default,
2888 skip_serializing_if = "Option::is_none"
2889 )]
2890 pub session_end_request: Option<bool>,
2891 #[serde(
2892 alias = "policy_decision_response",
2893 default,
2894 skip_serializing_if = "Option::is_none"
2895 )]
2896 pub policy_decision_response: Option<PolicyDecisionResponse>,
2897}
2898
2899#[derive(Debug, Clone, PartialEq)]
2901pub enum InputEventEvent {
2902 UserInput(String),
2903 ComplexUserInput(UserInput),
2904 ToolConfirmation(ToolConfirmation),
2905 ToolResponse(ToolResponse),
2906 QuestionResponse(UserQuestionsResponse),
2907 HaltRequest(bool),
2908 AutomatedTrigger(String),
2909 CallHookResponse(CallHookResponse),
2910 SessionEndRequest(bool),
2911 PolicyDecisionResponse(PolicyDecisionResponse),
2912}
2913
2914impl InputEvent {
2915 pub fn into_event(self) -> Option<InputEventEvent> {
2917 if let Some(v) = self.user_input {
2918 return Some(InputEventEvent::UserInput(v));
2919 }
2920 if let Some(v) = self.complex_user_input {
2921 return Some(InputEventEvent::ComplexUserInput(v));
2922 }
2923 if let Some(v) = self.tool_confirmation {
2924 return Some(InputEventEvent::ToolConfirmation(v));
2925 }
2926 if let Some(v) = self.tool_response {
2927 return Some(InputEventEvent::ToolResponse(v));
2928 }
2929 if let Some(v) = self.question_response {
2930 return Some(InputEventEvent::QuestionResponse(v));
2931 }
2932 if let Some(v) = self.halt_request {
2933 return Some(InputEventEvent::HaltRequest(v));
2934 }
2935 if let Some(v) = self.automated_trigger {
2936 return Some(InputEventEvent::AutomatedTrigger(v));
2937 }
2938 if let Some(v) = self.call_hook_response {
2939 return Some(InputEventEvent::CallHookResponse(v));
2940 }
2941 if let Some(v) = self.session_end_request {
2942 return Some(InputEventEvent::SessionEndRequest(v));
2943 }
2944 if let Some(v) = self.policy_decision_response {
2945 return Some(InputEventEvent::PolicyDecisionResponse(v));
2946 }
2947 None
2948 }
2949
2950 pub fn has_event(&self) -> bool {
2952 self.user_input.is_some()
2953 || self.complex_user_input.is_some()
2954 || self.tool_confirmation.is_some()
2955 || self.tool_response.is_some()
2956 || self.question_response.is_some()
2957 || self.halt_request.is_some()
2958 || self.automated_trigger.is_some()
2959 || self.call_hook_response.is_some()
2960 || self.session_end_request.is_some()
2961 || self.policy_decision_response.is_some()
2962 }
2963}
2964
2965#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2967#[serde(rename_all = "camelCase")]
2968pub struct ListDirToolConfig {
2969 #[serde(default, skip_serializing_if = "Option::is_none")]
2970 pub enabled: Option<bool>,
2971}
2972
2973#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2975#[serde(rename_all = "camelCase")]
2976pub struct ListValue {
2977 #[serde(default, skip_serializing_if = "Vec::is_empty")]
2978 pub values: Vec<Value>,
2979}
2980
2981#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2983#[serde(rename_all = "camelCase")]
2984pub struct McpHttpTransport {
2985 #[serde(default, skip_serializing_if = "Option::is_none")]
2986 pub url: Option<String>,
2987 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
2988 pub headers: HashMap<String, String>,
2989}
2990
2991#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2993#[serde(rename_all = "camelCase")]
2994pub struct McpServerConfig {
2995 #[serde(default, skip_serializing_if = "Option::is_none")]
2996 pub stdio: Option<McpStdioTransport>,
2997 #[serde(default, skip_serializing_if = "Option::is_none")]
2998 pub http: Option<McpHttpTransport>,
2999 #[serde(default, skip_serializing_if = "Option::is_none")]
3000 pub name: Option<String>,
3001 #[serde(
3002 alias = "enabled_tools",
3003 default,
3004 skip_serializing_if = "Vec::is_empty"
3005 )]
3006 pub enabled_tools: Vec<String>,
3007 #[serde(
3008 alias = "disabled_tools",
3009 default,
3010 skip_serializing_if = "Vec::is_empty"
3011 )]
3012 pub disabled_tools: Vec<String>,
3013 #[serde(
3014 alias = "auth_provider_type",
3015 default,
3016 skip_serializing_if = "Option::is_none"
3017 )]
3018 pub auth_provider_type: Option<McpServerConfigAuthProviderType>,
3019 #[serde(
3020 alias = "timeout_seconds",
3021 default,
3022 skip_serializing_if = "Option::is_none"
3023 )]
3024 pub timeout_seconds: Option<i32>,
3025}
3026
3027#[derive(Debug, Clone, PartialEq)]
3029pub enum McpServerConfigTransport {
3030 Stdio(McpStdioTransport),
3031 Http(McpHttpTransport),
3032}
3033
3034impl McpServerConfig {
3035 pub fn into_transport(self) -> Option<McpServerConfigTransport> {
3037 if let Some(v) = self.stdio {
3038 return Some(McpServerConfigTransport::Stdio(v));
3039 }
3040 if let Some(v) = self.http {
3041 return Some(McpServerConfigTransport::Http(v));
3042 }
3043 None
3044 }
3045
3046 pub fn has_transport(&self) -> bool {
3048 self.stdio.is_some() || self.http.is_some()
3049 }
3050}
3051
3052#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3054#[serde(rename_all = "camelCase")]
3055pub struct McpServerToolCallContent {
3056 #[serde(default, skip_serializing_if = "Option::is_none")]
3057 pub name: Option<String>,
3058 #[serde(
3059 alias = "server_name",
3060 default,
3061 skip_serializing_if = "Option::is_none"
3062 )]
3063 pub server_name: Option<String>,
3064 #[serde(default, skip_serializing_if = "Option::is_none")]
3065 pub arguments: Option<Struct>,
3066}
3067
3068#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3070#[serde(rename_all = "camelCase")]
3071pub struct McpServerToolResultContent {
3072 #[serde(
3073 alias = "struct_result",
3074 default,
3075 skip_serializing_if = "Option::is_none"
3076 )]
3077 pub struct_result: Option<Struct>,
3078 #[serde(
3079 alias = "content_list",
3080 default,
3081 skip_serializing_if = "Option::is_none"
3082 )]
3083 pub content_list: Option<FunctionResultSubcontentList>,
3084 #[serde(
3085 alias = "string_result",
3086 default,
3087 skip_serializing_if = "Option::is_none"
3088 )]
3089 pub string_result: Option<String>,
3090 #[serde(default, skip_serializing_if = "Option::is_none")]
3091 pub name: Option<String>,
3092 #[serde(
3093 alias = "server_name",
3094 default,
3095 skip_serializing_if = "Option::is_none"
3096 )]
3097 pub server_name: Option<String>,
3098}
3099
3100#[derive(Debug, Clone, PartialEq)]
3102pub enum McpServerToolResultContentResult {
3103 StructResult(Struct),
3104 ContentList(FunctionResultSubcontentList),
3105 StringResult(String),
3106}
3107
3108impl McpServerToolResultContent {
3109 pub fn into_result(self) -> Option<McpServerToolResultContentResult> {
3111 if let Some(v) = self.struct_result {
3112 return Some(McpServerToolResultContentResult::StructResult(v));
3113 }
3114 if let Some(v) = self.content_list {
3115 return Some(McpServerToolResultContentResult::ContentList(v));
3116 }
3117 if let Some(v) = self.string_result {
3118 return Some(McpServerToolResultContentResult::StringResult(v));
3119 }
3120 None
3121 }
3122
3123 pub fn has_result(&self) -> bool {
3125 self.struct_result.is_some() || self.content_list.is_some() || self.string_result.is_some()
3126 }
3127}
3128
3129#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3131#[serde(rename_all = "camelCase")]
3132pub struct McpStdioTransport {
3133 #[serde(default, skip_serializing_if = "Option::is_none")]
3134 pub command: Option<String>,
3135 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3136 pub args: Vec<String>,
3137 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
3138 pub env: HashMap<String, String>,
3139}
3140
3141#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3143#[serde(rename_all = "camelCase")]
3144pub struct Media {
3145 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
3146 pub mime_type: Option<String>,
3147 #[serde(default, skip_serializing_if = "Option::is_none")]
3148 pub description: Option<String>,
3149 #[serde(
3150 default,
3151 skip_serializing_if = "Option::is_none",
3152 with = "crate::wire::opt_bytes"
3153 )]
3154 pub data: Option<Vec<u8>>,
3155}
3156
3157#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3159#[serde(rename_all = "camelCase")]
3160pub struct ModelAPIRetryConfig {
3161 #[serde(
3162 alias = "max_retries",
3163 default,
3164 skip_serializing_if = "Option::is_none"
3165 )]
3166 pub max_retries: Option<u32>,
3167 #[serde(
3168 alias = "initial_sleep_duration_ms",
3169 default,
3170 skip_serializing_if = "Option::is_none"
3171 )]
3172 pub initial_sleep_duration_ms: Option<u32>,
3173 #[serde(
3174 alias = "exponential_multiplier",
3175 default,
3176 skip_serializing_if = "Option::is_none"
3177 )]
3178 pub exponential_multiplier: Option<f64>,
3179 #[serde(
3180 alias = "jitter_range",
3181 default,
3182 skip_serializing_if = "Option::is_none"
3183 )]
3184 pub jitter_range: Option<f64>,
3185}
3186
3187#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3189#[serde(rename_all = "camelCase")]
3190pub struct ModelConfig {
3191 #[serde(
3192 alias = "gemini_api_endpoint",
3193 default,
3194 skip_serializing_if = "Option::is_none"
3195 )]
3196 pub gemini_api_endpoint: Option<GeminiAPIEndpoint>,
3197 #[serde(
3198 alias = "vertex_endpoint",
3199 default,
3200 skip_serializing_if = "Option::is_none"
3201 )]
3202 pub vertex_endpoint: Option<VertexEndpoint>,
3203 #[serde(
3204 alias = "gemma_endpoint",
3205 default,
3206 skip_serializing_if = "Option::is_none"
3207 )]
3208 pub gemma_endpoint: Option<GemmaEndpoint>,
3209 #[serde(
3210 alias = "custom_endpoint",
3211 default,
3212 skip_serializing_if = "Option::is_none"
3213 )]
3214 pub custom_endpoint: Option<CustomEndpoint>,
3215 #[serde(default, skip_serializing_if = "Option::is_none")]
3216 pub name: Option<String>,
3217 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3218 pub types: Vec<ModelType>,
3219}
3220
3221#[derive(Debug, Clone, PartialEq)]
3223pub enum ModelConfigEndpoint {
3224 GeminiApiEndpoint(GeminiAPIEndpoint),
3225 VertexEndpoint(VertexEndpoint),
3226 GemmaEndpoint(GemmaEndpoint),
3227 CustomEndpoint(CustomEndpoint),
3228}
3229
3230impl ModelConfig {
3231 pub fn into_endpoint(self) -> Option<ModelConfigEndpoint> {
3233 if let Some(v) = self.gemini_api_endpoint {
3234 return Some(ModelConfigEndpoint::GeminiApiEndpoint(v));
3235 }
3236 if let Some(v) = self.vertex_endpoint {
3237 return Some(ModelConfigEndpoint::VertexEndpoint(v));
3238 }
3239 if let Some(v) = self.gemma_endpoint {
3240 return Some(ModelConfigEndpoint::GemmaEndpoint(v));
3241 }
3242 if let Some(v) = self.custom_endpoint {
3243 return Some(ModelConfigEndpoint::CustomEndpoint(v));
3244 }
3245 None
3246 }
3247
3248 pub fn has_endpoint(&self) -> bool {
3250 self.gemini_api_endpoint.is_some()
3251 || self.vertex_endpoint.is_some()
3252 || self.gemma_endpoint.is_some()
3253 || self.custom_endpoint.is_some()
3254 }
3255}
3256
3257#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3259#[serde(rename_all = "camelCase")]
3260pub struct ModelOutputRetryConfig {
3261 #[serde(
3262 alias = "max_retries",
3263 default,
3264 skip_serializing_if = "Option::is_none"
3265 )]
3266 pub max_retries: Option<u32>,
3267}
3268
3269#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3271#[serde(rename_all = "camelCase")]
3272pub struct MultipleChoice {
3273 #[serde(default, skip_serializing_if = "Option::is_none")]
3274 pub question: Option<String>,
3275 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3276 pub choices: Vec<String>,
3277 #[serde(
3278 alias = "is_multi_select",
3279 default,
3280 skip_serializing_if = "Option::is_none"
3281 )]
3282 pub is_multi_select: Option<bool>,
3283}
3284
3285#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3287#[serde(rename_all = "camelCase")]
3288pub struct MultipleChoiceAnswer {
3289 #[serde(
3290 alias = "selected_choice_indices",
3291 default,
3292 skip_serializing_if = "Vec::is_empty"
3293 )]
3294 pub selected_choice_indices: Vec<i32>,
3295 #[serde(
3296 alias = "freeform_response",
3297 default,
3298 skip_serializing_if = "Option::is_none"
3299 )]
3300 pub freeform_response: Option<String>,
3301}
3302
3303#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3305#[serde(rename_all = "camelCase")]
3306pub struct OnToolErrorArgs {
3307 #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3308 pub tool_name: Option<String>,
3309 #[serde(
3310 alias = "error_message",
3311 default,
3312 skip_serializing_if = "Option::is_none"
3313 )]
3314 pub error_message: Option<String>,
3315 #[serde(
3316 alias = "server_name",
3317 default,
3318 skip_serializing_if = "Option::is_none"
3319 )]
3320 pub server_name: Option<String>,
3321 #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3322 pub call_id: Option<String>,
3323}
3324
3325#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3327#[serde(rename_all = "camelCase")]
3328pub struct OnToolErrorResult {
3329 #[serde(
3330 alias = "custom_error_message",
3331 default,
3332 skip_serializing_if = "Option::is_none"
3333 )]
3334 pub custom_error_message: Option<String>,
3335}
3336
3337#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3339#[serde(rename_all = "camelCase")]
3340pub struct OutputConfig {
3341 #[serde(default, skip_serializing_if = "Option::is_none")]
3342 pub port: Option<i32>,
3343 #[serde(alias = "api_key", default, skip_serializing_if = "Option::is_none")]
3344 pub api_key: Option<String>,
3345}
3346
3347#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3349#[serde(rename_all = "camelCase")]
3350pub struct OutputEvent {
3351 #[serde(
3352 alias = "step_update",
3353 default,
3354 skip_serializing_if = "Option::is_none"
3355 )]
3356 pub step_update: Option<StepUpdate>,
3357 #[serde(
3358 alias = "trajectory_state_update",
3359 default,
3360 skip_serializing_if = "Option::is_none"
3361 )]
3362 pub trajectory_state_update: Option<TrajectoryStateUpdate>,
3363 #[serde(alias = "tool_call", default, skip_serializing_if = "Option::is_none")]
3364 pub tool_call: Option<ToolCall>,
3365 #[serde(
3366 alias = "initialize_conversation_response",
3367 default,
3368 skip_serializing_if = "Option::is_none"
3369 )]
3370 pub initialize_conversation_response: Option<InitializeConversationResponse>,
3371 #[serde(
3372 alias = "call_hook_request",
3373 default,
3374 skip_serializing_if = "Option::is_none"
3375 )]
3376 pub call_hook_request: Option<CallHookRequest>,
3377 #[serde(
3378 alias = "session_end_response",
3379 default,
3380 skip_serializing_if = "Option::is_none"
3381 )]
3382 pub session_end_response: Option<bool>,
3383 #[serde(
3384 alias = "policy_decision_request",
3385 default,
3386 skip_serializing_if = "Option::is_none"
3387 )]
3388 pub policy_decision_request: Option<PolicyDecisionRequest>,
3389 #[serde(
3390 alias = "usage_update",
3391 default,
3392 skip_serializing_if = "Option::is_none"
3393 )]
3394 pub usage_update: Option<UsageUpdate>,
3395 #[serde(
3396 alias = "seq_num",
3397 default,
3398 skip_serializing_if = "Option::is_none",
3399 with = "crate::wire::opt_int"
3400 )]
3401 pub seq_num: Option<i64>,
3402 #[serde(
3403 alias = "timestamp_micros",
3404 default,
3405 skip_serializing_if = "Option::is_none",
3406 with = "crate::wire::opt_int"
3407 )]
3408 pub timestamp_micros: Option<i64>,
3409}
3410
3411#[derive(Debug, Clone, PartialEq)]
3413pub enum OutputEventEvent {
3414 StepUpdate(StepUpdate),
3415 TrajectoryStateUpdate(TrajectoryStateUpdate),
3416 ToolCall(ToolCall),
3417 InitializeConversationResponse(InitializeConversationResponse),
3418 CallHookRequest(CallHookRequest),
3419 SessionEndResponse(bool),
3420 PolicyDecisionRequest(PolicyDecisionRequest),
3421 UsageUpdate(UsageUpdate),
3422}
3423
3424impl OutputEvent {
3425 pub fn into_event(self) -> Option<OutputEventEvent> {
3427 if let Some(v) = self.step_update {
3428 return Some(OutputEventEvent::StepUpdate(v));
3429 }
3430 if let Some(v) = self.trajectory_state_update {
3431 return Some(OutputEventEvent::TrajectoryStateUpdate(v));
3432 }
3433 if let Some(v) = self.tool_call {
3434 return Some(OutputEventEvent::ToolCall(v));
3435 }
3436 if let Some(v) = self.initialize_conversation_response {
3437 return Some(OutputEventEvent::InitializeConversationResponse(v));
3438 }
3439 if let Some(v) = self.call_hook_request {
3440 return Some(OutputEventEvent::CallHookRequest(v));
3441 }
3442 if let Some(v) = self.session_end_response {
3443 return Some(OutputEventEvent::SessionEndResponse(v));
3444 }
3445 if let Some(v) = self.policy_decision_request {
3446 return Some(OutputEventEvent::PolicyDecisionRequest(v));
3447 }
3448 if let Some(v) = self.usage_update {
3449 return Some(OutputEventEvent::UsageUpdate(v));
3450 }
3451 None
3452 }
3453
3454 pub fn has_event(&self) -> bool {
3456 self.step_update.is_some()
3457 || self.trajectory_state_update.is_some()
3458 || self.tool_call.is_some()
3459 || self.initialize_conversation_response.is_some()
3460 || self.call_hook_request.is_some()
3461 || self.session_end_response.is_some()
3462 || self.policy_decision_request.is_some()
3463 || self.usage_update.is_some()
3464 }
3465}
3466
3467#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3469#[serde(rename_all = "camelCase")]
3470pub struct PermissionsConfig {
3471 #[serde(
3472 alias = "enforce_workspace_validation",
3473 default,
3474 skip_serializing_if = "Option::is_none"
3475 )]
3476 pub enforce_workspace_validation: Option<bool>,
3477}
3478
3479#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3481#[serde(rename_all = "camelCase")]
3482pub struct PlaceCitation {
3483 #[serde(alias = "place_id", default, skip_serializing_if = "Option::is_none")]
3484 pub place_id: Option<String>,
3485 #[serde(default, skip_serializing_if = "Option::is_none")]
3486 pub name: Option<String>,
3487 #[serde(default, skip_serializing_if = "Option::is_none")]
3488 pub url: Option<String>,
3489 #[serde(
3490 alias = "review_snippets",
3491 default,
3492 skip_serializing_if = "Vec::is_empty"
3493 )]
3494 pub review_snippets: Vec<ReviewSnippet>,
3495}
3496
3497#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3499#[serde(rename_all = "camelCase")]
3500pub struct PolicyConfig {
3501 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3502 pub rules: Vec<PolicyRule>,
3503}
3504
3505#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3507#[serde(rename_all = "camelCase")]
3508pub struct PolicyDecisionRequest {
3509 #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
3510 pub request_id: Option<String>,
3511 #[serde(alias = "rule_id", default, skip_serializing_if = "Option::is_none")]
3512 pub rule_id: Option<String>,
3513 #[serde(alias = "tool_args", default, skip_serializing_if = "Option::is_none")]
3514 pub tool_args: Option<PreToolArgs>,
3515}
3516
3517#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3519#[serde(rename_all = "camelCase")]
3520pub struct PolicyDecisionResponse {
3521 #[serde(alias = "request_id", default, skip_serializing_if = "Option::is_none")]
3522 pub request_id: Option<String>,
3523 #[serde(default, skip_serializing_if = "Option::is_none")]
3524 pub outcome: Option<PolicyEvaluationOutcome>,
3525 #[serde(
3526 alias = "deny_reason",
3527 default,
3528 skip_serializing_if = "Option::is_none"
3529 )]
3530 pub deny_reason: Option<String>,
3531}
3532
3533#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3535#[serde(rename_all = "camelCase")]
3536pub struct PolicyRule {
3537 #[serde(default, skip_serializing_if = "Option::is_none")]
3538 pub tool: Option<String>,
3539 #[serde(
3540 alias = "server_name",
3541 default,
3542 skip_serializing_if = "Option::is_none"
3543 )]
3544 pub server_name: Option<String>,
3545 #[serde(default, skip_serializing_if = "Option::is_none")]
3546 pub name: Option<String>,
3547 #[serde(default, skip_serializing_if = "Option::is_none")]
3548 pub decision: Option<PolicyDecision>,
3549 #[serde(
3550 alias = "deny_reason",
3551 default,
3552 skip_serializing_if = "Option::is_none"
3553 )]
3554 pub deny_reason: Option<String>,
3555 #[serde(alias = "is_dynamic", default, skip_serializing_if = "Option::is_none")]
3556 pub is_dynamic: Option<bool>,
3557 #[serde(alias = "rule_id", default, skip_serializing_if = "Option::is_none")]
3558 pub rule_id: Option<String>,
3559}
3560
3561#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3563#[serde(rename_all = "camelCase")]
3564pub struct PostToolArgs {
3565 #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3566 pub tool_name: Option<String>,
3567 #[serde(default, skip_serializing_if = "Option::is_none")]
3568 pub result: Option<String>,
3569 #[serde(default, skip_serializing_if = "Option::is_none")]
3570 pub error: Option<String>,
3571 #[serde(
3572 alias = "server_name",
3573 default,
3574 skip_serializing_if = "Option::is_none"
3575 )]
3576 pub server_name: Option<String>,
3577 #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3578 pub call_id: Option<String>,
3579}
3580
3581#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3583#[serde(rename_all = "camelCase")]
3584pub struct PostTurnArgs {
3585 #[serde(
3586 alias = "response_text",
3587 default,
3588 skip_serializing_if = "Option::is_none"
3589 )]
3590 pub response_text: Option<String>,
3591}
3592
3593#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3595#[serde(rename_all = "camelCase")]
3596pub struct PreToolArgs {
3597 #[serde(alias = "tool_name", default, skip_serializing_if = "Option::is_none")]
3598 pub tool_name: Option<String>,
3599 #[serde(
3600 alias = "arguments_json",
3601 default,
3602 skip_serializing_if = "Option::is_none"
3603 )]
3604 pub arguments_json: Option<String>,
3605 #[serde(
3606 alias = "server_name",
3607 default,
3608 skip_serializing_if = "Option::is_none"
3609 )]
3610 pub server_name: Option<String>,
3611 #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
3612 pub call_id: Option<String>,
3613}
3614
3615#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3617#[serde(rename_all = "camelCase")]
3618pub struct PreToolResult {
3619 #[serde(default, skip_serializing_if = "Option::is_none")]
3620 pub decision: Option<PreToolResultDecision>,
3621 #[serde(default, skip_serializing_if = "Option::is_none")]
3622 pub reason: Option<String>,
3623 #[serde(
3624 alias = "modified_arguments_json",
3625 default,
3626 skip_serializing_if = "Option::is_none"
3627 )]
3628 pub modified_arguments_json: Option<String>,
3629}
3630
3631#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3633#[serde(rename_all = "camelCase")]
3634pub struct PreTurnArgs {
3635 #[serde(alias = "user_input", default, skip_serializing_if = "Option::is_none")]
3636 pub user_input: Option<UserInput>,
3637}
3638
3639#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3641#[serde(rename_all = "camelCase")]
3642pub struct PreTurnResult {
3643 #[serde(default, skip_serializing_if = "Option::is_none")]
3644 pub decision: Option<PreTurnResultDecision>,
3645 #[serde(default, skip_serializing_if = "Option::is_none")]
3646 pub reason: Option<String>,
3647}
3648
3649#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3651#[serde(rename_all = "camelCase")]
3652pub struct ReadUrlContentToolConfig {
3653 #[serde(default, skip_serializing_if = "Option::is_none")]
3654 pub enabled: Option<bool>,
3655}
3656
3657#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3659#[serde(rename_all = "camelCase")]
3660pub struct RetryConfig {
3661 #[serde(alias = "api_retry", default, skip_serializing_if = "Option::is_none")]
3662 pub api_retry: Option<ModelAPIRetryConfig>,
3663 #[serde(
3664 alias = "model_output_retry",
3665 default,
3666 skip_serializing_if = "Option::is_none"
3667 )]
3668 pub model_output_retry: Option<ModelOutputRetryConfig>,
3669}
3670
3671#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3673#[serde(rename_all = "camelCase")]
3674pub struct ReviewSnippet {
3675 #[serde(default, skip_serializing_if = "Option::is_none")]
3676 pub title: Option<String>,
3677 #[serde(default, skip_serializing_if = "Option::is_none")]
3678 pub url: Option<String>,
3679 #[serde(alias = "review_id", default, skip_serializing_if = "Option::is_none")]
3680 pub review_id: Option<String>,
3681}
3682
3683#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3685#[serde(rename_all = "camelCase")]
3686pub struct RunCommandToolConfig {
3687 #[serde(default, skip_serializing_if = "Option::is_none")]
3688 pub enabled: Option<bool>,
3689}
3690
3691#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3693#[serde(rename_all = "camelCase")]
3694pub struct SearchWebToolConfig {
3695 #[serde(default, skip_serializing_if = "Option::is_none")]
3696 pub enabled: Option<bool>,
3697}
3698
3699#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3701#[serde(rename_all = "camelCase")]
3702pub struct StepUpdate {
3703 #[serde(alias = "cascade_id", default, skip_serializing_if = "Option::is_none")]
3704 pub cascade_id: Option<String>,
3705 #[serde(
3706 alias = "trajectory_id",
3707 default,
3708 skip_serializing_if = "Option::is_none"
3709 )]
3710 pub trajectory_id: Option<String>,
3711 #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
3712 pub step_index: Option<u32>,
3713 #[serde(default, skip_serializing_if = "Option::is_none")]
3714 pub state: Option<StepUpdateState>,
3715 #[serde(default, skip_serializing_if = "Option::is_none")]
3716 pub source: Option<StepUpdateSource>,
3717 #[serde(default, skip_serializing_if = "Option::is_none")]
3718 pub target: Option<StepUpdateTarget>,
3719 #[serde(
3720 alias = "error_message",
3721 default,
3722 skip_serializing_if = "Option::is_none"
3723 )]
3724 pub error_message: Option<String>,
3725 #[serde(default, skip_serializing_if = "Option::is_none")]
3726 pub thinking: Option<String>,
3727 #[serde(alias = "text_delta", default, skip_serializing_if = "Option::is_none")]
3728 pub text_delta: Option<String>,
3729 #[serde(
3730 alias = "thinking_delta",
3731 default,
3732 skip_serializing_if = "Option::is_none"
3733 )]
3734 pub thinking_delta: Option<String>,
3735 #[serde(default, skip_serializing_if = "Option::is_none")]
3736 pub text: Option<String>,
3737 #[serde(
3738 alias = "list_directory",
3739 default,
3740 skip_serializing_if = "Option::is_none"
3741 )]
3742 pub list_directory: Option<ActionListDirectory>,
3743 #[serde(alias = "find_file", default, skip_serializing_if = "Option::is_none")]
3744 pub find_file: Option<ActionFindFile>,
3745 #[serde(
3746 alias = "search_directory",
3747 default,
3748 skip_serializing_if = "Option::is_none"
3749 )]
3750 pub search_directory: Option<ActionSearchDirectory>,
3751 #[serde(alias = "view_file", default, skip_serializing_if = "Option::is_none")]
3752 pub view_file: Option<ActionViewFile>,
3753 #[serde(
3754 alias = "create_file",
3755 default,
3756 skip_serializing_if = "Option::is_none"
3757 )]
3758 pub create_file: Option<ActionCreateFile>,
3759 #[serde(alias = "edit_file", default, skip_serializing_if = "Option::is_none")]
3760 pub edit_file: Option<ActionEditFile>,
3761 #[serde(
3762 alias = "run_command",
3763 default,
3764 skip_serializing_if = "Option::is_none"
3765 )]
3766 pub run_command: Option<ActionRunCommand>,
3767 #[serde(default, skip_serializing_if = "Option::is_none")]
3768 pub compaction: Option<ActionCompaction>,
3769 #[serde(
3770 alias = "invoke_subagent",
3771 default,
3772 skip_serializing_if = "Option::is_none"
3773 )]
3774 pub invoke_subagent: Option<ActionInvokeSubagent>,
3775 #[serde(
3776 alias = "generate_image",
3777 default,
3778 skip_serializing_if = "Option::is_none"
3779 )]
3780 pub generate_image: Option<ActionGenerateImage>,
3781 #[serde(default, skip_serializing_if = "Option::is_none")]
3782 pub finish: Option<ActionFinish>,
3783 #[serde(default, skip_serializing_if = "Option::is_none")]
3784 pub error: Option<ActionError>,
3785 #[serde(alias = "mcp_tool", default, skip_serializing_if = "Option::is_none")]
3786 pub mcp_tool: Option<ActionMcpTool>,
3787 #[serde(alias = "search_web", default, skip_serializing_if = "Option::is_none")]
3788 pub search_web: Option<ActionSearchWeb>,
3789 #[serde(
3790 alias = "read_url_content",
3791 default,
3792 skip_serializing_if = "Option::is_none"
3793 )]
3794 pub read_url_content: Option<ActionReadUrlContent>,
3795 #[serde(
3796 alias = "custom_tool",
3797 default,
3798 skip_serializing_if = "Option::is_none"
3799 )]
3800 pub custom_tool: Option<ActionCustomTool>,
3801 #[serde(
3802 alias = "request_text",
3803 default,
3804 skip_serializing_if = "Option::is_none"
3805 )]
3806 pub request_text: Option<String>,
3807 #[serde(
3808 alias = "tool_confirmation_request",
3809 default,
3810 skip_serializing_if = "Option::is_none"
3811 )]
3812 pub tool_confirmation_request: Option<ToolConfirmationRequest>,
3813 #[serde(
3814 alias = "questions_request",
3815 default,
3816 skip_serializing_if = "Option::is_none"
3817 )]
3818 pub questions_request: Option<UserQuestionsRequest>,
3819}
3820
3821#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3823#[serde(rename_all = "camelCase")]
3824pub struct Struct {
3825 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3826 pub fields: Vec<Field>,
3827}
3828
3829#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3831#[serde(rename_all = "camelCase")]
3832pub struct SubagentsConfig {
3833 #[serde(default, skip_serializing_if = "Option::is_none")]
3834 pub enabled: Option<bool>,
3835}
3836
3837#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3839#[serde(rename_all = "camelCase")]
3840pub struct SystemInstructions {
3841 #[serde(default, skip_serializing_if = "Option::is_none")]
3842 pub custom: Option<CustomSystemInstructions>,
3843 #[serde(default, skip_serializing_if = "Option::is_none")]
3844 pub appended: Option<AppendedSystemInstructions>,
3845}
3846
3847#[derive(Debug, Clone, PartialEq)]
3849pub enum SystemInstructionsType {
3850 Custom(CustomSystemInstructions),
3851 Appended(AppendedSystemInstructions),
3852}
3853
3854impl SystemInstructions {
3855 pub fn into_type(self) -> Option<SystemInstructionsType> {
3857 if let Some(v) = self.custom {
3858 return Some(SystemInstructionsType::Custom(v));
3859 }
3860 if let Some(v) = self.appended {
3861 return Some(SystemInstructionsType::Appended(v));
3862 }
3863 None
3864 }
3865
3866 pub fn has_type(&self) -> bool {
3868 self.custom.is_some() || self.appended.is_some()
3869 }
3870}
3871
3872#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3874#[serde(rename_all = "camelCase")]
3875pub struct TextContent {
3876 #[serde(default, skip_serializing_if = "Option::is_none")]
3877 pub text: Option<String>,
3878 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3879 pub annotations: Vec<TextContentAnnotation>,
3880}
3881
3882#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3884#[serde(rename_all = "camelCase")]
3885pub struct TextContentAnnotation {
3886 #[serde(
3887 alias = "url_citation",
3888 default,
3889 skip_serializing_if = "Option::is_none"
3890 )]
3891 pub url_citation: Option<UrlCitation>,
3892 #[serde(
3893 alias = "file_citation",
3894 default,
3895 skip_serializing_if = "Option::is_none"
3896 )]
3897 pub file_citation: Option<FileCitation>,
3898 #[serde(
3899 alias = "place_citation",
3900 default,
3901 skip_serializing_if = "Option::is_none"
3902 )]
3903 pub place_citation: Option<PlaceCitation>,
3904 #[serde(alias = "word_info", default, skip_serializing_if = "Option::is_none")]
3905 pub word_info: Option<WordInfo>,
3906 #[serde(
3907 alias = "start_index",
3908 default,
3909 skip_serializing_if = "Option::is_none"
3910 )]
3911 pub start_index: Option<i32>,
3912 #[serde(alias = "end_index", default, skip_serializing_if = "Option::is_none")]
3913 pub end_index: Option<i32>,
3914}
3915
3916#[derive(Debug, Clone, PartialEq)]
3918pub enum TextContentAnnotationType {
3919 UrlCitation(UrlCitation),
3920 FileCitation(FileCitation),
3921 PlaceCitation(PlaceCitation),
3922 WordInfo(WordInfo),
3923}
3924
3925impl TextContentAnnotation {
3926 pub fn into_type(self) -> Option<TextContentAnnotationType> {
3928 if let Some(v) = self.url_citation {
3929 return Some(TextContentAnnotationType::UrlCitation(v));
3930 }
3931 if let Some(v) = self.file_citation {
3932 return Some(TextContentAnnotationType::FileCitation(v));
3933 }
3934 if let Some(v) = self.place_citation {
3935 return Some(TextContentAnnotationType::PlaceCitation(v));
3936 }
3937 if let Some(v) = self.word_info {
3938 return Some(TextContentAnnotationType::WordInfo(v));
3939 }
3940 None
3941 }
3942
3943 pub fn has_type(&self) -> bool {
3945 self.url_citation.is_some()
3946 || self.file_citation.is_some()
3947 || self.place_citation.is_some()
3948 || self.word_info.is_some()
3949 }
3950}
3951
3952#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3954#[serde(rename_all = "camelCase")]
3955pub struct ThoughtContent {
3956 #[serde(
3957 default,
3958 skip_serializing_if = "Option::is_none",
3959 with = "crate::wire::opt_bytes"
3960 )]
3961 pub signature: Option<Vec<u8>>,
3962 #[serde(default, skip_serializing_if = "Vec::is_empty")]
3963 pub summary: Vec<ThoughtSummaryContent>,
3964}
3965
3966#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
3968#[serde(rename_all = "camelCase")]
3969pub struct ThoughtSummaryContent {
3970 #[serde(default, skip_serializing_if = "Option::is_none")]
3971 pub text: Option<TextContent>,
3972 #[serde(default, skip_serializing_if = "Option::is_none")]
3973 pub image: Option<ImageContent>,
3974}
3975
3976#[derive(Debug, Clone, PartialEq)]
3978pub enum ThoughtSummaryContentType {
3979 Text(TextContent),
3980 Image(ImageContent),
3981}
3982
3983impl ThoughtSummaryContent {
3984 pub fn into_type(self) -> Option<ThoughtSummaryContentType> {
3986 if let Some(v) = self.text {
3987 return Some(ThoughtSummaryContentType::Text(v));
3988 }
3989 if let Some(v) = self.image {
3990 return Some(ThoughtSummaryContentType::Image(v));
3991 }
3992 None
3993 }
3994
3995 pub fn has_type(&self) -> bool {
3997 self.text.is_some() || self.image.is_some()
3998 }
3999}
4000
4001#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4003#[serde(rename_all = "camelCase")]
4004pub struct Tool {
4005 #[serde(default, skip_serializing_if = "Option::is_none")]
4006 pub name: Option<String>,
4007 #[serde(default, skip_serializing_if = "Option::is_none")]
4008 pub description: Option<String>,
4009 #[serde(
4010 alias = "parameters_json_schema",
4011 default,
4012 skip_serializing_if = "Option::is_none"
4013 )]
4014 pub parameters_json_schema: Option<String>,
4015 #[serde(
4016 alias = "response_json_schema",
4017 default,
4018 skip_serializing_if = "Option::is_none"
4019 )]
4020 pub response_json_schema: Option<String>,
4021 #[serde(
4022 alias = "defer_loading",
4023 default,
4024 skip_serializing_if = "Option::is_none"
4025 )]
4026 pub defer_loading: Option<bool>,
4027}
4028
4029#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4031#[serde(rename_all = "camelCase")]
4032pub struct ToolCall {
4033 #[serde(default, skip_serializing_if = "Option::is_none")]
4034 pub id: Option<String>,
4035 #[serde(default, skip_serializing_if = "Option::is_none")]
4036 pub name: Option<String>,
4037 #[serde(
4038 alias = "arguments_json",
4039 default,
4040 skip_serializing_if = "Option::is_none"
4041 )]
4042 pub arguments_json: Option<String>,
4043 #[serde(default, skip_serializing_if = "Option::is_none")]
4044 pub arguments: Option<Struct>,
4045}
4046
4047#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4049#[serde(rename_all = "camelCase")]
4050pub struct ToolCallContent {
4051 #[serde(
4052 alias = "function_call",
4053 default,
4054 skip_serializing_if = "Option::is_none"
4055 )]
4056 pub function_call: Option<FunctionCallContent>,
4057 #[serde(
4058 alias = "code_execution_call",
4059 default,
4060 skip_serializing_if = "Option::is_none"
4061 )]
4062 pub code_execution_call: Option<CodeExecutionCallContent>,
4063 #[serde(
4064 alias = "url_context_call",
4065 default,
4066 skip_serializing_if = "Option::is_none"
4067 )]
4068 pub url_context_call: Option<UrlContextCallContent>,
4069 #[serde(
4070 alias = "mcp_server_tool_call",
4071 default,
4072 skip_serializing_if = "Option::is_none"
4073 )]
4074 pub mcp_server_tool_call: Option<McpServerToolCallContent>,
4075 #[serde(
4076 alias = "google_search_call",
4077 default,
4078 skip_serializing_if = "Option::is_none"
4079 )]
4080 pub google_search_call: Option<GoogleSearchCallContent>,
4081 #[serde(
4082 alias = "file_search_call",
4083 default,
4084 skip_serializing_if = "Option::is_none"
4085 )]
4086 pub file_search_call: Option<FileSearchCallContent>,
4087 #[serde(
4088 alias = "google_maps_call",
4089 default,
4090 skip_serializing_if = "Option::is_none"
4091 )]
4092 pub google_maps_call: Option<GoogleMapsCallContent>,
4093 #[serde(default, skip_serializing_if = "Option::is_none")]
4094 pub id: Option<String>,
4095 #[serde(
4096 default,
4097 skip_serializing_if = "Option::is_none",
4098 with = "crate::wire::opt_bytes"
4099 )]
4100 pub signature: Option<Vec<u8>>,
4101}
4102
4103#[derive(Debug, Clone, PartialEq)]
4105pub enum ToolCallContentType {
4106 FunctionCall(FunctionCallContent),
4107 CodeExecutionCall(CodeExecutionCallContent),
4108 UrlContextCall(UrlContextCallContent),
4109 McpServerToolCall(McpServerToolCallContent),
4110 GoogleSearchCall(GoogleSearchCallContent),
4111 FileSearchCall(FileSearchCallContent),
4112 GoogleMapsCall(GoogleMapsCallContent),
4113}
4114
4115impl ToolCallContent {
4116 pub fn into_type(self) -> Option<ToolCallContentType> {
4118 if let Some(v) = self.function_call {
4119 return Some(ToolCallContentType::FunctionCall(v));
4120 }
4121 if let Some(v) = self.code_execution_call {
4122 return Some(ToolCallContentType::CodeExecutionCall(v));
4123 }
4124 if let Some(v) = self.url_context_call {
4125 return Some(ToolCallContentType::UrlContextCall(v));
4126 }
4127 if let Some(v) = self.mcp_server_tool_call {
4128 return Some(ToolCallContentType::McpServerToolCall(v));
4129 }
4130 if let Some(v) = self.google_search_call {
4131 return Some(ToolCallContentType::GoogleSearchCall(v));
4132 }
4133 if let Some(v) = self.file_search_call {
4134 return Some(ToolCallContentType::FileSearchCall(v));
4135 }
4136 if let Some(v) = self.google_maps_call {
4137 return Some(ToolCallContentType::GoogleMapsCall(v));
4138 }
4139 None
4140 }
4141
4142 pub fn has_type(&self) -> bool {
4144 self.function_call.is_some()
4145 || self.code_execution_call.is_some()
4146 || self.url_context_call.is_some()
4147 || self.mcp_server_tool_call.is_some()
4148 || self.google_search_call.is_some()
4149 || self.file_search_call.is_some()
4150 || self.google_maps_call.is_some()
4151 }
4152}
4153
4154#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4156#[serde(rename_all = "camelCase")]
4157pub struct ToolConfirmation {
4158 #[serde(
4159 alias = "trajectory_id",
4160 default,
4161 skip_serializing_if = "Option::is_none"
4162 )]
4163 pub trajectory_id: Option<String>,
4164 #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
4165 pub step_index: Option<u32>,
4166 #[serde(default, skip_serializing_if = "Option::is_none")]
4167 pub accepted: Option<bool>,
4168}
4169
4170#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4172#[serde(rename_all = "camelCase")]
4173pub struct ToolConfirmationRequest {}
4174
4175#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4177#[serde(rename_all = "camelCase")]
4178pub struct ToolOutputTruncation {
4179 #[serde(default, skip_serializing_if = "Option::is_none")]
4180 pub truncate: Option<ToolOutputTruncationTruncateStrategy>,
4181 #[serde(default, skip_serializing_if = "Option::is_none")]
4182 pub error: Option<ToolOutputTruncationErrorStrategy>,
4183}
4184
4185#[derive(Debug, Clone, PartialEq)]
4187pub enum ToolOutputTruncationStrategy {
4188 Truncate(ToolOutputTruncationTruncateStrategy),
4189 Error(ToolOutputTruncationErrorStrategy),
4190}
4191
4192impl ToolOutputTruncation {
4193 pub fn into_strategy(self) -> Option<ToolOutputTruncationStrategy> {
4195 if let Some(v) = self.truncate {
4196 return Some(ToolOutputTruncationStrategy::Truncate(v));
4197 }
4198 if let Some(v) = self.error {
4199 return Some(ToolOutputTruncationStrategy::Error(v));
4200 }
4201 None
4202 }
4203
4204 pub fn has_strategy(&self) -> bool {
4206 self.truncate.is_some() || self.error.is_some()
4207 }
4208}
4209
4210#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4212#[serde(rename_all = "camelCase")]
4213pub struct ToolOutputTruncationErrorStrategy {
4214 #[serde(alias = "max_tokens", default, skip_serializing_if = "Option::is_none")]
4215 pub max_tokens: Option<i32>,
4216 #[serde(
4217 alias = "error_message",
4218 default,
4219 skip_serializing_if = "Option::is_none"
4220 )]
4221 pub error_message: Option<String>,
4222}
4223
4224#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4226#[serde(rename_all = "camelCase")]
4227pub struct ToolOutputTruncationTruncateStrategy {
4228 #[serde(alias = "max_tokens", default, skip_serializing_if = "Option::is_none")]
4229 pub max_tokens: Option<i32>,
4230}
4231
4232#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4234#[serde(rename_all = "camelCase")]
4235pub struct ToolResponse {
4236 #[serde(default, skip_serializing_if = "Option::is_none")]
4237 pub id: Option<String>,
4238 #[serde(
4239 alias = "response_json",
4240 default,
4241 skip_serializing_if = "Option::is_none"
4242 )]
4243 pub response_json: Option<String>,
4244 #[serde(
4245 alias = "supplemental_media",
4246 default,
4247 skip_serializing_if = "Vec::is_empty"
4248 )]
4249 pub supplemental_media: Vec<Media>,
4250 #[serde(default, skip_serializing_if = "Option::is_none")]
4251 pub response: Option<Struct>,
4252 #[serde(
4253 alias = "error_message",
4254 default,
4255 skip_serializing_if = "Option::is_none"
4256 )]
4257 pub error_message: Option<String>,
4258}
4259
4260#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4262#[serde(rename_all = "camelCase")]
4263pub struct ToolResultContent {
4264 #[serde(
4265 alias = "function_result",
4266 default,
4267 skip_serializing_if = "Option::is_none"
4268 )]
4269 pub function_result: Option<FunctionResultContent>,
4270 #[serde(
4271 alias = "code_execution_result",
4272 default,
4273 skip_serializing_if = "Option::is_none"
4274 )]
4275 pub code_execution_result: Option<CodeExecutionResultContent>,
4276 #[serde(
4277 alias = "url_context_result",
4278 default,
4279 skip_serializing_if = "Option::is_none"
4280 )]
4281 pub url_context_result: Option<UrlContextResultContent>,
4282 #[serde(
4283 alias = "google_search_result",
4284 default,
4285 skip_serializing_if = "Option::is_none"
4286 )]
4287 pub google_search_result: Option<GoogleSearchResultContent>,
4288 #[serde(
4289 alias = "mcp_server_tool_result",
4290 default,
4291 skip_serializing_if = "Option::is_none"
4292 )]
4293 pub mcp_server_tool_result: Option<McpServerToolResultContent>,
4294 #[serde(
4295 alias = "file_search_result",
4296 default,
4297 skip_serializing_if = "Option::is_none"
4298 )]
4299 pub file_search_result: Option<FileSearchResultContent>,
4300 #[serde(
4301 alias = "google_maps_result",
4302 default,
4303 skip_serializing_if = "Option::is_none"
4304 )]
4305 pub google_maps_result: Option<GoogleMapsResultContent>,
4306 #[serde(alias = "call_id", default, skip_serializing_if = "Option::is_none")]
4307 pub call_id: Option<String>,
4308 #[serde(
4309 default,
4310 skip_serializing_if = "Option::is_none",
4311 with = "crate::wire::opt_bytes"
4312 )]
4313 pub signature: Option<Vec<u8>>,
4314}
4315
4316#[derive(Debug, Clone, PartialEq)]
4318pub enum ToolResultContentType {
4319 FunctionResult(FunctionResultContent),
4320 CodeExecutionResult(CodeExecutionResultContent),
4321 UrlContextResult(UrlContextResultContent),
4322 GoogleSearchResult(GoogleSearchResultContent),
4323 McpServerToolResult(McpServerToolResultContent),
4324 FileSearchResult(FileSearchResultContent),
4325 GoogleMapsResult(GoogleMapsResultContent),
4326}
4327
4328impl ToolResultContent {
4329 pub fn into_type(self) -> Option<ToolResultContentType> {
4331 if let Some(v) = self.function_result {
4332 return Some(ToolResultContentType::FunctionResult(v));
4333 }
4334 if let Some(v) = self.code_execution_result {
4335 return Some(ToolResultContentType::CodeExecutionResult(v));
4336 }
4337 if let Some(v) = self.url_context_result {
4338 return Some(ToolResultContentType::UrlContextResult(v));
4339 }
4340 if let Some(v) = self.google_search_result {
4341 return Some(ToolResultContentType::GoogleSearchResult(v));
4342 }
4343 if let Some(v) = self.mcp_server_tool_result {
4344 return Some(ToolResultContentType::McpServerToolResult(v));
4345 }
4346 if let Some(v) = self.file_search_result {
4347 return Some(ToolResultContentType::FileSearchResult(v));
4348 }
4349 if let Some(v) = self.google_maps_result {
4350 return Some(ToolResultContentType::GoogleMapsResult(v));
4351 }
4352 None
4353 }
4354
4355 pub fn has_type(&self) -> bool {
4357 self.function_result.is_some()
4358 || self.code_execution_result.is_some()
4359 || self.url_context_result.is_some()
4360 || self.google_search_result.is_some()
4361 || self.mcp_server_tool_result.is_some()
4362 || self.file_search_result.is_some()
4363 || self.google_maps_result.is_some()
4364 }
4365}
4366
4367#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4369#[serde(rename_all = "camelCase")]
4370pub struct ToolSearchConfig {
4371 #[serde(default, skip_serializing_if = "Option::is_none")]
4372 pub enabled: Option<bool>,
4373}
4374
4375#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4377#[serde(rename_all = "camelCase")]
4378pub struct TrajectoryStateUpdate {
4379 #[serde(
4380 alias = "trajectory_id",
4381 default,
4382 skip_serializing_if = "Option::is_none"
4383 )]
4384 pub trajectory_id: Option<String>,
4385 #[serde(default, skip_serializing_if = "Option::is_none")]
4386 pub state: Option<TrajectoryStateUpdateState>,
4387 #[serde(default, skip_serializing_if = "Option::is_none")]
4388 pub error: Option<String>,
4389}
4390
4391#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4393#[serde(rename_all = "camelCase")]
4394pub struct TrajectoryUsageEntry {
4395 #[serde(
4396 alias = "trajectory_id",
4397 default,
4398 skip_serializing_if = "Option::is_none"
4399 )]
4400 pub trajectory_id: Option<String>,
4401 #[serde(default, skip_serializing_if = "Option::is_none")]
4402 pub usage: Option<UsageMetadata>,
4403}
4404
4405#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4407#[serde(rename_all = "camelCase")]
4408pub struct UrlCitation {
4409 #[serde(default, skip_serializing_if = "Option::is_none")]
4410 pub url: Option<String>,
4411 #[serde(default, skip_serializing_if = "Option::is_none")]
4412 pub title: Option<String>,
4413}
4414
4415#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4417#[serde(rename_all = "camelCase")]
4418pub struct UrlContextCallContent {
4419 #[serde(default, skip_serializing_if = "Option::is_none")]
4420 pub arguments: Option<UrlContextCallContentUrlContextCallArguments>,
4421}
4422
4423#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4425#[serde(rename_all = "camelCase")]
4426pub struct UrlContextCallContentUrlContextCallArguments {
4427 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4428 pub urls: Vec<String>,
4429}
4430
4431#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4433#[serde(rename_all = "camelCase")]
4434pub struct UrlContextResultContent {
4435 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4436 pub result: Vec<UrlContextResultContentUrlContextResult>,
4437 #[serde(alias = "is_error", default, skip_serializing_if = "Option::is_none")]
4438 pub is_error: Option<bool>,
4439}
4440
4441#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4443#[serde(rename_all = "camelCase")]
4444pub struct UrlContextResultContentUrlContextResult {
4445 #[serde(default, skip_serializing_if = "Option::is_none")]
4446 pub url: Option<String>,
4447 #[serde(default, skip_serializing_if = "Option::is_none")]
4448 pub status: Option<UrlContextResultContentUrlContextResultStatus>,
4449}
4450
4451#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4453#[serde(rename_all = "camelCase")]
4454pub struct UsageMetadata {
4455 #[serde(
4456 alias = "prompt_token_count",
4457 default,
4458 skip_serializing_if = "Option::is_none",
4459 with = "crate::wire::opt_int"
4460 )]
4461 pub prompt_token_count: Option<u64>,
4462 #[serde(
4463 alias = "cached_content_token_count",
4464 default,
4465 skip_serializing_if = "Option::is_none",
4466 with = "crate::wire::opt_int"
4467 )]
4468 pub cached_content_token_count: Option<u64>,
4469 #[serde(
4470 alias = "candidates_token_count",
4471 default,
4472 skip_serializing_if = "Option::is_none",
4473 with = "crate::wire::opt_int"
4474 )]
4475 pub candidates_token_count: Option<u64>,
4476 #[serde(
4477 alias = "thoughts_token_count",
4478 default,
4479 skip_serializing_if = "Option::is_none",
4480 with = "crate::wire::opt_int"
4481 )]
4482 pub thoughts_token_count: Option<u64>,
4483 #[serde(
4484 alias = "total_token_count",
4485 default,
4486 skip_serializing_if = "Option::is_none",
4487 with = "crate::wire::opt_int"
4488 )]
4489 pub total_token_count: Option<u64>,
4490 #[serde(
4491 alias = "service_tier",
4492 default,
4493 skip_serializing_if = "Option::is_none"
4494 )]
4495 pub service_tier: Option<String>,
4496}
4497
4498#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4500#[serde(rename_all = "camelCase")]
4501pub struct UsageUpdate {
4502 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4503 pub agents: Vec<TrajectoryUsageEntry>,
4504 #[serde(default, skip_serializing_if = "Option::is_none")]
4505 pub total: Option<UsageMetadata>,
4506}
4507
4508#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4510#[serde(rename_all = "camelCase")]
4511pub struct UserInput {
4512 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4513 pub parts: Vec<UserInputPart>,
4514}
4515
4516#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4518#[serde(rename_all = "camelCase")]
4519pub struct UserInputMedia {
4520 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
4521 pub mime_type: Option<String>,
4522 #[serde(default, skip_serializing_if = "Option::is_none")]
4523 pub description: Option<String>,
4524 #[serde(
4525 default,
4526 skip_serializing_if = "Option::is_none",
4527 with = "crate::wire::opt_bytes"
4528 )]
4529 pub data: Option<Vec<u8>>,
4530}
4531
4532#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4534#[serde(rename_all = "camelCase")]
4535pub struct UserInputPart {
4536 #[serde(default, skip_serializing_if = "Option::is_none")]
4537 pub text: Option<String>,
4538 #[serde(default, skip_serializing_if = "Option::is_none")]
4539 pub media: Option<UserInputMedia>,
4540 #[serde(
4541 alias = "slash_command",
4542 default,
4543 skip_serializing_if = "Option::is_none"
4544 )]
4545 pub slash_command: Option<UserInputSlashCommand>,
4546}
4547
4548#[derive(Debug, Clone, PartialEq)]
4550pub enum UserInputPartPart {
4551 Text(String),
4552 Media(UserInputMedia),
4553 SlashCommand(UserInputSlashCommand),
4554}
4555
4556impl UserInputPart {
4557 pub fn into_part(self) -> Option<UserInputPartPart> {
4559 if let Some(v) = self.text {
4560 return Some(UserInputPartPart::Text(v));
4561 }
4562 if let Some(v) = self.media {
4563 return Some(UserInputPartPart::Media(v));
4564 }
4565 if let Some(v) = self.slash_command {
4566 return Some(UserInputPartPart::SlashCommand(v));
4567 }
4568 None
4569 }
4570
4571 pub fn has_part(&self) -> bool {
4573 self.text.is_some() || self.media.is_some() || self.slash_command.is_some()
4574 }
4575}
4576
4577#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4579#[serde(rename_all = "camelCase")]
4580pub struct UserInputSlashCommand {
4581 #[serde(default, skip_serializing_if = "Option::is_none")]
4582 pub name: Option<String>,
4583}
4584
4585#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4587#[serde(rename_all = "camelCase")]
4588pub struct UserQuestion {
4589 #[serde(
4590 alias = "multiple_choice",
4591 default,
4592 skip_serializing_if = "Option::is_none"
4593 )]
4594 pub multiple_choice: Option<MultipleChoice>,
4595}
4596
4597#[derive(Debug, Clone, PartialEq)]
4599pub enum UserQuestionQuestionType {
4600 MultipleChoice(MultipleChoice),
4601}
4602
4603impl UserQuestion {
4604 pub fn into_question_type(self) -> Option<UserQuestionQuestionType> {
4606 if let Some(v) = self.multiple_choice {
4607 return Some(UserQuestionQuestionType::MultipleChoice(v));
4608 }
4609 None
4610 }
4611
4612 pub fn has_question_type(&self) -> bool {
4614 self.multiple_choice.is_some()
4615 }
4616}
4617
4618#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4620#[serde(rename_all = "camelCase")]
4621pub struct UserQuestionAnswer {
4622 #[serde(default, skip_serializing_if = "Option::is_none")]
4623 pub unanswered: Option<bool>,
4624 #[serde(
4625 alias = "multiple_choice_answer",
4626 default,
4627 skip_serializing_if = "Option::is_none"
4628 )]
4629 pub multiple_choice_answer: Option<MultipleChoiceAnswer>,
4630}
4631
4632#[derive(Debug, Clone, PartialEq)]
4634pub enum UserQuestionAnswerAnswer {
4635 Unanswered(bool),
4636 MultipleChoiceAnswer(MultipleChoiceAnswer),
4637}
4638
4639impl UserQuestionAnswer {
4640 pub fn into_answer(self) -> Option<UserQuestionAnswerAnswer> {
4642 if let Some(v) = self.unanswered {
4643 return Some(UserQuestionAnswerAnswer::Unanswered(v));
4644 }
4645 if let Some(v) = self.multiple_choice_answer {
4646 return Some(UserQuestionAnswerAnswer::MultipleChoiceAnswer(v));
4647 }
4648 None
4649 }
4650
4651 pub fn has_answer(&self) -> bool {
4653 self.unanswered.is_some() || self.multiple_choice_answer.is_some()
4654 }
4655}
4656
4657#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4659#[serde(rename_all = "camelCase")]
4660pub struct UserQuestionsConfig {
4661 #[serde(default, skip_serializing_if = "Option::is_none")]
4662 pub enabled: Option<bool>,
4663}
4664
4665#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4667#[serde(rename_all = "camelCase")]
4668pub struct UserQuestionsRequest {
4669 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4670 pub questions: Vec<UserQuestion>,
4671}
4672
4673#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4675#[serde(rename_all = "camelCase")]
4676pub struct UserQuestionsResponse {
4677 #[serde(default, skip_serializing_if = "Option::is_none")]
4678 pub cancelled: Option<bool>,
4679 #[serde(default, skip_serializing_if = "Option::is_none")]
4680 pub response: Option<UserQuestionsResponseQuestionsResponse>,
4681 #[serde(
4682 alias = "trajectory_id",
4683 default,
4684 skip_serializing_if = "Option::is_none"
4685 )]
4686 pub trajectory_id: Option<String>,
4687 #[serde(alias = "step_index", default, skip_serializing_if = "Option::is_none")]
4688 pub step_index: Option<u32>,
4689}
4690
4691#[derive(Debug, Clone, PartialEq)]
4693pub enum UserQuestionsResponseResult {
4694 Cancelled(bool),
4695 Response(UserQuestionsResponseQuestionsResponse),
4696}
4697
4698impl UserQuestionsResponse {
4699 pub fn into_result(self) -> Option<UserQuestionsResponseResult> {
4701 if let Some(v) = self.cancelled {
4702 return Some(UserQuestionsResponseResult::Cancelled(v));
4703 }
4704 if let Some(v) = self.response {
4705 return Some(UserQuestionsResponseResult::Response(v));
4706 }
4707 None
4708 }
4709
4710 pub fn has_result(&self) -> bool {
4712 self.cancelled.is_some() || self.response.is_some()
4713 }
4714}
4715
4716#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4718#[serde(rename_all = "camelCase")]
4719pub struct UserQuestionsResponseQuestionsResponse {
4720 #[serde(default, skip_serializing_if = "Vec::is_empty")]
4721 pub answers: Vec<UserQuestionAnswer>,
4722}
4723
4724#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4726#[serde(rename_all = "camelCase")]
4727pub struct Value {
4728 #[serde(alias = "null_value", default, skip_serializing_if = "Option::is_none")]
4729 pub null_value: Option<NullValue>,
4730 #[serde(
4731 alias = "number_value",
4732 default,
4733 skip_serializing_if = "Option::is_none"
4734 )]
4735 pub number_value: Option<f64>,
4736 #[serde(
4737 alias = "string_value",
4738 default,
4739 skip_serializing_if = "Option::is_none"
4740 )]
4741 pub string_value: Option<String>,
4742 #[serde(alias = "bool_value", default, skip_serializing_if = "Option::is_none")]
4743 pub bool_value: Option<bool>,
4744 #[serde(
4745 alias = "struct_value",
4746 default,
4747 skip_serializing_if = "Option::is_none"
4748 )]
4749 pub struct_value: Option<Struct>,
4750 #[serde(alias = "list_value", default, skip_serializing_if = "Option::is_none")]
4751 pub list_value: Option<ListValue>,
4752 #[serde(
4753 alias = "content_value",
4754 default,
4755 skip_serializing_if = "Option::is_none"
4756 )]
4757 pub content_value: Option<Content>,
4758}
4759
4760#[derive(Debug, Clone, PartialEq)]
4762pub enum ValueKind {
4763 NullValue(NullValue),
4764 NumberValue(f64),
4765 StringValue(String),
4766 BoolValue(bool),
4767 StructValue(Struct),
4768 ListValue(ListValue),
4769 ContentValue(Content),
4770}
4771
4772impl Value {
4773 pub fn into_kind(self) -> Option<ValueKind> {
4775 if let Some(v) = self.null_value {
4776 return Some(ValueKind::NullValue(v));
4777 }
4778 if let Some(v) = self.number_value {
4779 return Some(ValueKind::NumberValue(v));
4780 }
4781 if let Some(v) = self.string_value {
4782 return Some(ValueKind::StringValue(v));
4783 }
4784 if let Some(v) = self.bool_value {
4785 return Some(ValueKind::BoolValue(v));
4786 }
4787 if let Some(v) = self.struct_value {
4788 return Some(ValueKind::StructValue(v));
4789 }
4790 if let Some(v) = self.list_value {
4791 return Some(ValueKind::ListValue(v));
4792 }
4793 if let Some(v) = self.content_value {
4794 return Some(ValueKind::ContentValue(v));
4795 }
4796 None
4797 }
4798
4799 pub fn has_kind(&self) -> bool {
4801 self.null_value.is_some()
4802 || self.number_value.is_some()
4803 || self.string_value.is_some()
4804 || self.bool_value.is_some()
4805 || self.struct_value.is_some()
4806 || self.list_value.is_some()
4807 || self.content_value.is_some()
4808 }
4809}
4810
4811#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4813#[serde(rename_all = "camelCase")]
4814pub struct VertexEndpoint {
4815 #[serde(alias = "base_url", default, skip_serializing_if = "Option::is_none")]
4816 pub base_url: Option<String>,
4817 #[serde(
4818 alias = "http_headers",
4819 default,
4820 skip_serializing_if = "HashMap::is_empty"
4821 )]
4822 pub http_headers: HashMap<String, String>,
4823 #[serde(default, skip_serializing_if = "Option::is_none")]
4824 pub project: Option<String>,
4825 #[serde(default, skip_serializing_if = "Option::is_none")]
4826 pub location: Option<String>,
4827 #[serde(default, skip_serializing_if = "Option::is_none")]
4828 pub options: Option<GeminiModelOptions>,
4829}
4830
4831#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4833#[serde(rename_all = "camelCase")]
4834pub struct VideoContent {
4835 #[serde(
4836 default,
4837 skip_serializing_if = "Option::is_none",
4838 with = "crate::wire::opt_bytes"
4839 )]
4840 pub data: Option<Vec<u8>>,
4841 #[serde(default, skip_serializing_if = "Option::is_none")]
4842 pub uri: Option<String>,
4843 #[serde(alias = "mime_type", default, skip_serializing_if = "Option::is_none")]
4844 pub mime_type: Option<VideoContentMimeType>,
4845 #[serde(default, skip_serializing_if = "Option::is_none")]
4846 pub resolution: Option<MediaResolution>,
4847}
4848
4849#[derive(Debug, Clone, PartialEq)]
4851pub enum VideoContentDataOrUri {
4852 Data(Vec<u8>),
4853 Uri(String),
4854}
4855
4856impl VideoContent {
4857 pub fn into_data_or_uri(self) -> Option<VideoContentDataOrUri> {
4859 if let Some(v) = self.data {
4860 return Some(VideoContentDataOrUri::Data(v));
4861 }
4862 if let Some(v) = self.uri {
4863 return Some(VideoContentDataOrUri::Uri(v));
4864 }
4865 None
4866 }
4867
4868 pub fn has_data_or_uri(&self) -> bool {
4870 self.data.is_some() || self.uri.is_some()
4871 }
4872}
4873
4874#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4876#[serde(rename_all = "camelCase")]
4877pub struct ViewFileToolConfig {
4878 #[serde(default, skip_serializing_if = "Option::is_none")]
4879 pub enabled: Option<bool>,
4880}
4881
4882#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4884#[serde(rename_all = "camelCase")]
4885pub struct WordInfo {
4886 #[serde(default, skip_serializing_if = "Option::is_none")]
4887 pub text: Option<String>,
4888 #[serde(
4889 alias = "start_offset",
4890 default,
4891 skip_serializing_if = "Option::is_none"
4892 )]
4893 pub start_offset: Option<String>,
4894 #[serde(alias = "end_offset", default, skip_serializing_if = "Option::is_none")]
4895 pub end_offset: Option<String>,
4896 #[serde(default, skip_serializing_if = "Option::is_none")]
4897 pub speaker: Option<String>,
4898}
4899
4900#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4902#[serde(rename_all = "camelCase")]
4903pub struct Workspace {
4904 #[serde(
4905 alias = "filesystem_workspace",
4906 default,
4907 skip_serializing_if = "Option::is_none"
4908 )]
4909 pub filesystem_workspace: Option<FilesystemWorkspace>,
4910}
4911
4912#[derive(Debug, Clone, PartialEq)]
4914pub enum WorkspaceWorkspaceType {
4915 FilesystemWorkspace(FilesystemWorkspace),
4916}
4917
4918impl Workspace {
4919 pub fn into_workspace_type(self) -> Option<WorkspaceWorkspaceType> {
4921 if let Some(v) = self.filesystem_workspace {
4922 return Some(WorkspaceWorkspaceType::FilesystemWorkspace(v));
4923 }
4924 None
4925 }
4926
4927 pub fn has_workspace_type(&self) -> bool {
4929 self.filesystem_workspace.is_some()
4930 }
4931}
4932
4933#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
4935#[serde(rename_all = "camelCase")]
4936pub struct WriteToFileToolConfig {
4937 #[serde(default, skip_serializing_if = "Option::is_none")]
4938 pub enabled: Option<bool>,
4939}