1+ use crate :: client_common:: tools:: ToolSearchOutputTool ;
12use crate :: codex:: Session ;
23use crate :: codex:: TurnContext ;
34use crate :: tools:: TELEMETRY_PREVIEW_MAX_BYTES ;
@@ -12,6 +13,7 @@ use codex_protocol::models::FunctionCallOutputBody;
1213use codex_protocol:: models:: FunctionCallOutputContentItem ;
1314use codex_protocol:: models:: FunctionCallOutputPayload ;
1415use codex_protocol:: models:: ResponseInputItem ;
16+ use codex_protocol:: models:: SearchToolCallParams ;
1517use codex_protocol:: models:: ShellToolCallParams ;
1618use codex_protocol:: models:: function_call_output_content_items_to_text;
1719use codex_utils_string:: take_bytes_at_char_boundary;
@@ -48,7 +50,7 @@ pub enum ToolPayload {
4850 arguments : String ,
4951 } ,
5052 ToolSearch {
51- arguments : serde_json :: Value ,
53+ arguments : SearchToolCallParams ,
5254 } ,
5355 Custom {
5456 input : String ,
@@ -67,7 +69,7 @@ impl ToolPayload {
6769 pub fn log_payload ( & self ) -> Cow < ' _ , str > {
6870 match self {
6971 ToolPayload :: Function { arguments } => Cow :: Borrowed ( arguments) ,
70- ToolPayload :: ToolSearch { arguments } => Cow :: Owned ( arguments. to_string ( ) ) ,
72+ ToolPayload :: ToolSearch { arguments } => Cow :: Owned ( arguments. query . clone ( ) ) ,
7173 ToolPayload :: Custom { input } => Cow :: Borrowed ( input) ,
7274 ToolPayload :: LocalShell { params } => Cow :: Owned ( params. command . join ( " " ) ) ,
7375 ToolPayload :: Mcp { raw_arguments, .. } => Cow :: Borrowed ( raw_arguments) ,
@@ -114,12 +116,21 @@ impl ToolOutput for CallToolResult {
114116
115117#[ derive( Clone ) ]
116118pub struct ToolSearchOutput {
117- pub tools : Vec < JsonValue > ,
119+ pub tools : Vec < ToolSearchOutputTool > ,
118120}
119121
120122impl ToolOutput for ToolSearchOutput {
121123 fn log_preview ( & self ) -> String {
122- telemetry_preview ( & JsonValue :: Array ( self . tools . clone ( ) ) . to_string ( ) )
124+ let tools = self
125+ . tools
126+ . iter ( )
127+ . map ( |tool| {
128+ serde_json:: to_value ( tool) . unwrap_or_else ( |err| {
129+ JsonValue :: String ( format ! ( "failed to serialize tool_search output: {err}" ) )
130+ } )
131+ } )
132+ . collect ( ) ;
133+ telemetry_preview ( & JsonValue :: Array ( tools) . to_string ( ) )
123134 }
124135
125136 fn success_for_logging ( & self ) -> bool {
@@ -131,7 +142,15 @@ impl ToolOutput for ToolSearchOutput {
131142 call_id : call_id. to_string ( ) ,
132143 status : "completed" . to_string ( ) ,
133144 execution : "client" . to_string ( ) ,
134- tools : self . tools . clone ( ) ,
145+ tools : self
146+ . tools
147+ . iter ( )
148+ . map ( |tool| {
149+ serde_json:: to_value ( tool) . unwrap_or_else ( |err| {
150+ JsonValue :: String ( format ! ( "failed to serialize tool_search output: {err}" ) )
151+ } )
152+ } )
153+ . collect ( ) ,
135154 }
136155 }
137156}
@@ -539,13 +558,26 @@ mod tests {
539558 #[ test]
540559 fn tool_search_payloads_roundtrip_as_tool_search_outputs ( ) {
541560 let payload = ToolPayload :: ToolSearch {
542- arguments : json ! ( { "query" : "calendar" } ) ,
561+ arguments : SearchToolCallParams {
562+ query : "calendar" . to_string ( ) ,
563+ limit : None ,
564+ } ,
543565 } ;
544566 let response = ToolSearchOutput {
545- tools : vec ! [ json!( {
546- "type" : "function" ,
547- "name" : "create_event" ,
548- } ) ] ,
567+ tools : vec ! [ ToolSearchOutputTool :: Function (
568+ crate :: client_common:: tools:: ResponsesApiTool {
569+ name: "create_event" . to_string( ) ,
570+ description: String :: new( ) ,
571+ strict: false ,
572+ defer_loading: Some ( true ) ,
573+ parameters: crate :: tools:: spec:: JsonSchema :: Object {
574+ properties: Default :: default ( ) ,
575+ required: None ,
576+ additional_properties: None ,
577+ } ,
578+ output_schema: None ,
579+ } ,
580+ ) ] ,
549581 }
550582 . to_response_item ( "search-1" , & payload) ;
551583
@@ -564,6 +596,13 @@ mod tests {
564596 vec![ json!( {
565597 "type" : "function" ,
566598 "name" : "create_event" ,
599+ "description" : "" ,
600+ "strict" : false ,
601+ "defer_loading" : true ,
602+ "parameters" : {
603+ "type" : "object" ,
604+ "properties" : { }
605+ }
567606 } ) ]
568607 ) ;
569608 }
0 commit comments