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 name: String,
1757 pub sequence_number: u64,
1758 pub item_id: String,
1759 pub output_index: u32,
1760 pub arguments: String,
1761}
1762
1763#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1765#[non_exhaustive]
1766pub struct ResponseError {
1767 pub sequence_number: u64,
1768 pub code: Option<String>,
1769 pub message: String,
1770 pub param: Option<String>,
1771}
1772
1773#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1775#[non_exhaustive]
1776pub struct ResponseFileSearchCallInProgress {
1777 pub sequence_number: u64,
1778 pub output_index: u32,
1779 pub item_id: String,
1780}
1781
1782#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1784#[non_exhaustive]
1785pub struct ResponseFileSearchCallSearching {
1786 pub sequence_number: u64,
1787 pub output_index: u32,
1788 pub item_id: String,
1789}
1790
1791#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1793#[non_exhaustive]
1794pub struct ResponseFileSearchCallCompleted {
1795 pub sequence_number: u64,
1796 pub output_index: u32,
1797 pub item_id: String,
1798}
1799
1800#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1802#[non_exhaustive]
1803pub struct ResponseWebSearchCallInProgress {
1804 pub sequence_number: u64,
1805 pub output_index: u32,
1806 pub item_id: String,
1807}
1808
1809#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1811#[non_exhaustive]
1812pub struct ResponseWebSearchCallSearching {
1813 pub sequence_number: u64,
1814 pub output_index: u32,
1815 pub item_id: String,
1816}
1817
1818#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1820#[non_exhaustive]
1821pub struct ResponseWebSearchCallCompleted {
1822 pub sequence_number: u64,
1823 pub output_index: u32,
1824 pub item_id: String,
1825}
1826
1827#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1829#[non_exhaustive]
1830pub struct ResponseReasoningSummaryPartAdded {
1831 pub sequence_number: u64,
1832 pub item_id: String,
1833 pub output_index: u32,
1834 pub summary_index: u32,
1835 pub part: serde_json::Value, }
1837
1838#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1840#[non_exhaustive]
1841pub struct ResponseReasoningSummaryPartDone {
1842 pub sequence_number: u64,
1843 pub item_id: String,
1844 pub output_index: u32,
1845 pub summary_index: u32,
1846 pub part: serde_json::Value,
1847}
1848
1849#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1851#[non_exhaustive]
1852pub struct ResponseReasoningSummaryTextDelta {
1853 pub sequence_number: u64,
1854 pub item_id: String,
1855 pub output_index: u32,
1856 pub summary_index: u32,
1857 pub delta: String,
1858}
1859
1860#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1862#[non_exhaustive]
1863pub struct ResponseReasoningSummaryTextDone {
1864 pub sequence_number: u64,
1865 pub item_id: String,
1866 pub output_index: u32,
1867 pub summary_index: u32,
1868 pub text: String,
1869}
1870
1871#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1873#[non_exhaustive]
1874pub struct ResponseReasoningSummaryDelta {
1875 pub sequence_number: u64,
1876 pub item_id: String,
1877 pub output_index: u32,
1878 pub summary_index: u32,
1879 pub delta: serde_json::Value,
1880}
1881
1882#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1884#[non_exhaustive]
1885pub struct ResponseReasoningSummaryDone {
1886 pub sequence_number: u64,
1887 pub item_id: String,
1888 pub output_index: u32,
1889 pub summary_index: u32,
1890 pub text: String,
1891}
1892
1893#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1895#[non_exhaustive]
1896pub struct ResponseImageGenerationCallInProgress {
1897 pub sequence_number: u64,
1898 pub output_index: u32,
1899 pub item_id: String,
1900}
1901
1902#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1904#[non_exhaustive]
1905pub struct ResponseImageGenerationCallGenerating {
1906 pub sequence_number: u64,
1907 pub output_index: u32,
1908 pub item_id: String,
1909}
1910
1911#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1913#[non_exhaustive]
1914pub struct ResponseImageGenerationCallPartialImage {
1915 pub sequence_number: u64,
1916 pub output_index: u32,
1917 pub item_id: String,
1918 pub partial_image_index: u32,
1919 pub partial_image_b64: String,
1920}
1921
1922#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1924#[non_exhaustive]
1925pub struct ResponseImageGenerationCallCompleted {
1926 pub sequence_number: u64,
1927 pub output_index: u32,
1928 pub item_id: String,
1929}
1930
1931#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1933#[non_exhaustive]
1934pub struct ResponseMcpCallArgumentsDelta {
1935 pub sequence_number: u64,
1936 pub output_index: u32,
1937 pub item_id: String,
1938 pub delta: String,
1939}
1940
1941#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1943#[non_exhaustive]
1944pub struct ResponseMcpCallArgumentsDone {
1945 pub sequence_number: u64,
1946 pub output_index: u32,
1947 pub item_id: String,
1948 pub arguments: String,
1949}
1950
1951#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1953#[non_exhaustive]
1954pub struct ResponseMcpCallCompleted {
1955 pub sequence_number: u64,
1956 pub output_index: u32,
1957 pub item_id: String,
1958}
1959
1960#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1962#[non_exhaustive]
1963pub struct ResponseMcpCallFailed {
1964 pub sequence_number: u64,
1965 pub output_index: u32,
1966 pub item_id: String,
1967}
1968
1969#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1971#[non_exhaustive]
1972pub struct ResponseMcpCallInProgress {
1973 pub sequence_number: u64,
1974 pub output_index: u32,
1975 pub item_id: String,
1976}
1977
1978#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1980#[non_exhaustive]
1981pub struct ResponseMcpListToolsCompleted {
1982 pub sequence_number: u64,
1983 pub output_index: u32,
1984 pub item_id: String,
1985}
1986
1987#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1989#[non_exhaustive]
1990pub struct ResponseMcpListToolsFailed {
1991 pub sequence_number: u64,
1992 pub output_index: u32,
1993 pub item_id: String,
1994}
1995
1996#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
1998#[non_exhaustive]
1999pub struct ResponseMcpListToolsInProgress {
2000 pub sequence_number: u64,
2001 pub output_index: u32,
2002 pub item_id: String,
2003}
2004
2005#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2007#[non_exhaustive]
2008pub struct ResponseCodeInterpreterCallInProgress {
2009 pub sequence_number: u64,
2010 pub output_index: u32,
2011 pub item_id: String,
2012}
2013
2014#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2016#[non_exhaustive]
2017pub struct ResponseCodeInterpreterCallInterpreting {
2018 pub sequence_number: u64,
2019 pub output_index: u32,
2020 pub item_id: String,
2021}
2022
2023#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2025#[non_exhaustive]
2026pub struct ResponseCodeInterpreterCallCompleted {
2027 pub sequence_number: u64,
2028 pub output_index: u32,
2029 pub item_id: String,
2030}
2031
2032#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2034#[non_exhaustive]
2035pub struct ResponseCodeInterpreterCallCodeDelta {
2036 pub sequence_number: u64,
2037 pub output_index: u32,
2038 pub item_id: String,
2039 pub delta: String,
2040}
2041
2042#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2044#[non_exhaustive]
2045pub struct ResponseCodeInterpreterCallCodeDone {
2046 pub sequence_number: u64,
2047 pub output_index: u32,
2048 pub item_id: String,
2049 pub code: String,
2050}
2051
2052#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2054#[non_exhaustive]
2055pub struct ResponseMetadata {
2056 pub id: String,
2057 #[serde(skip_serializing_if = "Option::is_none")]
2058 pub object: Option<String>,
2059 pub created_at: u64,
2060 pub status: Status,
2061 #[serde(skip_serializing_if = "Option::is_none")]
2062 pub model: Option<String>,
2063 #[serde(skip_serializing_if = "Option::is_none")]
2064 pub usage: Option<Usage>,
2065 #[serde(skip_serializing_if = "Option::is_none")]
2066 pub error: Option<ErrorObject>,
2067 #[serde(skip_serializing_if = "Option::is_none")]
2068 pub incomplete_details: Option<IncompleteDetails>,
2069 #[serde(skip_serializing_if = "Option::is_none")]
2070 pub input: Option<Input>,
2071 #[serde(skip_serializing_if = "Option::is_none")]
2072 pub instructions: Option<String>,
2073 #[serde(skip_serializing_if = "Option::is_none")]
2074 pub max_output_tokens: Option<u32>,
2075 #[serde(skip_serializing_if = "Option::is_none")]
2077 pub background: Option<bool>,
2078 #[serde(skip_serializing_if = "Option::is_none")]
2080 pub service_tier: Option<ServiceTier>,
2081 #[serde(skip_serializing_if = "Option::is_none")]
2083 pub top_logprobs: Option<u32>,
2084 #[serde(skip_serializing_if = "Option::is_none")]
2086 pub max_tool_calls: Option<u32>,
2087 #[serde(skip_serializing_if = "Option::is_none")]
2088 pub output: Option<Vec<OutputItem>>,
2089 #[serde(skip_serializing_if = "Option::is_none")]
2090 pub parallel_tool_calls: Option<bool>,
2091 #[serde(skip_serializing_if = "Option::is_none")]
2092 pub previous_response_id: Option<String>,
2093 #[serde(skip_serializing_if = "Option::is_none")]
2094 pub reasoning: Option<ReasoningConfig>,
2095 #[serde(skip_serializing_if = "Option::is_none")]
2096 pub store: Option<bool>,
2097 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub temperature: Option<f32>,
2099 #[serde(skip_serializing_if = "Option::is_none")]
2100 pub text: Option<TextConfig>,
2101 #[serde(skip_serializing_if = "Option::is_none")]
2102 pub tool_choice: Option<ToolChoice>,
2103 #[serde(skip_serializing_if = "Option::is_none")]
2104 pub tools: Option<Vec<ToolDefinition>>,
2105 #[serde(skip_serializing_if = "Option::is_none")]
2106 pub top_p: Option<f32>,
2107 #[serde(skip_serializing_if = "Option::is_none")]
2108 pub truncation: Option<Truncation>,
2109 #[serde(skip_serializing_if = "Option::is_none")]
2110 pub user: Option<String>,
2111 #[serde(skip_serializing_if = "Option::is_none")]
2112 pub metadata: Option<HashMap<String, String>>,
2113 #[serde(skip_serializing_if = "Option::is_none")]
2115 pub prompt_cache_key: Option<String>,
2116 #[serde(skip_serializing_if = "Option::is_none")]
2118 pub safety_identifier: Option<String>,
2119}
2120
2121#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2123#[serde(tag = "type")]
2124#[serde(rename_all = "snake_case")]
2125#[non_exhaustive]
2126pub enum OutputItem {
2127 Message(OutputMessage),
2128 FileSearchCall(FileSearchCallOutput),
2129 FunctionCall(FunctionCall),
2130 WebSearchCall(WebSearchCallOutput),
2131 ComputerCall(ComputerCallOutput),
2132 Reasoning(ReasoningItem),
2133 ImageGenerationCall(ImageGenerationCallOutput),
2134 CodeInterpreterCall(CodeInterpreterCallOutput),
2135 LocalShellCall(LocalShellCallOutput),
2136 McpCall(McpCallOutput),
2137 McpListTools(McpListToolsOutput),
2138 McpApprovalRequest(McpApprovalRequestOutput),
2139 CustomToolCall(CustomToolCallOutput),
2140}
2141
2142#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2143#[non_exhaustive]
2144pub struct CustomToolCallOutput {
2145 pub call_id: String,
2146 pub input: String,
2147 pub name: String,
2148 pub id: String,
2149}
2150
2151#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2153#[non_exhaustive]
2154pub struct ContentPart {
2155 #[serde(rename = "type")]
2156 pub part_type: String,
2157 pub text: Option<String>,
2158 #[serde(default, skip_serializing_if = "Option::is_none")]
2159 pub annotations: Option<Vec<serde_json::Value>>,
2160 #[serde(default, skip_serializing_if = "Option::is_none")]
2161 pub logprobs: Option<Vec<serde_json::Value>>,
2162}
2163
2164#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2170#[non_exhaustive]
2171pub struct ResponseOutputTextAnnotationAdded {
2172 pub sequence_number: u64,
2173 pub item_id: String,
2174 pub output_index: u32,
2175 pub content_index: u32,
2176 pub annotation_index: u32,
2177 pub annotation: TextAnnotation,
2178}
2179
2180#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
2182#[non_exhaustive]
2183pub struct TextAnnotation {
2184 #[serde(rename = "type")]
2185 pub annotation_type: String,
2186 pub text: String,
2187 pub start: u32,
2188 pub end: u32,
2189}