1use serde::{Deserialize, Serialize};
2
3use super::super::{AllowedToolsMode, Extra, ToolChoiceMode};
4use super::definitions::NamedTool;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7#[serde(untagged)]
8#[non_exhaustive]
9pub enum ChatToolChoice {
10 Mode(ToolChoiceMode),
11 Allowed(ChatAllowedToolChoice),
12 Named(ChatNamedToolChoice),
13}
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16#[serde(untagged)]
17#[non_exhaustive]
18pub enum ResponseToolChoice {
19 Mode(ToolChoiceMode),
20 Allowed(ResponseAllowedToolChoice),
21 Hosted(ResponseHostedToolChoice),
22 Function(ResponseFunctionToolChoice),
23 Mcp(ResponseMcpToolChoice),
24 Custom(ResponseCustomToolChoice),
25 ApplyPatch(ResponseApplyPatchToolChoice),
26 Shell(ResponseShellToolChoice),
27}
28
29#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
30#[non_exhaustive]
31pub struct ChatAllowedToolChoice {
32 pub allowed_tools: ChatAllowedTools,
33 #[serde(rename = "type")]
34 pub type_: AllowedToolsType,
35 #[serde(
36 default,
37 flatten,
38 skip_serializing_if = "std::collections::BTreeMap::is_empty"
39 )]
40 pub extra: Extra,
41}
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
44#[non_exhaustive]
45pub struct ChatAllowedTools {
46 pub mode: AllowedToolsMode,
47 pub tools: Vec<Extra>,
48 #[serde(
49 default,
50 flatten,
51 skip_serializing_if = "std::collections::BTreeMap::is_empty"
52 )]
53 pub extra: Extra,
54}
55
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
57#[non_exhaustive]
58pub struct ResponseAllowedToolChoice {
59 pub mode: AllowedToolsMode,
60 pub tools: Vec<ResponseAllowedTool>,
61 #[serde(rename = "type")]
62 pub type_: AllowedToolsType,
63 #[serde(
64 default,
65 flatten,
66 skip_serializing_if = "std::collections::BTreeMap::is_empty"
67 )]
68 pub extra: Extra,
69}
70
71#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
72#[serde(tag = "type")]
73#[non_exhaustive]
74pub enum ResponseAllowedTool {
75 #[serde(rename = "function")]
76 Function {
77 name: String,
78 #[serde(
79 default,
80 flatten,
81 skip_serializing_if = "std::collections::BTreeMap::is_empty"
82 )]
83 extra: Extra,
84 },
85 #[serde(rename = "custom")]
86 Custom {
87 name: String,
88 #[serde(
89 default,
90 flatten,
91 skip_serializing_if = "std::collections::BTreeMap::is_empty"
92 )]
93 extra: Extra,
94 },
95 #[serde(rename = "mcp")]
96 Mcp {
97 server_label: String,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 name: Option<String>,
100 #[serde(
101 default,
102 flatten,
103 skip_serializing_if = "std::collections::BTreeMap::is_empty"
104 )]
105 extra: Extra,
106 },
107 #[serde(rename = "file_search")]
108 FileSearch {
109 #[serde(
110 default,
111 flatten,
112 skip_serializing_if = "std::collections::BTreeMap::is_empty"
113 )]
114 extra: Extra,
115 },
116 #[serde(rename = "web_search_preview")]
117 WebSearchPreview {
118 #[serde(
119 default,
120 flatten,
121 skip_serializing_if = "std::collections::BTreeMap::is_empty"
122 )]
123 extra: Extra,
124 },
125 #[serde(rename = "computer")]
126 Computer {
127 #[serde(
128 default,
129 flatten,
130 skip_serializing_if = "std::collections::BTreeMap::is_empty"
131 )]
132 extra: Extra,
133 },
134 #[serde(rename = "computer_use_preview")]
135 ComputerUsePreview {
136 #[serde(
137 default,
138 flatten,
139 skip_serializing_if = "std::collections::BTreeMap::is_empty"
140 )]
141 extra: Extra,
142 },
143 #[serde(rename = "computer_use")]
144 ComputerUse {
145 #[serde(
146 default,
147 flatten,
148 skip_serializing_if = "std::collections::BTreeMap::is_empty"
149 )]
150 extra: Extra,
151 },
152 #[serde(rename = "web_search_preview_2025_03_11")]
153 WebSearchPreview20250311 {
154 #[serde(
155 default,
156 flatten,
157 skip_serializing_if = "std::collections::BTreeMap::is_empty"
158 )]
159 extra: Extra,
160 },
161 #[serde(rename = "image_generation")]
162 ImageGeneration {
163 #[serde(
164 default,
165 flatten,
166 skip_serializing_if = "std::collections::BTreeMap::is_empty"
167 )]
168 extra: Extra,
169 },
170 #[serde(rename = "code_interpreter")]
171 CodeInterpreter {
172 #[serde(
173 default,
174 flatten,
175 skip_serializing_if = "std::collections::BTreeMap::is_empty"
176 )]
177 extra: Extra,
178 },
179 #[serde(rename = "local_shell")]
180 LocalShell {
181 #[serde(
182 default,
183 flatten,
184 skip_serializing_if = "std::collections::BTreeMap::is_empty"
185 )]
186 extra: Extra,
187 },
188 #[serde(rename = "shell")]
189 Shell {
190 #[serde(
191 default,
192 flatten,
193 skip_serializing_if = "std::collections::BTreeMap::is_empty"
194 )]
195 extra: Extra,
196 },
197 #[serde(rename = "apply_patch")]
198 ApplyPatch {
199 #[serde(
200 default,
201 flatten,
202 skip_serializing_if = "std::collections::BTreeMap::is_empty"
203 )]
204 extra: Extra,
205 },
206}
207
208#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
209#[non_exhaustive]
210pub enum AllowedToolsType {
211 #[serde(rename = "allowed_tools")]
212 AllowedTools,
213}
214
215#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
216#[serde(untagged)]
217#[non_exhaustive]
218pub enum ChatNamedToolChoice {
219 Function {
220 #[serde(rename = "type")]
221 type_: FunctionToolChoiceType,
222 function: NamedTool,
223 #[serde(
224 default,
225 flatten,
226 skip_serializing_if = "std::collections::BTreeMap::is_empty"
227 )]
228 extra: Extra,
229 },
230 Custom {
231 #[serde(rename = "type")]
232 type_: CustomToolChoiceType,
233 custom: NamedTool,
234 #[serde(
235 default,
236 flatten,
237 skip_serializing_if = "std::collections::BTreeMap::is_empty"
238 )]
239 extra: Extra,
240 },
241}
242
243#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
244#[non_exhaustive]
245pub struct ResponseHostedToolChoice {
246 #[serde(rename = "type")]
247 pub type_: ResponseHostedToolChoiceType,
248 #[serde(
249 default,
250 flatten,
251 skip_serializing_if = "std::collections::BTreeMap::is_empty"
252 )]
253 pub extra: Extra,
254}
255
256#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
257#[non_exhaustive]
258pub enum ResponseHostedToolChoiceType {
259 #[serde(rename = "file_search")]
260 FileSearch,
261 #[serde(rename = "web_search_preview")]
262 WebSearchPreview,
263 #[serde(rename = "computer")]
264 Computer,
265 #[serde(rename = "computer_use_preview")]
266 ComputerUsePreview,
267 #[serde(rename = "computer_use")]
268 ComputerUse,
269 #[serde(rename = "web_search_preview_2025_03_11")]
270 WebSearchPreview20250311,
271 #[serde(rename = "image_generation")]
272 ImageGeneration,
273 #[serde(rename = "code_interpreter")]
274 CodeInterpreter,
275}
276
277#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
278#[non_exhaustive]
279pub struct ResponseFunctionToolChoice {
280 #[serde(rename = "type")]
281 pub type_: FunctionToolChoiceType,
282 pub name: String,
283 #[serde(
284 default,
285 flatten,
286 skip_serializing_if = "std::collections::BTreeMap::is_empty"
287 )]
288 pub extra: Extra,
289}
290
291#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
292#[non_exhaustive]
293pub struct ResponseMcpToolChoice {
294 #[serde(rename = "type")]
295 pub type_: McpToolChoiceType,
296 pub server_label: String,
297 #[serde(skip_serializing_if = "Option::is_none")]
298 pub name: Option<String>,
299 #[serde(
300 default,
301 flatten,
302 skip_serializing_if = "std::collections::BTreeMap::is_empty"
303 )]
304 pub extra: Extra,
305}
306
307#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
308#[non_exhaustive]
309pub struct ResponseCustomToolChoice {
310 #[serde(rename = "type")]
311 pub type_: CustomToolChoiceType,
312 pub name: String,
313 #[serde(
314 default,
315 flatten,
316 skip_serializing_if = "std::collections::BTreeMap::is_empty"
317 )]
318 pub extra: Extra,
319}
320
321#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
322#[non_exhaustive]
323pub struct ResponseApplyPatchToolChoice {
324 #[serde(rename = "type")]
325 pub type_: ApplyPatchToolChoiceType,
326 #[serde(
327 default,
328 flatten,
329 skip_serializing_if = "std::collections::BTreeMap::is_empty"
330 )]
331 pub extra: Extra,
332}
333
334#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
335#[non_exhaustive]
336pub struct ResponseShellToolChoice {
337 #[serde(rename = "type")]
338 pub type_: ShellToolChoiceType,
339 #[serde(
340 default,
341 flatten,
342 skip_serializing_if = "std::collections::BTreeMap::is_empty"
343 )]
344 pub extra: Extra,
345}
346
347#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
348#[non_exhaustive]
349pub enum FunctionToolChoiceType {
350 #[serde(rename = "function")]
351 Function,
352}
353
354#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
355#[non_exhaustive]
356pub enum CustomToolChoiceType {
357 #[serde(rename = "custom")]
358 Custom,
359}
360
361#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
362#[non_exhaustive]
363pub enum McpToolChoiceType {
364 #[serde(rename = "mcp")]
365 Mcp,
366}
367
368#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
369#[non_exhaustive]
370pub enum ApplyPatchToolChoiceType {
371 #[serde(rename = "apply_patch")]
372 ApplyPatch,
373}
374
375#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
376#[non_exhaustive]
377pub enum ShellToolChoiceType {
378 #[serde(rename = "shell")]
379 Shell,
380}