Releases: getzep/graphiti
Release list
v0.29.3 - FalkorDB and other Optimizations
What's Changed
- chore(deps-dev): update redis requirement from <8 to <9 by @dependabot[bot] in #1561
- chore(deps-dev): update azure-identity requirement from >=1.21.0 to >=1.25.3 in /mcp_server by @dependabot[bot] in #1562
- chore(deps-dev): update google-genai requirement from >=1.72.0 to >=2.8.0 in /mcp_server by @dependabot[bot] in #1563
- chore(deps): update graphiti-core requirement from >=0.29.1 to >=0.29.2 in /mcp_server by @dependabot[bot] in #1565
- chore(deps-dev): update pytest-asyncio requirement from >=1.3.0 to >=1.4.0 in /mcp_server by @dependabot[bot] in #1566
- chore(deps): update openai requirement from >=1.91.0 to >=2.41.0 in /mcp_server by @dependabot[bot] in #1564
- ci(server): live end-to-end regression test + PR check by @danielchalef in #1560
- ci: harden exit-5 handling in the live-test workflows (MCP backport + diagnostics) by @danielchalef in #1567
- chore(deps): fix all Dependabot security alerts by @danielchalef in #1599
- fix(docker): drop procps so the combined FalkorDB image builds on trixie by @irresi in #1628
- fix(docker): avoid host PATH interpolation by @dpersek in #1630
- fix(falkordb): short-circuit fulltext query when every token was a stopword by @aasc77 in #1590
- fix(mcp): preserve FalkorDB URI username by @he-yufeng in #1530
- fix: handle backtick tokens and empty queries in FalkorDB fulltext search by @Maanik23 in #1475
- fix(falkordb): route single group_id search to the matching graph by @Solaris-star in #1670
- docs: note Zep's proprietary Context Graph Engine in README by @jackaldenryan in #1665
- docs: add Cursor Cloud dev environment setup instructions by @danielchalef in #1677
- disable Claude GitHub Actions workflows by @danielchalef in #1678
- fix(falkordb): route namespace/ops get_by_group_ids reads to the group's graph by @spencer2211 in #1675
- fix(mcp): search returns empty results after container restart by @husniadil in #1105
- fix: capture init task ref + cancel on close for Neo4jDriver and FalkorDriver by @nandanadileep in #1636
- fix(mcp): configure cross-encoder from providers instead of hardcoded OpenAI by @winklemad in #1637
- fix(communities): scope remove_communities to the group_ids being rebuilt by @Saltasm in #1658
- fix(mcp): expose generic structured output mode by @xiaoyaner0201 in #1619
- fix(edges): return reference_time in entity edge read query by @ly-wang19 in #1605
- fix(search): consume bfs relationship hits directly in edge_bfs_search by @kramerica-inc-dev in #1653
- Add Socket Firewall enforcement to CI and releases by @paul-paliychuk in #1681
- fix: preserve relationship direction in get_by_node_uuid and BFS edge search by @6or7 in #1663
- Consolidate overlapping backend fixes by @prasmussen15 in #1695
- Bump graphiti-core to 0.29.3 by @prasmussen15 in #1696
New Contributors
- @irresi made their first contribution in #1628
- @dpersek made their first contribution in #1630
- @aasc77 made their first contribution in #1590
- @Solaris-star made their first contribution in #1670
- @spencer2211 made their first contribution in #1675
- @husniadil made their first contribution in #1105
- @nandanadileep made their first contribution in #1636
- @winklemad made their first contribution in #1637
- @Saltasm made their first contribution in #1658
- @xiaoyaner0201 made their first contribution in #1619
- @ly-wang19 made their first contribution in #1605
- @kramerica-inc-dev made their first contribution in #1653
- @6or7 made their first contribution in #1663
Full Changelog: v0.29.2...v0.29.3
v0.29.2 - FalkorDB Bug Fixes
What's Changed
- fix(deps): resolve all open Dependabot alerts in uv.lock files by @jackaldenryan in #1528
- fix(falkor): strip nul bytes from parameters by @he-yufeng in #1531
- fix: FalkorDB profile failing to start in docker-compose by @Naseem77 in #1126
- fix(docker): align FalkorDB compose service port with container by @prasmussen15 in #1532
- Fix Ollama/OpenAI-compatible provider support by @Naseem77 in #1146
- fix(mcp): extend model env overrides to all configs + test provider routing by @prasmussen15 in #1535
- Add Support falkordblite - FalkorDB embedded version by @galshubeli in #1125
- fix(falkordblite): make embedded install work (pin redis<8) + example cleanup by @prasmussen15 in #1536
- ci: use IPv4 (127.0.0.1) for FalkorDB/Neo4j waits in integration tests by @danielchalef in #1538
- ci(cla): authenticate CLA Assistant with a GitHub App token, drop the PAT by @danielchalef in #1541
- ci: fix (id-token) and harden Claude review/triage workflows by @danielchalef in #1540
- ci: make Claude review work on Opus 4.8 (github_token + action bump) + re-add synchronize by @danielchalef in #1542
- ci: bump claude-code-action to v1.0.139 (agent SDK that recognizes Opus 4.8) by @danielchalef in #1543
- ci: make Claude review post on Opus 4.8 (anti-suppress prompt + read-only tools) by @danielchalef in #1544
- ci: allowlist the github_comment tool so Claude review actually posts by @danielchalef in #1545
- ci: use track_progress for Claude PR review (the actual comment mechanism) by @danielchalef in #1546
- fix(llm): default OpenAIGenericClient to json_schema with json_object fallback by @danielchalef in #1537
- deprecate(kuzu): mark Kuzu deprecated; drop from default test matrix by @danielchalef in #1548
- ci: run ruff lint/format on fork PRs via privilege-stripped pull_request_target by @danielchalef in #1550
- feat(llm): default to gpt-5.5 with model-tied reasoning effort by @danielchalef in #1551
- chore(mcp): modernize dependencies, MCP SDK, and default models by @danielchalef in #1552
- feat(mcp): core-parity — bi-temporal, sagas, communities, filters, triplets, custom types by @danielchalef in #1553
- test(mcp): live end-to-end FalkorDB suite + CI workflow (gpt-5.5) by @danielchalef in #1557
- ci(mcp): treat pytest exit-5 (suite self-skipped) as success by @danielchalef in #1559
- fix: apply --host and --port CLI flags in apply_cli_overrides by @Maanik23 in #1376
- feat(mcp): accept a scalar group_id on the read tools by @danielchalef in #1558
- chore(deps-dev): update faker requirement from >=37.12.0 to >=40.21.0 in /mcp_server by @dependabot[bot] in #1447
- chore(deps-dev): update ruff requirement from >=0.7.1 to >=0.15.16 in /mcp_server by @dependabot[bot] in #1446
- chore(deps): update pyyaml requirement from >=6.0 to >=6.0.3 in /mcp_server by @dependabot[bot] in #1445
- chore(deps-dev): update anthropic requirement from >=0.49.0 to >=0.107.1 in /mcp_server by @dependabot[bot] in #1449
- fix(falkordb): make default group_id valid and escape it for RediSearch by @prasmussen15 in #1549
New Contributors
- @he-yufeng made their first contribution in #1531
- @Maanik23 made their first contribution in #1376
Full Changelog: v0.29.1...v0.29.2
v0.29.1 - Optimizations and Efficiencies
Patch release covering quality and reliability improvements landed since 0.29.0.
Extraction quality
Attribute-hallucination guards (#1498) — addresses a customer report of up to 9KB of LLM meta-reasoning landing in entity attribute fields (e.g. phones,
industry). The LLM was dumping internal deliberation and echoing schema description text back into values. Three layered defenses:
- Prompt-level: extract_attributes prompts for both nodes and edges now have hard rules forbidding parenthetical reasoning, deliberative phrases, candidate
alternatives, schema-description echoes, and null/N/A sentence stand-ins. Includes positive/negative examples. - Combined-extraction prompt: new OUTPUT DISCIPLINE block closes the "topic-as-Person" failure mode (full-sentence entity names) and pre-empts reasoning leaks
into fact text and relation_type. - Provider-level preamble: a shared _apply_attribute_extraction_preamble on LLMClient mutates the system message across OpenAI, Anthropic, Gemini, and GLiNER2
so the "field descriptions are format specs, not values" instruction reaches every provider regardless of how structured output is wired. Sentinel-based
idempotency.
Structural backstop — cap_string_attributes: drops any string attribute >250 chars before it reaches the graph. Configurable per-field via Pydantic
Field(max_length=...) or globally via GRAPHITI_ATTRIBUTE_MAX_LENGTH. Also handles list[str] (per-item + aggregate cap of max_len * 8). Required-field carve-out
retains the value with a louder WARNING rather than dropping (avoids ValidationError-ing the whole entity). Edge writes use scoped merge for over-cap drops only
— fields the LLM legitimately omitted still clear. group_id flows to the log line for tenant correlation.
Combined-extraction entity & edge precision (#1498) — targets six classes of low-quality entities (multi-choice fragments, clock times, quantities, coordinates,
imperative tip phrases, slogans) plus two systematic edge regressions (location-fragmentation through scenery intermediaries, dropped multi-episode setup
facts).
- ENTITY RULE 6 expanded into 8 sub-bullets covering the skip classes; ENTITY RULE 9 added for didactic / tutorial scaffolding.
- FACT RULE 4 strengthened around narrative announcements, forward commitments, plans, and emotional setup in conversational episodes; FACT RULE 8 added
requiring direct speaker-to-target edges over fragmenting through scenery intermediaries. - Negative-examples block (A–G) added with paired source-and-extraction guidance per class.
Locomo 500-example eval (prompt change only):
- Entity F1: 0.674 (flat); precision −0.028, recall +0.025
- Edge volume: +7.7% over baseline; gold-edge recall +0.9pp
- Fact-text Jaccard on matched edges: 0.341 → 0.381
- Targeted entity classes on LME-derivative sample: quantities −93%, imperative tips −40%
Saga summarization
Episode-time watermarks for sagas (#1498) — saga (thread summary) timestamps now reflect originating-episode time rather than wall-clock time. SagaNode now
carries two deliberately distinct watermarks:
- last_summarized_at (wall-clock) — the filter watermark. summarize_saga picks up any episode whose created_at > this value. Wall-clock + created_at comparison
keeps backfilled episodes reachable on the next run. - last_summarized_episode_valid_at (episode time) — the temporal watermark. Max valid_at across episodes covered by the current summary; advances monotonically.
Public/temporal consumers ("how recent is this summary's content in event-time?") should use this field.
saga_get_episode_contents now returns list[(content, valid_at)] tuples so callers can compute the watermark. _get_or_create_saga renames now → created_at;
callers pass the episode's valid_at so a newly minted saga's created_at matches the episode that produced it.
Docker / packaging
- fix(mcp): install MCP provider extras in Docker images (#1461)
- fix(docker): mount FalkorDB volume to actual data path (#1462) — earlier mount path didn't match FalkorDB's data directory, so data wasn't actually persisted
across container restarts. - chore(deps): bump uv group across 2 directories (#1473) — jupyterlab 4.5.7, plus indirect updates to jupyter-server 2.18.0, mistune 3.2.1, python-multipart
0.0.27.
Docs
- docs(graphiti): drop stale add_episode_bulk warning (#1476) — removed an outdated docstring that warned the bulk path skipped edge invalidation and date
extraction. That hasn't been true since the bulk pipeline was rewritten to share per-episode primitives (resolve_extracted_edges, extract_edges both run on the
bulk path).
What's Changed
- docs(graphiti): drop stale add_episode_bulk edge-invalidation/date-extraction note by @prasmussen15 in #1476
- Bump the uv group across 2 directories with 4 updates by @dependabot[bot] in #1473
- fix(docker): mount FalkorDB volume to actual data path by @fengfeng-zi in #1462
- fix: install MCP provider extras in Docker images by @fengfeng-zi in #1461
- Forward-port: attribute-hallucination guards, combined-extraction precision, saga episode-time watermarks by @prasmussen15 in #1498
- Bump graphiti-core version to 0.29.1 by @prasmussen15 in #1499
New Contributors
- @fengfeng-zi made their first contribution in #1462
Full Changelog: v0.29.0...v0.29.1
v0.29.0 - Major efficiency and Internal Architecture changes
Release Notes — graphiti-core 0.29.0
Summary
0.29.0 is the first of two releases focused on making ingestion meaningfully cheaper and the search pipeline easier to evolve. The headline changes:
Cheaper ingestion. A new combined node + edge extraction path lets a single LLM call cover what previously took two, and node/edge extraction can now batch multiple episodes into one prompt. Timestamp resolution (valid_at / invalid_at) has also been split into its own step so it doesn't compete with structural fact extraction.
Search pipeline rework. A large internal restructure of graphiti_core/search/search.py lays the groundwork for upcoming search and reranker changes — no public API changes, but tracing coverage is much improved.
New saga abstraction. A summarize_saga(saga_id) API on Graphiti, backed by SagaNode and a refreshed prompt, gives a first-class way to roll up multi-episode narratives.
Quality-of-life. A fact_triple episode type, episode_metadata for filtering, safer attribute merging that no longer clobbers first-class fields, and a podcast example that runs against an embedded FalkorDB with no external DB.
How this affects developers
Defaults are unchanged. Combined extraction is opt-in via use_combined_extraction=True on extract_nodes_and_edges_bulk. Existing ingestion code keeps working as-is.
Episode indices are now 0-based. If you parse [Episode N] headers or rely on episode_indices from extraction results, update your offsets accordingly.
Kuzu users — schema migration required. RelatesToNode_ now expects a reference_time TIMESTAMP column. New databases get it automatically; existing stores need a one-time ALTER TABLE RelatesToNode_ ADD reference_time TIMESTAMP.
Custom attributes are now safer to set. Attribute dicts on nodes/edges no longer overwrite first-class fields (uuid, group_id, created_at, timestamps). If you were depending on that overwrite behavior, you'll need to set those fields directly.
New public surface to know about: Graphiti.summarize_saga(saga_id), the fact_triple episode type, and EpisodicNode.episode_metadata for custom filtering keys.
Highlights
Efficiency: fewer, smarter LLM calls during ingestion
Combined node + edge extraction (feature-flagged). A single LLM call can now produce both nodes and edges for an episode. Pass use_combined_extraction=True to extract_nodes_and_edges_bulk to opt in; default behavior is unchanged. Backed by a new prompts/extract_nodes_and_edges.py and utils/maintenance/combined_extraction.py.
Multi-episode batched extraction. _extract_and_resolve_nodes and extract_edges now accept a list of episodes, build a shared prompt with [Episode N] headers (new concatenate_episodes helper), and attach episode_indices to each extracted node/edge so callers can map results back to their source episode.
Decoupled timestamp resolution. New extract_timestamps / extract_timestamps_batch prompts let valid_at / invalid_at be resolved in a dedicated post-extraction step, so structural fact extraction is no longer entangled with date parsing.
Architecture
Search pipeline rework. Major restructure of graphiti_core/search/search.py (~1k lines changed) and new tracing test coverage, paving the way for upcoming search/reranker changes.
Sagas. New summarize_saga(saga_id) API on Graphiti, plus a refreshed summarize_sagas prompt and supporting helpers (saga_get_previous_episode_uuid, saga_get_episode_contents).
fact_triple episode type and an episode_metadata dict on EpisodicNode for customer-defined filtering keys.
Safer attribute merging on edges and nodes — first-class fields (uuid, group_id, created_at, timestamps) are no longer overwritten when an attribute dict happens to contain a matching key.
reference_time preserved through bulk edge save, and added as a column on the Kuzu RelatesToNode schema. Existing Kuzu users may need a one-time ALTER TABLE RelatesToNode ADD reference_time TIMESTAMP.
Prompt refinements
Dedup (nodes & edges): tightened scope, looser two-entity rule in the combined extraction path.
Fact extraction: detail-preservation rule, broader entity capture for qualified objects.
Refreshed summarize_sagas prompt.
Examples / DX
examples/podcast/podcast_runner.py now runs against an embedded FalkorDB (falkordblite) with no external database, and exercises edge + node hybrid search post-ingest.
Notable internal changes
Driver tweaks in graph_operations.py and record_parsers.py.
Episode indexing is now 0-based (was 1-based in the first iteration of multi-episode extraction).
pytest bumped to 9.0.3 in server/ and mcp_server/.
Lockfile and dependency refreshes (uv group, voyageai, groq, google-genai, uvicorn, pyright, pytest-asyncio).
Coming next
The next release will continue this architectural track — expect the combined extraction path to graduate toward the default ingestion mode, additional batching across edge resolution and dedup, and follow-on search-pipeline changes building on the rework that landed here.
v0.28.2 - SECURITY: Harden Search Filters Against Cypher Injection
What's Changed
- chore: regenerate lockfiles to drop diskcache by @prasmussen15 in #1244
- fix: replace edge name with uuid in debug log by @prasmussen15 in #1261
- chore: update Docker images to graphiti-core 0.28.1 by @prasmussen15 in #1292
- feat: Add GLiNER2 hybrid LLM client by @danielchalef in #1284
- Refresh README content and fix image refs by @danielchalef in #1313
- Restore README title and subtitle by @danielchalef in #1314
- Harden search filters against Cypher injection by @danielchalef in #1312
Full Changelog: v0.28.1...v0.28.2
mcp-v1.0.2 - Security: Require graphiti-core>=0.28.2
MCP v1.0.1 and prior has a security cypher injection vulnerability via graphiti-core 0.28.1. Please update to MCP v1.0.2.
What's Changed
- Bump mcp-server to 1.0.2 and require graphiti-core>=0.28.2 by @danielchalef in #1317
Full Changelog: v0.28.2...mcp-v1.0.2
v0.28.1 - remove diskcache
What's Changed
- fix: extract custom edge attributes on first episode ingestion by @prasmussen15 in #1242
- fix: replace diskcache with sqlite-based cache to resolve CVE by @jackaldenryan in #1238
- chore: bump version to 0.28.1 by @prasmussen15 in #1243
Full Changelog: v0.28.0...v0.28.1
v0.28.0 - Update GraphDriver Integrations
What's Changed
- feat: simplify extraction pipeline and add batch entity summarization by @prasmussen15 in #1224
- chore(deps): update dependencies to fix dependabot alerts by @jackaldenryan in #1225
- feat: driver operations architecture redesign by @prasmussen15 in #1232
- Bump graphiti-core[falkordb] from 0.26.3 to 0.27.1 in /mcp_server by @dependabot[bot] in #1231
- feat: implement Neptune and Kuzu driver operations by @prasmussen15 in #1235
- chore: bump version to 0.28.0 and document graph driver architecture by @prasmussen15 in #1236
- fix: remove PII from log messages by @prasmussen15 in #1237
Full Changelog: v0.27.1...v0.28.0
v0.27.2pre1 - more ingestion efficiency gains
What's Changed
- feat: simplify extraction pipeline and add batch entity summarization by @prasmussen15 in #1224
Full Changelog: v0.27.1...v0.27.2pre1
v0.27.1 - fix duplicate info appearing in summaries
What's Changed
- fix(summary): exclude duplicate edges from node summary generation by @prasmussen15 in #1223
Full Changelog: v0.27.0...v0.27.1