Skip to main content

gproxy_protocol/wire/openai/
web_search.rs

1//! Native Codex /search DTOs; source codex-api/src/search.rs and endpoint/search.rs.
2use 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>;