Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ac7a4c957 | ||
|
|
cc374efbe5 | ||
|
|
528a15db00 | ||
|
|
a8926d5749 |
@@ -1,7 +1,7 @@
|
||||
---
|
||||
slug: learning-capabilities
|
||||
title: "Agent memory that learns: observations and mental models"
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
image: /img/reflect-operation.webp
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
title: How We Solved Memory Conflicts in Hindsight
|
||||
description: Learn how Hindsight handles contradictory information by tracking temporal evolution and preserving history in its memory consolidation system.
|
||||
authors: [hindsight]
|
||||
authors: [chrislatimer]
|
||||
|
||||
image: /img/blog/2026-02-09/consolidation-pipeline.png
|
||||
date: 2026-02-09
|
||||
hide_table_of_contents: true
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "What's new in Hindsight 0.4.11"
|
||||
description: New features and improvements in Hindsight 0.4.11
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-13
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "What's new in Hindsight 0.4.12"
|
||||
description: New features and improvements in Hindsight 0.4.12
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-18
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "Your Vercel Chat SDK bot forgets everything. Hindsight fixes that."
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-26
|
||||
tags: [chat-sdk, slack, discord, typescript, memory]
|
||||
image: /img/blog/vercel-chat.png
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "What's new in Hindsight 0.4.13 and 0.4.14"
|
||||
description: New features and improvements in Hindsight 0.4.13 and 0.4.14
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-27
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: "Your CrewAI Agents Forget Everything Between Runs. Here's the Fix."
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-02
|
||||
tags: [crewai, agents, python, memory, tutorial]
|
||||
image: /img/blog/crewai-memory.png
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: "I Gave 100+ LLMs a Permanent Memory With One Python Package"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-03
|
||||
tags: [litellm, python, memory, openai, anthropic, tutorial]
|
||||
image: /img/blog/litellm-memory.png
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "What's new in Hindsight 0.4.15"
|
||||
description: New features and improvements in Hindsight 0.4.15
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-03-03
|
||||
hide_table_of_contents: true
|
||||
image: /img/blog/release0415.png
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: "The Open-Source MCP Memory Server Your AI Agent Is Missing"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-04
|
||||
tags: [mcp, memory, agents, docker, tutorial]
|
||||
image: /img/blog/mcp-agent-memory.png
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "Give Your OpenAI App a Memory in 5 Minutes"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-05
|
||||
tags: [memory, openai, python, docker, rag, llm, vector, embedding]
|
||||
image: /img/blog/add-memory-to-openai-application.png
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "What's new in Hindsight 0.4.16"
|
||||
description: New features and improvements in Hindsight 0.4.16
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-03-05
|
||||
hide_table_of_contents: true
|
||||
image: /img/blog/release0416.png
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "The Memory Upgrade Every OpenClaw User Needs"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-06
|
||||
tags: [openclaw]
|
||||
image: /img/blog/adding-memory-to-openclaw-with-hindsight.png
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "What's New in Hindsight Cloud: Document File Upload"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-09
|
||||
tags: [release, memory]
|
||||
tags: [hindsight-cloud, release, memory]
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: "Pydantic AI Persistent Memory: Add It in 5 Lines of Code"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-09
|
||||
tags: [memory, openai, anthropic, gemini, python, rust, agents, rag, vector, pydantic-ai, knowledge-graph]
|
||||
image: /img/blog/pydantic-ai-persistent-memory.png
|
||||
|
||||
@@ -1,3 +1,21 @@
|
||||
hindsight:
|
||||
name: Hindsight Team
|
||||
url: https://github.com/vectorize-io/hindsight
|
||||
|
||||
nicoloboschi:
|
||||
name: Nicolò Boschi
|
||||
title: Hindsight Team
|
||||
url: https://github.com/nicoloboschi
|
||||
image_url: https://github.com/nicoloboschi.png
|
||||
|
||||
benfrank241:
|
||||
name: Ben Bartholomew
|
||||
title: Hindsight Team
|
||||
url: https://github.com/benfrank241
|
||||
image_url: https://github.com/benfrank241.png
|
||||
|
||||
chrislatimer:
|
||||
name: Chris Latimer
|
||||
title: Hindsight Team
|
||||
url: https://github.com/chrislatimer
|
||||
image_url: https://github.com/chrislatimer.png
|
||||
|
||||
@@ -5,6 +5,9 @@ import type {Props} from '@theme/BlogListPage';
|
||||
import type {PropBlogPostContent} from '@docusaurus/plugin-content-blog';
|
||||
import styles from './styles.module.css';
|
||||
|
||||
const CLOUD_TAG = 'hindsight-cloud';
|
||||
const CLOUD_PREVIEW_COUNT = 3;
|
||||
|
||||
function formatDate(dateString: string): string {
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'});
|
||||
@@ -38,9 +41,32 @@ function BlogCard({content}: {content: PropBlogPostContent}) {
|
||||
);
|
||||
}
|
||||
|
||||
function SectionHeader({title, subtitle, viewAllHref}: {title: string; subtitle?: string; viewAllHref?: string}) {
|
||||
return (
|
||||
<div className={styles.sectionHeader}>
|
||||
<div className={styles.sectionHeaderRow}>
|
||||
<h2 className={styles.sectionTitle}>{title}</h2>
|
||||
{viewAllHref && (
|
||||
<Link to={viewAllHref} className={styles.sectionViewAll}>
|
||||
View all →
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
{subtitle && <p className={styles.sectionSubtitle}>{subtitle}</p>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function BlogListPage({items, metadata}: Props): React.ReactElement {
|
||||
const {blogTitle, blogDescription, totalPages, page, nextPage, previousPage} = metadata;
|
||||
|
||||
const cloudPosts = items.filter(({content}) =>
|
||||
(content.metadata.tags ?? []).some((t) => t.label === CLOUD_TAG),
|
||||
);
|
||||
const hindsightPosts = items.filter(({content}) =>
|
||||
!(content.metadata.tags ?? []).some((t) => t.label === CLOUD_TAG),
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout title={blogTitle} description={blogDescription}>
|
||||
<main className={styles.blogPage}>
|
||||
@@ -49,11 +75,34 @@ export default function BlogListPage({items, metadata}: Props): React.ReactEleme
|
||||
{blogDescription && <p className={styles.headerSubtitle}>{blogDescription}</p>}
|
||||
</header>
|
||||
|
||||
<div className={styles.grid}>
|
||||
{items.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
{cloudPosts.length > 0 && (
|
||||
<section className={styles.section}>
|
||||
<SectionHeader
|
||||
title="Hindsight Cloud"
|
||||
subtitle="News and updates from Hindsight Cloud"
|
||||
viewAllHref={cloudPosts.length > CLOUD_PREVIEW_COUNT ? `/blog/tags/${CLOUD_TAG}` : undefined}
|
||||
/>
|
||||
<div className={styles.grid}>
|
||||
{cloudPosts.slice(0, CLOUD_PREVIEW_COUNT).map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{hindsightPosts.length > 0 && (
|
||||
<section className={styles.section}>
|
||||
<SectionHeader
|
||||
title="Hindsight"
|
||||
subtitle="Releases, guides, and deep dives into agent memory"
|
||||
/>
|
||||
<div className={styles.grid}>
|
||||
{hindsightPosts.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{totalPages > 1 && (
|
||||
<nav className={styles.pagination}>
|
||||
|
||||
@@ -30,6 +30,49 @@
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
/* ── Section ─────────────────────────────────────── */
|
||||
.section {
|
||||
margin-bottom: 4rem;
|
||||
}
|
||||
|
||||
.sectionHeader {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.sectionHeaderRow {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
color: var(--ifm-heading-color);
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.sectionViewAll {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
color: var(--ifm-color-primary);
|
||||
text-decoration: none !important;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sectionViewAll:hover {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
.sectionSubtitle {
|
||||
font-size: 0.95rem;
|
||||
color: var(--ifm-color-emphasis-600);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* ── Grid ────────────────────────────────────────── */
|
||||
.grid {
|
||||
display: grid;
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
import React from 'react';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Layout from '@theme/Layout';
|
||||
import type {Props} from '@theme/BlogTagsPostsPage';
|
||||
import type {PropBlogPostContent} from '@docusaurus/plugin-content-blog';
|
||||
import styles from '../BlogListPage/styles.module.css';
|
||||
|
||||
function formatDate(dateString: string): string {
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'});
|
||||
}
|
||||
|
||||
function BlogCard({content}: {content: PropBlogPostContent}) {
|
||||
const {metadata, assets} = content;
|
||||
const {title, description, date, readingTime, permalink, frontMatter} = metadata;
|
||||
const image = assets.image ?? frontMatter.image ?? '/img/blog-default.jpg';
|
||||
|
||||
return (
|
||||
<Link to={permalink} className={styles.card}>
|
||||
<div className={styles.cardImageWrapper}>
|
||||
{image ? (
|
||||
<img src={image} alt={title} className={styles.cardImage} />
|
||||
) : (
|
||||
<div className={styles.cardImagePlaceholder} />
|
||||
)}
|
||||
</div>
|
||||
<div className={styles.cardBody}>
|
||||
<h2 className={styles.cardTitle}>{title}</h2>
|
||||
{description && <p className={styles.cardDescription}>{description}</p>}
|
||||
<div className={styles.cardFooter}>
|
||||
<span className={styles.cardDate}>{formatDate(date)}</span>
|
||||
{readingTime !== undefined && (
|
||||
<span className={styles.cardReadTime}>{Math.ceil(readingTime)} min read</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
|
||||
const TAG_LABELS: Record<string, {title: string; subtitle: string}> = {
|
||||
'hindsight-cloud': {
|
||||
title: 'Hindsight Cloud',
|
||||
subtitle: 'News and updates from Hindsight Cloud',
|
||||
},
|
||||
};
|
||||
|
||||
export default function BlogTagsPostsPage({tag, items, listMetadata}: Props): React.ReactElement {
|
||||
const {totalPages, page, nextPage, previousPage} = listMetadata;
|
||||
const tagInfo = TAG_LABELS[tag.label] ?? {title: tag.label, subtitle: undefined};
|
||||
|
||||
return (
|
||||
<Layout title={tagInfo.title} description={tagInfo.subtitle}>
|
||||
<main className={styles.blogPage}>
|
||||
<header className={styles.header}>
|
||||
<h1 className={styles.headerTitle}>{tagInfo.title}</h1>
|
||||
{tagInfo.subtitle && <p className={styles.headerSubtitle}>{tagInfo.subtitle}</p>}
|
||||
</header>
|
||||
|
||||
<div className={styles.grid}>
|
||||
{items.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<nav className={styles.pagination}>
|
||||
{previousPage && (
|
||||
<Link to={previousPage} className={styles.paginationButton}>
|
||||
← Previous
|
||||
</Link>
|
||||
)}
|
||||
<span className={styles.paginationInfo}>
|
||||
Page {page} of {totalPages}
|
||||
</span>
|
||||
{nextPage && (
|
||||
<Link to={nextPage} className={styles.paginationButton}>
|
||||
Next →
|
||||
</Link>
|
||||
)}
|
||||
</nav>
|
||||
)}
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user