Source code for atloop.memory.memory_manager
"""Memory manager for dynamic memory updates."""
import logging
from typing import Any, Dict, Optional
from atloop.memory.state import AgentState
logger = logging.getLogger(__name__)
[docs]
class MemoryManager:
"""Manager for dynamic memory updates."""
[docs]
@staticmethod
def update_plan(state: AgentState, plan: str, reason: Optional[str] = None) -> None:
"""
Update the execution plan in long-term memory.
Args:
state: Agent state
plan: New plan text
reason: Optional reason for the update
"""
old_plan = state.memory.plan
state.memory.plan = plan
if reason:
logger.info(f"[MemoryManager] 📝 更新计划 (原因: {reason}): {plan[:100]}...")
else:
logger.info(f"[MemoryManager] 📝 更新计划: {plan[:100]}...")
# Log the change
if old_plan:
logger.debug(f"[MemoryManager] 旧计划: {old_plan[:100]}...")
[docs]
@staticmethod
def add_important_decision(
state: AgentState,
content: str,
step: Optional[int] = None,
context: Optional[Dict[str, Any]] = None,
) -> None:
"""
Add an important decision to long-term memory.
Args:
state: Agent state
content: Decision content
step: Step number (defaults to current step)
context: Optional context information
"""
decision = {
"step": step if step is not None else state.step,
"content": content,
"context": context or {},
}
state.memory.important_decisions.append(decision)
# Keep only last 20 important decisions
if len(state.memory.important_decisions) > 20:
state.memory.important_decisions = state.memory.important_decisions[-20:]
logger.info(f"[MemoryManager] 🎯 记录重要决策: {content[:100]}...")
[docs]
@staticmethod
def add_milestone(
state: AgentState,
content: str,
step: Optional[int] = None,
context: Optional[Dict[str, Any]] = None,
) -> None:
"""
Add a milestone to long-term memory.
Args:
state: Agent state
content: Milestone content
step: Step number (defaults to current step)
context: Optional context information
"""
milestone = {
"step": step if step is not None else state.step,
"content": content,
"context": context or {},
}
state.memory.milestones.append(milestone)
# Keep only last 20 milestones
if len(state.memory.milestones) > 20:
state.memory.milestones = state.memory.milestones[-20:]
logger.info(f"[MemoryManager] 🏆 记录里程碑: {content[:100]}...")
[docs]
@staticmethod
def add_learning(
state: AgentState,
learning: str,
step: Optional[int] = None,
) -> None:
"""
Add a learning to long-term memory.
Args:
state: Agent state
learning: Learning content
step: Step number (defaults to current step)
"""
learning_entry = f"[Step {step if step is not None else state.step}] {learning}"
state.memory.learnings.append(learning_entry)
# Keep only last 10 learnings
if len(state.memory.learnings) > 10:
state.memory.learnings = state.memory.learnings[-10:]
logger.info(f"[MemoryManager] 💡 记录经验: {learning[:100]}...")
[docs]
@staticmethod
def update_task_summary(
state: AgentState,
summary: str,
) -> None:
"""
Update task summary in long-term memory.
Args:
state: Agent state
summary: Task summary text
"""
old_summary = state.memory.task_summary
state.memory.task_summary = summary
logger.info(f"[MemoryManager] ≡ 更新任务概览: {summary[:100]}...")
if old_summary:
logger.debug(f"[MemoryManager] 旧概览: {old_summary[:100]}...")
[docs]
@staticmethod
def get_long_term_memory_summary(state: AgentState) -> str:
"""
Get a summary of long-term memory.
Args:
state: Agent state
Returns:
Summary string
"""
parts = []
if state.memory.task_summary:
parts.append(f"任务: {state.memory.task_summary[:100]}")
if state.memory.plan:
plan_preview = (
state.memory.plan[:100] + "..."
if len(state.memory.plan) > 100
else state.memory.plan
)
parts.append(f"计划: {plan_preview}")
if state.memory.important_decisions:
parts.append(f"重要决策: {len(state.memory.important_decisions)} 个")
if state.memory.milestones:
parts.append(f"里程碑: {len(state.memory.milestones)} 个")
if state.memory.learnings:
parts.append(f"经验: {len(state.memory.learnings)} 条")
return " | ".join(parts) if parts else "无长期记忆"