Skip to content

fix: correctly merge update_community results from semaphore_gather#1254

Closed
sprotasovitsky wants to merge 1 commit into
getzep:mainfrom
sprotasovitsky:fix/update-communities-unpacking
Closed

fix: correctly merge update_community results from semaphore_gather#1254
sprotasovitsky wants to merge 1 commit into
getzep:mainfrom
sprotasovitsky:fix/update-communities-unpacking

Conversation

@sprotasovitsky

Copy link
Copy Markdown

Summary

  • Fixes tuple unpacking crash in add_episode() when update_communities=True
  • semaphore_gather returns a list of N tuples (one per node), not a single tuple — the results must be merged via iteration

Problem

update_community() returns tuple[list[CommunityNode], list[CommunityEdge]] per node. semaphore_gather() collects these into a list:

# semaphore_gather returns: [(nodes_A, edges_A), (nodes_B, edges_B), (nodes_C, edges_C)]
# Old code tried:
communities, community_edges = await semaphore_gather(...)
# This only works when exactly 2 nodes are in the episode — crashes otherwise

This bug was introduced in v0.19.0 (commit dcc9da3) when community results were added to AddEpisodeResults. Every version since v0.19.0 crashes with ValueError: too many values to unpack (expected 2) when update_communities=True and the episode has != 2 nodes.

Fix

community_results = await semaphore_gather(...)
for comm_nodes, comm_edges in community_results:
    communities.extend(comm_nodes)
    community_edges.extend(comm_edges)

Test plan

  • Verified with episodes producing 3-7 nodes — no crash
  • Communities are correctly updated and persisted to Neo4j
  • AddEpisodeResults correctly contains merged community data

Fixes #836

semaphore_gather returns a list of tuples (one per node), where each
tuple is (list[CommunityNode], list[CommunityEdge]). The previous code
tried to unpack this list directly into two variables:

    communities, community_edges = await semaphore_gather(...)

This crashes with "too many values to unpack (expected 2)" whenever
the episode touches more or fewer than exactly 2 nodes — which is
almost always.

Fix by iterating over results and merging into the pre-initialized
lists.

Fixes getzep#836

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@danielchalef

danielchalef commented Feb 21, 2026

Copy link
Copy Markdown
Member

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@sprotasovitsky

Copy link
Copy Markdown
Author

I have read the CLA Document and I hereby sign the CLA

danielchalef added a commit that referenced this pull request Feb 21, 2026
yhl999 added a commit to yhl999/bicameral that referenced this pull request Feb 22, 2026
…#70)

