Skip to main content

rskit_agent/
context.rs

1//! Agent context compaction integration.
2
3use rskit_ai::chat::count_tokens_approx;
4use rskit_errors::AppResult;
5use rskit_llm::types::Message;
6
7use crate::types::{ContextStrategy, FailStrategy};
8
9pub(crate) fn compact_if_needed(
10    mut messages: Vec<Message>,
11    max_input_tokens: Option<u64>,
12    strategy: Option<&dyn ContextStrategy>,
13) -> AppResult<Vec<Message>> {
14    if let Some(max_input_tokens) = max_input_tokens {
15        let limit = usize::try_from(max_input_tokens).unwrap_or(usize::MAX);
16        if count_tokens_approx(&messages) > limit {
17            let strategy = strategy.unwrap_or(&FailStrategy);
18            messages = strategy.compact(messages, limit)?;
19        }
20    }
21    Ok(messages)
22}