1use crate::error::OpenAIError;
2pub use crate::types::{
3 CompletionTokensDetails, ImageDetail, PromptTokensDetails, ReasoningEffort,
4 ResponseFormatJsonSchema,
5};
6use derive_builder::Builder;
7use futures::Stream;
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10use std::collections::HashMap;
11use std::pin::Pin;
12
13#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
15#[serde(rename_all = "lowercase")]
16pub enum Role {
17 User,
18 Assistant,
19 System,
20 Developer,
21}
22
23#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
25#[serde(rename_all = "snake_case")]
26pub enum OutputStatus {
27 InProgress,
28 Completed,
29 Incomplete,
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
34#[serde(untagged)]
35pub enum Input {
36 Text(String),
38 Items(Vec<InputItem>),
40}
41
42#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
44#[serde(untagged, rename_all = "snake_case")]
45pub enum InputItem {
46 Message(InputMessage),
47 Custom(serde_json::Value),
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
52#[builder(
53 name = "InputMessageArgs",
54 pattern = "mutable",
55 setter(into, strip_option),
56 default
57)]
58#[builder(build_fn(error = "OpenAIError"))]
59pub struct InputMessage {
60 #[serde(default, rename = "type")]
61 pub kind: InputMessageType,
62 pub role: Role,
64 pub content: InputContent,
67}
68
69#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
70#[serde(rename_all = "snake_case")]
71pub enum InputMessageType {
72 #[default]
73 Message,
74}
75
76#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
77#[serde(untagged)]
78pub enum InputContent {
79 TextInput(String),
81 InputItemContentList(Vec<ContentType>),
83}
84
85#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
87#[serde(tag = "type", rename_all = "snake_case")]
88pub enum ContentType {
89 InputText(InputText),
91 InputImage(InputImage),
93 InputFile(InputFile),
95}
96
97#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
98pub struct InputText {
99 pub text: String,
100}
101
102#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
103#[builder(
104 name = "InputImageArgs",
105 pattern = "mutable",
106 setter(into, strip_option),
107 default
108)]
109#[builder(build_fn(error = "OpenAIError"))]
110pub struct InputImage {
111 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 #[serde(skip_serializing_if = "Option::is_none")]
142 file_url: Option<String>,
143}
144
145#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
147#[builder(
148 name = "CreateResponseArgs",
149 pattern = "mutable",
150 setter(into, strip_option),
151 default
152)]
153#[builder(build_fn(error = "OpenAIError"))]
154pub struct CreateResponse {
155 pub input: Input,
157
158 pub model: String,
162
163 #[serde(skip_serializing_if = "Option::is_none")]
166 pub background: Option<bool>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
186 pub include: Option<Vec<String>>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
194 pub instructions: Option<String>,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
199 pub max_output_tokens: Option<u32>,
200
201 pub max_tool_calls: Option<u32>,
205
206 #[serde(skip_serializing_if = "Option::is_none")]
213 pub metadata: Option<HashMap<String, String>>,
214
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub parallel_tool_calls: Option<bool>,
218
219 #[serde(skip_serializing_if = "Option::is_none")]
222 pub previous_response_id: Option<String>,
223
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub prompt: Option<PromptConfig>,
227
228 #[serde(skip_serializing_if = "Option::is_none")]
230 pub reasoning: Option<ReasoningConfig>,
231
232 #[serde(skip_serializing_if = "Option::is_none")]
252 pub service_tier: Option<ServiceTier>,
253
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub store: Option<bool>,
257
258 #[serde(skip_serializing_if = "Option::is_none")]
261 pub stream: Option<bool>,
262
263 #[serde(skip_serializing_if = "Option::is_none")]
268 pub temperature: Option<f32>,
269
270 #[serde(skip_serializing_if = "Option::is_none")]
273 pub text: Option<TextConfig>,
274
275 #[serde(skip_serializing_if = "Option::is_none")]
278 pub tool_choice: Option<ToolChoice>,
279
280 #[serde(skip_serializing_if = "Option::is_none")]
284 pub tools: Option<Vec<ToolDefinition>>,
285
286 #[serde(skip_serializing_if = "Option::is_none")]
289 pub top_logprobs: Option<u32>, #[serde(skip_serializing_if = "Option::is_none")]
297 pub top_p: Option<f32>,
298
299 #[serde(skip_serializing_if = "Option::is_none")]
303 pub truncation: Option<Truncation>,
304
305 #[serde(skip_serializing_if = "Option::is_none")]
308 pub user: Option<String>,
309}
310
311#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
313pub struct PromptConfig {
314 pub id: String,
316
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub version: Option<String>,
320
321 #[serde(skip_serializing_if = "Option::is_none")]
325 pub variables: Option<HashMap<String, String>>,
326}
327
328#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
330#[serde(rename_all = "lowercase")]
331pub enum ServiceTier {
332 Auto,
333 Default,
334 Flex,
335 Scale,
336 Priority,
337}
338
339#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
341#[serde(rename_all = "lowercase")]
342pub enum Truncation {
343 Auto,
344 Disabled,
345}
346
347#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
349#[builder(
350 name = "ReasoningConfigArgs",
351 pattern = "mutable",
352 setter(into, strip_option),
353 default
354)]
355#[builder(build_fn(error = "OpenAIError"))]
356pub struct ReasoningConfig {
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub effort: Option<ReasoningEffort>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub summary: Option<ReasoningSummary>,
363}
364
365#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
367#[serde(rename_all = "lowercase")]
368pub enum Verbosity {
369 Low,
370 Medium,
371 High,
372}
373
374#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
375#[serde(rename_all = "lowercase")]
376pub enum ReasoningSummary {
377 Auto,
378 Concise,
379 Detailed,
380}
381
382#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
384pub struct TextConfig {
385 pub format: TextResponseFormat,
387
388 #[serde(skip_serializing_if = "Option::is_none")]
389 pub verbosity: Option<Verbosity>,
390}
391
392#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
393#[serde(tag = "type", rename_all = "snake_case")]
394pub enum TextResponseFormat {
395 Text,
397 JsonObject,
399 JsonSchema(ResponseFormatJsonSchema),
401}
402
403#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
405#[serde(tag = "type", rename_all = "snake_case")]
406pub enum ToolDefinition {
407 FileSearch(FileSearch),
409 Function(Function),
411 WebSearchPreview(WebSearchPreview),
413 ComputerUsePreview(ComputerUsePreview),
415 Mcp(Mcp),
417 CodeInterpreter(CodeInterpreter),
419 ImageGeneration(ImageGeneration),
421 LocalShell,
423}
424
425#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
426#[builder(
427 name = "FileSearchArgs",
428 pattern = "mutable",
429 setter(into, strip_option),
430 default
431)]
432#[builder(build_fn(error = "OpenAIError"))]
433pub struct FileSearch {
434 pub vector_store_ids: Vec<String>,
436 #[serde(skip_serializing_if = "Option::is_none")]
438 pub max_num_results: Option<u32>,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub filters: Option<Filter>,
442 #[serde(skip_serializing_if = "Option::is_none")]
444 pub ranking_options: Option<RankingOptions>,
445}
446
447#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
448#[builder(
449 name = "FunctionArgs",
450 pattern = "mutable",
451 setter(into, strip_option),
452 default
453)]
454pub struct Function {
455 pub name: String,
457 pub parameters: serde_json::Value,
459 pub strict: bool,
461 #[serde(skip_serializing_if = "Option::is_none")]
464 pub description: Option<String>,
465}
466
467#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
468#[builder(
469 name = "WebSearchPreviewArgs",
470 pattern = "mutable",
471 setter(into, strip_option),
472 default
473)]
474pub struct WebSearchPreview {
475 #[serde(skip_serializing_if = "Option::is_none")]
477 pub user_location: Option<Location>,
478 #[serde(skip_serializing_if = "Option::is_none")]
480 pub search_context_size: Option<WebSearchContextSize>,
481}
482
483#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
484#[serde(rename_all = "lowercase")]
485pub enum WebSearchContextSize {
486 Low,
487 Medium,
488 High,
489}
490
491#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
492#[builder(
493 name = "ComputerUsePreviewArgs",
494 pattern = "mutable",
495 setter(into, strip_option),
496 default
497)]
498pub struct ComputerUsePreview {
499 environment: String,
501 display_width: u32,
503 display_height: u32,
505}
506
507#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
509pub struct RankingOptions {
510 pub ranker: String,
512 #[serde(skip_serializing_if = "Option::is_none")]
515 pub score_threshold: Option<f32>,
516}
517
518#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
520#[serde(untagged)]
521pub enum Filter {
522 Comparison(ComparisonFilter),
525 Compound(CompoundFilter),
527}
528
529#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
531pub struct ComparisonFilter {
532 #[serde(rename = "type")]
534 pub op: ComparisonType,
535 pub key: String,
537 pub value: serde_json::Value,
539}
540
541#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
542pub enum ComparisonType {
543 #[serde(rename = "eq")]
544 Equals,
545 #[serde(rename = "ne")]
546 NotEquals,
547 #[serde(rename = "gt")]
548 GreaterThan,
549 #[serde(rename = "gte")]
550 GreaterThanOrEqualTo,
551 #[serde(rename = "lt")]
552 LessThan,
553 #[serde(rename = "lte")]
554 LessThanOrEqualTo,
555}
556
557#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
559pub struct CompoundFilter {
560 #[serde(rename = "type")]
562 pub op: CompoundType,
563 pub filters: Vec<Filter>,
565}
566
567#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
568#[serde(rename_all = "lowercase")]
569pub enum CompoundType {
570 And,
571 Or,
572}
573
574#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
576#[builder(
577 name = "LocationArgs",
578 pattern = "mutable",
579 setter(into, strip_option),
580 default
581)]
582#[builder(build_fn(error = "OpenAIError"))]
583pub struct Location {
584 #[serde(rename = "type")]
586 pub kind: String,
587 #[serde(skip_serializing_if = "Option::is_none")]
589 pub city: Option<String>,
590 #[serde(skip_serializing_if = "Option::is_none")]
592 pub country: Option<String>,
593 #[serde(skip_serializing_if = "Option::is_none")]
595 pub region: Option<String>,
596 #[serde(skip_serializing_if = "Option::is_none")]
598 pub timezone: Option<String>,
599}
600
601#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
603#[builder(
604 name = "McpArgs",
605 pattern = "mutable",
606 setter(into, strip_option),
607 default
608)]
609#[builder(build_fn(error = "OpenAIError"))]
610pub struct Mcp {
611 pub server_label: String,
613 pub server_url: String,
615 #[serde(skip_serializing_if = "Option::is_none")]
617 pub allowed_tools: Option<AllowedTools>,
618 #[serde(skip_serializing_if = "Option::is_none")]
620 pub headers: Option<Value>,
621 #[serde(skip_serializing_if = "Option::is_none")]
623 pub require_approval: Option<RequireApproval>,
624}
625
626#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
628#[serde(untagged)]
629pub enum AllowedTools {
630 List(Vec<String>),
632 Filter(McpAllowedToolsFilter),
634}
635
636#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
638pub struct McpAllowedToolsFilter {
639 #[serde(skip_serializing_if = "Option::is_none")]
641 pub tool_names: Option<Vec<String>>,
642}
643
644#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
646#[serde(untagged)]
647pub enum RequireApproval {
648 Policy(RequireApprovalPolicy),
650 Filter(McpApprovalFilter),
652}
653
654#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
655#[serde(rename_all = "lowercase")]
656pub enum RequireApprovalPolicy {
657 Always,
658 Never,
659}
660
661#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
663pub struct McpApprovalFilter {
664 #[serde(skip_serializing_if = "Option::is_none")]
666 pub always: Option<McpAllowedToolsFilter>,
667 #[serde(skip_serializing_if = "Option::is_none")]
669 pub never: Option<McpAllowedToolsFilter>,
670}
671
672#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
674#[serde(untagged)]
675pub enum CodeInterpreterContainer {
676 Id(String),
678 Container(CodeInterpreterContainerKind),
680}
681
682#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
684#[serde(tag = "type", rename_all = "snake_case")]
685pub enum CodeInterpreterContainerKind {
686 Auto {
687 #[serde(skip_serializing_if = "Option::is_none")]
689 file_ids: Option<Vec<String>>,
690 },
691}
692
693#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
695#[builder(
696 name = "CodeInterpreterArgs",
697 pattern = "mutable",
698 setter(into, strip_option),
699 default
700)]
701#[builder(build_fn(error = "OpenAIError"))]
702pub struct CodeInterpreter {
703 pub container: CodeInterpreterContainer,
705}
706
707#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
709pub struct InputImageMask {
710 #[serde(skip_serializing_if = "Option::is_none")]
712 pub image_url: Option<String>,
713 #[serde(skip_serializing_if = "Option::is_none")]
715 pub file_id: Option<String>,
716}
717
718#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
720#[builder(
721 name = "ImageGenerationArgs",
722 pattern = "mutable",
723 setter(into, strip_option),
724 default
725)]
726#[builder(build_fn(error = "OpenAIError"))]
727pub struct ImageGeneration {
728 #[serde(skip_serializing_if = "Option::is_none")]
730 pub background: Option<ImageGenerationBackground>,
731 #[serde(skip_serializing_if = "Option::is_none")]
733 pub input_image_mask: Option<InputImageMask>,
734 #[serde(skip_serializing_if = "Option::is_none")]
736 pub model: Option<String>,
737 #[serde(skip_serializing_if = "Option::is_none")]
739 pub moderation: Option<String>,
740 #[serde(skip_serializing_if = "Option::is_none")]
742 pub output_compression: Option<u8>,
743 #[serde(skip_serializing_if = "Option::is_none")]
745 pub output_format: Option<ImageGenerationOutputFormat>,
746 #[serde(skip_serializing_if = "Option::is_none")]
748 pub partial_images: Option<u8>,
749 #[serde(skip_serializing_if = "Option::is_none")]
751 pub quality: Option<ImageGenerationQuality>,
752 #[serde(skip_serializing_if = "Option::is_none")]
754 pub size: Option<ImageGenerationSize>,
755}
756
757#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
758#[serde(rename_all = "lowercase")]
759pub enum ImageGenerationBackground {
760 Transparent,
761 Opaque,
762 Auto,
763}
764
765#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
766#[serde(rename_all = "lowercase")]
767pub enum ImageGenerationOutputFormat {
768 Png,
769 Webp,
770 Jpeg,
771}
772
773#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
774#[serde(rename_all = "lowercase")]
775pub enum ImageGenerationQuality {
776 Low,
777 Medium,
778 High,
779 Auto,
780}
781
782#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
783#[serde(rename_all = "lowercase")]
784pub enum ImageGenerationSize {
785 Auto,
786 #[serde(rename = "1024x1024")]
787 Size1024x1024,
788 #[serde(rename = "1024x1536")]
789 Size1024x1536,
790 #[serde(rename = "1536x1024")]
791 Size1536x1024,
792}
793
794#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
796#[serde(untagged)]
797pub enum ToolChoice {
798 Mode(ToolChoiceMode),
800 Hosted {
802 #[serde(rename = "type")]
804 kind: HostedToolType,
805 },
806 Function {
808 name: String,
810 },
811}
812
813#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
815#[serde(rename_all = "lowercase")]
816pub enum ToolChoiceMode {
817 None,
819 Auto,
821 Required,
823}
824
825#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
827#[serde(rename_all = "snake_case")]
828pub enum HostedToolType {
829 FileSearch,
830 WebSearchPreview,
831 ComputerUsePreview,
832}
833
834#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
836pub struct ErrorObject {
837 pub code: String,
839 pub message: String,
841}
842
843#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
845pub struct IncompleteDetails {
846 pub reason: String,
848}
849
850#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
852pub struct OutputText {
853 pub annotations: Vec<Annotation>,
855 pub text: String,
857}
858
859#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
860#[serde(tag = "type", rename_all = "snake_case")]
861pub enum Annotation {
862 FileCitation(FileCitation),
864 UrlCitation(UrlCitation),
866 FilePath(FilePath),
868}
869
870#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
871pub struct FileCitation {
872 file_id: String,
874 index: u32,
876}
877
878#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
879pub struct UrlCitation {
880 end_index: u32,
882 start_index: u32,
884 title: String,
886 url: String,
888}
889
890#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
891pub struct FilePath {
892 file_id: String,
894 index: u32,
896}
897
898#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
900pub struct Refusal {
901 pub refusal: String,
903}
904
905#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
907pub struct OutputMessage {
908 pub content: Vec<Content>,
910 pub id: String,
912 pub role: Role,
914 pub status: OutputStatus,
916}
917
918#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
919#[serde(tag = "type", rename_all = "snake_case")]
920pub enum Content {
921 OutputText(OutputText),
923 Refusal(Refusal),
925}
926
927#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
929#[serde(tag = "type", rename_all = "snake_case")]
930pub enum OutputContent {
931 Message(OutputMessage),
933 FileSearchCall(FileSearchCallOutput),
935 FunctionCall(FunctionCall),
937 WebSearchCall(WebSearchCallOutput),
939 ComputerCall(ComputerCallOutput),
941 Reasoning(ReasoningItem),
945 ImageGenerationCall(ImageGenerationCallOutput),
947 CodeInterpreterCall(CodeInterpreterCallOutput),
949 LocalShellCall(LocalShellCallOutput),
951 McpCall(McpCallOutput),
953 McpListTools(McpListToolsOutput),
955 McpApprovalRequest(McpApprovalRequestOutput),
957}
958
959#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
961pub struct ReasoningItem {
962 pub id: String,
964 pub summary: Vec<SummaryText>,
966 #[serde(skip_serializing_if = "Option::is_none")]
969 pub encrypted_content: Option<String>,
970 #[serde(skip_serializing_if = "Option::is_none")]
972 pub status: Option<OutputStatus>,
973}
974
975#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
977pub struct SummaryText {
978 pub text: String,
980}
981
982#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
984pub struct FileSearchCallOutput {
985 pub id: String,
987 pub queries: Vec<String>,
989 pub status: FileSearchCallOutputStatus,
991 #[serde(skip_serializing_if = "Option::is_none")]
993 pub results: Option<Vec<FileSearchResult>>,
994}
995
996#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
997#[serde(rename_all = "snake_case")]
998pub enum FileSearchCallOutputStatus {
999 InProgress,
1000 Searching,
1001 Incomplete,
1002 Failed,
1003 Completed,
1004}
1005
1006#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1008pub struct FileSearchResult {
1009 pub file_id: String,
1011 pub filename: String,
1013 pub score: f32,
1015 pub text: String,
1017 pub attributes: HashMap<String, serde_json::Value>,
1022}
1023
1024#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1025pub struct SafetyCheck {
1026 pub id: String,
1028 pub code: String,
1030 pub message: String,
1032}
1033
1034#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1036pub struct WebSearchCallOutput {
1037 pub id: String,
1039 pub status: String,
1041}
1042
1043#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1045pub struct ComputerCallOutput {
1046 pub action: ComputerCallAction,
1047 pub call_id: String,
1049 pub id: String,
1051 pub pending_safety_checks: Vec<SafetyCheck>,
1053 pub status: OutputStatus,
1055}
1056
1057#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1059pub struct Point {
1060 pub x: i32,
1061 pub y: i32,
1062}
1063
1064#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1066#[serde(tag = "type", rename_all = "snake_case")]
1067pub enum ComputerCallAction {
1068 Click(Click),
1070
1071 DoubleClick(DoubleClick),
1073
1074 Drag(Drag),
1076
1077 KeyPress(KeyPress),
1079
1080 Move(MoveAction),
1082
1083 Screenshot,
1085
1086 Scroll(Scroll),
1088
1089 Type(TypeAction),
1091
1092 Wait,
1094}
1095
1096#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1097#[serde(rename_all = "snake_case")]
1098pub enum ButtonPress {
1099 Left,
1100 Right,
1101 Wheel,
1102 Back,
1103 Forward,
1104}
1105
1106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1108pub struct Click {
1109 pub button: ButtonPress,
1111 pub x: i32,
1113 pub y: i32,
1115}
1116
1117#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1119pub struct DoubleClick {
1120 pub x: i32,
1122 pub y: i32,
1124}
1125
1126#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1128pub struct Drag {
1129 pub path: Vec<Point>,
1131 pub x: i32,
1133 pub y: i32,
1135}
1136
1137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1139pub struct KeyPress {
1140 pub keys: Vec<String>,
1142}
1143
1144#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1146pub struct MoveAction {
1147 pub x: i32,
1149 pub y: i32,
1151}
1152
1153#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1155pub struct Scroll {
1156 pub scroll_x: i32,
1158 pub scroll_y: i32,
1160 pub x: i32,
1162 pub y: i32,
1164}
1165
1166#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1168pub struct TypeAction {
1169 pub text: String,
1171}
1172
1173#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1175pub struct FunctionCall {
1176 pub id: String,
1178 pub call_id: String,
1180 pub name: String,
1182 pub arguments: String,
1184 pub status: OutputStatus,
1186}
1187
1188#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1190pub struct ImageGenerationCallOutput {
1191 pub id: String,
1193 pub result: Option<String>,
1195 pub status: String,
1197}
1198
1199#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1201pub struct CodeInterpreterCallOutput {
1202 #[serde(skip_serializing_if = "Option::is_none")]
1204 pub code: Option<String>,
1205 pub id: String,
1207 pub status: String,
1209 pub container_id: String,
1211 #[serde(skip_serializing_if = "Option::is_none")]
1213 pub outputs: Option<Vec<CodeInterpreterResult>>,
1214}
1215
1216#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1218#[serde(tag = "type", rename_all = "snake_case")]
1219pub enum CodeInterpreterResult {
1220 Logs(CodeInterpreterTextOutput),
1222 Files(CodeInterpreterFileOutput),
1224}
1225
1226#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1228pub struct CodeInterpreterTextOutput {
1229 pub logs: String,
1231}
1232
1233#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1235pub struct CodeInterpreterFileOutput {
1236 pub files: Vec<CodeInterpreterFile>,
1238}
1239
1240#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1241pub struct CodeInterpreterFile {
1242 file_id: String,
1244 mime_type: String,
1246}
1247
1248#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1250pub struct LocalShellCallOutput {
1251 pub action: LocalShellAction,
1253 pub call_id: String,
1255 pub id: String,
1257 pub status: String,
1259}
1260
1261#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1263pub struct LocalShellAction {
1264 pub command: Vec<String>,
1266 pub env: HashMap<String, String>,
1268 pub timeout_ms: Option<u64>,
1270 pub user: Option<String>,
1272 pub working_directory: Option<String>,
1274}
1275
1276#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1278pub struct McpCallOutput {
1279 pub arguments: String,
1281 pub id: String,
1283 pub name: String,
1285 pub server_label: String,
1287 pub error: Option<String>,
1289 pub output: Option<String>,
1291}
1292
1293#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1295pub struct McpListToolsOutput {
1296 pub id: String,
1298 pub server_label: String,
1300 pub tools: Vec<McpToolInfo>,
1302 #[serde(skip_serializing_if = "Option::is_none")]
1304 pub error: Option<String>,
1305}
1306
1307#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1309pub struct McpToolInfo {
1310 pub name: String,
1312 pub input_schema: Value,
1314 #[serde(skip_serializing_if = "Option::is_none")]
1316 pub annotations: Option<Value>,
1317 #[serde(skip_serializing_if = "Option::is_none")]
1319 pub description: Option<String>,
1320}
1321
1322#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1324pub struct McpApprovalRequestOutput {
1325 pub arguments: String,
1327 pub id: String,
1329 pub name: String,
1331 pub server_label: String,
1333}
1334
1335#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1337pub struct Usage {
1338 pub input_tokens: u32,
1340 pub input_tokens_details: PromptTokensDetails,
1342 pub output_tokens: u32,
1344 pub output_tokens_details: CompletionTokensDetails,
1346 pub total_tokens: u32,
1348}
1349
1350#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1352pub struct Response {
1353 pub created_at: u64,
1355
1356 #[serde(skip_serializing_if = "Option::is_none")]
1358 pub error: Option<ErrorObject>,
1359
1360 pub id: String,
1362
1363 #[serde(skip_serializing_if = "Option::is_none")]
1365 pub incomplete_details: Option<IncompleteDetails>,
1366
1367 #[serde(skip_serializing_if = "Option::is_none")]
1369 pub instructions: Option<String>,
1370
1371 #[serde(skip_serializing_if = "Option::is_none")]
1373 pub max_output_tokens: Option<u32>,
1374
1375 #[serde(skip_serializing_if = "Option::is_none")]
1377 pub metadata: Option<HashMap<String, String>>,
1378
1379 pub model: String,
1381
1382 pub object: String,
1384
1385 pub output: Vec<OutputContent>,
1387
1388 #[serde(skip_serializing_if = "Option::is_none")]
1392 pub output_text: Option<String>,
1393
1394 #[serde(skip_serializing_if = "Option::is_none")]
1396 pub parallel_tool_calls: Option<bool>,
1397
1398 #[serde(skip_serializing_if = "Option::is_none")]
1400 pub previous_response_id: Option<String>,
1401
1402 #[serde(skip_serializing_if = "Option::is_none")]
1404 pub reasoning: Option<ReasoningConfig>,
1405
1406 #[serde(skip_serializing_if = "Option::is_none")]
1408 pub store: Option<bool>,
1409
1410 #[serde(skip_serializing_if = "Option::is_none")]
1412 pub service_tier: Option<ServiceTier>,
1413
1414 pub status: Status,
1416
1417 #[serde(skip_serializing_if = "Option::is_none")]
1419 pub temperature: Option<f32>,
1420
1421 #[serde(skip_serializing_if = "Option::is_none")]
1423 pub text: Option<TextConfig>,
1424
1425 #[serde(skip_serializing_if = "Option::is_none")]
1427 pub tool_choice: Option<ToolChoice>,
1428
1429 #[serde(skip_serializing_if = "Option::is_none")]
1431 pub tools: Option<Vec<ToolDefinition>>,
1432
1433 #[serde(skip_serializing_if = "Option::is_none")]
1435 pub top_p: Option<f32>,
1436
1437 #[serde(skip_serializing_if = "Option::is_none")]
1439 pub truncation: Option<Truncation>,
1440
1441 #[serde(skip_serializing_if = "Option::is_none")]
1443 pub usage: Option<Usage>,
1444
1445 #[serde(skip_serializing_if = "Option::is_none")]
1447 pub user: Option<String>,
1448}
1449
1450#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1451#[serde(rename_all = "snake_case")]
1452pub enum Status {
1453 Completed,
1454 Failed,
1455 InProgress,
1456 Incomplete,
1457}
1458
1459#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1461#[serde(tag = "type")]
1462#[non_exhaustive] pub enum ResponseEvent {
1464 #[serde(rename = "response.created")]
1466 ResponseCreated(ResponseCreated),
1467 #[serde(rename = "response.in_progress")]
1469 ResponseInProgress(ResponseInProgress),
1470 #[serde(rename = "response.completed")]
1472 ResponseCompleted(ResponseCompleted),
1473 #[serde(rename = "response.failed")]
1475 ResponseFailed(ResponseFailed),
1476 #[serde(rename = "response.incomplete")]
1478 ResponseIncomplete(ResponseIncomplete),
1479 #[serde(rename = "response.queued")]
1481 ResponseQueued(ResponseQueued),
1482 #[serde(rename = "response.output_item.added")]
1484 ResponseOutputItemAdded(ResponseOutputItemAdded),
1485 #[serde(rename = "response.content_part.added")]
1487 ResponseContentPartAdded(ResponseContentPartAdded),
1488 #[serde(rename = "response.output_text.delta")]
1490 ResponseOutputTextDelta(ResponseOutputTextDelta),
1491 #[serde(rename = "response.output_text.done")]
1493 ResponseOutputTextDone(ResponseOutputTextDone),
1494 #[serde(rename = "response.refusal.delta")]
1496 ResponseRefusalDelta(ResponseRefusalDelta),
1497 #[serde(rename = "response.refusal.done")]
1499 ResponseRefusalDone(ResponseRefusalDone),
1500 #[serde(rename = "response.content_part.done")]
1502 ResponseContentPartDone(ResponseContentPartDone),
1503 #[serde(rename = "response.output_item.done")]
1505 ResponseOutputItemDone(ResponseOutputItemDone),
1506 #[serde(rename = "response.function_call_arguments.delta")]
1508 ResponseFunctionCallArgumentsDelta(ResponseFunctionCallArgumentsDelta),
1509 #[serde(rename = "response.function_call_arguments.done")]
1511 ResponseFunctionCallArgumentsDone(ResponseFunctionCallArgumentsDone),
1512 #[serde(rename = "response.file_search_call.in_progress")]
1514 ResponseFileSearchCallInProgress(ResponseFileSearchCallInProgress),
1515 #[serde(rename = "response.file_search_call.searching")]
1517 ResponseFileSearchCallSearching(ResponseFileSearchCallSearching),
1518 #[serde(rename = "response.file_search_call.completed")]
1520 ResponseFileSearchCallCompleted(ResponseFileSearchCallCompleted),
1521 #[serde(rename = "response.web_search_call.in_progress")]
1523 ResponseWebSearchCallInProgress(ResponseWebSearchCallInProgress),
1524 #[serde(rename = "response.web_search_call.searching")]
1526 ResponseWebSearchCallSearching(ResponseWebSearchCallSearching),
1527 #[serde(rename = "response.web_search_call.completed")]
1529 ResponseWebSearchCallCompleted(ResponseWebSearchCallCompleted),
1530 #[serde(rename = "response.reasoning_summary_part.added")]
1532 ResponseReasoningSummaryPartAdded(ResponseReasoningSummaryPartAdded),
1533 #[serde(rename = "response.reasoning_summary_part.done")]
1535 ResponseReasoningSummaryPartDone(ResponseReasoningSummaryPartDone),
1536 #[serde(rename = "response.reasoning_summary_text.delta")]
1538 ResponseReasoningSummaryTextDelta(ResponseReasoningSummaryTextDelta),
1539 #[serde(rename = "response.reasoning_summary_text.done")]
1541 ResponseReasoningSummaryTextDone(ResponseReasoningSummaryTextDone),
1542 #[serde(rename = "response.reasoning_summary.delta")]
1544 ResponseReasoningSummaryDelta(ResponseReasoningSummaryDelta),
1545 #[serde(rename = "response.reasoning_summary.done")]
1547 ResponseReasoningSummaryDone(ResponseReasoningSummaryDone),
1548 #[serde(rename = "response.image_generation_call.in_progress")]
1550 ResponseImageGenerationCallInProgress(ResponseImageGenerationCallInProgress),
1551 #[serde(rename = "response.image_generation_call.generating")]
1553 ResponseImageGenerationCallGenerating(ResponseImageGenerationCallGenerating),
1554 #[serde(rename = "response.image_generation_call.partial_image")]
1556 ResponseImageGenerationCallPartialImage(ResponseImageGenerationCallPartialImage),
1557 #[serde(rename = "response.image_generation_call.completed")]
1559 ResponseImageGenerationCallCompleted(ResponseImageGenerationCallCompleted),
1560 #[serde(rename = "response.mcp_call_arguments.delta")]
1562 ResponseMcpCallArgumentsDelta(ResponseMcpCallArgumentsDelta),
1563 #[serde(rename = "response.mcp_call_arguments.done")]
1565 ResponseMcpCallArgumentsDone(ResponseMcpCallArgumentsDone),
1566 #[serde(rename = "response.mcp_call.completed")]
1568 ResponseMcpCallCompleted(ResponseMcpCallCompleted),
1569 #[serde(rename = "response.mcp_call.failed")]
1571 ResponseMcpCallFailed(ResponseMcpCallFailed),
1572 #[serde(rename = "response.mcp_call.in_progress")]
1574 ResponseMcpCallInProgress(ResponseMcpCallInProgress),
1575 #[serde(rename = "response.mcp_list_tools.completed")]
1577 ResponseMcpListToolsCompleted(ResponseMcpListToolsCompleted),
1578 #[serde(rename = "response.mcp_list_tools.failed")]
1580 ResponseMcpListToolsFailed(ResponseMcpListToolsFailed),
1581 #[serde(rename = "response.mcp_list_tools.in_progress")]
1583 ResponseMcpListToolsInProgress(ResponseMcpListToolsInProgress),
1584 #[serde(rename = "response.code_interpreter_call.in_progress")]
1586 ResponseCodeInterpreterCallInProgress(ResponseCodeInterpreterCallInProgress),
1587 #[serde(rename = "response.code_interpreter_call.interpreting")]
1589 ResponseCodeInterpreterCallInterpreting(ResponseCodeInterpreterCallInterpreting),
1590 #[serde(rename = "response.code_interpreter_call.completed")]
1592 ResponseCodeInterpreterCallCompleted(ResponseCodeInterpreterCallCompleted),
1593 #[serde(rename = "response.code_interpreter_call_code.delta")]
1595 ResponseCodeInterpreterCallCodeDelta(ResponseCodeInterpreterCallCodeDelta),
1596 #[serde(rename = "response.code_interpreter_call_code.done")]
1598 ResponseCodeInterpreterCallCodeDone(ResponseCodeInterpreterCallCodeDone),
1599 #[serde(rename = "response.output_text.annotation.added")]
1601 ResponseOutputTextAnnotationAdded(ResponseOutputTextAnnotationAdded),
1602 #[serde(rename = "error")]
1604 ResponseError(ResponseError),
1605
1606 #[serde(untagged)]
1608 Unknown(serde_json::Value),
1609}
1610
1611pub type ResponseStream = Pin<Box<dyn Stream<Item = Result<ResponseEvent, OpenAIError>> + Send>>;
1613
1614#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1615#[non_exhaustive]
1616pub struct ResponseCreated {
1617 pub sequence_number: u64,
1618 pub response: ResponseMetadata,
1619}
1620
1621#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1622#[non_exhaustive]
1623pub struct ResponseInProgress {
1624 pub sequence_number: u64,
1625 pub response: ResponseMetadata,
1626}
1627
1628#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1629#[non_exhaustive]
1630pub struct ResponseOutputItemAdded {
1631 pub sequence_number: u64,
1632 pub output_index: u32,
1633 pub item: OutputItem,
1634}
1635
1636#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1637#[non_exhaustive]
1638pub struct ResponseContentPartAdded {
1639 pub sequence_number: u64,
1640 pub item_id: String,
1641 pub output_index: u32,
1642 pub content_index: u32,
1643 pub part: ContentPart,
1644}
1645
1646#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1647#[non_exhaustive]
1648pub struct ResponseOutputTextDelta {
1649 pub sequence_number: u64,
1650 pub item_id: String,
1651 pub output_index: u32,
1652 pub content_index: u32,
1653 pub delta: String,
1654 #[serde(default, skip_serializing_if = "Option::is_none")]
1655 pub logprobs: Option<serde_json::Value>,
1656}
1657
1658#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1659#[non_exhaustive]
1660pub struct ResponseContentPartDone {
1661 pub sequence_number: u64,
1662 pub item_id: String,
1663 pub output_index: u32,
1664 pub content_index: u32,
1665 pub part: ContentPart,
1666}
1667
1668#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1669#[non_exhaustive]
1670pub struct ResponseOutputItemDone {
1671 pub sequence_number: u64,
1672 pub output_index: u32,
1673 pub item: OutputItem,
1674}
1675
1676#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1678#[non_exhaustive]
1679pub struct ResponseCompleted {
1680 pub sequence_number: u64,
1681 pub response: ResponseMetadata,
1682}
1683
1684#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1686#[non_exhaustive]
1687pub struct ResponseFailed {
1688 pub sequence_number: u64,
1689 pub response: ResponseMetadata,
1690}
1691
1692#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1694#[non_exhaustive]
1695pub struct ResponseIncomplete {
1696 pub sequence_number: u64,
1697 pub response: ResponseMetadata,
1698}
1699
1700#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1702#[non_exhaustive]
1703pub struct ResponseQueued {
1704 pub sequence_number: u64,
1705 pub response: ResponseMetadata,
1706}
1707
1708#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1710#[non_exhaustive]
1711pub struct ResponseOutputTextDone {
1712 pub sequence_number: u64,
1713 pub item_id: String,
1714 pub output_index: u32,
1715 pub content_index: u32,
1716 pub text: String,
1717 pub logprobs: Option<Vec<serde_json::Value>>,
1718}
1719
1720#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1722#[non_exhaustive]
1723pub struct ResponseRefusalDelta {
1724 pub sequence_number: u64,
1725 pub item_id: String,
1726 pub output_index: u32,
1727 pub content_index: u32,
1728 pub delta: String,
1729}
1730
1731#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1733#[non_exhaustive]
1734pub struct ResponseRefusalDone {
1735 pub sequence_number: u64,
1736 pub item_id: String,
1737 pub output_index: u32,
1738 pub content_index: u32,
1739 pub refusal: String,
1740}
1741
1742#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1744#[non_exhaustive]
1745pub struct ResponseFunctionCallArgumentsDelta {
1746 pub sequence_number: u64,
1747 pub item_id: String,
1748 pub output_index: u32,
1749 pub delta: String,
1750}
1751
1752#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1754#[non_exhaustive]
1755pub struct ResponseFunctionCallArgumentsDone {
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)]
2169#[non_exhaustive]
2170pub struct ResponseOutputTextAnnotationAdded {
2171 pub sequence_number: u64,
2172 pub item_id: String,
2173 pub output_index: u32,
2174 pub content_index: u32,
2175 pub annotation_index: u32,
2176 pub annotation: TextAnnotation,
2177}
2178
2179#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2181#[non_exhaustive]
2182pub struct TextAnnotation {
2183 #[serde(rename = "type")]
2184 pub annotation_type: String,
2185 pub text: String,
2186 pub start: u32,
2187 pub end: u32,
2188}