Rework typing notifications
Previously, the bot only had rudimentary typing notification support. It used to send a single notification when starting a long task and did not bother with notifications anymore. By default matrix-rust-sdk gives these notifications a validity of 4 seconds, so it would expire shortly. If the bot takes longer to respond, you'd see the typing notification expire and wonder if a response is coming. Another edge case is the bot sending an answer quicker and the typing notice still being on. Some clients (like element-web) seem to hide the typing notice when a new message comes, so they don't experience this as problematic. The reworked typing notification system should be robust: - typing notices are sent continuously, until the bot finishes doing work - if the bot is performing multiple actions in a room (even for different people), typing notices would continue to be sent until the bot becomes idle - as soon as the bot becomes idle, a "not typing anymore" notice is sent to clear the state
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -2122,9 +2122,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mxlink"
|
name = "mxlink"
|
||||||
version = "1.1.0"
|
version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7a3a0be3d60a77da93df2ab59f09ad7e12fd9ed072c70f57e9adb01b662040fa"
|
checksum = "195f0bd9764068de3e3e446bbac81a54489ff51674d80e387057b805c7dab96c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"chacha20poly1305",
|
"chacha20poly1305",
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ base64 = "0.22.*"
|
|||||||
# We'd rather not depend on this, but we cannot use the ruma-events EventContent macro without it.
|
# We'd rather not depend on this, but we cannot use the ruma-events EventContent macro without it.
|
||||||
matrix-sdk = { version = "0.7.1", default-features = false }
|
matrix-sdk = { version = "0.7.1", default-features = false }
|
||||||
mxidwc = "1.0.*"
|
mxidwc = "1.0.*"
|
||||||
mxlink = "1.1.*"
|
mxlink = "1.2.*"
|
||||||
etke_openai_api_rust = "0.1.*"
|
etke_openai_api_rust = "0.1.*"
|
||||||
quick_cache = "0.6.*"
|
quick_cache = "0.6.*"
|
||||||
regex = "1.10.*"
|
regex = "1.10.*"
|
||||||
|
|||||||
@@ -317,6 +317,13 @@ impl Messaging {
|
|||||||
|
|
||||||
let start_time = std::time::Instant::now();
|
let start_time = std::time::Instant::now();
|
||||||
|
|
||||||
|
let _typing_notice_guard = self
|
||||||
|
.bot
|
||||||
|
.matrix_link()
|
||||||
|
.rooms()
|
||||||
|
.start_typing_notice(message_context.room())
|
||||||
|
.await;
|
||||||
|
|
||||||
let event_span = tracing::error_span!("message_controller", ?controller_type);
|
let event_span = tracing::error_span!("message_controller", ?controller_type);
|
||||||
|
|
||||||
crate::controller::dispatch_controller(&controller_type, &message_context, &self.bot)
|
crate::controller::dispatch_controller(&controller_type, &message_context, &self.bot)
|
||||||
|
|||||||
@@ -244,6 +244,13 @@ impl Reacting {
|
|||||||
|
|
||||||
tracing::info!("Handling reaction via reaction controller");
|
tracing::info!("Handling reaction via reaction controller");
|
||||||
|
|
||||||
|
let _typing_notice_guard = self
|
||||||
|
.bot
|
||||||
|
.matrix_link()
|
||||||
|
.rooms()
|
||||||
|
.start_typing_notice(message_context.room())
|
||||||
|
.await;
|
||||||
|
|
||||||
let event_span = tracing::error_span!("reaction_controller");
|
let event_span = tracing::error_span!("reaction_controller");
|
||||||
|
|
||||||
crate::controller::reaction::handle(
|
crate::controller::reaction::handle(
|
||||||
|
|||||||
@@ -100,8 +100,6 @@ pub async fn handle_room_local(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
message_context.room().typing_notice(true).await?;
|
|
||||||
|
|
||||||
if !try_to_ping_agent_or_complain(bot, message_context, &parsed_config.agent).await {
|
if !try_to_ping_agent_or_complain(bot, message_context, &parsed_config.agent).await {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
@@ -215,8 +213,6 @@ pub async fn handle_global(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
message_context.room().typing_notice(true).await?;
|
|
||||||
|
|
||||||
if !try_to_ping_agent_or_complain(bot, message_context, &parsed_config.agent).await {
|
if !try_to_ping_agent_or_complain(bot, message_context, &parsed_config.agent).await {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -337,8 +337,6 @@ async fn handle_stage_text_generation(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
_ = message_context.room().typing_notice(true).await;
|
|
||||||
|
|
||||||
let prefixes_to_strip = match controller_type {
|
let prefixes_to_strip = match controller_type {
|
||||||
ChatCompletionControllerType::ViaText { prefixes_to_strip } => prefixes_to_strip.clone(),
|
ChatCompletionControllerType::ViaText { prefixes_to_strip } => prefixes_to_strip.clone(),
|
||||||
ChatCompletionControllerType::ViaAudio => vec![],
|
ChatCompletionControllerType::ViaAudio => vec![],
|
||||||
@@ -498,8 +496,6 @@ async fn handle_stage_speech_to_text_actual_transcribing(
|
|||||||
.get_media_content(&media_request, true)
|
.get_media_content(&media_request, true)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
_ = message_context.room().typing_notice(true).await;
|
|
||||||
|
|
||||||
let span = tracing::debug_span!(
|
let span = tracing::debug_span!(
|
||||||
"speech_to_text_generation",
|
"speech_to_text_generation",
|
||||||
agent_id = agent.identifier().as_string()
|
agent_id = agent.identifier().as_string()
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ pub async fn handle_image(
|
|||||||
original_prompt.to_owned()
|
original_prompt.to_owned()
|
||||||
};
|
};
|
||||||
|
|
||||||
message_context.room().typing_notice(true).await?;
|
|
||||||
|
|
||||||
let span = tracing::debug_span!(
|
let span = tracing::debug_span!(
|
||||||
"image_generation",
|
"image_generation",
|
||||||
agent_id = agent.identifier().as_string()
|
agent_id = agent.identifier().as_string()
|
||||||
@@ -139,8 +137,6 @@ pub async fn handle_sticker(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
message_context.room().typing_notice(true).await?;
|
|
||||||
|
|
||||||
let span = tracing::debug_span!(
|
let span = tracing::debug_span!(
|
||||||
"sticker_generation",
|
"sticker_generation",
|
||||||
agent_id = agent.identifier().as_string()
|
agent_id = agent.identifier().as_string()
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ pub async fn generate_and_send_tts_for_message(
|
|||||||
text_message_event_id: &OwnedEventId,
|
text_message_event_id: &OwnedEventId,
|
||||||
text_content: &str,
|
text_content: &str,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
_ = message_context.room().typing_notice(true).await;
|
|
||||||
|
|
||||||
let reaction_event_response = bot
|
let reaction_event_response = bot
|
||||||
.reacting()
|
.reacting()
|
||||||
.react_no_fail(
|
.react_no_fail(
|
||||||
|
|||||||
Reference in New Issue
Block a user