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 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 detail: ImageDetail,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 file_id: Option<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
119 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 file_data: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 file_id: Option<String>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 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
308#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
310pub struct PromptConfig {
311 pub id: String,
313
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub version: Option<String>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
322 pub variables: Option<HashMap<String, String>>,
323}
324
325#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
327#[serde(rename_all = "lowercase")]
328pub enum ServiceTier {
329 Auto,
330 Default,
331 Flex,
332 Scale,
333 Priority,
334}
335
336#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
338#[serde(rename_all = "lowercase")]
339pub enum Truncation {
340 Auto,
341 Disabled,
342}
343
344#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
346#[builder(
347 name = "ReasoningConfigArgs",
348 pattern = "mutable",
349 setter(into, strip_option),
350 default
351)]
352#[builder(build_fn(error = "OpenAIError"))]
353pub struct ReasoningConfig {
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub effort: Option<ReasoningEffort>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub summary: Option<ReasoningSummary>,
360}
361
362#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
364#[serde(rename_all = "lowercase")]
365pub enum Verbosity {
366 Low,
367 Medium,
368 High,
369}
370
371#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
372#[serde(rename_all = "lowercase")]
373pub enum ReasoningSummary {
374 Auto,
375 Concise,
376 Detailed,
377}
378
379#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
381pub struct TextConfig {
382 pub format: TextResponseFormat,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
386 pub verbosity: Option<Verbosity>,
387}
388
389#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
390#[serde(tag = "type", rename_all = "snake_case")]
391pub enum TextResponseFormat {
392 Text,
394 JsonObject,
396 JsonSchema(ResponseFormatJsonSchema),
398}
399
400#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
402#[serde(tag = "type", rename_all = "snake_case")]
403pub enum ToolDefinition {
404 FileSearch(FileSearch),
406 Function(Function),
408 WebSearchPreview(WebSearchPreview),
410 ComputerUsePreview(ComputerUsePreview),
412 Mcp(Mcp),
414 CodeInterpreter(CodeInterpreter),
416 ImageGeneration(ImageGeneration),
418 LocalShell,
420}
421
422#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
423#[builder(
424 name = "FileSearchArgs",
425 pattern = "mutable",
426 setter(into, strip_option),
427 default
428)]
429#[builder(build_fn(error = "OpenAIError"))]
430pub struct FileSearch {
431 pub vector_store_ids: Vec<String>,
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub max_num_results: Option<u32>,
436 #[serde(skip_serializing_if = "Option::is_none")]
438 pub filters: Option<Filter>,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub ranking_options: Option<RankingOptions>,
442}
443
444#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
445#[builder(
446 name = "FunctionArgs",
447 pattern = "mutable",
448 setter(into, strip_option),
449 default
450)]
451pub struct Function {
452 pub name: String,
454 pub parameters: serde_json::Value,
456 pub strict: bool,
458 #[serde(skip_serializing_if = "Option::is_none")]
461 pub description: Option<String>,
462}
463
464#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
465#[builder(
466 name = "WebSearchPreviewArgs",
467 pattern = "mutable",
468 setter(into, strip_option),
469 default
470)]
471pub struct WebSearchPreview {
472 #[serde(skip_serializing_if = "Option::is_none")]
474 pub user_location: Option<Location>,
475 #[serde(skip_serializing_if = "Option::is_none")]
477 pub search_context_size: Option<WebSearchContextSize>,
478}
479
480#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
481#[serde(rename_all = "lowercase")]
482pub enum WebSearchContextSize {
483 Low,
484 Medium,
485 High,
486}
487
488#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
489#[builder(
490 name = "ComputerUsePreviewArgs",
491 pattern = "mutable",
492 setter(into, strip_option),
493 default
494)]
495pub struct ComputerUsePreview {
496 environment: String,
498 display_width: u32,
500 display_height: u32,
502}
503
504#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
506pub struct RankingOptions {
507 pub ranker: String,
509 #[serde(skip_serializing_if = "Option::is_none")]
512 pub score_threshold: Option<f32>,
513}
514
515#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
517#[serde(untagged)]
518pub enum Filter {
519 Comparison(ComparisonFilter),
522 Compound(CompoundFilter),
524}
525
526#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
528pub struct ComparisonFilter {
529 #[serde(rename = "type")]
531 pub op: ComparisonType,
532 pub key: String,
534 pub value: serde_json::Value,
536}
537
538#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
539pub enum ComparisonType {
540 #[serde(rename = "eq")]
541 Equals,
542 #[serde(rename = "ne")]
543 NotEquals,
544 #[serde(rename = "gt")]
545 GreaterThan,
546 #[serde(rename = "gte")]
547 GreaterThanOrEqualTo,
548 #[serde(rename = "lt")]
549 LessThan,
550 #[serde(rename = "lte")]
551 LessThanOrEqualTo,
552}
553
554#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
556pub struct CompoundFilter {
557 #[serde(rename = "type")]
559 pub op: CompoundType,
560 pub filters: Vec<Filter>,
562}
563
564#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
565#[serde(rename_all = "lowercase")]
566pub enum CompoundType {
567 And,
568 Or,
569}
570
571#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
573#[builder(
574 name = "LocationArgs",
575 pattern = "mutable",
576 setter(into, strip_option),
577 default
578)]
579#[builder(build_fn(error = "OpenAIError"))]
580pub struct Location {
581 #[serde(rename = "type")]
583 pub kind: String,
584 #[serde(skip_serializing_if = "Option::is_none")]
586 pub city: Option<String>,
587 #[serde(skip_serializing_if = "Option::is_none")]
589 pub country: Option<String>,
590 #[serde(skip_serializing_if = "Option::is_none")]
592 pub region: Option<String>,
593 #[serde(skip_serializing_if = "Option::is_none")]
595 pub timezone: Option<String>,
596}
597
598#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
600#[builder(
601 name = "McpArgs",
602 pattern = "mutable",
603 setter(into, strip_option),
604 default
605)]
606#[builder(build_fn(error = "OpenAIError"))]
607pub struct Mcp {
608 pub server_label: String,
610 pub server_url: String,
612 #[serde(skip_serializing_if = "Option::is_none")]
614 pub allowed_tools: Option<AllowedTools>,
615 #[serde(skip_serializing_if = "Option::is_none")]
617 pub headers: Option<Value>,
618 #[serde(skip_serializing_if = "Option::is_none")]
620 pub require_approval: Option<RequireApproval>,
621}
622
623#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
625#[serde(untagged)]
626pub enum AllowedTools {
627 List(Vec<String>),
629 Filter(McpAllowedToolsFilter),
631}
632
633#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
635pub struct McpAllowedToolsFilter {
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub tool_names: Option<Vec<String>>,
639}
640
641#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
643#[serde(untagged)]
644pub enum RequireApproval {
645 Policy(RequireApprovalPolicy),
647 Filter(McpApprovalFilter),
649}
650
651#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
652#[serde(rename_all = "lowercase")]
653pub enum RequireApprovalPolicy {
654 Always,
655 Never,
656}
657
658#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
660pub struct McpApprovalFilter {
661 #[serde(skip_serializing_if = "Option::is_none")]
663 pub always: Option<McpAllowedToolsFilter>,
664 #[serde(skip_serializing_if = "Option::is_none")]
666 pub never: Option<McpAllowedToolsFilter>,
667}
668
669#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
671#[serde(untagged)]
672pub enum CodeInterpreterContainer {
673 Id(String),
675 Container(CodeInterpreterContainerKind),
677}
678
679#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
681#[serde(tag = "type", rename_all = "snake_case")]
682pub enum CodeInterpreterContainerKind {
683 Auto {
684 #[serde(skip_serializing_if = "Option::is_none")]
686 file_ids: Option<Vec<String>>,
687 },
688}
689
690#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
692#[builder(
693 name = "CodeInterpreterArgs",
694 pattern = "mutable",
695 setter(into, strip_option),
696 default
697)]
698#[builder(build_fn(error = "OpenAIError"))]
699pub struct CodeInterpreter {
700 pub container: CodeInterpreterContainer,
702}
703
704#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
706pub struct InputImageMask {
707 #[serde(skip_serializing_if = "Option::is_none")]
709 pub image_url: Option<String>,
710 #[serde(skip_serializing_if = "Option::is_none")]
712 pub file_id: Option<String>,
713}
714
715#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
717#[builder(
718 name = "ImageGenerationArgs",
719 pattern = "mutable",
720 setter(into, strip_option),
721 default
722)]
723#[builder(build_fn(error = "OpenAIError"))]
724pub struct ImageGeneration {
725 #[serde(skip_serializing_if = "Option::is_none")]
727 pub background: Option<ImageGenerationBackground>,
728 #[serde(skip_serializing_if = "Option::is_none")]
730 pub input_image_mask: Option<InputImageMask>,
731 #[serde(skip_serializing_if = "Option::is_none")]
733 pub model: Option<String>,
734 #[serde(skip_serializing_if = "Option::is_none")]
736 pub moderation: Option<String>,
737 #[serde(skip_serializing_if = "Option::is_none")]
739 pub output_compression: Option<u8>,
740 #[serde(skip_serializing_if = "Option::is_none")]
742 pub output_format: Option<ImageGenerationOutputFormat>,
743 #[serde(skip_serializing_if = "Option::is_none")]
745 pub partial_images: Option<u8>,
746 #[serde(skip_serializing_if = "Option::is_none")]
748 pub quality: Option<ImageGenerationQuality>,
749 #[serde(skip_serializing_if = "Option::is_none")]
751 pub size: Option<ImageGenerationSize>,
752}
753
754#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
755#[serde(rename_all = "lowercase")]
756pub enum ImageGenerationBackground {
757 Transparent,
758 Opaque,
759 Auto,
760}
761
762#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
763#[serde(rename_all = "lowercase")]
764pub enum ImageGenerationOutputFormat {
765 Png,
766 Webp,
767 Jpeg,
768}
769
770#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
771#[serde(rename_all = "lowercase")]
772pub enum ImageGenerationQuality {
773 Low,
774 Medium,
775 High,
776 Auto,
777}
778
779#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
780#[serde(rename_all = "lowercase")]
781pub enum ImageGenerationSize {
782 Auto,
783 #[serde(rename = "1024x1024")]
784 Size1024x1024,
785 #[serde(rename = "1024x1536")]
786 Size1024x1536,
787 #[serde(rename = "1536x1024")]
788 Size1536x1024,
789}
790
791#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
793#[serde(untagged)]
794pub enum ToolChoice {
795 Mode(ToolChoiceMode),
797 Hosted {
799 #[serde(rename = "type")]
801 kind: HostedToolType,
802 },
803 Function {
805 name: String,
807 },
808}
809
810#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
812#[serde(rename_all = "lowercase")]
813pub enum ToolChoiceMode {
814 None,
816 Auto,
818 Required,
820}
821
822#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
824#[serde(rename_all = "snake_case")]
825pub enum HostedToolType {
826 FileSearch,
827 WebSearchPreview,
828 ComputerUsePreview,
829}
830
831#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
833pub struct ErrorObject {
834 pub code: String,
836 pub message: String,
838}
839
840#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
842pub struct IncompleteDetails {
843 pub reason: String,
845}
846
847#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
849pub struct OutputText {
850 pub annotations: Vec<Annotation>,
852 pub text: String,
854}
855
856#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
857#[serde(tag = "type", rename_all = "snake_case")]
858pub enum Annotation {
859 FileCitation(FileCitation),
861 UrlCitation(UrlCitation),
863 FilePath(FilePath),
865}
866
867#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
868pub struct FileCitation {
869 file_id: String,
871 index: u32,
873}
874
875#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
876pub struct UrlCitation {
877 end_index: u32,
879 start_index: u32,
881 title: String,
883 url: String,
885}
886
887#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
888pub struct FilePath {
889 file_id: String,
891 index: u32,
893}
894
895#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
897pub struct Refusal {
898 pub refusal: String,
900}
901
902#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
904pub struct OutputMessage {
905 pub content: Vec<Content>,
907 pub id: String,
909 pub role: Role,
911 pub status: OutputStatus,
913}
914
915#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
916#[serde(tag = "type", rename_all = "snake_case")]
917pub enum Content {
918 OutputText(OutputText),
920 Refusal(Refusal),
922}
923
924#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
926#[serde(tag = "type", rename_all = "snake_case")]
927pub enum OutputContent {
928 Message(OutputMessage),
930 FileSearchCall(FileSearchCallOutput),
932 FunctionCall(FunctionCall),
934 WebSearchCall(WebSearchCallOutput),
936 ComputerCall(ComputerCallOutput),
938 Reasoning(ReasoningItem),
942 ImageGenerationCall(ImageGenerationCallOutput),
944 CodeInterpreterCall(CodeInterpreterCallOutput),
946 LocalShellCall(LocalShellCallOutput),
948 McpCall(McpCallOutput),
950 McpListTools(McpListToolsOutput),
952 McpApprovalRequest(McpApprovalRequestOutput),
954}
955
956#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
958pub struct ReasoningItem {
959 pub id: String,
961 pub summary: Vec<SummaryText>,
963 #[serde(skip_serializing_if = "Option::is_none")]
966 pub encrypted_content: Option<String>,
967 #[serde(skip_serializing_if = "Option::is_none")]
969 pub status: Option<OutputStatus>,
970}
971
972#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
974pub struct SummaryText {
975 pub text: String,
977}
978
979#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
981pub struct FileSearchCallOutput {
982 pub id: String,
984 pub queries: Vec<String>,
986 pub status: FileSearchCallOutputStatus,
988 #[serde(skip_serializing_if = "Option::is_none")]
990 pub results: Option<Vec<FileSearchResult>>,
991}
992
993#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
994#[serde(rename_all = "snake_case")]
995pub enum FileSearchCallOutputStatus {
996 InProgress,
997 Searching,
998 Incomplete,
999 Failed,
1000 Completed,
1001}
1002
1003#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1005pub struct FileSearchResult {
1006 pub file_id: String,
1008 pub filename: String,
1010 pub score: f32,
1012 pub text: String,
1014 pub attributes: HashMap<String, serde_json::Value>,
1019}
1020
1021#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1022pub struct SafetyCheck {
1023 pub id: String,
1025 pub code: String,
1027 pub message: String,
1029}
1030
1031#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1033pub struct WebSearchCallOutput {
1034 pub id: String,
1036 pub status: String,
1038}
1039
1040#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1042pub struct ComputerCallOutput {
1043 pub action: ComputerCallAction,
1044 pub call_id: String,
1046 pub id: String,
1048 pub pending_safety_checks: Vec<SafetyCheck>,
1050 pub status: OutputStatus,
1052}
1053
1054#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1056pub struct Point {
1057 pub x: i32,
1058 pub y: i32,
1059}
1060
1061#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1063#[serde(tag = "type", rename_all = "snake_case")]
1064pub enum ComputerCallAction {
1065 Click(Click),
1067
1068 DoubleClick(DoubleClick),
1070
1071 Drag(Drag),
1073
1074 KeyPress(KeyPress),
1076
1077 Move(MoveAction),
1079
1080 Screenshot,
1082
1083 Scroll(Scroll),
1085
1086 Type(TypeAction),
1088
1089 Wait,
1091}
1092
1093#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1094#[serde(rename_all = "snake_case")]
1095pub enum ButtonPress {
1096 Left,
1097 Right,
1098 Wheel,
1099 Back,
1100 Forward,
1101}
1102
1103#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1105pub struct Click {
1106 pub button: ButtonPress,
1108 pub x: i32,
1110 pub y: i32,
1112}
1113
1114#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1116pub struct DoubleClick {
1117 pub x: i32,
1119 pub y: i32,
1121}
1122
1123#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1125pub struct Drag {
1126 pub path: Vec<Point>,
1128 pub x: i32,
1130 pub y: i32,
1132}
1133
1134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1136pub struct KeyPress {
1137 pub keys: Vec<String>,
1139}
1140
1141#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1143pub struct MoveAction {
1144 pub x: i32,
1146 pub y: i32,
1148}
1149
1150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1152pub struct Scroll {
1153 pub scroll_x: i32,
1155 pub scroll_y: i32,
1157 pub x: i32,
1159 pub y: i32,
1161}
1162
1163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1165pub struct TypeAction {
1166 pub text: String,
1168}
1169
1170#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1172pub struct FunctionCall {
1173 pub id: String,
1175 pub call_id: String,
1177 pub name: String,
1179 pub arguments: String,
1181 pub status: OutputStatus,
1183}
1184
1185#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1187pub struct ImageGenerationCallOutput {
1188 pub id: String,
1190 pub result: Option<String>,
1192 pub status: String,
1194}
1195
1196#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1198pub struct CodeInterpreterCallOutput {
1199 #[serde(skip_serializing_if = "Option::is_none")]
1201 pub code: Option<String>,
1202 pub id: String,
1204 pub status: String,
1206 pub container_id: String,
1208 #[serde(skip_serializing_if = "Option::is_none")]
1210 pub outputs: Option<Vec<CodeInterpreterResult>>,
1211}
1212
1213#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1215#[serde(tag = "type", rename_all = "snake_case")]
1216pub enum CodeInterpreterResult {
1217 Logs(CodeInterpreterTextOutput),
1219 Files(CodeInterpreterFileOutput),
1221}
1222
1223#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1225pub struct CodeInterpreterTextOutput {
1226 pub logs: String,
1228}
1229
1230#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1232pub struct CodeInterpreterFileOutput {
1233 pub files: Vec<CodeInterpreterFile>,
1235}
1236
1237#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1238pub struct CodeInterpreterFile {
1239 file_id: String,
1241 mime_type: String,
1243}
1244
1245#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1247pub struct LocalShellCallOutput {
1248 pub action: LocalShellAction,
1250 pub call_id: String,
1252 pub id: String,
1254 pub status: String,
1256}
1257
1258#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1260pub struct LocalShellAction {
1261 pub command: Vec<String>,
1263 pub env: HashMap<String, String>,
1265 pub timeout_ms: Option<u64>,
1267 pub user: Option<String>,
1269 pub working_directory: Option<String>,
1271}
1272
1273#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1275pub struct McpCallOutput {
1276 pub arguments: String,
1278 pub id: String,
1280 pub name: String,
1282 pub server_label: String,
1284 pub error: Option<String>,
1286 pub output: Option<String>,
1288}
1289
1290#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1292pub struct McpListToolsOutput {
1293 pub id: String,
1295 pub server_label: String,
1297 pub tools: Vec<McpToolInfo>,
1299 #[serde(skip_serializing_if = "Option::is_none")]
1301 pub error: Option<String>,
1302}
1303
1304#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1306pub struct McpToolInfo {
1307 pub name: String,
1309 pub input_schema: Value,
1311 #[serde(skip_serializing_if = "Option::is_none")]
1313 pub annotations: Option<Value>,
1314 #[serde(skip_serializing_if = "Option::is_none")]
1316 pub description: Option<String>,
1317}
1318
1319#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1321pub struct McpApprovalRequestOutput {
1322 pub arguments: String,
1324 pub id: String,
1326 pub name: String,
1328 pub server_label: String,
1330}
1331
1332#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1334pub struct Usage {
1335 pub input_tokens: u32,
1337 pub input_tokens_details: PromptTokensDetails,
1339 pub output_tokens: u32,
1341 pub output_tokens_details: CompletionTokensDetails,
1343 pub total_tokens: u32,
1345}
1346
1347#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1349pub struct Response {
1350 pub created_at: u64,
1352
1353 #[serde(skip_serializing_if = "Option::is_none")]
1355 pub error: Option<ErrorObject>,
1356
1357 pub id: String,
1359
1360 #[serde(skip_serializing_if = "Option::is_none")]
1362 pub incomplete_details: Option<IncompleteDetails>,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub instructions: Option<String>,
1367
1368 #[serde(skip_serializing_if = "Option::is_none")]
1370 pub max_output_tokens: Option<u32>,
1371
1372 #[serde(skip_serializing_if = "Option::is_none")]
1374 pub metadata: Option<HashMap<String, String>>,
1375
1376 pub model: String,
1378
1379 pub object: String,
1381
1382 pub output: Vec<OutputContent>,
1384
1385 #[serde(skip_serializing_if = "Option::is_none")]
1389 pub output_text: Option<String>,
1390
1391 #[serde(skip_serializing_if = "Option::is_none")]
1393 pub parallel_tool_calls: Option<bool>,
1394
1395 #[serde(skip_serializing_if = "Option::is_none")]
1397 pub previous_response_id: Option<String>,
1398
1399 #[serde(skip_serializing_if = "Option::is_none")]
1401 pub reasoning: Option<ReasoningConfig>,
1402
1403 #[serde(skip_serializing_if = "Option::is_none")]
1405 pub store: Option<bool>,
1406
1407 #[serde(skip_serializing_if = "Option::is_none")]
1409 pub service_tier: Option<ServiceTier>,
1410
1411 pub status: Status,
1413
1414 #[serde(skip_serializing_if = "Option::is_none")]
1416 pub temperature: Option<f32>,
1417
1418 #[serde(skip_serializing_if = "Option::is_none")]
1420 pub text: Option<TextConfig>,
1421
1422 #[serde(skip_serializing_if = "Option::is_none")]
1424 pub tool_choice: Option<ToolChoice>,
1425
1426 #[serde(skip_serializing_if = "Option::is_none")]
1428 pub tools: Option<Vec<ToolDefinition>>,
1429
1430 #[serde(skip_serializing_if = "Option::is_none")]
1432 pub top_p: Option<f32>,
1433
1434 #[serde(skip_serializing_if = "Option::is_none")]
1436 pub truncation: Option<Truncation>,
1437
1438 #[serde(skip_serializing_if = "Option::is_none")]
1440 pub usage: Option<Usage>,
1441
1442 #[serde(skip_serializing_if = "Option::is_none")]
1444 pub user: Option<String>,
1445}
1446
1447#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1448#[serde(rename_all = "snake_case")]
1449pub enum Status {
1450 Completed,
1451 Failed,
1452 InProgress,
1453 Incomplete,
1454}
1455
1456#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1458#[serde(tag = "type")]
1459#[non_exhaustive] pub enum ResponseEvent {
1461 #[serde(rename = "response.created")]
1463 ResponseCreated(ResponseCreated),
1464 #[serde(rename = "response.in_progress")]
1466 ResponseInProgress(ResponseInProgress),
1467 #[serde(rename = "response.completed")]
1469 ResponseCompleted(ResponseCompleted),
1470 #[serde(rename = "response.failed")]
1472 ResponseFailed(ResponseFailed),
1473 #[serde(rename = "response.incomplete")]
1475 ResponseIncomplete(ResponseIncomplete),
1476 #[serde(rename = "response.queued")]
1478 ResponseQueued(ResponseQueued),
1479 #[serde(rename = "response.output_item.added")]
1481 ResponseOutputItemAdded(ResponseOutputItemAdded),
1482 #[serde(rename = "response.content_part.added")]
1484 ResponseContentPartAdded(ResponseContentPartAdded),
1485 #[serde(rename = "response.output_text.delta")]
1487 ResponseOutputTextDelta(ResponseOutputTextDelta),
1488 #[serde(rename = "response.output_text.done")]
1490 ResponseOutputTextDone(ResponseOutputTextDone),
1491 #[serde(rename = "response.refusal.delta")]
1493 ResponseRefusalDelta(ResponseRefusalDelta),
1494 #[serde(rename = "response.refusal.done")]
1496 ResponseRefusalDone(ResponseRefusalDone),
1497 #[serde(rename = "response.content_part.done")]
1499 ResponseContentPartDone(ResponseContentPartDone),
1500 #[serde(rename = "response.output_item.done")]
1502 ResponseOutputItemDone(ResponseOutputItemDone),
1503 #[serde(rename = "response.function_call_arguments.delta")]
1505 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1506 #[serde(rename = "response.function_call_arguments.done")]
1508 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1509 #[serde(rename = "response.file_search_call.in_progress")]
1511 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1512 #[serde(rename = "response.file_search_call.searching")]
1514 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1515 #[serde(rename = "response.file_search_call.completed")]
1517 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1518 #[serde(rename = "response.web_search_call.in_progress")]
1520 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1521 #[serde(rename = "response.web_search_call.searching")]
1523 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1524 #[serde(rename = "response.web_search_call.completed")]
1526 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1527 #[serde(rename = "response.reasoning_summary_part.added")]
1529 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1530 #[serde(rename = "response.reasoning_summary_part.done")]
1532 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1533 #[serde(rename = "response.reasoning_summary_text.delta")]
1535 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1536 #[serde(rename = "response.reasoning_summary_text.done")]
1538 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1539 #[serde(rename = "response.reasoning_summary.delta")]
1541 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1542 #[serde(rename = "response.reasoning_summary.done")]
1544 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1545 #[serde(rename = "response.image_generation_call.in_progress")]
1547 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1548 #[serde(rename = "response.image_generation_call.generating")]
1550 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1551 #[serde(rename = "response.image_generation_call.partial_image")]
1553 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1554 #[serde(rename = "response.image_generation_call.completed")]
1556 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1557 #[serde(rename = "response.mcp_call_arguments.delta")]
1559 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1560 #[serde(rename = "response.mcp_call_arguments.done")]
1562 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1563 #[serde(rename = "response.mcp_call.completed")]
1565 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1566 #[serde(rename = "response.mcp_call.failed")]
1568 ResponseMcpCallFailed(ResponseMcpCallFailed),
1569 #[serde(rename = "response.mcp_call.in_progress")]
1571 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1572 #[serde(rename = "response.mcp_list_tools.completed")]
1574 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1575 #[serde(rename = "response.mcp_list_tools.failed")]
1577 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1578 #[serde(rename = "response.mcp_list_tools.in_progress")]
1580 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1581 #[serde(rename = "response.code_interpreter_call.in_progress")]
1583 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1584 #[serde(rename = "response.code_interpreter_call.interpreting")]
1586 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1587 #[serde(rename = "response.code_interpreter_call.completed")]
1589 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1590 #[serde(rename = "response.code_interpreter_call_code.delta")]
1592 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1593 #[serde(rename = "response.code_interpreter_call_code.done")]
1595 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1596 #[serde(rename = "response.output_text.annotation.added")]
1598 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1599 #[serde(rename = "error")]
1601 ResponseError(ResponseError),
1602
1603 #[serde(untagged)]
1605 Unknown(serde_json::Value),
1606}
1607
1608pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
1610
1611#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1612#[non_exhaustive]
1613pub struct ResponseCreated {
1614 pub sequence_number: u64,
1615 pub response: ResponseMetadata,
1616}
1617
1618#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1619#[non_exhaustive]
1620pub struct ResponseInProgress {
1621 pub sequence_number: u64,
1622 pub response: ResponseMetadata,
1623}
1624
1625#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1626#[non_exhaustive]
1627pub struct ResponseOutputItemAdded {
1628 pub sequence_number: u64,
1629 pub output_index: u32,
1630 pub item: OutputItem,
1631}
1632
1633#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1634#[non_exhaustive]
1635pub struct ResponseContentPartAdded {
1636 pub sequence_number: u64,
1637 pub item_id: String,
1638 pub output_index: u32,
1639 pub content_index: u32,
1640 pub part: ContentPart,
1641}
1642
1643#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1644#[non_exhaustive]
1645pub struct ResponseOutputTextDelta {
1646 pub sequence_number: u64,
1647 pub item_id: String,
1648 pub output_index: u32,
1649 pub content_index: u32,
1650 pub delta: String,
1651 #[serde(default, skip_serializing_if = "Option::is_none")]
1652 pub logprobs: Option<serde_json::Value>,
1653}
1654
1655#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1656#[non_exhaustive]
1657pub struct ResponseContentPartDone {
1658 pub sequence_number: u64,
1659 pub item_id: String,
1660 pub output_index: u32,
1661 pub content_index: u32,
1662 pub part: ContentPart,
1663}
1664
1665#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1666#[non_exhaustive]
1667pub struct ResponseOutputItemDone {
1668 pub sequence_number: u64,
1669 pub output_index: u32,
1670 pub item: OutputItem,
1671}
1672
1673#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1675#[non_exhaustive]
1676pub struct ResponseCompleted {
1677 pub sequence_number: u64,
1678 pub response: ResponseMetadata,
1679}
1680
1681#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1683#[non_exhaustive]
1684pub struct ResponseFailed {
1685 pub sequence_number: u64,
1686 pub response: ResponseMetadata,
1687}
1688
1689#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1691#[non_exhaustive]
1692pub struct ResponseIncomplete {
1693 pub sequence_number: u64,
1694 pub response: ResponseMetadata,
1695}
1696
1697#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1699#[non_exhaustive]
1700pub struct ResponseQueued {
1701 pub sequence_number: u64,
1702 pub response: ResponseMetadata,
1703}
1704
1705#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1707#[non_exhaustive]
1708pub struct ResponseOutputTextDone {
1709 pub sequence_number: u64,
1710 pub item_id: String,
1711 pub output_index: u32,
1712 pub content_index: u32,
1713 pub text: String,
1714 pub logprobs: Option<Vec<serde_json::Value>>,
1715}
1716
1717#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1719#[non_exhaustive]
1720pub struct ResponseRefusalDelta {
1721 pub sequence_number: u64,
1722 pub item_id: String,
1723 pub output_index: u32,
1724 pub content_index: u32,
1725 pub delta: String,
1726}
1727
1728#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1730#[non_exhaustive]
1731pub struct ResponseRefusalDone {
1732 pub sequence_number: u64,
1733 pub item_id: String,
1734 pub output_index: u32,
1735 pub content_index: u32,
1736 pub refusal: String,
1737}
1738
1739#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1741#[non_exhaustive]
1742pub struct ResponseFunctionCallArgumentsDelta {
1743 pub sequence_number: u64,
1744 pub item_id: String,
1745 pub output_index: u32,
1746 pub delta: String,
1747}
1748
1749#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1751#[non_exhaustive]
1752pub struct ResponseFunctionCallArgumentsDone {
1753 pub sequence_number: u64,
1754 pub item_id: String,
1755 pub output_index: u32,
1756 pub arguments: String,
1757}
1758
1759#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1761#[non_exhaustive]
1762pub struct ResponseError {
1763 pub sequence_number: u64,
1764 pub code: Option<String>,
1765 pub message: String,
1766 pub param: Option<String>,
1767}
1768
1769#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1771#[non_exhaustive]
1772pub struct ResponseFileSearchCallInProgress {
1773 pub sequence_number: u64,
1774 pub output_index: u32,
1775 pub item_id: String,
1776}
1777
1778#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1780#[non_exhaustive]
1781pub struct ResponseFileSearchCallSearching {
1782 pub sequence_number: u64,
1783 pub output_index: u32,
1784 pub item_id: String,
1785}
1786
1787#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1789#[non_exhaustive]
1790pub struct ResponseFileSearchCallCompleted {
1791 pub sequence_number: u64,
1792 pub output_index: u32,
1793 pub item_id: String,
1794}
1795
1796#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1798#[non_exhaustive]
1799pub struct ResponseWebSearchCallInProgress {
1800 pub sequence_number: u64,
1801 pub output_index: u32,
1802 pub item_id: String,
1803}
1804
1805#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1807#[non_exhaustive]
1808pub struct ResponseWebSearchCallSearching {
1809 pub sequence_number: u64,
1810 pub output_index: u32,
1811 pub item_id: String,
1812}
1813
1814#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1816#[non_exhaustive]
1817pub struct ResponseWebSearchCallCompleted {
1818 pub sequence_number: u64,
1819 pub output_index: u32,
1820 pub item_id: String,
1821}
1822
1823#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1825#[non_exhaustive]
1826pub struct ResponseReasoningSummaryPartAdded {
1827 pub sequence_number: u64,
1828 pub item_id: String,
1829 pub output_index: u32,
1830 pub summary_index: u32,
1831 pub part: serde_json::Value, }
1833
1834#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1836#[non_exhaustive]
1837pub struct ResponseReasoningSummaryPartDone {
1838 pub sequence_number: u64,
1839 pub item_id: String,
1840 pub output_index: u32,
1841 pub summary_index: u32,
1842 pub part: serde_json::Value,
1843}
1844
1845#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1847#[non_exhaustive]
1848pub struct ResponseReasoningSummaryTextDelta {
1849 pub sequence_number: u64,
1850 pub item_id: String,
1851 pub output_index: u32,
1852 pub summary_index: u32,
1853 pub delta: String,
1854}
1855
1856#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1858#[non_exhaustive]
1859pub struct ResponseReasoningSummaryTextDone {
1860 pub sequence_number: u64,
1861 pub item_id: String,
1862 pub output_index: u32,
1863 pub summary_index: u32,
1864 pub text: String,
1865}
1866
1867#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1869#[non_exhaustive]
1870pub struct ResponseReasoningSummaryDelta {
1871 pub sequence_number: u64,
1872 pub item_id: String,
1873 pub output_index: u32,
1874 pub summary_index: u32,
1875 pub delta: serde_json::Value,
1876}
1877
1878#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1880#[non_exhaustive]
1881pub struct ResponseReasoningSummaryDone {
1882 pub sequence_number: u64,
1883 pub item_id: String,
1884 pub output_index: u32,
1885 pub summary_index: u32,
1886 pub text: String,
1887}
1888
1889#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1891#[non_exhaustive]
1892pub struct ResponseImageGenerationCallInProgress {
1893 pub sequence_number: u64,
1894 pub output_index: u32,
1895 pub item_id: String,
1896}
1897
1898#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1900#[non_exhaustive]
1901pub struct ResponseImageGenerationCallGenerating {
1902 pub sequence_number: u64,
1903 pub output_index: u32,
1904 pub item_id: String,
1905}
1906
1907#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1909#[non_exhaustive]
1910pub struct ResponseImageGenerationCallPartialImage {
1911 pub sequence_number: u64,
1912 pub output_index: u32,
1913 pub item_id: String,
1914 pub partial_image_index: u32,
1915 pub partial_image_b64: String,
1916}
1917
1918#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1920#[non_exhaustive]
1921pub struct ResponseImageGenerationCallCompleted {
1922 pub sequence_number: u64,
1923 pub output_index: u32,
1924 pub item_id: String,
1925}
1926
1927#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1929#[non_exhaustive]
1930pub struct ResponseMcpCallArgumentsDelta {
1931 pub sequence_number: u64,
1932 pub output_index: u32,
1933 pub item_id: String,
1934 pub delta: String,
1935}
1936
1937#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1939#[non_exhaustive]
1940pub struct ResponseMcpCallArgumentsDone {
1941 pub sequence_number: u64,
1942 pub output_index: u32,
1943 pub item_id: String,
1944 pub arguments: String,
1945}
1946
1947#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1949#[non_exhaustive]
1950pub struct ResponseMcpCallCompleted {
1951 pub sequence_number: u64,
1952 pub output_index: u32,
1953 pub item_id: String,
1954}
1955
1956#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1958#[non_exhaustive]
1959pub struct ResponseMcpCallFailed {
1960 pub sequence_number: u64,
1961 pub output_index: u32,
1962 pub item_id: String,
1963}
1964
1965#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1967#[non_exhaustive]
1968pub struct ResponseMcpCallInProgress {
1969 pub sequence_number: u64,
1970 pub output_index: u32,
1971 pub item_id: String,
1972}
1973
1974#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1976#[non_exhaustive]
1977pub struct ResponseMcpListToolsCompleted {
1978 pub sequence_number: u64,
1979 pub output_index: u32,
1980 pub item_id: String,
1981}
1982
1983#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1985#[non_exhaustive]
1986pub struct ResponseMcpListToolsFailed {
1987 pub sequence_number: u64,
1988 pub output_index: u32,
1989 pub item_id: String,
1990}
1991
1992#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1994#[non_exhaustive]
1995pub struct ResponseMcpListToolsInProgress {
1996 pub sequence_number: u64,
1997 pub output_index: u32,
1998 pub item_id: String,
1999}
2000
2001#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2003#[non_exhaustive]
2004pub struct ResponseCodeInterpreterCallInProgress {
2005 pub sequence_number: u64,
2006 pub output_index: u32,
2007 pub item_id: String,
2008}
2009
2010#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2012#[non_exhaustive]
2013pub struct ResponseCodeInterpreterCallInterpreting {
2014 pub sequence_number: u64,
2015 pub output_index: u32,
2016 pub item_id: String,
2017}
2018
2019#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2021#[non_exhaustive]
2022pub struct ResponseCodeInterpreterCallCompleted {
2023 pub sequence_number: u64,
2024 pub output_index: u32,
2025 pub item_id: String,
2026}
2027
2028#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2030#[non_exhaustive]
2031pub struct ResponseCodeInterpreterCallCodeDelta {
2032 pub sequence_number: u64,
2033 pub output_index: u32,
2034 pub item_id: String,
2035 pub delta: String,
2036}
2037
2038#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2040#[non_exhaustive]
2041pub struct ResponseCodeInterpreterCallCodeDone {
2042 pub sequence_number: u64,
2043 pub output_index: u32,
2044 pub item_id: String,
2045 pub code: String,
2046}
2047
2048#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2050#[non_exhaustive]
2051pub struct ResponseMetadata {
2052 pub id: String,
2053 #[serde(skip_serializing_if = "Option::is_none")]
2054 pub object: Option<String>,
2055 pub created_at: u64,
2056 pub status: Status,
2057 #[serde(skip_serializing_if = "Option::is_none")]
2058 pub model: Option<String>,
2059 #[serde(skip_serializing_if = "Option::is_none")]
2060 pub usage: Option<Usage>,
2061 #[serde(skip_serializing_if = "Option::is_none")]
2062 pub error: Option<ErrorObject>,
2063 #[serde(skip_serializing_if = "Option::is_none")]
2064 pub incomplete_details: Option<IncompleteDetails>,
2065 #[serde(skip_serializing_if = "Option::is_none")]
2066 pub input: Option<Input>,
2067 #[serde(skip_serializing_if = "Option::is_none")]
2068 pub instructions: Option<String>,
2069 #[serde(skip_serializing_if = "Option::is_none")]
2070 pub max_output_tokens: Option<u32>,
2071 #[serde(skip_serializing_if = "Option::is_none")]
2073 pub background: Option<bool>,
2074 #[serde(skip_serializing_if = "Option::is_none")]
2076 pub service_tier: Option<ServiceTier>,
2077 #[serde(skip_serializing_if = "Option::is_none")]
2079 pub top_logprobs: Option<u32>,
2080 #[serde(skip_serializing_if = "Option::is_none")]
2082 pub max_tool_calls: Option<u32>,
2083 #[serde(skip_serializing_if = "Option::is_none")]
2084 pub output: Option<Vec<OutputItem>>,
2085 #[serde(skip_serializing_if = "Option::is_none")]
2086 pub parallel_tool_calls: Option<bool>,
2087 #[serde(skip_serializing_if = "Option::is_none")]
2088 pub previous_response_id: Option<String>,
2089 #[serde(skip_serializing_if = "Option::is_none")]
2090 pub reasoning: Option<ReasoningConfig>,
2091 #[serde(skip_serializing_if = "Option::is_none")]
2092 pub store: Option<bool>,
2093 #[serde(skip_serializing_if = "Option::is_none")]
2094 pub temperature: Option<f32>,
2095 #[serde(skip_serializing_if = "Option::is_none")]
2096 pub text: Option<TextConfig>,
2097 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub tool_choice: Option<ToolChoice>,
2099 #[serde(skip_serializing_if = "Option::is_none")]
2100 pub tools: Option<Vec<ToolDefinition>>,
2101 #[serde(skip_serializing_if = "Option::is_none")]
2102 pub top_p: Option<f32>,
2103 #[serde(skip_serializing_if = "Option::is_none")]
2104 pub truncation: Option<Truncation>,
2105 #[serde(skip_serializing_if = "Option::is_none")]
2106 pub user: Option<String>,
2107 #[serde(skip_serializing_if = "Option::is_none")]
2108 pub metadata: Option<HashMap<String, String>>,
2109 #[serde(skip_serializing_if = "Option::is_none")]
2111 pub prompt_cache_key: Option<String>,
2112 #[serde(skip_serializing_if = "Option::is_none")]
2114 pub safety_identifier: Option<String>,
2115}
2116
2117#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2119#[serde(tag = "type")]
2120#[serde(rename_all = "snake_case")]
2121#[non_exhaustive]
2122pub enum OutputItem {
2123 Message(OutputMessage),
2124 FileSearchCall(FileSearchCallOutput),
2125 FunctionCall(FunctionCall),
2126 WebSearchCall(WebSearchCallOutput),
2127 ComputerCall(ComputerCallOutput),
2128 Reasoning(ReasoningItem),
2129 ImageGenerationCall(ImageGenerationCallOutput),
2130 CodeInterpreterCall(CodeInterpreterCallOutput),
2131 LocalShellCall(LocalShellCallOutput),
2132 McpCall(McpCallOutput),
2133 McpListTools(McpListToolsOutput),
2134 McpApprovalRequest(McpApprovalRequestOutput),
2135 CustomToolCall(CustomToolCallOutput),
2136}
2137
2138#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2139#[non_exhaustive]
2140pub struct CustomToolCallOutput {
2141 pub call_id: String,
2142 pub input: String,
2143 pub name: String,
2144 pub id: String,
2145}
2146
2147#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2149#[non_exhaustive]
2150pub struct ContentPart {
2151 #[serde(rename = "type")]
2152 pub part_type: String,
2153 pub text: Option<String>,
2154 #[serde(default, skip_serializing_if = "Option::is_none")]
2155 pub annotations: Option<Vec<serde_json::Value>>,
2156 #[serde(default, skip_serializing_if = "Option::is_none")]
2157 pub logprobs: Option<Vec<serde_json::Value>>,
2158}
2159
2160#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2166#[non_exhaustive]
2167pub struct ResponseOutputTextAnnotationAdded {
2168 pub sequence_number: u64,
2169 pub item_id: String,
2170 pub output_index: u32,
2171 pub content_index: u32,
2172 pub annotation_index: u32,
2173 pub annotation: TextAnnotation,
2174}
2175
2176#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2178#[non_exhaustive]
2179pub struct TextAnnotation {
2180 #[serde(rename = "type")]
2181 pub annotation_type: String,
2182 pub text: String,
2183 pub start: u32,
2184 pub end: u32,
2185}