1use super::guardian::Reasoning;
3use crate::Rest;
4use serde::{Deserialize, Serialize};
5#[derive(Debug, Clone, Serialize, PartialEq, Deserialize, gproxy_protocol_macros::WireBuilder)]
6#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
7#[derive(gproxy_protocol_macros::DeclaredFields)]
8pub struct WebSearchRequestBody {
9 pub id: String,
10 pub model: String,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub reasoning: Option<Reasoning>,
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub input: Option<SearchInput>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub commands: Option<SearchCommands>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub settings: Option<SearchSettings>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub max_output_tokens: Option<u64>,
21 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
22 pub rest: Rest,
23}
24
25#[derive(Debug, Clone, Serialize, PartialEq, Deserialize)]
26#[serde(untagged)]
27#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
28#[derive(gproxy_protocol_macros::DeclaredFields)]
29pub enum SearchInput {
30 Text(String),
31 Items(Vec<super::guardian::ClientResponseItem>),
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
35#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
36#[derive(gproxy_protocol_macros::DeclaredFields)]
37pub struct SearchCommands {
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub search_query: Option<Vec<SearchQuery>>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub image_query: Option<Vec<SearchQuery>>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub open: Option<Vec<OpenOperation>>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub click: Option<Vec<ClickOperation>>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub find: Option<Vec<FindOperation>>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub screenshot: Option<Vec<ScreenshotOperation>>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub finance: Option<Vec<FinanceOperation>>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub weather: Option<Vec<WeatherOperation>>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub sports: Option<Vec<SportsOperation>>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub time: Option<Vec<TimeOperation>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub response_length: Option<SearchResponseLength>,
60 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
61 pub rest: Rest,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
65#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
66#[derive(gproxy_protocol_macros::DeclaredFields)]
67pub struct SearchQuery {
68 pub q: String,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub recency: Option<u64>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub domains: Option<Vec<String>>,
73 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
74 pub rest: Rest,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
78#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
79#[derive(gproxy_protocol_macros::DeclaredFields)]
80pub struct OpenOperation {
81 pub ref_id: String,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub lineno: Option<u64>,
84 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
85 pub rest: Rest,
86}
87
88#[derive(
89 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
90)]
91#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
92#[derive(gproxy_protocol_macros::DeclaredFields)]
93pub struct ClickOperation {
94 pub ref_id: String,
95 pub id: u64,
96 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
97 pub rest: Rest,
98}
99
100#[derive(
101 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
102)]
103#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
104#[derive(gproxy_protocol_macros::DeclaredFields)]
105pub struct FindOperation {
106 pub ref_id: String,
107 pub pattern: String,
108 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
109 pub rest: Rest,
110}
111
112#[derive(
113 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
114)]
115#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
116#[derive(gproxy_protocol_macros::DeclaredFields)]
117pub struct ScreenshotOperation {
118 pub ref_id: String,
119 pub pageno: u64,
120 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
121 pub rest: Rest,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
125#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
126#[derive(gproxy_protocol_macros::DeclaredFields)]
127pub struct FinanceOperation {
128 pub ticker: String,
129 pub r#type: FinanceAssetType,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub market: Option<String>,
132 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
133 pub rest: Rest,
134}
135
136#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
137#[serde(rename_all = "lowercase")]
138#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
139#[derive(gproxy_protocol_macros::DeclaredFields)]
140pub enum FinanceAssetType {
141 Equity,
142 Fund,
143 Crypto,
144 Index,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
148#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
149#[derive(gproxy_protocol_macros::DeclaredFields)]
150pub struct WeatherOperation {
151 pub location: String,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub start: Option<String>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub duration: Option<u64>,
156 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
157 pub rest: Rest,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
161#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
162#[derive(gproxy_protocol_macros::DeclaredFields)]
163pub struct SportsOperation {
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub tool: Option<SportsToolName>,
166 pub r#fn: SportsFunction,
167 pub league: SportsLeague,
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub team: Option<String>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub opponent: Option<String>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub date_from: Option<String>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub date_to: Option<String>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub num_games: Option<u64>,
178 #[serde(skip_serializing_if = "Option::is_none")]
179 pub locale: Option<String>,
180 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
181 pub rest: Rest,
182}
183
184#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
185#[serde(rename_all = "lowercase")]
186#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
187#[derive(gproxy_protocol_macros::DeclaredFields)]
188pub enum SportsToolName {
189 Sports,
190}
191
192#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
193#[serde(rename_all = "lowercase")]
194#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
195#[derive(gproxy_protocol_macros::DeclaredFields)]
196pub enum SportsFunction {
197 Schedule,
198 Standings,
199}
200
201#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
202#[serde(rename_all = "lowercase")]
203#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
204#[derive(gproxy_protocol_macros::DeclaredFields)]
205pub enum SportsLeague {
206 Nba,
207 Wnba,
208 Nfl,
209 Nhl,
210 Mlb,
211 Epl,
212 Ncaamb,
213 Ncaawb,
214 Ipl,
215}
216
217#[derive(
218 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
219)]
220#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
221#[derive(gproxy_protocol_macros::DeclaredFields)]
222pub struct TimeOperation {
223 pub utc_offset: String,
224 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
225 pub rest: Rest,
226}
227
228#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
229#[serde(rename_all = "lowercase")]
230#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
231#[derive(gproxy_protocol_macros::DeclaredFields)]
232pub enum SearchResponseLength {
233 Short,
234 Medium,
235 Long,
236}
237
238#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
239#[serde(rename_all = "snake_case")]
240#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
241#[derive(gproxy_protocol_macros::DeclaredFields)]
242pub enum ExternalWebAccessMode {
243 Cached,
244 Indexed,
245 Live,
246}
247
248#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
249#[serde(untagged)]
250#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
251#[derive(gproxy_protocol_macros::DeclaredFields)]
252pub enum ExternalWebAccess {
253 Boolean(bool),
254 Mode(ExternalWebAccessMode),
255}
256
257#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
258#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
259#[derive(gproxy_protocol_macros::DeclaredFields)]
260pub struct SearchSettings {
261 #[serde(skip_serializing_if = "Option::is_none")]
262 pub user_location: Option<ApproximateLocation>,
263 #[serde(skip_serializing_if = "Option::is_none")]
264 pub search_context_size: Option<SearchContextSize>,
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub filters: Option<SearchFilters>,
267 #[serde(skip_serializing_if = "Option::is_none")]
268 pub image_settings: Option<SearchImageSettings>,
269 #[serde(skip_serializing_if = "Option::is_none")]
270 pub allowed_callers: Option<Vec<AllowedCaller>>,
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub external_web_access: Option<ExternalWebAccess>,
273 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
274 pub rest: Rest,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, gproxy_protocol_macros::WireBuilder)]
278#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
279#[derive(gproxy_protocol_macros::DeclaredFields)]
280pub struct ApproximateLocation {
281 pub r#type: LocationType,
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub country: Option<String>,
284 #[serde(skip_serializing_if = "Option::is_none")]
285 pub region: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
287 pub city: Option<String>,
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub timezone: Option<String>,
290 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
291 pub rest: Rest,
292}
293
294#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
295#[serde(rename_all = "lowercase")]
296#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
297#[derive(gproxy_protocol_macros::DeclaredFields)]
298pub enum LocationType {
299 Approximate,
300}
301
302#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
303#[serde(rename_all = "lowercase")]
304#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
305#[derive(gproxy_protocol_macros::DeclaredFields)]
306pub enum SearchContextSize {
307 Low,
308 Medium,
309 High,
310}
311
312#[derive(
313 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
314)]
315#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
316#[derive(gproxy_protocol_macros::DeclaredFields)]
317pub struct SearchFilters {
318 #[serde(skip_serializing_if = "Option::is_none")]
319 pub allowed_domains: Option<Vec<String>>,
320 #[serde(skip_serializing_if = "Option::is_none")]
321 pub blocked_domains: Option<Vec<String>>,
322 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
323 pub rest: Rest,
324}
325
326#[derive(
327 Debug, Clone, Serialize, Deserialize, PartialEq, Eq, gproxy_protocol_macros::WireBuilder,
328)]
329#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
330#[derive(gproxy_protocol_macros::DeclaredFields)]
331pub struct SearchImageSettings {
332 #[serde(skip_serializing_if = "Option::is_none")]
333 pub max_results: Option<u64>,
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub caption: Option<bool>,
336 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
337 pub rest: Rest,
338}
339
340#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
341#[serde(rename_all = "snake_case")]
342#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
343#[derive(gproxy_protocol_macros::DeclaredFields)]
344pub enum AllowedCaller {
345 Direct,
346 Shell,
347 CodeInterpreter,
348}
349
350#[derive(
351 Debug, Clone, Deserialize, PartialEq, Eq, Serialize, gproxy_protocol_macros::WireBuilder,
352)]
353#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
354#[derive(gproxy_protocol_macros::DeclaredFields)]
355pub struct WebSearchResponseBody {
356 #[serde(
357 default,
358 deserialize_with = "super::responses::input::present_nullable",
359 skip_serializing_if = "Option::is_none"
360 )]
361 pub encrypted_output: Option<Option<String>>,
362 pub output: String,
363 #[serde(
364 default,
365 deserialize_with = "super::responses::input::present_nullable",
366 skip_serializing_if = "Option::is_none"
367 )]
368 pub results: Option<Option<Vec<serde_json::Value>>>,
369 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
370 pub rest: Rest,
371}
372
373pub type WebSearchRequest = crate::WireRequest<WebSearchRequestBody>;
374pub type WebSearchResponse = crate::WireResponse<WebSearchResponseBody>;