* fix(summary): exclude duplicate edges from node summary generation (getzep#1223)

* fix(summary): exclude duplicate edges from node summary generation

When resolving extracted edges, edges that match existing edges in the
graph were still being passed to node summary generation, causing facts
to be duplicated in summaries.

Changes:
- Update resolve_extracted_edges to return new_edges (non-duplicates)
- Update _extract_and_resolve_edges to pass through new_edges
- Pass only new_edges to extract_attributes_from_nodes in add_episode
- An edge is considered "new" if its resolved UUID matches extracted UUID

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* chore: bump version to 0.27.1

Co-Authored-By: Claude Opus 4.5 <[email protected]>

---------

Co-authored-by: Claude Opus 4.5 <[email protected]>

* feat: simplify extraction pipeline and add batch entity summarization (getzep#1224)

* feat(llm): add token usage tracking for LLM calls

Add TokenUsageTracker class to track input/output tokens by prompt type
during LLM calls. This helps analyze token costs across different
operations like extract_nodes, extract_edges, resolve_nodes, etc.

Changes:
- Add graphiti_core/llm_client/token_tracker.py with TokenUsageTracker
- Update LLMClient base class to include token_tracker instance
- Update OpenAI base client to capture and record token usage
- Add token_tracker property on Graphiti class for easy access
- Update podcast_runner.py to print token usage summary after ingestion

Usage:
  client = Graphiti(...)
  # ... run ingestion ...
  client.token_tracker.print_summary(sort_by='prompt_name')

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* chore: temporarily disable summary early return optimization

Disable the optimization that skips LLM calls when node summary + edge
facts is under 2000 characters. This forces all summaries to be
generated via LLM for token usage analysis.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Revert "chore: temporarily disable summary early return optimization"

This reverts the summary optimization changes.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* feat: simplify extraction pipeline and add batch entity summarization

- Remove chunking code for entity-dense episodes (node_operations.py)
  - Delete _extract_nodes_chunked, _extract_from_chunk, _merge_extracted_entities
  - Always use single LLM call for entity extraction

- Remove chunking code for edge extraction (edge_operations.py)
  - Remove MAX_NODES constant and generate_covering_chunks usage
  - Process all nodes in single LLM call instead of covering subsets

- Add batch entity summarization (node_operations.py, extract_nodes.py)
  - New SummarizedEntity and SummarizedEntities Pydantic models
  - New extract_summaries_batch prompt for batch processing
  - New _extract_entity_summaries_batch function
  - Nodes with short summaries get edge facts appended directly (no LLM)
  - Only nodes needing LLM summarization are batched together

- Simplify edge attribute extraction (extract_edges.py, edge_operations.py)
  - Remove episode_content from context (attributes from fact only)
  - Keep reference_time for temporal resolution
  - Add existing_attributes to preserve/update existing values

- Improve edge deduplication prompt (dedupe_edges.py, edge_operations.py)
  - Use continuous indexing across duplicate and invalidation candidates
  - Deduplicate invalidation candidates against duplicate candidates
  - Allow EXISTING FACTS to be both duplicates AND contradicted
  - Consolidate to single contradicted_facts field

- Remove obsolete chunking tests (test_entity_extraction.py)

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* chore: bump version to 0.27.2pre1

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add token tracking for Anthropic/Gemini clients and missing tests

- Implement token tracking in AnthropicClient._generate_response()
  and generate_response() using result.usage.input_tokens/output_tokens
- Implement token tracking in GeminiClient._generate_response()
  and generate_response() using response.usage_metadata
- Add comprehensive unit tests for TokenUsageTracker class
- Add tests for _extract_entity_summaries_batch function covering:
  - No nodes needing summarization
  - Short summaries with edge facts
  - Long summaries requiring LLM
  - Node filter (should_summarize_node)
  - Batch multiple nodes
  - Unknown entity handling
  - Missing episode and summary

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Update test_node_operations.py for batch summarization API

- Remove import of extract_attributes_from_node (function was removed)
- Add import of _extract_entity_summaries_batch
- Update tests to use new batch summarization API

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add MAX_NODES limit for batch entity summarization

- Add MAX_NODES = 30 constant
- Partition nodes needing summarization into flights of MAX_NODES
- Extract _process_summary_flight helper for processing each flight
- Each flight makes a separate LLM call to avoid context overflow

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Change default OpenAI models to gpt-5-mini

Update both DEFAULT_MODEL and DEFAULT_SMALL_MODEL to use gpt-5-mini.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Update podcast_runner.py to use default OpenAI models

Remove explicit model configuration to use the default gpt-5-mini models
from OpenAIClient.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Revert default model changes to gpt-4.1-mini/nano

Restore the original default models instead of gpt-5-mini.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Address PR review comments

- Fix unreachable code in _handle_structured_response (check response.refusal)
- Process node summary flights in parallel using semaphore_gather
- Use case-insensitive name matching for LLM summary responses
- Handle duplicate node names by applying summary to all matching nodes
- Fix edge case when both edge lists are empty in contradiction processing
- Fix potential AttributeError when episode is None in edge attributes
- Add tests for flight partitioning and case-insensitive name matching

Co-Authored-By: Claude Opus 4.5 <[email protected]>

---------

Co-authored-by: Claude Opus 4.5 <[email protected]>

* chore(deps): update dependencies to fix dependabot alerts (getzep#1225)

Update lock files to address security alerts:
- cryptography, cffi, and other security-related packages
- Major version bumps for langchain-core and related packages
- Minor updates to other dependencies

Co-authored-by: Claude Haiku 4.5 <[email protected]>

* @contextablemark has signed the CLA in getzep#1227

* @avonian has signed the CLA in getzep#1230

* feat: driver operations architecture redesign (getzep#1232)

* feat: add driver operations architecture with abstract interfaces and concrete implementations

Introduces a clean operations-based architecture for graph driver operations,
replacing inline query logic with abstract interfaces (ABCs) and concrete
implementations for both Neo4j and FalkorDB backends.

Key changes:
- Add QueryExecutor and Transaction ABCs for database-agnostic query execution
- Add 11 operations ABCs covering all node, edge, search, and graph maintenance operations
- Implement all 11 operations for Neo4j with real transaction commit/rollback
- Implement all 11 operations for FalkorDB with RedisSearch fulltext and vecf32 embeddings
- Add NodeNamespace and EdgeNamespace convenience wrappers on Graphiti class
- Wire operations into Neo4jDriver and FalkorDriver with property accessors
- Fix circular import by moving STOPWORDS to graphiti_core.driver.falkordb package
- Include design spec documenting architecture decisions and migration plan

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: address PR review feedback

- Fix ruff UP037: remove quoted type annotations in driver.py
  (redundant with `from __future__ import annotations`)
- Extract duplicate record parsers into shared record_parsers.py module,
  eliminating identical _entity_node_from_record, _entity_edge_from_record,
  _episodic_node_from_record, and _community_node_from_record across
  10 files in both Neo4j and FalkorDB operations
- Fix MAX_QUERY_LENGTH inconsistency in FalkorDB search_ops
  build_fulltext_query (was 8000, now uses module constant 128)
- Make namespace attributes unconditional with NotImplementedError
  for drivers that don't implement required operations

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: make namespace init graceful for drivers missing operations

KuzuDriver doesn't implement the new operations interfaces, so the
NotImplementedError on init broke Kuzu tests. Now attributes are only
set when the driver provides them, and __getattr__ gives a clear error
on access.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>

* Bump graphiti-core[falkordb] from 0.26.3 to 0.27.1 in /mcp_server (getzep#1231)

Bumps [graphiti-core[falkordb]](https://github.com/getzep/graphiti) from 0.26.3 to 0.27.1.
- [Release notes](https://github.com/getzep/graphiti/releases)
- [Commits](getzep/graphiti@v0.26.3...v0.27.1)

---
updated-dependencies:
- dependency-name: graphiti-core[falkordb]
  dependency-version: 0.27.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: implement Neptune and Kuzu driver operations (getzep#1235)

* feat: implement Neptune and Kuzu driver operations

Extract scattered Neptune and Kuzu logic from nodes.py, edges.py,
search_utils.py, and maintenance utilities into structured operations
classes, following the same architecture established for Neo4j and
FalkorDB in getzep#1232.

Each driver now has 11 operations classes: entity_node_ops,
episode_node_ops, community_node_ops, saga_node_ops, entity_edge_ops,
episodic_edge_ops, community_edge_ops, has_episode_edge_ops,
next_episode_edge_ops, search_ops, and graph_ops.

Neptune-specific: AOSS fulltext search, comma-separated embeddings,
manual cosine similarity, removeKeyFromMap() for saves.

Kuzu-specific: RelatesToNode_ intermediate pattern, JSON attributes,
QUERY_FTS_INDEX/array_cosine_similarity, BFS depth doubling,
Saga/HAS_EPISODE/NEXT_EPISODE schema additions.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: address PR review comments for Neptune/Kuzu operations

- Extract `_label_propagation` and `Neighbor` to shared `graph_utils.py`
  module, removing duplication across all 4 driver graph_ops.py files
- Extract `_parse_kuzu_entity_node` and `_parse_kuzu_entity_edge` to
  shared `kuzu/operations/record_parsers.py`, removing duplication
  across entity_node_ops, entity_edge_ops, graph_ops, and search_ops
- Fix UNWIND bug in Kuzu `node_distance_reranker` and
  `episode_mentions_reranker` (Kuzu doesn't support UNWIND)
- Fix `_build_kuzu_fulltext_query` max_query_length calculation bug
  (`len(group_ids or '')` was meaningless)
- Replace inline import + cast pattern with constructor dependency
  injection for Neptune AOSS access in community_node_ops, search_ops,
  and graph_ops
- Use existing `calculate_cosine_similarity` from `search_utils.py`
  instead of duplicating it in Neptune search_ops

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>

* chore: bump version to 0.28.0 and document graph driver architecture (getzep#1236)

* chore: bump version to 0.28.0 and document graph driver architecture

Bump graphiti-core to 0.28.0 and update the MCP server dependency to
match. Add a new "Graph Driver Architecture" section to the README
explaining how the pluggable driver layer works and how to add a new
graph database backend.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* docs: address PR review comments on driver architecture section

- Add legacy directories (graph_operations/, search_interface/) and
  Kuzu record_parsers.py to the diagram, with a "simplified; see source"
  note
- Clarify that the ABC defines operations properties as optional (| None)
  and concrete drivers override to return non-optional types

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>

* fix: remove PII from log messages (getzep#1237)

* fix: remove PII from log messages

Remove entity names, edge facts, and LLM input/output content from log
messages to prevent personally identifiable information from leaking
into logs. Replace with UUIDs, counts, and structural metadata only.

Changes:
- edge_operations.py: Remove entity names from WARNING logs, replace
  full edge objects and name tuples with UUIDs in DEBUG logs
- node_operations.py: Remove entity names from WARNING and DEBUG logs,
  log only UUIDs and counts instead of (name, uuid) tuples
- llm_client/client.py: Replace full message content dump in
  _get_failed_generation_log with message count and role metadata

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: preserve schema metadata and truncated output in logs

Address review feedback — the initial PII fix overcorrected by removing
non-PII debugging context:

- Restore relation types in edge WARNING logs (schema metadata, not PII)
- Restore truncated duplicate_name in dedup WARNING (needed for diagnosis)
- Restore truncated entity name (first 30 chars) in summary WARNING
- Restore truncated raw LLM output (first 500 chars) in failed generation
  ERROR logs — malformed output is structural, not user content

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>

* fix: extract custom edge attributes on first episode ingestion (getzep#1242)

The fast path in resolve_extracted_edge() returned early when no
related/existing edges existed, skipping the LLM attribute extraction
call. This meant edges created during the first episode never had
their custom ontology attributes populated.

Co-authored-by: Claude Opus 4.6 <[email protected]>

* fix: replace diskcache with sqlite-based cache to resolve CVE (getzep#1238)

* fix: replace diskcache with sqlite-based cache to resolve CVE

diskcache <= 5.6.3 has an unsafe pickle deserialization vulnerability
with no patched version available. Replace it with a minimal SQLite +
JSON cache implementation that only stores JSON-serializable data.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: add thread safety, error handling, and cleanup to LLMCache

- Use check_same_thread=False for safe cross-thread SQLite access
- Handle JSON serialization/deserialization errors gracefully
- Add __del__ for connection cleanup on garbage collection

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* fix: upgrade urllib3 to 2.6.3 in examples lock file

Fixes decompression-bomb redirect bypass vulnerability (requires >= 2.6.3).
The main and mcp_server lock files already had 2.6.3.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* test: add unit tests for LLMCache

Covers get/set, overwrites, nested values, non-serializable handling,
corrupted entry recovery, directory creation, persistence, and cleanup.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>

* chore: bump version to 0.28.1 (getzep#1243)

Patch release so that mcp_server and server lockfiles can drop the
diskcache transitive dependency once published, resolving dependabot
alerts #69 and #70.

Co-authored-by: Claude Opus 4.6 <[email protected]>

* chore: regenerate lockfiles to drop diskcache (getzep#1244)

* chore: regenerate lockfiles to drop diskcache dependency

Resolves dependabot alerts #69 and #70 (unsafe pickle deserialization
in diskcache). Now that graphiti-core 0.28.1 is published without
diskcache, all downstream lockfiles can be updated.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* Update server/pyproject.toml

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>

* @Yifan-233-max has signed the CLA in getzep#1245

* @sprotasovitsky has signed the CLA in getzep#1254

* @hanxiao has signed the CLA in getzep#1257

* docs(sync): add upstream baseline and graphiti_core patch classification

* fix(edges): skip malformed RELATES_TO rows in get_between_nodes (#66)

* fix(edges): ignore malformed RELATES_TO edges in get_between_nodes

Filter out edges missing uuid/group_id/episodes to avoid EntityEdge validation failures
when legacy malformed relationships exist between node pairs.

* fix(edges): ignore malformed RELATES_TO rows in get_by_node_uuid/get_by_uuids/get_by_group_ids

* fix(edges): add null guards to Kuzu get_between_nodes query

Add WHERE e.uuid IS NOT NULL AND e.group_id IS NOT NULL AND e.episodes IS NOT NULL
to the Kuzu branch of get_between_nodes, matching the Neo4j branch's guards.

Addresses review finding on PR #66.

(cherry picked from commit ff34e16)

* feat: trust-aware retrieval — post-RRF additive boost (#63)

* feat: trust-aware retrieval — post-RRF additive boost for promoted facts

- Add trust_weight field to SearchConfig (default 0.0 = disabled, backwards compat)
- Add rrf_with_trust_boost() and load_trust_scores() to search_utils.py
- Add EDGE/NODE_HYBRID_SEARCH_RRF_TRUST recipes
- Wire trust boost into edge and node search pipelines in search.py
- MCP server: GRAPHITI_TRUST_WEIGHT env var (default 0.15)

* fix: review findings — default trust_weight=0.0, skip episode_mentions, flatten double RRF, safe env parsing

- H1: MCP TRUST_WEIGHT default 0.15 → 0.0 (opt-in, not opt-out)
- H2: Trust boost only for RRF reranker, not episode_mentions (was no-op with overhead)
- M1: Remove redundant outer rrf() call in trust branch (use set comprehension for UUIDs)
- L1: Try/except on GRAPHITI_TRUST_WEIGHT env var parsing

* fix: ruff lint — consistent trust_weight default, strict zip, remove unused import

- rrf_with_trust_boost() default trust_weight 0.15 → 0.0 (consistent with SearchConfig)
- zip(uuids, rrf_scores, strict=True) per B905
- Remove unused OntologyRegistry import (F401)
- Fix import sorting (I001)

(cherry picked from commit f93924f)

* feat(dedupe): migration-only deterministic edge dedupe mode (#67)

* feat(dedupe): add deterministic migration mode to bypass semantic edge dedupe

When GRAPHITI_DEDUPE_MODE=deterministic:
- keep exact-match fast path
- skip LLM duplicate/contradiction resolution
- preserve optional attribute extraction

Intended for controlled migration backfills where semantic dedupe instability
must not block canonical ingestion.

* refactor(dedupe): replace env-var GRAPHITI_DEDUPE_MODE with explicit dedupe_mode parameter

- Remove os.getenv('GRAPHITI_DEDUPE_MODE') from resolve_extracted_edge
- Add dedupe_mode: Literal['semantic','deterministic']='semantic' to:
  - resolve_extracted_edge(...)
  - resolve_extracted_edges(...)
  - _extract_and_resolve_edges(...) [internal helper]
  - add_episode(...) [public API]
- Thread parameter through all call sites
- Default remains 'semantic' — no behavior change for existing callsites
- add_episode_bulk and add_triplet implicitly keep 'semantic' via default

Addresses review finding on PR #67: env-var global bypass too risky.

* fix(edge_ops): preserve semantic-mode call signature for resolve_extracted_edge

Avoid passing dedupe_mode kwarg in semantic mode so existing monkeypatched tests/callsites
without dedupe_mode parameter remain compatible.

* docs+api: document dedupe_mode and ontology safety notes for migration hardening

(cherry picked from commit 5f4e7c0)

* ci(sync): add graphiti_core allowlist guardrail

* sync: align maintenance tests with upstream and allow upstream-sync reports

* ci: use ubuntu-latest for upstream legacy workflows in fork

* ci: disable upstream legacy workflow jobs in fork repo

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Preston Rasmussen <[email protected]>
Co-authored-by: Claude Opus 4.5 <[email protected]>
Co-authored-by: Jack Ryan <[email protected]>
Co-authored-by: Daniel Chalef <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
ehfazrezwan added a commit to ehfazrezwan/neuralscape that referenced this pull request Apr 2, 2026
feafc422 Bump the uv group across 2 directories with 2 updates (#1363)
c4e6923b Upstream Zep internal improvements (#1361)
e88c09ca @VictorECDSA has signed the CLA in getzep/graphiti#1356
91fe7e0e @majiayu000 has signed the CLA in getzep/graphiti#1351
c52786d2 @dudo has signed the CLA in getzep/graphiti#1350
d631437d @Ker102 has signed the CLA in getzep/graphiti#1339
73cff2cb @chengjon has signed the CLA in getzep/graphiti#1340
8c617639 @rhlsthrm has signed the CLA in getzep/graphiti#1335
e6424bae @pratyush618 has signed the CLA in getzep/graphiti#1332
6f05647c @bsolomon1124 has signed the CLA in getzep/graphiti#1330
10d91394 @spencer2211 has signed the CLA in getzep/graphiti#1326
1ca14686 Add hiring promotion section to README (#1323)
19e44a97 Bump mcp-server to 1.0.2 and require graphiti-core>=0.28.2 (#1317)
77b16096 Bump graphiti-core version to 0.28.2 (#1315)
7d65d5e7 Harden search filters against Cypher injection (#1312)
b10b4889 Restore README title and subtitle (#1314)
a9065fa9 Refresh README content and fix image refs (#1313)
5a334ec5 @lvca has signed the CLA in getzep/graphiti#1310
45c8040e @jawherkh has signed the CLA in getzep/graphiti#1309
9eb2c9e8 @kraft87 has signed the CLA in getzep/graphiti#1305
334c8faa @adsharma has signed the CLA in getzep/graphiti#1296
b6f9d874 @StephenBadger has signed the CLA in getzep/graphiti#1295
4b91076a feat: Add GLiNER2 hybrid LLM client (#1284)
db54ce09 chore: update Docker images to graphiti-core 0.28.1 (#1292)
edc71e8e @devmao has signed the CLA in getzep/graphiti#1289
b4ddc55a @carlos-alm has signed the CLA in getzep/graphiti#1288
aa8e81e3 @giulio-leone has signed the CLA in getzep/graphiti#1280
6fdb352f @aelhajj has signed the CLA in getzep/graphiti#1281
2099603d @avianion has signed the CLA in getzep/graphiti#1278
9eb59f7f @themavik has signed the CLA in getzep/graphiti#1214
98f5b5ff fix: replace edge name with uuid in debug log (#1261)
510bd50d @hanxiao has signed the CLA in getzep/graphiti#1257
17a8ea9e @sprotasovitsky has signed the CLA in getzep/graphiti#1254
9d509a2a @Yifan-233-max has signed the CLA in getzep/graphiti#1245
ef52a2ad chore: regenerate lockfiles to drop diskcache (#1244)
76053036 chore: bump version to 0.28.1 (#1243)
bde2f797 fix: replace diskcache with sqlite-based cache to resolve CVE (#1238)

git-subtree-dir: graphiti
git-subtree-split: feafc422c739f0da166241d4804a9830a294d366
@danielchalef

Copy link
Copy Markdown
Member

Thanks for this — same root cause as #1486 (update_community results returned by semaphore_gather aren't merged/flattened in add_episode). Consolidating on #1486 (includes a regression test). Closing as superseded by #1486.

@zep-cla-assistant zep-cla-assistant Bot locked and limited conversation to collaborators Jun 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] update_communities broken

2 participants