lash_core/
standard_context_approach.rs1use 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}