From 80ee4483f8a3e10ba12abfd413c310d2d31df2d2 Mon Sep 17 00:00:00 2001 From: Subal Date: Sat, 18 Apr 2026 19:47:09 +0530 Subject: [PATCH] feat: make consolidation ratio configurable --- nanobot/agent/loop.py | 2 ++ nanobot/agent/memory.py | 4 +++- nanobot/cli/commands.py | 3 +++ nanobot/config/schema.py | 7 +++++++ nanobot/nanobot.py | 1 + 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/nanobot/agent/loop.py b/nanobot/agent/loop.py index 5a4480041..f1efc16e2 100644 --- a/nanobot/agent/loop.py +++ b/nanobot/agent/loop.py @@ -190,6 +190,7 @@ class AgentLoop: channels_config: ChannelsConfig | None = None, timezone: str | None = None, session_ttl_minutes: int = 0, + consolidation_ratio: float = 0.5, hooks: list[AgentHook] | None = None, unified_session: bool = False, disabled_skills: list[str] | None = None, @@ -269,6 +270,7 @@ class AgentLoop: build_messages=self.context.build_messages, get_tool_definitions=self.tools.get_definitions, max_completion_tokens=provider.generation.max_tokens, + consolidation_ratio=consolidation_ratio, ) self.auto_compact = AutoCompact( sessions=self.sessions, diff --git a/nanobot/agent/memory.py b/nanobot/agent/memory.py index 16c01d31c..cc14ea744 100644 --- a/nanobot/agent/memory.py +++ b/nanobot/agent/memory.py @@ -435,6 +435,7 @@ class Consolidator: build_messages: Callable[..., list[dict[str, Any]]], get_tool_definitions: Callable[[], list[dict[str, Any]]], max_completion_tokens: int = 4096, + consolidation_ratio: float = 0.5, ): self.store = store self.provider = provider @@ -442,6 +443,7 @@ class Consolidator: self.sessions = sessions self.context_window_tokens = context_window_tokens self.max_completion_tokens = max_completion_tokens + self.consolidation_ratio = consolidation_ratio self._build_messages = build_messages self._get_tool_definitions = get_tool_definitions self._locks: weakref.WeakValueDictionary[str, asyncio.Lock] = ( @@ -568,7 +570,7 @@ class Consolidator: lock = self.get_lock(session.key) async with lock: budget = self._input_token_budget - target = budget // 2 + target = int(budget * self.consolidation_ratio) try: estimated, source = self.estimate_session_prompt_tokens( session, diff --git a/nanobot/cli/commands.py b/nanobot/cli/commands.py index e403d5455..e1b317ed1 100644 --- a/nanobot/cli/commands.py +++ b/nanobot/cli/commands.py @@ -597,6 +597,7 @@ def serve( unified_session=runtime_config.agents.defaults.unified_session, disabled_skills=runtime_config.agents.defaults.disabled_skills, session_ttl_minutes=runtime_config.agents.defaults.session_ttl_minutes, + consolidation_ratio=runtime_config.agents.defaults.consolidation_ratio, tools_config=runtime_config.tools, ) @@ -703,6 +704,7 @@ def _run_gateway( unified_session=config.agents.defaults.unified_session, disabled_skills=config.agents.defaults.disabled_skills, session_ttl_minutes=config.agents.defaults.session_ttl_minutes, + consolidation_ratio=config.agents.defaults.consolidation_ratio, tools_config=config.tools, ) @@ -1077,6 +1079,7 @@ def agent( unified_session=config.agents.defaults.unified_session, disabled_skills=config.agents.defaults.disabled_skills, session_ttl_minutes=config.agents.defaults.session_ttl_minutes, + consolidation_ratio=config.agents.defaults.consolidation_ratio, tools_config=config.tools, ) restart_notice = consume_restart_notice_from_env() diff --git a/nanobot/config/schema.py b/nanobot/config/schema.py index cca8f210f..e1f91aeb0 100644 --- a/nanobot/config/schema.py +++ b/nanobot/config/schema.py @@ -90,6 +90,13 @@ class AgentDefaults(Base): validation_alias=AliasChoices("idleCompactAfterMinutes", "sessionTtlMinutes"), serialization_alias="idleCompactAfterMinutes", ) # Auto-compact idle threshold in minutes (0 = disabled) + consolidation_ratio: float = Field( + default=0.5, + ge=0.1, + le=0.95, + validation_alias=AliasChoices("consolidationRatio"), + serialization_alias="consolidationRatio", + ) # Consolidation target ratio (0.5 = 50% of budget retained after compression) dream: DreamConfig = Field(default_factory=DreamConfig) diff --git a/nanobot/nanobot.py b/nanobot/nanobot.py index 96102e3d2..f9aeae84e 100644 --- a/nanobot/nanobot.py +++ b/nanobot/nanobot.py @@ -84,6 +84,7 @@ class Nanobot: unified_session=defaults.unified_session, disabled_skills=defaults.disabled_skills, session_ttl_minutes=defaults.session_ttl_minutes, + consolidation_ratio=defaults.consolidation_ratio, tools_config=config.tools, ) return cls(loop)