Skip to main content

gproxy_protocol/protocol/openai/generate_content/response_tools/
definitions.rs

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        // Some OpenAI-compatible Responses providers echo `strict: null`.
18        #[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}