use crate::value::{VmError, VmValue};
use super::CompactionPolicy;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum CompactStrategy {
Llm,
Truncate,
Custom,
ObservationMask,
}
pub fn parse_compact_strategy(value: &str) -> Result<CompactStrategy, VmError> {
match value {
"llm" => Ok(CompactStrategy::Llm),
"truncate" => Ok(CompactStrategy::Truncate),
"custom" => Ok(CompactStrategy::Custom),
"observation_mask" => Ok(CompactStrategy::ObservationMask),
other => Err(VmError::Runtime(format!(
"unknown compact_strategy '{other}' (expected 'llm', 'truncate', 'custom', or 'observation_mask')"
))),
}
}
pub fn compact_strategy_name(strategy: &CompactStrategy) -> &'static str {
match strategy {
CompactStrategy::Llm => "llm",
CompactStrategy::Truncate => "truncate",
CompactStrategy::Custom => "custom",
CompactStrategy::ObservationMask => "observation_mask",
}
}
#[derive(Clone, Debug, Default)]
pub struct CompactionRequestProvenance {
pub requested_strategy: Option<String>,
pub threshold_source: Option<CompactionThresholdSource>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CompactionThresholdSource {
TokenThreshold,
CompactThreshold,
TargetTokens,
CompactionPolicy,
RuntimeConfig,
PreCompactModify,
Default,
}
impl CompactionThresholdSource {
pub fn as_str(self) -> &'static str {
match self {
Self::TokenThreshold => "token_threshold",
Self::CompactThreshold => "compact_threshold",
Self::TargetTokens => "target_tokens",
Self::CompactionPolicy => "compaction_policy",
Self::RuntimeConfig => "runtime_config",
Self::PreCompactModify => "pre_compact_modify",
Self::Default => "default",
}
}
}
#[derive(Clone, Debug)]
pub struct AutoCompactConfig {
pub request_provenance: CompactionRequestProvenance,
pub keep_first: usize,
pub token_threshold: usize,
pub tool_output_max_chars: usize,
pub keep_last: usize,
pub compact_strategy: CompactStrategy,
pub hard_limit_tokens: Option<usize>,
pub hard_limit_strategy: CompactStrategy,
pub custom_compactor: Option<VmValue>,
pub custom_compactor_reminders: Vec<VmValue>,
pub mask_callback: Option<VmValue>,
pub compress_callback: Option<VmValue>,
pub summarize_prompt: Option<String>,
pub policy_strategy: String,
pub fallback_strategy: Option<CompactStrategy>,
pub policy: CompactionPolicy,
pub recap_budget_bytes: usize,
}
impl Default for AutoCompactConfig {
fn default() -> Self {
Self {
request_provenance: CompactionRequestProvenance::default(),
keep_first: 0,
token_threshold: 48_000,
tool_output_max_chars: 16_000,
keep_last: 12,
compact_strategy: CompactStrategy::ObservationMask,
hard_limit_tokens: None,
hard_limit_strategy: CompactStrategy::Llm,
custom_compactor: None,
custom_compactor_reminders: Vec::new(),
mask_callback: None,
compress_callback: None,
summarize_prompt: None,
policy_strategy: compact_strategy_name(&CompactStrategy::ObservationMask).to_string(),
fallback_strategy: None,
policy: CompactionPolicy::default(),
recap_budget_bytes: DEFAULT_RECAP_BUDGET_BYTES,
}
}
}
pub const DEFAULT_RECAP_BUDGET_BYTES: usize = 16_000;