1use crate::error::OpenAIError;
12pub use crate::types::{
13 CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
14 ResponseFormatJsonSchema,
15};
16use derive_builder::Builder;
17use futures::Stream;
18use serde::{Deserialize, Serialize};
19use serde_json::Value;
20use std::collections::HashMap;
21use std::pin::Pin;
22
23#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
25#[serde(rename_all = "lowercase")]
26pub enum Role {
27 User,
28 Assistant,
29 System,
30 Developer,
31}
32
33#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
35#[serde(rename_all = "snake_case")]
36pub enum OutputStatus {
37 InProgress,
38 Completed,
39 Incomplete,
40}
41
42#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
44#[serde(untagged)]
45pub enum Input {
46 Text(String),
48 Items(Vec<InputItem>),
50}
51
52#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
54#[serde(untagged, rename_all = "snake_case")]
55pub enum InputItem {
56 Message(InputMessage),
57 Custom(serde_json::Value),
58}
59
60#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
62#[builder(
63 name = "InputMessageArgs",
64 pattern = "mutable",
65 setter(into, strip_option),
66 default
67)]
68#[builder(build_fn(error = "OpenAIError"))]
69pub struct InputMessage {
70 #[serde(default, rename = "type")]
71 pub kind: InputMessageType,
72 pub role: Role,
74 pub content: InputContent,
77}
78
79#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
80#[serde(rename_all = "snake_case")]
81pub enum InputMessageType {
82 #[default]
83 Message,
84}
85
86#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
87#[serde(untagged)]
88pub enum InputContent {
89 TextInput(String),
91 InputItemContentList(Vec<ContentType>),
93}
94
95#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
97#[serde(tag = "type", rename_all = "snake_case")]
98pub enum ContentType {
99 InputText(InputText),
101 InputImage(InputImage),
103 InputVideo(InputVideo),
105 InputFile(InputFile),
107}
108
109#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
110pub struct InputText {
111 text: String,
112}
113
114#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
115#[builder(
116 name = "InputImageArgs",
117 pattern = "mutable",
118 setter(into, strip_option),
119 default
120)]
121#[builder(build_fn(error = "OpenAIError"))]
122pub struct InputImage {
123 detail: ImageDetail,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 file_id: Option<String>,
128 #[serde(skip_serializing_if = "Option::is_none")]
131 image_url: Option<String>,
132}
133
134#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
135#[builder(
136 name = "InputVideoArgs",
137 pattern = "mutable",
138 setter(into, strip_option),
139 default
140)]
141#[builder(build_fn(error = "OpenAIError"))]
142pub struct InputVideo {
143 detail: ImageDetail,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 file_id: Option<String>,
148 #[serde(skip_serializing_if = "Option::is_none")]
151 video_url: Option<String>,
152}
153
154#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
155#[builder(
156 name = "InputFileArgs",
157 pattern = "mutable",
158 setter(into, strip_option),
159 default
160)]
161#[builder(build_fn(error = "OpenAIError"))]
162pub struct InputFile {
163 #[serde(skip_serializing_if = "Option::is_none")]
165 file_data: Option<String>,
166 #[serde(skip_serializing_if = "Option::is_none")]
168 file_id: Option<String>,
169 #[serde(skip_serializing_if = "Option::is_none")]
171 filename: Option<String>,
172}
173
174#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
176#[builder(
177 name = "CreateResponseArgs",
178 pattern = "mutable",
179 setter(into, strip_option),
180 default
181)]
182#[builder(build_fn(error = "OpenAIError"))]
183pub struct CreateResponse {
184 pub input: Input,
186
187 pub model: String,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
195 pub background: Option<bool>,
196
197 #[serde(skip_serializing_if = "Option::is_none")]
215 pub include: Option<Vec<String>>,
216
217 #[serde(skip_serializing_if = "Option::is_none")]
223 pub instructions: Option<String>,
224
225 #[serde(skip_serializing_if = "Option::is_none")]
228 pub max_output_tokens: Option<u32>,
229
230 pub max_tool_calls: Option<u32>,
234
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub metadata: Option<serde_json::Value>,
238
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub parallel_tool_calls: Option<bool>,
242
243 #[serde(skip_serializing_if = "Option::is_none")]
246 pub previous_response_id: Option<String>,
247
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub prompt: Option<PromptConfig>,
251
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub reasoning: Option<ReasoningConfig>,
255
256 #[serde(skip_serializing_if = "Option::is_none")]
276 pub service_tier: Option<ServiceTier>,
277
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub store: Option<bool>,
281
282 #[serde(skip_serializing_if = "Option::is_none")]
285 pub stream: Option<bool>,
286
287 #[serde(skip_serializing_if = "Option::is_none")]
292 pub temperature: Option<f32>,
293
294 #[serde(skip_serializing_if = "Option::is_none")]
297 pub text: Option<TextConfig>,
298
299 #[serde(skip_serializing_if = "Option::is_none")]
302 pub tool_choice: Option<ToolChoice>,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
308 pub tools: Option<Vec<ToolDefinition>>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
313 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
321 pub top_p: Option<f32>,
322
323 #[serde(skip_serializing_if = "Option::is_none")]
327 pub truncation: Option<Truncation>,
328
329 #[serde(skip_serializing_if = "Option::is_none")]
332 pub user: Option<String>,
333}
334
335#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
337pub struct PromptConfig {
338 pub id: String,
340
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub version: Option<String>,
344
345 #[serde(skip_serializing_if = "Option::is_none")]
349 pub variables: Option<HashMap<String, String>>,
350}
351
352#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
354#[serde(rename_all = "lowercase")]
355pub enum ServiceTier {
356 Auto,
357 Default,
358 Flex,
359}
360
361#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
363#[serde(rename_all = "lowercase")]
364pub enum Truncation {
365 Auto,
366 Disabled,
367}
368
369#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
371#[builder(
372 name = "ReasoningConfigArgs",
373 pattern = "mutable",
374 setter(into, strip_option),
375 default
376)]
377#[builder(build_fn(error = "OpenAIError"))]
378pub struct ReasoningConfig {
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub effort: Option<ReasoningEffort>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub summary: Option<ReasoningSummary>,
385}
386
387#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
388#[serde(rename_all = "lowercase")]
389pub enum ReasoningSummary {
390 Auto,
391 Concise,
392 Detailed,
393}
394
395#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
397pub struct TextConfig {
398 pub format: TextResponseFormat,
400}
401
402#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
403#[serde(tag = "type", rename_all = "snake_case")]
404pub enum TextResponseFormat {
405 Text,
407 JsonObject,
409 JsonSchema(ResponseFormatJsonSchema),
411}
412
413#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
415#[serde(tag = "type", rename_all = "snake_case")]
416pub enum ToolDefinition {
417 FileSearch(FileSearch),
419 Function(Function),
421 WebSearchPreview(WebSearchPreview),
423 ComputerUsePreview(ComputerUsePreview),
425 Mcp(Mcp),
427 CodeInterpreter(CodeInterpreter),
429 ImageGeneration(ImageGeneration),
431 LocalShell,
433}
434
435#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
436#[builder(
437 name = "FileSearchArgs",
438 pattern = "mutable",
439 setter(into, strip_option),
440 default
441)]
442#[builder(build_fn(error = "OpenAIError"))]
443pub struct FileSearch {
444 pub vector_store_ids: Vec<String>,
446 #[serde(skip_serializing_if = "Option::is_none")]
448 pub max_num_results: Option<u32>,
449 #[serde(skip_serializing_if = "Option::is_none")]
451 pub filters: Option<Filter>,
452 #[serde(skip_serializing_if = "Option::is_none")]
454 pub ranking_options: Option<RankingOptions>,
455}
456
457#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
458#[builder(
459 name = "FunctionArgs",
460 pattern = "mutable",
461 setter(into, strip_option),
462 default
463)]
464pub struct Function {
465 pub name: String,
467 pub parameters: serde_json::Value,
469 pub strict: bool,
471 #[serde(skip_serializing_if = "Option::is_none")]
474 pub description: Option<String>,
475}
476
477#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
478#[builder(
479 name = "WebSearchPreviewArgs",
480 pattern = "mutable",
481 setter(into, strip_option),
482 default
483)]
484pub struct WebSearchPreview {
485 #[serde(skip_serializing_if = "Option::is_none")]
487 pub user_location: Option<Location>,
488 #[serde(skip_serializing_if = "Option::is_none")]
490 pub search_context_size: Option<WebSearchContextSize>,
491}
492
493#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
494#[serde(rename_all = "lowercase")]
495pub enum WebSearchContextSize {
496 Low,
497 Medium,
498 High,
499}
500
501#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
502#[builder(
503 name = "ComputerUsePreviewArgs",
504 pattern = "mutable",
505 setter(into, strip_option),
506 default
507)]
508pub struct ComputerUsePreview {
509 environment: String,
511 display_width: u32,
513 display_height: u32,
515}
516
517#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
519pub struct RankingOptions {
520 pub ranker: String,
522 #[serde(skip_serializing_if = "Option::is_none")]
525 pub score_threshold: Option<f32>,
526}
527
528#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
530#[serde(untagged)]
531pub enum Filter {
532 Comparison(ComparisonFilter),
535 Compound(CompoundFilter),
537}
538
539#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
541pub struct ComparisonFilter {
542 #[serde(rename = "type")]
544 pub op: ComparisonType,
545 pub key: String,
547 pub value: serde_json::Value,
549}
550
551#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
552pub enum ComparisonType {
553 #[serde(rename = "eq")]
554 Equals,
555 #[serde(rename = "ne")]
556 NotEquals,
557 #[serde(rename = "gt")]
558 GreaterThan,
559 #[serde(rename = "gte")]
560 GreaterThanOrEqualTo,
561 #[serde(rename = "lt")]
562 LessThan,
563 #[serde(rename = "lte")]
564 LessThanOrEqualTo,
565}
566
567#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
569pub struct CompoundFilter {
570 #[serde(rename = "type")]
572 pub op: ComparisonType,
573 pub filters: Vec<Filter>,
575}
576
577#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
578#[serde(rename_all = "lowercase")]
579pub enum CompoundType {
580 And,
581 Or,
582}
583
584#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
586#[builder(
587 name = "LocationArgs",
588 pattern = "mutable",
589 setter(into, strip_option),
590 default
591)]
592#[builder(build_fn(error = "OpenAIError"))]
593pub struct Location {
594 #[serde(rename = "type")]
596 pub kind: String,
597 #[serde(skip_serializing_if = "Option::is_none")]
599 pub city: Option<String>,
600 #[serde(skip_serializing_if = "Option::is_none")]
602 pub country: Option<String>,
603 #[serde(skip_serializing_if = "Option::is_none")]
605 pub region: Option<String>,
606 #[serde(skip_serializing_if = "Option::is_none")]
608 pub timezone: Option<String>,
609}
610
611#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
613#[builder(
614 name = "McpArgs",
615 pattern = "mutable",
616 setter(into, strip_option),
617 default
618)]
619#[builder(build_fn(error = "OpenAIError"))]
620pub struct Mcp {
621 pub server_label: String,
623 pub server_url: String,
625 #[serde(skip_serializing_if = "Option::is_none")]
627 pub allowed_tools: Option<AllowedTools>,
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub headers: Option<Value>,
631 #[serde(skip_serializing_if = "Option::is_none")]
633 pub require_approval: Option<RequireApproval>,
634}
635
636#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
638#[serde(untagged)]
639pub enum AllowedTools {
640 List(Vec<String>),
642 Filter(McpAllowedToolsFilter),
644}
645
646#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
648pub struct McpAllowedToolsFilter {
649 #[serde(skip_serializing_if = "Option::is_none")]
651 pub tool_names: Option<Vec<String>>,
652}
653
654#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
656#[serde(untagged)]
657pub enum RequireApproval {
658 Policy(RequireApprovalPolicy),
660 Filter(McpApprovalFilter),
662}
663
664#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
665#[serde(rename_all = "lowercase")]
666pub enum RequireApprovalPolicy {
667 Always,
668 Never,
669}
670
671#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
673pub struct McpApprovalFilter {
674 #[serde(skip_serializing_if = "Option::is_none")]
676 pub always: Option<McpAllowedToolsFilter>,
677 #[serde(skip_serializing_if = "Option::is_none")]
679 pub never: Option<McpAllowedToolsFilter>,
680}
681
682#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
684#[serde(untagged)]
685pub enum CodeInterpreterContainer {
686 Id(String),
688 Container(CodeInterpreterContainerKind),
690}
691
692#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
694#[serde(tag = "type", rename_all = "snake_case")]
695pub enum CodeInterpreterContainerKind {
696 Auto {
697 #[serde(skip_serializing_if = "Option::is_none")]
699 file_ids: Option<Vec<String>>,
700 },
701}
702
703#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
705#[builder(
706 name = "CodeInterpreterArgs",
707 pattern = "mutable",
708 setter(into, strip_option),
709 default
710)]
711#[builder(build_fn(error = "OpenAIError"))]
712pub struct CodeInterpreter {
713 pub container: CodeInterpreterContainer,
715}
716
717#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
719pub struct InputImageMask {
720 #[serde(skip_serializing_if = "Option::is_none")]
722 pub image_url: Option<String>,
723 #[serde(skip_serializing_if = "Option::is_none")]
725 pub file_id: Option<String>,
726}
727
728#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
730#[builder(
731 name = "ImageGenerationArgs",
732 pattern = "mutable",
733 setter(into, strip_option),
734 default
735)]
736#[builder(build_fn(error = "OpenAIError"))]
737pub struct ImageGeneration {
738 #[serde(skip_serializing_if = "Option::is_none")]
740 pub background: Option<ImageGenerationBackground>,
741 #[serde(skip_serializing_if = "Option::is_none")]
743 pub input_image_mask: Option<InputImageMask>,
744 #[serde(skip_serializing_if = "Option::is_none")]
746 pub model: Option<String>,
747 #[serde(skip_serializing_if = "Option::is_none")]
749 pub moderation: Option<String>,
750 #[serde(skip_serializing_if = "Option::is_none")]
752 pub output_compression: Option<u8>,
753 #[serde(skip_serializing_if = "Option::is_none")]
755 pub output_format: Option<ImageGenerationOutputFormat>,
756 #[serde(skip_serializing_if = "Option::is_none")]
758 pub partial_images: Option<u8>,
759 #[serde(skip_serializing_if = "Option::is_none")]
761 pub quality: Option<ImageGenerationQuality>,
762 #[serde(skip_serializing_if = "Option::is_none")]
764 pub size: Option<ImageGenerationSize>,
765}
766
767#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
768#[serde(rename_all = "lowercase")]
769pub enum ImageGenerationBackground {
770 Transparent,
771 Opaque,
772 Auto,
773}
774
775#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
776#[serde(rename_all = "lowercase")]
777pub enum ImageGenerationOutputFormat {
778 Png,
779 Webp,
780 Jpeg,
781}
782
783#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
784#[serde(rename_all = "lowercase")]
785pub enum ImageGenerationQuality {
786 Low,
787 Medium,
788 High,
789 Auto,
790}
791
792#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
793#[serde(rename_all = "lowercase")]
794pub enum ImageGenerationSize {
795 Auto,
796 #[serde(rename = "1024x1024")]
797 Size1024x1024,
798 #[serde(rename = "1024x1536")]
799 Size1024x1536,
800 #[serde(rename = "1536x1024")]
801 Size1536x1024,
802}
803
804#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
806#[serde(untagged)]
807pub enum ToolChoice {
808 Mode(ToolChoiceMode),
810 Hosted {
812 #[serde(rename = "type")]
814 kind: HostedToolType,
815 },
816 Function {
818 name: String,
820 },
821}
822
823#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
825#[serde(rename_all = "lowercase")]
826pub enum ToolChoiceMode {
827 None,
829 Auto,
831 Required,
833}
834
835#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
837#[serde(rename_all = "snake_case")]
838pub enum HostedToolType {
839 FileSearch,
840 WebSearchPreview,
841 ComputerUsePreview,
842}
843
844#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
846pub struct ErrorObject {
847 pub code: String,
849 pub message: String,
851}
852
853#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
855pub struct IncompleteDetails {
856 pub reason: String,
858}
859
860#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
862pub struct OutputText {
863 pub annotations: Vec<Annotation>,
865 pub text: String,
867}
868
869#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
870#[serde(tag = "type", rename_all = "snake_case")]
871pub enum Annotation {
872 FileCitation(FileCitation),
874 UrlCitation(UrlCitation),
876 FilePath(FilePath),
878}
879
880#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
881pub struct FileCitation {
882 file_id: String,
884 index: u32,
886}
887
888#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
889pub struct UrlCitation {
890 end_index: u32,
892 start_index: u32,
894 title: String,
896 url: String,
898}
899
900#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
901pub struct FilePath {
902 file_id: String,
904 index: u32,
906}
907
908#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
910pub struct Refusal {
911 pub refusal: String,
913}
914
915#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
917pub struct OutputMessage {
918 pub content: Vec<Content>,
920 pub id: String,
922 pub role: Role,
924 pub status: OutputStatus,
926}
927
928#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
929#[serde(tag = "type", rename_all = "snake_case")]
930pub enum Content {
931 OutputText(OutputText),
933 Refusal(Refusal),
935}
936
937#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
939#[serde(tag = "type", rename_all = "snake_case")]
940pub enum OutputContent {
941 Message(OutputMessage),
943 FileSearchCall(FileSearchCallOutput),
945 FunctionCall(FunctionCall),
947 WebSearchCall(WebSearchCallOutput),
949 ComputerCall(ComputerCallOutput),
951 Reasoning(ReasoningItem),
955 ImageGenerationCall(ImageGenerationCallOutput),
957 CodeInterpreterCall(CodeInterpreterCallOutput),
959 LocalShellCall(LocalShellCallOutput),
961 McpCall(McpCallOutput),
963 McpListTools(McpListToolsOutput),
965 McpApprovalRequest(McpApprovalRequestOutput),
967}
968
969#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
971pub struct ReasoningItem {
972 pub id: String,
974 pub summary: Vec<SummaryText>,
976 #[serde(skip_serializing_if = "Option::is_none")]
979 pub encrypted_content: Option<String>,
980 #[serde(skip_serializing_if = "Option::is_none")]
982 pub status: Option<OutputStatus>,
983}
984
985#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
987pub struct SummaryText {
988 pub text: String,
990}
991
992#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
994pub struct FileSearchCallOutput {
995 pub id: String,
997 pub queries: Vec<String>,
999 pub status: FileSearchCallOutputStatus,
1001 #[serde(skip_serializing_if = "Option::is_none")]
1003 pub results: Option<Vec<FileSearchResult>>,
1004}
1005
1006#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1007#[serde(rename_all = "snake_case")]
1008pub enum FileSearchCallOutputStatus {
1009 InProgress,
1010 Searching,
1011 Incomplete,
1012 Failed,
1013 Completed,
1014}
1015
1016#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1018pub struct FileSearchResult {
1019 pub file_id: String,
1021 pub filename: String,
1023 pub score: f32,
1025 pub text: String,
1027 pub attributes: HashMap<String, serde_json::Value>,
1032}
1033
1034#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1035pub struct SafetyCheck {
1036 pub id: String,
1038 pub code: String,
1040 pub message: String,
1042}
1043
1044#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1046pub struct WebSearchCallOutput {
1047 pub id: String,
1049 pub status: String,
1051}
1052
1053#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1055pub struct ComputerCallOutput {
1056 pub action: ComputerCallAction,
1057 pub call_id: String,
1059 pub id: String,
1061 pub pending_safety_checks: Vec<SafetyCheck>,
1063 pub status: OutputStatus,
1065}
1066
1067#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1069pub struct Point {
1070 pub x: i32,
1071 pub y: i32,
1072}
1073
1074#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1076#[serde(tag = "type", rename_all = "snake_case")]
1077pub enum ComputerCallAction {
1078 Click(Click),
1080
1081 DoubleClick(DoubleClick),
1083
1084 Drag(Drag),
1086
1087 KeyPress(KeyPress),
1089
1090 Move(MoveAction),
1092
1093 Screenshot,
1095
1096 Scroll(Scroll),
1098
1099 Type(TypeAction),
1101
1102 Wait,
1104}
1105
1106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1107#[serde(rename_all = "snake_case")]
1108pub enum ButtonPress {
1109 Left,
1110 Right,
1111 Wheel,
1112 Back,
1113 Forward,
1114}
1115
1116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1118pub struct Click {
1119 pub button: ButtonPress,
1121 pub x: i32,
1123 pub y: i32,
1125}
1126
1127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1129pub struct DoubleClick {
1130 pub x: i32,
1132 pub y: i32,
1134}
1135
1136#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1138pub struct Drag {
1139 pub path: Vec<Point>,
1141 pub x: i32,
1143 pub y: i32,
1145}
1146
1147#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1149pub struct KeyPress {
1150 pub keys: Vec<String>,
1152}
1153
1154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1156pub struct MoveAction {
1157 pub x: i32,
1159 pub y: i32,
1161}
1162
1163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1165pub struct Scroll {
1166 pub scroll_x: i32,
1168 pub scroll_y: i32,
1170 pub x: i32,
1172 pub y: i32,
1174}
1175
1176#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1178pub struct TypeAction {
1179 pub text: String,
1181}
1182
1183#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1185pub struct FunctionCall {
1186 pub id: String,
1188 pub call_id: String,
1190 pub name: String,
1192 pub arguments: String,
1194 pub status: OutputStatus,
1196}
1197
1198#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1200pub struct ImageGenerationCallOutput {
1201 pub id: String,
1203 pub result: Option<String>,
1205 pub status: String,
1207}
1208
1209#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1211pub struct CodeInterpreterCallOutput {
1212 pub code: String,
1214 pub id: String,
1216 pub status: String,
1218 pub container_id: String,
1220 pub results: Vec<CodeInterpreterResult>,
1222}
1223
1224#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1226#[serde(tag = "type", rename_all = "snake_case")]
1227pub enum CodeInterpreterResult {
1228 Logs(CodeInterpreterTextOutput),
1230 Files(CodeInterpreterFileOutput),
1232}
1233
1234#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1236pub struct CodeInterpreterTextOutput {
1237 pub logs: String,
1239}
1240
1241#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1243pub struct CodeInterpreterFileOutput {
1244 pub files: Vec<CodeInterpreterFile>,
1246}
1247
1248#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1249pub struct CodeInterpreterFile {
1250 file_id: String,
1252 mime_type: String,
1254}
1255
1256#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1258pub struct LocalShellCallOutput {
1259 pub action: LocalShellAction,
1261 pub call_id: String,
1263 pub id: String,
1265 pub status: String,
1267}
1268
1269#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1271pub struct LocalShellAction {
1272 pub command: Vec<String>,
1274 pub env: HashMap<String, String>,
1276 pub timeout_ms: Option<u64>,
1278 pub user: Option<String>,
1280 pub working_directory: Option<String>,
1282}
1283
1284#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1286pub struct McpCallOutput {
1287 pub arguments: String,
1289 pub id: String,
1291 pub name: String,
1293 pub server_label: String,
1295 pub error: Option<String>,
1297 pub output: Option<String>,
1299}
1300
1301#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1303pub struct McpListToolsOutput {
1304 pub id: String,
1306 pub server_label: String,
1308 pub tools: Vec<McpToolInfo>,
1310 #[serde(skip_serializing_if = "Option::is_none")]
1312 pub error: Option<String>,
1313}
1314
1315#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1317pub struct McpToolInfo {
1318 pub name: String,
1320 pub input_schema: Value,
1322 #[serde(skip_serializing_if = "Option::is_none")]
1324 pub annotations: Option<Value>,
1325 #[serde(skip_serializing_if = "Option::is_none")]
1327 pub description: Option<String>,
1328}
1329
1330#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1332pub struct McpApprovalRequestOutput {
1333 pub arguments: String,
1335 pub id: String,
1337 pub name: String,
1339 pub server_label: String,
1341}
1342
1343#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1345pub struct Usage {
1346 pub input_tokens: u32,
1348 pub input_tokens_details: PromptTokensDetails,
1350 pub output_tokens: u32,
1352 pub output_tokens_details: CompletionTokensDetails,
1354 pub total_tokens: u32,
1356}
1357
1358#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1360pub struct Response {
1361 pub created_at: u64,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub error: Option<ErrorObject>,
1367
1368 pub id: String,
1370
1371 #[serde(skip_serializing_if = "Option::is_none")]
1373 pub incomplete_details: Option<IncompleteDetails>,
1374
1375 #[serde(skip_serializing_if = "Option::is_none")]
1377 pub instructions: Option<String>,
1378
1379 #[serde(skip_serializing_if = "Option::is_none")]
1381 pub max_output_tokens: Option<u32>,
1382
1383 #[serde(skip_serializing_if = "Option::is_none")]
1385 pub metadata: Option<serde_json::Value>,
1386
1387 pub model: String,
1389
1390 pub object: String,
1392
1393 pub output: Vec<OutputContent>,
1395
1396 #[serde(skip_serializing_if = "Option::is_none")]
1400 pub output_text: Option<String>,
1401
1402 #[serde(skip_serializing_if = "Option::is_none")]
1404 pub parallel_tool_calls: Option<bool>,
1405
1406 #[serde(skip_serializing_if = "Option::is_none")]
1408 pub previous_response_id: Option<String>,
1409
1410 #[serde(skip_serializing_if = "Option::is_none")]
1412 pub reasoning: Option<ReasoningConfig>,
1413
1414 #[serde(skip_serializing_if = "Option::is_none")]
1416 pub store: Option<bool>,
1417
1418 #[serde(skip_serializing_if = "Option::is_none")]
1420 pub service_tier: Option<ServiceTier>,
1421
1422 pub status: Status,
1424
1425 #[serde(skip_serializing_if = "Option::is_none")]
1427 pub temperature: Option<f32>,
1428
1429 #[serde(skip_serializing_if = "Option::is_none")]
1431 pub text: Option<TextConfig>,
1432
1433 #[serde(skip_serializing_if = "Option::is_none")]
1435 pub tool_choice: Option<ToolChoice>,
1436
1437 #[serde(skip_serializing_if = "Option::is_none")]
1439 pub tools: Option<Vec<ToolDefinition>>,
1440
1441 #[serde(skip_serializing_if = "Option::is_none")]
1443 pub top_p: Option<f32>,
1444
1445 #[serde(skip_serializing_if = "Option::is_none")]
1447 pub truncation: Option<Truncation>,
1448
1449 #[serde(skip_serializing_if = "Option::is_none")]
1451 pub usage: Option<Usage>,
1452
1453 #[serde(skip_serializing_if = "Option::is_none")]
1455 pub user: Option<String>,
1456}
1457
1458#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1459#[serde(rename_all = "snake_case")]
1460pub enum Status {
1461 Completed,
1462 Failed,
1463 InProgress,
1464 Incomplete,
1465}
1466
1467#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1469#[serde(tag = "type")]
1470#[non_exhaustive] pub enum ResponseEvent {
1472 #[serde(rename = "response.created")]
1474 ResponseCreated(ResponseCreated),
1475 #[serde(rename = "response.in_progress")]
1477 ResponseInProgress(ResponseInProgress),
1478 #[serde(rename = "response.completed")]
1480 ResponseCompleted(ResponseCompleted),
1481 #[serde(rename = "response.failed")]
1483 ResponseFailed(ResponseFailed),
1484 #[serde(rename = "response.incomplete")]
1486 ResponseIncomplete(ResponseIncomplete),
1487 #[serde(rename = "response.queued")]
1489 ResponseQueued(ResponseQueued),
1490 #[serde(rename = "response.output_item.added")]
1492 ResponseOutputItemAdded(ResponseOutputItemAdded),
1493 #[serde(rename = "response.content_part.added")]
1495 ResponseContentPartAdded(ResponseContentPartAdded),
1496 #[serde(rename = "response.output_text.delta")]
1498 ResponseOutputTextDelta(ResponseOutputTextDelta),
1499 #[serde(rename = "response.output_text.done")]
1501 ResponseOutputTextDone(ResponseOutputTextDone),
1502 #[serde(rename = "response.refusal.delta")]
1504 ResponseRefusalDelta(ResponseRefusalDelta),
1505 #[serde(rename = "response.refusal.done")]
1507 ResponseRefusalDone(ResponseRefusalDone),
1508 #[serde(rename = "response.content_part.done")]
1510 ResponseContentPartDone(ResponseContentPartDone),
1511 #[serde(rename = "response.output_item.done")]
1513 ResponseOutputItemDone(ResponseOutputItemDone),
1514 #[serde(rename = "response.function_call_arguments.delta")]
1516 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1517 #[serde(rename = "response.function_call_arguments.done")]
1519 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1520 #[serde(rename = "response.file_search_call.in_progress")]
1522 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1523 #[serde(rename = "response.file_search_call.searching")]
1525 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1526 #[serde(rename = "response.file_search_call.completed")]
1528 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1529 #[serde(rename = "response.web_search_call.in_progress")]
1531 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1532 #[serde(rename = "response.web_search_call.searching")]
1534 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1535 #[serde(rename = "response.web_search_call.completed")]
1537 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1538 #[serde(rename = "response.reasoning_summary_part.added")]
1540 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1541 #[serde(rename = "response.reasoning_summary_part.done")]
1543 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1544 #[serde(rename = "response.reasoning_summary_text.delta")]
1546 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1547 #[serde(rename = "response.reasoning_summary_text.done")]
1549 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1550 #[serde(rename = "response.reasoning_summary.delta")]
1552 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1553 #[serde(rename = "response.reasoning_summary.done")]
1555 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1556 #[serde(rename = "response.image_generation_call.in_progress")]
1558 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1559 #[serde(rename = "response.image_generation_call.generating")]
1561 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1562 #[serde(rename = "response.image_generation_call.partial_image")]
1564 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1565 #[serde(rename = "response.image_generation_call.completed")]
1567 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1568 #[serde(rename = "response.mcp_call_arguments.delta")]
1570 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1571 #[serde(rename = "response.mcp_call_arguments.done")]
1573 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1574 #[serde(rename = "response.mcp_call.completed")]
1576 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1577 #[serde(rename = "response.mcp_call.failed")]
1579 ResponseMcpCallFailed(ResponseMcpCallFailed),
1580 #[serde(rename = "response.mcp_call.in_progress")]
1582 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1583 #[serde(rename = "response.mcp_list_tools.completed")]
1585 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1586 #[serde(rename = "response.mcp_list_tools.failed")]
1588 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1589 #[serde(rename = "response.mcp_list_tools.in_progress")]
1591 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1592 #[serde(rename = "response.code_interpreter_call.in_progress")]
1594 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1595 #[serde(rename = "response.code_interpreter_call.interpreting")]
1597 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1598 #[serde(rename = "response.code_interpreter_call.completed")]
1600 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1601 #[serde(rename = "response.code_interpreter_call_code.delta")]
1603 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1604 #[serde(rename = "response.code_interpreter_call_code.done")]
1606 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1607 #[serde(rename = "response.output_text.annotation.added")]
1609 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1610 #[serde(rename = "error")]
1612 ResponseError(ResponseError),
1613
1614 #[serde(untagged)]
1616 Unknown(serde_json::Value),
1617}
1618
1619pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
1621
1622#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1623#[non_exhaustive]
1624pub struct ResponseCreated {
1625 pub sequence_number: u64,
1626 pub response: ResponseMetadata,
1627}
1628
1629#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1630#[non_exhaustive]
1631pub struct ResponseInProgress {
1632 pub sequence_number: u64,
1633 pub response: ResponseMetadata,
1634}
1635
1636#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1637#[non_exhaustive]
1638pub struct ResponseOutputItemAdded {
1639 pub sequence_number: u64,
1640 pub output_index: u32,
1641 pub item: OutputItem,
1642}
1643
1644#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1645#[non_exhaustive]
1646pub struct ResponseContentPartAdded {
1647 pub sequence_number: u64,
1648 pub item_id: String,
1649 pub output_index: u32,
1650 pub content_index: u32,
1651 pub part: ContentPart,
1652}
1653
1654#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1655#[non_exhaustive]
1656pub struct ResponseOutputTextDelta {
1657 pub sequence_number: u64,
1658 pub item_id: String,
1659 pub output_index: u32,
1660 pub content_index: u32,
1661 pub delta: String,
1662 #[serde(default, skip_serializing_if = "Option::is_none")]
1663 pub logprobs: Option<serde_json::Value>,
1664}
1665
1666#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1667#[non_exhaustive]
1668pub struct ResponseContentPartDone {
1669 pub sequence_number: u64,
1670 pub item_id: String,
1671 pub output_index: u32,
1672 pub content_index: u32,
1673 pub part: ContentPart,
1674}
1675
1676#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1677#[non_exhaustive]
1678pub struct ResponseOutputItemDone {
1679 pub sequence_number: u64,
1680 pub output_index: u32,
1681 pub item: OutputItem,
1682}
1683
1684#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1686#[non_exhaustive]
1687pub struct ResponseCompleted {
1688 pub sequence_number: u64,
1689 pub response: ResponseMetadata,
1690}
1691
1692#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1694#[non_exhaustive]
1695pub struct ResponseFailed {
1696 pub sequence_number: u64,
1697 pub response: ResponseMetadata,
1698}
1699
1700#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1702#[non_exhaustive]
1703pub struct ResponseIncomplete {
1704 pub sequence_number: u64,
1705 pub response: ResponseMetadata,
1706}
1707
1708#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1710#[non_exhaustive]
1711pub struct ResponseQueued {
1712 pub sequence_number: u64,
1713 pub response: ResponseMetadata,
1714}
1715
1716#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1718#[non_exhaustive]
1719pub struct ResponseOutputTextDone {
1720 pub sequence_number: u64,
1721 pub item_id: String,
1722 pub output_index: u32,
1723 pub content_index: u32,
1724 pub text: String,
1725 pub logprobs: Option<Vec<serde_json::Value>>,
1726}
1727
1728#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1730#[non_exhaustive]
1731pub struct ResponseRefusalDelta {
1732 pub sequence_number: u64,
1733 pub item_id: String,
1734 pub output_index: u32,
1735 pub content_index: u32,
1736 pub delta: String,
1737}
1738
1739#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1741#[non_exhaustive]
1742pub struct ResponseRefusalDone {
1743 pub sequence_number: u64,
1744 pub item_id: String,
1745 pub output_index: u32,
1746 pub content_index: u32,
1747 pub refusal: String,
1748}
1749
1750#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1752#[non_exhaustive]
1753pub struct ResponseFunctionCallArgumentsDelta {
1754 pub sequence_number: u64,
1755 pub item_id: String,
1756 pub output_index: u32,
1757 pub delta: String,
1758}
1759
1760#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1762#[non_exhaustive]
1763pub struct ResponseFunctionCallArgumentsDone {
1764 pub sequence_number: u64,
1765 pub item_id: String,
1766 pub output_index: u32,
1767 pub arguments: String,
1768}
1769
1770#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1772#[non_exhaustive]
1773pub struct ResponseError {
1774 pub sequence_number: u64,
1775 pub code: Option<String>,
1776 pub message: String,
1777 pub param: Option<String>,
1778}
1779
1780#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1782#[non_exhaustive]
1783pub struct ResponseFileSearchCallInProgress {
1784 pub sequence_number: u64,
1785 pub output_index: u32,
1786 pub item_id: String,
1787}
1788
1789#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1791#[non_exhaustive]
1792pub struct ResponseFileSearchCallSearching {
1793 pub sequence_number: u64,
1794 pub output_index: u32,
1795 pub item_id: String,
1796}
1797
1798#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1800#[non_exhaustive]
1801pub struct ResponseFileSearchCallCompleted {
1802 pub sequence_number: u64,
1803 pub output_index: u32,
1804 pub item_id: String,
1805}
1806
1807#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1809#[non_exhaustive]
1810pub struct ResponseWebSearchCallInProgress {
1811 pub sequence_number: u64,
1812 pub output_index: u32,
1813 pub item_id: String,
1814}
1815
1816#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1818#[non_exhaustive]
1819pub struct ResponseWebSearchCallSearching {
1820 pub sequence_number: u64,
1821 pub output_index: u32,
1822 pub item_id: String,
1823}
1824
1825#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1827#[non_exhaustive]
1828pub struct ResponseWebSearchCallCompleted {
1829 pub sequence_number: u64,
1830 pub output_index: u32,
1831 pub item_id: String,
1832}
1833
1834#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1836#[non_exhaustive]
1837pub struct ResponseReasoningSummaryPartAdded {
1838 pub sequence_number: u64,
1839 pub item_id: String,
1840 pub output_index: u32,
1841 pub summary_index: u32,
1842 pub part: serde_json::Value, }
1844
1845#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1847#[non_exhaustive]
1848pub struct ResponseReasoningSummaryPartDone {
1849 pub sequence_number: u64,
1850 pub item_id: String,
1851 pub output_index: u32,
1852 pub summary_index: u32,
1853 pub part: serde_json::Value,
1854}
1855
1856#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1858#[non_exhaustive]
1859pub struct ResponseReasoningSummaryTextDelta {
1860 pub sequence_number: u64,
1861 pub item_id: String,
1862 pub output_index: u32,
1863 pub summary_index: u32,
1864 pub delta: String,
1865}
1866
1867#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1869#[non_exhaustive]
1870pub struct ResponseReasoningSummaryTextDone {
1871 pub sequence_number: u64,
1872 pub item_id: String,
1873 pub output_index: u32,
1874 pub summary_index: u32,
1875 pub text: String,
1876}
1877
1878#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1880#[non_exhaustive]
1881pub struct ResponseReasoningSummaryDelta {
1882 pub sequence_number: u64,
1883 pub item_id: String,
1884 pub output_index: u32,
1885 pub summary_index: u32,
1886 pub delta: serde_json::Value,
1887}
1888
1889#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1891#[non_exhaustive]
1892pub struct ResponseReasoningSummaryDone {
1893 pub sequence_number: u64,
1894 pub item_id: String,
1895 pub output_index: u32,
1896 pub summary_index: u32,
1897 pub text: String,
1898}
1899
1900#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1902#[non_exhaustive]
1903pub struct ResponseImageGenerationCallInProgress {
1904 pub sequence_number: u64,
1905 pub output_index: u32,
1906 pub item_id: String,
1907}
1908
1909#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1911#[non_exhaustive]
1912pub struct ResponseImageGenerationCallGenerating {
1913 pub sequence_number: u64,
1914 pub output_index: u32,
1915 pub item_id: String,
1916}
1917
1918#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1920#[non_exhaustive]
1921pub struct ResponseImageGenerationCallPartialImage {
1922 pub sequence_number: u64,
1923 pub output_index: u32,
1924 pub item_id: String,
1925 pub partial_image_index: u32,
1926 pub partial_image_b64: String,
1927}
1928
1929#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1931#[non_exhaustive]
1932pub struct ResponseImageGenerationCallCompleted {
1933 pub sequence_number: u64,
1934 pub output_index: u32,
1935 pub item_id: String,
1936}
1937
1938#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1940#[non_exhaustive]
1941pub struct ResponseMcpCallArgumentsDelta {
1942 pub sequence_number: u64,
1943 pub output_index: u32,
1944 pub item_id: String,
1945 pub delta: String,
1946}
1947
1948#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1950#[non_exhaustive]
1951pub struct ResponseMcpCallArgumentsDone {
1952 pub sequence_number: u64,
1953 pub output_index: u32,
1954 pub item_id: String,
1955 pub arguments: String,
1956}
1957
1958#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1960#[non_exhaustive]
1961pub struct ResponseMcpCallCompleted {
1962 pub sequence_number: u64,
1963 pub output_index: u32,
1964 pub item_id: String,
1965}
1966
1967#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1969#[non_exhaustive]
1970pub struct ResponseMcpCallFailed {
1971 pub sequence_number: u64,
1972 pub output_index: u32,
1973 pub item_id: String,
1974}
1975
1976#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1978#[non_exhaustive]
1979pub struct ResponseMcpCallInProgress {
1980 pub sequence_number: u64,
1981 pub output_index: u32,
1982 pub item_id: String,
1983}
1984
1985#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1987#[non_exhaustive]
1988pub struct ResponseMcpListToolsCompleted {
1989 pub sequence_number: u64,
1990 pub output_index: u32,
1991 pub item_id: String,
1992}
1993
1994#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1996#[non_exhaustive]
1997pub struct ResponseMcpListToolsFailed {
1998 pub sequence_number: u64,
1999 pub output_index: u32,
2000 pub item_id: String,
2001}
2002
2003#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2005#[non_exhaustive]
2006pub struct ResponseMcpListToolsInProgress {
2007 pub sequence_number: u64,
2008 pub output_index: u32,
2009 pub item_id: String,
2010}
2011
2012#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2014#[non_exhaustive]
2015pub struct ResponseCodeInterpreterCallInProgress {
2016 pub sequence_number: u64,
2017 pub output_index: u32,
2018 pub item_id: String,
2019}
2020
2021#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2023#[non_exhaustive]
2024pub struct ResponseCodeInterpreterCallInterpreting {
2025 pub sequence_number: u64,
2026 pub output_index: u32,
2027 pub item_id: String,
2028}
2029
2030#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2032#[non_exhaustive]
2033pub struct ResponseCodeInterpreterCallCompleted {
2034 pub sequence_number: u64,
2035 pub output_index: u32,
2036 pub item_id: String,
2037}
2038
2039#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2041#[non_exhaustive]
2042pub struct ResponseCodeInterpreterCallCodeDelta {
2043 pub sequence_number: u64,
2044 pub output_index: u32,
2045 pub item_id: String,
2046 pub delta: String,
2047}
2048
2049#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2051#[non_exhaustive]
2052pub struct ResponseCodeInterpreterCallCodeDone {
2053 pub sequence_number: u64,
2054 pub output_index: u32,
2055 pub item_id: String,
2056 pub code: String,
2057}
2058
2059#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2061#[non_exhaustive]
2062pub struct ResponseMetadata {
2063 pub id: String,
2064 #[serde(skip_serializing_if = "Option::is_none")]
2065 pub object: Option<String>,
2066 pub created_at: u64,
2067 pub status: Status,
2068 #[serde(skip_serializing_if = "Option::is_none")]
2069 pub model: Option<String>,
2070 #[serde(skip_serializing_if = "Option::is_none")]
2071 pub usage: Option<Usage>,
2072 #[serde(skip_serializing_if = "Option::is_none")]
2073 pub error: Option<ErrorObject>,
2074 #[serde(skip_serializing_if = "Option::is_none")]
2075 pub incomplete_details: Option<IncompleteDetails>,
2076 #[serde(skip_serializing_if = "Option::is_none")]
2077 pub input: Option<Input>,
2078 #[serde(skip_serializing_if = "Option::is_none")]
2079 pub instructions: Option<String>,
2080 #[serde(skip_serializing_if = "Option::is_none")]
2081 pub max_output_tokens: Option<u32>,
2082 #[serde(skip_serializing_if = "Option::is_none")]
2084 pub background: Option<bool>,
2085 #[serde(skip_serializing_if = "Option::is_none")]
2087 pub service_tier: Option<ServiceTier>,
2088 #[serde(skip_serializing_if = "Option::is_none")]
2090 pub top_logprobs: Option<u32>,
2091 #[serde(skip_serializing_if = "Option::is_none")]
2093 pub max_tool_calls: Option<u32>,
2094 #[serde(skip_serializing_if = "Option::is_none")]
2095 pub output: Option<Vec<OutputItem>>,
2096 #[serde(skip_serializing_if = "Option::is_none")]
2097 pub parallel_tool_calls: Option<bool>,
2098 #[serde(skip_serializing_if = "Option::is_none")]
2099 pub previous_response_id: Option<String>,
2100 #[serde(skip_serializing_if = "Option::is_none")]
2101 pub reasoning: Option<ReasoningConfig>,
2102 #[serde(skip_serializing_if = "Option::is_none")]
2103 pub store: Option<bool>,
2104 #[serde(skip_serializing_if = "Option::is_none")]
2105 pub temperature: Option<f32>,
2106 #[serde(skip_serializing_if = "Option::is_none")]
2107 pub text: Option<TextConfig>,
2108 #[serde(skip_serializing_if = "Option::is_none")]
2109 pub tool_choice: Option<ToolChoice>,
2110 #[serde(skip_serializing_if = "Option::is_none")]
2111 pub tools: Option<Vec<ToolDefinition>>,
2112 #[serde(skip_serializing_if = "Option::is_none")]
2113 pub top_p: Option<f32>,
2114 #[serde(skip_serializing_if = "Option::is_none")]
2115 pub truncation: Option<Truncation>,
2116 #[serde(skip_serializing_if = "Option::is_none")]
2117 pub user: Option<String>,
2118 #[serde(skip_serializing_if = "Option::is_none")]
2119 pub metadata: Option<serde_json::Value>,
2120 #[serde(skip_serializing_if = "Option::is_none")]
2122 pub prompt_cache_key: Option<String>,
2123 #[serde(skip_serializing_if = "Option::is_none")]
2125 pub safety_identifier: Option<String>,
2126}
2127
2128#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2130#[non_exhaustive]
2131pub struct OutputItem {
2132 pub id: String,
2133 #[serde(rename = "type")]
2134 pub item_type: String,
2135 #[serde(skip_serializing_if = "Option::is_none")]
2136 pub status: Option<String>,
2137 #[serde(skip_serializing_if = "Option::is_none")]
2138 pub content: Option<Vec<ContentPart>>,
2139 #[serde(skip_serializing_if = "Option::is_none")]
2140 pub role: Option<String>,
2141 #[serde(skip_serializing_if = "Option::is_none")]
2143 pub summary: Option<Vec<serde_json::Value>>,
2144}
2145
2146#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2148#[non_exhaustive]
2149pub struct ContentPart {
2150 #[serde(rename = "type")]
2151 pub part_type: String,
2152 pub text: Option<String>,
2153 #[serde(default, skip_serializing_if = "Option::is_none")]
2154 pub annotations: Option<Vec<serde_json::Value>>,
2155 #[serde(default, skip_serializing_if = "Option::is_none")]
2156 pub logprobs: Option<Vec<serde_json::Value>>,
2157}
2158
2159#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2164#[non_exhaustive]
2165pub struct ResponseOutputTextAnnotationAdded {
2166 pub sequence_number: u64,
2167 pub item_id: String,
2168 pub output_index: u32,
2169 pub content_index: u32,
2170 pub annotation_index: u32,
2171 pub annotation: TextAnnotation,
2172}
2173
2174#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2176#[non_exhaustive]
2177pub struct TextAnnotation {
2178 #[serde(rename = "type")]
2179 pub annotation_type: String,
2180 pub text: String,
2181 pub start: u32,
2182 pub end: u32,
2183}