(session: &mut Session, messages: &[SessionMessage])
| 2912 | } |
| 2913 | |
| 2914 | pub fn trigger_compaction(session: &mut Session, messages: &[SessionMessage]) -> Option<String> { |
| 2915 | if !should_compact(messages, 100000) { |
| 2916 | return None; |
| 2917 | } |
| 2918 | |
| 2919 | let text_content: String = messages |
| 2920 | .iter() |
| 2921 | .rev() |
| 2922 | .take(10) |
| 2923 | .flat_map(|m| { |
| 2924 | m.parts.iter().filter_map(|p| match &p.part_type { |
| 2925 | PartType::Text { text, .. } => Some(text.clone()), |
| 2926 | _ => None, |
| 2927 | }) |
| 2928 | }) |
| 2929 | .collect::<Vec<_>>() |
| 2930 | .join("\n"); |
| 2931 | |
| 2932 | let summary = format!( |
| 2933 | "[Context Compaction Triggered]\nRecent messages summarized:\n{}", |
| 2934 | &text_content[..text_content.len().min(500)] |
| 2935 | ); |
| 2936 | |
| 2937 | // Persist the compaction summary as a Compaction part on a new assistant message. |
| 2938 | let mut compaction_msg = SessionMessage::assistant(session.id.clone()); |
| 2939 | compaction_msg.parts.push(crate::MessagePart { |
| 2940 | id: format!("prt_{}", uuid::Uuid::new_v4()), |
| 2941 | part_type: PartType::Compaction { |
| 2942 | summary: summary.clone(), |
| 2943 | }, |
| 2944 | created_at: chrono::Utc::now(), |
| 2945 | message_id: None, |
| 2946 | }); |
| 2947 | session.messages.push(compaction_msg); |
| 2948 | |
| 2949 | // Set the compacting timestamp on the session. |
| 2950 | session.time.compacting = Some(chrono::Utc::now().timestamp_millis()); |
| 2951 | session.touch(); |
| 2952 | |
| 2953 | Some(summary) |
| 2954 | } |
| 2955 | |
| 2956 | // Additional prompt functions for advanced features |
| 2957 |
no test coverage detected