logo
0
0
WeChat Login

ReMe Logo

Python Version PyPI Version PyPI Downloads GitHub commit activity

License English 简体中文 GitHub Stars

A memory management toolkit for AI agents — Remember Me, Refine Me.

For legacy versions, see 0.2.x Documentation


🧠 ReMe is a memory management framework built for AI agents, offering both file-based and vector-based memory systems.

It addresses two core problems of agent memory: limited context windows (early information gets truncated or lost during long conversations) and stateless sessions (new conversations cannot inherit history and always start from scratch).

ReMe gives agents real memory — old conversations are automatically condensed, important information is persisted, and the next conversation can recall it automatically.


📁 File-Based ReMe

Memory as files, files as memory

Treat memory as files — readable, editable, and portable.

Traditional Memory SystemsFile-Based ReMe
🗄️ Database storage📝 Markdown files
🔒 Opaque👀 Read anytime
❌ Hard to modify✏️ Edit directly
🚫 Hard to migrate📦 Copy to migrate
.reme/ ├── MEMORY.md # Long-term memory: user preferences, project config, etc. └── memory/ └── YYYY-MM-DD.md # Daily logs: work records for the day, written upon compact

Core Capabilities

ReMe File Based is the core class of the file-based memory system. It acts like an intelligent secretary, managing all memory-related operations:

MethodFunctionKey Components
start🚀 Start memory systemBaseFileStore (local file storage)
BaseFileWatcher (file watcher)
BaseEmbeddingModel (embedding cache)
close📕 Close and saveClose file store, stop file watcher, save embedding cache
context_check📏 Check context limitContextChecker
compact📦 Compact history to summaryCompactor
summary📝 Write important memory to filesSummarizer
memory_search🔍 Semantic memory searchMemorySearch
memory_get📖 Read specified memory fileMemoryGet

🗃️ Vector-Based ReMe

ReMe Vector Based is the core class for the vector-based memory system, supporting unified management of three memory types:

Memory TypePurposeUsage Context
Personal memoryUser preferences, habitsuser_name
Task / procedural memoryTask execution experience, success/failure patternstask_name
Tool memoryTool usage experience, parameter tuningtool_name

Core Capabilities

MethodFunctionDescription
summarize_memory🧠 Summarize memoryAutomatically extract and store memory from conversations
retrieve_memory🔍 Retrieve memoryRetrieve relevant memory by query
add_memory➕ Add memoryManually add memory to vector store
get_memory📖 Get memoryFetch a single memory by ID
update_memory✏️ Update memoryUpdate content or metadata of existing memory
delete_memory🗑️ Delete memoryDelete specified memory
list_memory📋 List memoryList memories with filtering and sorting

💻 ReMeCli: Terminal Assistant with File-Based Memory







When Is Memory Written?

ScenarioWritten toTrigger
Auto-compact when context is too longmemory/YYYY-MM-DD.mdAutomatic in background
User runs /compactmemory/YYYY-MM-DD.mdManual compact + background save
User runs /newmemory/YYYY-MM-DD.mdNew conversation + background save
User says "remember this"MEMORY.md or logAgent writes via write tool
Agent finds important decisions/preferencesMEMORY.mdAgent writes proactively

Memory Retrieval Tools

MethodToolWhen to useExample
Semantic searchmemory_searchUnsure where it is, fuzzy lookup"Earlier discussion about deployment"
Direct readreadKnow the date or fileRead memory/2025-02-13.md

Search uses vector + BM25 hybrid retrieval (vector weight 0.7, BM25 weight 0.3), so queries using both natural language and exact keywords can match.

Built-in Tools

