use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LongRunningExecutionPolicy {
pub max_discovered_steps: Option<u32>,
pub max_discovery_depth: Option<u32>,
pub cost_alert_threshold_usd: Option<f64>,
pub idle_timeout_seconds: Option<u64>,
pub max_same_step_repetitions: Option<u32>,
pub checkpointing: CheckpointPolicy,
pub memory: WorkingMemoryPolicy,
}
impl Default for LongRunningExecutionPolicy {
fn default() -> Self {
Self::standard()
}
}
impl LongRunningExecutionPolicy {
pub fn standard() -> Self {
Self {
max_discovered_steps: Some(50),
max_discovery_depth: Some(5),
cost_alert_threshold_usd: Some(5.0),
idle_timeout_seconds: Some(1800),
max_same_step_repetitions: Some(3),
checkpointing: CheckpointPolicy::default(),
memory: WorkingMemoryPolicy::default(),
}
}
pub fn extended() -> Self {
Self {
max_discovered_steps: Some(300),
max_discovery_depth: Some(10),
cost_alert_threshold_usd: Some(50.0),
idle_timeout_seconds: Some(14400),
max_same_step_repetitions: Some(5),
checkpointing: CheckpointPolicy {
interval_steps: Some(10),
on_discovery: true,
..Default::default()
},
memory: WorkingMemoryPolicy {
strategy: ContextStrategy::Summarize {
summarize_after: 50,
keep_recent: 10,
},
max_tokens: Some(100_000),
..Default::default()
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckpointPolicy {
pub interval_steps: Option<u32>,
pub interval_seconds: Option<u64>,
pub on_discovery: bool,
pub max_checkpoints: Option<u32>,
}
impl Default for CheckpointPolicy {
fn default() -> Self {
Self {
interval_steps: Some(10),
interval_seconds: Some(300),
on_discovery: false,
max_checkpoints: Some(50),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkingMemoryPolicy {
pub strategy: ContextStrategy,
pub max_tokens: Option<u32>,
pub auto_compact: bool,
}
impl Default for WorkingMemoryPolicy {
fn default() -> Self {
Self {
strategy: ContextStrategy::SlidingWindow { size: 20 },
max_tokens: Some(32_000),
auto_compact: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ContextStrategy {
KeepAll,
SlidingWindow { size: u32 },
Summarize {
summarize_after: u32,
keep_recent: u32,
},
Archive {
archive_after: u32,
keep_recent: u32,
},
}