Three layers, all optional:
Conversation memory (default)
Every agent has a ConversationMemory that stores the message list and trims
itself when approaching the context limit. You rarely touch it directly, but
you can:
agent.memory.get_messages() # current message list
agent.memory.set_messages(saved) # restore
Agent memory — markdown notes on disk
AgentMemory persists titled, tagged notes as markdown files. You expose it
to the model through tools you write:
from harnessx import AgentMemory, PermissionLevel
memory = AgentMemory(storage_dir=".agent_memory/agent")
@agent.tools.register(permission=PermissionLevel.ALLOW)
async def save_memory(title: str, content: str, tags: str = "") -> str:
"""Save a note to persistent memory.
Args:
title: Short title for the memory.
content: The information to remember.
tags: Comma-separated tags.
"""
tag_list = [t.strip() for t in tags.split(",") if t.strip()]
filename = memory.save(title, content, tags=tag_list)
return f"Saved '{title}' -> {filename}"
@agent.tools.register(permission=PermissionLevel.ALLOW)
async def search_memory(query: str = "") -> str:
"""Search saved memories by keyword."""
results = memory.search(query=query)
return "\n".join(f"- {r['title']} [{r['filename']}]" for r in results) or "None found."
Long-term memory — structured facts
LongTermMemory stores categorized facts with ids:
from harnessx import LongTermMemory
long_term = LongTermMemory(storage_dir=".agent_memory/long_term")
fact_id = long_term.save("User prefers dark mode", category="preference")
long_term.search(query="dark mode")
long_term.update(fact_id, "User prefers light mode")
Tell the agent about these tools in the system prompt and when to use them
("proactively save useful information"). A complete two-layer example is in
examples/memory_agent.py.