use crate::common::Reasoning;use codex_protocol::models::ResponseItem;use schemars::JsonSchema;use serde::Deserialize;use serde::Serialize;#[derive(Debug, Clone, Serialize, PartialEq)]pub struct SearchRequest { pub id: String, pub model: String, #[serde(skip_serializing_if = "Option::is_none")] pub reasoning: Option<Reasoning>, #[serde(skip_serializing_if = "Option::is_none")] pub input: Option<SearchInput>, #[serde(skip_serializing_if = "Option::is_none")] pub commands: Option<SearchCommands>, #[serde(skip_serializing_if = "Option::is_none")] pub settings: Option<SearchSettings>, #[serde(skip_serializing_if = "Option::is_none")] pub max_output_tokens: Option<u64>,}#[derive(Debug, Clone, Serialize, PartialEq)]#[serde(untagged)]pub enum SearchInput { Text(String), Items(Vec<ResponseItem>),}#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, JsonSchema)]pub struct SearchCommands { /// Query the internet search engine for a given list of queries. #[serde(skip_serializing_if = "Option::is_none")] pub search_query: Option<Vec<SearchQuery>>, /// Query the image search engine for a given list of queries. #[serde(skip_serializing_if = "Option::is_none")] pub image_query: Option<Vec<SearchQuery>>, /// Open pages by reference id or URL. #[serde(skip_serializing_if = "Option::is_none")] pub open: Option<Vec<OpenOperation>>, /// Open links from previously opened pages. #[serde(skip_serializing_if = "Option::is_none")] pub click: Option<Vec<ClickOperation>>, /// Find text patterns in pages. #[serde(skip_serializing_if = "Option::is_none")] pub find: Option<Vec<FindOperation>>, /// Take screenshots of PDF pages. #[serde(skip_serializing_if = "Option::is_none")] pub screenshot: Option<Vec<ScreenshotOperation>>, /// Look up prices for the given stock symbols. #[serde(skip_serializing_if = "Option::is_none")] pub finance: Option<Vec<FinanceOperation>>, /// Look up weather forecasts. #[serde(skip_serializing_if = "Option::is_none")] pub weather: Option<Vec<WeatherOperation>>, /// Look up sports schedules and standings. #[serde(skip_serializing_if = "Option::is_none")] pub sports: Option<Vec<SportsOperation>>, /// Get time for the given UTC offsets. #[serde(skip_serializing_if = "Option::is_none")] pub time: Option<Vec<TimeOperation>>, /// Set the length of the response to be returned. #[serde(skip_serializing_if = "Option::is_none")] pub response_length: Option<SearchResponseLength>,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]pub struct SearchQuery { /// Search query. pub q: String, /// Whether to filter by recency, as a number of recent days. #[serde(skip_serializing_if = "Option::is_none")] pub recency: Option<u64>, /// Whether to filter by a specific list of domains. #[serde(skip_serializing_if = "Option::is_none")] pub domains: Option<Vec<String>>,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]pub struct OpenOperation { /// Reference id or URL to open. pub ref_id: String, /// Line number to position the page at. #[serde(skip_serializing_if = "Option::is_none")] pub lineno: Option<u64>,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]pub struct ClickOperation { /// Reference id containing the numbered link. pub ref_id: String, /// Numbered link id to open. pub id: u64,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]pub struct FindOperation { /// Reference id or URL to search within. pub ref_id: String, /// Text pattern to find. pub pattern: String,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]pub struct ScreenshotOperation { /// Reference id or URL to screenshot. pub ref_id: String, /// Zero-indexed PDF page number. pub pageno: u64,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]pub struct FinanceOperation { /// Ticker symbol to look up. pub ticker: String, /// Asset type to look up. pub r#type: FinanceAssetType, /// ISO 3166-1 alpha-3 country code, "OTC", or "" for cryptocurrency. #[serde(skip_serializing_if = "Option::is_none")] pub market: Option<String>,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]#[serde(rename_all = "lowercase")]pub enum FinanceAssetType { Equity, Fund, Crypto, Index,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]pub struct WeatherOperation { /// Location in "Country, Area, City" format. pub location: String, /// Start date in YYYY-MM-DD format. Defaults to today. #[serde(skip_serializing_if = "Option::is_none")] pub start: Option<String>, /// Number of days to return. Defaults to 7. #[serde(skip_serializing_if = "Option::is_none")] pub duration: Option<u64>,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]pub struct SportsOperation { /// Tool name for sports requests. #[serde(skip_serializing_if = "Option::is_none")] pub tool: Option<SportsToolName>, /// Sports function to call. pub r#fn: SportsFunction, /// League to look up. pub league: SportsLeague, /// Team to look up, using the common 3 or 4 letter alias used in broadcasts. #[serde(skip_serializing_if = "Option::is_none")] pub team: Option<String>, /// Opponent to use with `team` when narrowing the lookup. #[serde(skip_serializing_if = "Option::is_none")] pub opponent: Option<String>, /// Start date in YYYY-MM-DD format. #[serde(skip_serializing_if = "Option::is_none")] pub date_from: Option<String>, /// End date in YYYY-MM-DD format. #[serde(skip_serializing_if = "Option::is_none")] pub date_to: Option<String>, /// Number of games to return. #[serde(skip_serializing_if = "Option::is_none")] pub num_games: Option<u64>, /// Locale for the lookup. #[serde(skip_serializing_if = "Option::is_none")] pub locale: Option<String>,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]#[serde(rename_all = "lowercase")]pub enum SportsToolName { Sports,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]#[serde(rename_all = "lowercase")]pub enum SportsFunction { Schedule, Standings,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]#[serde(rename_all = "lowercase")]pub enum SportsLeague { Nba, Wnba, Nfl, Nhl, Mlb, Epl, Ncaamb, Ncaawb, Ipl,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]pub struct TimeOperation { /// UTC offset formatted like "+03:00". pub utc_offset: String,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]#[serde(rename_all = "lowercase")]pub enum SearchResponseLength { Short, Medium, Long,}#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]pub struct SearchSettings { #[serde(skip_serializing_if = "Option::is_none")] pub user_location: Option<ApproximateLocation>, #[serde(skip_serializing_if = "Option::is_none")] pub search_context_size: Option<SearchContextSize>, #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option<SearchFilters>, #[serde(skip_serializing_if = "Option::is_none")] pub image_settings: Option<SearchImageSettings>, #[serde(skip_serializing_if = "Option::is_none")] pub allowed_callers: Option<Vec<AllowedCaller>>, #[serde(skip_serializing_if = "Option::is_none")] pub external_web_access: Option<bool>,}#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]pub struct ApproximateLocation { pub r#type: LocationType, #[serde(skip_serializing_if = "Option::is_none")] pub country: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] pub region: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] pub city: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] pub timezone: Option<String>,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]#[serde(rename_all = "lowercase")]pub enum LocationType { Approximate,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]#[serde(rename_all = "lowercase")]pub enum SearchContextSize { Low, Medium, High,}#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]pub struct SearchFilters { #[serde(skip_serializing_if = "Option::is_none")] pub allowed_domains: Option<Vec<String>>, #[serde(skip_serializing_if = "Option::is_none")] pub blocked_domains: Option<Vec<String>>,}#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]pub struct SearchImageSettings { #[serde(skip_serializing_if = "Option::is_none")] pub max_results: Option<u64>, #[serde(skip_serializing_if = "Option::is_none")] pub caption: Option<bool>,}#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]#[serde(rename_all = "snake_case")]pub enum AllowedCaller { Direct, Shell, CodeInterpreter,}#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]pub struct SearchResponse { pub encrypted_output: Option<String>, pub output: String,}