@@ -704,13 +704,78 @@ async fn handle_requires_action(
704704 }
705705
706706 if tool. function . name == "speedtest" {
707- let msg = match speedtest ( ) {
708- Ok ( out) => out,
709- Err ( e) => e,
710- } ;
711707 tool_outputs. push ( ToolsOutputs {
712708 tool_call_id : Some ( tool. id . clone ( ) ) ,
713- output : Some ( msg. into ( ) ) ,
709+ output : Some (
710+ "Speed test has been successfully started. It takes several seconds. The results will be shared once the speedtest is complete." . into ( ) ,
711+ ) ,
712+ } ) ;
713+
714+ let client = client. clone ( ) ;
715+ let thread_id = run_object. thread_id . clone ( ) ;
716+ let assistant_id = run_object. assistant_id . clone ( ) ;
717+ let speak_stream = speak_stream. clone ( ) ;
718+ tokio:: spawn ( async move {
719+ let result = match speedtest ( ) {
720+ Ok ( out) => format ! ( "Speedtest results: {}" , out) ,
721+ Err ( e) => format ! ( "Speedtest failed with error: {}" , e) ,
722+ } ;
723+
724+ if let Err ( e) = client
725+ . threads ( )
726+ . messages ( & thread_id)
727+ . create ( CreateMessageRequest {
728+ role : MessageRole :: User ,
729+ content : result. clone ( ) . into ( ) ,
730+ ..Default :: default ( )
731+ } )
732+ . await
733+ {
734+ eprintln ! ( "Failed to send speedtest results: {e}" ) ;
735+ return ;
736+ }
737+
738+ let mut event_stream = match client
739+ . threads ( )
740+ . runs ( & thread_id)
741+ . create_stream ( CreateRunRequest {
742+ assistant_id : assistant_id. unwrap_or_default ( ) ,
743+ stream : Some ( true ) ,
744+ ..Default :: default ( )
745+ } )
746+ . await
747+ {
748+ Ok ( es) => es,
749+ Err ( e) => {
750+ eprintln ! ( "Failed to create run for speedtest results: {e}" ) ;
751+ return ;
752+ }
753+ } ;
754+
755+ let mut displayed_ai_label = false ;
756+ while let Some ( event) = event_stream. next ( ) . await {
757+ if let Ok ( AssistantStreamEvent :: ThreadMessageDelta ( delta) ) = event {
758+ if let Some ( contents) = & delta. delta . content {
759+ for content in contents {
760+ if let MessageDeltaContent :: Text ( text) = content {
761+ if let Some ( text) = & text. text {
762+ if let Some ( text) = & text. value {
763+ if !displayed_ai_label {
764+ println ! ( "{}" , "AI: " . truecolor( 0 , 0 , 255 ) ) ;
765+ displayed_ai_label = true ;
766+ }
767+ print ! ( "{}" , text) ;
768+ speak_stream. lock ( ) . unwrap ( ) . add_token ( text) ;
769+ }
770+ }
771+ }
772+ }
773+ }
774+ }
775+ }
776+
777+ speak_stream. lock ( ) . unwrap ( ) . complete_sentence ( ) ;
778+ println ! ( ) ;
714779 } ) ;
715780 }
716781
0 commit comments