Skip to main content

Memory

Agentix has two distinct memory systems that serve different purposes:

SystemWhat it isScope
Context memoryConversation history kept in the context windowCurrent session only
Memories toolPersistent notes the agent reads and writes across sessionsSurvives session restarts

Context memory

The agent automatically manages how much conversation history it keeps in the context window.

options = AgentixAgentOptions(
conversation_summarization_enabled=True, # default: True — summarize old messages
max_conversation_window=10, # default: 10 — keep last N messages verbatim
max_context_tokens=16384, # default: 16384 — summarize when exceeded
)

When the conversation exceeds max_context_tokens, Agentix summarizes the oldest messages so the agent retains the gist without filling the window. The PreCompact hook fires before each compaction:

from agentix import HookMatcher

async def on_compact(hook_input: dict, context) -> None:
print(f"Compacting — {hook_input['current_count']} messages in history")

options = AgentixAgentOptions(
hooks={"PreCompact": [HookMatcher(matcher=None, hooks=[on_compact])]}
)

Disable summarization (older messages are dropped instead — not recommended for long sessions):

options = AgentixAgentOptions(conversation_summarization_enabled=False)

Memories tool

The Memories built-in tool lets the agent persist facts and notes to disk. Unlike conversation history, memories survive across sessions — the agent can record something in one run and recall it in a completely different session later.

Enabling memories

memories_enabled defaults to False. You must explicitly enable it:

options = AgentixAgentOptions(
memories_enabled=True,
)

When enabled, the Memories tool is registered and the agent's system prompt is updated with instructions on how to use it.

Interaction with allowed_tools:

  • If allowed_tools is empty (the default — all tools allowed), the Memories tool is registered and usable without any further configuration.
  • If allowed_tools is non-empty (a restricted allow-list), Memories is automatically appended to it — unless it is explicitly listed in disallowed_tools.
# Memories auto-appended to the restricted allow-list
options = AgentixAgentOptions(
memories_enabled=True,
allowed_tools=["Read", "Glob", "Grep"],
# effective allow-list becomes ["Read", "Glob", "Grep", "Memories"]
)

# Prevent Memories even when memories_enabled=True
options = AgentixAgentOptions(
memories_enabled=True,
disallowed_tools=["Memories"],
)

How the agent uses it

The agent reads and writes memory files autonomously based on context. Guide this with your system prompt:

options = AgentixAgentOptions(
memories_enabled=True,
system_prompt="""You are a personal assistant.
Use the Memories tool to remember user preferences, names, and facts they tell you.
Always read your memories at the start of each conversation.""",
)

Storage location

Memories for the main agent are stored at:

<cwd>/.agentix/memories/

Where cwd is the working directory set on AgentixAgentOptions (defaults to the process working directory). The Memories tool supports view, create, str_replace, delete, and rename operations on files within this directory.

Sub-agents do not inherit memories_enabled. They use the memory field on AgentDefinition instead — see below.


Sub-agent memory scoping

Each sub-agent in a multi-agent setup has its own memory scope that controls where (and whether) it stores memories:

from agentix import AgentDefinition, AgentixAgentOptions

options = AgentixAgentOptions(
agents={
"researcher": AgentDefinition(
name="researcher",
description="Gathers information on a topic.",
tools=["WebSearch", "WebFetch"],
memory="project", # store memories in .agentix/agent-memory/researcher/
),
"writer": AgentDefinition(
name="writer",
description="Writes polished content from research notes.",
tools=["Read", "Write"],
memory="none", # default — no persistent memory
),
}
)

Memory scope values

ValueStorage pathVisibility
"none"No persistent memory (default)
"user"~/.agentix/agent-memory/<name>/Shared across all projects on this machine
"project"<cwd>/.agentix/agent-memory/<name>/Per-project; can be committed to source control
"local"<cwd>/.agentix/agent-memory-local/<name>/Per-project, machine-local; gitignore this

Where <name> is the sanitized sub-agent name.

Guidance:

  • Use "project" when sub-agents accumulate domain knowledge that should persist for the whole team.
  • Use "user" when sub-agents learn per-developer preferences across projects.
  • Use "local" for sensitive or machine-specific facts that shouldn't be committed.
  • Leave as "none" (the default) when a sub-agent is stateless and repeatable.

Relationship to sessions

Memory and sessions are independent:

  • Sessions track the conversation between you and the agent (turn-by-turn messages).
  • Memories track facts the agent chooses to persist (agent-authored notes in files).

Clearing a session with client.reset_session() does not erase memories. The agent's stored notes persist until you delete the files from disk.

See Sessions for managing conversation history, and Storage Backends for plugging in distributed storage.