1use crate::OpenAIEventStream;
2use crate::error::OpenAIError;
3pub use crate::types::{
4 CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
5 ResponseFormatJsonSchema,
6};
7use derive_builder::Builder;
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10use std::collections::HashMap;
11
12#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
14#[serde(rename_all = "lowercase")]
15pub enum Role {
16 User,
17 Assistant,
18 System,
19 Developer,
20}
21
22#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
24#[serde(rename_all = "snake_case")]
25pub enum OutputStatus {
26 InProgress,
27 Completed,
28 Incomplete,
29}
30
31#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
33#[serde(untagged)]
34pub enum Input {
35 Text(String),
37 Items(Vec<InputItem>),
39}
40
41#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
43#[serde(untagged, rename_all = "snake_case")]
44pub enum InputItem {
45 Message(InputMessage),
46 Custom(serde_json::Value),
47}
48
49#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
51#[builder(
52 name = "InputMessageArgs",
53 pattern = "mutable",
54 setter(into, strip_option),
55 default
56)]
57#[builder(build_fn(error = "OpenAIError"))]
58pub struct InputMessage {
59 #[serde(default, rename = "type")]
60 pub kind: InputMessageType,
61 pub role: Role,
63 pub content: InputContent,
66}
67
68#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
69#[serde(rename_all = "snake_case")]
70pub enum InputMessageType {
71 #[default]
72 Message,
73}
74
75#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
76#[serde(untagged)]
77pub enum InputContent {
78 TextInput(String),
80 InputItemContentList(Vec<ContentType>),
82}
83
84#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
86#[serde(tag = "type", rename_all = "snake_case")]
87pub enum ContentType {
88 InputText(InputText),
90 InputImage(InputImage),
92 InputFile(InputFile),
94}
95
96#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
97pub struct InputText {
98 pub text: String,
99}
100
101#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
102#[builder(
103 name = "InputImageArgs",
104 pattern = "mutable",
105 setter(into, strip_option),
106 default
107)]
108#[builder(build_fn(error = "OpenAIError"))]
109pub struct InputImage {
110 detail: ImageDetail,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 file_id: Option<String>,
115 #[serde(skip_serializing_if = "Option::is_none")]
118 image_url: Option<String>,
119}
120
121#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
122#[builder(
123 name = "InputFileArgs",
124 pattern = "mutable",
125 setter(into, strip_option),
126 default
127)]
128#[builder(build_fn(error = "OpenAIError"))]
129pub struct InputFile {
130 #[serde(skip_serializing_if = "Option::is_none")]
132 file_data: Option<String>,
133 #[serde(skip_serializing_if = "Option::is_none")]
135 file_id: Option<String>,
136 #[serde(skip_serializing_if = "Option::is_none")]
138 filename: Option<String>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 file_url: Option<String>,
142}
143
144#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
146#[builder(
147 name = "CreateResponseArgs",
148 pattern = "mutable",
149 setter(into, strip_option),
150 default
151)]
152#[builder(build_fn(error = "OpenAIError"))]
153pub struct CreateResponse {
154 pub input: Input,
156
157 pub model: String,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
165 pub background: Option<bool>,
166
167 #[serde(skip_serializing_if = "Option::is_none")]
185 pub include: Option<Vec<String>>,
186
187 #[serde(skip_serializing_if = "Option::is_none")]
193 pub instructions: Option<String>,
194
195 #[serde(skip_serializing_if = "Option::is_none")]
198 pub max_output_tokens: Option<u32>,
199
200 pub max_tool_calls: Option<u32>,
204
205 #[serde(skip_serializing_if = "Option::is_none")]
212 pub metadata: Option<HashMap<String, String>>,
213
214 #[serde(skip_serializing_if = "Option::is_none")]
216 pub parallel_tool_calls: Option<bool>,
217
218 #[serde(skip_serializing_if = "Option::is_none")]
221 pub previous_response_id: Option<String>,
222
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub prompt: Option<PromptConfig>,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub reasoning: Option<ReasoningConfig>,
230
231 #[serde(skip_serializing_if = "Option::is_none")]
251 pub service_tier: Option<ServiceTier>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub store: Option<bool>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
260 pub stream: Option<bool>,
261
262 #[serde(skip_serializing_if = "Option::is_none")]
267 pub temperature: Option<f32>,
268
269 #[serde(skip_serializing_if = "Option::is_none")]
272 pub text: Option<TextConfig>,
273
274 #[serde(skip_serializing_if = "Option::is_none")]
277 pub tool_choice: Option<ToolChoice>,
278
279 #[serde(skip_serializing_if = "Option::is_none")]
283 pub tools: Option<Vec<ToolDefinition>>,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
288 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
296 pub top_p: Option<f32>,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
302 pub truncation: Option<Truncation>,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
307 pub user: Option<String>,
308}
309
310#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
312pub struct PromptConfig {
313 pub id: String,
315
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub version: Option<String>,
319
320 #[serde(skip_serializing_if = "Option::is_none")]
324 pub variables: Option<HashMap<String, String>>,
325}
326
327#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
329#[serde(rename_all = "lowercase")]
330pub enum ServiceTier {
331 Auto,
332 Default,
333 Flex,
334 Scale,
335 Priority,
336}
337
338#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
340#[serde(rename_all = "lowercase")]
341pub enum Truncation {
342 Auto,
343 Disabled,
344}
345
346#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
348#[builder(
349 name = "ReasoningConfigArgs",
350 pattern = "mutable",
351 setter(into, strip_option),
352 default
353)]
354#[builder(build_fn(error = "OpenAIError"))]
355pub struct ReasoningConfig {
356 #[serde(skip_serializing_if = "Option::is_none")]
358 pub effort: Option<ReasoningEffort>,
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub summary: Option<ReasoningSummary>,
362}
363
364#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
366#[serde(rename_all = "lowercase")]
367pub enum Verbosity {
368 Low,
369 Medium,
370 High,
371}
372
373#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
374#[serde(rename_all = "lowercase")]
375pub enum ReasoningSummary {
376 Auto,
377 Concise,
378 Detailed,
379}
380
381#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
383pub struct TextConfig {
384 pub format: TextResponseFormat,
386
387 #[serde(skip_serializing_if = "Option::is_none")]
388 pub verbosity: Option<Verbosity>,
389}
390
391#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
392#[serde(tag = "type", rename_all = "snake_case")]
393pub enum TextResponseFormat {
394 Text,
396 JsonObject,
398 JsonSchema(ResponseFormatJsonSchema),
400}
401
402#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
404#[serde(tag = "type", rename_all = "snake_case")]
405pub enum ToolDefinition {
406 FileSearch(FileSearch),
408 Function(Function),
410 WebSearchPreview(WebSearchPreview),
412 ComputerUsePreview(ComputerUsePreview),
414 Mcp(Mcp),
416 CodeInterpreter(CodeInterpreter),
418 ImageGeneration(ImageGeneration),
420 LocalShell,
422}
423
424#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
425#[builder(
426 name = "FileSearchArgs",
427 pattern = "mutable",
428 setter(into, strip_option),
429 default
430)]
431#[builder(build_fn(error = "OpenAIError"))]
432pub struct FileSearch {
433 pub vector_store_ids: Vec<String>,
435 #[serde(skip_serializing_if = "Option::is_none")]
437 pub max_num_results: Option<u32>,
438 #[serde(skip_serializing_if = "Option::is_none")]
440 pub filters: Option<Filter>,
441 #[serde(skip_serializing_if = "Option::is_none")]
443 pub ranking_options: Option<RankingOptions>,
444}
445
446#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
447#[builder(
448 name = "FunctionArgs",
449 pattern = "mutable",
450 setter(into, strip_option),
451 default
452)]
453pub struct Function {
454 pub name: String,
456 pub parameters: serde_json::Value,
458 pub strict: bool,
460 #[serde(skip_serializing_if = "Option::is_none")]
463 pub description: Option<String>,
464}
465
466#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
467#[builder(
468 name = "WebSearchPreviewArgs",
469 pattern = "mutable",
470 setter(into, strip_option),
471 default
472)]
473pub struct WebSearchPreview {
474 #[serde(skip_serializing_if = "Option::is_none")]
476 pub user_location: Option<Location>,
477 #[serde(skip_serializing_if = "Option::is_none")]
479 pub search_context_size: Option<WebSearchContextSize>,
480}
481
482#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
483#[serde(rename_all = "lowercase")]
484pub enum WebSearchContextSize {
485 Low,
486 Medium,
487 High,
488}
489
490#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
491#[builder(
492 name = "ComputerUsePreviewArgs",
493 pattern = "mutable",
494 setter(into, strip_option),
495 default
496)]
497pub struct ComputerUsePreview {
498 environment: String,
500 display_width: u32,
502 display_height: u32,
504}
505
506#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
508pub struct RankingOptions {
509 pub ranker: String,
511 #[serde(skip_serializing_if = "Option::is_none")]
514 pub score_threshold: Option<f32>,
515}
516
517#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
519#[serde(untagged)]
520pub enum Filter {
521 Comparison(ComparisonFilter),
524 Compound(CompoundFilter),
526}
527
528#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
530pub struct ComparisonFilter {
531 #[serde(rename = "type")]
533 pub op: ComparisonType,
534 pub key: String,
536 pub value: serde_json::Value,
538}
539
540#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
541pub enum ComparisonType {
542 #[serde(rename = "eq")]
543 Equals,
544 #[serde(rename = "ne")]
545 NotEquals,
546 #[serde(rename = "gt")]
547 GreaterThan,
548 #[serde(rename = "gte")]
549 GreaterThanOrEqualTo,
550 #[serde(rename = "lt")]
551 LessThan,
552 #[serde(rename = "lte")]
553 LessThanOrEqualTo,
554}
555
556#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
558pub struct CompoundFilter {
559 #[serde(rename = "type")]
561 pub op: CompoundType,
562 pub filters: Vec<Filter>,
564}
565
566#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
567#[serde(rename_all = "lowercase")]
568pub enum CompoundType {
569 And,
570 Or,
571}
572
573#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
575#[builder(
576 name = "LocationArgs",
577 pattern = "mutable",
578 setter(into, strip_option),
579 default
580)]
581#[builder(build_fn(error = "OpenAIError"))]
582pub struct Location {
583 #[serde(rename = "type")]
585 pub kind: String,
586 #[serde(skip_serializing_if = "Option::is_none")]
588 pub city: Option<String>,
589 #[serde(skip_serializing_if = "Option::is_none")]
591 pub country: Option<String>,
592 #[serde(skip_serializing_if = "Option::is_none")]
594 pub region: Option<String>,
595 #[serde(skip_serializing_if = "Option::is_none")]
597 pub timezone: Option<String>,
598}
599
600#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
602#[builder(
603 name = "McpArgs",
604 pattern = "mutable",
605 setter(into, strip_option),
606 default
607)]
608#[builder(build_fn(error = "OpenAIError"))]
609pub struct Mcp {
610 pub server_label: String,
612 pub server_url: String,
614 #[serde(skip_serializing_if = "Option::is_none")]
616 pub allowed_tools: Option<AllowedTools>,
617 #[serde(skip_serializing_if = "Option::is_none")]
619 pub headers: Option<Value>,
620 #[serde(skip_serializing_if = "Option::is_none")]
622 pub require_approval: Option<RequireApproval>,
623}
624
625#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
627#[serde(untagged)]
628pub enum AllowedTools {
629 List(Vec<String>),
631 Filter(McpAllowedToolsFilter),
633}
634
635#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
637pub struct McpAllowedToolsFilter {
638 #[serde(skip_serializing_if = "Option::is_none")]
640 pub tool_names: Option<Vec<String>>,
641}
642
643#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
645#[serde(untagged)]
646pub enum RequireApproval {
647 Policy(RequireApprovalPolicy),
649 Filter(McpApprovalFilter),
651}
652
653#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
654#[serde(rename_all = "lowercase")]
655pub enum RequireApprovalPolicy {
656 Always,
657 Never,
658}
659
660#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
662pub struct McpApprovalFilter {
663 #[serde(skip_serializing_if = "Option::is_none")]
665 pub always: Option<McpAllowedToolsFilter>,
666 #[serde(skip_serializing_if = "Option::is_none")]
668 pub never: Option<McpAllowedToolsFilter>,
669}
670
671#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
673#[serde(untagged)]
674pub enum CodeInterpreterContainer {
675 Id(String),
677 Container(CodeInterpreterContainerKind),
679}
680
681#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
683#[serde(tag = "type", rename_all = "snake_case")]
684pub enum CodeInterpreterContainerKind {
685 Auto {
686 #[serde(skip_serializing_if = "Option::is_none")]
688 file_ids: Option<Vec<String>>,
689 },
690}
691
692#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
694#[builder(
695 name = "CodeInterpreterArgs",
696 pattern = "mutable",
697 setter(into, strip_option),
698 default
699)]
700#[builder(build_fn(error = "OpenAIError"))]
701pub struct CodeInterpreter {
702 pub container: CodeInterpreterContainer,
704}
705
706#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
708pub struct InputImageMask {
709 #[serde(skip_serializing_if = "Option::is_none")]
711 pub image_url: Option<String>,
712 #[serde(skip_serializing_if = "Option::is_none")]
714 pub file_id: Option<String>,
715}
716
717#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
719#[builder(
720 name = "ImageGenerationArgs",
721 pattern = "mutable",
722 setter(into, strip_option),
723 default
724)]
725#[builder(build_fn(error = "OpenAIError"))]
726pub struct ImageGeneration {
727 #[serde(skip_serializing_if = "Option::is_none")]
729 pub background: Option<ImageGenerationBackground>,
730 #[serde(skip_serializing_if = "Option::is_none")]
732 pub input_image_mask: Option<InputImageMask>,
733 #[serde(skip_serializing_if = "Option::is_none")]
735 pub model: Option<String>,
736 #[serde(skip_serializing_if = "Option::is_none")]
738 pub moderation: Option<String>,
739 #[serde(skip_serializing_if = "Option::is_none")]
741 pub output_compression: Option<u8>,
742 #[serde(skip_serializing_if = "Option::is_none")]
744 pub output_format: Option<ImageGenerationOutputFormat>,
745 #[serde(skip_serializing_if = "Option::is_none")]
747 pub partial_images: Option<u8>,
748 #[serde(skip_serializing_if = "Option::is_none")]
750 pub quality: Option<ImageGenerationQuality>,
751 #[serde(skip_serializing_if = "Option::is_none")]
753 pub size: Option<ImageGenerationSize>,
754}
755
756#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
757#[serde(rename_all = "lowercase")]
758pub enum ImageGenerationBackground {
759 Transparent,
760 Opaque,
761 Auto,
762}
763
764#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
765#[serde(rename_all = "lowercase")]
766pub enum ImageGenerationOutputFormat {
767 Png,
768 Webp,
769 Jpeg,
770}
771
772#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
773#[serde(rename_all = "lowercase")]
774pub enum ImageGenerationQuality {
775 Low,
776 Medium,
777 High,
778 Auto,
779}
780
781#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
782#[serde(rename_all = "lowercase")]
783pub enum ImageGenerationSize {
784 Auto,
785 #[serde(rename = "1024x1024")]
786 Size1024x1024,
787 #[serde(rename = "1024x1536")]
788 Size1024x1536,
789 #[serde(rename = "1536x1024")]
790 Size1536x1024,
791}
792
793#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
795#[serde(untagged)]
796pub enum ToolChoice {
797 Mode(ToolChoiceMode),
799 Hosted {
801 #[serde(rename = "type")]
803 kind: HostedToolType,
804 },
805 Function {
807 name: String,
809 },
810}
811
812#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
814#[serde(rename_all = "lowercase")]
815pub enum ToolChoiceMode {
816 None,
818 Auto,
820 Required,
822}
823
824#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
826#[serde(rename_all = "snake_case")]
827pub enum HostedToolType {
828 FileSearch,
829 WebSearchPreview,
830 ComputerUsePreview,
831}
832
833#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
835pub struct ErrorObject {
836 pub code: String,
838 pub message: String,
840}
841
842#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
844pub struct IncompleteDetails {
845 pub reason: String,
847}
848
849#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
851pub struct OutputText {
852 pub annotations: Vec<Annotation>,
854 pub text: String,
856}
857
858#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
859#[serde(tag = "type", rename_all = "snake_case")]
860pub enum Annotation {
861 FileCitation(FileCitation),
863 UrlCitation(UrlCitation),
865 FilePath(FilePath),
867}
868
869#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
870pub struct FileCitation {
871 file_id: String,
873 index: u32,
875}
876
877#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
878pub struct UrlCitation {
879 end_index: u32,
881 start_index: u32,
883 title: String,
885 url: String,
887}
888
889#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
890pub struct FilePath {
891 file_id: String,
893 index: u32,
895}
896
897#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
899pub struct Refusal {
900 pub refusal: String,
902}
903
904#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
906pub struct OutputMessage {
907 pub content: Vec<Content>,
909 pub id: String,
911 pub role: Role,
913 pub status: OutputStatus,
915}
916
917#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
918#[serde(tag = "type", rename_all = "snake_case")]
919pub enum Content {
920 OutputText(OutputText),
922 Refusal(Refusal),
924}
925
926#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
928#[serde(tag = "type", rename_all = "snake_case")]
929pub enum OutputContent {
930 Message(OutputMessage),
932 FileSearchCall(FileSearchCallOutput),
934 FunctionCall(FunctionCall),
936 WebSearchCall(WebSearchCallOutput),
938 ComputerCall(ComputerCallOutput),
940 Reasoning(ReasoningItem),
944 ImageGenerationCall(ImageGenerationCallOutput),
946 CodeInterpreterCall(CodeInterpreterCallOutput),
948 LocalShellCall(LocalShellCallOutput),
950 McpCall(McpCallOutput),
952 McpListTools(McpListToolsOutput),
954 McpApprovalRequest(McpApprovalRequestOutput),
956}
957
958#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
960pub struct ReasoningItem {
961 pub id: String,
963 pub summary: Vec<SummaryText>,
965 #[serde(skip_serializing_if = "Option::is_none")]
968 pub encrypted_content: Option<String>,
969 #[serde(skip_serializing_if = "Option::is_none")]
971 pub status: Option<OutputStatus>,
972}
973
974#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
976pub struct SummaryText {
977 pub text: String,
979}
980
981#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
983pub struct FileSearchCallOutput {
984 pub id: String,
986 pub queries: Vec<String>,
988 pub status: FileSearchCallOutputStatus,
990 #[serde(skip_serializing_if = "Option::is_none")]
992 pub results: Option<Vec<FileSearchResult>>,
993}
994
995#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
996#[serde(rename_all = "snake_case")]
997pub enum FileSearchCallOutputStatus {
998 InProgress,
999 Searching,
1000 Incomplete,
1001 Failed,
1002 Completed,
1003}
1004
1005#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1007pub struct FileSearchResult {
1008 pub file_id: String,
1010 pub filename: String,
1012 pub score: f32,
1014 pub text: String,
1016 pub attributes: HashMap<String, serde_json::Value>,
1021}
1022
1023#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1024pub struct SafetyCheck {
1025 pub id: String,
1027 pub code: String,
1029 pub message: String,
1031}
1032
1033#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1035pub struct WebSearchCallOutput {
1036 pub id: String,
1038 pub status: String,
1040}
1041
1042#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1044pub struct ComputerCallOutput {
1045 pub action: ComputerCallAction,
1046 pub call_id: String,
1048 pub id: String,
1050 pub pending_safety_checks: Vec<SafetyCheck>,
1052 pub status: OutputStatus,
1054}
1055
1056#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1058pub struct Point {
1059 pub x: i32,
1060 pub y: i32,
1061}
1062
1063#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1065#[serde(tag = "type", rename_all = "snake_case")]
1066pub enum ComputerCallAction {
1067 Click(Click),
1069
1070 DoubleClick(DoubleClick),
1072
1073 Drag(Drag),
1075
1076 KeyPress(KeyPress),
1078
1079 Move(MoveAction),
1081
1082 Screenshot,
1084
1085 Scroll(Scroll),
1087
1088 Type(TypeAction),
1090
1091 Wait,
1093}
1094
1095#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1096#[serde(rename_all = "snake_case")]
1097pub enum ButtonPress {
1098 Left,
1099 Right,
1100 Wheel,
1101 Back,
1102 Forward,
1103}
1104
1105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1107pub struct Click {
1108 pub button: ButtonPress,
1110 pub x: i32,
1112 pub y: i32,
1114}
1115
1116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1118pub struct DoubleClick {
1119 pub x: i32,
1121 pub y: i32,
1123}
1124
1125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1127pub struct Drag {
1128 pub path: Vec<Point>,
1130 pub x: i32,
1132 pub y: i32,
1134}
1135
1136#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1138pub struct KeyPress {
1139 pub keys: Vec<String>,
1141}
1142
1143#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1145pub struct MoveAction {
1146 pub x: i32,
1148 pub y: i32,
1150}
1151
1152#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1154pub struct Scroll {
1155 pub scroll_x: i32,
1157 pub scroll_y: i32,
1159 pub x: i32,
1161 pub y: i32,
1163}
1164
1165#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1167pub struct TypeAction {
1168 pub text: String,
1170}
1171
1172#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1174pub struct FunctionCall {
1175 pub id: String,
1177 pub call_id: String,
1179 pub name: String,
1181 pub arguments: String,
1183 pub status: OutputStatus,
1185}
1186
1187#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1189pub struct ImageGenerationCallOutput {
1190 pub id: String,
1192 pub result: Option<String>,
1194 pub status: String,
1196}
1197
1198#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1200pub struct CodeInterpreterCallOutput {
1201 #[serde(skip_serializing_if = "Option::is_none")]
1203 pub code: Option<String>,
1204 pub id: String,
1206 pub status: String,
1208 pub container_id: String,
1210 #[serde(skip_serializing_if = "Option::is_none")]
1212 pub outputs: Option<Vec<CodeInterpreterResult>>,
1213}
1214
1215#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1217#[serde(tag = "type", rename_all = "snake_case")]
1218pub enum CodeInterpreterResult {
1219 Logs(CodeInterpreterTextOutput),
1221 Files(CodeInterpreterFileOutput),
1223}
1224
1225#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1227pub struct CodeInterpreterTextOutput {
1228 pub logs: String,
1230}
1231
1232#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1234pub struct CodeInterpreterFileOutput {
1235 pub files: Vec<CodeInterpreterFile>,
1237}
1238
1239#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1240pub struct CodeInterpreterFile {
1241 file_id: String,
1243 mime_type: String,
1245}
1246
1247#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1249pub struct LocalShellCallOutput {
1250 pub action: LocalShellAction,
1252 pub call_id: String,
1254 pub id: String,
1256 pub status: String,
1258}
1259
1260#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1262pub struct LocalShellAction {
1263 pub command: Vec<String>,
1265 pub env: HashMap<String, String>,
1267 pub timeout_ms: Option<u64>,
1269 pub user: Option<String>,
1271 pub working_directory: Option<String>,
1273}
1274
1275#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1277pub struct McpCallOutput {
1278 pub arguments: String,
1280 pub id: String,
1282 pub name: String,
1284 pub server_label: String,
1286 pub error: Option<String>,
1288 pub output: Option<String>,
1290}
1291
1292#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1294pub struct McpListToolsOutput {
1295 pub id: String,
1297 pub server_label: String,
1299 pub tools: Vec<McpToolInfo>,
1301 #[serde(skip_serializing_if = "Option::is_none")]
1303 pub error: Option<String>,
1304}
1305
1306#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1308pub struct McpToolInfo {
1309 pub name: String,
1311 pub input_schema: Value,
1313 #[serde(skip_serializing_if = "Option::is_none")]
1315 pub annotations: Option<Value>,
1316 #[serde(skip_serializing_if = "Option::is_none")]
1318 pub description: Option<String>,
1319}
1320
1321#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1323pub struct McpApprovalRequestOutput {
1324 pub arguments: String,
1326 pub id: String,
1328 pub name: String,
1330 pub server_label: String,
1332}
1333
1334#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1336pub struct Usage {
1337 pub input_tokens: u32,
1339 pub input_tokens_details: PromptTokensDetails,
1341 pub output_tokens: u32,
1343 pub output_tokens_details: CompletionTokensDetails,
1345 pub total_tokens: u32,
1347}
1348
1349#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1351pub struct Response {
1352 pub created_at: u64,
1354
1355 #[serde(skip_serializing_if = "Option::is_none")]
1357 pub error: Option<ErrorObject>,
1358
1359 pub id: String,
1361
1362 #[serde(skip_serializing_if = "Option::is_none")]
1364 pub incomplete_details: Option<IncompleteDetails>,
1365
1366 #[serde(skip_serializing_if = "Option::is_none")]
1368 pub instructions: Option<String>,
1369
1370 #[serde(skip_serializing_if = "Option::is_none")]
1372 pub max_output_tokens: Option<u32>,
1373
1374 #[serde(skip_serializing_if = "Option::is_none")]
1376 pub metadata: Option<HashMap<String, String>>,
1377
1378 pub model: String,
1380
1381 pub object: String,
1383
1384 pub output: Vec<OutputContent>,
1386
1387 #[serde(skip_serializing_if = "Option::is_none")]
1391 pub output_text: Option<String>,
1392
1393 #[serde(skip_serializing_if = "Option::is_none")]
1395 pub parallel_tool_calls: Option<bool>,
1396
1397 #[serde(skip_serializing_if = "Option::is_none")]
1399 pub previous_response_id: Option<String>,
1400
1401 #[serde(skip_serializing_if = "Option::is_none")]
1403 pub reasoning: Option<ReasoningConfig>,
1404
1405 #[serde(skip_serializing_if = "Option::is_none")]
1407 pub store: Option<bool>,
1408
1409 #[serde(skip_serializing_if = "Option::is_none")]
1411 pub service_tier: Option<ServiceTier>,
1412
1413 pub status: Status,
1415
1416 #[serde(skip_serializing_if = "Option::is_none")]
1418 pub temperature: Option<f32>,
1419
1420 #[serde(skip_serializing_if = "Option::is_none")]
1422 pub text: Option<TextConfig>,
1423
1424 #[serde(skip_serializing_if = "Option::is_none")]
1426 pub tool_choice: Option<ToolChoice>,
1427
1428 #[serde(skip_serializing_if = "Option::is_none")]
1430 pub tools: Option<Vec<ToolDefinition>>,
1431
1432 #[serde(skip_serializing_if = "Option::is_none")]
1434 pub top_p: Option<f32>,
1435
1436 #[serde(skip_serializing_if = "Option::is_none")]
1438 pub truncation: Option<Truncation>,
1439
1440 #[serde(skip_serializing_if = "Option::is_none")]
1442 pub usage: Option<Usage>,
1443
1444 #[serde(skip_serializing_if = "Option::is_none")]
1446 pub user: Option<String>,
1447}
1448
1449#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1450#[serde(rename_all = "snake_case")]
1451pub enum Status {
1452 Completed,
1453 Failed,
1454 InProgress,
1455 Incomplete,
1456}
1457
1458#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1460#[serde(tag = "type")]
1461#[non_exhaustive] pub enum ResponseEvent {
1463 #[serde(rename = "response.created")]
1465 ResponseCreated(ResponseCreated),
1466 #[serde(rename = "response.in_progress")]
1468 ResponseInProgress(ResponseInProgress),
1469 #[serde(rename = "response.completed")]
1471 ResponseCompleted(ResponseCompleted),
1472 #[serde(rename = "response.failed")]
1474 ResponseFailed(ResponseFailed),
1475 #[serde(rename = "response.incomplete")]
1477 ResponseIncomplete(ResponseIncomplete),
1478 #[serde(rename = "response.queued")]
1480 ResponseQueued(ResponseQueued),
1481 #[serde(rename = "response.output_item.added")]
1483 ResponseOutputItemAdded(ResponseOutputItemAdded),
1484 #[serde(rename = "response.content_part.added")]
1486 ResponseContentPartAdded(ResponseContentPartAdded),
1487 #[serde(rename = "response.output_text.delta")]
1489 ResponseOutputTextDelta(ResponseOutputTextDelta),
1490 #[serde(rename = "response.output_text.done")]
1492 ResponseOutputTextDone(ResponseOutputTextDone),
1493 #[serde(rename = "response.refusal.delta")]
1495 ResponseRefusalDelta(ResponseRefusalDelta),
1496 #[serde(rename = "response.refusal.done")]
1498 ResponseRefusalDone(ResponseRefusalDone),
1499 #[serde(rename = "response.content_part.done")]
1501 ResponseContentPartDone(ResponseContentPartDone),
1502 #[serde(rename = "response.output_item.done")]
1504 ResponseOutputItemDone(ResponseOutputItemDone),
1505 #[serde(rename = "response.function_call_arguments.delta")]
1507 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1508 #[serde(rename = "response.function_call_arguments.done")]
1510 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1511 #[serde(rename = "response.file_search_call.in_progress")]
1513 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1514 #[serde(rename = "response.file_search_call.searching")]
1516 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1517 #[serde(rename = "response.file_search_call.completed")]
1519 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1520 #[serde(rename = "response.web_search_call.in_progress")]
1522 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1523 #[serde(rename = "response.web_search_call.searching")]
1525 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1526 #[serde(rename = "response.web_search_call.completed")]
1528 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1529 #[serde(rename = "response.reasoning_summary_part.added")]
1531 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1532 #[serde(rename = "response.reasoning_summary_part.done")]
1534 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1535 #[serde(rename = "response.reasoning_summary_text.delta")]
1537 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1538 #[serde(rename = "response.reasoning_summary_text.done")]
1540 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1541 #[serde(rename = "response.reasoning_summary.delta")]
1543 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1544 #[serde(rename = "response.reasoning_summary.done")]
1546 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1547 #[serde(rename = "response.image_generation_call.in_progress")]
1549 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1550 #[serde(rename = "response.image_generation_call.generating")]
1552 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1553 #[serde(rename = "response.image_generation_call.partial_image")]
1555 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1556 #[serde(rename = "response.image_generation_call.completed")]
1558 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1559 #[serde(rename = "response.mcp_call_arguments.delta")]
1561 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1562 #[serde(rename = "response.mcp_call_arguments.done")]
1564 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1565 #[serde(rename = "response.mcp_call.completed")]
1567 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1568 #[serde(rename = "response.mcp_call.failed")]
1570 ResponseMcpCallFailed(ResponseMcpCallFailed),
1571 #[serde(rename = "response.mcp_call.in_progress")]
1573 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1574 #[serde(rename = "response.mcp_list_tools.completed")]
1576 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1577 #[serde(rename = "response.mcp_list_tools.failed")]
1579 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1580 #[serde(rename = "response.mcp_list_tools.in_progress")]
1582 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1583 #[serde(rename = "response.code_interpreter_call.in_progress")]
1585 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1586 #[serde(rename = "response.code_interpreter_call.interpreting")]
1588 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1589 #[serde(rename = "response.code_interpreter_call.completed")]
1591 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1592 #[serde(rename = "response.code_interpreter_call_code.delta")]
1594 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1595 #[serde(rename = "response.code_interpreter_call_code.done")]
1597 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1598 #[serde(rename = "response.output_text.annotation.added")]
1600 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1601 #[serde(rename = "error")]
1603 ResponseError(ResponseError),
1604
1605 #[serde(untagged)]
1607 Unknown(serde_json::Value),
1608}
1609
1610pub type ResponseStream = OpenAIEventStream<ResponseEvent>;
1612
1613#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1614#[non_exhaustive]
1615pub struct ResponseCreated {
1616 pub sequence_number: u64,
1617 pub response: ResponseMetadata,
1618}
1619
1620#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1621#[non_exhaustive]
1622pub struct ResponseInProgress {
1623 pub sequence_number: u64,
1624 pub response: ResponseMetadata,
1625}
1626
1627#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1628#[non_exhaustive]
1629pub struct ResponseOutputItemAdded {
1630 pub sequence_number: u64,
1631 pub output_index: u32,
1632 pub item: OutputItem,
1633}
1634
1635#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1636#[non_exhaustive]
1637pub struct ResponseContentPartAdded {
1638 pub sequence_number: u64,
1639 pub item_id: String,
1640 pub output_index: u32,
1641 pub content_index: u32,
1642 pub part: ContentPart,
1643}
1644
1645#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1646#[non_exhaustive]
1647pub struct ResponseOutputTextDelta {
1648 pub sequence_number: u64,
1649 pub item_id: String,
1650 pub output_index: u32,
1651 pub content_index: u32,
1652 pub delta: String,
1653 #[serde(default, skip_serializing_if = "Option::is_none")]
1654 pub logprobs: Option<serde_json::Value>,
1655}
1656
1657#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1658#[non_exhaustive]
1659pub struct ResponseContentPartDone {
1660 pub sequence_number: u64,
1661 pub item_id: String,
1662 pub output_index: u32,
1663 pub content_index: u32,
1664 pub part: ContentPart,
1665}
1666
1667#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1668#[non_exhaustive]
1669pub struct ResponseOutputItemDone {
1670 pub sequence_number: u64,
1671 pub output_index: u32,
1672 pub item: OutputItem,
1673}
1674
1675#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1677#[non_exhaustive]
1678pub struct ResponseCompleted {
1679 pub sequence_number: u64,
1680 pub response: ResponseMetadata,
1681}
1682
1683#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1685#[non_exhaustive]
1686pub struct ResponseFailed {
1687 pub sequence_number: u64,
1688 pub response: ResponseMetadata,
1689}
1690
1691#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1693#[non_exhaustive]
1694pub struct ResponseIncomplete {
1695 pub sequence_number: u64,
1696 pub response: ResponseMetadata,
1697}
1698
1699#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1701#[non_exhaustive]
1702pub struct ResponseQueued {
1703 pub sequence_number: u64,
1704 pub response: ResponseMetadata,
1705}
1706
1707#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1709#[non_exhaustive]
1710pub struct ResponseOutputTextDone {
1711 pub sequence_number: u64,
1712 pub item_id: String,
1713 pub output_index: u32,
1714 pub content_index: u32,
1715 pub text: String,
1716 pub logprobs: Option<Vec<serde_json::Value>>,
1717}
1718
1719#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1721#[non_exhaustive]
1722pub struct ResponseRefusalDelta {
1723 pub sequence_number: u64,
1724 pub item_id: String,
1725 pub output_index: u32,
1726 pub content_index: u32,
1727 pub delta: String,
1728}
1729
1730#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1732#[non_exhaustive]
1733pub struct ResponseRefusalDone {
1734 pub sequence_number: u64,
1735 pub item_id: String,
1736 pub output_index: u32,
1737 pub content_index: u32,
1738 pub refusal: String,
1739}
1740
1741#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1743#[non_exhaustive]
1744pub struct ResponseFunctionCallArgumentsDelta {
1745 pub sequence_number: u64,
1746 pub item_id: String,
1747 pub output_index: u32,
1748 pub delta: String,
1749}
1750
1751#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1753#[non_exhaustive]
1754pub struct ResponseFunctionCallArgumentsDone {
1755 pub name: String,
1756 pub sequence_number: u64,
1757 pub item_id: String,
1758 pub output_index: u32,
1759 pub arguments: String,
1760}
1761
1762#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1764#[non_exhaustive]
1765pub struct ResponseError {
1766 pub sequence_number: u64,
1767 pub code: Option<String>,
1768 pub message: String,
1769 pub param: Option<String>,
1770}
1771
1772#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1774#[non_exhaustive]
1775pub struct ResponseFileSearchCallInProgress {
1776 pub sequence_number: u64,
1777 pub output_index: u32,
1778 pub item_id: String,
1779}
1780
1781#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1783#[non_exhaustive]
1784pub struct ResponseFileSearchCallSearching {
1785 pub sequence_number: u64,
1786 pub output_index: u32,
1787 pub item_id: String,
1788}
1789
1790#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1792#[non_exhaustive]
1793pub struct ResponseFileSearchCallCompleted {
1794 pub sequence_number: u64,
1795 pub output_index: u32,
1796 pub item_id: String,
1797}
1798
1799#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1801#[non_exhaustive]
1802pub struct ResponseWebSearchCallInProgress {
1803 pub sequence_number: u64,
1804 pub output_index: u32,
1805 pub item_id: String,
1806}
1807
1808#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1810#[non_exhaustive]
1811pub struct ResponseWebSearchCallSearching {
1812 pub sequence_number: u64,
1813 pub output_index: u32,
1814 pub item_id: String,
1815}
1816
1817#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1819#[non_exhaustive]
1820pub struct ResponseWebSearchCallCompleted {
1821 pub sequence_number: u64,
1822 pub output_index: u32,
1823 pub item_id: String,
1824}
1825
1826#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1828#[non_exhaustive]
1829pub struct ResponseReasoningSummaryPartAdded {
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, }
1836
1837#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1839#[non_exhaustive]
1840pub struct ResponseReasoningSummaryPartDone {
1841 pub sequence_number: u64,
1842 pub item_id: String,
1843 pub output_index: u32,
1844 pub summary_index: u32,
1845 pub part: serde_json::Value,
1846}
1847
1848#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1850#[non_exhaustive]
1851pub struct ResponseReasoningSummaryTextDelta {
1852 pub sequence_number: u64,
1853 pub item_id: String,
1854 pub output_index: u32,
1855 pub summary_index: u32,
1856 pub delta: String,
1857}
1858
1859#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1861#[non_exhaustive]
1862pub struct ResponseReasoningSummaryTextDone {
1863 pub sequence_number: u64,
1864 pub item_id: String,
1865 pub output_index: u32,
1866 pub summary_index: u32,
1867 pub text: String,
1868}
1869
1870#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1872#[non_exhaustive]
1873pub struct ResponseReasoningSummaryDelta {
1874 pub sequence_number: u64,
1875 pub item_id: String,
1876 pub output_index: u32,
1877 pub summary_index: u32,
1878 pub delta: serde_json::Value,
1879}
1880
1881#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1883#[non_exhaustive]
1884pub struct ResponseReasoningSummaryDone {
1885 pub sequence_number: u64,
1886 pub item_id: String,
1887 pub output_index: u32,
1888 pub summary_index: u32,
1889 pub text: String,
1890}
1891
1892#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1894#[non_exhaustive]
1895pub struct ResponseImageGenerationCallInProgress {
1896 pub sequence_number: u64,
1897 pub output_index: u32,
1898 pub item_id: String,
1899}
1900
1901#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1903#[non_exhaustive]
1904pub struct ResponseImageGenerationCallGenerating {
1905 pub sequence_number: u64,
1906 pub output_index: u32,
1907 pub item_id: String,
1908}
1909
1910#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1912#[non_exhaustive]
1913pub struct ResponseImageGenerationCallPartialImage {
1914 pub sequence_number: u64,
1915 pub output_index: u32,
1916 pub item_id: String,
1917 pub partial_image_index: u32,
1918 pub partial_image_b64: String,
1919}
1920
1921#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1923#[non_exhaustive]
1924pub struct ResponseImageGenerationCallCompleted {
1925 pub sequence_number: u64,
1926 pub output_index: u32,
1927 pub item_id: String,
1928}
1929
1930#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1932#[non_exhaustive]
1933pub struct ResponseMcpCallArgumentsDelta {
1934 pub sequence_number: u64,
1935 pub output_index: u32,
1936 pub item_id: String,
1937 pub delta: String,
1938}
1939
1940#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1942#[non_exhaustive]
1943pub struct ResponseMcpCallArgumentsDone {
1944 pub sequence_number: u64,
1945 pub output_index: u32,
1946 pub item_id: String,
1947 pub arguments: String,
1948}
1949
1950#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1952#[non_exhaustive]
1953pub struct ResponseMcpCallCompleted {
1954 pub sequence_number: u64,
1955 pub output_index: u32,
1956 pub item_id: String,
1957}
1958
1959#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1961#[non_exhaustive]
1962pub struct ResponseMcpCallFailed {
1963 pub sequence_number: u64,
1964 pub output_index: u32,
1965 pub item_id: String,
1966}
1967
1968#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1970#[non_exhaustive]
1971pub struct ResponseMcpCallInProgress {
1972 pub sequence_number: u64,
1973 pub output_index: u32,
1974 pub item_id: String,
1975}
1976
1977#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1979#[non_exhaustive]
1980pub struct ResponseMcpListToolsCompleted {
1981 pub sequence_number: u64,
1982 pub output_index: u32,
1983 pub item_id: String,
1984}
1985
1986#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1988#[non_exhaustive]
1989pub struct ResponseMcpListToolsFailed {
1990 pub sequence_number: u64,
1991 pub output_index: u32,
1992 pub item_id: String,
1993}
1994
1995#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1997#[non_exhaustive]
1998pub struct ResponseMcpListToolsInProgress {
1999 pub sequence_number: u64,
2000 pub output_index: u32,
2001 pub item_id: String,
2002}
2003
2004#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2006#[non_exhaustive]
2007pub struct ResponseCodeInterpreterCallInProgress {
2008 pub sequence_number: u64,
2009 pub output_index: u32,
2010 pub item_id: String,
2011}
2012
2013#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2015#[non_exhaustive]
2016pub struct ResponseCodeInterpreterCallInterpreting {
2017 pub sequence_number: u64,
2018 pub output_index: u32,
2019 pub item_id: String,
2020}
2021
2022#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2024#[non_exhaustive]
2025pub struct ResponseCodeInterpreterCallCompleted {
2026 pub sequence_number: u64,
2027 pub output_index: u32,
2028 pub item_id: String,
2029}
2030
2031#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2033#[non_exhaustive]
2034pub struct ResponseCodeInterpreterCallCodeDelta {
2035 pub sequence_number: u64,
2036 pub output_index: u32,
2037 pub item_id: String,
2038 pub delta: String,
2039}
2040
2041#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2043#[non_exhaustive]
2044pub struct ResponseCodeInterpreterCallCodeDone {
2045 pub sequence_number: u64,
2046 pub output_index: u32,
2047 pub item_id: String,
2048 pub code: String,
2049}
2050
2051#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2053#[non_exhaustive]
2054pub struct ResponseMetadata {
2055 pub id: String,
2056 #[serde(skip_serializing_if = "Option::is_none")]
2057 pub object: Option<String>,
2058 pub created_at: u64,
2059 pub status: Status,
2060 #[serde(skip_serializing_if = "Option::is_none")]
2061 pub model: Option<String>,
2062 #[serde(skip_serializing_if = "Option::is_none")]
2063 pub usage: Option<Usage>,
2064 #[serde(skip_serializing_if = "Option::is_none")]
2065 pub error: Option<ErrorObject>,
2066 #[serde(skip_serializing_if = "Option::is_none")]
2067 pub incomplete_details: Option<IncompleteDetails>,
2068 #[serde(skip_serializing_if = "Option::is_none")]
2069 pub input: Option<Input>,
2070 #[serde(skip_serializing_if = "Option::is_none")]
2071 pub instructions: Option<String>,
2072 #[serde(skip_serializing_if = "Option::is_none")]
2073 pub max_output_tokens: Option<u32>,
2074 #[serde(skip_serializing_if = "Option::is_none")]
2076 pub background: Option<bool>,
2077 #[serde(skip_serializing_if = "Option::is_none")]
2079 pub service_tier: Option<ServiceTier>,
2080 #[serde(skip_serializing_if = "Option::is_none")]
2082 pub top_logprobs: Option<u32>,
2083 #[serde(skip_serializing_if = "Option::is_none")]
2085 pub max_tool_calls: Option<u32>,
2086 #[serde(skip_serializing_if = "Option::is_none")]
2087 pub output: Option<Vec<OutputItem>>,
2088 #[serde(skip_serializing_if = "Option::is_none")]
2089 pub parallel_tool_calls: Option<bool>,
2090 #[serde(skip_serializing_if = "Option::is_none")]
2091 pub previous_response_id: Option<String>,
2092 #[serde(skip_serializing_if = "Option::is_none")]
2093 pub reasoning: Option<ReasoningConfig>,
2094 #[serde(skip_serializing_if = "Option::is_none")]
2095 pub store: Option<bool>,
2096 #[serde(skip_serializing_if = "Option::is_none")]
2097 pub temperature: Option<f32>,
2098 #[serde(skip_serializing_if = "Option::is_none")]
2099 pub text: Option<TextConfig>,
2100 #[serde(skip_serializing_if = "Option::is_none")]
2101 pub tool_choice: Option<ToolChoice>,
2102 #[serde(skip_serializing_if = "Option::is_none")]
2103 pub tools: Option<Vec<ToolDefinition>>,
2104 #[serde(skip_serializing_if = "Option::is_none")]
2105 pub top_p: Option<f32>,
2106 #[serde(skip_serializing_if = "Option::is_none")]
2107 pub truncation: Option<Truncation>,
2108 #[serde(skip_serializing_if = "Option::is_none")]
2109 pub user: Option<String>,
2110 #[serde(skip_serializing_if = "Option::is_none")]
2111 pub metadata: Option<HashMap<String, String>>,
2112 #[serde(skip_serializing_if = "Option::is_none")]
2114 pub prompt_cache_key: Option<String>,
2115 #[serde(skip_serializing_if = "Option::is_none")]
2117 pub safety_identifier: Option<String>,
2118}
2119
2120#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2122#[serde(tag = "type")]
2123#[serde(rename_all = "snake_case")]
2124#[non_exhaustive]
2125pub enum OutputItem {
2126 Message(OutputMessage),
2127 FileSearchCall(FileSearchCallOutput),
2128 FunctionCall(FunctionCall),
2129 WebSearchCall(WebSearchCallOutput),
2130 ComputerCall(ComputerCallOutput),
2131 Reasoning(ReasoningItem),
2132 ImageGenerationCall(ImageGenerationCallOutput),
2133 CodeInterpreterCall(CodeInterpreterCallOutput),
2134 LocalShellCall(LocalShellCallOutput),
2135 McpCall(McpCallOutput),
2136 McpListTools(McpListToolsOutput),
2137 McpApprovalRequest(McpApprovalRequestOutput),
2138 CustomToolCall(CustomToolCallOutput),
2139}
2140
2141#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2142#[non_exhaustive]
2143pub struct CustomToolCallOutput {
2144 pub call_id: String,
2145 pub input: String,
2146 pub name: String,
2147 pub id: String,
2148}
2149
2150#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2152#[non_exhaustive]
2153pub struct ContentPart {
2154 #[serde(rename = "type")]
2155 pub part_type: String,
2156 pub text: Option<String>,
2157 #[serde(default, skip_serializing_if = "Option::is_none")]
2158 pub annotations: Option<Vec<serde_json::Value>>,
2159 #[serde(default, skip_serializing_if = "Option::is_none")]
2160 pub logprobs: Option<Vec<serde_json::Value>>,
2161}
2162
2163#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2168#[non_exhaustive]
2169pub struct ResponseOutputTextAnnotationAdded {
2170 pub sequence_number: u64,
2171 pub item_id: String,
2172 pub output_index: u32,
2173 pub content_index: u32,
2174 pub annotation_index: u32,
2175 pub annotation: TextAnnotation,
2176}
2177
2178#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2180#[non_exhaustive]
2181pub struct TextAnnotation {
2182 #[serde(rename = "type")]
2183 pub annotation_type: String,
2184 pub text: String,
2185 pub start: u32,
2186 pub end: u32,
2187}