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, #[serde(skip_serializing_if = "Option::is_none")] pub input: Option, #[serde(skip_serializing_if = "Option::is_none")] pub commands: Option, #[serde(skip_serializing_if = "Option::is_none")] pub settings: Option, #[serde(skip_serializing_if = "Option::is_none")] pub max_output_tokens: Option, } #[derive(Debug, Clone, Serialize, PartialEq)] #[serde(untagged)] pub enum SearchInput { Text(String), Items(Vec), } #[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>, /// Query the image search engine for a given list of queries. #[serde(skip_serializing_if = "Option::is_none")] pub image_query: Option>, /// Open pages by reference id or URL. #[serde(skip_serializing_if = "Option::is_none")] pub open: Option>, /// Open links from previously opened pages. #[serde(skip_serializing_if = "Option::is_none")] pub click: Option>, /// Find text patterns in pages. #[serde(skip_serializing_if = "Option::is_none")] pub find: Option>, /// Take screenshots of PDF pages. #[serde(skip_serializing_if = "Option::is_none")] pub screenshot: Option>, /// Look up prices for the given stock symbols. #[serde(skip_serializing_if = "Option::is_none")] pub finance: Option>, /// Look up weather forecasts. #[serde(skip_serializing_if = "Option::is_none")] pub weather: Option>, /// Look up sports schedules and standings. #[serde(skip_serializing_if = "Option::is_none")] pub sports: Option>, /// Get time for the given UTC offsets. #[serde(skip_serializing_if = "Option::is_none")] pub time: Option>, /// Set the length of the response to be returned. #[serde(skip_serializing_if = "Option::is_none")] pub response_length: Option, } #[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, /// Whether to filter by a specific list of domains. #[serde(skip_serializing_if = "Option::is_none")] pub domains: Option>, } #[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, } #[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, } #[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, /// Number of days to return. Defaults to 7. #[serde(skip_serializing_if = "Option::is_none")] pub duration: Option, } #[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, /// 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, /// Opponent to use with `team` when narrowing the lookup. #[serde(skip_serializing_if = "Option::is_none")] pub opponent: Option, /// Start date in YYYY-MM-DD format. #[serde(skip_serializing_if = "Option::is_none")] pub date_from: Option, /// End date in YYYY-MM-DD format. #[serde(skip_serializing_if = "Option::is_none")] pub date_to: Option, /// Number of games to return. #[serde(skip_serializing_if = "Option::is_none")] pub num_games: Option, /// Locale for the lookup. #[serde(skip_serializing_if = "Option::is_none")] pub locale: Option, } #[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, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ExternalWebAccessMode { Cached, Indexed, Live, } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(untagged)] pub enum ExternalWebAccess { Boolean(bool), Mode(ExternalWebAccessMode), } #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] pub struct SearchSettings { #[serde(skip_serializing_if = "Option::is_none")] pub user_location: Option, #[serde(skip_serializing_if = "Option::is_none")] pub search_context_size: Option, #[serde(skip_serializing_if = "Option::is_none")] pub filters: Option, #[serde(skip_serializing_if = "Option::is_none")] pub image_settings: Option, #[serde(skip_serializing_if = "Option::is_none")] pub allowed_callers: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub external_web_access: Option, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct ApproximateLocation { pub r#type: LocationType, #[serde(skip_serializing_if = "Option::is_none")] pub country: Option, #[serde(skip_serializing_if = "Option::is_none")] pub region: Option, #[serde(skip_serializing_if = "Option::is_none")] pub city: Option, #[serde(skip_serializing_if = "Option::is_none")] pub timezone: Option, } #[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>, #[serde(skip_serializing_if = "Option::is_none")] pub blocked_domains: Option>, } #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)] pub struct SearchImageSettings { #[serde(skip_serializing_if = "Option::is_none")] pub max_results: Option, #[serde(skip_serializing_if = "Option::is_none")] pub caption: Option, } #[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, pub output: String, }