Skip to content

Commit 88351a5

Browse files
authored
Merge pull request #112 from sloganking/codex/make-speedtest-function-asynchronous-in-v2
Implement async speedtest in v2
2 parents f72711a + 8cf224c commit 88351a5

File tree

2 files changed

+71
-6
lines changed

2 files changed

+71
-6
lines changed

assistant_v2/FEATURE_PROGRESS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ This document tracks which features from the original assistant have been implem
1111
| Display log files | Pending |
1212
| Get system info | Done |
1313
| List and kill processes | Pending |
14-
| Run internet speed tests | Done |
14+
| Run internet speed tests | Done (async) |
1515
| Set the clipboard contents | Done |
1616
| Get the clipboard contents | Done |
1717
| Timers with alarm sounds | Pending |

assistant_v2/src/main.rs

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)