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 pub 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 pub detail: ImageDetail,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub file_id: Option<String>,
114 #[serde(skip_serializing_if = "Option::is_none")]
117 pub 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 pub file_data: Option<String>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub file_id: Option<String>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub 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")]
161 pub background: Option<bool>,
162
163 #[serde(skip_serializing_if = "Option::is_none")]
181 pub include: Option<Vec<String>>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
189 pub instructions: Option<String>,
190
191 #[serde(skip_serializing_if = "Option::is_none")]
194 pub max_output_tokens: Option<u32>,
195
196 pub max_tool_calls: Option<u32>,
200
201 #[serde(skip_serializing_if = "Option::is_none")]
208 pub metadata: Option<HashMap<String, String>>,
209
210 #[serde(skip_serializing_if = "Option::is_none")]
212 pub parallel_tool_calls: Option<bool>,
213
214 #[serde(skip_serializing_if = "Option::is_none")]
217 pub previous_response_id: Option<String>,
218
219 #[serde(skip_serializing_if = "Option::is_none")]
221 pub prompt: Option<PromptConfig>,
222
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub reasoning: Option<ReasoningConfig>,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
247 pub service_tier: Option<ServiceTier>,
248
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub store: Option<bool>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
256 pub stream: Option<bool>,
257
258 #[serde(skip_serializing_if = "Option::is_none")]
263 pub temperature: Option<f32>,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
268 pub text: Option<TextConfig>,
269
270 #[serde(skip_serializing_if = "Option::is_none")]
273 pub tool_choice: Option<ToolChoice>,
274
275 #[serde(skip_serializing_if = "Option::is_none")]
279 pub tools: Option<Vec<ToolDefinition>>,
280
281 #[serde(skip_serializing_if = "Option::is_none")]
284 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
292 pub top_p: Option<f32>,
293
294 #[serde(skip_serializing_if = "Option::is_none")]
298 pub truncation: Option<Truncation>,
299
300 #[serde(skip_serializing_if = "Option::is_none")]
303 pub user: Option<String>,
304
305 #[serde(skip_serializing_if = "Option::is_none")]
307 pub prompt_cache_key: Option<String>,
308}
309
310#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
312pub struct PromptConfig {
313 pub id: String,
315
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub version: Option<String>,
319
320 #[serde(skip_serializing_if = "Option::is_none")]
324 pub variables: Option<HashMap<String, String>>,
325}
326
327#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
329#[serde(rename_all = "lowercase")]
330pub enum ServiceTier {
331 Auto,
332 Default,
333 Flex,
334}
335
336#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
338#[serde(rename_all = "lowercase")]
339pub enum Truncation {
340 Auto,
341 Disabled,
342}
343
344#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
346#[builder(
347 name = "ReasoningConfigArgs",
348 pattern = "mutable",
349 setter(into, strip_option),
350 default
351)]
352#[builder(build_fn(error = "OpenAIError"))]
353pub struct ReasoningConfig {
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub effort: Option<ReasoningEffort>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub summary: Option<ReasoningSummary>,
360}
361
362#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
363#[serde(rename_all = "lowercase")]
364pub enum ReasoningSummary {
365 Auto,
366 Concise,
367 Detailed,
368}
369
370#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
372pub struct TextConfig {
373 pub format: TextResponseFormat,
375}
376
377#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
378#[serde(tag = "type", rename_all = "snake_case")]
379pub enum TextResponseFormat {
380 Text,
382 JsonObject,
384 JsonSchema(ResponseFormatJsonSchema),
386}
387
388#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
390#[serde(tag = "type", rename_all = "snake_case")]
391pub enum ToolDefinition {
392 FileSearch(FileSearch),
394 Function(Function),
396 WebSearchPreview(WebSearchPreview),
398 ComputerUsePreview(ComputerUsePreview),
400 Mcp(Mcp),
402 CodeInterpreter(CodeInterpreter),
404 ImageGeneration(ImageGeneration),
406 LocalShell,
408}
409
410#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
411#[builder(
412 name = "FileSearchArgs",
413 pattern = "mutable",
414 setter(into, strip_option),
415 default
416)]
417#[builder(build_fn(error = "OpenAIError"))]
418pub struct FileSearch {
419 pub vector_store_ids: Vec<String>,
421 #[serde(skip_serializing_if = "Option::is_none")]
423 pub max_num_results: Option<u32>,
424 #[serde(skip_serializing_if = "Option::is_none")]
426 pub filters: Option<Filter>,
427 #[serde(skip_serializing_if = "Option::is_none")]
429 pub ranking_options: Option<RankingOptions>,
430}
431
432#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
433#[builder(
434 name = "FunctionArgs",
435 pattern = "mutable",
436 setter(into, strip_option),
437 default
438)]
439pub struct Function {
440 pub name: String,
442 pub parameters: serde_json::Value,
444 pub strict: bool,
446 #[serde(skip_serializing_if = "Option::is_none")]
449 pub description: Option<String>,
450}
451
452#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
453#[builder(
454 name = "WebSearchPreviewArgs",
455 pattern = "mutable",
456 setter(into, strip_option),
457 default
458)]
459pub struct WebSearchPreview {
460 #[serde(skip_serializing_if = "Option::is_none")]
462 pub user_location: Option<Location>,
463 #[serde(skip_serializing_if = "Option::is_none")]
465 pub search_context_size: Option<WebSearchContextSize>,
466}
467
468#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
469#[serde(rename_all = "lowercase")]
470pub enum WebSearchContextSize {
471 Low,
472 Medium,
473 High,
474}
475
476#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
477#[builder(
478 name = "ComputerUsePreviewArgs",
479 pattern = "mutable",
480 setter(into, strip_option),
481 default
482)]
483pub struct ComputerUsePreview {
484 environment: String,
486 display_width: u32,
488 display_height: u32,
490}
491
492#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
494pub struct RankingOptions {
495 pub ranker: String,
497 #[serde(skip_serializing_if = "Option::is_none")]
500 pub score_threshold: Option<f32>,
501}
502
503#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
505#[serde(untagged)]
506pub enum Filter {
507 Comparison(ComparisonFilter),
510 Compound(CompoundFilter),
512}
513
514#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
516pub struct ComparisonFilter {
517 #[serde(rename = "type")]
519 pub op: ComparisonType,
520 pub key: String,
522 pub value: serde_json::Value,
524}
525
526#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
527pub enum ComparisonType {
528 #[serde(rename = "eq")]
529 Equals,
530 #[serde(rename = "ne")]
531 NotEquals,
532 #[serde(rename = "gt")]
533 GreaterThan,
534 #[serde(rename = "gte")]
535 GreaterThanOrEqualTo,
536 #[serde(rename = "lt")]
537 LessThan,
538 #[serde(rename = "lte")]
539 LessThanOrEqualTo,
540}
541
542#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
544pub struct CompoundFilter {
545 #[serde(rename = "type")]
547 pub op: ComparisonType,
548 pub filters: Vec<Filter>,
550}
551
552#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
553#[serde(rename_all = "lowercase")]
554pub enum CompoundType {
555 And,
556 Or,
557}
558
559#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
561#[builder(
562 name = "LocationArgs",
563 pattern = "mutable",
564 setter(into, strip_option),
565 default
566)]
567#[builder(build_fn(error = "OpenAIError"))]
568pub struct Location {
569 #[serde(rename = "type")]
571 pub kind: String,
572 #[serde(skip_serializing_if = "Option::is_none")]
574 pub city: Option<String>,
575 #[serde(skip_serializing_if = "Option::is_none")]
577 pub country: Option<String>,
578 #[serde(skip_serializing_if = "Option::is_none")]
580 pub region: Option<String>,
581 #[serde(skip_serializing_if = "Option::is_none")]
583 pub timezone: Option<String>,
584}
585
586#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
588#[builder(
589 name = "McpArgs",
590 pattern = "mutable",
591 setter(into, strip_option),
592 default
593)]
594#[builder(build_fn(error = "OpenAIError"))]
595pub struct Mcp {
596 pub server_label: String,
598 pub server_url: String,
600 #[serde(skip_serializing_if = "Option::is_none")]
602 pub allowed_tools: Option<AllowedTools>,
603 #[serde(skip_serializing_if = "Option::is_none")]
605 pub headers: Option<Value>,
606 #[serde(skip_serializing_if = "Option::is_none")]
608 pub require_approval: Option<RequireApproval>,
609}
610
611#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
613#[serde(untagged)]
614pub enum AllowedTools {
615 List(Vec<String>),
617 Filter(McpAllowedToolsFilter),
619}
620
621#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
623pub struct McpAllowedToolsFilter {
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub tool_names: Option<Vec<String>>,
627}
628
629#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
631#[serde(untagged)]
632pub enum RequireApproval {
633 Policy(RequireApprovalPolicy),
635 Filter(McpApprovalFilter),
637}
638
639#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
640#[serde(rename_all = "lowercase")]
641pub enum RequireApprovalPolicy {
642 Always,
643 Never,
644}
645
646#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
648pub struct McpApprovalFilter {
649 #[serde(skip_serializing_if = "Option::is_none")]
651 pub always: Option<McpAllowedToolsFilter>,
652 #[serde(skip_serializing_if = "Option::is_none")]
654 pub never: Option<McpAllowedToolsFilter>,
655}
656
657#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
659#[serde(untagged)]
660pub enum CodeInterpreterContainer {
661 Id(String),
663 Container(CodeInterpreterContainerKind),
665}
666
667#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
669#[serde(tag = "type", rename_all = "snake_case")]
670pub enum CodeInterpreterContainerKind {
671 Auto {
672 #[serde(skip_serializing_if = "Option::is_none")]
674 file_ids: Option<Vec<String>>,
675 },
676}
677
678#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
680#[builder(
681 name = "CodeInterpreterArgs",
682 pattern = "mutable",
683 setter(into, strip_option),
684 default
685)]
686#[builder(build_fn(error = "OpenAIError"))]
687pub struct CodeInterpreter {
688 pub container: CodeInterpreterContainer,
690}
691
692#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
694pub struct InputImageMask {
695 #[serde(skip_serializing_if = "Option::is_none")]
697 pub image_url: Option<String>,
698 #[serde(skip_serializing_if = "Option::is_none")]
700 pub file_id: Option<String>,
701}
702
703#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
705#[builder(
706 name = "ImageGenerationArgs",
707 pattern = "mutable",
708 setter(into, strip_option),
709 default
710)]
711#[builder(build_fn(error = "OpenAIError"))]
712pub struct ImageGeneration {
713 #[serde(skip_serializing_if = "Option::is_none")]
715 pub background: Option<ImageGenerationBackground>,
716 #[serde(skip_serializing_if = "Option::is_none")]
718 pub input_image_mask: Option<InputImageMask>,
719 #[serde(skip_serializing_if = "Option::is_none")]
721 pub model: Option<String>,
722 #[serde(skip_serializing_if = "Option::is_none")]
724 pub moderation: Option<String>,
725 #[serde(skip_serializing_if = "Option::is_none")]
727 pub output_compression: Option<u8>,
728 #[serde(skip_serializing_if = "Option::is_none")]
730 pub output_format: Option<ImageGenerationOutputFormat>,
731 #[serde(skip_serializing_if = "Option::is_none")]
733 pub partial_images: Option<u8>,
734 #[serde(skip_serializing_if = "Option::is_none")]
736 pub quality: Option<ImageGenerationQuality>,
737 #[serde(skip_serializing_if = "Option::is_none")]
739 pub size: Option<ImageGenerationSize>,
740}
741
742#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
743#[serde(rename_all = "lowercase")]
744pub enum ImageGenerationBackground {
745 Transparent,
746 Opaque,
747 Auto,
748}
749
750#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
751#[serde(rename_all = "lowercase")]
752pub enum ImageGenerationOutputFormat {
753 Png,
754 Webp,
755 Jpeg,
756}
757
758#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
759#[serde(rename_all = "lowercase")]
760pub enum ImageGenerationQuality {
761 Low,
762 Medium,
763 High,
764 Auto,
765}
766
767#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
768#[serde(rename_all = "lowercase")]
769pub enum ImageGenerationSize {
770 Auto,
771 #[serde(rename = "1024x1024")]
772 Size1024x1024,
773 #[serde(rename = "1024x1536")]
774 Size1024x1536,
775 #[serde(rename = "1536x1024")]
776 Size1536x1024,
777}
778
779#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
781#[serde(untagged)]
782pub enum ToolChoice {
783 Mode(ToolChoiceMode),
785 Hosted {
787 #[serde(rename = "type")]
789 kind: HostedToolType,
790 },
791 Function {
793 name: String,
795 },
796}
797
798#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
800#[serde(rename_all = "lowercase")]
801pub enum ToolChoiceMode {
802 None,
804 Auto,
806 Required,
808}
809
810#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
812#[serde(rename_all = "snake_case")]
813pub enum HostedToolType {
814 FileSearch,
815 WebSearchPreview,
816 ComputerUsePreview,
817}
818
819#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
821pub struct ErrorObject {
822 pub code: String,
824 pub message: String,
826}
827
828#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
830pub struct IncompleteDetails {
831 pub reason: String,
833}
834
835#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
837pub struct OutputText {
838 pub annotations: Vec<Annotation>,
840 pub text: String,
842}
843
844#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
845#[serde(tag = "type", rename_all = "snake_case")]
846pub enum Annotation {
847 FileCitation(FileCitation),
849 UrlCitation(UrlCitation),
851 FilePath(FilePath),
853}
854
855#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
856pub struct FileCitation {
857 file_id: String,
859 index: u32,
861}
862
863#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
864pub struct UrlCitation {
865 end_index: u32,
867 start_index: u32,
869 title: String,
871 url: String,
873}
874
875#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
876pub struct FilePath {
877 file_id: String,
879 index: u32,
881}
882
883#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
885pub struct Refusal {
886 pub refusal: String,
888}
889
890#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
892pub struct OutputMessage {
893 pub content: Vec<Content>,
895 pub id: String,
897 pub role: Role,
899 pub status: OutputStatus,
901}
902
903#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
904#[serde(tag = "type", rename_all = "snake_case")]
905pub enum Content {
906 OutputText(OutputText),
908 Refusal(Refusal),
910}
911
912#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
914#[serde(tag = "type", rename_all = "snake_case")]
915pub enum OutputContent {
916 Message(OutputMessage),
918 FileSearchCall(FileSearchCallOutput),
920 FunctionCall(FunctionCall),
922 WebSearchCall(WebSearchCallOutput),
924 ComputerCall(ComputerCallOutput),
926 Reasoning(ReasoningItem),
930 ImageGenerationCall(ImageGenerationCallOutput),
932 CodeInterpreterCall(CodeInterpreterCallOutput),
934 LocalShellCall(LocalShellCallOutput),
936 McpCall(McpCallOutput),
938 McpListTools(McpListToolsOutput),
940 McpApprovalRequest(McpApprovalRequestOutput),
942}
943
944#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
946pub struct ReasoningItem {
947 pub id: String,
949 pub summary: Vec<SummaryText>,
951 #[serde(skip_serializing_if = "Option::is_none")]
954 pub encrypted_content: Option<String>,
955 #[serde(skip_serializing_if = "Option::is_none")]
957 pub status: Option<OutputStatus>,
958}
959
960#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
962pub struct SummaryText {
963 pub text: String,
965}
966
967#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
969pub struct FileSearchCallOutput {
970 pub id: String,
972 pub queries: Vec<String>,
974 pub status: FileSearchCallOutputStatus,
976 #[serde(skip_serializing_if = "Option::is_none")]
978 pub results: Option<Vec<FileSearchResult>>,
979}
980
981#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
982#[serde(rename_all = "snake_case")]
983pub enum FileSearchCallOutputStatus {
984 InProgress,
985 Searching,
986 Incomplete,
987 Failed,
988 Completed,
989}
990
991#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
993pub struct FileSearchResult {
994 pub file_id: String,
996 pub filename: String,
998 pub score: f32,
1000 pub text: String,
1002 pub attributes: HashMap<String, serde_json::Value>,
1007}
1008
1009#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1010pub struct SafetyCheck {
1011 pub id: String,
1013 pub code: String,
1015 pub message: String,
1017}
1018
1019#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1021pub struct WebSearchCallOutput {
1022 pub id: String,
1024 pub status: String,
1026}
1027
1028#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1030pub struct ComputerCallOutput {
1031 pub action: ComputerCallAction,
1032 pub call_id: String,
1034 pub id: String,
1036 pub pending_safety_checks: Vec<SafetyCheck>,
1038 pub status: OutputStatus,
1040}
1041
1042#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1044pub struct Point {
1045 pub x: i32,
1046 pub y: i32,
1047}
1048
1049#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1051#[serde(tag = "type", rename_all = "snake_case")]
1052pub enum ComputerCallAction {
1053 Click(Click),
1055
1056 DoubleClick(DoubleClick),
1058
1059 Drag(Drag),
1061
1062 KeyPress(KeyPress),
1064
1065 Move(MoveAction),
1067
1068 Screenshot,
1070
1071 Scroll(Scroll),
1073
1074 Type(TypeAction),
1076
1077 Wait,
1079}
1080
1081#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1082#[serde(rename_all = "snake_case")]
1083pub enum ButtonPress {
1084 Left,
1085 Right,
1086 Wheel,
1087 Back,
1088 Forward,
1089}
1090
1091#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1093pub struct Click {
1094 pub button: ButtonPress,
1096 pub x: i32,
1098 pub y: i32,
1100}
1101
1102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1104pub struct DoubleClick {
1105 pub x: i32,
1107 pub y: i32,
1109}
1110
1111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1113pub struct Drag {
1114 pub path: Vec<Point>,
1116 pub x: i32,
1118 pub y: i32,
1120}
1121
1122#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1124pub struct KeyPress {
1125 pub keys: Vec<String>,
1127}
1128
1129#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1131pub struct MoveAction {
1132 pub x: i32,
1134 pub y: i32,
1136}
1137
1138#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1140pub struct Scroll {
1141 pub scroll_x: i32,
1143 pub scroll_y: i32,
1145 pub x: i32,
1147 pub y: i32,
1149}
1150
1151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1153pub struct TypeAction {
1154 pub text: String,
1156}
1157
1158#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1160pub struct FunctionCall {
1161 pub id: String,
1163 pub call_id: String,
1165 pub name: String,
1167 pub arguments: String,
1169 pub status: OutputStatus,
1171}
1172
1173#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1175pub struct ImageGenerationCallOutput {
1176 pub id: String,
1178 pub result: Option<String>,
1180 pub status: String,
1182}
1183
1184#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1186pub struct CodeInterpreterCallOutput {
1187 pub code: String,
1189 pub id: String,
1191 pub status: String,
1193 pub container_id: String,
1195 pub results: Vec<CodeInterpreterResult>,
1197}
1198
1199#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1201#[serde(tag = "type", rename_all = "snake_case")]
1202pub enum CodeInterpreterResult {
1203 Logs(CodeInterpreterTextOutput),
1205 Files(CodeInterpreterFileOutput),
1207}
1208
1209#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1211pub struct CodeInterpreterTextOutput {
1212 pub logs: String,
1214}
1215
1216#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1218pub struct CodeInterpreterFileOutput {
1219 pub files: Vec<CodeInterpreterFile>,
1221}
1222
1223#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1224pub struct CodeInterpreterFile {
1225 file_id: String,
1227 mime_type: String,
1229}
1230
1231#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1233pub struct LocalShellCallOutput {
1234 pub action: LocalShellAction,
1236 pub call_id: String,
1238 pub id: String,
1240 pub status: String,
1242}
1243
1244#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1246pub struct LocalShellAction {
1247 pub command: Vec<String>,
1249 pub env: HashMap<String, String>,
1251 pub timeout_ms: Option<u64>,
1253 pub user: Option<String>,
1255 pub working_directory: Option<String>,
1257}
1258
1259#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1261pub struct McpCallOutput {
1262 pub arguments: String,
1264 pub id: String,
1266 pub name: String,
1268 pub server_label: String,
1270 pub error: Option<String>,
1272 pub output: Option<String>,
1274}
1275
1276#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1278pub struct McpListToolsOutput {
1279 pub id: String,
1281 pub server_label: String,
1283 pub tools: Vec<McpToolInfo>,
1285 #[serde(skip_serializing_if = "Option::is_none")]
1287 pub error: Option<String>,
1288}
1289
1290#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1292pub struct McpToolInfo {
1293 pub name: String,
1295 pub input_schema: Value,
1297 #[serde(skip_serializing_if = "Option::is_none")]
1299 pub annotations: Option<Value>,
1300 #[serde(skip_serializing_if = "Option::is_none")]
1302 pub description: Option<String>,
1303}
1304
1305#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1307pub struct McpApprovalRequestOutput {
1308 pub arguments: String,
1310 pub id: String,
1312 pub name: String,
1314 pub server_label: String,
1316}
1317
1318#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1320pub struct Usage {
1321 pub input_tokens: u32,
1323 pub input_tokens_details: PromptTokensDetails,
1325 pub output_tokens: u32,
1327 pub output_tokens_details: CompletionTokensDetails,
1329 pub total_tokens: u32,
1331}
1332
1333#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1335pub struct Response {
1336 pub created_at: u64,
1338
1339 #[serde(skip_serializing_if = "Option::is_none")]
1341 pub error: Option<ErrorObject>,
1342
1343 pub id: String,
1345
1346 #[serde(skip_serializing_if = "Option::is_none")]
1348 pub incomplete_details: Option<IncompleteDetails>,
1349
1350 #[serde(skip_serializing_if = "Option::is_none")]
1352 pub instructions: Option<String>,
1353
1354 #[serde(skip_serializing_if = "Option::is_none")]
1356 pub max_output_tokens: Option<u32>,
1357
1358 #[serde(skip_serializing_if = "Option::is_none")]
1360 pub metadata: Option<HashMap<String, String>>,
1361
1362 pub model: String,
1364
1365 pub object: String,
1367
1368 pub output: Vec<OutputContent>,
1370
1371 #[serde(skip_serializing_if = "Option::is_none")]
1375 pub output_text: Option<String>,
1376
1377 #[serde(skip_serializing_if = "Option::is_none")]
1379 pub parallel_tool_calls: Option<bool>,
1380
1381 #[serde(skip_serializing_if = "Option::is_none")]
1383 pub previous_response_id: Option<String>,
1384
1385 #[serde(skip_serializing_if = "Option::is_none")]
1387 pub reasoning: Option<ReasoningConfig>,
1388
1389 #[serde(skip_serializing_if = "Option::is_none")]
1391 pub store: Option<bool>,
1392
1393 #[serde(skip_serializing_if = "Option::is_none")]
1395 pub service_tier: Option<ServiceTier>,
1396
1397 pub status: Status,
1399
1400 #[serde(skip_serializing_if = "Option::is_none")]
1402 pub temperature: Option<f32>,
1403
1404 #[serde(skip_serializing_if = "Option::is_none")]
1406 pub text: Option<TextConfig>,
1407
1408 #[serde(skip_serializing_if = "Option::is_none")]
1410 pub tool_choice: Option<ToolChoice>,
1411
1412 #[serde(skip_serializing_if = "Option::is_none")]
1414 pub tools: Option<Vec<ToolDefinition>>,
1415
1416 #[serde(skip_serializing_if = "Option::is_none")]
1418 pub top_p: Option<f32>,
1419
1420 #[serde(skip_serializing_if = "Option::is_none")]
1422 pub truncation: Option<Truncation>,
1423
1424 #[serde(skip_serializing_if = "Option::is_none")]
1426 pub usage: Option<Usage>,
1427
1428 #[serde(skip_serializing_if = "Option::is_none")]
1430 pub user: Option<String>,
1431}
1432
1433#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1434#[serde(rename_all = "snake_case")]
1435pub enum Status {
1436 Completed,
1437 Failed,
1438 InProgress,
1439 Incomplete,
1440}