1use serde::{Deserialize, Serialize};
2
3use super::super::{
4 CacheControl, CitationConfig, ClaudeModel, McpToolset, ResponseInclusion, TypedObject,
5};
6use super::{CustomToolType, JsonSchema, ToolCommon, ToolCommonWithoutInputExamples, UserLocation};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(untagged)]
10pub enum Tool {
11 WebFetch(WebFetchTool),
12 WebSearch(WebSearchTool),
13 Advisor(AdvisorTool),
14 Computer(ComputerTool),
15 TextEditor(TextEditorTool),
16 Command(CommandTool),
17 McpToolset(McpToolset),
18 Custom(CustomTool),
19 Unknown(TypedObject),
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
23pub struct CustomTool {
24 pub input_schema: JsonSchema,
25 pub name: String,
26 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
27 pub type_: Option<CustomToolType>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub description: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub eager_input_streaming: Option<bool>,
32 #[serde(flatten)]
33 pub common: ToolCommon,
34}
35
36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
37#[serde(untagged)]
38pub enum CommandTool {
39 Bash20241022(BashTool20241022),
40 Bash20250124(BashTool20250124),
41 CodeExecution20250522(CodeExecutionTool20250522),
42 CodeExecution20250825(CodeExecutionTool20250825),
43 CodeExecution20260120(CodeExecutionTool20260120),
44 CodeExecution20260521(CodeExecutionTool20260521),
45 Memory20250818(MemoryTool20250818),
46 ToolSearchBm25(ToolSearchBm25Tool),
47 ToolSearchRegex(ToolSearchRegexTool),
48}
49
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
51pub struct BashTool20241022 {
52 pub name: BashToolName,
53 #[serde(rename = "type")]
54 pub type_: BashTool20241022Type,
55 #[serde(flatten)]
56 pub common: ToolCommon,
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
60pub struct BashTool20250124 {
61 pub name: BashToolName,
62 #[serde(rename = "type")]
63 pub type_: BashTool20250124Type,
64 #[serde(flatten)]
65 pub common: ToolCommon,
66}
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
69pub struct CodeExecutionTool20250522 {
70 pub name: CodeExecutionToolName,
71 #[serde(rename = "type")]
72 pub type_: CodeExecutionTool20250522Type,
73 #[serde(flatten)]
74 pub common: ToolCommonWithoutInputExamples,
75}
76
77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub struct CodeExecutionTool20250825 {
79 pub name: CodeExecutionToolName,
80 #[serde(rename = "type")]
81 pub type_: CodeExecutionTool20250825Type,
82 #[serde(flatten)]
83 pub common: ToolCommonWithoutInputExamples,
84}
85
86#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87pub struct CodeExecutionTool20260120 {
88 pub name: CodeExecutionToolName,
89 #[serde(rename = "type")]
90 pub type_: CodeExecutionTool20260120Type,
91 #[serde(flatten)]
92 pub common: ToolCommonWithoutInputExamples,
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
96pub struct CodeExecutionTool20260521 {
97 pub name: CodeExecutionToolName,
98 #[serde(rename = "type")]
99 pub type_: CodeExecutionTool20260521Type,
100 #[serde(flatten)]
101 pub common: ToolCommonWithoutInputExamples,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
105pub struct MemoryTool20250818 {
106 pub name: MemoryToolName,
107 #[serde(rename = "type")]
108 pub type_: MemoryTool20250818Type,
109 #[serde(flatten)]
110 pub common: ToolCommon,
111}
112
113#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
114pub struct ToolSearchBm25Tool {
115 pub name: ToolSearchBm25ToolName,
116 #[serde(rename = "type")]
117 pub type_: ToolSearchBm25ToolType,
118 #[serde(flatten)]
119 pub common: ToolCommonWithoutInputExamples,
120}
121
122#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
123pub struct ToolSearchRegexTool {
124 pub name: ToolSearchRegexToolName,
125 #[serde(rename = "type")]
126 pub type_: ToolSearchRegexToolType,
127 #[serde(flatten)]
128 pub common: ToolCommonWithoutInputExamples,
129}
130
131#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
132#[serde(untagged)]
133pub enum TextEditorTool {
134 TextEditor20241022(TextEditorTool20241022),
135 TextEditor20250124(TextEditorTool20250124),
136 TextEditor20250429(TextEditorTool20250429),
137 TextEditor20250728(TextEditorTool20250728),
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
141pub struct TextEditorTool20241022 {
142 pub name: StrReplaceEditorToolName,
143 #[serde(rename = "type")]
144 pub type_: TextEditorTool20241022Type,
145 #[serde(flatten)]
146 pub common: ToolCommon,
147}
148
149#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
150pub struct TextEditorTool20250124 {
151 pub name: StrReplaceEditorToolName,
152 #[serde(rename = "type")]
153 pub type_: TextEditorTool20250124Type,
154 #[serde(flatten)]
155 pub common: ToolCommon,
156}
157
158#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
159pub struct TextEditorTool20250429 {
160 pub name: StrReplaceBasedEditToolName,
161 #[serde(rename = "type")]
162 pub type_: TextEditorTool20250429Type,
163 #[serde(flatten)]
164 pub common: ToolCommon,
165}
166
167#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
168pub struct TextEditorTool20250728 {
169 pub name: StrReplaceBasedEditToolName,
170 #[serde(rename = "type")]
171 pub type_: TextEditorTool20250728Type,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub max_characters: Option<u64>,
174 #[serde(flatten)]
175 pub common: ToolCommon,
176}
177
178#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
179#[serde(untagged)]
180pub enum ComputerTool {
181 Computer20241022(ComputerTool20241022),
182 Computer20250124(ComputerTool20250124),
183 Computer20251124(ComputerTool20251124),
184}
185
186#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
187pub struct ComputerTool20241022 {
188 pub display_height_px: u64,
189 pub display_width_px: u64,
190 pub name: ComputerToolName,
191 #[serde(rename = "type")]
192 pub type_: ComputerTool20241022Type,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub display_number: Option<u64>,
195 #[serde(flatten)]
196 pub common: ToolCommon,
197}
198
199#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
200pub struct ComputerTool20250124 {
201 pub display_height_px: u64,
202 pub display_width_px: u64,
203 pub name: ComputerToolName,
204 #[serde(rename = "type")]
205 pub type_: ComputerTool20250124Type,
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub display_number: Option<u64>,
208 #[serde(flatten)]
209 pub common: ToolCommon,
210}
211
212#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
213pub struct ComputerTool20251124 {
214 pub display_height_px: u64,
215 pub display_width_px: u64,
216 pub name: ComputerToolName,
217 #[serde(rename = "type")]
218 pub type_: ComputerTool20251124Type,
219 #[serde(skip_serializing_if = "Option::is_none")]
220 pub display_number: Option<u64>,
221 #[serde(skip_serializing_if = "Option::is_none")]
222 pub enable_zoom: Option<bool>,
223 #[serde(flatten)]
224 pub common: ToolCommon,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
228#[serde(untagged)]
229pub enum WebSearchTool {
230 WebSearch20250305(WebSearchTool20250305),
231 WebSearch20260209(WebSearchTool20260209),
232 WebSearch20260318(WebSearchTool20260318),
233}
234
235#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
236pub struct WebSearchTool20250305 {
237 pub name: WebSearchToolName,
238 #[serde(rename = "type")]
239 pub type_: WebSearchTool20250305Type,
240 #[serde(flatten)]
241 pub params: WebSearchToolParams,
242 #[serde(flatten)]
243 pub common: ToolCommonWithoutInputExamples,
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
247pub struct WebSearchTool20260209 {
248 pub name: WebSearchToolName,
249 #[serde(rename = "type")]
250 pub type_: WebSearchTool20260209Type,
251 #[serde(flatten)]
252 pub params: WebSearchToolParams,
253 #[serde(flatten)]
254 pub common: ToolCommonWithoutInputExamples,
255}
256
257#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
258pub struct WebSearchTool20260318 {
259 pub name: WebSearchToolName,
260 #[serde(rename = "type")]
261 pub type_: WebSearchTool20260318Type,
262 #[serde(flatten)]
263 pub params: WebSearchToolParams,
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub response_inclusion: Option<ResponseInclusion>,
266 #[serde(flatten)]
267 pub common: ToolCommonWithoutInputExamples,
268}
269
270#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
271pub struct WebSearchToolParams {
272 #[serde(skip_serializing_if = "Option::is_none")]
273 pub allowed_domains: Option<Vec<String>>,
274 #[serde(skip_serializing_if = "Option::is_none")]
275 pub blocked_domains: Option<Vec<String>>,
276 #[serde(skip_serializing_if = "Option::is_none")]
277 pub max_uses: Option<u64>,
278 #[serde(skip_serializing_if = "Option::is_none")]
279 pub user_location: Option<UserLocation>,
280}
281
282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
283#[serde(untagged)]
284pub enum WebFetchTool {
285 WebFetch20250910(WebFetchTool20250910),
286 WebFetch20260209(WebFetchTool20260209),
287 WebFetch20260309(WebFetchTool20260309),
288 WebFetch20260318(WebFetchTool20260318),
289}
290
291#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
292pub struct WebFetchTool20250910 {
293 pub name: WebFetchToolName,
294 #[serde(rename = "type")]
295 pub type_: WebFetchTool20250910Type,
296 #[serde(flatten)]
297 pub params: WebFetchToolParams,
298 #[serde(flatten)]
299 pub common: ToolCommonWithoutInputExamples,
300}
301
302#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
303pub struct WebFetchTool20260209 {
304 pub name: WebFetchToolName,
305 #[serde(rename = "type")]
306 pub type_: WebFetchTool20260209Type,
307 #[serde(flatten)]
308 pub params: WebFetchToolParams,
309 #[serde(flatten)]
310 pub common: ToolCommonWithoutInputExamples,
311}
312
313#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
314pub struct WebFetchTool20260309 {
315 pub name: WebFetchToolName,
316 #[serde(rename = "type")]
317 pub type_: WebFetchTool20260309Type,
318 #[serde(flatten)]
319 pub params: WebFetchToolParams,
320 #[serde(skip_serializing_if = "Option::is_none")]
321 pub use_cache: Option<bool>,
322 #[serde(flatten)]
323 pub common: ToolCommonWithoutInputExamples,
324}
325
326#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
327pub struct WebFetchTool20260318 {
328 pub name: WebFetchToolName,
329 #[serde(rename = "type")]
330 pub type_: WebFetchTool20260318Type,
331 #[serde(flatten)]
332 pub params: WebFetchToolParams,
333 #[serde(skip_serializing_if = "Option::is_none")]
334 pub response_inclusion: Option<ResponseInclusion>,
335 #[serde(skip_serializing_if = "Option::is_none")]
336 pub use_cache: Option<bool>,
337 #[serde(flatten)]
338 pub common: ToolCommonWithoutInputExamples,
339}
340
341#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
342pub struct WebFetchToolParams {
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub allowed_domains: Option<Vec<String>>,
345 #[serde(skip_serializing_if = "Option::is_none")]
346 pub blocked_domains: Option<Vec<String>>,
347 #[serde(skip_serializing_if = "Option::is_none")]
348 pub citations: Option<CitationConfig>,
349 #[serde(skip_serializing_if = "Option::is_none")]
350 pub max_content_tokens: Option<u64>,
351 #[serde(skip_serializing_if = "Option::is_none")]
352 pub max_uses: Option<u64>,
353}
354
355#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
356pub struct AdvisorTool {
357 pub model: ClaudeModel,
358 pub name: AdvisorToolName,
359 #[serde(rename = "type")]
360 pub type_: AdvisorTool20260301Type,
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub caching: Option<CacheControl>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub max_tokens: Option<u64>,
366 #[serde(skip_serializing_if = "Option::is_none")]
367 pub max_uses: Option<u64>,
368 #[serde(flatten)]
369 pub common: ToolCommonWithoutInputExamples,
370}
371
372macro_rules! single_wire_enum {
373 ($name:ident { $variant:ident => $wire:literal }) => {
374 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
375 pub enum $name {
376 #[serde(rename = $wire)]
377 $variant,
378 }
379 };
380}
381
382single_wire_enum!(BashToolName { Bash => "bash" });
383single_wire_enum!(BashTool20241022Type { Bash20241022 => "bash_20241022" });
384single_wire_enum!(BashTool20250124Type { Bash20250124 => "bash_20250124" });
385single_wire_enum!(CodeExecutionToolName { CodeExecution => "code_execution" });
386single_wire_enum!(CodeExecutionTool20250522Type { CodeExecution20250522 => "code_execution_20250522" });
387single_wire_enum!(CodeExecutionTool20250825Type { CodeExecution20250825 => "code_execution_20250825" });
388single_wire_enum!(CodeExecutionTool20260120Type { CodeExecution20260120 => "code_execution_20260120" });
389single_wire_enum!(CodeExecutionTool20260521Type { CodeExecution20260521 => "code_execution_20260521" });
390single_wire_enum!(MemoryToolName { Memory => "memory" });
391single_wire_enum!(MemoryTool20250818Type { Memory20250818 => "memory_20250818" });
392single_wire_enum!(ToolSearchBm25ToolName { ToolSearchBm25 => "tool_search_tool_bm25" });
393single_wire_enum!(ToolSearchRegexToolName { ToolSearchRegex => "tool_search_tool_regex" });
394single_wire_enum!(StrReplaceEditorToolName { StrReplaceEditor => "str_replace_editor" });
395single_wire_enum!(StrReplaceBasedEditToolName { StrReplaceBasedEditTool => "str_replace_based_edit_tool" });
396single_wire_enum!(TextEditorTool20241022Type { TextEditor20241022 => "text_editor_20241022" });
397single_wire_enum!(TextEditorTool20250124Type { TextEditor20250124 => "text_editor_20250124" });
398single_wire_enum!(TextEditorTool20250429Type { TextEditor20250429 => "text_editor_20250429" });
399single_wire_enum!(TextEditorTool20250728Type { TextEditor20250728 => "text_editor_20250728" });
400single_wire_enum!(ComputerToolName { Computer => "computer" });
401single_wire_enum!(ComputerTool20241022Type { Computer20241022 => "computer_20241022" });
402single_wire_enum!(ComputerTool20250124Type { Computer20250124 => "computer_20250124" });
403single_wire_enum!(ComputerTool20251124Type { Computer20251124 => "computer_20251124" });
404single_wire_enum!(WebSearchToolName { WebSearch => "web_search" });
405single_wire_enum!(WebSearchTool20250305Type { WebSearch20250305 => "web_search_20250305" });
406single_wire_enum!(WebSearchTool20260209Type { WebSearch20260209 => "web_search_20260209" });
407single_wire_enum!(WebSearchTool20260318Type { WebSearch20260318 => "web_search_20260318" });
408single_wire_enum!(WebFetchToolName { WebFetch => "web_fetch" });
409single_wire_enum!(WebFetchTool20250910Type { WebFetch20250910 => "web_fetch_20250910" });
410single_wire_enum!(WebFetchTool20260209Type { WebFetch20260209 => "web_fetch_20260209" });
411single_wire_enum!(WebFetchTool20260309Type { WebFetch20260309 => "web_fetch_20260309" });
412single_wire_enum!(WebFetchTool20260318Type { WebFetch20260318 => "web_fetch_20260318" });
413single_wire_enum!(AdvisorToolName { Advisor => "advisor" });
414single_wire_enum!(AdvisorTool20260301Type { Advisor20260301 => "advisor_20260301" });
415
416#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
417pub enum ToolSearchBm25ToolType {
418 #[serde(rename = "tool_search_tool_bm25_20251119")]
419 ToolSearchBm2520251119,
420 #[serde(rename = "tool_search_tool_bm25")]
421 ToolSearchBm25,
422}
423
424#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
425pub enum ToolSearchRegexToolType {
426 #[serde(rename = "tool_search_tool_regex_20251119")]
427 ToolSearchRegex20251119,
428 #[serde(rename = "tool_search_tool_regex")]
429 ToolSearchRegex,
430}