parent
f17406fdf0
commit
3f2a6ec9ce
3 changed files with 652 additions and 377 deletions
266
hindsight-docs/blog/2026-03-04-mcp-agent-memory.md
Normal file
266
hindsight-docs/blog/2026-03-04-mcp-agent-memory.md
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
---
|
||||
title: "The Open-Source MCP Memory Server Your AI Agent Is Missing"
|
||||
authors: [hindsight]
|
||||
date: 2026-03-04
|
||||
tags: [mcp, memory, agents, docker, tutorial]
|
||||
image: /img/blog/mcp-agent-memory.png
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
AI agents forget everything between sessions. Hindsight gives them persistent, structured memory via MCP. One Docker command to run the full stack locally. Connect any MCP-compatible client. Three core operations: `retain` (store), `recall` (search), `reflect` (reason) — plus mental models that auto-update as memories grow.
|
||||
|
||||
<!-- truncate -->
|
||||
|
||||
---
|
||||
|
||||
## TL;DR
|
||||
|
||||
- AI agents forget everything between sessions. Hindsight gives them persistent, structured memory via MCP.
|
||||
- One Docker command to run the full stack locally. Connect any MCP-compatible client.
|
||||
- Three core operations: `retain` (store), `recall` (search), `reflect` (reason). Plus mental models — living documents that auto-update as memories grow.
|
||||
- Hindsight isn't a vector database. It extracts structured facts, resolves entities, builds a knowledge graph, and uses cross-encoder reranking to surface what actually matters.
|
||||
- Open source: [github.com/vectorize-io/hindsight](https://github.com/vectorize-io/hindsight).
|
||||
|
||||
---
|
||||
|
||||
## The Problem
|
||||
|
||||
AI agents are stateless. Every session starts from zero.
|
||||
|
||||
You tell your coding assistant your tech stack, your deployment preferences, your team's conventions. Next session — gone. You explain the same architecture decisions, re-establish the same context, re-state the same constraints. Every time.
|
||||
|
||||
People work around this by pasting context into system prompts or maintaining notes they copy in manually. That works for a while, but it doesn't scale. It can't capture the kind of nuanced, evolving knowledge that accumulates over weeks of working with an agent — things like "this user prefers functional patterns," "their team uses PostgreSQL 16," or "they tried Redis caching last month and rolled it back."
|
||||
|
||||
What you actually want is for your agent to build up memory over time. Store what matters, retrieve it when relevant, and learn from the accumulation.
|
||||
|
||||
Hindsight is an open-source memory system designed for exactly this. It connects to any MCP-compatible agent and gives it persistent, structured long-term memory.
|
||||
|
||||
---
|
||||
|
||||
## The Approach
|
||||
|
||||
```
|
||||
Your MCP Client ──MCP (HTTP)──> Hindsight API
|
||||
(Claude, Cursor, │
|
||||
VS Code, etc.) ├── Memory Engine (retain/recall/reflect)
|
||||
├── Fact Extraction + Entity Resolution
|
||||
├── Embeddings + Cross-Encoder Reranking
|
||||
├── Knowledge Graph Traversal
|
||||
└── PostgreSQL + pgvector
|
||||
```
|
||||
|
||||
Your agent connects to Hindsight over MCP (Model Context Protocol). MCP is an open standard — any client that speaks it can use Hindsight as a memory backend.
|
||||
|
||||
When your agent stores a memory via `retain`, Hindsight doesn't just dump raw text into a vector database. It extracts structured facts, resolves entities ("Alice" and "my coworker Alice" are the same person), generates embeddings, and indexes everything for retrieval.
|
||||
|
||||
When your agent needs context via `recall`, Hindsight runs four retrieval strategies in parallel — semantic search, BM25 keyword matching, entity graph traversal, and temporal filtering — then reranks results with a cross-encoder. What comes back is the most relevant subset of your memories, not a raw dump.
|
||||
|
||||
This matters because naive RAG (embed text, cosine similarity, return top-k) breaks down when you have hundreds of memories spanning different topics and time periods. Hindsight's multi-strategy approach ensures that a question like "what did we decide about caching?" finds the right answer even when the memory uses different terminology.
|
||||
|
||||
---
|
||||
|
||||
## Implementation
|
||||
|
||||
### Step 1: Start Hindsight
|
||||
|
||||
The quickest way to run Hindsight is with Docker. One command gives you the full stack — API server, embedded PostgreSQL, local embedding models, and MCP endpoints:
|
||||
|
||||
```bash
|
||||
docker run --rm -it --pull always -p 8888:8888 -p 9999:9999 \
|
||||
-e HINDSIGHT_API_LLM_API_KEY=YOUR_LLM_API_KEY \
|
||||
-v $HOME/.hindsight-docker:/home/hindsight/.pg0 \
|
||||
ghcr.io/vectorize-io/hindsight:latest
|
||||
```
|
||||
|
||||
You'll need an LLM API key for Hindsight's internal processing (fact extraction, entity resolution, reflect). Hindsight supports multiple LLM providers — OpenAI, Anthropic, Gemini, Groq, or a local model via Ollama or LM Studio. Set the provider explicitly if you're not using OpenAI:
|
||||
|
||||
```bash
|
||||
docker run --rm -it --pull always -p 8888:8888 -p 9999:9999 \
|
||||
-e HINDSIGHT_API_LLM_PROVIDER=gemini \
|
||||
-e HINDSIGHT_API_LLM_API_KEY=YOUR_GEMINI_API_KEY \
|
||||
-e HINDSIGHT_API_LLM_MODEL=gemini-2.5-flash \
|
||||
-v $HOME/.hindsight-docker:/home/hindsight/.pg0 \
|
||||
ghcr.io/vectorize-io/hindsight:latest
|
||||
```
|
||||
|
||||
The `-v` flag persists your data across container restarts. Without it, memories are lost when the container stops. Port 8888 is the API and MCP endpoint; port 9999 is an optional admin UI for browsing memories.
|
||||
|
||||
Once running, the MCP endpoint is available at `http://localhost:8888/mcp/your_bank_id/` (replace `your_bank_id` with any name you like).
|
||||
|
||||
**Or use Hindsight Cloud** — skip Docker entirely. [Sign up for a free account](https://ui.hindsight.vectorize.io/signup), grab your API key, and connect via MCP:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"hindsight": {
|
||||
"type": "http",
|
||||
"url": "https://api.hindsight.vectorize.io/mcp/your_bank_id/",
|
||||
"headers": {
|
||||
"Authorization": "Bearer YOUR_API_KEY"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Or with Claude Code:
|
||||
|
||||
```bash
|
||||
claude mcp add --transport http hindsight \
|
||||
https://api.hindsight.vectorize.io/mcp/your_bank_id/ \
|
||||
--header "Authorization: Bearer YOUR_API_KEY"
|
||||
```
|
||||
|
||||
### Step 2: Connect Your MCP Client
|
||||
|
||||
Hindsight works with any MCP-compatible client. Add the following JSON to your client's config file:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"hindsight": {
|
||||
"type": "http",
|
||||
"url": "http://localhost:8888/mcp/your_bank_id/"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Config file locations by client:
|
||||
|
||||
| Client | Config File |
|
||||
|--------|-------------|
|
||||
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows) |
|
||||
| Cursor | `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global) |
|
||||
| VS Code | `.vscode/mcp.json` — uses `"servers"` instead of `"mcpServers"` |
|
||||
| Windsurf | `~/.codeium/windsurf/mcp_config.json` — uses `"serverUrl"` instead of `"url"` |
|
||||
|
||||
**Claude Code** — use the CLI instead:
|
||||
|
||||
```bash
|
||||
claude mcp add --transport http hindsight http://localhost:8888/mcp/your_bank_id/
|
||||
```
|
||||
|
||||
Restart your client to pick up the changes.
|
||||
|
||||
### Step 3: Verify It's Working
|
||||
|
||||
Ask your agent:
|
||||
|
||||
> "What memory tools do you have available?"
|
||||
|
||||
It should list Hindsight's memory tools, including the three core operations (`retain`, `recall`, `reflect`), six mental model tools, and additional tools for browsing memories, managing documents, and bank administration.
|
||||
|
||||
---
|
||||
|
||||
## The Memory Tools
|
||||
|
||||
Once connected, your agent has access to three core operations and a set of mental model tools.
|
||||
|
||||
**Retain** — Store a memory:
|
||||
|
||||
Tell your agent something you want it to remember. It will call `retain` automatically based on the tool's built-in instructions, or you can be explicit:
|
||||
|
||||
> "Remember that I prefer TypeScript over JavaScript for all new projects."
|
||||
|
||||
Behind the scenes, Hindsight extracts structured facts, resolves entities, and indexes the memory for later retrieval. A single `retain` call on "Alice from engineering recommended we switch to Postgres 16 for the new JSONB features" produces:
|
||||
|
||||
- A fact: "Alice recommended switching to Postgres 16 for JSONB features"
|
||||
- Entity resolution: "Alice" linked to "Alice from engineering"
|
||||
- Temporal indexing: when this was mentioned
|
||||
- Embeddings: for semantic search later
|
||||
|
||||
**Recall** — Search memories:
|
||||
|
||||
Your agent will proactively recall relevant context when you ask questions. You can also prompt it directly:
|
||||
|
||||
> "What do you know about my programming preferences?"
|
||||
|
||||
Recall runs four retrieval strategies in parallel — semantic search, keyword matching (BM25), graph traversal, and temporal filtering — then reranks the results with a cross-encoder. This is what makes it work better than a simple vector search.
|
||||
|
||||
**Reflect** — Synthesize insights:
|
||||
|
||||
Reflect goes deeper than recall. Instead of returning raw facts, it reasons across your memories using an LLM:
|
||||
|
||||
> "Based on what you know about me, what tech stack would you recommend for my next side project?"
|
||||
|
||||
This is useful for questions that require connecting dots across multiple memories.
|
||||
|
||||
**Mental Models** — Living documents:
|
||||
|
||||
Mental models are summaries that automatically stay up to date as new memories are added. Think of them as pre-computed reflections that refresh themselves:
|
||||
|
||||
> "Create a mental model called 'My Tech Stack' that tracks what languages, frameworks, and tools I use."
|
||||
|
||||
You can list, retrieve, update, and delete mental models. They're useful for maintaining an always-current view of a topic without running a full `reflect` every time.
|
||||
|
||||
---
|
||||
|
||||
## Memory Banks
|
||||
|
||||
The URL path controls which memory bank you're using. In the examples above, `/mcp/your_bank_id/` scopes all operations to that bank.
|
||||
|
||||
Banks are isolated stores — think of each one as a separate brain. You can run separate banks for different contexts:
|
||||
|
||||
- `my-project` for a specific project
|
||||
- `team-knowledge` for shared team information
|
||||
- One bank per user in a multi-agent system
|
||||
|
||||
Banks are created automatically on first use. To use a different bank, change the URL path:
|
||||
|
||||
```
|
||||
http://localhost:8888/mcp/project-x/
|
||||
```
|
||||
|
||||
If you want your agent to manage multiple banks in a single session, connect to the multi-bank endpoint at `/mcp/` instead. This adds `bank_id` as a parameter to every tool and includes additional bank management tools like `list_banks`, `create_bank`, and `get_bank_stats`.
|
||||
|
||||
---
|
||||
|
||||
## Pitfalls & Edge Cases
|
||||
|
||||
### Memory processing is async
|
||||
|
||||
When your agent calls `retain`, fact extraction and indexing happen in the background. If you store something and immediately try to recall it, it might not be there yet. Give it a few seconds for complex memories.
|
||||
|
||||
### Token limits on recall
|
||||
|
||||
By default, `recall` returns up to 4096 tokens of memory content. For banks with extensive history, some older or lower-relevance memories may be trimmed from the response. This is intentional — it keeps the context window manageable.
|
||||
|
||||
### Mental model creation is async too
|
||||
|
||||
When you create or refresh a mental model, the LLM-powered generation runs in the background. The initial call returns an `operation_id`. The content will be available shortly after — typically a few seconds, depending on how many memories need to be synthesized.
|
||||
|
||||
### LLM key is for Hindsight, not your agent
|
||||
|
||||
The `HINDSIGHT_API_LLM_API_KEY` is used by Hindsight internally for fact extraction, entity resolution, and reflect operations. It's separate from whatever LLM your agent uses. You can use a cheap, fast model here (Gemini Flash, Groq, etc.) — it doesn't need to be the same model powering your agent.
|
||||
|
||||
---
|
||||
|
||||
## When Hindsight Works Well
|
||||
|
||||
- You want structured memory, not just vector search over conversation logs
|
||||
- You need memory that works across sessions, clients, and agents
|
||||
- You want entity resolution, temporal awareness, and multi-strategy retrieval out of the box
|
||||
- You're building agents that accumulate knowledge over time
|
||||
|
||||
---
|
||||
|
||||
## Recap
|
||||
|
||||
Hindsight gives any MCP-compatible agent persistent long-term memory. One Docker command to start, a few lines of JSON to connect.
|
||||
|
||||
The key insight is that memory isn't just storage and retrieval. Hindsight extracts structured facts from raw input, links entities, tracks temporal data, and uses cross-encoder reranking to surface the most relevant memories. That's what separates it from stuffing conversation logs into a vector database.
|
||||
|
||||
The MCP tools cover the full lifecycle: `retain` to store, `recall` to search with multi-strategy retrieval, `reflect` to synthesize insights, mental model tools for maintaining living documents that auto-update, and utility tools for browsing and managing memories, documents, and tags.
|
||||
|
||||
> **Want managed hosting?** [Hindsight Cloud](https://ui.hindsight.vectorize.io) runs the full stack for you — no Docker, no infrastructure. Sign up, grab an API key, and connect over HTTPS.
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
- **Build up your memory**: Start using your agent normally. Tell it your preferences, your project context, your decisions. It will retain what matters.
|
||||
- **Explore mental models**: Create living documents that auto-update as your memory grows. Try: `"Create a mental model that summarizes my project architecture."`
|
||||
- **Try multi-bank setups**: Run separate banks for different projects or agents. Connect to `/mcp/` for multi-bank mode.
|
||||
- **Use the SDK directly**: Beyond MCP, Hindsight has [Python](https://pypi.org/project/hindsight-client/) and [TypeScript](https://www.npmjs.com/package/@vectorize-io/hindsight-client) SDKs for integrating memory into your own applications.
|
||||
- **Check out the docs**: Full API reference, SDK guides, and more at [hindsight.vectorize.io](https://hindsight.vectorize.io).
|
||||
|
|
@ -1,377 +1,386 @@
|
|||
import {themes as prismThemes} from 'prism-react-renderer';
|
||||
import type {Config} from '@docusaurus/types';
|
||||
import type * as Preset from '@docusaurus/preset-classic';
|
||||
|
||||
const umamiUrl = process.env.UMAMI_URL;
|
||||
const umamiWebsiteId = process.env.UMAMI_WEBSITE_ID;
|
||||
|
||||
// Announcement bar - supports HTML for links
|
||||
// Set to empty string '' to hide the bar
|
||||
const ANNOUNCEMENT_BAR = 'Hindsight is State-of-the-Art on Memory for AI Agents | <a href="https://arxiv.org/abs/2512.12818" target="_blank">Read the paper →</a>';
|
||||
|
||||
const config: Config = {
|
||||
title: 'Hindsight',
|
||||
tagline: 'Hindsight: Agent Memory That Works Like Human Memory',
|
||||
favicon: 'img/favicon.png',
|
||||
|
||||
future: {
|
||||
v4: true,
|
||||
},
|
||||
|
||||
markdown: {
|
||||
mermaid: true,
|
||||
},
|
||||
|
||||
url: 'https://hindsight.vectorize.io',
|
||||
baseUrl: '/',
|
||||
|
||||
organizationName: 'vectorize-io',
|
||||
projectName: 'hindsight',
|
||||
trailingSlash: false,
|
||||
|
||||
onBrokenLinks: 'throw',
|
||||
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en'],
|
||||
},
|
||||
|
||||
headTags: [
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'preconnect',
|
||||
href: 'https://fonts.googleapis.com',
|
||||
},
|
||||
},
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'preconnect',
|
||||
href: 'https://fonts.gstatic.com',
|
||||
crossorigin: 'anonymous',
|
||||
},
|
||||
},
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'stylesheet',
|
||||
href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap',
|
||||
media: 'print',
|
||||
onload: "this.media='all'",
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
scripts: [
|
||||
...(umamiUrl && umamiWebsiteId
|
||||
? [
|
||||
{
|
||||
src: `${umamiUrl}/script.js`,
|
||||
async: true,
|
||||
defer: true,
|
||||
'data-website-id': umamiWebsiteId,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
],
|
||||
|
||||
presets: [
|
||||
[
|
||||
'classic',
|
||||
{
|
||||
docs: {
|
||||
sidebarPath: './sidebars.ts',
|
||||
routeBasePath: '/',
|
||||
// Only show "next" version in development or when INCLUDE_CURRENT_VERSION=true
|
||||
// In production, only show released versions from versions.json
|
||||
onlyIncludeVersions: (() => {
|
||||
const isDev = process.env.NODE_ENV === 'development' || process.env.INCLUDE_CURRENT_VERSION === 'true';
|
||||
try {
|
||||
const versions = require('./versions.json') as string[];
|
||||
// In dev mode, explicitly include 'current' (Next) + all released versions
|
||||
// In production, only show released versions
|
||||
return isDev ? ['current', ...versions] : versions;
|
||||
} catch {
|
||||
return undefined; // No versions yet, show current
|
||||
}
|
||||
})(),
|
||||
// Disable version badges on all versions
|
||||
versions: (() => {
|
||||
const config: Record<string, {badge: boolean}> = {
|
||||
current: {badge: false},
|
||||
};
|
||||
try {
|
||||
const versions = require('./versions.json') as string[];
|
||||
versions.forEach((v: string) => {
|
||||
config[v] = {badge: false};
|
||||
});
|
||||
} catch {
|
||||
// No versions yet
|
||||
}
|
||||
return config;
|
||||
})(),
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
blogTitle: 'Hindsight Blog',
|
||||
blogDescription: 'Updates, insights, and deep dives into agent memory',
|
||||
postsPerPage: 10,
|
||||
blogSidebarCount: 0,
|
||||
},
|
||||
theme: {
|
||||
customCss: './src/css/custom.css',
|
||||
},
|
||||
} satisfies Preset.Options,
|
||||
],
|
||||
[
|
||||
'redocusaurus',
|
||||
{
|
||||
specs: [
|
||||
{
|
||||
id: 'hindsight-api',
|
||||
spec: 'static/openapi.json',
|
||||
route: '/api-reference',
|
||||
url: '/openapi.json',
|
||||
},
|
||||
],
|
||||
theme: {
|
||||
primaryColor: '#0074d9',
|
||||
sidebar: {
|
||||
backgroundColor: '#09090b',
|
||||
},
|
||||
rightPanel: {
|
||||
backgroundColor: '#18181b',
|
||||
},
|
||||
typography: {
|
||||
fontSize: '15px',
|
||||
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
headings: {
|
||||
fontFamily: "'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
},
|
||||
code: {
|
||||
fontFamily: "'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, Consolas, monospace",
|
||||
fontSize: '13px',
|
||||
},
|
||||
},
|
||||
},
|
||||
config: {
|
||||
scrollYOffset: 60,
|
||||
nativeScrollbars: true,
|
||||
expandSingleSchemaField: true,
|
||||
expandResponses: '200,201',
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
themes: [
|
||||
'@docusaurus/theme-mermaid',
|
||||
[
|
||||
'@easyops-cn/docusaurus-search-local',
|
||||
{
|
||||
hashed: true,
|
||||
docsRouteBasePath: '/',
|
||||
indexBlog: true,
|
||||
blogRouteBasePath: '/blog',
|
||||
highlightSearchTermsOnTargetPage: false,
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
themeConfig: {
|
||||
...(ANNOUNCEMENT_BAR && {
|
||||
announcementBar: {
|
||||
id: 'announcement',
|
||||
content: ANNOUNCEMENT_BAR,
|
||||
backgroundColor: '#0074d9',
|
||||
textColor: '#ffffff',
|
||||
isCloseable: false,
|
||||
},
|
||||
}),
|
||||
image: 'img/logo.png',
|
||||
colorMode: {
|
||||
defaultMode: 'dark',
|
||||
respectPrefersColorScheme: true,
|
||||
},
|
||||
navbar: {
|
||||
logo: {
|
||||
alt: 'Hindsight Logo',
|
||||
src: 'img/logo.png',
|
||||
style: { height: '32px' },
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'doc',
|
||||
docId: 'developer/installation',
|
||||
position: 'left',
|
||||
label: 'Developer',
|
||||
className: 'navbar-item-developer',
|
||||
},
|
||||
{
|
||||
type: 'doc',
|
||||
docId: 'sdks/python',
|
||||
position: 'left',
|
||||
label: 'SDKs',
|
||||
className: 'navbar-item-sdks',
|
||||
},
|
||||
{
|
||||
to: '/faq',
|
||||
position: 'left',
|
||||
label: 'FAQ',
|
||||
className: 'navbar-item-faq',
|
||||
},
|
||||
{
|
||||
to: '/changelog',
|
||||
position: 'left',
|
||||
label: 'Changelog',
|
||||
className: 'navbar-item-changelog',
|
||||
},
|
||||
{
|
||||
type: 'dropdown',
|
||||
label: 'Resources',
|
||||
position: 'left',
|
||||
className: 'navbar-item-resources',
|
||||
items: [
|
||||
{
|
||||
to: '/cookbook',
|
||||
label: 'Cookbook',
|
||||
},
|
||||
{
|
||||
to: '/blog',
|
||||
label: 'Blog',
|
||||
},
|
||||
{
|
||||
to: '/api-reference',
|
||||
label: 'API Reference',
|
||||
},
|
||||
{
|
||||
href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg',
|
||||
label: 'Community',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
href: 'https://ui.hindsight.vectorize.io/signup',
|
||||
position: 'right',
|
||||
label: 'Cloud',
|
||||
className: 'navbar-item-cloud',
|
||||
},
|
||||
{
|
||||
type: 'docsVersionDropdown',
|
||||
position: 'right',
|
||||
className: 'navbar-item-version',
|
||||
},
|
||||
{
|
||||
href: 'https://github.com/vectorize-io/hindsight',
|
||||
position: 'right',
|
||||
className: 'header-github-link',
|
||||
'aria-label': 'GitHub repository',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Documentation',
|
||||
items: [
|
||||
{
|
||||
label: 'Introduction',
|
||||
to: '/',
|
||||
},
|
||||
{
|
||||
label: 'Developer Guide',
|
||||
to: '/developer/installation',
|
||||
},
|
||||
{
|
||||
label: 'SDKs',
|
||||
to: '/sdks/python',
|
||||
},
|
||||
{
|
||||
label: 'API Reference',
|
||||
to: '/api-reference/',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Resources',
|
||||
items: [
|
||||
{
|
||||
label: 'Cookbook',
|
||||
to: '/cookbook',
|
||||
},
|
||||
{
|
||||
label: 'Changelog',
|
||||
to: '/changelog',
|
||||
},
|
||||
{
|
||||
label: 'Hindsight Cloud',
|
||||
href: 'https://ui.hindsight.vectorize.io/signup',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Community',
|
||||
items: [
|
||||
{
|
||||
label: 'GitHub',
|
||||
href: 'https://github.com/vectorize-io/hindsight',
|
||||
},
|
||||
{
|
||||
label: 'Slack',
|
||||
href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Vectorize, Inc.`,
|
||||
},
|
||||
prism: {
|
||||
theme: prismThemes.github,
|
||||
darkTheme: prismThemes.dracula,
|
||||
additionalLanguages: ['bash', 'json', 'python', 'rust'],
|
||||
},
|
||||
mermaid: {
|
||||
theme: {
|
||||
light: 'base',
|
||||
dark: 'base',
|
||||
},
|
||||
options: {
|
||||
themeVariables: {
|
||||
// Gradient start (#0074d9 blue) for nodes
|
||||
primaryColor: '#0074d9',
|
||||
primaryTextColor: '#ffffff',
|
||||
primaryBorderColor: '#005db0',
|
||||
// Gradient end (#009296 teal) for edges/clusters
|
||||
secondaryColor: '#009296',
|
||||
secondaryTextColor: '#ffffff',
|
||||
secondaryBorderColor: '#007a7d',
|
||||
// Tertiary
|
||||
tertiaryColor: '#e6f7f8',
|
||||
tertiaryTextColor: '#1e293b',
|
||||
// Lines and edges - gradient end color
|
||||
lineColor: '#009296',
|
||||
// Text
|
||||
textColor: '#1e293b',
|
||||
// Node specific - gradient start
|
||||
nodeBkg: '#0074d9',
|
||||
nodeTextColor: '#ffffff',
|
||||
nodeBorder: '#005db0',
|
||||
// Main background
|
||||
mainBkg: '#0074d9',
|
||||
// Clusters/subgraphs - gradient end
|
||||
clusterBkg: 'rgba(0, 146, 150, 0.08)',
|
||||
clusterBorder: '#009296',
|
||||
// Labels
|
||||
edgeLabelBackground: 'transparent',
|
||||
labelBackground: 'transparent',
|
||||
// Font - Inter to match body text
|
||||
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
},
|
||||
},
|
||||
},
|
||||
} satisfies Preset.ThemeConfig,
|
||||
};
|
||||
|
||||
export default config;
|
||||
import {themes as prismThemes} from 'prism-react-renderer';
|
||||
import type {Config} from '@docusaurus/types';
|
||||
import type * as Preset from '@docusaurus/preset-classic';
|
||||
|
||||
const umamiUrl = process.env.UMAMI_URL;
|
||||
const umamiWebsiteId = process.env.UMAMI_WEBSITE_ID;
|
||||
|
||||
// Announcement bar - supports HTML for links
|
||||
// Set to empty string '' to hide the bar
|
||||
const ANNOUNCEMENT_BAR = 'Hindsight is State-of-the-Art on Memory for AI Agents | <a href="https://arxiv.org/abs/2512.12818" target="_blank">Read the paper →</a>';
|
||||
|
||||
const config: Config = {
|
||||
title: 'Hindsight',
|
||||
tagline: 'Hindsight: Agent Memory That Works Like Human Memory',
|
||||
favicon: 'img/favicon.png',
|
||||
|
||||
future: {
|
||||
v4: true,
|
||||
},
|
||||
|
||||
markdown: {
|
||||
mermaid: true,
|
||||
},
|
||||
|
||||
url: 'https://hindsight.vectorize.io',
|
||||
baseUrl: '/',
|
||||
|
||||
organizationName: 'vectorize-io',
|
||||
projectName: 'hindsight',
|
||||
trailingSlash: false,
|
||||
|
||||
onBrokenLinks: 'throw',
|
||||
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en'],
|
||||
},
|
||||
|
||||
headTags: [
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'preconnect',
|
||||
href: 'https://fonts.googleapis.com',
|
||||
},
|
||||
},
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'preconnect',
|
||||
href: 'https://fonts.gstatic.com',
|
||||
crossorigin: 'anonymous',
|
||||
},
|
||||
},
|
||||
{
|
||||
tagName: 'link',
|
||||
attributes: {
|
||||
rel: 'stylesheet',
|
||||
href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap',
|
||||
media: 'print',
|
||||
onload: "this.media='all'",
|
||||
},
|
||||
},
|
||||
{
|
||||
tagName: 'script',
|
||||
attributes: {},
|
||||
innerHTML: `window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'AW-16635605869');`,
|
||||
},
|
||||
],
|
||||
|
||||
scripts: [
|
||||
...(umamiUrl && umamiWebsiteId
|
||||
? [
|
||||
{
|
||||
src: `${umamiUrl}/script.js`,
|
||||
async: true,
|
||||
defer: true,
|
||||
'data-website-id': umamiWebsiteId,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
src: 'https://www.googletagmanager.com/gtag/js?id=AW-16635605869',
|
||||
async: true,
|
||||
},
|
||||
],
|
||||
|
||||
presets: [
|
||||
[
|
||||
'classic',
|
||||
{
|
||||
docs: {
|
||||
sidebarPath: './sidebars.ts',
|
||||
routeBasePath: '/',
|
||||
// Only show "next" version in development or when INCLUDE_CURRENT_VERSION=true
|
||||
// In production, only show released versions from versions.json
|
||||
onlyIncludeVersions: (() => {
|
||||
const isDev = process.env.NODE_ENV === 'development' || process.env.INCLUDE_CURRENT_VERSION === 'true';
|
||||
try {
|
||||
const versions = require('./versions.json') as string[];
|
||||
// In dev mode, explicitly include 'current' (Next) + all released versions
|
||||
// In production, only show released versions
|
||||
return isDev ? ['current', ...versions] : versions;
|
||||
} catch {
|
||||
return undefined; // No versions yet, show current
|
||||
}
|
||||
})(),
|
||||
// Disable version badges on all versions
|
||||
versions: (() => {
|
||||
const config: Record<string, {badge: boolean}> = {
|
||||
current: {badge: false},
|
||||
};
|
||||
try {
|
||||
const versions = require('./versions.json') as string[];
|
||||
versions.forEach((v: string) => {
|
||||
config[v] = {badge: false};
|
||||
});
|
||||
} catch {
|
||||
// No versions yet
|
||||
}
|
||||
return config;
|
||||
})(),
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
blogTitle: 'Hindsight Blog',
|
||||
blogDescription: 'Updates, insights, and deep dives into agent memory',
|
||||
postsPerPage: 10,
|
||||
blogSidebarCount: 0,
|
||||
},
|
||||
theme: {
|
||||
customCss: './src/css/custom.css',
|
||||
},
|
||||
} satisfies Preset.Options,
|
||||
],
|
||||
[
|
||||
'redocusaurus',
|
||||
{
|
||||
specs: [
|
||||
{
|
||||
id: 'hindsight-api',
|
||||
spec: 'static/openapi.json',
|
||||
route: '/api-reference',
|
||||
url: '/openapi.json',
|
||||
},
|
||||
],
|
||||
theme: {
|
||||
primaryColor: '#0074d9',
|
||||
sidebar: {
|
||||
backgroundColor: '#09090b',
|
||||
},
|
||||
rightPanel: {
|
||||
backgroundColor: '#18181b',
|
||||
},
|
||||
typography: {
|
||||
fontSize: '15px',
|
||||
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
headings: {
|
||||
fontFamily: "'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
},
|
||||
code: {
|
||||
fontFamily: "'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, Consolas, monospace",
|
||||
fontSize: '13px',
|
||||
},
|
||||
},
|
||||
},
|
||||
config: {
|
||||
scrollYOffset: 60,
|
||||
nativeScrollbars: true,
|
||||
expandSingleSchemaField: true,
|
||||
expandResponses: '200,201',
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
themes: [
|
||||
'@docusaurus/theme-mermaid',
|
||||
[
|
||||
'@easyops-cn/docusaurus-search-local',
|
||||
{
|
||||
hashed: true,
|
||||
docsRouteBasePath: '/',
|
||||
indexBlog: true,
|
||||
blogRouteBasePath: '/blog',
|
||||
highlightSearchTermsOnTargetPage: false,
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
themeConfig: {
|
||||
...(ANNOUNCEMENT_BAR && {
|
||||
announcementBar: {
|
||||
id: 'announcement',
|
||||
content: ANNOUNCEMENT_BAR,
|
||||
backgroundColor: '#0074d9',
|
||||
textColor: '#ffffff',
|
||||
isCloseable: false,
|
||||
},
|
||||
}),
|
||||
image: 'img/logo.png',
|
||||
colorMode: {
|
||||
defaultMode: 'dark',
|
||||
respectPrefersColorScheme: true,
|
||||
},
|
||||
navbar: {
|
||||
logo: {
|
||||
alt: 'Hindsight Logo',
|
||||
src: 'img/logo.png',
|
||||
style: { height: '32px' },
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'doc',
|
||||
docId: 'developer/installation',
|
||||
position: 'left',
|
||||
label: 'Developer',
|
||||
className: 'navbar-item-developer',
|
||||
},
|
||||
{
|
||||
type: 'doc',
|
||||
docId: 'sdks/python',
|
||||
position: 'left',
|
||||
label: 'SDKs',
|
||||
className: 'navbar-item-sdks',
|
||||
},
|
||||
{
|
||||
to: '/faq',
|
||||
position: 'left',
|
||||
label: 'FAQ',
|
||||
className: 'navbar-item-faq',
|
||||
},
|
||||
{
|
||||
to: '/changelog',
|
||||
position: 'left',
|
||||
label: 'Changelog',
|
||||
className: 'navbar-item-changelog',
|
||||
},
|
||||
{
|
||||
type: 'dropdown',
|
||||
label: 'Resources',
|
||||
position: 'left',
|
||||
className: 'navbar-item-resources',
|
||||
items: [
|
||||
{
|
||||
to: '/cookbook',
|
||||
label: 'Cookbook',
|
||||
},
|
||||
{
|
||||
to: '/blog',
|
||||
label: 'Blog',
|
||||
},
|
||||
{
|
||||
to: '/api-reference',
|
||||
label: 'API Reference',
|
||||
},
|
||||
{
|
||||
href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg',
|
||||
label: 'Community',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
href: 'https://ui.hindsight.vectorize.io/signup',
|
||||
position: 'right',
|
||||
label: 'Cloud',
|
||||
className: 'navbar-item-cloud',
|
||||
},
|
||||
{
|
||||
type: 'docsVersionDropdown',
|
||||
position: 'right',
|
||||
className: 'navbar-item-version',
|
||||
},
|
||||
{
|
||||
href: 'https://github.com/vectorize-io/hindsight',
|
||||
position: 'right',
|
||||
className: 'header-github-link',
|
||||
'aria-label': 'GitHub repository',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Documentation',
|
||||
items: [
|
||||
{
|
||||
label: 'Introduction',
|
||||
to: '/',
|
||||
},
|
||||
{
|
||||
label: 'Developer Guide',
|
||||
to: '/developer/installation',
|
||||
},
|
||||
{
|
||||
label: 'SDKs',
|
||||
to: '/sdks/python',
|
||||
},
|
||||
{
|
||||
label: 'API Reference',
|
||||
to: '/api-reference/',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Resources',
|
||||
items: [
|
||||
{
|
||||
label: 'Cookbook',
|
||||
to: '/cookbook',
|
||||
},
|
||||
{
|
||||
label: 'Changelog',
|
||||
to: '/changelog',
|
||||
},
|
||||
{
|
||||
label: 'Hindsight Cloud',
|
||||
href: 'https://ui.hindsight.vectorize.io/signup',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Community',
|
||||
items: [
|
||||
{
|
||||
label: 'GitHub',
|
||||
href: 'https://github.com/vectorize-io/hindsight',
|
||||
},
|
||||
{
|
||||
label: 'Slack',
|
||||
href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Vectorize, Inc.`,
|
||||
},
|
||||
prism: {
|
||||
theme: prismThemes.github,
|
||||
darkTheme: prismThemes.dracula,
|
||||
additionalLanguages: ['bash', 'json', 'python', 'rust'],
|
||||
},
|
||||
mermaid: {
|
||||
theme: {
|
||||
light: 'base',
|
||||
dark: 'base',
|
||||
},
|
||||
options: {
|
||||
themeVariables: {
|
||||
// Gradient start (#0074d9 blue) for nodes
|
||||
primaryColor: '#0074d9',
|
||||
primaryTextColor: '#ffffff',
|
||||
primaryBorderColor: '#005db0',
|
||||
// Gradient end (#009296 teal) for edges/clusters
|
||||
secondaryColor: '#009296',
|
||||
secondaryTextColor: '#ffffff',
|
||||
secondaryBorderColor: '#007a7d',
|
||||
// Tertiary
|
||||
tertiaryColor: '#e6f7f8',
|
||||
tertiaryTextColor: '#1e293b',
|
||||
// Lines and edges - gradient end color
|
||||
lineColor: '#009296',
|
||||
// Text
|
||||
textColor: '#1e293b',
|
||||
// Node specific - gradient start
|
||||
nodeBkg: '#0074d9',
|
||||
nodeTextColor: '#ffffff',
|
||||
nodeBorder: '#005db0',
|
||||
// Main background
|
||||
mainBkg: '#0074d9',
|
||||
// Clusters/subgraphs - gradient end
|
||||
clusterBkg: 'rgba(0, 146, 150, 0.08)',
|
||||
clusterBorder: '#009296',
|
||||
// Labels
|
||||
edgeLabelBackground: 'transparent',
|
||||
labelBackground: 'transparent',
|
||||
// Font - Inter to match body text
|
||||
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
||||
},
|
||||
},
|
||||
},
|
||||
} satisfies Preset.ThemeConfig,
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
|
|
|||
BIN
hindsight-docs/static/img/blog/mcp-agent-memory.png
Normal file
BIN
hindsight-docs/static/img/blog/mcp-agent-memory.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 379 KiB |
Loading…
Reference in a new issue