* fix(ci): resolve all CI failures — unversioned integrations, test retries - Move integration docs to separate unversioned docs plugin (docs-integrations/) so new integrations don't need to be duplicated across versioned_docs - Remove integration pages from versioned_docs (v0.3, v0.4) — sidebar entries now use links instead of doc refs - Add missing title/description SEO frontmatter to autogen.md - Add retry logic (2 attempts) to test-doc-examples.sh for transient LLM timeouts - Add pytest-rerunfailures to test-api with --reruns 2 for flaky Gemini-dependent integration tests * ci: retrigger * fix: graph entity inheritance, SyncTaskBackend error propagation, fact_type test regressions - Fix observation entity inheritance in get_graph_data: the unit_entities query only fetched entities for visible observation IDs, not their source memory IDs, so the inheritance loop always found an empty entity_map - Remove error swallowing in SyncTaskBackend._execute_task so test failures surface instead of being silently logged - Wrap remaining consolidation submission call sites with try/except since consolidation is non-critical for those operations - Fix test_sync_backend test to expect errors to propagate - Remove fact_type=["world"] filter from test_document_upsert_behavior and test_mentioned_at_from_context_string (same PR #848 regression) - Remove flaky marker from consolidation test (now deterministic)
184 lines
6.4 KiB
Markdown
184 lines
6.4 KiB
Markdown
---
|
|
sidebar_position: 8
|
|
title: "AG2 (AutoGen) Persistent Memory with Hindsight | Integration Guide"
|
|
description: "Add long-term persistent memory to your AG2 (AutoGen) agents with Hindsight. Automatic fact extraction, entity tracking, and recall tools that persist across conversations."
|
|
---
|
|
|
|
# AG2
|
|
|
|
Persistent long-term memory for [AG2](https://ag2.ai) agents (community AutoGen fork). Give your agents retain/recall/reflect tools that persist across conversations.
|
|
|
|
[View Changelog →](/changelog/integrations/ag2)
|
|
|
|
## Features
|
|
|
|
- **Drop-in Tools** — `register_hindsight_tools()` registers retain, recall, and reflect in one line
|
|
- **AG2-native** — Uses `Annotated` type hints compatible with AG2's `@register_for_llm` / `@register_for_execution` pattern
|
|
- **GroupChat Support** — Multiple agents can share a single memory bank
|
|
- **Selective Tools** — Include only the tools you need (`include_retain`, `include_recall`, `include_reflect`)
|
|
- **Simple Configuration** — Configure once globally or override per tool set
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip install hindsight-ag2
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```python
|
|
from autogen import AssistantAgent, UserProxyAgent, LLMConfig
|
|
from hindsight_ag2 import register_hindsight_tools
|
|
|
|
llm_config = LLMConfig(api_type="openai", model="gpt-4o-mini")
|
|
|
|
with llm_config:
|
|
assistant = AssistantAgent(
|
|
name="assistant",
|
|
system_message="You are a helpful assistant with long-term memory.",
|
|
)
|
|
user_proxy = UserProxyAgent(
|
|
name="user",
|
|
human_input_mode="NEVER",
|
|
)
|
|
|
|
# Register Hindsight memory tools on both agents
|
|
register_hindsight_tools(
|
|
assistant, user_proxy,
|
|
bank_id="my-bank",
|
|
hindsight_api_url="http://localhost:8888",
|
|
)
|
|
|
|
# The assistant can now use hindsight_retain, hindsight_recall, hindsight_reflect
|
|
result = user_proxy.initiate_chat(
|
|
assistant,
|
|
message="Remember that I prefer Python over JavaScript.",
|
|
)
|
|
```
|
|
|
|
That's it. The assistant can now store and retrieve memories across conversations.
|
|
|
|
## How It Works
|
|
|
|
The integration provides three AG2-compatible tool functions backed by Hindsight's API:
|
|
|
|
| Tool | Hindsight | What happens |
|
|
|------|-----------|--------------|
|
|
| `hindsight_retain(content)` | `retain(bank_id, content, ...)` | Content is stored. Hindsight extracts facts, entities, and relationships from the raw text. |
|
|
| `hindsight_recall(query)` | `recall(bank_id, query, ...)` | Hindsight runs semantic search, BM25, graph traversal, and reranking. Returns a numbered list of matching memories. |
|
|
| `hindsight_reflect(query)` | `reflect(bank_id, query, ...)` | Hindsight synthesizes a reasoned answer from all relevant memories, using the bank's disposition traits. |
|
|
|
|
Tools are plain Python functions with `Annotated` type hints. AG2 uses these hints to generate the tool schema that the LLM sees.
|
|
|
|
## Configuration
|
|
|
|
### Global Configuration
|
|
|
|
```python
|
|
from hindsight_ag2 import configure
|
|
|
|
configure(
|
|
hindsight_api_url="http://localhost:8888",
|
|
api_key="your-key", # or set HINDSIGHT_API_KEY env var
|
|
budget="mid", # low / mid / high
|
|
max_tokens=4096,
|
|
tags=["source:ag2"], # default tags for retain
|
|
)
|
|
```
|
|
|
|
### Per-Tool Overrides
|
|
|
|
Constructor arguments override global configuration:
|
|
|
|
```python
|
|
from hindsight_ag2 import create_hindsight_tools
|
|
|
|
tools = create_hindsight_tools(
|
|
bank_id="my-bank",
|
|
hindsight_api_url="http://localhost:8888",
|
|
budget="high",
|
|
max_tokens=8192,
|
|
tags=["team:alpha"],
|
|
)
|
|
```
|
|
|
|
## GroupChat with Shared Memory
|
|
|
|
Multiple agents can share a single memory bank in a GroupChat:
|
|
|
|
```python
|
|
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager, LLMConfig
|
|
from hindsight_ag2 import register_hindsight_tools
|
|
|
|
llm_config = LLMConfig(api_type="openai", model="gpt-4o-mini")
|
|
|
|
with llm_config:
|
|
researcher = AssistantAgent(name="researcher", system_message="You research topics.")
|
|
writer = AssistantAgent(name="writer", system_message="You write content.")
|
|
executor = UserProxyAgent(name="executor", human_input_mode="NEVER")
|
|
|
|
# All agents share the same memory bank
|
|
for agent in [researcher, writer]:
|
|
register_hindsight_tools(agent, executor, bank_id="team-memory")
|
|
|
|
group_chat = GroupChat(agents=[researcher, writer, executor], messages=[])
|
|
manager = GroupChatManager(groupchat=group_chat)
|
|
```
|
|
|
|
## Manual Registration
|
|
|
|
For full control over how tools are registered:
|
|
|
|
```python
|
|
from hindsight_ag2 import create_hindsight_tools
|
|
|
|
tools = create_hindsight_tools(
|
|
bank_id="my-bank",
|
|
hindsight_api_url="http://localhost:8888",
|
|
)
|
|
for tool_fn in tools:
|
|
assistant.register_for_llm(description=tool_fn.__doc__)(tool_fn)
|
|
user_proxy.register_for_execution()(tool_fn)
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Configuration
|
|
|
|
| Function | Description |
|
|
|----------|-------------|
|
|
| `configure(...)` | Set global connection and default settings |
|
|
| `get_config()` | Get current configuration |
|
|
| `reset_config()` | Reset configuration to None |
|
|
|
|
### create_hindsight_tools
|
|
|
|
| Parameter | Default | Description |
|
|
|-----------|---------|-------------|
|
|
| `bank_id` | required | Hindsight memory bank ID |
|
|
| `client` | `None` | Pre-configured `Hindsight` client |
|
|
| `hindsight_api_url` | from config | Hindsight API URL |
|
|
| `api_key` | from config | API key |
|
|
| `budget` | `"mid"` | Recall/reflect budget (low/mid/high) |
|
|
| `max_tokens` | `4096` | Max tokens for recall results |
|
|
| `tags` | `None` | Tags applied when storing memories |
|
|
| `recall_tags` | `None` | Tags to filter when searching |
|
|
| `recall_tags_match` | `"any"` | Tag matching mode (any/all/any_strict/all_strict) |
|
|
| `retain_metadata` | `None` | Metadata dict for retain operations |
|
|
| `retain_document_id` | `None` | Document ID for retain (groups/upserts memories) |
|
|
| `recall_types` | `None` | Fact types to filter (world, experience, opinion, observation) |
|
|
| `recall_include_entities` | `False` | Include entity information in recall results |
|
|
| `reflect_context` | `None` | Additional context for reflect operations |
|
|
| `reflect_max_tokens` | `max_tokens` | Max tokens for reflect results |
|
|
| `reflect_response_schema` | `None` | JSON schema to constrain reflect output format |
|
|
| `reflect_tags` | `recall_tags` | Tags to filter memories used in reflect |
|
|
| `reflect_tags_match` | `recall_tags_match` | Tag matching for reflect |
|
|
| `include_retain` | `True` | Include the retain tool |
|
|
| `include_recall` | `True` | Include the recall tool |
|
|
| `include_reflect` | `True` | Include the reflect tool |
|
|
|
|
## Requirements
|
|
|
|
- Python >= 3.10
|
|
- ag2 >= 0.9.0
|
|
- A running Hindsight API server
|