graphiti-core 0.21.0rc8__tar.gz → 0.21.0rc10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of graphiti-core might be problematic. Click here for more details.

Files changed (191) hide show
  1. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/claude-code-review.yml +2 -0
  2. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/PKG-INFO +1 -1
  3. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/extract_edges.py +1 -1
  4. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/extract_nodes.py +1 -1
  5. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/edge_operations.py +1 -3
  6. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/node_operations.py +19 -7
  7. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/pyproject.toml +1 -1
  8. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/utils/maintenance/test_node_operations.py +182 -0
  9. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/uv.lock +1 -1
  10. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.env.example +0 -0
  11. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/dependabot.yml +0 -0
  13. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/pull_request_template.md +0 -0
  14. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/secret_scanning.yml +0 -0
  15. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/ai-moderator.yml +0 -0
  16. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/cla.yml +0 -0
  17. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/claude.yml +0 -0
  18. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/codeql.yml +0 -0
  19. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/lint.yml +0 -0
  20. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/mcp-server-docker.yml +0 -0
  21. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/release-graphiti-core.yml +0 -0
  22. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/typecheck.yml +0 -0
  23. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.github/workflows/unit_tests.yml +0 -0
  24. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/.gitignore +0 -0
  25. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/AGENTS.md +0 -0
  26. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/CLAUDE.md +0 -0
  27. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/CODE_OF_CONDUCT.md +0 -0
  28. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/CONTRIBUTING.md +0 -0
  29. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/Dockerfile +0 -0
  30. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/LICENSE +0 -0
  31. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/Makefile +0 -0
  32. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/README.md +0 -0
  33. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/SECURITY.md +0 -0
  34. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/Zep-CLA.md +0 -0
  35. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/conftest.py +0 -0
  36. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/depot.json +0 -0
  37. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/docker-compose.test.yml +0 -0
  38. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/docker-compose.yml +0 -0
  39. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/ellipsis.yaml +0 -0
  40. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/data/manybirds_products.json +0 -0
  41. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/ecommerce/runner.ipynb +0 -0
  42. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/ecommerce/runner.py +0 -0
  43. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/langgraph-agent/agent.ipynb +0 -0
  44. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/langgraph-agent/tinybirds-jess.png +0 -0
  45. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/podcast/podcast_runner.py +0 -0
  46. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/podcast/podcast_transcript.txt +0 -0
  47. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/podcast/transcript_parser.py +0 -0
  48. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/quickstart/README.md +0 -0
  49. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/quickstart/quickstart_falkordb.py +0 -0
  50. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/quickstart/quickstart_neo4j.py +0 -0
  51. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/quickstart/quickstart_neptune.py +0 -0
  52. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/quickstart/requirements.txt +0 -0
  53. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/wizard_of_oz/parser.py +0 -0
  54. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/wizard_of_oz/runner.py +0 -0
  55. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/examples/wizard_of_oz/woo.txt +0 -0
  56. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/__init__.py +0 -0
  57. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/cross_encoder/__init__.py +0 -0
  58. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  59. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/cross_encoder/client.py +0 -0
  60. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/cross_encoder/gemini_reranker_client.py +0 -0
  61. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  62. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/__init__.py +0 -0
  63. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/driver.py +0 -0
  64. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/falkordb_driver.py +0 -0
  65. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/kuzu_driver.py +0 -0
  66. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/neo4j_driver.py +0 -0
  67. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/driver/neptune_driver.py +0 -0
  68. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/edges.py +0 -0
  69. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/__init__.py +0 -0
  70. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/azure_openai.py +0 -0
  71. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/client.py +0 -0
  72. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/gemini.py +0 -0
  73. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/openai.py +0 -0
  74. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/embedder/voyage.py +0 -0
  75. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/errors.py +0 -0
  76. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/graph_queries.py +0 -0
  77. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/graphiti.py +0 -0
  78. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/graphiti_types.py +0 -0
  79. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/helpers.py +0 -0
  80. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/__init__.py +0 -0
  81. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/anthropic_client.py +0 -0
  82. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/azure_openai_client.py +0 -0
  83. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/client.py +0 -0
  84. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/config.py +0 -0
  85. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/errors.py +0 -0
  86. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/gemini_client.py +0 -0
  87. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/groq_client.py +0 -0
  88. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/openai_base_client.py +0 -0
  89. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/openai_client.py +0 -0
  90. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/openai_generic_client.py +0 -0
  91. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/llm_client/utils.py +0 -0
  92. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/migrations/__init__.py +0 -0
  93. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/models/__init__.py +0 -0
  94. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/models/edges/__init__.py +0 -0
  95. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/models/edges/edge_db_queries.py +0 -0
  96. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/models/nodes/__init__.py +0 -0
  97. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  98. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/nodes.py +0 -0
  99. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/__init__.py +0 -0
  100. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/dedupe_edges.py +0 -0
  101. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  102. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/eval.py +0 -0
  103. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  104. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/invalidate_edges.py +0 -0
  105. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/lib.py +0 -0
  106. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/models.py +0 -0
  107. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/prompt_helpers.py +0 -0
  108. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/prompts/summarize_nodes.py +0 -0
  109. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/py.typed +0 -0
  110. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/__init__.py +0 -0
  111. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search.py +0 -0
  112. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search_config.py +0 -0
  113. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search_config_recipes.py +0 -0
  114. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search_filters.py +0 -0
  115. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search_helpers.py +0 -0
  116. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/search/search_utils.py +0 -0
  117. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/telemetry/__init__.py +0 -0
  118. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/telemetry/telemetry.py +0 -0
  119. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/__init__.py +0 -0
  120. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/bulk_utils.py +0 -0
  121. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/datetime_utils.py +0 -0
  122. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/__init__.py +0 -0
  123. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  124. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/dedup_helpers.py +0 -0
  125. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/graph_data_operations.py +0 -0
  126. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  127. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/maintenance/utils.py +0 -0
  128. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/graphiti_core/utils/ontology_utils/entity_types_utils.py +0 -0
  129. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/images/arxiv-screenshot.png +0 -0
  130. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/images/graphiti-graph-intro.gif +0 -0
  131. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/images/graphiti-intro-slides-stock-2.gif +0 -0
  132. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/images/simple_graph.svg +0 -0
  133. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/.env.example +0 -0
  134. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/.python-version +0 -0
  135. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/Dockerfile +0 -0
  136. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/README.md +0 -0
  137. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/cursor_rules.md +0 -0
  138. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/docker-compose.yml +0 -0
  139. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/graphiti_mcp_server.py +0 -0
  140. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/mcp_config_sse_example.json +0 -0
  141. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/mcp_config_stdio_example.json +0 -0
  142. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/pyproject.toml +0 -0
  143. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/mcp_server/uv.lock +0 -0
  144. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/py.typed +0 -0
  145. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/pytest.ini +0 -0
  146. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/.env.example +0 -0
  147. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/Makefile +0 -0
  148. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/README.md +0 -0
  149. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/__init__.py +0 -0
  150. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/config.py +0 -0
  151. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/dto/__init__.py +0 -0
  152. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/dto/common.py +0 -0
  153. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/dto/ingest.py +0 -0
  154. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/dto/retrieve.py +0 -0
  155. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/main.py +0 -0
  156. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/routers/__init__.py +0 -0
  157. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/routers/ingest.py +0 -0
  158. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/routers/retrieve.py +0 -0
  159. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/graph_service/zep_graphiti.py +0 -0
  160. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/pyproject.toml +0 -0
  161. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/server/uv.lock +0 -0
  162. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/signatures/version1/cla.json +0 -0
  163. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/cross_encoder/test_bge_reranker_client.py +0 -0
  164. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/cross_encoder/test_gemini_reranker_client.py +0 -0
  165. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/driver/__init__.py +0 -0
  166. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/driver/test_falkordb_driver.py +0 -0
  167. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/embedder/embedder_fixtures.py +0 -0
  168. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/embedder/test_gemini.py +0 -0
  169. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/embedder/test_openai.py +0 -0
  170. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/embedder/test_voyage.py +0 -0
  171. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/data/longmemeval_data/README.md +0 -0
  172. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/data/longmemeval_data/longmemeval_oracle.json +0 -0
  173. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/eval_cli.py +0 -0
  174. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/eval_e2e_graph_building.py +0 -0
  175. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/pytest.ini +0 -0
  176. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/evals/utils.py +0 -0
  177. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/helpers_test.py +0 -0
  178. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/llm_client/test_anthropic_client.py +0 -0
  179. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/llm_client/test_anthropic_client_int.py +0 -0
  180. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/llm_client/test_client.py +0 -0
  181. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/llm_client/test_errors.py +0 -0
  182. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/llm_client/test_gemini_client.py +0 -0
  183. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/test_edge_int.py +0 -0
  184. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/test_entity_exclusion_int.py +0 -0
  185. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/test_graphiti_int.py +0 -0
  186. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/test_graphiti_mock.py +0 -0
  187. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/test_node_int.py +0 -0
  188. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/utils/maintenance/test_bulk_utils.py +0 -0
  189. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/utils/maintenance/test_edge_operations.py +0 -0
  190. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/utils/maintenance/test_temporal_operations_int.py +0 -0
  191. {graphiti_core-0.21.0rc8 → graphiti_core-0.21.0rc10}/tests/utils/search/search_utils_test.py +0 -0
