Observed since 20 Oct, 21:16 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
afx-hippocampus
Neuroscience-inspired memory framework for AI agents / 海马体 — Agent 大脑记忆框架
Neuroscience-inspired memory framework for AI agents
Hippocampus gives your AI agents a brain-like memory system. Just like the human hippocampus consolidates short-term experiences into long-term knowledge, this framework automatically organizes, prioritizes, and forgets memories so your agents stay sharp.
| Feature | Mem0 | Letta | Zep | Hippocampus |
|---|---|---|---|---|
| Memory consolidation | - | - | - | Automatic |
| Forgetting / decay | - | - | Implicit | Dynamic TTL formula |
| Tag-based knowledge graph | - | - | Partial | Built-in |
| Zero-config deployment | - | - | - | SQLite, one command |
| Vector search optional | - | - | - | Progressive disclosure |
| Multi-model (OpenAI/Claude/Qwen/GLM/Kimi) | Partial | Partial | Partial | Via LiteLLM |
| API / MCP / CLI | ||||
| ▼ | ||||
|
HIPPOCAMPUS Working Memory Inbox | ||||
| ▼ Consolidation Agent (Agentic RAG · Classify · Conflict Resolve · Tag Extract) | ||||
|
SEMANTIC Facts & Knowledge |
EPISODIC Events & History |
PREFERENCE Likes & Dislikes |
PROCEDURAL Skills & How-to |
CUSTOM Your Partitions |
| ▼ Hybrid Retrieval ⟷ Knowledge Graph ⟷ Forgetting (Dynamic TTL) | ||||
pip install afx-hippocampus # Install
hippocampus init # Initialize (creates hippocampus.json + SQLite DB)
hippocampus config set llm_api_key sk-your-key-here # Set LLM key
hippocampus start # Start server → http://localhost:8321/
Open http://localhost:8321/ for the Web Console, or http://localhost:8321/docs for the API docs.
Docker:
git clone https://github.com/afx-team/hippocampus.git && cd hippocampus
docker compose -f docker/docker-compose.yml up
One-line install:
curl -fsSL https://raw.githubusercontent.com/afx-team/hippocampus/main/scripts/install.sh | sh
# Store a memory
curl -X POST http://localhost:8321/api/v1/memories \
-H "Content-Type: application/json" \
-d '{"content": "User prefers dark mode", "tags": ["preference", "ui"], "importance_score": 7.5}'
# Search memories
curl -X POST http://localhost:8321/api/v1/search \
-H "Content-Type: application/json" \
-d '{"query": "UI preferences", "top_k": 5}'
# Trigger consolidation manually
curl -X POST http://localhost:8321/api/v1/admin/consolidate
# Explore the knowledge graph
curl http://localhost:8321/api/v1/graph/tags
curl http://localhost:8321/api/v1/graph/neighbors/python?depth=2
Memories flow through four stages — inspired by how the human hippocampus consolidates short-term experiences into long-term knowledge:
| Stage | What Happens | Trigger |
|---|---|---|
| Ingest | New memories land in the working memory inbox (mem_hippocampus) | API write |
| Consolidate | Agent classifies into partition, resolves conflicts, extracts tags → Knowledge Graph | Periodic / manual |
| Retrieve | Three-path hybrid search (vector + keyword + graph) with recency/importance/relevance scoring | API search |
| Forget | Dynamic TTL: base × (1 + log(access)) × importance × exp(-decay × days) — frequently used memories survive, neglected ones fade | Periodic |
Full details: Memory Lifecycle · Consolidation · Hybrid Search · Forgetting
All config lives in hippocampus.json — no environment variables needed.
hippocampus config list # View all settings
hippocampus config set llm_model openai/gpt-4o # Change model
hippocampus config set llm_base_url https://dashscope.aliyuncs.com/compatible-mode/v1 # Qwen/GLM/Kimi
| Field | Default | Description |
|---|---|---|
llm_model | openai/gpt-4o-mini | LLM model identifier (via LiteLLM) |
llm_api_key | null | LLM provider API key (required for consolidation) |
llm_base_url | null | Custom LLM API endpoint (for Qwen/GLM/Kimi) |
storage_type | sqlite | sqlite or postgresql |
embedding_enabled | true | Set false to disable vector search |
port | 8321 | Server port |
consolidation_interval_seconds | 3600 | How often consolidation runs |
base_ttl_hours | 168 | Base memory TTL before decay |
SQLite (default) — zero-config, single file, great for personal use and development.
PostgreSQL + pgvector — production-grade, connection pooling, native vector types.
pip install afx-hippocampus[pg]
hippocampus config set storage_type postgresql
hippocampus config set pg_url postgresql://user:pass@localhost/hippocampus
Full config reference: Configuration Guide
Via LiteLLM, Hippocampus works with any major LLM provider:
| Provider | Model Example | Env Var |
|---|---|---|
| OpenAI | openai/gpt-4o-mini | OPENAI_API_KEY |
| Anthropic | anthropic/claude-3-haiku-20240307 | ANTHROPIC_API_KEY |
| Qwen (Alibaba) | openai/qwen-plus | HIPPOCAMPUS_LLM_API_KEY + HIPPOCAMPUS_LLM_BASE_URL |
| GLM (Zhipu) | openai/glm-4 | HIPPOCAMPUS_LLM_API_KEY + HIPPOCAMPUS_LLM_BASE_URL |
| Kimi (Moonshot) | openai/moonshot-v1-8k | HIPPOCAMPUS_LLM_API_KEY + HIPPOCAMPUS_LLM_BASE_URL |
git clone https://github.com/afx-team/hippocampus.git
cd hippocampus
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Lint
ruff check src/
# Type check
mypy src/hippocampus/
See CONTRIBUTING.md for contribution guidelines.
This project draws on research from:
See repo_pages/papers/ for detailed survey notes.
Built by afx-team
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fastapi>=0.115.0 | runtime |
uvicornEnvironment{
"extras": "standard",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | uvicorn[standard]>=0.30.0 | runtime |
litellmEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.40.0 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic>=2.0.0 | runtime |
sqlite-vecEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | sqlite-vec>=0.1.0 | runtime |
aiosqliteEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | aiosqlite>=0.20.0 | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | numpy>=1.24.0 | runtime |
sentence-transformersEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | sentence-transformers>=3.0.0 | runtime |
apschedulerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | apscheduler>=3.10.0 | runtime |
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | click>=8.0.0 | runtime |
richEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | rich>=13.0.0 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27.0 | runtime |
PyJWTEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | PyJWT>=2.8.0 | runtime |
networkxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | networkx>=3.1 | runtime |
mcpEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mcp>=1.0.0 | runtime |
asyncpgEnvironment{
"extras": "",
"marker": "extra == \"pg\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | asyncpg>=0.29.0; extra == "pg" | runtime |
pgvectorEnvironment{
"extras": "",
"marker": "extra == \"pg\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pgvector>=0.3.0; extra == "pg" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=8.0.0; extra == "dev" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.23.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=5.0.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.5.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.10.0; extra == "dev" | runtime |
datasetsEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | datasets>=2.0.0; extra == "dev" | runtime |
pandasEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pandas>=2.0.0; extra == "dev" | runtime |
scikit-learnEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | scikit-learn>=1.3.0; extra == "dev" | runtime |
bdist_wheel · 67 KB · Python py3
sdist · 55.83 KB · Python source
Observed since 20 Oct, 21:16 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:6daf8d747af2e4e27d770f5284ee738d85911e5c051be54a3b86a955c1bb2e22