fix(channel): preserve interrupted user context in cached turn normalization
This commit is contained in:
parent
e7ccb573fa
commit
7c2c370180
1 changed files with 44 additions and 0 deletions
|
|
@ -284,6 +284,18 @@ fn normalize_cached_channel_turns(turns: Vec<ChatMessage>) -> Vec<ChatMessage> {
|
||||||
normalized.push(turn);
|
normalized.push(turn);
|
||||||
expecting_user = true;
|
expecting_user = true;
|
||||||
}
|
}
|
||||||
|
// Interrupted channel turns can produce consecutive user messages
|
||||||
|
// (no assistant persisted yet). Merge instead of dropping.
|
||||||
|
(false, "user") | (true, "assistant") => {
|
||||||
|
if let Some(last_turn) = normalized.last_mut() {
|
||||||
|
if !turn.content.is_empty() {
|
||||||
|
if !last_turn.content.is_empty() {
|
||||||
|
last_turn.content.push_str("\n\n");
|
||||||
|
}
|
||||||
|
last_turn.content.push_str(&turn.content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2735,6 +2747,38 @@ mod tests {
|
||||||
assert!(!should_skip_memory_context_entry("telegram_123_45", "hi"));
|
assert!(!should_skip_memory_context_entry("telegram_123_45", "hi"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn normalize_cached_channel_turns_merges_consecutive_user_turns() {
|
||||||
|
let turns = vec![
|
||||||
|
ChatMessage::user("forwarded content"),
|
||||||
|
ChatMessage::user("summarize this"),
|
||||||
|
];
|
||||||
|
|
||||||
|
let normalized = normalize_cached_channel_turns(turns);
|
||||||
|
assert_eq!(normalized.len(), 1);
|
||||||
|
assert_eq!(normalized[0].role, "user");
|
||||||
|
assert!(normalized[0].content.contains("forwarded content"));
|
||||||
|
assert!(normalized[0].content.contains("summarize this"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn normalize_cached_channel_turns_merges_consecutive_assistant_turns() {
|
||||||
|
let turns = vec![
|
||||||
|
ChatMessage::user("first user"),
|
||||||
|
ChatMessage::assistant("assistant part 1"),
|
||||||
|
ChatMessage::assistant("assistant part 2"),
|
||||||
|
ChatMessage::user("next user"),
|
||||||
|
];
|
||||||
|
|
||||||
|
let normalized = normalize_cached_channel_turns(turns);
|
||||||
|
assert_eq!(normalized.len(), 3);
|
||||||
|
assert_eq!(normalized[0].role, "user");
|
||||||
|
assert_eq!(normalized[1].role, "assistant");
|
||||||
|
assert_eq!(normalized[2].role, "user");
|
||||||
|
assert!(normalized[1].content.contains("assistant part 1"));
|
||||||
|
assert!(normalized[1].content.contains("assistant part 2"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn compact_sender_history_keeps_recent_truncated_messages() {
|
fn compact_sender_history_keeps_recent_truncated_messages() {
|
||||||
let mut histories = HashMap::new();
|
let mut histories = HashMap::new();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue