1use crate::error::OpenAIError;
2pub use crate::types::{
3 CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
4 ResponseFormatJsonSchema,
5};
6use derive_builder::Builder;
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9use std::collections::HashMap;
10
11#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
13#[serde(rename_all = "lowercase")]
14pub enum Role {
15 User,
16 Assistant,
17 System,
18 Developer,
19}
20
21#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
23#[serde(rename_all = "snake_case")]
24pub enum OutputStatus {
25 InProgress,
26 Completed,
27 Incomplete,
28}
29
30#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
32#[serde(untagged)]
33pub enum Input {
34 Text(String),
36 Items(Vec<InputItem>),
38}
39
40#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
42#[serde(untagged, rename_all = "snake_case")]
43pub enum InputItem {
44 Message(InputMessage),
45 Custom(serde_json::Value),
46}
47
48#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
50#[builder(
51 name = "InputMessageArgs",
52 pattern = "mutable",
53 setter(into, strip_option),
54 default
55)]
56#[builder(build_fn(error = "OpenAIError"))]
57pub struct InputMessage {
58 #[serde(default, rename = "type")]
59 pub kind: InputMessageType,
60 pub role: Role,
62 pub content: InputContent,
65}
66
67#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
68#[serde(rename_all = "snake_case")]
69pub enum InputMessageType {
70 #[default]
71 Message,
72}
73
74#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
75#[serde(untagged)]
76pub enum InputContent {
77 TextInput(String),
79 InputItemContentList(Vec<ContentType>),
81}
82
83#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
85#[serde(tag = "type", rename_all = "snake_case")]
86pub enum ContentType {
87 InputText(InputText),
89 InputImage(InputImage),
91 InputFile(InputFile),
93}
94
95#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
96pub struct InputText {
97 text: String,
98}
99
100#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
101#[builder(
102 name = "InputImageArgs",
103 pattern = "mutable",
104 setter(into, strip_option),
105 default
106)]
107#[builder(build_fn(error = "OpenAIError"))]
108pub struct InputImage {
109 detail: ImageDetail,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 file_id: Option<String>,
114 #[serde(skip_serializing_if = "Option::is_none")]
117 image_url: Option<String>,
118}
119
120#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
121#[builder(
122 name = "InputFileArgs",
123 pattern = "mutable",
124 setter(into, strip_option),
125 default
126)]
127#[builder(build_fn(error = "OpenAIError"))]
128pub struct InputFile {
129 #[serde(skip_serializing_if = "Option::is_none")]
131 file_data: Option<String>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 file_id: Option<String>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 filename: Option<String>,
138}
139
140#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
142#[builder(
143 name = "CreateResponseArgs",
144 pattern = "mutable",
145 setter(into, strip_option),
146 default
147)]
148#[builder(build_fn(error = "OpenAIError"))]
149pub struct CreateResponse {
150 pub input: Input,
152
153 pub model: String,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
176 pub include: Option<Vec<String>>,
177
178 #[serde(skip_serializing_if = "Option::is_none")]
184 pub instructions: Option<String>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
189 pub max_output_tokens: Option<u32>,
190
191 #[serde(skip_serializing_if = "Option::is_none")]
198 pub metadata: Option<HashMap<String, String>>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub parallel_tool_calls: Option<bool>,
203
204 #[serde(skip_serializing_if = "Option::is_none")]
207 pub previous_response_id: Option<String>,
208
209 #[serde(skip_serializing_if = "Option::is_none")]
211 pub reasoning: Option<ReasoningConfig>,
212
213 #[serde(skip_serializing_if = "Option::is_none")]
233 pub service_tier: Option<ServiceTier>,
234
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub store: Option<bool>,
238
239 #[serde(skip_serializing_if = "Option::is_none")]
244 pub temperature: Option<f32>,
245
246 #[serde(skip_serializing_if = "Option::is_none")]
249 pub text: Option<TextConfig>,
250
251 #[serde(skip_serializing_if = "Option::is_none")]
254 pub tool_choice: Option<ToolChoice>,
255
256 #[serde(skip_serializing_if = "Option::is_none")]
260 pub tools: Option<Vec<ToolDefinition>>,
261
262 #[serde(skip_serializing_if = "Option::is_none")]
268 pub top_p: Option<f32>,
269
270 #[serde(skip_serializing_if = "Option::is_none")]
274 pub truncation: Option<Truncation>,
275
276 #[serde(skip_serializing_if = "Option::is_none")]
279 pub user: Option<String>,
280}
281
282#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
284#[serde(rename_all = "lowercase")]
285pub enum ServiceTier {
286 Auto,
287 Default,
288 Flex,
289}
290
291#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
293#[serde(rename_all = "lowercase")]
294pub enum Truncation {
295 Auto,
296 Disabled,
297}
298
299#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
301#[builder(
302 name = "ReasoningConfigArgs",
303 pattern = "mutable",
304 setter(into, strip_option),
305 default
306)]
307#[builder(build_fn(error = "OpenAIError"))]
308pub struct ReasoningConfig {
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub effort: Option<ReasoningEffort>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub summary: Option<ReasoningSummary>,
315}
316
317#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
318#[serde(rename_all = "lowercase")]
319pub enum ReasoningSummary {
320 Auto,
321 Concise,
322 Detailed,
323}
324
325#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
327pub struct TextConfig {
328 pub format: TextResponseFormat,
330}
331
332#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
333#[serde(tag = "type", rename_all = "snake_case")]
334pub enum TextResponseFormat {
335 Text,
337 JsonObject,
339 JsonSchema(ResponseFormatJsonSchema),
341}
342
343#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
345#[serde(tag = "type", rename_all = "snake_case")]
346pub enum ToolDefinition {
347 FileSearch(FileSearch),
349 Function(Function),
351 WebSearchPreview(WebSearchPreview),
353 ComputerUsePreview(ComputerUsePreview),
355 Mcp(Mcp),
357 CodeInterpreter(CodeInterpreter),
359 ImageGeneration(ImageGeneration),
361 LocalShell,
363}
364
365#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
366#[builder(
367 name = "FileSearchArgs",
368 pattern = "mutable",
369 setter(into, strip_option),
370 default
371)]
372#[builder(build_fn(error = "OpenAIError"))]
373pub struct FileSearch {
374 pub vector_store_ids: Vec<String>,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub max_num_results: Option<u32>,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub filters: Option<Filter>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub ranking_options: Option<RankingOptions>,
385}
386
387#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
388#[builder(
389 name = "FunctionArgs",
390 pattern = "mutable",
391 setter(into, strip_option),
392 default
393)]
394pub struct Function {
395 pub name: String,
397 pub parameters: serde_json::Value,
399 pub strict: bool,
401 #[serde(skip_serializing_if = "Option::is_none")]
404 pub description: Option<String>,
405}
406
407#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
408#[builder(
409 name = "WebSearchPreviewArgs",
410 pattern = "mutable",
411 setter(into, strip_option),
412 default
413)]
414pub struct WebSearchPreview {
415 #[serde(skip_serializing_if = "Option::is_none")]
417 pub user_location: Option<Location>,
418 #[serde(skip_serializing_if = "Option::is_none")]
420 pub search_context_size: Option<WebSearchContextSize>,
421}
422
423#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
424#[serde(rename_all = "lowercase")]
425pub enum WebSearchContextSize {
426 Low,
427 Medium,
428 High,
429}
430
431#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
432#[builder(
433 name = "ComputerUsePreviewArgs",
434 pattern = "mutable",
435 setter(into, strip_option),
436 default
437)]
438pub struct ComputerUsePreview {
439 environment: String,
441 display_width: u32,
443 display_height: u32,
445}
446
447#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
449pub struct RankingOptions {
450 pub ranker: String,
452 #[serde(skip_serializing_if = "Option::is_none")]
455 pub score_threshold: Option<f32>,
456}
457
458#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
460#[serde(untagged)]
461pub enum Filter {
462 Comparison(ComparisonFilter),
465 Compound(CompoundFilter),
467}
468
469#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
471pub struct ComparisonFilter {
472 #[serde(rename = "type")]
474 pub op: ComparisonType,
475 pub key: String,
477 pub value: serde_json::Value,
479}
480
481#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
482pub enum ComparisonType {
483 #[serde(rename = "eq")]
484 Equals,
485 #[serde(rename = "ne")]
486 NotEquals,
487 #[serde(rename = "gt")]
488 GreaterThan,
489 #[serde(rename = "gte")]
490 GreaterThanOrEqualTo,
491 #[serde(rename = "lt")]
492 LessThan,
493 #[serde(rename = "lte")]
494 LessThanOrEqualTo,
495}
496
497#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
499pub struct CompoundFilter {
500 #[serde(rename = "type")]
502 pub op: ComparisonType,
503 pub filters: Vec<Filter>,
505}
506
507#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
508#[serde(rename_all = "lowercase")]
509pub enum CompoundType {
510 And,
511 Or,
512}
513
514#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
516#[builder(
517 name = "LocationArgs",
518 pattern = "mutable",
519 setter(into, strip_option),
520 default
521)]
522#[builder(build_fn(error = "OpenAIError"))]
523pub struct Location {
524 #[serde(rename = "type")]
526 pub kind: String,
527 #[serde(skip_serializing_if = "Option::is_none")]
529 pub city: Option<String>,
530 #[serde(skip_serializing_if = "Option::is_none")]
532 pub country: Option<String>,
533 #[serde(skip_serializing_if = "Option::is_none")]
535 pub region: Option<String>,
536 #[serde(skip_serializing_if = "Option::is_none")]
538 pub timezone: Option<String>,
539}
540
541#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
543#[builder(
544 name = "McpArgs",
545 pattern = "mutable",
546 setter(into, strip_option),
547 default
548)]
549#[builder(build_fn(error = "OpenAIError"))]
550pub struct Mcp {
551 pub server_label: String,
553 pub server_url: String,
555 #[serde(skip_serializing_if = "Option::is_none")]
557 pub allowed_tools: Option<AllowedTools>,
558 #[serde(skip_serializing_if = "Option::is_none")]
560 pub headers: Option<Value>,
561 #[serde(skip_serializing_if = "Option::is_none")]
563 pub require_approval: Option<RequireApproval>,
564}
565
566#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
568#[serde(untagged)]
569pub enum AllowedTools {
570 List(Vec<String>),
572 Filter(McpAllowedToolsFilter),
574}
575
576#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
578pub struct McpAllowedToolsFilter {
579 #[serde(skip_serializing_if = "Option::is_none")]
581 pub tool_names: Option<Vec<String>>,
582}
583
584#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
586#[serde(untagged)]
587pub enum RequireApproval {
588 Policy(RequireApprovalPolicy),
590 Filter(McpApprovalFilter),
592}
593
594#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
595#[serde(rename_all = "lowercase")]
596pub enum RequireApprovalPolicy {
597 Always,
598 Never,
599}
600
601#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
603pub struct McpApprovalFilter {
604 #[serde(skip_serializing_if = "Option::is_none")]
606 pub always: Option<McpAllowedToolsFilter>,
607 #[serde(skip_serializing_if = "Option::is_none")]
609 pub never: Option<McpAllowedToolsFilter>,
610}
611
612#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
614#[serde(untagged)]
615pub enum CodeInterpreterContainer {
616 Id(String),
618 Container(CodeInterpreterContainerKind),
620}
621
622#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
624#[serde(tag = "type", rename_all = "snake_case")]
625pub enum CodeInterpreterContainerKind {
626 Auto {
627 #[serde(skip_serializing_if = "Option::is_none")]
629 file_ids: Option<Vec<String>>,
630 },
631}
632
633#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
635#[builder(
636 name = "CodeInterpreterArgs",
637 pattern = "mutable",
638 setter(into, strip_option),
639 default
640)]
641#[builder(build_fn(error = "OpenAIError"))]
642pub struct CodeInterpreter {
643 pub container: CodeInterpreterContainer,
645}
646
647#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
649pub struct InputImageMask {
650 #[serde(skip_serializing_if = "Option::is_none")]
652 pub image_url: Option<String>,
653 #[serde(skip_serializing_if = "Option::is_none")]
655 pub file_id: Option<String>,
656}
657
658#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
660#[builder(
661 name = "ImageGenerationArgs",
662 pattern = "mutable",
663 setter(into, strip_option),
664 default
665)]
666#[builder(build_fn(error = "OpenAIError"))]
667pub struct ImageGeneration {
668 #[serde(skip_serializing_if = "Option::is_none")]
670 pub background: Option<ImageGenerationBackground>,
671 #[serde(skip_serializing_if = "Option::is_none")]
673 pub input_image_mask: Option<InputImageMask>,
674 #[serde(skip_serializing_if = "Option::is_none")]
676 pub model: Option<String>,
677 #[serde(skip_serializing_if = "Option::is_none")]
679 pub moderation: Option<String>,
680 #[serde(skip_serializing_if = "Option::is_none")]
682 pub output_compression: Option<u8>,
683 #[serde(skip_serializing_if = "Option::is_none")]
685 pub output_format: Option<ImageGenerationOutputFormat>,
686 #[serde(skip_serializing_if = "Option::is_none")]
688 pub partial_images: Option<u8>,
689 #[serde(skip_serializing_if = "Option::is_none")]
691 pub quality: Option<ImageGenerationQuality>,
692 #[serde(skip_serializing_if = "Option::is_none")]
694 pub size: Option<ImageGenerationSize>,
695}
696
697#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
698#[serde(rename_all = "lowercase")]
699pub enum ImageGenerationBackground {
700 Transparent,
701 Opaque,
702 Auto,
703}
704
705#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
706#[serde(rename_all = "lowercase")]
707pub enum ImageGenerationOutputFormat {
708 Png,
709 Webp,
710 Jpeg,
711}
712
713#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
714#[serde(rename_all = "lowercase")]
715pub enum ImageGenerationQuality {
716 Low,
717 Medium,
718 High,
719 Auto,
720}
721
722#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
723#[serde(rename_all = "lowercase")]
724pub enum ImageGenerationSize {
725 Auto,
726 #[serde(rename = "1024x1024")]
727 Size1024x1024,
728 #[serde(rename = "1024x1536")]
729 Size1024x1536,
730 #[serde(rename = "1536x1024")]
731 Size1536x1024,
732}
733
734#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
736#[serde(untagged)]
737pub enum ToolChoice {
738 Mode(ToolChoiceMode),
740 Hosted {
742 #[serde(rename = "type")]
744 kind: HostedToolType,
745 },
746 Function {
748 name: String,
750 },
751}
752
753#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
755#[serde(rename_all = "lowercase")]
756pub enum ToolChoiceMode {
757 None,
759 Auto,
761 Required,
763}
764
765#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
767#[serde(rename_all = "snake_case")]
768pub enum HostedToolType {
769 FileSearch,
770 WebSearchPreview,
771 ComputerUsePreview,
772}
773
774#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
776pub struct ErrorObject {
777 pub code: String,
779 pub message: String,
781}
782
783#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
785pub struct IncompleteDetails {
786 pub reason: String,
788}
789
790#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
792pub struct OutputText {
793 pub annotations: Vec<Annotation>,
795 pub text: String,
797}
798
799#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
800#[serde(tag = "type", rename_all = "snake_case")]
801pub enum Annotation {
802 FileCitation(FileCitation),
804 UrlCitation(UrlCitation),
806 FilePath(FilePath),
808}
809
810#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
811pub struct FileCitation {
812 file_id: String,
814 index: u32,
816}
817
818#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
819pub struct UrlCitation {
820 end_index: u32,
822 start_index: u32,
824 title: String,
826 url: String,
828}
829
830#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
831pub struct FilePath {
832 file_id: String,
834 index: u32,
836}
837
838#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
840pub struct Refusal {
841 pub refusal: String,
843}
844
845#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
847pub struct OutputMessage {
848 pub content: Vec<Content>,
850 pub id: String,
852 pub role: Role,
854 pub status: OutputStatus,
856}
857
858#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
859#[serde(tag = "type", rename_all = "snake_case")]
860pub enum Content {
861 OutputText(OutputText),
863 Refusal(Refusal),
865}
866
867#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
869#[serde(tag = "type", rename_all = "snake_case")]
870pub enum OutputContent {
871 Message(OutputMessage),
873 FileSearchCall(FileSearchCallOutput),
875 FunctionCall(FunctionCall),
877 WebSearchCall(WebSearchCallOutput),
879 ComputerCall(ComputerCallOutput),
881 Reasoning(ReasoningItem),
885 ImageGenerationCall(ImageGenerationCallOutput),
887 CodeInterpreterCall(CodeInterpreterCallOutput),
889 LocalShellCall(LocalShellCallOutput),
891 McpCall(McpCallOutput),
893 McpListTools(McpListToolsOutput),
895 McpApprovalRequest(McpApprovalRequestOutput),
897}
898
899#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
901pub struct ReasoningItem {
902 pub id: String,
904 pub summary: Vec<SummaryText>,
906 #[serde(skip_serializing_if = "Option::is_none")]
909 pub encrypted_content: Option<String>,
910 #[serde(skip_serializing_if = "Option::is_none")]
912 pub status: Option<OutputStatus>,
913}
914
915#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
917pub struct SummaryText {
918 pub text: String,
920}
921
922#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
924pub struct FileSearchCallOutput {
925 pub id: String,
927 pub queries: Vec<String>,
929 pub status: FileSearchCallOutputStatus,
931 #[serde(skip_serializing_if = "Option::is_none")]
933 pub results: Option<Vec<FileSearchResult>>,
934}
935
936#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
937#[serde(rename_all = "snake_case")]
938pub enum FileSearchCallOutputStatus {
939 InProgress,
940 Searching,
941 Incomplete,
942 Failed,
943}
944
945#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
947pub struct FileSearchResult {
948 pub file_id: String,
950 pub filename: String,
952 pub score: f32,
954 pub text: String,
956 pub attributes: HashMap<String, serde_json::Value>,
961}
962
963#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
964pub struct SafetyCheck {
965 pub id: String,
967 pub code: String,
969 pub message: String,
971}
972
973#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
975pub struct WebSearchCallOutput {
976 pub id: String,
978 pub status: String,
980}
981
982#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
984pub struct ComputerCallOutput {
985 pub action: ComputerCallAction,
986 pub call_id: String,
988 pub id: String,
990 pub pending_safety_checks: Vec<SafetyCheck>,
992 pub status: OutputStatus,
994}
995
996#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
998pub struct Point {
999 pub x: i32,
1000 pub y: i32,
1001}
1002
1003#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1005#[serde(tag = "type", rename_all = "snake_case")]
1006pub enum ComputerCallAction {
1007 Click(Click),
1009
1010 DoubleClick(DoubleClick),
1012
1013 Drag(Drag),
1015
1016 KeyPress(KeyPress),
1018
1019 Move(MoveAction),
1021
1022 Screenshot,
1024
1025 Scroll(Scroll),
1027
1028 Type(TypeAction),
1030
1031 Wait,
1033}
1034
1035#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1036#[serde(rename_all = "snake_case")]
1037pub enum ButtonPress {
1038 Left,
1039 Right,
1040 Wheel,
1041 Back,
1042 Forward,
1043}
1044
1045#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1047pub struct Click {
1048 pub button: ButtonPress,
1050 pub x: i32,
1052 pub y: i32,
1054}
1055
1056#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1058pub struct DoubleClick {
1059 pub x: i32,
1061 pub y: i32,
1063}
1064
1065#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1067pub struct Drag {
1068 pub path: Vec<Point>,
1070 pub x: i32,
1072 pub y: i32,
1074}
1075
1076#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1078pub struct KeyPress {
1079 pub keys: Vec<String>,
1081}
1082
1083#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1085pub struct MoveAction {
1086 pub x: i32,
1088 pub y: i32,
1090}
1091
1092#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1094pub struct Scroll {
1095 pub scroll_x: i32,
1097 pub scroll_y: i32,
1099 pub x: i32,
1101 pub y: i32,
1103}
1104
1105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1107pub struct TypeAction {
1108 pub text: String,
1110}
1111
1112#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1114pub struct FunctionCall {
1115 pub id: String,
1117 pub call_id: String,
1119 pub name: String,
1121 pub arguments: String,
1123 pub status: OutputStatus,
1125}
1126
1127#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1129pub struct ImageGenerationCallOutput {
1130 pub id: String,
1132 pub result: Option<String>,
1134 pub status: String,
1136}
1137
1138#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1140pub struct CodeInterpreterCallOutput {
1141 pub code: String,
1143 pub id: String,
1145 pub status: String,
1147 pub container_id: String,
1149 pub results: Vec<CodeInterpreterResult>,
1151}
1152
1153#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1155#[serde(tag = "type", rename_all = "snake_case")]
1156pub enum CodeInterpreterResult {
1157 Logs(CodeInterpreterTextOutput),
1159 Files(CodeInterpreterFileOutput),
1161}
1162
1163#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1165pub struct CodeInterpreterTextOutput {
1166 pub logs: String,
1168}
1169
1170#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1172pub struct CodeInterpreterFileOutput {
1173 pub files: Vec<CodeInterpreterFile>,
1175}
1176
1177#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1178pub struct CodeInterpreterFile {
1179 file_id: String,
1181 mime_type: String,
1183}
1184
1185#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1187pub struct LocalShellCallOutput {
1188 pub action: LocalShellAction,
1190 pub call_id: String,
1192 pub id: String,
1194 pub status: String,
1196}
1197
1198#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1200pub struct LocalShellAction {
1201 pub command: Vec<String>,
1203 pub env: HashMap<String, String>,
1205 pub timeout_ms: Option<u64>,
1207 pub user: Option<String>,
1209 pub working_directory: Option<String>,
1211}
1212
1213#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1215pub struct McpCallOutput {
1216 pub arguments: String,
1218 pub id: String,
1220 pub name: String,
1222 pub server_label: String,
1224 pub error: Option<String>,
1226 pub output: Option<String>,
1228}
1229
1230#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1232pub struct McpListToolsOutput {
1233 pub id: String,
1235 pub server_label: String,
1237 pub tools: Vec<McpToolInfo>,
1239 #[serde(skip_serializing_if = "Option::is_none")]
1241 pub error: Option<String>,
1242}
1243
1244#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1246pub struct McpToolInfo {
1247 pub name: String,
1249 pub input_schema: Value,
1251 #[serde(skip_serializing_if = "Option::is_none")]
1253 pub annotations: Option<Value>,
1254 #[serde(skip_serializing_if = "Option::is_none")]
1256 pub description: Option<String>,
1257}
1258
1259#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1261pub struct McpApprovalRequestOutput {
1262 pub arguments: String,
1264 pub id: String,
1266 pub name: String,
1268 pub server_label: String,
1270}
1271
1272#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1274pub struct Usage {
1275 pub input_tokens: u32,
1277 pub input_tokens_details: PromptTokensDetails,
1279 pub output_tokens: u32,
1281 pub output_tokens_details: CompletionTokensDetails,
1283 pub total_tokens: u32,
1285}
1286
1287#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1289pub struct Response {
1290 pub created_at: u64,
1292
1293 #[serde(skip_serializing_if = "Option::is_none")]
1295 pub error: Option<ErrorObject>,
1296
1297 pub id: String,
1299
1300 #[serde(skip_serializing_if = "Option::is_none")]
1302 pub incomplete_details: Option<IncompleteDetails>,
1303
1304 #[serde(skip_serializing_if = "Option::is_none")]
1306 pub instructions: Option<String>,
1307
1308 #[serde(skip_serializing_if = "Option::is_none")]
1310 pub max_output_tokens: Option<u32>,
1311
1312 #[serde(skip_serializing_if = "Option::is_none")]
1314 pub metadata: Option<HashMap<String, String>>,
1315
1316 pub model: String,
1318
1319 pub object: String,
1321
1322 pub output: Vec<OutputContent>,
1324
1325 #[serde(skip_serializing_if = "Option::is_none")]
1327 pub parallel_tool_calls: Option<bool>,
1328
1329 #[serde(skip_serializing_if = "Option::is_none")]
1331 pub previous_response_id: Option<String>,
1332
1333 #[serde(skip_serializing_if = "Option::is_none")]
1335 pub reasoning: Option<ReasoningConfig>,
1336
1337 #[serde(skip_serializing_if = "Option::is_none")]
1339 pub service_tier: Option<ServiceTier>,
1340
1341 pub status: Status,
1343
1344 #[serde(skip_serializing_if = "Option::is_none")]
1346 pub temperature: Option<f32>,
1347
1348 #[serde(skip_serializing_if = "Option::is_none")]
1350 pub text: Option<TextConfig>,
1351
1352 #[serde(skip_serializing_if = "Option::is_none")]
1354 pub tool_choice: Option<ToolChoice>,
1355
1356 #[serde(skip_serializing_if = "Option::is_none")]
1358 pub tools: Option<Vec<ToolDefinition>>,
1359
1360 #[serde(skip_serializing_if = "Option::is_none")]
1362 pub top_p: Option<f32>,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub truncation: Option<Truncation>,
1367
1368 #[serde(skip_serializing_if = "Option::is_none")]
1370 pub usage: Option<Usage>,
1371
1372 #[serde(skip_serializing_if = "Option::is_none")]
1374 pub user: Option<String>,
1375}
1376
1377#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1378#[serde(rename_all = "snake_case")]
1379pub enum Status {
1380 Completed,
1381 Failed,
1382 InProgress,
1383 Incomplete,
1384}