1use crate::error::OpenAIError;
2pub use crate::types::{
3 CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
4 ResponseFormatJsonSchema,
5};
6use derive_builder::Builder;
7use futures::Stream;
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10use std::collections::HashMap;
11use std::pin::Pin;
12
13#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
15#[serde(rename_all = "lowercase")]
16pub enum Role {
17 User,
18 Assistant,
19 System,
20 Developer,
21}
22
23#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
25#[serde(rename_all = "snake_case")]
26pub enum OutputStatus {
27 InProgress,
28 Completed,
29 Incomplete,
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
34#[serde(untagged)]
35pub enum Input {
36 Text(String),
38 Items(Vec<InputItem>),
40}
41
42#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
44#[serde(untagged, rename_all = "snake_case")]
45pub enum InputItem {
46 Message(InputMessage),
47 Custom(serde_json::Value),
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
52#[builder(
53 name = "InputMessageArgs",
54 pattern = "mutable",
55 setter(into, strip_option),
56 default
57)]
58#[builder(build_fn(error = "OpenAIError"))]
59pub struct InputMessage {
60 #[serde(default, rename = "type")]
61 pub kind: InputMessageType,
62 pub role: Role,
64 pub content: InputContent,
67}
68
69#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
70#[serde(rename_all = "snake_case")]
71pub enum InputMessageType {
72 #[default]
73 Message,
74}
75
76#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
77#[serde(untagged)]
78pub enum InputContent {
79 TextInput(String),
81 InputItemContentList(Vec<ContentType>),
83}
84
85#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
87#[serde(tag = "type", rename_all = "snake_case")]
88pub enum ContentType {
89 InputText(InputText),
91 InputImage(InputImage),
93 InputFile(InputFile),
95}
96
97#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
98pub struct InputText {
99 pub text: String,
100}
101
102#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
103#[builder(
104 name = "InputImageArgs",
105 pattern = "mutable",
106 setter(into, strip_option),
107 default
108)]
109#[builder(build_fn(error = "OpenAIError"))]
110pub struct InputImage {
111 pub detail: ImageDetail,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub file_id: Option<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
119 pub image_url: Option<String>,
120}
121
122#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
123#[builder(
124 name = "InputFileArgs",
125 pattern = "mutable",
126 setter(into, strip_option),
127 default
128)]
129#[builder(build_fn(error = "OpenAIError"))]
130pub struct InputFile {
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub file_data: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub file_id: Option<String>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub filename: Option<String>,
140}
141
142#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
144#[builder(
145 name = "CreateResponseArgs",
146 pattern = "mutable",
147 setter(into, strip_option),
148 default
149)]
150#[builder(build_fn(error = "OpenAIError"))]
151pub struct CreateResponse {
152 pub input: Input,
154
155 pub model: String,
159
160 #[serde(skip_serializing_if = "Option::is_none")]
163 pub background: Option<bool>,
164
165 #[serde(skip_serializing_if = "Option::is_none")]
183 pub include: Option<Vec<String>>,
184
185 #[serde(skip_serializing_if = "Option::is_none")]
191 pub instructions: Option<String>,
192
193 #[serde(skip_serializing_if = "Option::is_none")]
196 pub max_output_tokens: Option<u32>,
197
198 pub max_tool_calls: Option<u32>,
202
203 #[serde(skip_serializing_if = "Option::is_none")]
210 pub metadata: Option<HashMap<String, String>>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub parallel_tool_calls: Option<bool>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
219 pub previous_response_id: Option<String>,
220
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub prompt: Option<PromptConfig>,
224
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub reasoning: Option<ReasoningConfig>,
228
229 #[serde(skip_serializing_if = "Option::is_none")]
249 pub service_tier: Option<ServiceTier>,
250
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub store: Option<bool>,
254
255 #[serde(skip_serializing_if = "Option::is_none")]
258 pub stream: Option<bool>,
259
260 #[serde(skip_serializing_if = "Option::is_none")]
265 pub temperature: Option<f32>,
266
267 #[serde(skip_serializing_if = "Option::is_none")]
270 pub text: Option<TextConfig>,
271
272 #[serde(skip_serializing_if = "Option::is_none")]
275 pub tool_choice: Option<ToolChoice>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
281 pub tools: Option<Vec<ToolDefinition>>,
282
283 #[serde(skip_serializing_if = "Option::is_none")]
286 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
294 pub top_p: Option<f32>,
295
296 #[serde(skip_serializing_if = "Option::is_none")]
300 pub truncation: Option<Truncation>,
301
302 #[serde(skip_serializing_if = "Option::is_none")]
305 pub user: Option<String>,
306
307 #[serde(skip_serializing_if = "Option::is_none")]
309 pub prompt_cache_key: Option<String>,
310}
311
312#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
314pub struct PromptConfig {
315 pub id: String,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub version: Option<String>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
326 pub variables: Option<HashMap<String, String>>,
327}
328
329#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
331#[serde(rename_all = "lowercase")]
332pub enum ServiceTier {
333 Auto,
334 Default,
335 Flex,
336 Scale,
337 Priority,
338}
339
340#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
342#[serde(rename_all = "lowercase")]
343pub enum Truncation {
344 Auto,
345 Disabled,
346}
347
348#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
350#[builder(
351 name = "ReasoningConfigArgs",
352 pattern = "mutable",
353 setter(into, strip_option),
354 default
355)]
356#[builder(build_fn(error = "OpenAIError"))]
357pub struct ReasoningConfig {
358 #[serde(skip_serializing_if = "Option::is_none")]
360 pub effort: Option<ReasoningEffort>,
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub summary: Option<ReasoningSummary>,
364}
365
366#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
367#[serde(rename_all = "lowercase")]
368pub enum ReasoningSummary {
369 Auto,
370 Concise,
371 Detailed,
372}
373
374#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
376pub struct TextConfig {
377 pub format: TextResponseFormat,
379}
380
381#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
382#[serde(tag = "type", rename_all = "snake_case")]
383pub enum TextResponseFormat {
384 Text,
386 JsonObject,
388 JsonSchema(ResponseFormatJsonSchema),
390}
391
392#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
394#[serde(tag = "type", rename_all = "snake_case")]
395pub enum ToolDefinition {
396 FileSearch(FileSearch),
398 Function(Function),
400 WebSearchPreview(WebSearchPreview),
402 ComputerUsePreview(ComputerUsePreview),
404 Mcp(Mcp),
406 CodeInterpreter(CodeInterpreter),
408 ImageGeneration(ImageGeneration),
410 LocalShell,
412}
413
414#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
415#[builder(
416 name = "FileSearchArgs",
417 pattern = "mutable",
418 setter(into, strip_option),
419 default
420)]
421#[builder(build_fn(error = "OpenAIError"))]
422pub struct FileSearch {
423 pub vector_store_ids: Vec<String>,
425 #[serde(skip_serializing_if = "Option::is_none")]
427 pub max_num_results: Option<u32>,
428 #[serde(skip_serializing_if = "Option::is_none")]
430 pub filters: Option<Filter>,
431 #[serde(skip_serializing_if = "Option::is_none")]
433 pub ranking_options: Option<RankingOptions>,
434}
435
436#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
437#[builder(
438 name = "FunctionArgs",
439 pattern = "mutable",
440 setter(into, strip_option),
441 default
442)]
443pub struct Function {
444 pub name: String,
446 pub parameters: serde_json::Value,
448 pub strict: bool,
450 #[serde(skip_serializing_if = "Option::is_none")]
453 pub description: Option<String>,
454}
455
456#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
457#[builder(
458 name = "WebSearchPreviewArgs",
459 pattern = "mutable",
460 setter(into, strip_option),
461 default
462)]
463pub struct WebSearchPreview {
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub user_location: Option<Location>,
467 #[serde(skip_serializing_if = "Option::is_none")]
469 pub search_context_size: Option<WebSearchContextSize>,
470}
471
472#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
473#[serde(rename_all = "lowercase")]
474pub enum WebSearchContextSize {
475 Low,
476 Medium,
477 High,
478}
479
480#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
481#[builder(
482 name = "ComputerUsePreviewArgs",
483 pattern = "mutable",
484 setter(into, strip_option),
485 default
486)]
487pub struct ComputerUsePreview {
488 environment: String,
490 display_width: u32,
492 display_height: u32,
494}
495
496#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
498pub struct RankingOptions {
499 pub ranker: String,
501 #[serde(skip_serializing_if = "Option::is_none")]
504 pub score_threshold: Option<f32>,
505}
506
507#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
509#[serde(untagged)]
510pub enum Filter {
511 Comparison(ComparisonFilter),
514 Compound(CompoundFilter),
516}
517
518#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
520pub struct ComparisonFilter {
521 #[serde(rename = "type")]
523 pub op: ComparisonType,
524 pub key: String,
526 pub value: serde_json::Value,
528}
529
530#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
531pub enum ComparisonType {
532 #[serde(rename = "eq")]
533 Equals,
534 #[serde(rename = "ne")]
535 NotEquals,
536 #[serde(rename = "gt")]
537 GreaterThan,
538 #[serde(rename = "gte")]
539 GreaterThanOrEqualTo,
540 #[serde(rename = "lt")]
541 LessThan,
542 #[serde(rename = "lte")]
543 LessThanOrEqualTo,
544}
545
546#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
548pub struct CompoundFilter {
549 #[serde(rename = "type")]
551 pub op: CompoundType,
552 pub filters: Vec<Filter>,
554}
555
556#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
557#[serde(rename_all = "lowercase")]
558pub enum CompoundType {
559 And,
560 Or,
561}
562
563#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
565#[builder(
566 name = "LocationArgs",
567 pattern = "mutable",
568 setter(into, strip_option),
569 default
570)]
571#[builder(build_fn(error = "OpenAIError"))]
572pub struct Location {
573 #[serde(rename = "type")]
575 pub kind: String,
576 #[serde(skip_serializing_if = "Option::is_none")]
578 pub city: Option<String>,
579 #[serde(skip_serializing_if = "Option::is_none")]
581 pub country: Option<String>,
582 #[serde(skip_serializing_if = "Option::is_none")]
584 pub region: Option<String>,
585 #[serde(skip_serializing_if = "Option::is_none")]
587 pub timezone: Option<String>,
588}
589
590#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
592#[builder(
593 name = "McpArgs",
594 pattern = "mutable",
595 setter(into, strip_option),
596 default
597)]
598#[builder(build_fn(error = "OpenAIError"))]
599pub struct Mcp {
600 pub server_label: String,
602 pub server_url: String,
604 #[serde(skip_serializing_if = "Option::is_none")]
606 pub allowed_tools: Option<AllowedTools>,
607 #[serde(skip_serializing_if = "Option::is_none")]
609 pub headers: Option<Value>,
610 #[serde(skip_serializing_if = "Option::is_none")]
612 pub require_approval: Option<RequireApproval>,
613}
614
615#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
617#[serde(untagged)]
618pub enum AllowedTools {
619 List(Vec<String>),
621 Filter(McpAllowedToolsFilter),
623}
624
625#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
627pub struct McpAllowedToolsFilter {
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub tool_names: Option<Vec<String>>,
631}
632
633#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
635#[serde(untagged)]
636pub enum RequireApproval {
637 Policy(RequireApprovalPolicy),
639 Filter(McpApprovalFilter),
641}
642
643#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
644#[serde(rename_all = "lowercase")]
645pub enum RequireApprovalPolicy {
646 Always,
647 Never,
648}
649
650#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
652pub struct McpApprovalFilter {
653 #[serde(skip_serializing_if = "Option::is_none")]
655 pub always: Option<McpAllowedToolsFilter>,
656 #[serde(skip_serializing_if = "Option::is_none")]
658 pub never: Option<McpAllowedToolsFilter>,
659}
660
661#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
663#[serde(untagged)]
664pub enum CodeInterpreterContainer {
665 Id(String),
667 Container(CodeInterpreterContainerKind),
669}
670
671#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
673#[serde(tag = "type", rename_all = "snake_case")]
674pub enum CodeInterpreterContainerKind {
675 Auto {
676 #[serde(skip_serializing_if = "Option::is_none")]
678 file_ids: Option<Vec<String>>,
679 },
680}
681
682#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
684#[builder(
685 name = "CodeInterpreterArgs",
686 pattern = "mutable",
687 setter(into, strip_option),
688 default
689)]
690#[builder(build_fn(error = "OpenAIError"))]
691pub struct CodeInterpreter {
692 pub container: CodeInterpreterContainer,
694}
695
696#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
698pub struct InputImageMask {
699 #[serde(skip_serializing_if = "Option::is_none")]
701 pub image_url: Option<String>,
702 #[serde(skip_serializing_if = "Option::is_none")]
704 pub file_id: Option<String>,
705}
706
707#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
709#[builder(
710 name = "ImageGenerationArgs",
711 pattern = "mutable",
712 setter(into, strip_option),
713 default
714)]
715#[builder(build_fn(error = "OpenAIError"))]
716pub struct ImageGeneration {
717 #[serde(skip_serializing_if = "Option::is_none")]
719 pub background: Option<ImageGenerationBackground>,
720 #[serde(skip_serializing_if = "Option::is_none")]
722 pub input_image_mask: Option<InputImageMask>,
723 #[serde(skip_serializing_if = "Option::is_none")]
725 pub model: Option<String>,
726 #[serde(skip_serializing_if = "Option::is_none")]
728 pub moderation: Option<String>,
729 #[serde(skip_serializing_if = "Option::is_none")]
731 pub output_compression: Option<u8>,
732 #[serde(skip_serializing_if = "Option::is_none")]
734 pub output_format: Option<ImageGenerationOutputFormat>,
735 #[serde(skip_serializing_if = "Option::is_none")]
737 pub partial_images: Option<u8>,
738 #[serde(skip_serializing_if = "Option::is_none")]
740 pub quality: Option<ImageGenerationQuality>,
741 #[serde(skip_serializing_if = "Option::is_none")]
743 pub size: Option<ImageGenerationSize>,
744}
745
746#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
747#[serde(rename_all = "lowercase")]
748pub enum ImageGenerationBackground {
749 Transparent,
750 Opaque,
751 Auto,
752}
753
754#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
755#[serde(rename_all = "lowercase")]
756pub enum ImageGenerationOutputFormat {
757 Png,
758 Webp,
759 Jpeg,
760}
761
762#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
763#[serde(rename_all = "lowercase")]
764pub enum ImageGenerationQuality {
765 Low,
766 Medium,
767 High,
768 Auto,
769}
770
771#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
772#[serde(rename_all = "lowercase")]
773pub enum ImageGenerationSize {
774 Auto,
775 #[serde(rename = "1024x1024")]
776 Size1024x1024,
777 #[serde(rename = "1024x1536")]
778 Size1024x1536,
779 #[serde(rename = "1536x1024")]
780 Size1536x1024,
781}
782
783#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
785#[serde(untagged)]
786pub enum ToolChoice {
787 Mode(ToolChoiceMode),
789 Hosted {
791 #[serde(rename = "type")]
793 kind: HostedToolType,
794 },
795 Function {
797 name: String,
799 },
800}
801
802#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
804#[serde(rename_all = "lowercase")]
805pub enum ToolChoiceMode {
806 None,
808 Auto,
810 Required,
812}
813
814#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
816#[serde(rename_all = "snake_case")]
817pub enum HostedToolType {
818 FileSearch,
819 WebSearchPreview,
820 ComputerUsePreview,
821}
822
823#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
825pub struct ErrorObject {
826 pub code: String,
828 pub message: String,
830}
831
832#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
834pub struct IncompleteDetails {
835 pub reason: String,
837}
838
839#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
841pub struct OutputText {
842 pub annotations: Vec<Annotation>,
844 pub text: String,
846}
847
848#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
849#[serde(tag = "type", rename_all = "snake_case")]
850pub enum Annotation {
851 FileCitation(FileCitation),
853 UrlCitation(UrlCitation),
855 FilePath(FilePath),
857}
858
859#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
860pub struct FileCitation {
861 file_id: String,
863 index: u32,
865}
866
867#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
868pub struct UrlCitation {
869 end_index: u32,
871 start_index: u32,
873 title: String,
875 url: String,
877}
878
879#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
880pub struct FilePath {
881 file_id: String,
883 index: u32,
885}
886
887#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
889pub struct Refusal {
890 pub refusal: String,
892}
893
894#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
896pub struct OutputMessage {
897 pub content: Vec<Content>,
899 pub id: String,
901 pub role: Role,
903 pub status: OutputStatus,
905}
906
907#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
908#[serde(tag = "type", rename_all = "snake_case")]
909pub enum Content {
910 OutputText(OutputText),
912 Refusal(Refusal),
914}
915
916#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
918#[serde(tag = "type", rename_all = "snake_case")]
919pub enum OutputContent {
920 Message(OutputMessage),
922 FileSearchCall(FileSearchCallOutput),
924 FunctionCall(FunctionCall),
926 WebSearchCall(WebSearchCallOutput),
928 ComputerCall(ComputerCallOutput),
930 Reasoning(ReasoningItem),
934 ImageGenerationCall(ImageGenerationCallOutput),
936 CodeInterpreterCall(CodeInterpreterCallOutput),
938 LocalShellCall(LocalShellCallOutput),
940 McpCall(McpCallOutput),
942 McpListTools(McpListToolsOutput),
944 McpApprovalRequest(McpApprovalRequestOutput),
946}
947
948#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
950pub struct ReasoningItem {
951 pub id: String,
953 pub summary: Vec<SummaryText>,
955 #[serde(skip_serializing_if = "Option::is_none")]
958 pub encrypted_content: Option<String>,
959 #[serde(skip_serializing_if = "Option::is_none")]
961 pub status: Option<OutputStatus>,
962}
963
964#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
966pub struct SummaryText {
967 pub text: String,
969}
970
971#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
973pub struct FileSearchCallOutput {
974 pub id: String,
976 pub queries: Vec<String>,
978 pub status: FileSearchCallOutputStatus,
980 #[serde(skip_serializing_if = "Option::is_none")]
982 pub results: Option<Vec<FileSearchResult>>,
983}
984
985#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
986#[serde(rename_all = "snake_case")]
987pub enum FileSearchCallOutputStatus {
988 InProgress,
989 Searching,
990 Incomplete,
991 Failed,
992 Completed,
993}
994
995#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
997pub struct FileSearchResult {
998 pub file_id: String,
1000 pub filename: String,
1002 pub score: f32,
1004 pub text: String,
1006 pub attributes: HashMap<String, serde_json::Value>,
1011}
1012
1013#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1014pub struct SafetyCheck {
1015 pub id: String,
1017 pub code: String,
1019 pub message: String,
1021}
1022
1023#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1025pub struct WebSearchCallOutput {
1026 pub id: String,
1028 pub status: String,
1030}
1031
1032#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1034pub struct ComputerCallOutput {
1035 pub action: ComputerCallAction,
1036 pub call_id: String,
1038 pub id: String,
1040 pub pending_safety_checks: Vec<SafetyCheck>,
1042 pub status: OutputStatus,
1044}
1045
1046#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1048pub struct Point {
1049 pub x: i32,
1050 pub y: i32,
1051}
1052
1053#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1055#[serde(tag = "type", rename_all = "snake_case")]
1056pub enum ComputerCallAction {
1057 Click(Click),
1059
1060 DoubleClick(DoubleClick),
1062
1063 Drag(Drag),
1065
1066 KeyPress(KeyPress),
1068
1069 Move(MoveAction),
1071
1072 Screenshot,
1074
1075 Scroll(Scroll),
1077
1078 Type(TypeAction),
1080
1081 Wait,
1083}
1084
1085#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1086#[serde(rename_all = "snake_case")]
1087pub enum ButtonPress {
1088 Left,
1089 Right,
1090 Wheel,
1091 Back,
1092 Forward,
1093}
1094
1095#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1097pub struct Click {
1098 pub button: ButtonPress,
1100 pub x: i32,
1102 pub y: i32,
1104}
1105
1106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1108pub struct DoubleClick {
1109 pub x: i32,
1111 pub y: i32,
1113}
1114
1115#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1117pub struct Drag {
1118 pub path: Vec<Point>,
1120 pub x: i32,
1122 pub y: i32,
1124}
1125
1126#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1128pub struct KeyPress {
1129 pub keys: Vec<String>,
1131}
1132
1133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1135pub struct MoveAction {
1136 pub x: i32,
1138 pub y: i32,
1140}
1141
1142#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1144pub struct Scroll {
1145 pub scroll_x: i32,
1147 pub scroll_y: i32,
1149 pub x: i32,
1151 pub y: i32,
1153}
1154
1155#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1157pub struct TypeAction {
1158 pub text: String,
1160}
1161
1162#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1164pub struct FunctionCall {
1165 pub id: String,
1167 pub call_id: String,
1169 pub name: String,
1171 pub arguments: String,
1173 pub status: OutputStatus,
1175}
1176
1177#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1179pub struct ImageGenerationCallOutput {
1180 pub id: String,
1182 pub result: Option<String>,
1184 pub status: String,
1186}
1187
1188#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1190pub struct CodeInterpreterCallOutput {
1191 #[serde(skip_serializing_if = "Option::is_none")]
1193 pub code: Option<String>,
1194 pub id: String,
1196 pub status: String,
1198 pub container_id: String,
1200 #[serde(skip_serializing_if = "Option::is_none")]
1202 pub outputs: Option<Vec<CodeInterpreterResult>>,
1203}
1204
1205#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1207#[serde(tag = "type", rename_all = "snake_case")]
1208pub enum CodeInterpreterResult {
1209 Logs(CodeInterpreterTextOutput),
1211 Files(CodeInterpreterFileOutput),
1213}
1214
1215#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1217pub struct CodeInterpreterTextOutput {
1218 pub logs: String,
1220}
1221
1222#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1224pub struct CodeInterpreterFileOutput {
1225 pub files: Vec<CodeInterpreterFile>,
1227}
1228
1229#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1230pub struct CodeInterpreterFile {
1231 file_id: String,
1233 mime_type: String,
1235}
1236
1237#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1239pub struct LocalShellCallOutput {
1240 pub action: LocalShellAction,
1242 pub call_id: String,
1244 pub id: String,
1246 pub status: String,
1248}
1249
1250#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1252pub struct LocalShellAction {
1253 pub command: Vec<String>,
1255 pub env: HashMap<String, String>,
1257 pub timeout_ms: Option<u64>,
1259 pub user: Option<String>,
1261 pub working_directory: Option<String>,
1263}
1264
1265#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1267pub struct McpCallOutput {
1268 pub arguments: String,
1270 pub id: String,
1272 pub name: String,
1274 pub server_label: String,
1276 pub error: Option<String>,
1278 pub output: Option<String>,
1280}
1281
1282#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1284pub struct McpListToolsOutput {
1285 pub id: String,
1287 pub server_label: String,
1289 pub tools: Vec<McpToolInfo>,
1291 #[serde(skip_serializing_if = "Option::is_none")]
1293 pub error: Option<String>,
1294}
1295
1296#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1298pub struct McpToolInfo {
1299 pub name: String,
1301 pub input_schema: Value,
1303 #[serde(skip_serializing_if = "Option::is_none")]
1305 pub annotations: Option<Value>,
1306 #[serde(skip_serializing_if = "Option::is_none")]
1308 pub description: Option<String>,
1309}
1310
1311#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1313pub struct McpApprovalRequestOutput {
1314 pub arguments: String,
1316 pub id: String,
1318 pub name: String,
1320 pub server_label: String,
1322}
1323
1324#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1326pub struct Usage {
1327 pub input_tokens: u32,
1329 pub input_tokens_details: PromptTokensDetails,
1331 pub output_tokens: u32,
1333 pub output_tokens_details: CompletionTokensDetails,
1335 pub total_tokens: u32,
1337}
1338
1339#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1341pub struct Response {
1342 pub created_at: u64,
1344
1345 #[serde(skip_serializing_if = "Option::is_none")]
1347 pub error: Option<ErrorObject>,
1348
1349 pub id: String,
1351
1352 #[serde(skip_serializing_if = "Option::is_none")]
1354 pub incomplete_details: Option<IncompleteDetails>,
1355
1356 #[serde(skip_serializing_if = "Option::is_none")]
1358 pub instructions: Option<String>,
1359
1360 #[serde(skip_serializing_if = "Option::is_none")]
1362 pub max_output_tokens: Option<u32>,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub metadata: Option<HashMap<String, String>>,
1367
1368 pub model: String,
1370
1371 pub object: String,
1373
1374 pub output: Vec<OutputContent>,
1376
1377 #[serde(skip_serializing_if = "Option::is_none")]
1381 pub output_text: Option<String>,
1382
1383 #[serde(skip_serializing_if = "Option::is_none")]
1385 pub parallel_tool_calls: Option<bool>,
1386
1387 #[serde(skip_serializing_if = "Option::is_none")]
1389 pub previous_response_id: Option<String>,
1390
1391 #[serde(skip_serializing_if = "Option::is_none")]
1393 pub reasoning: Option<ReasoningConfig>,
1394
1395 #[serde(skip_serializing_if = "Option::is_none")]
1397 pub store: Option<bool>,
1398
1399 #[serde(skip_serializing_if = "Option::is_none")]
1401 pub service_tier: Option<ServiceTier>,
1402
1403 pub status: Status,
1405
1406 #[serde(skip_serializing_if = "Option::is_none")]
1408 pub temperature: Option<f32>,
1409
1410 #[serde(skip_serializing_if = "Option::is_none")]
1412 pub text: Option<TextConfig>,
1413
1414 #[serde(skip_serializing_if = "Option::is_none")]
1416 pub tool_choice: Option<ToolChoice>,
1417
1418 #[serde(skip_serializing_if = "Option::is_none")]
1420 pub tools: Option<Vec<ToolDefinition>>,
1421
1422 #[serde(skip_serializing_if = "Option::is_none")]
1424 pub top_p: Option<f32>,
1425
1426 #[serde(skip_serializing_if = "Option::is_none")]
1428 pub truncation: Option<Truncation>,
1429
1430 #[serde(skip_serializing_if = "Option::is_none")]
1432 pub usage: Option<Usage>,
1433
1434 #[serde(skip_serializing_if = "Option::is_none")]
1436 pub user: Option<String>,
1437}
1438
1439#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1440#[serde(rename_all = "snake_case")]
1441pub enum Status {
1442 Completed,
1443 Failed,
1444 InProgress,
1445 Incomplete,
1446}
1447
1448#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1450#[serde(tag = "type")]
1451#[non_exhaustive] pub enum ResponseEvent {
1453 #[serde(rename = "response.created")]
1455 ResponseCreated(ResponseCreated),
1456 #[serde(rename = "response.in_progress")]
1458 ResponseInProgress(ResponseInProgress),
1459 #[serde(rename = "response.completed")]
1461 ResponseCompleted(ResponseCompleted),
1462 #[serde(rename = "response.failed")]
1464 ResponseFailed(ResponseFailed),
1465 #[serde(rename = "response.incomplete")]
1467 ResponseIncomplete(ResponseIncomplete),
1468 #[serde(rename = "response.queued")]
1470 ResponseQueued(ResponseQueued),
1471 #[serde(rename = "response.output_item.added")]
1473 ResponseOutputItemAdded(ResponseOutputItemAdded),
1474 #[serde(rename = "response.content_part.added")]
1476 ResponseContentPartAdded(ResponseContentPartAdded),
1477 #[serde(rename = "response.output_text.delta")]
1479 ResponseOutputTextDelta(ResponseOutputTextDelta),
1480 #[serde(rename = "response.output_text.done")]
1482 ResponseOutputTextDone(ResponseOutputTextDone),
1483 #[serde(rename = "response.refusal.delta")]
1485 ResponseRefusalDelta(ResponseRefusalDelta),
1486 #[serde(rename = "response.refusal.done")]
1488 ResponseRefusalDone(ResponseRefusalDone),
1489 #[serde(rename = "response.content_part.done")]
1491 ResponseContentPartDone(ResponseContentPartDone),
1492 #[serde(rename = "response.output_item.done")]
1494 ResponseOutputItemDone(ResponseOutputItemDone),
1495 #[serde(rename = "response.function_call_arguments.delta")]
1497 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1498 #[serde(rename = "response.function_call_arguments.done")]
1500 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1501 #[serde(rename = "response.file_search_call.in_progress")]
1503 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1504 #[serde(rename = "response.file_search_call.searching")]
1506 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1507 #[serde(rename = "response.file_search_call.completed")]
1509 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1510 #[serde(rename = "response.web_search_call.in_progress")]
1512 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1513 #[serde(rename = "response.web_search_call.searching")]
1515 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1516 #[serde(rename = "response.web_search_call.completed")]
1518 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1519 #[serde(rename = "response.reasoning_summary_part.added")]
1521 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1522 #[serde(rename = "response.reasoning_summary_part.done")]
1524 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1525 #[serde(rename = "response.reasoning_summary_text.delta")]
1527 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1528 #[serde(rename = "response.reasoning_summary_text.done")]
1530 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1531 #[serde(rename = "response.reasoning_summary.delta")]
1533 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1534 #[serde(rename = "response.reasoning_summary.done")]
1536 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1537 #[serde(rename = "response.image_generation_call.in_progress")]
1539 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1540 #[serde(rename = "response.image_generation_call.generating")]
1542 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1543 #[serde(rename = "response.image_generation_call.partial_image")]
1545 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1546 #[serde(rename = "response.image_generation_call.completed")]
1548 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1549 #[serde(rename = "response.mcp_call_arguments.delta")]
1551 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1552 #[serde(rename = "response.mcp_call_arguments.done")]
1554 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1555 #[serde(rename = "response.mcp_call.completed")]
1557 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1558 #[serde(rename = "response.mcp_call.failed")]
1560 ResponseMcpCallFailed(ResponseMcpCallFailed),
1561 #[serde(rename = "response.mcp_call.in_progress")]
1563 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1564 #[serde(rename = "response.mcp_list_tools.completed")]
1566 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1567 #[serde(rename = "response.mcp_list_tools.failed")]
1569 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1570 #[serde(rename = "response.mcp_list_tools.in_progress")]
1572 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1573 #[serde(rename = "response.code_interpreter_call.in_progress")]
1575 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1576 #[serde(rename = "response.code_interpreter_call.interpreting")]
1578 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1579 #[serde(rename = "response.code_interpreter_call.completed")]
1581 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1582 #[serde(rename = "response.code_interpreter_call_code.delta")]
1584 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1585 #[serde(rename = "response.code_interpreter_call_code.done")]
1587 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1588 #[serde(rename = "response.output_text.annotation.added")]
1590 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1591 #[serde(rename = "error")]
1593 ResponseError(ResponseError),
1594
1595 #[serde(untagged)]
1597 Unknown(serde_json::Value),
1598}
1599
1600pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
1602
1603#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1604#[non_exhaustive]
1605pub struct ResponseCreated {
1606 pub sequence_number: u64,
1607 pub response: ResponseMetadata,
1608}
1609
1610#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1611#[non_exhaustive]
1612pub struct ResponseInProgress {
1613 pub sequence_number: u64,
1614 pub response: ResponseMetadata,
1615}
1616
1617#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1618#[non_exhaustive]
1619pub struct ResponseOutputItemAdded {
1620 pub sequence_number: u64,
1621 pub output_index: u32,
1622 pub item: OutputItem,
1623}
1624
1625#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1626#[non_exhaustive]
1627pub struct ResponseContentPartAdded {
1628 pub sequence_number: u64,
1629 pub item_id: String,
1630 pub output_index: u32,
1631 pub content_index: u32,
1632 pub part: ContentPart,
1633}
1634
1635#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1636#[non_exhaustive]
1637pub struct ResponseOutputTextDelta {
1638 pub sequence_number: u64,
1639 pub item_id: String,
1640 pub output_index: u32,
1641 pub content_index: u32,
1642 pub delta: String,
1643 #[serde(default, skip_serializing_if = "Option::is_none")]
1644 pub logprobs: Option<serde_json::Value>,
1645}
1646
1647#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1648#[non_exhaustive]
1649pub struct ResponseContentPartDone {
1650 pub sequence_number: u64,
1651 pub item_id: String,
1652 pub output_index: u32,
1653 pub content_index: u32,
1654 pub part: ContentPart,
1655}
1656
1657#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1658#[non_exhaustive]
1659pub struct ResponseOutputItemDone {
1660 pub sequence_number: u64,
1661 pub output_index: u32,
1662 pub item: OutputItem,
1663}
1664
1665#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1667#[non_exhaustive]
1668pub struct ResponseCompleted {
1669 pub sequence_number: u64,
1670 pub response: ResponseMetadata,
1671}
1672
1673#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1675#[non_exhaustive]
1676pub struct ResponseFailed {
1677 pub sequence_number: u64,
1678 pub response: ResponseMetadata,
1679}
1680
1681#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1683#[non_exhaustive]
1684pub struct ResponseIncomplete {
1685 pub sequence_number: u64,
1686 pub response: ResponseMetadata,
1687}
1688
1689#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1691#[non_exhaustive]
1692pub struct ResponseQueued {
1693 pub sequence_number: u64,
1694 pub response: ResponseMetadata,
1695}
1696
1697#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1699#[non_exhaustive]
1700pub struct ResponseOutputTextDone {
1701 pub sequence_number: u64,
1702 pub item_id: String,
1703 pub output_index: u32,
1704 pub content_index: u32,
1705 pub text: String,
1706 pub logprobs: Option<Vec<serde_json::Value>>,
1707}
1708
1709#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1711#[non_exhaustive]
1712pub struct ResponseRefusalDelta {
1713 pub sequence_number: u64,
1714 pub item_id: String,
1715 pub output_index: u32,
1716 pub content_index: u32,
1717 pub delta: String,
1718}
1719
1720#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1722#[non_exhaustive]
1723pub struct ResponseRefusalDone {
1724 pub sequence_number: u64,
1725 pub item_id: String,
1726 pub output_index: u32,
1727 pub content_index: u32,
1728 pub refusal: String,
1729}
1730
1731#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1733#[non_exhaustive]
1734pub struct ResponseFunctionCallArgumentsDelta {
1735 pub sequence_number: u64,
1736 pub item_id: String,
1737 pub output_index: u32,
1738 pub delta: String,
1739}
1740
1741#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1743#[non_exhaustive]
1744pub struct ResponseFunctionCallArgumentsDone {
1745 pub sequence_number: u64,
1746 pub item_id: String,
1747 pub output_index: u32,
1748 pub arguments: String,
1749}
1750
1751#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1753#[non_exhaustive]
1754pub struct ResponseError {
1755 pub sequence_number: u64,
1756 pub code: Option<String>,
1757 pub message: String,
1758 pub param: Option<String>,
1759}
1760
1761#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1763#[non_exhaustive]
1764pub struct ResponseFileSearchCallInProgress {
1765 pub sequence_number: u64,
1766 pub output_index: u32,
1767 pub item_id: String,
1768}
1769
1770#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1772#[non_exhaustive]
1773pub struct ResponseFileSearchCallSearching {
1774 pub sequence_number: u64,
1775 pub output_index: u32,
1776 pub item_id: String,
1777}
1778
1779#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1781#[non_exhaustive]
1782pub struct ResponseFileSearchCallCompleted {
1783 pub sequence_number: u64,
1784 pub output_index: u32,
1785 pub item_id: String,
1786}
1787
1788#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1790#[non_exhaustive]
1791pub struct ResponseWebSearchCallInProgress {
1792 pub sequence_number: u64,
1793 pub output_index: u32,
1794 pub item_id: String,
1795}
1796
1797#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1799#[non_exhaustive]
1800pub struct ResponseWebSearchCallSearching {
1801 pub sequence_number: u64,
1802 pub output_index: u32,
1803 pub item_id: String,
1804}
1805
1806#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1808#[non_exhaustive]
1809pub struct ResponseWebSearchCallCompleted {
1810 pub sequence_number: u64,
1811 pub output_index: u32,
1812 pub item_id: String,
1813}
1814
1815#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1817#[non_exhaustive]
1818pub struct ResponseReasoningSummaryPartAdded {
1819 pub sequence_number: u64,
1820 pub item_id: String,
1821 pub output_index: u32,
1822 pub summary_index: u32,
1823 pub part: serde_json::Value, }
1825
1826#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1828#[non_exhaustive]
1829pub struct ResponseReasoningSummaryPartDone {
1830 pub sequence_number: u64,
1831 pub item_id: String,
1832 pub output_index: u32,
1833 pub summary_index: u32,
1834 pub part: serde_json::Value,
1835}
1836
1837#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1839#[non_exhaustive]
1840pub struct ResponseReasoningSummaryTextDelta {
1841 pub sequence_number: u64,
1842 pub item_id: String,
1843 pub output_index: u32,
1844 pub summary_index: u32,
1845 pub delta: String,
1846}
1847
1848#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1850#[non_exhaustive]
1851pub struct ResponseReasoningSummaryTextDone {
1852 pub sequence_number: u64,
1853 pub item_id: String,
1854 pub output_index: u32,
1855 pub summary_index: u32,
1856 pub text: String,
1857}
1858
1859#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1861#[non_exhaustive]
1862pub struct ResponseReasoningSummaryDelta {
1863 pub sequence_number: u64,
1864 pub item_id: String,
1865 pub output_index: u32,
1866 pub summary_index: u32,
1867 pub delta: serde_json::Value,
1868}
1869
1870#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1872#[non_exhaustive]
1873pub struct ResponseReasoningSummaryDone {
1874 pub sequence_number: u64,
1875 pub item_id: String,
1876 pub output_index: u32,
1877 pub summary_index: u32,
1878 pub text: String,
1879}
1880
1881#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1883#[non_exhaustive]
1884pub struct ResponseImageGenerationCallInProgress {
1885 pub sequence_number: u64,
1886 pub output_index: u32,
1887 pub item_id: String,
1888}
1889
1890#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1892#[non_exhaustive]
1893pub struct ResponseImageGenerationCallGenerating {
1894 pub sequence_number: u64,
1895 pub output_index: u32,
1896 pub item_id: String,
1897}
1898
1899#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1901#[non_exhaustive]
1902pub struct ResponseImageGenerationCallPartialImage {
1903 pub sequence_number: u64,
1904 pub output_index: u32,
1905 pub item_id: String,
1906 pub partial_image_index: u32,
1907 pub partial_image_b64: String,
1908}
1909
1910#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1912#[non_exhaustive]
1913pub struct ResponseImageGenerationCallCompleted {
1914 pub sequence_number: u64,
1915 pub output_index: u32,
1916 pub item_id: String,
1917}
1918
1919#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1921#[non_exhaustive]
1922pub struct ResponseMcpCallArgumentsDelta {
1923 pub sequence_number: u64,
1924 pub output_index: u32,
1925 pub item_id: String,
1926 pub delta: String,
1927}
1928
1929#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1931#[non_exhaustive]
1932pub struct ResponseMcpCallArgumentsDone {
1933 pub sequence_number: u64,
1934 pub output_index: u32,
1935 pub item_id: String,
1936 pub arguments: String,
1937}
1938
1939#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1941#[non_exhaustive]
1942pub struct ResponseMcpCallCompleted {
1943 pub sequence_number: u64,
1944 pub output_index: u32,
1945 pub item_id: String,
1946}
1947
1948#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1950#[non_exhaustive]
1951pub struct ResponseMcpCallFailed {
1952 pub sequence_number: u64,
1953 pub output_index: u32,
1954 pub item_id: String,
1955}
1956
1957#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1959#[non_exhaustive]
1960pub struct ResponseMcpCallInProgress {
1961 pub sequence_number: u64,
1962 pub output_index: u32,
1963 pub item_id: String,
1964}
1965
1966#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1968#[non_exhaustive]
1969pub struct ResponseMcpListToolsCompleted {
1970 pub sequence_number: u64,
1971 pub output_index: u32,
1972 pub item_id: String,
1973}
1974
1975#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1977#[non_exhaustive]
1978pub struct ResponseMcpListToolsFailed {
1979 pub sequence_number: u64,
1980 pub output_index: u32,
1981 pub item_id: String,
1982}
1983
1984#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1986#[non_exhaustive]
1987pub struct ResponseMcpListToolsInProgress {
1988 pub sequence_number: u64,
1989 pub output_index: u32,
1990 pub item_id: String,
1991}
1992
1993#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1995#[non_exhaustive]
1996pub struct ResponseCodeInterpreterCallInProgress {
1997 pub sequence_number: u64,
1998 pub output_index: u32,
1999 pub item_id: String,
2000}
2001
2002#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2004#[non_exhaustive]
2005pub struct ResponseCodeInterpreterCallInterpreting {
2006 pub sequence_number: u64,
2007 pub output_index: u32,
2008 pub item_id: String,
2009}
2010
2011#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2013#[non_exhaustive]
2014pub struct ResponseCodeInterpreterCallCompleted {
2015 pub sequence_number: u64,
2016 pub output_index: u32,
2017 pub item_id: String,
2018}
2019
2020#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2022#[non_exhaustive]
2023pub struct ResponseCodeInterpreterCallCodeDelta {
2024 pub sequence_number: u64,
2025 pub output_index: u32,
2026 pub item_id: String,
2027 pub delta: String,
2028}
2029
2030#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2032#[non_exhaustive]
2033pub struct ResponseCodeInterpreterCallCodeDone {
2034 pub sequence_number: u64,
2035 pub output_index: u32,
2036 pub item_id: String,
2037 pub code: String,
2038}
2039
2040#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2042#[non_exhaustive]
2043pub struct ResponseMetadata {
2044 pub id: String,
2045 #[serde(skip_serializing_if = "Option::is_none")]
2046 pub object: Option<String>,
2047 pub created_at: u64,
2048 pub status: Status,
2049 #[serde(skip_serializing_if = "Option::is_none")]
2050 pub model: Option<String>,
2051 #[serde(skip_serializing_if = "Option::is_none")]
2052 pub usage: Option<Usage>,
2053 #[serde(skip_serializing_if = "Option::is_none")]
2054 pub error: Option<ErrorObject>,
2055 #[serde(skip_serializing_if = "Option::is_none")]
2056 pub incomplete_details: Option<IncompleteDetails>,
2057 #[serde(skip_serializing_if = "Option::is_none")]
2058 pub input: Option<Input>,
2059 #[serde(skip_serializing_if = "Option::is_none")]
2060 pub instructions: Option<String>,
2061 #[serde(skip_serializing_if = "Option::is_none")]
2062 pub max_output_tokens: Option<u32>,
2063 #[serde(skip_serializing_if = "Option::is_none")]
2065 pub background: Option<bool>,
2066 #[serde(skip_serializing_if = "Option::is_none")]
2068 pub service_tier: Option<ServiceTier>,
2069 #[serde(skip_serializing_if = "Option::is_none")]
2071 pub top_logprobs: Option<u32>,
2072 #[serde(skip_serializing_if = "Option::is_none")]
2074 pub max_tool_calls: Option<u32>,
2075 #[serde(skip_serializing_if = "Option::is_none")]
2076 pub output: Option<Vec<OutputItem>>,
2077 #[serde(skip_serializing_if = "Option::is_none")]
2078 pub parallel_tool_calls: Option<bool>,
2079 #[serde(skip_serializing_if = "Option::is_none")]
2080 pub previous_response_id: Option<String>,
2081 #[serde(skip_serializing_if = "Option::is_none")]
2082 pub reasoning: Option<ReasoningConfig>,
2083 #[serde(skip_serializing_if = "Option::is_none")]
2084 pub store: Option<bool>,
2085 #[serde(skip_serializing_if = "Option::is_none")]
2086 pub temperature: Option<f32>,
2087 #[serde(skip_serializing_if = "Option::is_none")]
2088 pub text: Option<TextConfig>,
2089 #[serde(skip_serializing_if = "Option::is_none")]
2090 pub tool_choice: Option<ToolChoice>,
2091 #[serde(skip_serializing_if = "Option::is_none")]
2092 pub tools: Option<Vec<ToolDefinition>>,
2093 #[serde(skip_serializing_if = "Option::is_none")]
2094 pub top_p: Option<f32>,
2095 #[serde(skip_serializing_if = "Option::is_none")]
2096 pub truncation: Option<Truncation>,
2097 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub user: Option<String>,
2099 #[serde(skip_serializing_if = "Option::is_none")]
2100 pub metadata: Option<HashMap<String, String>>,
2101 #[serde(skip_serializing_if = "Option::is_none")]
2103 pub prompt_cache_key: Option<String>,
2104 #[serde(skip_serializing_if = "Option::is_none")]
2106 pub safety_identifier: Option<String>,
2107}
2108
2109#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2111#[serde(tag = "type")]
2112#[serde(rename_all = "snake_case")]
2113#[non_exhaustive]
2114pub enum OutputItem {
2115 Message(OutputMessage),
2116 FileSearchCall(FileSearchCallOutput),
2117 FunctionCall(FunctionCall),
2118 WebSearchCall(WebSearchCallOutput),
2119 ComputerCall(ComputerCallOutput),
2120 Reasoning(ReasoningItem),
2121 ImageGenerationCall(ImageGenerationCallOutput),
2122 CodeInterpreterCall(CodeInterpreterCallOutput),
2123 LocalShellCall(LocalShellCallOutput),
2124 McpCall(McpCallOutput),
2125 McpListTools(McpListToolsOutput),
2126 McpApprovalRequest(McpApprovalRequestOutput),
2127 CustomToolCall(CustomToolCallOutput),
2128}
2129
2130#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2131#[non_exhaustive]
2132pub struct CustomToolCallOutput {
2133 pub call_id: String,
2134 pub input: String,
2135 pub name: String,
2136 pub id: String,
2137}
2138
2139#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2141#[non_exhaustive]
2142pub struct ContentPart {
2143 #[serde(rename = "type")]
2144 pub part_type: String,
2145 pub text: Option<String>,
2146 #[serde(default, skip_serializing_if = "Option::is_none")]
2147 pub annotations: Option<Vec<serde_json::Value>>,
2148 #[serde(default, skip_serializing_if = "Option::is_none")]
2149 pub logprobs: Option<Vec<serde_json::Value>>,
2150}
2151
2152#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2158#[non_exhaustive]
2159pub struct ResponseOutputTextAnnotationAdded {
2160 pub sequence_number: u64,
2161 pub item_id: String,
2162 pub output_index: u32,
2163 pub content_index: u32,
2164 pub annotation_index: u32,
2165 pub annotation: TextAnnotation,
2166}
2167
2168#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2170#[non_exhaustive]
2171pub struct TextAnnotation {
2172 #[serde(rename = "type")]
2173 pub annotation_type: String,
2174 pub text: String,
2175 pub start: u32,
2176 pub end: u32,
2177}