@@ -29,6 +29,8 @@ jobs:
29
29
 
30
30
  Please review this pull request.
31
31
 
32
+ IMPORTANT: Your role is to critically review code. You must not provide POSITIVE feedback on code, this only adds noise to the review process.
33
+
32
34
  Note: The PR branch is already checked out in the current working directory.
33
35
 
34
36
  Focus on:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphiti-core
3
- Version: 0.21.0rc8
3
+ Version: 0.21.0rc10
4
4
  Summary: A temporal graph building library
5
5
  Project-URL: Homepage, https://help.getzep.com/graphiti/graphiti/overview
6
6
  Project-URL: Repository, https://github.com/getzep/graphiti
@@ -111,7 +111,7 @@ You may use information from the PREVIOUS MESSAGES only to disambiguate referenc
111
111
  2. Each fact must involve two **distinct** entities.
112
112
  3. Use a SCREAMING_SNAKE_CASE string as the `relation_type` (e.g., FOUNDED, WORKS_AT).
113
113
  4. Do not emit duplicate or semantically redundant facts.
114
- 5. The `fact_text` should quote or closely paraphrase the original source sentence(s).
114
+ 5. The `fact_text` should closely paraphrase the original source sentence(s). Do not verbatim quote the original text.
115
115
  6. Use `REFERENCE_TIME` to resolve vague or relative temporal expressions (e.g., "last week").
