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