ToolFunctionDetails
memory_searchSearch memoryVector + BM25 hybrid search over MEMORY.md and memory/*.md
bashRun commandsExecute bash commands with timeout and output truncation
lsList directoryShow directory structure
readRead fileText and images supported, with segmented reading
editEdit fileReplace after exact text match
writeWrite fileCreate or overwrite, auto-create directories
execute_codeRun PythonExecute code snippets
web_searchWeb searchSearch via Tavily

🚀 Quick Start

Installation

pip install -U reme-ai

Environment Variables

API keys are set via environment variables; you can put them in a .env file in the project root:

VariableDescriptionExample
REME_LLM_API_KEYLLM API keysk-xxx
REME_LLM_BASE_URLLLM base URLhttps://dashscope.aliyuncs.com/compatible-mode/v1
REME_EMBEDDING_API_KEYEmbedding API keysk-xxx
REME_EMBEDDING_BASE_URLEmbedding base URLhttps://dashscope.aliyuncs.com/compatible-mode/v1
TAVILY_API_KEYTavily search API key (optional)tvly-xxx

Using ReMeCli

Start ReMeCli

remecli config=cli

ReMeCli System Commands

Year of the Horse easter egg: /horse — fireworks, galloping animation, and random horse-year blessings.

Commands starting with / control session state:

CommandDescriptionWaits for response
/compactManually compact current conversation and save to long-term memoryYes
/newStart new conversation; history saved to long-term memoryNo
/clearClear everything, without savingNo
/historyView uncompressed messages in current conversationNo
/helpShow command listNo
/exitExitNo

Difference between the three commands

CommandCompact summaryLong-term memoryMessage history
/compactNew summarySavedKeep recent
/newClearedSavedCleared
/clearClearedNot savedCleared

/clear permanently deletes; nothing is persisted anywhere.

Using the ReMe Package

File-Based ReMe

import asyncio from reme import ReMeFb async def main(): # Initialize and start reme = ReMeFb( default_llm_config={ "backend": "openai", # Backend type, OpenAI-compatible API "model_name": "qwen3.5-plus", # Model name }, default_file_store_config={ "backend": "chroma", # Store backend: sqlite/chroma/local "fts_enabled": True, # Enable full-text search "vector_enabled": False, # Enable vector search (set False if no embedding service) }, context_window_tokens=128000, # Model context window size (tokens) reserve_tokens=36000, # Tokens reserved for output keep_recent_tokens=20000, # Tokens to keep for recent messages vector_weight=0.7, # Vector search weight (0–1) for hybrid search candidate_multiplier=3.0, # Candidate multiplier for recall ) await reme.start() messages = [ {"role": "user", "content": "I prefer Python 3.12"}, {"role": "assistant", "content": "Noted, you prefer Python 3.12"}, ] # Check if context exceeds limit result = await reme.context_check(messages) print(f"Compact result: {result}") # Compact conversation to summary summary = await reme.compact(messages_to_summarize=messages) print(f"Summary: {summary}") # Write important memory to files (ReAct Agent does this automatically) await reme.summary(messages=messages, date="2026-02-28") # Semantic search over memory results = await reme.memory_search(query="Python version preference", max_results=5) print(f"Search results: {results}") # Read specified memory file content = await reme.memory_get(path="MEMORY.md") print(f"Memory content: {content}") # Close (save embedding cache, stop file watcher) await reme.close() if __name__ == "__main__": asyncio.run(main())

Vector-Based ReMe

import asyncio from reme import ReMe async def main(): # Initialize ReMe reme = ReMe( working_dir=".reme", default_llm_config={ "backend": "openai", "model_name": "qwen3-30b-a3b-thinking-2507", }, default_embedding_model_config={ "backend": "openai", "model_name": "text-embedding-v4", "dimensions": 1024, }, default_vector_store_config={ "backend": "local", # Supports local/chroma/qdrant/elasticsearch }, ) await reme.start() messages = [ {"role": "user", "content": "Help me write a Python script", "time_created": "2026-02-28 10:00:00"}, {"role": "assistant", "content": "Sure, I'll help you write it", "time_created": "2026-02-28 10:00:05"}, ] # 1. Summarize memory from conversation (auto-extract user preferences, task experience, etc.) result = await reme.summarize_memory( messages=messages, user_name="alice", # Personal memory task_name="code_writing", # Task memory ) print(f"Summarize result: {result}") # 2. Retrieve relevant memory memories = await reme.retrieve_memory( query="Python programming", user_name="alice", task_name="code_writing", ) print(f"Retrieve result: {memories}") # 3. Manually add memory memory_node = await reme.add_memory( memory_content="User prefers concise code style", user_name="alice", when_to_use="When writing code for the user", ) print(f"Added memory: {memory_node}") memory_id = memory_node.memory_id # 4. Get single memory by ID fetched_memory = await reme.get_memory(memory_id=memory_id) print(f"Fetched memory: {fetched_memory}") # 5. Update memory content updated_memory = await reme.update_memory( memory_id=memory_id, user_name="alice", memory_content="User prefers concise, well-commented code style", when_to_use="When writing or reviewing code for the user", ) print(f"Updated memory: {updated_memory}") # 6. List all memories for user (with filtering and sorting) all_memories = await reme.list_memory( user_name="alice", limit=10, sort_key="time_created", reverse=True, ) print(f"User memory list: {all_memories}") # 7. Delete specified memory await reme.delete_memory(memory_id=memory_id) print(f"Deleted memory: {memory_id}") # 8. Delete all memories (use with caution) # await reme.delete_all() await reme.close() if __name__ == "__main__": asyncio.run(main())

🏛️ Technical Architecture

File-Based ReMe Core Architecture

Memory Summary: ReAct + File Tools

Summarizer is the core component for memory summarization. It uses the ReAct + file tools pattern.

File Tool Set

Summarizer is equipped with file operation tools so the AI can work directly on memory files:

ToolFunctionUse case
readRead file contentView existing memory, avoid duplicates
writeOverwrite fileCreate new memory file or major rewrite
editEdit part of fileAppend or modify specific sections

Context Compaction

When a conversation gets too long, Compactor compresses history into a concise summary — like meeting minutes, turning long discussion into key points.

The compact summary includes what’s needed to continue:

ContentDescription
🎯 GoalsWhat the user wants to accomplish
⚙️ ConstraintsRequirements and preferences mentioned
📈 ProgressCompleted / in progress / blocked tasks
🔑 DecisionsDecisions made and reasons
📌 ContextKey data such as file paths, function names

Memory Retrieval

MemorySearch provides vector + BM25 hybrid retrieval. The two methods complement each other:

RetrievalStrengthWeakness
Vector semanticCaptures similar meaning with different wordingWeaker on exact token match
BM25 full-textStrong exact token matchNo synonym or paraphrase understanding

Fusion: Both retrieval paths are used; results are combined by weighted sum (vector 0.7 + BM25 0.3), so both natural-language queries and exact lookups get reliable results.


Vector-Based ReMe Core Architecture


⭐ Community & Support

  • Star & Watch: Star helps more agent developers discover ReMe; Watch keeps you updated on new releases and features.
  • Share your work: In Issues or Discussions, share what ReMe unlocks for your agents — we’re happy to highlight great community examples.
  • Need a new feature? Open a Feature Request; we’ll iterate with the community.
  • Code contributions: All forms of code contribution are welcome. See the Contribution Guide.
  • Acknowledgments: Thanks to OpenClaw, Mem0, MemU, CoPaw, and other open-source projects for inspiration and support.

📄 Citation

@software{AgentscopeReMe2025, title = {AgentscopeReMe: Memory Management Kit for Agents}, author = {ReMe Team}, url = {https://reme.agentscope.io}, year = {2025} }

⚖️ License

This project is open source under the Apache License 2.0. See the LICENSE file for details.


📈 Star History

Star History Chart

About

ReMe: Memory Management Kit for Agents - Remember Me, Refine Me. reme.agentscope.io https://github.com/agentscope-ai/ReMe.git

36.67 MiB
0 forks0 stars11 branches32 TagREADMEApache-2.0 license
Language
Python100%
Shell0%