116
116
  7. Do **not** hallucinate or infer temporal bounds from unrelated events.
117
117
 
@@ -151,7 +151,7 @@ For each entity extracted, also determine its entity type based on the provided
151
151
  Indicate the classified entity type by providing its entity_type_id.
152
152
 
153
153
  Guidelines:
154
- 1. Always try to extract an entities that the JSON represents. This will often be something like a "name" or "user field
154
+ 1. Extract all entities that the JSON represents. This will often be something like a "name" or "user" field
155
155
  2. Extract all entities mentioned in all other properties throughout the JSON structure
156
156
  3. Do NOT extract any properties that contain dates
157
157
  """
@@ -480,9 +480,7 @@ async def resolve_extracted_edge(
480
480
  start = time()
481
481
 
482
482
  # Prepare context for LLM
483
- related_edges_context = [
484
- {'id': i, 'fact': edge.fact} for i, edge in enumerate(related_edges)
485
- ]
483
+ related_edges_context = [{'id': i, 'fact': edge.fact} for i, edge in enumerate(related_edges)]
486
484
 
487
485
  invalidation_edge_candidates_context = [
488
486
  {'id': i, 'fact': existing_edge.fact} for i, existing_edge in enumerate(existing_edges)
@@ -15,6 +15,7 @@ limitations under the License.
15
15
  """
