refactor(context): trim replay cap plumbing
This commit is contained in:
@@ -205,7 +205,6 @@ class AgentLoop:
|
||||
timezone: str | None = None,
|
||||
session_ttl_minutes: int = 0,
|
||||
consolidation_ratio: float = 0.5,
|
||||
max_messages: int = 0,
|
||||
hooks: list[AgentHook] | None = None,
|
||||
unified_session: bool = False,
|
||||
disabled_skills: list[str] | None = None,
|
||||
@@ -296,12 +295,7 @@ class AgentLoop:
|
||||
llm_wall_timeout_for_session=lambda sk: runner_wall_llm_timeout_s(self.sessions, sk),
|
||||
)
|
||||
self._unified_session = unified_session
|
||||
self._explicit_max_messages = max_messages > 0
|
||||
self._max_messages = (
|
||||
max_messages
|
||||
if self._explicit_max_messages
|
||||
else replay_max_messages_for_context(self.context_window_tokens)
|
||||
)
|
||||
self._max_messages = replay_max_messages_for_context(self.context_window_tokens)
|
||||
self._running = False
|
||||
self._mcp_servers = mcp_servers or {}
|
||||
self._mcp_stacks: dict[str, AsyncExitStack] = {}
|
||||
@@ -444,8 +438,7 @@ class AgentLoop:
|
||||
logger.info("Runtime model switched for next turn: {} -> {}", old_model, model)
|
||||
|
||||
def _sync_replay_max_messages(self) -> None:
|
||||
if not self._explicit_max_messages:
|
||||
self._max_messages = replay_max_messages_for_context(self.context_window_tokens)
|
||||
self._max_messages = replay_max_messages_for_context(self.context_window_tokens)
|
||||
|
||||
def _refresh_provider_snapshot(self) -> None:
|
||||
if self._provider_snapshot_loader is None:
|
||||
|
||||
@@ -156,12 +156,12 @@ def _migrate_config(data: dict) -> dict:
|
||||
agents = data.get("agents", {})
|
||||
defaults = agents.get("defaults", {}) if isinstance(agents, dict) else {}
|
||||
if isinstance(defaults, dict):
|
||||
legacy_max_message_keys = [
|
||||
key for key in ("maxMessages", "max_messages") if key in defaults
|
||||
]
|
||||
if legacy_max_message_keys:
|
||||
for key in legacy_max_message_keys:
|
||||
defaults.pop(key, None)
|
||||
had_legacy_max_messages = (
|
||||
"maxMessages" in defaults or "max_messages" in defaults
|
||||
)
|
||||
defaults.pop("maxMessages", None)
|
||||
defaults.pop("max_messages", None)
|
||||
if had_legacy_max_messages:
|
||||
# TODO(next version): Remove this legacy cleanup branch; the schema
|
||||
# will silently ignore this field once the warning grace period ends.
|
||||
logger.warning(
|
||||
|
||||
@@ -29,7 +29,6 @@ from nanobot.utils.subagent_channel_display import scrub_subagent_announce_body
|
||||
FILE_MAX_MESSAGES = 2000
|
||||
MIN_REPLAY_MAX_MESSAGES = 120
|
||||
REPLAY_TOKENS_PER_MESSAGE = 100
|
||||
DEFAULT_REPLAY_MAX_MESSAGES = FILE_MAX_MESSAGES
|
||||
_MESSAGE_TIME_PREFIX_RE = re.compile(r"^\[Message Time: [^\]]+\]\n?")
|
||||
_LOCAL_IMAGE_BREADCRUMB_RE = re.compile(r"^\[image: (?:/|~)[^\]]+\]\s*$")
|
||||
_TOOL_CALL_ECHO_RE = re.compile(r'^\s*(?:generate_image|message)\([^)]*\)\s*$')
|
||||
@@ -48,7 +47,7 @@ _FORK_VOLATILE_METADATA_KEYS = {
|
||||
|
||||
def replay_max_messages_for_context(context_window_tokens: int | None) -> int:
|
||||
if not context_window_tokens or context_window_tokens <= 0:
|
||||
return DEFAULT_REPLAY_MAX_MESSAGES
|
||||
return FILE_MAX_MESSAGES
|
||||
return min(
|
||||
FILE_MAX_MESSAGES,
|
||||
max(MIN_REPLAY_MAX_MESSAGES, context_window_tokens // REPLAY_TOKENS_PER_MESSAGE),
|
||||
@@ -144,7 +143,7 @@ class Session:
|
||||
|
||||
def get_history(
|
||||
self,
|
||||
max_messages: int = DEFAULT_REPLAY_MAX_MESSAGES,
|
||||
max_messages: int = FILE_MAX_MESSAGES,
|
||||
*,
|
||||
max_tokens: int = 0,
|
||||
extend_to_user: bool = False,
|
||||
@@ -155,7 +154,7 @@ class Session:
|
||||
token budget from the tail (``max_tokens``) when provided.
|
||||
"""
|
||||
unconsolidated = self.messages[self.last_consolidated:]
|
||||
max_messages = max_messages if max_messages > 0 else DEFAULT_REPLAY_MAX_MESSAGES
|
||||
max_messages = max_messages if max_messages > 0 else FILE_MAX_MESSAGES
|
||||
start_idx = recent_message_start_index(
|
||||
unconsolidated,
|
||||
max_messages,
|
||||
|
||||
Reference in New Issue
Block a user