Skip to main content

lash_core/
standard_context_approach.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
4pub enum StandardContextApproachKind {
5    RollingHistory,
6    ObservationalMemory,
7}
8
9#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(tag = "kind", rename_all = "snake_case")]
11pub enum StandardContextApproach {
12    RollingHistory(RollingHistoryConfig),
13    ObservationalMemory(ObservationalMemoryConfig),
14}
15
16impl Default for StandardContextApproach {
17    fn default() -> Self {
18        Self::RollingHistory(RollingHistoryConfig)
19    }
20}
21
22impl StandardContextApproach {
23    pub fn kind(&self) -> StandardContextApproachKind {
24        match self {
25            Self::RollingHistory(_) => StandardContextApproachKind::RollingHistory,
26            Self::ObservationalMemory(_) => StandardContextApproachKind::ObservationalMemory,
27        }
28    }
29}
30
31#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
32pub struct RollingHistoryConfig;
33
34#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
35pub struct ObservationalMemoryConfig {
36    pub observation_message_tokens: usize,
37    pub observation_buffer_tokens: usize,
38    pub observation_block_after_tokens: usize,
39    pub observation_max_tokens_per_batch: usize,
40    pub previous_observer_tokens: usize,
41    pub reflection_observation_tokens: usize,
42    #[serde(default = "default_reflection_buffer_activation_bps")]
43    pub reflection_buffer_activation_bps: u16,
44    pub reflection_block_after_tokens: usize,
45}
46
47impl Default for ObservationalMemoryConfig {
48    fn default() -> Self {
49        Self {
50            observation_message_tokens: 30_000,
51            observation_buffer_tokens: 6_000,
52            observation_block_after_tokens: 36_000,
53            observation_max_tokens_per_batch: 10_000,
54            previous_observer_tokens: 2_000,
55            reflection_observation_tokens: 40_000,
56            reflection_buffer_activation_bps: default_reflection_buffer_activation_bps(),
57            reflection_block_after_tokens: 48_000,
58        }
59    }
60}
61
62impl ObservationalMemoryConfig {
63    pub fn observation_buffer_interval_tokens(&self) -> usize {
64        self.observation_buffer_tokens
65    }
66
67    pub fn observation_retention_tokens(&self) -> usize {
68        self.observation_buffer_tokens
69    }
70
71    pub fn reflection_buffer_activation_tokens(&self) -> usize {
72        self.reflection_observation_tokens
73            .saturating_mul(self.reflection_buffer_activation_bps as usize)
74            / 10_000
75    }
76}
77
78const fn default_reflection_buffer_activation_bps() -> u16 {
79    5_000
80}