Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-memory/src/lexigram/ai/memory/config.py: 100%
43 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1"""Configuration for lexigram-ai-memory."""
3from __future__ import annotations
5from typing import ClassVar
7from lexigram.ai.memory import constants as const
8from lexigram.config.base import BaseConfig
9from lexigram.validation import ConfigDict, Field
12class WorkingMemoryConfig(BaseConfig):
13 """Token-budget allocation for working memory assembly.
15 Attributes:
16 system_prompt_tokens: Fixed token allocation for system prompt.
17 recent_turns_fraction: Fraction of remaining budget for recent turns.
18 episodic_fraction: Fraction of remaining budget for episodic recall.
19 semantic_fraction: Fraction of remaining budget for semantic facts.
20 tool_descriptions_fraction: Fraction of remaining budget for tool descriptions.
21 max_recent_turns: Hard cap on recent turns regardless of budget.
22 """
24 model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore")
26 system_prompt_tokens: int = Field(
27 default=const.DEFAULT_SYSTEM_PROMPT_TOKENS,
28 description="Fixed token allocation for system prompt",
29 )
30 recent_turns_fraction: float = Field(
31 default=const.DEFAULT_RECENT_TURNS_FRACTION,
32 ge=0.0,
33 le=1.0,
34 description="Fraction of remaining budget for recent turns",
35 )
36 episodic_fraction: float = Field(
37 default=const.DEFAULT_EPISODIC_FRACTION,
38 ge=0.0,
39 le=1.0,
40 description="Fraction of remaining budget for episodic recall",
41 )
42 semantic_fraction: float = Field(
43 default=const.DEFAULT_SEMANTIC_FRACTION,
44 ge=0.0,
45 le=1.0,
46 description="Fraction of remaining budget for semantic facts",
47 )
48 tool_descriptions_fraction: float = Field(
49 default=const.DEFAULT_TOOL_DESC_FRACTION,
50 ge=0.0,
51 le=1.0,
52 description="Fraction of remaining budget for tool descriptions",
53 )
54 max_recent_turns: int = Field(
55 default=const.DEFAULT_MAX_RECENT_TURNS,
56 ge=1,
57 description="Hard cap on recent turns regardless of budget",
58 )
61class EpisodicMemoryConfig(BaseConfig):
62 """Configuration for episodic memory tier.
64 Attributes:
65 default_top_k: Default number of episodes to retrieve.
66 recency_weight: Weight applied to temporal recency during scoring.
67 importance_weight: Weight applied to entry importance during scoring.
68 relevance_weight: Weight applied to semantic similarity during scoring.
69 ttl_seconds: Time-to-live for entries (0 = never expire).
70 """
72 model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore")
74 default_top_k: int = Field(
75 default=const.DEFAULT_EPISODIC_TOP_K,
76 ge=1,
77 description="Default number of episodes to retrieve",
78 )
79 recency_weight: float = Field(
80 default=const.DEFAULT_RECENCY_WEIGHT,
81 ge=0.0,
82 le=1.0,
83 description="Weight applied to temporal recency during scoring",
84 )
85 importance_weight: float = Field(
86 default=const.DEFAULT_IMPORTANCE_WEIGHT,
87 ge=0.0,
88 le=1.0,
89 description="Weight applied to entry importance during scoring",
90 )
91 relevance_weight: float = Field(
92 default=const.DEFAULT_RELEVANCE_WEIGHT,
93 ge=0.0,
94 le=1.0,
95 description="Weight applied to semantic similarity during scoring",
96 )
97 ttl_seconds: int = Field(
98 default=const.DEFAULT_EPISODIC_TTL_SECONDS,
99 ge=0,
100 description="Time-to-live for entries in seconds (0 = never expire)",
101 )
104class SemanticMemoryConfig(BaseConfig):
105 """Configuration for semantic memory tier.
107 Attributes:
108 min_confidence: Minimum confidence to store a fact.
109 max_facts_per_entity: Hard cap on stored facts per entity.
110 """
112 model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore")
114 min_confidence: float = Field(
115 default=const.DEFAULT_MIN_CONFIDENCE,
116 ge=0.0,
117 le=1.0,
118 description="Minimum confidence score required to store a fact",
119 )
120 max_facts_per_entity: int = Field(
121 default=const.DEFAULT_MAX_FACTS_PER_ENTITY,
122 ge=1,
123 description="Hard cap on stored facts per entity",
124 )
127class ConsolidationConfig(BaseConfig):
128 """Configuration for the background consolidation pipeline.
130 Attributes:
131 enabled: Whether automatic consolidation is active.
132 interval_seconds: How often to run a consolidation pass.
133 age_threshold_hours: Minimum entry age before it can be consolidated.
134 importance_prune_threshold: Entries below this importance are eligible for pruning.
135 batch_size: Maximum entries processed per consolidation pass.
136 """
138 model_config: ClassVar[ConfigDict] = ConfigDict(extra="ignore")
140 enabled: bool = Field(
141 default=True,
142 description="Whether automatic background consolidation is active",
143 )
144 interval_seconds: float = Field(
145 default=const.DEFAULT_CONSOLIDATION_INTERVAL_S,
146 gt=0.0,
147 description="How often to run a consolidation pass (seconds)",
148 )
149 age_threshold_hours: float = Field(
150 default=const.DEFAULT_CONSOLIDATION_AGE_THRESHOLD_HOURS,
151 gt=0.0,
152 description="Minimum entry age (hours) before it can be consolidated",
153 )
154 importance_prune_threshold: float = Field(
155 default=const.DEFAULT_CONSOLIDATION_IMPORTANCE_PRUNE,
156 ge=0.0,
157 le=1.0,
158 description="Entries below this importance score are eligible for pruning",
159 )
160 batch_size: int = Field(
161 default=const.DEFAULT_CONSOLIDATION_BATCH_SIZE,
162 ge=1,
163 description="Maximum entries processed per consolidation pass",
164 )
167ENV_PREFIX: str = const.ENV_PREFIX
170class MemoryConfig(BaseConfig):
171 """Top-level configuration for lexigram-ai-memory.
173 Attributes:
174 working: Working memory token budget configuration.
175 episodic: Episodic memory retrieval configuration.
176 semantic: Semantic memory fact storage configuration.
177 consolidation: Background consolidation pipeline configuration.
178 default_backend: Backend type to use ('in_memory', 'cache', 'database', 'vector').
179 ttl_seconds: Default entry TTL in seconds (0 = never expire).
180 """
182 config_section: ClassVar[str] = "ai_memory"
184 model_config: ClassVar[ConfigDict] = ConfigDict( # type: ignore[typeddict-unknown-key]
185 env_prefix=ENV_PREFIX,
186 env_nested_delimiter=const.ENV_NESTED_DELIMITER,
187 extra="ignore",
188 )
190 enabled: bool = Field(default=True, description="Enable the AI memory subsystem")
192 working: WorkingMemoryConfig = Field(
193 default_factory=WorkingMemoryConfig,
194 description="Working memory token budget configuration",
195 )
196 episodic: EpisodicMemoryConfig = Field(
197 default_factory=EpisodicMemoryConfig,
198 description="Episodic memory retrieval configuration",
199 )
200 semantic: SemanticMemoryConfig = Field(
201 default_factory=SemanticMemoryConfig,
202 description="Semantic memory fact storage configuration",
203 )
204 consolidation: ConsolidationConfig = Field(
205 default_factory=ConsolidationConfig,
206 description="Background consolidation pipeline configuration",
207 )
208 default_backend: str = Field(
209 default=const.DEFAULT_BACKEND,
210 description="Backend type to use ('in_memory', 'cache', 'database', 'vector')",
211 )
212 ttl_seconds: int = Field(
213 default=const.DEFAULT_TTL_SECONDS,
214 ge=0,
215 description="Default entry TTL in seconds (0 = never expire)",
216 )
219__all__ = [
220 "ENV_PREFIX",
221 "ConsolidationConfig",
222 "EpisodicMemoryConfig",
223 "MemoryConfig",
224 "SemanticMemoryConfig",
225 "WorkingMemoryConfig",
226]