1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::super::common::*;
6use super::response_items::ResponseOutputItem;
7use super::response_tools::ResponseTool;
8use super::responses::{ResponseConversationParam, ResponseInput};
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct ContextManagement {
12 #[serde(rename = "type")]
13 pub type_: ContextManagementType,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub compact_threshold: Option<f64>,
16 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
17 pub extra: Extra,
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21pub struct PromptRef {
22 pub id: String,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub version: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub variables: Option<PromptVariables>,
27 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
28 pub extra: Extra,
29}
30
31pub type PromptVariables = BTreeMap<String, PromptVariableValue>;
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34#[serde(untagged)]
35pub enum PromptVariableValue {
36 Text(String),
37 InputContent(PromptVariableInputContentPart),
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
41#[serde(tag = "type")]
42pub enum PromptVariableInputContentPart {
43 #[serde(rename = "input_text")]
44 InputText {
45 text: String,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 prompt_cache_breakpoint: Option<PromptCacheBreakpoint>,
48 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
49 extra: Extra,
50 },
51 #[serde(rename = "input_image")]
52 InputImage {
53 #[serde(skip_serializing_if = "Option::is_none")]
54 detail: Option<DetailLevel>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 file_id: Option<String>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 image_url: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 prompt_cache_breakpoint: Option<PromptCacheBreakpoint>,
61 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
62 extra: Extra,
63 },
64 #[serde(rename = "input_file")]
65 InputFile {
66 #[serde(skip_serializing_if = "Option::is_none")]
67 detail: Option<InputFileDetailLevel>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 file_data: Option<String>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 file_id: Option<String>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 file_url: Option<String>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 filename: Option<String>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 prompt_cache_breakpoint: Option<PromptCacheBreakpoint>,
78 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
79 extra: Extra,
80 },
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
84pub struct ReasoningConfig {
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub context: Option<ReasoningContext>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub effort: Option<ReasoningEffort>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub mode: Option<ReasoningMode>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub summary: Option<ReasoningSummary>,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub generate_summary: Option<ReasoningSummary>,
95 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
96 pub extra: Extra,
97}
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
100pub struct TextConfig {
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub format: Option<ResponseFormat>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub verbosity: Option<Verbosity>,
105 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
106 pub extra: Extra,
107}
108
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
110pub struct ResponseStreamOptions {
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub include_obfuscation: Option<bool>,
113 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
114 pub extra: Extra,
115}
116
117#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
118pub struct ResponseObject {
119 pub id: String,
120 pub created_at: u64,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub background: Option<bool>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub completed_at: Option<u64>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub conversation: Option<ResponseConversationParam>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub error: Option<ResponseError>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub incomplete_details: Option<IncompleteDetails>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub instructions: Option<ResponseInput>,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub max_output_tokens: Option<u32>,
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub max_tool_calls: Option<u32>,
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub metadata: Option<Metadata>,
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub model: Option<OpenAiModelId>,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub moderation: Option<ResponseModeration>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub multi_agent: Option<serde_json::Value>,
145 pub object: ResponseObjectType,
146 pub output: Vec<ResponseOutputItem>,
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub output_text: Option<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub parallel_tool_calls: Option<bool>,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub prompt: Option<PromptRef>,
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub prompt_cache_key: Option<String>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub prompt_cache_options: Option<PromptCacheOptions>,
157 #[serde(skip_serializing_if = "Option::is_none")]
158 pub prompt_cache_retention: Option<PromptCacheRetention>,
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub previous_response_id: Option<String>,
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub reasoning: Option<ReasoningConfig>,
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub safety_identifier: Option<String>,
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub service_tier: Option<ServiceTier>,
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub status: Option<ResponseStatus>,
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub store: Option<bool>,
171 #[serde(skip_serializing_if = "Option::is_none")]
172 pub temperature: Option<f64>,
173 #[serde(skip_serializing_if = "Option::is_none")]
174 pub text: Option<TextConfig>,
175 #[serde(skip_serializing_if = "Option::is_none")]
176 pub tool_choice: Option<ResponseToolChoice>,
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub tools: Option<Vec<ResponseTool>>,
179 #[serde(skip_serializing_if = "Option::is_none")]
180 pub top_logprobs: Option<u32>,
181 #[serde(skip_serializing_if = "Option::is_none")]
182 pub top_p: Option<f64>,
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub truncation: Option<TruncationStrategy>,
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub usage: Option<ResponseUsage>,
187 #[serde(skip_serializing_if = "Option::is_none")]
188 pub user: Option<String>,
189 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
190 pub extra: Extra,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
194pub struct ResponseError {
195 pub code: ResponseErrorCode,
196 pub message: String,
197 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
198 pub extra: Extra,
199}
200
201#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
202pub struct ResponseModeration {
203 pub input: ResponseModerationOutcome,
204 pub output: ResponseModerationOutcome,
205 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
206 pub extra: Extra,
207}
208
209#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
210#[serde(untagged)]
211pub enum ResponseModerationOutcome {
212 Result(ModerationResult),
213 Error(ModerationError),
214}
215
216#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
217pub struct IncompleteDetails {
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub reason: Option<IncompleteReason>,
220 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
221 pub extra: Extra,
222}
223
224#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
225pub struct ResponseUsage {
226 pub input_tokens: u32,
227 pub output_tokens: u32,
228 pub total_tokens: u32,
229 #[serde(skip_serializing_if = "Option::is_none")]
230 pub input_tokens_details: Option<ResponseInputTokensDetails>,
231 pub output_tokens_details: ResponseOutputTokensDetails,
232 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
233 pub extra: Extra,
234}
235
236#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
237pub struct ResponseInputTokensDetails {
238 #[serde(default)]
239 pub cache_write_tokens: u32,
240 #[serde(default)]
241 pub cached_tokens: u32,
242 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
243 pub extra: Extra,
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
247pub struct ResponseOutputTokensDetails {
248 pub reasoning_tokens: u32,
249 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
250 pub extra: Extra,
251}