1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::super::super::common::*;
7use super::super::response_tools::*;
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(tag = "type")]
11#[non_exhaustive]
12pub enum ResponseTool {
13 #[serde(rename = "function")]
14 Function {
15 name: String,
16 parameters: JsonSchema,
17 #[serde(skip_serializing_if = "Option::is_none")]
19 strict: Option<bool>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 defer_loading: Option<bool>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 description: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 allowed_callers: Option<Vec<ToolCaller>>,
26 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
27 extra: Extra,
28 },
29 #[serde(rename = "file_search")]
30 FileSearch {
31 vector_store_ids: Vec<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 filters: Option<FileSearchFilter>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 max_num_results: Option<u32>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 ranking_options: Option<FileSearchRankingOptions>,
38 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
39 extra: Extra,
40 },
41 #[serde(rename = "computer")]
42 Computer {
43 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
44 extra: Extra,
45 },
46 #[serde(rename = "computer_use_preview")]
47 ComputerUsePreview {
48 display_height: u32,
49 display_width: u32,
50 environment: ComputerUseEnvironment,
51 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
52 extra: Extra,
53 },
54 #[serde(rename = "web_search")]
55 WebSearch {
56 #[serde(skip_serializing_if = "Option::is_none")]
57 filters: Option<WebSearchFilters>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 search_context_size: Option<SearchContextSize>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 user_location: Option<WebSearchUserLocation>,
62 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
63 extra: Extra,
64 },
65 #[serde(rename = "web_search_2025_08_26")]
66 WebSearch20250826 {
67 #[serde(skip_serializing_if = "Option::is_none")]
68 filters: Option<WebSearchFilters>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 search_context_size: Option<SearchContextSize>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 user_location: Option<WebSearchUserLocation>,
73 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
74 extra: Extra,
75 },
76 #[serde(rename = "x_search")]
77 XSearch {
78 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
79 extra: Extra,
80 },
81 #[serde(rename = "collections_search")]
82 CollectionsSearch {
83 vector_store_ids: Vec<String>,
84 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
85 extra: Extra,
86 },
87 #[serde(rename = "mcp")]
88 Mcp {
89 server_label: String,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 allowed_tools: Option<McpAllowedTools>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 authorization: Option<String>,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 connector_id: Option<McpConnectorId>,
96 #[serde(skip_serializing_if = "Option::is_none")]
97 defer_loading: Option<bool>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 headers: Option<BTreeMap<String, String>>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 require_approval: Option<McpRequireApproval>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 server_description: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 server_url: Option<String>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 tunnel_id: Option<String>,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 allowed_callers: Option<Vec<ToolCaller>>,
110 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
111 extra: Extra,
112 },
113 #[serde(rename = "code_execution")]
114 CodeExecution {
115 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
116 extra: Extra,
117 },
118 #[serde(rename = "code_interpreter")]
119 CodeInterpreter {
120 container: CodeInterpreterContainer,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 allowed_callers: Option<Vec<ToolCaller>>,
123 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
124 extra: Extra,
125 },
126 #[serde(rename = "image_generation")]
127 ImageGeneration {
128 #[serde(skip_serializing_if = "Option::is_none")]
129 action: Option<ImageGenerationAction>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 background: Option<ImageBackground>,
132 #[serde(skip_serializing_if = "Option::is_none")]
133 input_fidelity: Option<ImageInputFidelity>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 input_image_mask: Option<ImageMask>,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 model: Option<OpenAiModelId>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 moderation: Option<ImageModeration>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 output_compression: Option<u32>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 output_format: Option<ImageOutputFormat>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 partial_images: Option<u32>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 quality: Option<ImageEditQuality>,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 size: Option<ResponseImageGenerationSize>,
150 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
151 extra: Extra,
152 },
153 #[serde(rename = "local_shell")]
154 LocalShell {
155 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
156 extra: Extra,
157 },
158 #[serde(rename = "shell")]
159 Shell {
160 #[serde(skip_serializing_if = "Option::is_none")]
161 environment: Option<ResponseShellEnvironment>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 allowed_callers: Option<Vec<ToolCaller>>,
164 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
165 extra: Extra,
166 },
167 #[serde(rename = "custom")]
168 Custom {
169 name: String,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 defer_loading: Option<bool>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 description: Option<String>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 format: Option<CustomToolInputFormat>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 allowed_callers: Option<Vec<ToolCaller>>,
178 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
179 extra: Extra,
180 },
181 #[serde(rename = "namespace")]
182 Namespace {
183 description: String,
184 name: String,
185 tools: Vec<ResponseNamespaceTool>,
186 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
187 extra: Extra,
188 },
189 #[serde(rename = "tool_search")]
190 ToolSearch {
191 #[serde(skip_serializing_if = "Option::is_none")]
192 description: Option<String>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 execution: Option<ToolSearchExecution>,
195 #[serde(skip_serializing_if = "Option::is_none")]
196 parameters: Option<Value>,
197 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
198 extra: Extra,
199 },
200 #[serde(rename = "programmatic_tool_calling")]
201 ProgrammaticToolCalling {
202 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
203 extra: Extra,
204 },
205 #[serde(rename = "web_search_preview")]
206 WebSearchPreview {
207 #[serde(skip_serializing_if = "Option::is_none")]
208 search_content_types: Option<Vec<SearchContentType>>,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 search_context_size: Option<SearchContextSize>,
211 #[serde(skip_serializing_if = "Option::is_none")]
212 user_location: Option<WebSearchPreviewUserLocation>,
213 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
214 extra: Extra,
215 },
216 #[serde(rename = "web_search_preview_2025_03_11")]
217 WebSearchPreview20250311 {
218 #[serde(skip_serializing_if = "Option::is_none")]
219 search_content_types: Option<Vec<SearchContentType>>,
220 #[serde(skip_serializing_if = "Option::is_none")]
221 search_context_size: Option<SearchContextSize>,
222 #[serde(skip_serializing_if = "Option::is_none")]
223 user_location: Option<WebSearchPreviewUserLocation>,
224 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
225 extra: Extra,
226 },
227 #[serde(rename = "apply_patch")]
228 ApplyPatch {
229 #[serde(skip_serializing_if = "Option::is_none")]
230 allowed_callers: Option<Vec<ToolCaller>>,
231 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
232 extra: Extra,
233 },
234}
235
236#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
237#[serde(tag = "type")]
238#[non_exhaustive]
239pub enum ResponseNamespaceTool {
240 #[serde(rename = "function")]
241 Function {
242 name: String,
243 #[serde(skip_serializing_if = "Option::is_none")]
244 defer_loading: Option<bool>,
245 #[serde(skip_serializing_if = "Option::is_none")]
246 description: Option<String>,
247 #[serde(skip_serializing_if = "Option::is_none")]
248 parameters: Option<Value>,
249 #[serde(skip_serializing_if = "Option::is_none")]
250 strict: Option<bool>,
251 #[serde(skip_serializing_if = "Option::is_none")]
252 allowed_callers: Option<Vec<ToolCaller>>,
253 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
254 extra: Extra,
255 },
256 #[serde(rename = "custom")]
257 Custom {
258 name: String,
259 #[serde(skip_serializing_if = "Option::is_none")]
260 defer_loading: Option<bool>,
261 #[serde(skip_serializing_if = "Option::is_none")]
262 description: Option<String>,
263 #[serde(skip_serializing_if = "Option::is_none")]
264 format: Option<CustomToolInputFormat>,
265 #[serde(skip_serializing_if = "Option::is_none")]
266 allowed_callers: Option<Vec<ToolCaller>>,
267 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
268 extra: Extra,
269 },
270}