mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-30 03:00:41 -04:00
## Summary
Add Graphiti temporal knowledge graph memory to CoPilot, giving
AutoPilot persistent cross-session memory with entities, relationships,
and temporal validity tracking.
- **3 new CoPilot tools** (`graphiti_store`, `graphiti_search`,
`graphiti_delete_user_data`) as BaseTool implementations — automatically
available in both SDK and baseline/fast modes via existing TOOL_REGISTRY
bridge
- **FalkorDB** as graph database backend with per-user physical
isolation via `driver.clone(database=group_id)`
- **graphiti-core** Python library for in-process knowledge graph
operations (no separate MCP server needed)
- **MemoryEpisodeLog** append-only replay table for migration safety
- **LaunchDarkly flag** `graphiti-memory` for per-user rollout
- **OpenRouter** for extraction LLM, direct OpenAI for embeddings
### Memory Quality
- Episode body uses `"Speaker: content"` format matching graphiti's
extraction prompt expectations
- Only user messages ingested (Zep Cloud `ignore_roles` approach) —
assistant responses excluded from graph
- `custom_extraction_instructions` suppress meta-entity pollution (no
more "assistant", "human", block names as entities)
- `ep.content` attribute correctly surfaced in search results and warm
context
- Per-user asyncio.Queue serializes ingestion (graphiti-core
requirement)
### Architecture Decision
Custom BaseTool implementations over MCP — the existing
`create_copilot_mcp_server()` in `tool_adapter.py` already wraps every
BaseTool as MCP for the SDK path. One implementation serves both
execution paths with zero extra infrastructure.
## Test plan
- [x] Set LaunchDarkly flag `graphiti-memory` to true for test user
- [x] Verify FalkorDB is healthy: `docker compose up falkordb`
- [x] S1: Send message with user facts ("my assistant is Sarah, CC her
on client stuff, CRM is HubSpot")
- [x] Verify agent calls `graphiti_store` to save memories
- [x] S2 (new session): Ask "Who should I CC on outgoing client
proposals?"
- [x] Verify agent calls `graphiti_search` before answering
- [x] Verify agent answers correctly from memory (Sarah)
- [x] Verify graph entities are clean (no "assistant"/"human"/block
names)
- [x] Verify MemoryEpisodeLog has replay entries
- [ ] Verify `GRAPHITI_MEMORY=false` in LaunchDarkly → tools return "not
enabled" error
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Adds a new persistence layer and background ingestion flow for chat
memory plus new dependencies/services (FalkorDB, `graphiti-core`) and
prompt/tooling changes; rollout is gated by a LaunchDarkly flag but
failures could impact chat latency or resource usage.
>
> **Overview**
> Enables **optional, per-user Graphiti temporal memory** for CoPilot
(gated by LaunchDarkly `graphiti-memory`), including warm-start recall
on the first turn and background ingestion of user messages after each
turn in both `baseline` and SDK chat paths.
>
> Adds Graphiti infrastructure: new `memory_search`/`memory_store` tools
and response types, a per-user cached Graphiti client with safe
`group_id` derivation, a FalkorDB driver tweak for full-text queries,
and a serialized per-user ingestion queue with graceful failure/timeout
handling.
>
> Introduces new runtime configuration and local dev support
(`GRAPHITI_*` env vars, new `falkordb` docker service/volume), updates
permissions/OpenAPI enums, and adds dependencies (`graphiti-core`,
`falkordb`, `cachetools`) plus unit tests for the new modules.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
81eb14e30a. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
196 lines
3.8 KiB
YAML
196 lines
3.8 KiB
YAML
networks:
|
|
app-network:
|
|
name: app-network
|
|
shared-network:
|
|
name: shared-network
|
|
|
|
volumes:
|
|
supabase-config:
|
|
clamav-data:
|
|
workspace-data:
|
|
falkordb_data:
|
|
|
|
x-agpt-services:
|
|
&agpt-services
|
|
networks:
|
|
- app-network
|
|
- shared-network
|
|
|
|
x-supabase-services:
|
|
&supabase-services
|
|
networks:
|
|
- app-network
|
|
- shared-network
|
|
|
|
|
|
services:
|
|
# AGPT services
|
|
migrate:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: migrate
|
|
|
|
redis:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: redis
|
|
|
|
falkordb:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: falkordb
|
|
|
|
rabbitmq:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: rabbitmq
|
|
|
|
rest_server:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: rest_server
|
|
|
|
executor:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: executor
|
|
|
|
copilot_executor:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: copilot_executor
|
|
|
|
websocket_server:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: websocket_server
|
|
|
|
database_manager:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: database_manager
|
|
|
|
scheduler_server:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: scheduler_server
|
|
|
|
notification_server:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: notification_server
|
|
|
|
clamav:
|
|
<<: *agpt-services
|
|
image: clamav/clamav-debian:latest
|
|
ports:
|
|
- "3310:3310"
|
|
volumes:
|
|
- clamav-data:/var/lib/clamav
|
|
environment:
|
|
- CLAMAV_NO_FRESHCLAMD=false
|
|
- CLAMD_CONF_StreamMaxLength=50M
|
|
- CLAMD_CONF_MaxFileSize=100M
|
|
- CLAMD_CONF_MaxScanSize=100M
|
|
- CLAMD_CONF_MaxThreads=12
|
|
- CLAMD_CONF_ReadTimeout=300
|
|
- CLAMD_CONF_TCPAddr=0.0.0.0
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "clamdscan --version || exit 1"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
frontend:
|
|
<<: *agpt-services
|
|
extends:
|
|
file: ./docker-compose.platform.yml
|
|
service: frontend
|
|
|
|
# Supabase services (minimal: auth + db + kong)
|
|
kong:
|
|
<<: *supabase-services
|
|
extends:
|
|
file: ./db/docker/docker-compose.yml
|
|
service: kong
|
|
|
|
auth:
|
|
<<: *supabase-services
|
|
extends:
|
|
file: ./db/docker/docker-compose.yml
|
|
service: auth
|
|
environment:
|
|
GOTRUE_MAILER_AUTOCONFIRM: true
|
|
|
|
db:
|
|
<<: *supabase-services
|
|
extends:
|
|
file: ./db/docker/docker-compose.yml
|
|
service: db
|
|
ports:
|
|
- 5432:5432 # We don't use Supavisor locally, so we expose the db directly.
|
|
|
|
# Studio and its dependencies for local development only
|
|
meta:
|
|
<<: *supabase-services
|
|
profiles:
|
|
- local
|
|
extends:
|
|
file: ./db/docker/docker-compose.yml
|
|
service: meta
|
|
|
|
studio:
|
|
<<: *supabase-services
|
|
profiles:
|
|
- local
|
|
extends:
|
|
file: ./db/docker/docker-compose.yml
|
|
service: studio
|
|
depends_on:
|
|
meta:
|
|
condition: service_healthy
|
|
# environment:
|
|
# NEXT_PUBLIC_ENABLE_LOGS: false # Disable analytics/logging features
|
|
|
|
deps:
|
|
<<: *supabase-services
|
|
profiles:
|
|
- local
|
|
image: busybox
|
|
command: /bin/true
|
|
depends_on:
|
|
- kong
|
|
- auth
|
|
- db
|
|
- studio
|
|
- redis
|
|
- rabbitmq
|
|
- clamav
|
|
- falkordb
|
|
- migrate
|
|
|
|
deps_backend:
|
|
<<: *agpt-services
|
|
profiles:
|
|
- local
|
|
image: busybox
|
|
command: /bin/true
|
|
depends_on:
|
|
- deps
|
|
- rest_server
|
|
- executor
|
|
- copilot_executor
|
|
- websocket_server
|
|
- database_manager
|