16
16
 
17
17
  import logging
18
+ from collections.abc import Awaitable, Callable
18
19
  from time import time
19
20
  from typing import Any
20
21
 
@@ -55,6 +56,8 @@ from graphiti_core.utils.maintenance.edge_operations import (
55
56
 
56
57
  logger = logging.getLogger(__name__)
57
58
 
59
+ NodeSummaryFilter = Callable[[EntityNode], Awaitable[bool]]
60
+
58
61
 
59
62
  async def extract_nodes_reflexion(
60
63
  llm_client: LLMClient,
@@ -402,6 +405,7 @@ async def extract_attributes_from_nodes(
402
405
  episode: EpisodicNode | None = None,
403
406
  previous_episodes: list[EpisodicNode] | None = None,
404
407
  entity_types: dict[str, type[BaseModel]] | None = None,
408
+ should_summarize_node: NodeSummaryFilter | None = None,
405
409
  ) -> list[EntityNode]:
406
410
  llm_client = clients.llm_client
407
411
  embedder = clients.embedder
@@ -418,6 +422,7 @@ async def extract_attributes_from_nodes(
418
422
  else None
419
423
  ),
420
424
  clients.ensure_ascii,
425
+ should_summarize_node,
421
426
  )
422
427
  for node in nodes
423
428
  ]
@@ -435,6 +440,7 @@ async def extract_attributes_from_node(
435
440
  previous_episodes: list[EpisodicNode] | None = None,
436
441
  entity_type: type[BaseModel] | None = None,
437
442
  ensure_ascii: bool = False,
443
+ should_summarize_node: NodeSummaryFilter | None = None,
438
444
  ) -> EntityNode:
