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 Completed,
944}
945
946#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
948pub struct FileSearchResult {
949 pub file_id: String,
951 pub filename: String,
953 pub score: f32,
955 pub text: String,
957 pub attributes: HashMap<String, serde_json::Value>,
962}
963
964#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
965pub struct SafetyCheck {
966 pub id: String,
968 pub code: String,
970 pub message: String,
972}
973
974#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
976pub struct WebSearchCallOutput {
977 pub id: String,
979 pub status: String,
981}
982
983#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
985pub struct ComputerCallOutput {
986 pub action: ComputerCallAction,
987 pub call_id: String,
989 pub id: String,
991 pub pending_safety_checks: Vec<SafetyCheck>,
993 pub status: OutputStatus,
995}
996
997#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
999pub struct Point {
1000 pub x: i32,
1001 pub y: i32,
1002}
1003
1004#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1006#[serde(tag = "type", rename_all = "snake_case")]
1007pub enum ComputerCallAction {
1008 Click(Click),
1010
1011 DoubleClick(DoubleClick),
1013
1014 Drag(Drag),
1016
1017 KeyPress(KeyPress),
1019
1020 Move(MoveAction),
1022
1023 Screenshot,
1025
1026 Scroll(Scroll),
1028
1029 Type(TypeAction),
1031
1032 Wait,
1034}
1035
1036#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1037#[serde(rename_all = "snake_case")]
1038pub enum ButtonPress {
1039 Left,
1040 Right,
1041 Wheel,
1042 Back,
1043 Forward,
1044}
1045
1046#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1048pub struct Click {
1049 pub button: ButtonPress,
1051 pub x: i32,
1053 pub y: i32,
1055}
1056
1057#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1059pub struct DoubleClick {
1060 pub x: i32,
1062 pub y: i32,
1064}
1065
1066#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1068pub struct Drag {
1069 pub path: Vec<Point>,
1071 pub x: i32,
1073 pub y: i32,
1075}
1076
1077#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1079pub struct KeyPress {
1080 pub keys: Vec<String>,
1082}
1083
1084#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1086pub struct MoveAction {
1087 pub x: i32,
1089 pub y: i32,
1091}
1092
1093#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1095pub struct Scroll {
1096 pub scroll_x: i32,
1098 pub scroll_y: i32,
1100 pub x: i32,
1102 pub y: i32,
1104}
1105
1106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1108pub struct TypeAction {
1109 pub text: String,
1111}
1112
1113#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1115pub struct FunctionCall {
1116 pub id: String,
1118 pub call_id: String,
1120 pub name: String,
1122 pub arguments: String,
1124 pub status: OutputStatus,
1126}
1127
1128#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1130pub struct ImageGenerationCallOutput {
1131 pub id: String,
1133 pub result: Option<String>,
1135 pub status: String,
1137}
1138
1139#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1141pub struct CodeInterpreterCallOutput {
1142 pub code: String,
1144 pub id: String,
1146 pub status: String,
1148 pub container_id: String,
1150 pub results: Vec<CodeInterpreterResult>,
1152}
1153
1154#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1156#[serde(tag = "type", rename_all = "snake_case")]
1157pub enum CodeInterpreterResult {
1158 Logs(CodeInterpreterTextOutput),
1160 Files(CodeInterpreterFileOutput),
1162}
1163
1164#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1166pub struct CodeInterpreterTextOutput {
1167 pub logs: String,
1169}
1170
1171#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1173pub struct CodeInterpreterFileOutput {
1174 pub files: Vec<CodeInterpreterFile>,
1176}
1177
1178#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1179pub struct CodeInterpreterFile {
1180 file_id: String,
1182 mime_type: String,
1184}
1185
1186#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1188pub struct LocalShellCallOutput {
1189 pub action: LocalShellAction,
1191 pub call_id: String,
1193 pub id: String,
1195 pub status: String,
1197}
1198
1199#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1201pub struct LocalShellAction {
1202 pub command: Vec<String>,
1204 pub env: HashMap<String, String>,
1206 pub timeout_ms: Option<u64>,
1208 pub user: Option<String>,
1210 pub working_directory: Option<String>,
1212}
1213
1214#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1216pub struct McpCallOutput {
1217 pub arguments: String,
1219 pub id: String,
1221 pub name: String,
1223 pub server_label: String,
1225 pub error: Option<String>,
1227 pub output: Option<String>,
1229}
1230
1231#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1233pub struct McpListToolsOutput {
1234 pub id: String,
1236 pub server_label: String,
1238 pub tools: Vec<McpToolInfo>,
1240 #[serde(skip_serializing_if = "Option::is_none")]
1242 pub error: Option<String>,
1243}
1244
1245#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1247pub struct McpToolInfo {
1248 pub name: String,
1250 pub input_schema: Value,
1252 #[serde(skip_serializing_if = "Option::is_none")]
1254 pub annotations: Option<Value>,
1255 #[serde(skip_serializing_if = "Option::is_none")]
1257 pub description: Option<String>,
1258}
1259
1260#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1262pub struct McpApprovalRequestOutput {
1263 pub arguments: String,
1265 pub id: String,
1267 pub name: String,
1269 pub server_label: String,
1271}
1272
1273#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1275pub struct Usage {
1276 pub input_tokens: u32,
1278 pub input_tokens_details: PromptTokensDetails,
1280 pub output_tokens: u32,
1282 pub output_tokens_details: CompletionTokensDetails,
1284 pub total_tokens: u32,
1286}
1287
1288#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1290pub struct Response {
1291 pub created_at: u64,
1293
1294 #[serde(skip_serializing_if = "Option::is_none")]
1296 pub error: Option<ErrorObject>,
1297
1298 pub id: String,
1300
1301 #[serde(skip_serializing_if = "Option::is_none")]
1303 pub incomplete_details: Option<IncompleteDetails>,
1304
1305 #[serde(skip_serializing_if = "Option::is_none")]
1307 pub instructions: Option<String>,
1308
1309 #[serde(skip_serializing_if = "Option::is_none")]
1311 pub max_output_tokens: Option<u32>,
1312
1313 #[serde(skip_serializing_if = "Option::is_none")]
1315 pub metadata: Option<HashMap<String, String>>,
1316
1317 pub model: String,
1319
1320 pub object: String,
1322
1323 pub output: Vec<OutputContent>,
1325
1326 #[serde(skip_serializing_if = "Option::is_none")]
1328 pub parallel_tool_calls: Option<bool>,
1329
1330 #[serde(skip_serializing_if = "Option::is_none")]
1332 pub previous_response_id: Option<String>,
1333
1334 #[serde(skip_serializing_if = "Option::is_none")]
1336 pub reasoning: Option<ReasoningConfig>,
1337
1338 #[serde(skip_serializing_if = "Option::is_none")]
1340 pub service_tier: Option<ServiceTier>,
1341
1342 pub status: Status,
1344
1345 #[serde(skip_serializing_if = "Option::is_none")]
1347 pub temperature: Option<f32>,
1348
1349 #[serde(skip_serializing_if = "Option::is_none")]
1351 pub text: Option<TextConfig>,
1352
1353 #[serde(skip_serializing_if = "Option::is_none")]
1355 pub tool_choice: Option<ToolChoice>,
1356
1357 #[serde(skip_serializing_if = "Option::is_none")]
1359 pub tools: Option<Vec<ToolDefinition>>,
1360
1361 #[serde(skip_serializing_if = "Option::is_none")]
1363 pub top_p: Option<f32>,
1364
1365 #[serde(skip_serializing_if = "Option::is_none")]
1367 pub truncation: Option<Truncation>,
1368
1369 #[serde(skip_serializing_if = "Option::is_none")]
1371 pub usage: Option<Usage>,
1372
1373 #[serde(skip_serializing_if = "Option::is_none")]
1375 pub user: Option<String>,
1376}
1377
1378#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1379#[serde(rename_all = "snake_case")]
1380pub enum Status {
1381 Completed,
1382 Failed,
1383 InProgress,
1384 Incomplete,
1385}