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")]
242 pub metadata: Option<HashMap<String, String>>,
243
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub parallel_tool_calls: Option<bool>,
247
248 #[serde(skip_serializing_if = "Option::is_none")]
251 pub previous_response_id: Option<String>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub prompt: Option<PromptConfig>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub reasoning: Option<ReasoningConfig>,
260
261 #[serde(skip_serializing_if = "Option::is_none")]
281 pub service_tier: Option<ServiceTier>,
282
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub store: Option<bool>,
286
287 #[serde(skip_serializing_if = "Option::is_none")]
290 pub stream: Option<bool>,
291
292 #[serde(skip_serializing_if = "Option::is_none")]
297 pub temperature: Option<f32>,
298
299 #[serde(skip_serializing_if = "Option::is_none")]
302 pub text: Option<TextConfig>,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
307 pub tool_choice: Option<ToolChoice>,
308
309 #[serde(skip_serializing_if = "Option::is_none")]
313 pub tools: Option<Vec<ToolDefinition>>,
314
315 #[serde(skip_serializing_if = "Option::is_none")]
318 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
326 pub top_p: Option<f32>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
332 pub truncation: Option<Truncation>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
337 pub user: Option<String>,
338}
339
340#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
342pub struct PromptConfig {
343 pub id: String,
345
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub version: Option<String>,
349
350 #[serde(skip_serializing_if = "Option::is_none")]
354 pub variables: Option<HashMap<String, String>>,
355}
356
357#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
359#[serde(rename_all = "lowercase")]
360pub enum ServiceTier {
361 Auto,
362 Default,
363 Flex,
364}
365
366#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
368#[serde(rename_all = "lowercase")]
369pub enum Truncation {
370 Auto,
371 Disabled,
372}
373
374#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
376#[builder(
377 name = "ReasoningConfigArgs",
378 pattern = "mutable",
379 setter(into, strip_option),
380 default
381)]
382#[builder(build_fn(error = "OpenAIError"))]
383pub struct ReasoningConfig {
384 #[serde(skip_serializing_if = "Option::is_none")]
386 pub effort: Option<ReasoningEffort>,
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub summary: Option<ReasoningSummary>,
390}
391
392#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
393#[serde(rename_all = "lowercase")]
394pub enum ReasoningSummary {
395 Auto,
396 Concise,
397 Detailed,
398}
399
400#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
402pub struct TextConfig {
403 pub format: TextResponseFormat,
405}
406
407#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
408#[serde(tag = "type", rename_all = "snake_case")]
409pub enum TextResponseFormat {
410 Text,
412 JsonObject,
414 JsonSchema(ResponseFormatJsonSchema),
416}
417
418#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
420#[serde(tag = "type", rename_all = "snake_case")]
421pub enum ToolDefinition {
422 FileSearch(FileSearch),
424 Function(Function),
426 WebSearchPreview(WebSearchPreview),
428 ComputerUsePreview(ComputerUsePreview),
430 Mcp(Mcp),
432 CodeInterpreter(CodeInterpreter),
434 ImageGeneration(ImageGeneration),
436 LocalShell,
438}
439
440#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
441#[builder(
442 name = "FileSearchArgs",
443 pattern = "mutable",
444 setter(into, strip_option),
445 default
446)]
447#[builder(build_fn(error = "OpenAIError"))]
448pub struct FileSearch {
449 pub vector_store_ids: Vec<String>,
451 #[serde(skip_serializing_if = "Option::is_none")]
453 pub max_num_results: Option<u32>,
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub filters: Option<Filter>,
457 #[serde(skip_serializing_if = "Option::is_none")]
459 pub ranking_options: Option<RankingOptions>,
460}
461
462#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
463#[builder(
464 name = "FunctionArgs",
465 pattern = "mutable",
466 setter(into, strip_option),
467 default
468)]
469pub struct Function {
470 pub name: String,
472 pub parameters: serde_json::Value,
474 pub strict: bool,
476 #[serde(skip_serializing_if = "Option::is_none")]
479 pub description: Option<String>,
480}
481
482#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
483#[builder(
484 name = "WebSearchPreviewArgs",
485 pattern = "mutable",
486 setter(into, strip_option),
487 default
488)]
489pub struct WebSearchPreview {
490 #[serde(skip_serializing_if = "Option::is_none")]
492 pub user_location: Option<Location>,
493 #[serde(skip_serializing_if = "Option::is_none")]
495 pub search_context_size: Option<WebSearchContextSize>,
496}
497
498#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
499#[serde(rename_all = "lowercase")]
500pub enum WebSearchContextSize {
501 Low,
502 Medium,
503 High,
504}
505
506#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
507#[builder(
508 name = "ComputerUsePreviewArgs",
509 pattern = "mutable",
510 setter(into, strip_option),
511 default
512)]
513pub struct ComputerUsePreview {
514 environment: String,
516 display_width: u32,
518 display_height: u32,
520}
521
522#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
524pub struct RankingOptions {
525 pub ranker: String,
527 #[serde(skip_serializing_if = "Option::is_none")]
530 pub score_threshold: Option<f32>,
531}
532
533#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
535#[serde(untagged)]
536pub enum Filter {
537 Comparison(ComparisonFilter),
540 Compound(CompoundFilter),
542}
543
544#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
546pub struct ComparisonFilter {
547 #[serde(rename = "type")]
549 pub op: ComparisonType,
550 pub key: String,
552 pub value: serde_json::Value,
554}
555
556#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
557pub enum ComparisonType {
558 #[serde(rename = "eq")]
559 Equals,
560 #[serde(rename = "ne")]
561 NotEquals,
562 #[serde(rename = "gt")]
563 GreaterThan,
564 #[serde(rename = "gte")]
565 GreaterThanOrEqualTo,
566 #[serde(rename = "lt")]
567 LessThan,
568 #[serde(rename = "lte")]
569 LessThanOrEqualTo,
570}
571
572#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
574pub struct CompoundFilter {
575 #[serde(rename = "type")]
577 pub op: ComparisonType,
578 pub filters: Vec<Filter>,
580}
581
582#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
583#[serde(rename_all = "lowercase")]
584pub enum CompoundType {
585 And,
586 Or,
587}
588
589#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
591#[builder(
592 name = "LocationArgs",
593 pattern = "mutable",
594 setter(into, strip_option),
595 default
596)]
597#[builder(build_fn(error = "OpenAIError"))]
598pub struct Location {
599 #[serde(rename = "type")]
601 pub kind: String,
602 #[serde(skip_serializing_if = "Option::is_none")]
604 pub city: Option<String>,
605 #[serde(skip_serializing_if = "Option::is_none")]
607 pub country: Option<String>,
608 #[serde(skip_serializing_if = "Option::is_none")]
610 pub region: Option<String>,
611 #[serde(skip_serializing_if = "Option::is_none")]
613 pub timezone: Option<String>,
614}
615
616#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
618#[builder(
619 name = "McpArgs",
620 pattern = "mutable",
621 setter(into, strip_option),
622 default
623)]
624#[builder(build_fn(error = "OpenAIError"))]
625pub struct Mcp {
626 pub server_label: String,
628 pub server_url: String,
630 #[serde(skip_serializing_if = "Option::is_none")]
632 pub allowed_tools: Option<AllowedTools>,
633 #[serde(skip_serializing_if = "Option::is_none")]
635 pub headers: Option<Value>,
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub require_approval: Option<RequireApproval>,
639}
640
641#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
643#[serde(untagged)]
644pub enum AllowedTools {
645 List(Vec<String>),
647 Filter(McpAllowedToolsFilter),
649}
650
651#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
653pub struct McpAllowedToolsFilter {
654 #[serde(skip_serializing_if = "Option::is_none")]
656 pub tool_names: Option<Vec<String>>,
657}
658
659#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
661#[serde(untagged)]
662pub enum RequireApproval {
663 Policy(RequireApprovalPolicy),
665 Filter(McpApprovalFilter),
667}
668
669#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
670#[serde(rename_all = "lowercase")]
671pub enum RequireApprovalPolicy {
672 Always,
673 Never,
674}
675
676#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
678pub struct McpApprovalFilter {
679 #[serde(skip_serializing_if = "Option::is_none")]
681 pub always: Option<McpAllowedToolsFilter>,
682 #[serde(skip_serializing_if = "Option::is_none")]
684 pub never: Option<McpAllowedToolsFilter>,
685}
686
687#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
689#[serde(untagged)]
690pub enum CodeInterpreterContainer {
691 Id(String),
693 Container(CodeInterpreterContainerKind),
695}
696
697#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
699#[serde(tag = "type", rename_all = "snake_case")]
700pub enum CodeInterpreterContainerKind {
701 Auto {
702 #[serde(skip_serializing_if = "Option::is_none")]
704 file_ids: Option<Vec<String>>,
705 },
706}
707
708#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
710#[builder(
711 name = "CodeInterpreterArgs",
712 pattern = "mutable",
713 setter(into, strip_option),
714 default
715)]
716#[builder(build_fn(error = "OpenAIError"))]
717pub struct CodeInterpreter {
718 pub container: CodeInterpreterContainer,
720}
721
722#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
724pub struct InputImageMask {
725 #[serde(skip_serializing_if = "Option::is_none")]
727 pub image_url: Option<String>,
728 #[serde(skip_serializing_if = "Option::is_none")]
730 pub file_id: Option<String>,
731}
732
733#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
735#[builder(
736 name = "ImageGenerationArgs",
737 pattern = "mutable",
738 setter(into, strip_option),
739 default
740)]
741#[builder(build_fn(error = "OpenAIError"))]
742pub struct ImageGeneration {
743 #[serde(skip_serializing_if = "Option::is_none")]
745 pub background: Option<ImageGenerationBackground>,
746 #[serde(skip_serializing_if = "Option::is_none")]
748 pub input_image_mask: Option<InputImageMask>,
749 #[serde(skip_serializing_if = "Option::is_none")]
751 pub model: Option<String>,
752 #[serde(skip_serializing_if = "Option::is_none")]
754 pub moderation: Option<String>,
755 #[serde(skip_serializing_if = "Option::is_none")]
757 pub output_compression: Option<u8>,
758 #[serde(skip_serializing_if = "Option::is_none")]
760 pub output_format: Option<ImageGenerationOutputFormat>,
761 #[serde(skip_serializing_if = "Option::is_none")]
763 pub partial_images: Option<u8>,
764 #[serde(skip_serializing_if = "Option::is_none")]
766 pub quality: Option<ImageGenerationQuality>,
767 #[serde(skip_serializing_if = "Option::is_none")]
769 pub size: Option<ImageGenerationSize>,
770}
771
772#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
773#[serde(rename_all = "lowercase")]
774pub enum ImageGenerationBackground {
775 Transparent,
776 Opaque,
777 Auto,
778}
779
780#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
781#[serde(rename_all = "lowercase")]
782pub enum ImageGenerationOutputFormat {
783 Png,
784 Webp,
785 Jpeg,
786}
787
788#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
789#[serde(rename_all = "lowercase")]
790pub enum ImageGenerationQuality {
791 Low,
792 Medium,
793 High,
794 Auto,
795}
796
797#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
798#[serde(rename_all = "lowercase")]
799pub enum ImageGenerationSize {
800 Auto,
801 #[serde(rename = "1024x1024")]
802 Size1024x1024,
803 #[serde(rename = "1024x1536")]
804 Size1024x1536,
805 #[serde(rename = "1536x1024")]
806 Size1536x1024,
807}
808
809#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
811#[serde(untagged)]
812pub enum ToolChoice {
813 Mode(ToolChoiceMode),
815 Hosted {
817 #[serde(rename = "type")]
819 kind: HostedToolType,
820 },
821 Function {
823 name: String,
825 },
826}
827
828#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
830#[serde(rename_all = "lowercase")]
831pub enum ToolChoiceMode {
832 None,
834 Auto,
836 Required,
838}
839
840#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
842#[serde(rename_all = "snake_case")]
843pub enum HostedToolType {
844 FileSearch,
845 WebSearchPreview,
846 ComputerUsePreview,
847}
848
849#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
851pub struct ErrorObject {
852 pub code: String,
854 pub message: String,
856}
857
858#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
860pub struct IncompleteDetails {
861 pub reason: String,
863}
864
865#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
867pub struct OutputText {
868 pub annotations: Vec<Annotation>,
870 pub text: String,
872}
873
874#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
875#[serde(tag = "type", rename_all = "snake_case")]
876pub enum Annotation {
877 FileCitation(FileCitation),
879 UrlCitation(UrlCitation),
881 FilePath(FilePath),
883}
884
885#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
886pub struct FileCitation {
887 file_id: String,
889 index: u32,
891}
892
893#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
894pub struct UrlCitation {
895 end_index: u32,
897 start_index: u32,
899 title: String,
901 url: String,
903}
904
905#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
906pub struct FilePath {
907 file_id: String,
909 index: u32,
911}
912
913#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
915pub struct Refusal {
916 pub refusal: String,
918}
919
920#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
922pub struct OutputMessage {
923 pub content: Vec<Content>,
925 pub id: String,
927 pub role: Role,
929 pub status: OutputStatus,
931}
932
933#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
934#[serde(tag = "type", rename_all = "snake_case")]
935pub enum Content {
936 OutputText(OutputText),
938 Refusal(Refusal),
940}
941
942#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
944#[serde(tag = "type", rename_all = "snake_case")]
945pub enum OutputContent {
946 Message(OutputMessage),
948 FileSearchCall(FileSearchCallOutput),
950 FunctionCall(FunctionCall),
952 WebSearchCall(WebSearchCallOutput),
954 ComputerCall(ComputerCallOutput),
956 Reasoning(ReasoningItem),
960 ImageGenerationCall(ImageGenerationCallOutput),
962 CodeInterpreterCall(CodeInterpreterCallOutput),
964 LocalShellCall(LocalShellCallOutput),
966 McpCall(McpCallOutput),
968 McpListTools(McpListToolsOutput),
970 McpApprovalRequest(McpApprovalRequestOutput),
972}
973
974#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
976pub struct ReasoningItem {
977 pub id: String,
979 pub summary: Vec<SummaryText>,
981 #[serde(skip_serializing_if = "Option::is_none")]
984 pub encrypted_content: Option<String>,
985 #[serde(skip_serializing_if = "Option::is_none")]
987 pub status: Option<OutputStatus>,
988}
989
990#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
992pub struct SummaryText {
993 pub text: String,
995}
996
997#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
999pub struct FileSearchCallOutput {
1000 pub id: String,
1002 pub queries: Vec<String>,
1004 pub status: FileSearchCallOutputStatus,
1006 #[serde(skip_serializing_if = "Option::is_none")]
1008 pub results: Option<Vec<FileSearchResult>>,
1009}
1010
1011#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1012#[serde(rename_all = "snake_case")]
1013pub enum FileSearchCallOutputStatus {
1014 InProgress,
1015 Searching,
1016 Incomplete,
1017 Failed,
1018 Completed,
1019}
1020
1021#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1023pub struct FileSearchResult {
1024 pub file_id: String,
1026 pub filename: String,
1028 pub score: f32,
1030 pub text: String,
1032 pub attributes: HashMap<String, serde_json::Value>,
1037}
1038
1039#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1040pub struct SafetyCheck {
1041 pub id: String,
1043 pub code: String,
1045 pub message: String,
1047}
1048
1049#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1051pub struct WebSearchCallOutput {
1052 pub id: String,
1054 pub status: String,
1056}
1057
1058#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1060pub struct ComputerCallOutput {
1061 pub action: ComputerCallAction,
1062 pub call_id: String,
1064 pub id: String,
1066 pub pending_safety_checks: Vec<SafetyCheck>,
1068 pub status: OutputStatus,
1070}
1071
1072#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1074pub struct Point {
1075 pub x: i32,
1076 pub y: i32,
1077}
1078
1079#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1081#[serde(tag = "type", rename_all = "snake_case")]
1082pub enum ComputerCallAction {
1083 Click(Click),
1085
1086 DoubleClick(DoubleClick),
1088
1089 Drag(Drag),
1091
1092 KeyPress(KeyPress),
1094
1095 Move(MoveAction),
1097
1098 Screenshot,
1100
1101 Scroll(Scroll),
1103
1104 Type(TypeAction),
1106
1107 Wait,
1109}
1110
1111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1112#[serde(rename_all = "snake_case")]
1113pub enum ButtonPress {
1114 Left,
1115 Right,
1116 Wheel,
1117 Back,
1118 Forward,
1119}
1120
1121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1123pub struct Click {
1124 pub button: ButtonPress,
1126 pub x: i32,
1128 pub y: i32,
1130}
1131
1132#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1134pub struct DoubleClick {
1135 pub x: i32,
1137 pub y: i32,
1139}
1140
1141#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1143pub struct Drag {
1144 pub path: Vec<Point>,
1146 pub x: i32,
1148 pub y: i32,
1150}
1151
1152#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1154pub struct KeyPress {
1155 pub keys: Vec<String>,
1157}
1158
1159#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1161pub struct MoveAction {
1162 pub x: i32,
1164 pub y: i32,
1166}
1167
1168#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1170pub struct Scroll {
1171 pub scroll_x: i32,
1173 pub scroll_y: i32,
1175 pub x: i32,
1177 pub y: i32,
1179}
1180
1181#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1183pub struct TypeAction {
1184 pub text: String,
1186}
1187
1188#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1190pub struct FunctionCall {
1191 pub id: String,
1193 pub call_id: String,
1195 pub name: String,
1197 pub arguments: String,
1199 pub status: OutputStatus,
1201}
1202
1203#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1205pub struct ImageGenerationCallOutput {
1206 pub id: String,
1208 pub result: Option<String>,
1210 pub status: String,
1212}
1213
1214#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1216pub struct CodeInterpreterCallOutput {
1217 pub code: String,
1219 pub id: String,
1221 pub status: String,
1223 pub container_id: String,
1225 pub results: Vec<CodeInterpreterResult>,
1227}
1228
1229#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1231#[serde(tag = "type", rename_all = "snake_case")]
1232pub enum CodeInterpreterResult {
1233 Logs(CodeInterpreterTextOutput),
1235 Files(CodeInterpreterFileOutput),
1237}
1238
1239#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1241pub struct CodeInterpreterTextOutput {
1242 pub logs: String,
1244}
1245
1246#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1248pub struct CodeInterpreterFileOutput {
1249 pub files: Vec<CodeInterpreterFile>,
1251}
1252
1253#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1254pub struct CodeInterpreterFile {
1255 file_id: String,
1257 mime_type: String,
1259}
1260
1261#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1263pub struct LocalShellCallOutput {
1264 pub action: LocalShellAction,
1266 pub call_id: String,
1268 pub id: String,
1270 pub status: String,
1272}
1273
1274#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1276pub struct LocalShellAction {
1277 pub command: Vec<String>,
1279 pub env: HashMap<String, String>,
1281 pub timeout_ms: Option<u64>,
1283 pub user: Option<String>,
1285 pub working_directory: Option<String>,
1287}
1288
1289#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1291pub struct McpCallOutput {
1292 pub arguments: String,
1294 pub id: String,
1296 pub name: String,
1298 pub server_label: String,
1300 pub error: Option<String>,
1302 pub output: Option<String>,
1304}
1305
1306#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1308pub struct McpListToolsOutput {
1309 pub id: String,
1311 pub server_label: String,
1313 pub tools: Vec<McpToolInfo>,
1315 #[serde(skip_serializing_if = "Option::is_none")]
1317 pub error: Option<String>,
1318}
1319
1320#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1322pub struct McpToolInfo {
1323 pub name: String,
1325 pub input_schema: Value,
1327 #[serde(skip_serializing_if = "Option::is_none")]
1329 pub annotations: Option<Value>,
1330 #[serde(skip_serializing_if = "Option::is_none")]
1332 pub description: Option<String>,
1333}
1334
1335#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1337pub struct McpApprovalRequestOutput {
1338 pub arguments: String,
1340 pub id: String,
1342 pub name: String,
1344 pub server_label: String,
1346}
1347
1348#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1350pub struct Usage {
1351 pub input_tokens: u32,
1353 pub input_tokens_details: PromptTokensDetails,
1355 pub output_tokens: u32,
1357 pub output_tokens_details: CompletionTokensDetails,
1359 pub total_tokens: u32,
1361}
1362
1363#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1365pub struct Response {
1366 pub created_at: u64,
1368
1369 #[serde(skip_serializing_if = "Option::is_none")]
1371 pub error: Option<ErrorObject>,
1372
1373 pub id: String,
1375
1376 #[serde(skip_serializing_if = "Option::is_none")]
1378 pub incomplete_details: Option<IncompleteDetails>,
1379
1380 #[serde(skip_serializing_if = "Option::is_none")]
1382 pub instructions: Option<String>,
1383
1384 #[serde(skip_serializing_if = "Option::is_none")]
1386 pub max_output_tokens: Option<u32>,
1387
1388 #[serde(skip_serializing_if = "Option::is_none")]
1390 pub metadata: Option<HashMap<String, String>>,
1391
1392 pub model: String,
1394
1395 pub object: String,
1397
1398 pub output: Vec<OutputContent>,
1400
1401 #[serde(skip_serializing_if = "Option::is_none")]
1405 pub output_text: Option<String>,
1406
1407 #[serde(skip_serializing_if = "Option::is_none")]
1409 pub parallel_tool_calls: Option<bool>,
1410
1411 #[serde(skip_serializing_if = "Option::is_none")]
1413 pub previous_response_id: Option<String>,
1414
1415 #[serde(skip_serializing_if = "Option::is_none")]
1417 pub reasoning: Option<ReasoningConfig>,
1418
1419 #[serde(skip_serializing_if = "Option::is_none")]
1421 pub store: Option<bool>,
1422
1423 #[serde(skip_serializing_if = "Option::is_none")]
1425 pub service_tier: Option<ServiceTier>,
1426
1427 pub status: Status,
1429
1430 #[serde(skip_serializing_if = "Option::is_none")]
1432 pub temperature: Option<f32>,
1433
1434 #[serde(skip_serializing_if = "Option::is_none")]
1436 pub text: Option<TextConfig>,
1437
1438 #[serde(skip_serializing_if = "Option::is_none")]
1440 pub tool_choice: Option<ToolChoice>,
1441
1442 #[serde(skip_serializing_if = "Option::is_none")]
1444 pub tools: Option<Vec<ToolDefinition>>,
1445
1446 #[serde(skip_serializing_if = "Option::is_none")]
1448 pub top_p: Option<f32>,
1449
1450 #[serde(skip_serializing_if = "Option::is_none")]
1452 pub truncation: Option<Truncation>,
1453
1454 #[serde(skip_serializing_if = "Option::is_none")]
1456 pub usage: Option<Usage>,
1457
1458 #[serde(skip_serializing_if = "Option::is_none")]
1460 pub user: Option<String>,
1461}
1462
1463#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1464#[serde(rename_all = "snake_case")]
1465pub enum Status {
1466 Completed,
1467 Failed,
1468 InProgress,
1469 Incomplete,
1470}
1471
1472#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1474#[serde(tag = "type")]
1475#[non_exhaustive] pub enum ResponseEvent {
1477 #[serde(rename = "response.created")]
1479 ResponseCreated(ResponseCreated),
1480 #[serde(rename = "response.in_progress")]
1482 ResponseInProgress(ResponseInProgress),
1483 #[serde(rename = "response.completed")]
1485 ResponseCompleted(ResponseCompleted),
1486 #[serde(rename = "response.failed")]
1488 ResponseFailed(ResponseFailed),
1489 #[serde(rename = "response.incomplete")]
1491 ResponseIncomplete(ResponseIncomplete),
1492 #[serde(rename = "response.queued")]
1494 ResponseQueued(ResponseQueued),
1495 #[serde(rename = "response.output_item.added")]
1497 ResponseOutputItemAdded(ResponseOutputItemAdded),
1498 #[serde(rename = "response.content_part.added")]
1500 ResponseContentPartAdded(ResponseContentPartAdded),
1501 #[serde(rename = "response.output_text.delta")]
1503 ResponseOutputTextDelta(ResponseOutputTextDelta),
1504 #[serde(rename = "response.output_text.done")]
1506 ResponseOutputTextDone(ResponseOutputTextDone),
1507 #[serde(rename = "response.refusal.delta")]
1509 ResponseRefusalDelta(ResponseRefusalDelta),
1510 #[serde(rename = "response.refusal.done")]
1512 ResponseRefusalDone(ResponseRefusalDone),
1513 #[serde(rename = "response.content_part.done")]
1515 ResponseContentPartDone(ResponseContentPartDone),
1516 #[serde(rename = "response.output_item.done")]
1518 ResponseOutputItemDone(ResponseOutputItemDone),
1519 #[serde(rename = "response.function_call_arguments.delta")]
1521 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1522 #[serde(rename = "response.function_call_arguments.done")]
1524 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1525 #[serde(rename = "response.file_search_call.in_progress")]
1527 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1528 #[serde(rename = "response.file_search_call.searching")]
1530 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1531 #[serde(rename = "response.file_search_call.completed")]
1533 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1534 #[serde(rename = "response.web_search_call.in_progress")]
1536 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1537 #[serde(rename = "response.web_search_call.searching")]
1539 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1540 #[serde(rename = "response.web_search_call.completed")]
1542 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1543 #[serde(rename = "response.reasoning_summary_part.added")]
1545 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1546 #[serde(rename = "response.reasoning_summary_part.done")]
1548 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1549 #[serde(rename = "response.reasoning_summary_text.delta")]
1551 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1552 #[serde(rename = "response.reasoning_summary_text.done")]
1554 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1555 #[serde(rename = "response.reasoning_summary.delta")]
1557 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1558 #[serde(rename = "response.reasoning_summary.done")]
1560 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1561 #[serde(rename = "response.image_generation_call.in_progress")]
1563 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1564 #[serde(rename = "response.image_generation_call.generating")]
1566 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1567 #[serde(rename = "response.image_generation_call.partial_image")]
1569 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1570 #[serde(rename = "response.image_generation_call.completed")]
1572 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1573 #[serde(rename = "response.mcp_call_arguments.delta")]
1575 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1576 #[serde(rename = "response.mcp_call_arguments.done")]
1578 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1579 #[serde(rename = "response.mcp_call.completed")]
1581 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1582 #[serde(rename = "response.mcp_call.failed")]
1584 ResponseMcpCallFailed(ResponseMcpCallFailed),
1585 #[serde(rename = "response.mcp_call.in_progress")]
1587 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1588 #[serde(rename = "response.mcp_list_tools.completed")]
1590 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1591 #[serde(rename = "response.mcp_list_tools.failed")]
1593 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1594 #[serde(rename = "response.mcp_list_tools.in_progress")]
1596 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1597 #[serde(rename = "response.code_interpreter_call.in_progress")]
1599 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1600 #[serde(rename = "response.code_interpreter_call.interpreting")]
1602 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1603 #[serde(rename = "response.code_interpreter_call.completed")]
1605 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1606 #[serde(rename = "response.code_interpreter_call_code.delta")]
1608 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1609 #[serde(rename = "response.code_interpreter_call_code.done")]
1611 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1612 #[serde(rename = "response.output_text.annotation.added")]
1614 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1615 #[serde(rename = "error")]
1617 ResponseError(ResponseError),
1618
1619 #[serde(untagged)]
1621 Unknown(serde_json::Value),
1622}
1623
1624pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
1626
1627#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1628#[non_exhaustive]
1629pub struct ResponseCreated {
1630 pub sequence_number: u64,
1631 pub response: ResponseMetadata,
1632}
1633
1634#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1635#[non_exhaustive]
1636pub struct ResponseInProgress {
1637 pub sequence_number: u64,
1638 pub response: ResponseMetadata,
1639}
1640
1641#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1642#[non_exhaustive]
1643pub struct ResponseOutputItemAdded {
1644 pub sequence_number: u64,
1645 pub output_index: u32,
1646 pub item: OutputItem,
1647}
1648
1649#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1650#[non_exhaustive]
1651pub struct ResponseContentPartAdded {
1652 pub sequence_number: u64,
1653 pub item_id: String,
1654 pub output_index: u32,
1655 pub content_index: u32,
1656 pub part: ContentPart,
1657}
1658
1659#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1660#[non_exhaustive]
1661pub struct ResponseOutputTextDelta {
1662 pub sequence_number: u64,
1663 pub item_id: String,
1664 pub output_index: u32,
1665 pub content_index: u32,
1666 pub delta: String,
1667 #[serde(default, skip_serializing_if = "Option::is_none")]
1668 pub logprobs: Option<serde_json::Value>,
1669}
1670
1671#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1672#[non_exhaustive]
1673pub struct ResponseContentPartDone {
1674 pub sequence_number: u64,
1675 pub item_id: String,
1676 pub output_index: u32,
1677 pub content_index: u32,
1678 pub part: ContentPart,
1679}
1680
1681#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1682#[non_exhaustive]
1683pub struct ResponseOutputItemDone {
1684 pub sequence_number: u64,
1685 pub output_index: u32,
1686 pub item: OutputItem,
1687}
1688
1689#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1691#[non_exhaustive]
1692pub struct ResponseCompleted {
1693 pub sequence_number: u64,
1694 pub response: ResponseMetadata,
1695}
1696
1697#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1699#[non_exhaustive]
1700pub struct ResponseFailed {
1701 pub sequence_number: u64,
1702 pub response: ResponseMetadata,
1703}
1704
1705#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1707#[non_exhaustive]
1708pub struct ResponseIncomplete {
1709 pub sequence_number: u64,
1710 pub response: ResponseMetadata,
1711}
1712
1713#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1715#[non_exhaustive]
1716pub struct ResponseQueued {
1717 pub sequence_number: u64,
1718 pub response: ResponseMetadata,
1719}
1720
1721#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1723#[non_exhaustive]
1724pub struct ResponseOutputTextDone {
1725 pub sequence_number: u64,
1726 pub item_id: String,
1727 pub output_index: u32,
1728 pub content_index: u32,
1729 pub text: String,
1730 pub logprobs: Option<Vec<serde_json::Value>>,
1731}
1732
1733#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1735#[non_exhaustive]
1736pub struct ResponseRefusalDelta {
1737 pub sequence_number: u64,
1738 pub item_id: String,
1739 pub output_index: u32,
1740 pub content_index: u32,
1741 pub delta: String,
1742}
1743
1744#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1746#[non_exhaustive]
1747pub struct ResponseRefusalDone {
1748 pub sequence_number: u64,
1749 pub item_id: String,
1750 pub output_index: u32,
1751 pub content_index: u32,
1752 pub refusal: String,
1753}
1754
1755#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1757#[non_exhaustive]
1758pub struct ResponseFunctionCallArgumentsDelta {
1759 pub sequence_number: u64,
1760 pub item_id: String,
1761 pub output_index: u32,
1762 pub delta: String,
1763}
1764
1765#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1767#[non_exhaustive]
1768pub struct ResponseFunctionCallArgumentsDone {
1769 pub sequence_number: u64,
1770 pub item_id: String,
1771 pub output_index: u32,
1772 pub arguments: String,
1773}
1774
1775#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1777#[non_exhaustive]
1778pub struct ResponseError {
1779 pub sequence_number: u64,
1780 pub code: Option<String>,
1781 pub message: String,
1782 pub param: Option<String>,
1783}
1784
1785#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1787#[non_exhaustive]
1788pub struct ResponseFileSearchCallInProgress {
1789 pub sequence_number: u64,
1790 pub output_index: u32,
1791 pub item_id: String,
1792}
1793
1794#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1796#[non_exhaustive]
1797pub struct ResponseFileSearchCallSearching {
1798 pub sequence_number: u64,
1799 pub output_index: u32,
1800 pub item_id: String,
1801}
1802
1803#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1805#[non_exhaustive]
1806pub struct ResponseFileSearchCallCompleted {
1807 pub sequence_number: u64,
1808 pub output_index: u32,
1809 pub item_id: String,
1810}
1811
1812#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1814#[non_exhaustive]
1815pub struct ResponseWebSearchCallInProgress {
1816 pub sequence_number: u64,
1817 pub output_index: u32,
1818 pub item_id: String,
1819}
1820
1821#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1823#[non_exhaustive]
1824pub struct ResponseWebSearchCallSearching {
1825 pub sequence_number: u64,
1826 pub output_index: u32,
1827 pub item_id: String,
1828}
1829
1830#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1832#[non_exhaustive]
1833pub struct ResponseWebSearchCallCompleted {
1834 pub sequence_number: u64,
1835 pub output_index: u32,
1836 pub item_id: String,
1837}
1838
1839#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1841#[non_exhaustive]
1842pub struct ResponseReasoningSummaryPartAdded {
1843 pub sequence_number: u64,
1844 pub item_id: String,
1845 pub output_index: u32,
1846 pub summary_index: u32,
1847 pub part: serde_json::Value, }
1849
1850#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1852#[non_exhaustive]
1853pub struct ResponseReasoningSummaryPartDone {
1854 pub sequence_number: u64,
1855 pub item_id: String,
1856 pub output_index: u32,
1857 pub summary_index: u32,
1858 pub part: serde_json::Value,
1859}
1860
1861#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1863#[non_exhaustive]
1864pub struct ResponseReasoningSummaryTextDelta {
1865 pub sequence_number: u64,
1866 pub item_id: String,
1867 pub output_index: u32,
1868 pub summary_index: u32,
1869 pub delta: String,
1870}
1871
1872#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1874#[non_exhaustive]
1875pub struct ResponseReasoningSummaryTextDone {
1876 pub sequence_number: u64,
1877 pub item_id: String,
1878 pub output_index: u32,
1879 pub summary_index: u32,
1880 pub text: String,
1881}
1882
1883#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1885#[non_exhaustive]
1886pub struct ResponseReasoningSummaryDelta {
1887 pub sequence_number: u64,
1888 pub item_id: String,
1889 pub output_index: u32,
1890 pub summary_index: u32,
1891 pub delta: serde_json::Value,
1892}
1893
1894#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1896#[non_exhaustive]
1897pub struct ResponseReasoningSummaryDone {
1898 pub sequence_number: u64,
1899 pub item_id: String,
1900 pub output_index: u32,
1901 pub summary_index: u32,
1902 pub text: String,
1903}
1904
1905#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1907#[non_exhaustive]
1908pub struct ResponseImageGenerationCallInProgress {
1909 pub sequence_number: u64,
1910 pub output_index: u32,
1911 pub item_id: String,
1912}
1913
1914#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1916#[non_exhaustive]
1917pub struct ResponseImageGenerationCallGenerating {
1918 pub sequence_number: u64,
1919 pub output_index: u32,
1920 pub item_id: String,
1921}
1922
1923#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1925#[non_exhaustive]
1926pub struct ResponseImageGenerationCallPartialImage {
1927 pub sequence_number: u64,
1928 pub output_index: u32,
1929 pub item_id: String,
1930 pub partial_image_index: u32,
1931 pub partial_image_b64: String,
1932}
1933
1934#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1936#[non_exhaustive]
1937pub struct ResponseImageGenerationCallCompleted {
1938 pub sequence_number: u64,
1939 pub output_index: u32,
1940 pub item_id: String,
1941}
1942
1943#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1945#[non_exhaustive]
1946pub struct ResponseMcpCallArgumentsDelta {
1947 pub sequence_number: u64,
1948 pub output_index: u32,
1949 pub item_id: String,
1950 pub delta: String,
1951}
1952
1953#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1955#[non_exhaustive]
1956pub struct ResponseMcpCallArgumentsDone {
1957 pub sequence_number: u64,
1958 pub output_index: u32,
1959 pub item_id: String,
1960 pub arguments: String,
1961}
1962
1963#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1965#[non_exhaustive]
1966pub struct ResponseMcpCallCompleted {
1967 pub sequence_number: u64,
1968 pub output_index: u32,
1969 pub item_id: String,
1970}
1971
1972#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1974#[non_exhaustive]
1975pub struct ResponseMcpCallFailed {
1976 pub sequence_number: u64,
1977 pub output_index: u32,
1978 pub item_id: String,
1979}
1980
1981#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1983#[non_exhaustive]
1984pub struct ResponseMcpCallInProgress {
1985 pub sequence_number: u64,
1986 pub output_index: u32,
1987 pub item_id: String,
1988}
1989
1990#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1992#[non_exhaustive]
1993pub struct ResponseMcpListToolsCompleted {
1994 pub sequence_number: u64,
1995 pub output_index: u32,
1996 pub item_id: String,
1997}
1998
1999#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2001#[non_exhaustive]
2002pub struct ResponseMcpListToolsFailed {
2003 pub sequence_number: u64,
2004 pub output_index: u32,
2005 pub item_id: String,
2006}
2007
2008#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2010#[non_exhaustive]
2011pub struct ResponseMcpListToolsInProgress {
2012 pub sequence_number: u64,
2013 pub output_index: u32,
2014 pub item_id: String,
2015}
2016
2017#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2019#[non_exhaustive]
2020pub struct ResponseCodeInterpreterCallInProgress {
2021 pub sequence_number: u64,
2022 pub output_index: u32,
2023 pub item_id: String,
2024}
2025
2026#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2028#[non_exhaustive]
2029pub struct ResponseCodeInterpreterCallInterpreting {
2030 pub sequence_number: u64,
2031 pub output_index: u32,
2032 pub item_id: String,
2033}
2034
2035#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2037#[non_exhaustive]
2038pub struct ResponseCodeInterpreterCallCompleted {
2039 pub sequence_number: u64,
2040 pub output_index: u32,
2041 pub item_id: String,
2042}
2043
2044#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2046#[non_exhaustive]
2047pub struct ResponseCodeInterpreterCallCodeDelta {
2048 pub sequence_number: u64,
2049 pub output_index: u32,
2050 pub item_id: String,
2051 pub delta: String,
2052}
2053
2054#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2056#[non_exhaustive]
2057pub struct ResponseCodeInterpreterCallCodeDone {
2058 pub sequence_number: u64,
2059 pub output_index: u32,
2060 pub item_id: String,
2061 pub code: String,
2062}
2063
2064#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2066#[non_exhaustive]
2067pub struct ResponseMetadata {
2068 pub id: String,
2069 #[serde(skip_serializing_if = "Option::is_none")]
2070 pub object: Option<String>,
2071 pub created_at: u64,
2072 pub status: Status,
2073 #[serde(skip_serializing_if = "Option::is_none")]
2074 pub model: Option<String>,
2075 #[serde(skip_serializing_if = "Option::is_none")]
2076 pub usage: Option<Usage>,
2077 #[serde(skip_serializing_if = "Option::is_none")]
2078 pub error: Option<ErrorObject>,
2079 #[serde(skip_serializing_if = "Option::is_none")]
2080 pub incomplete_details: Option<IncompleteDetails>,
2081 #[serde(skip_serializing_if = "Option::is_none")]
2082 pub input: Option<Input>,
2083 #[serde(skip_serializing_if = "Option::is_none")]
2084 pub instructions: Option<String>,
2085 #[serde(skip_serializing_if = "Option::is_none")]
2086 pub max_output_tokens: Option<u32>,
2087 #[serde(skip_serializing_if = "Option::is_none")]
2089 pub background: Option<bool>,
2090 #[serde(skip_serializing_if = "Option::is_none")]
2092 pub service_tier: Option<ServiceTier>,
2093 #[serde(skip_serializing_if = "Option::is_none")]
2095 pub top_logprobs: Option<u32>,
2096 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub max_tool_calls: Option<u32>,
2099 #[serde(skip_serializing_if = "Option::is_none")]
2100 pub output: Option<Vec<OutputItem>>,
2101 #[serde(skip_serializing_if = "Option::is_none")]
2102 pub parallel_tool_calls: Option<bool>,
2103 #[serde(skip_serializing_if = "Option::is_none")]
2104 pub previous_response_id: Option<String>,
2105 #[serde(skip_serializing_if = "Option::is_none")]
2106 pub reasoning: Option<ReasoningConfig>,
2107 #[serde(skip_serializing_if = "Option::is_none")]
2108 pub store: Option<bool>,
2109 #[serde(skip_serializing_if = "Option::is_none")]
2110 pub temperature: Option<f32>,
2111 #[serde(skip_serializing_if = "Option::is_none")]
2112 pub text: Option<TextConfig>,
2113 #[serde(skip_serializing_if = "Option::is_none")]
2114 pub tool_choice: Option<ToolChoice>,
2115 #[serde(skip_serializing_if = "Option::is_none")]
2116 pub tools: Option<Vec<ToolDefinition>>,
2117 #[serde(skip_serializing_if = "Option::is_none")]
2118 pub top_p: Option<f32>,
2119 #[serde(skip_serializing_if = "Option::is_none")]
2120 pub truncation: Option<Truncation>,
2121 #[serde(skip_serializing_if = "Option::is_none")]
2122 pub user: Option<String>,
2123 #[serde(skip_serializing_if = "Option::is_none")]
2124 pub metadata: Option<HashMap<String, String>>,
2125 #[serde(skip_serializing_if = "Option::is_none")]
2127 pub prompt_cache_key: Option<String>,
2128 #[serde(skip_serializing_if = "Option::is_none")]
2130 pub safety_identifier: Option<String>,
2131}
2132
2133#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2135#[non_exhaustive]
2136pub struct OutputItem {
2137 pub id: String,
2138 #[serde(rename = "type")]
2139 pub item_type: String,
2140 #[serde(skip_serializing_if = "Option::is_none")]
2141 pub status: Option<String>,
2142 #[serde(skip_serializing_if = "Option::is_none")]
2143 pub content: Option<Vec<ContentPart>>,
2144 #[serde(skip_serializing_if = "Option::is_none")]
2145 pub role: Option<String>,
2146 #[serde(skip_serializing_if = "Option::is_none")]
2148 pub summary: Option<Vec<serde_json::Value>>,
2149}
2150
2151#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2153#[non_exhaustive]
2154pub struct ContentPart {
2155 #[serde(rename = "type")]
2156 pub part_type: String,
2157 pub text: Option<String>,
2158 #[serde(default, skip_serializing_if = "Option::is_none")]
2159 pub annotations: Option<Vec<serde_json::Value>>,
2160 #[serde(default, skip_serializing_if = "Option::is_none")]
2161 pub logprobs: Option<Vec<serde_json::Value>>,
2162}
2163
2164#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2169#[non_exhaustive]
2170pub struct ResponseOutputTextAnnotationAdded {
2171 pub sequence_number: u64,
2172 pub item_id: String,
2173 pub output_index: u32,
2174 pub content_index: u32,
2175 pub annotation_index: u32,
2176 pub annotation: TextAnnotation,
2177}
2178
2179#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2181#[non_exhaustive]
2182pub struct TextAnnotation {
2183 #[serde(rename = "type")]
2184 pub annotation_type: String,
2185 pub text: String,
2186 pub start: u32,
2187 pub end: u32,
2188}