439
445
  node_context: dict[str, Any] = {
440
446
  'name': node.name,
@@ -477,16 +483,22 @@ async def extract_attributes_from_node(
477
483
  else {}
478
484
  )
479
485
 
480
- summary_response = await llm_client.generate_response(
481
- prompt_library.extract_nodes.extract_summary(summary_context),
482
- response_model=EntitySummary,
483
- model_size=ModelSize.small,
484
- )
486
+ # Determine if summary should be generated
487
+ generate_summary = True
488
+ if should_summarize_node is not None:
489
+ generate_summary = await should_summarize_node(node)
490
+
491
+ # Conditionally generate summary
492
+ if generate_summary:
493
+ summary_response = await llm_client.generate_response(
494
+ prompt_library.extract_nodes.extract_summary(summary_context),
495
+ response_model=EntitySummary,
496
+ model_size=ModelSize.small,
497
+ )
498
+ node.summary = summary_response.get('summary', '')
485
499
 
486
500
  if has_entity_attributes and entity_type is not None:
487
501
  entity_type(**llm_response)
488
-
489
- node.summary = summary_response.get('summary', '')
490
502
  node_attributes = {key: value for key, value in llm_response.items()}
491
503
 
492
504
  node.attributes.update(node_attributes)
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "graphiti-core"
3
3
  description = "A temporal graph building library"
4
- version = "0.21.0pre8"
4
+ version = "0.21.0pre10"
5
5
  authors = [
6
6
  { name = "Paul Paliychuk", email = "paul@getzep.com" },
7
7
  { name = "Preston Rasmussen", email = "preston@getzep.com" },
@@ -27,6 +27,8 @@ from graphiti_core.utils.maintenance.dedup_helpers import (
27
27
  from graphiti_core.utils.maintenance.node_operations import (
28
28
  _collect_candidate_nodes,
29
29
  _resolve_with_llm,
30
+ extract_attributes_from_node,
31
+ extract_attributes_from_nodes,
30
32
  resolve_extracted_nodes,
31
33
  )
32
34
 
@@ -477,3 +479,183 @@ async def test_resolve_with_llm_invalid_duplicate_idx_defaults_to_extracted(monk
477
479
  assert state.resolved_nodes[0] == extracted
478
480
  assert state.uuid_map[extracted.uuid] == extracted.uuid
479
481
  assert state.duplicate_pairs == []
482
+
483
+
484
+ @pytest.mark.asyncio
485
+ async def test_extract_attributes_without_callback_generates_summary():
486
+ """Test that summary is generated when no callback is provided (default behavior)."""
487
+ llm_client = MagicMock()
488
+ llm_client.generate_response = AsyncMock(
489
+ return_value={'summary': 'Generated summary', 'attributes': {}}
490
+ )
491
+
492
+ node = EntityNode(name='Test Node', group_id='group', labels=['Entity'], summary='Old summary')
493
+ episode = _make_episode()
494
+
495
+ result = await extract_attributes_from_node(
496
+ llm_client,
497
+ node,
498
+ episode=episode,
499
+ previous_episodes=[],
500
+ entity_type=None,
501
+ ensure_ascii=False,
502
+ should_summarize_node=None, # No callback provided
503
+ )
504
+
505
+ # Summary should be generated
506
+ assert result.summary == 'Generated summary'
507
+ # LLM should have been called for summary
508
+ assert llm_client.generate_response.call_count == 1
509
+
510
+
511
+ @pytest.mark.asyncio
512
+ async def test_extract_attributes_with_callback_skip_summary():
513
+ """Test that summary is NOT regenerated when callback returns False."""
514
+ llm_client = MagicMock()
515
+ llm_client.generate_response = AsyncMock(
516
+ return_value={'summary': 'This should not be used', 'attributes': {}}
517
+ )
518
+
519
+ node = EntityNode(name='Test Node', group_id='group', labels=['Entity'], summary='Old summary')
520
+ episode = _make_episode()
521
+
522
+ # Callback that always returns False (skip summary generation)
523
+ async def skip_summary_filter(node: EntityNode) -> bool:
524
+ return False
525
+
526
+ result = await extract_attributes_from_node(
527
+ llm_client,
528
+ node,
529
+ episode=episode,
530
+ previous_episodes=[],
531
+ entity_type=None,
532
+ ensure_ascii=False,
533
+ should_summarize_node=skip_summary_filter,
534
+ )
535
+
536
+ # Summary should remain unchanged
537
+ assert result.summary == 'Old summary'
538
+ # LLM should NOT have been called for summary
539
+ assert llm_client.generate_response.call_count == 0
540
+
541
+
542
+ @pytest.mark.asyncio
543
+ async def test_extract_attributes_with_callback_generate_summary():
544
+ """Test that summary is regenerated when callback returns True."""
545
+ llm_client = MagicMock()
546
+ llm_client.generate_response = AsyncMock(
547
+ return_value={'summary': 'New generated summary', 'attributes': {}}
548
+ )
549
+
550
+ node = EntityNode(name='Test Node', group_id='group', labels=['Entity'], summary='Old summary')
551
+ episode = _make_episode()
552
+
553
+ # Callback that always returns True (generate summary)
554
+ async def generate_summary_filter(node: EntityNode) -> bool:
555
+ return True
556
+
557
+ result = await extract_attributes_from_node(
558
+ llm_client,
559
+ node,
560
+ episode=episode,
561
+ previous_episodes=[],
562
+ entity_type=None,
563
+ ensure_ascii=False,
564
+ should_summarize_node=generate_summary_filter,
565
+ )
566
+
567
+ # Summary should be updated
568
+ assert result.summary == 'New generated summary'
569
+ # LLM should have been called for summary
570
+ assert llm_client.generate_response.call_count == 1
571
+
572
+
573
+ @pytest.mark.asyncio
574
+ async def test_extract_attributes_with_selective_callback():
575
+ """Test callback that selectively skips summaries based on node properties."""
576
+ llm_client = MagicMock()
577
+ llm_client.generate_response = AsyncMock(
578
+ return_value={'summary': 'Generated summary', 'attributes': {}}
579
+ )
580
+
581
+ user_node = EntityNode(name='User', group_id='group', labels=['Entity', 'User'], summary='Old')
582
+ topic_node = EntityNode(
583
+ name='Topic', group_id='group', labels=['Entity', 'Topic'], summary='Old'
584
+ )
585
+
586
+ episode = _make_episode()
587
+
588
+ # Callback that skips User nodes but generates for others
589
+ async def selective_filter(node: EntityNode) -> bool:
590
+ return 'User' not in node.labels
591
+
592
+ result_user = await extract_attributes_from_node(
593
+ llm_client,
594
+ user_node,
595
+ episode=episode,
596
+ previous_episodes=[],
597
+ entity_type=None,
598
+ ensure_ascii=False,
599
+ should_summarize_node=selective_filter,
600
+ )
601
+
602
+ result_topic = await extract_attributes_from_node(
603
+ llm_client,
604
+ topic_node,
605
+ episode=episode,
606
+ previous_episodes=[],
607
+ entity_type=None,
608
+ ensure_ascii=False,
609
+ should_summarize_node=selective_filter,
610
+ )
611
+
612
+ # User summary should remain unchanged
613
+ assert result_user.summary == 'Old'
614
+ # Topic summary should be generated
615
+ assert result_topic.summary == 'Generated summary'
616
+ # LLM should have been called only once (for topic)
617
+ assert llm_client.generate_response.call_count == 1
618
+
619
+
620
+ @pytest.mark.asyncio
621
+ async def test_extract_attributes_from_nodes_with_callback():
622
+ """Test that callback is properly passed through extract_attributes_from_nodes."""
623
+ clients, _ = _make_clients()
624
+ clients.llm_client.generate_response = AsyncMock(
625
+ return_value={'summary': 'New summary', 'attributes': {}}
626
+ )
627
+ clients.embedder.create = AsyncMock(return_value=[0.1, 0.2, 0.3])
628
+ clients.embedder.create_batch = AsyncMock(return_value=[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
629
+
630
+ node1 = EntityNode(name='Node1', group_id='group', labels=['Entity', 'User'], summary='Old1')
631
+ node2 = EntityNode(name='Node2', group_id='group', labels=['Entity', 'Topic'], summary='Old2')
632
+
633
+ episode = _make_episode()
634
+
635
+ call_tracker = []
636
+
637
+ # Callback that tracks which nodes it's called with
638
+ async def tracking_filter(node: EntityNode) -> bool:
639
+ call_tracker.append(node.name)
640
+ return 'User' not in node.labels
641
+
642
+ results = await extract_attributes_from_nodes(
643
+ clients,
644
+ [node1, node2],
645
+ episode=episode,
646
+ previous_episodes=[],
647
+ entity_types=None,
648
+ should_summarize_node=tracking_filter,
649
+ )
650
+
651
+ # Callback should have been called for both nodes
652
+ assert len(call_tracker) == 2
653
+ assert 'Node1' in call_tracker
654
+ assert 'Node2' in call_tracker
655
+
656
+ # Node1 (User) should keep old summary, Node2 (Topic) should get new summary
657
+ node1_result = next(n for n in results if n.name == 'Node1')
658
+ node2_result = next(n for n in results if n.name == 'Node2')
659
+
660
+ assert node1_result.summary == 'Old1'
661
+ assert node2_result.summary == 'New summary'
@@ -783,7 +783,7 @@ wheels = [
783
783
 
784
784
  [[package]]
785
785
  name = "graphiti-core"
786
- version = "0.21.0rc8"
786
+ version = "0.21.0rc10"
787
787
  source = { editable = "." }
788
788
  dependencies = [
789
789
  { name = "diskcache" },