graphiti-core 0.30.0rc3__tar.gz → 0.30.0rc4__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 (192) hide show
  1. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/PKG-INFO +1 -1
  2. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/edge_operations.py +20 -5
  3. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/pyproject.toml +1 -1
  4. graphiti_core-0.30.0rc4/tests/utils/maintenance/test_edge_operations.py +291 -0
  5. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/uv.lock +1 -1
  6. graphiti_core-0.30.0rc3/tests/utils/maintenance/test_edge_operations.py +0 -144
  7. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.env.example +0 -0
  8. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/dependabot.yml +0 -0
  10. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/pull_request_template.md +0 -0
  11. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/secret_scanning.yml +0 -0
  12. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/ai-moderator.yml +0 -0
  13. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/cla.yml +0 -0
  14. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/claude-code-review.yml +0 -0
  15. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/claude.yml +0 -0
  16. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/codeql.yml +0 -0
  17. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/lint.yml +0 -0
  18. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/mcp-server-docker.yml +0 -0
  19. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/release-graphiti-core.yml +0 -0
  20. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/typecheck.yml +0 -0
  21. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.github/workflows/unit_tests.yml +0 -0
  22. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/.gitignore +0 -0
  23. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/AGENTS.md +0 -0
  24. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/CLAUDE.md +0 -0
  25. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/CODE_OF_CONDUCT.md +0 -0
  26. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/CONTRIBUTING.md +0 -0
  27. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/Dockerfile +0 -0
  28. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/LICENSE +0 -0
  29. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/Makefile +0 -0
  30. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/README.md +0 -0
  31. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/SECURITY.md +0 -0
  32. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/Zep-CLA.md +0 -0
  33. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/conftest.py +0 -0
  34. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/depot.json +0 -0
  35. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/docker-compose.test.yml +0 -0
  36. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/docker-compose.yml +0 -0
  37. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/ellipsis.yaml +0 -0
  38. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/data/manybirds_products.json +0 -0
  39. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/ecommerce/runner.ipynb +0 -0
  40. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/ecommerce/runner.py +0 -0
  41. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/langgraph-agent/agent.ipynb +0 -0
  42. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/langgraph-agent/tinybirds-jess.png +0 -0
  43. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/podcast/podcast_runner.py +0 -0
  44. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/podcast/podcast_transcript.txt +0 -0
  45. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/podcast/transcript_parser.py +0 -0
  46. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/quickstart/README.md +0 -0
  47. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/quickstart/quickstart_falkordb.py +0 -0
  48. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/quickstart/quickstart_neo4j.py +0 -0
  49. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/quickstart/quickstart_neptune.py +0 -0
  50. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/quickstart/requirements.txt +0 -0
  51. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/wizard_of_oz/parser.py +0 -0
  52. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/wizard_of_oz/runner.py +0 -0
  53. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/examples/wizard_of_oz/woo.txt +0 -0
  54. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/__init__.py +0 -0
  55. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/cross_encoder/__init__.py +0 -0
  56. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  57. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/cross_encoder/client.py +0 -0
  58. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/cross_encoder/gemini_reranker_client.py +0 -0
  59. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  60. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/__init__.py +0 -0
  61. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/driver.py +0 -0
  62. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/falkordb_driver.py +0 -0
  63. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/kuzu_driver.py +0 -0
  64. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/neo4j_driver.py +0 -0
  65. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/driver/neptune_driver.py +0 -0
  66. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/edges.py +0 -0
  67. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/__init__.py +0 -0
  68. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/azure_openai.py +0 -0
  69. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/client.py +0 -0
  70. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/gemini.py +0 -0
  71. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/openai.py +0 -0
  72. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/embedder/voyage.py +0 -0
  73. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/errors.py +0 -0
  74. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/graph_queries.py +0 -0
  75. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/graphiti.py +0 -0
  76. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/graphiti_types.py +0 -0
  77. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/helpers.py +0 -0
  78. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/__init__.py +0 -0
  79. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/anthropic_client.py +0 -0
  80. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/azure_openai_client.py +0 -0
  81. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/client.py +0 -0
  82. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/config.py +0 -0
  83. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/errors.py +0 -0
  84. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/gemini_client.py +0 -0
  85. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/groq_client.py +0 -0
  86. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/openai_base_client.py +0 -0
  87. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/openai_client.py +0 -0
  88. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/openai_generic_client.py +0 -0
  89. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/llm_client/utils.py +0 -0
  90. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/migrations/__init__.py +0 -0
  91. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/models/__init__.py +0 -0
  92. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/models/edges/__init__.py +0 -0
  93. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/models/edges/edge_db_queries.py +0 -0
  94. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/models/nodes/__init__.py +0 -0
  95. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  96. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/nodes.py +0 -0
  97. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/__init__.py +0 -0
  98. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/dedupe_edges.py +0 -0
  99. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  100. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/eval.py +0 -0
  101. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  102. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/extract_edges.py +0 -0
  103. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/extract_nodes.py +0 -0
  104. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/invalidate_edges.py +0 -0
  105. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/lib.py +0 -0
  106. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/models.py +0 -0
  107. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/prompt_helpers.py +0 -0
  108. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/prompts/summarize_nodes.py +0 -0
  109. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/py.typed +0 -0
  110. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/__init__.py +0 -0
  111. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search.py +0 -0
  112. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search_config.py +0 -0
  113. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search_config_recipes.py +0 -0
  114. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search_filters.py +0 -0
  115. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search_helpers.py +0 -0
  116. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/search/search_utils.py +0 -0
  117. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/telemetry/__init__.py +0 -0
  118. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/telemetry/telemetry.py +0 -0
  119. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/__init__.py +0 -0
  120. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/bulk_utils.py +0 -0
  121. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/datetime_utils.py +0 -0
  122. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/__init__.py +0 -0
  123. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  124. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/dedup_helpers.py +0 -0
  125. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/graph_data_operations.py +0 -0
  126. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/node_operations.py +0 -0
  127. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  128. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/maintenance/utils.py +0 -0
  129. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/graphiti_core/utils/ontology_utils/entity_types_utils.py +0 -0
  130. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/images/arxiv-screenshot.png +0 -0
  131. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/images/graphiti-graph-intro.gif +0 -0
  132. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/images/graphiti-intro-slides-stock-2.gif +0 -0
  133. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/images/simple_graph.svg +0 -0
  134. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/.env.example +0 -0
  135. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/.python-version +0 -0
  136. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/Dockerfile +0 -0
  137. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/README.md +0 -0
  138. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/cursor_rules.md +0 -0
  139. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/docker-compose.yml +0 -0
  140. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/graphiti_mcp_server.py +0 -0
  141. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/mcp_config_sse_example.json +0 -0
  142. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/mcp_config_stdio_example.json +0 -0
  143. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/pyproject.toml +0 -0
  144. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/mcp_server/uv.lock +0 -0
  145. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/py.typed +0 -0
  146. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/pytest.ini +0 -0
  147. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/.env.example +0 -0
  148. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/Makefile +0 -0
  149. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/README.md +0 -0
  150. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/__init__.py +0 -0
  151. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/config.py +0 -0
  152. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/dto/__init__.py +0 -0
  153. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/dto/common.py +0 -0
  154. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/dto/ingest.py +0 -0
  155. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/dto/retrieve.py +0 -0
  156. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/main.py +0 -0
  157. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/routers/__init__.py +0 -0
  158. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/routers/ingest.py +0 -0
  159. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/routers/retrieve.py +0 -0
  160. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/graph_service/zep_graphiti.py +0 -0
  161. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/pyproject.toml +0 -0
  162. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/server/uv.lock +0 -0
  163. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/signatures/version1/cla.json +0 -0
  164. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/cross_encoder/test_bge_reranker_client.py +0 -0
  165. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/cross_encoder/test_gemini_reranker_client.py +0 -0
  166. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/driver/__init__.py +0 -0
  167. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/driver/test_falkordb_driver.py +0 -0
  168. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/embedder/embedder_fixtures.py +0 -0
  169. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/embedder/test_gemini.py +0 -0
  170. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/embedder/test_openai.py +0 -0
  171. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/embedder/test_voyage.py +0 -0
  172. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/data/longmemeval_data/README.md +0 -0
  173. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/data/longmemeval_data/longmemeval_oracle.json +0 -0
  174. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/eval_cli.py +0 -0
  175. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/eval_e2e_graph_building.py +0 -0
  176. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/pytest.ini +0 -0
  177. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/evals/utils.py +0 -0
  178. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/helpers_test.py +0 -0
  179. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/llm_client/test_anthropic_client.py +0 -0
  180. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/llm_client/test_anthropic_client_int.py +0 -0
  181. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/llm_client/test_client.py +0 -0
  182. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/llm_client/test_errors.py +0 -0
  183. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/llm_client/test_gemini_client.py +0 -0
  184. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/test_edge_int.py +0 -0
  185. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/test_entity_exclusion_int.py +0 -0
  186. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/test_graphiti_int.py +0 -0
  187. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/test_graphiti_mock.py +0 -0
  188. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/test_node_int.py +0 -0
  189. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/utils/maintenance/test_bulk_utils.py +0 -0
  190. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/utils/maintenance/test_node_operations.py +0 -0
  191. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/utils/maintenance/test_temporal_operations_int.py +0 -0
  192. {graphiti_core-0.30.0rc3 → graphiti_core-0.30.0rc4}/tests/utils/search/search_utils_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphiti-core
3
- Version: 0.30.0rc3
3
+ Version: 0.30.0rc4
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
@@ -43,6 +43,8 @@ from graphiti_core.search.search_filters import SearchFilters
43
43
  from graphiti_core.utils.datetime_utils import ensure_utc, utc_now
44
44
  from graphiti_core.utils.maintenance.dedup_helpers import _normalize_string_exact
45
45
 
46
+ DEFAULT_EDGE_NAME = 'RELATES_TO'
47
+
46
48
  logger = logging.getLogger(__name__)
47
49
 
48
50
 
@@ -310,6 +312,15 @@ async def resolve_extracted_edges(
310
312
 
311
313
  edge_types_lst.append(extracted_edge_types)
312
314
 
315
+ for extracted_edge, extracted_edge_types in zip(extracted_edges, edge_types_lst, strict=True):
316
+ allowed_type_names = set(extracted_edge_types)
317
+ if not allowed_type_names:
318
+ if extracted_edge.name != DEFAULT_EDGE_NAME:
319
+ extracted_edge.name = DEFAULT_EDGE_NAME
320
+ continue
321
+ if extracted_edge.name not in allowed_type_names:
322
+ extracted_edge.name = DEFAULT_EDGE_NAME
323
+
313
324
  # resolve edges with related edges in the graph and find invalidation candidates
314
325
  results: list[tuple[EntityEdge, list[EntityEdge], list[EntityEdge]]] = list(
315
326
  await semaphore_gather(
@@ -392,7 +403,7 @@ async def resolve_extracted_edge(
392
403
  related_edges: list[EntityEdge],
393
404
  existing_edges: list[EntityEdge],
394
405
  episode: EpisodicNode,
395
- edge_types: dict[str, type[BaseModel]] | None = None,
406
+ edge_type_candidates: dict[str, type[BaseModel]] | None = None,
396
407
  ensure_ascii: bool = True,
397
408
  ) -> tuple[EntityEdge, list[EntityEdge], list[EntityEdge]]:
398
409
  if len(related_edges) == 0 and len(existing_edges) == 0:
@@ -429,9 +440,9 @@ async def resolve_extracted_edge(
429
440
  'fact_type_name': type_name,
430
441
  'fact_type_description': type_model.__doc__,
431
442
  }
432
- for i, (type_name, type_model) in enumerate(edge_types.items())
443
+ for i, (type_name, type_model) in enumerate(edge_type_candidates.items())
433
444
  ]
434
- if edge_types is not None
445
+ if edge_type_candidates is not None
435
446
  else []
436
447
  )
437
448
 
@@ -468,7 +479,8 @@ async def resolve_extracted_edge(
468
479
  ]
469
480
 
470
481
  fact_type: str = response_object.fact_type
471
- if fact_type.upper() != 'DEFAULT' and edge_types is not None:
482
+ candidate_type_names = set(edge_type_candidates or {})
483
+ if candidate_type_names and fact_type in candidate_type_names:
472
484
  resolved_edge.name = fact_type
473
485
 
474
486
  edge_attributes_context = {
@@ -478,7 +490,7 @@ async def resolve_extracted_edge(
478
490
  'ensure_ascii': ensure_ascii,
479
491
  }
480
492
 
481
- edge_model = edge_types.get(fact_type)
493
+ edge_model = edge_type_candidates.get(fact_type) if edge_type_candidates else None
482
494
  if edge_model is not None and len(edge_model.model_fields) != 0:
483
495
  edge_attributes_response = await llm_client.generate_response(
484
496
  prompt_library.extract_edges.extract_attributes(edge_attributes_context),
@@ -487,6 +499,9 @@ async def resolve_extracted_edge(
487
499
  )
488
500
 
489
501
  resolved_edge.attributes = edge_attributes_response
502
+ elif fact_type.upper() != 'DEFAULT':
503
+ resolved_edge.name = DEFAULT_EDGE_NAME
504
+ resolved_edge.attributes = {}
490
505
 
491
506
  end = time()
492
507
  logger.debug(
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "graphiti-core"
3
3
  description = "A temporal graph building library"
4
- version = "0.30.0pre3"
4
+ version = "0.30.0pre4"
5
5
  authors = [
6
6
  { name = "Paul Paliychuk", email = "paul@getzep.com" },
7
7
  { name = "Preston Rasmussen", email = "preston@getzep.com" },
@@ -0,0 +1,291 @@
1
+ from datetime import datetime, timedelta, timezone
2
+ from unittest.mock import AsyncMock, MagicMock
3
+
4
+ import pytest
5
+ from pydantic import BaseModel
6
+
7
+ from graphiti_core.edges import EntityEdge
8
+ from graphiti_core.graphiti_types import GraphitiClients
9
+ from graphiti_core.nodes import EntityNode, EpisodicNode
10
+ from graphiti_core.search.search_config import SearchResults
11
+ from graphiti_core.utils.maintenance.edge_operations import (
12
+ DEFAULT_EDGE_NAME,
13
+ resolve_extracted_edge,
14
+ resolve_extracted_edges,
15
+ )
16
+
17
+
18
+ @pytest.fixture
19
+ def mock_llm_client():
20
+ client = MagicMock()
21
+ client.generate_response = AsyncMock()
22
+ return client
23
+
24
+
25
+ @pytest.fixture
26
+ def mock_extracted_edge():
27
+ return EntityEdge(
28
+ source_node_uuid='source_uuid',
29
+ target_node_uuid='target_uuid',
30
+ name='test_edge',
31
+ group_id='group_1',
32
+ fact='Test fact',
33
+ episodes=['episode_1'],
34
+ created_at=datetime.now(timezone.utc),
35
+ valid_at=None,
36
+ invalid_at=None,
37
+ )
38
+
39
+
40
+ @pytest.fixture
41
+ def mock_related_edges():
42
+ return [
43
+ EntityEdge(
44
+ source_node_uuid='source_uuid_2',
45
+ target_node_uuid='target_uuid_2',
46
+ name='related_edge',
47
+ group_id='group_1',
48
+ fact='Related fact',
49
+ episodes=['episode_2'],
50
+ created_at=datetime.now(timezone.utc) - timedelta(days=1),
51
+ valid_at=datetime.now(timezone.utc) - timedelta(days=1),
52
+ invalid_at=None,
53
+ )
54
+ ]
55
+
56
+
57
+ @pytest.fixture
58
+ def mock_existing_edges():
59
+ return [
60
+ EntityEdge(
61
+ source_node_uuid='source_uuid_3',
62
+ target_node_uuid='target_uuid_3',
63
+ name='existing_edge',
64
+ group_id='group_1',
65
+ fact='Existing fact',
66
+ episodes=['episode_3'],
67
+ created_at=datetime.now(timezone.utc) - timedelta(days=2),
68
+ valid_at=datetime.now(timezone.utc) - timedelta(days=2),
69
+ invalid_at=None,
70
+ )
71
+ ]
72
+
73
+
74
+ @pytest.fixture
75
+ def mock_current_episode():
76
+ return EpisodicNode(
77
+ uuid='episode_1',
78
+ content='Current episode content',
79
+ valid_at=datetime.now(timezone.utc),
80
+ name='Current Episode',
81
+ group_id='group_1',
82
+ source='message',
83
+ source_description='Test source description',
84
+ )
85
+
86
+
87
+ @pytest.fixture
88
+ def mock_previous_episodes():
89
+ return [
90
+ EpisodicNode(
91
+ uuid='episode_2',
92
+ content='Previous episode content',
93
+ valid_at=datetime.now(timezone.utc) - timedelta(days=1),
94
+ name='Previous Episode',
95
+ group_id='group_1',
96
+ source='message',
97
+ source_description='Test source description',
98
+ )
99
+ ]
100
+
101
+
102
+ # Run the tests
103
+ if __name__ == '__main__':
104
+ pytest.main([__file__])
105
+
106
+
107
+ @pytest.mark.asyncio
108
+ async def test_resolve_extracted_edge_exact_fact_short_circuit(
109
+ mock_llm_client,
110
+ mock_existing_edges,
111
+ mock_current_episode,
112
+ ):
113
+ extracted = EntityEdge(
114
+ source_node_uuid='source_uuid',
115
+ target_node_uuid='target_uuid',
116
+ name='test_edge',
117
+ group_id='group_1',
118
+ fact='Related fact',
119
+ episodes=['episode_1'],
120
+ created_at=datetime.now(timezone.utc),
121
+ valid_at=None,
122
+ invalid_at=None,
123
+ )
124
+
125
+ related_edges = [
126
+ EntityEdge(
127
+ source_node_uuid='source_uuid',
128
+ target_node_uuid='target_uuid',
129
+ name='related_edge',
130
+ group_id='group_1',
131
+ fact=' related FACT ',
132
+ episodes=['episode_2'],
133
+ created_at=datetime.now(timezone.utc) - timedelta(days=1),
134
+ valid_at=None,
135
+ invalid_at=None,
136
+ )
137
+ ]
138
+
139
+ resolved_edge, duplicate_edges, invalidated = await resolve_extracted_edge(
140
+ mock_llm_client,
141
+ extracted,
142
+ related_edges,
143
+ mock_existing_edges,
144
+ mock_current_episode,
145
+ edge_type_candidates=None,
146
+ ensure_ascii=True,
147
+ )
148
+
149
+ assert resolved_edge is related_edges[0]
150
+ assert resolved_edge.episodes.count(mock_current_episode.uuid) == 1
151
+ assert duplicate_edges == []
152
+ assert invalidated == []
153
+ mock_llm_client.generate_response.assert_not_called()
154
+
155
+
156
+ class OccurredAtEdge(BaseModel):
157
+ """Edge model stub for OCCURRED_AT."""
158
+
159
+
160
+ @pytest.mark.asyncio
161
+ async def test_resolve_extracted_edges_resets_unmapped_names(monkeypatch):
162
+ from graphiti_core.utils.maintenance import edge_operations as edge_ops
163
+
164
+ monkeypatch.setattr(edge_ops, 'create_entity_edge_embeddings', AsyncMock(return_value=None))
165
+ monkeypatch.setattr(EntityEdge, 'get_between_nodes', AsyncMock(return_value=[]))
166
+
167
+ async def immediate_gather(*aws, max_coroutines=None):
168
+ return [await aw for aw in aws]
169
+
170
+ monkeypatch.setattr(edge_ops, 'semaphore_gather', immediate_gather)
171
+ monkeypatch.setattr(edge_ops, 'search', AsyncMock(return_value=SearchResults()))
172
+
173
+ llm_client = MagicMock()
174
+ llm_client.generate_response = AsyncMock(
175
+ return_value={'duplicate_facts': [], 'contradicted_facts': [], 'fact_type': 'DEFAULT'}
176
+ )
177
+
178
+ clients = GraphitiClients.model_construct(
179
+ driver=MagicMock(),
180
+ llm_client=llm_client,
181
+ embedder=MagicMock(),
182
+ cross_encoder=MagicMock(),
183
+ ensure_ascii=True,
184
+ )
185
+
186
+ source_node = EntityNode(
187
+ uuid='source_uuid',
188
+ name='Document Node',
189
+ group_id='group_1',
190
+ labels=['Document'],
191
+ )
192
+ target_node = EntityNode(
193
+ uuid='target_uuid',
194
+ name='Topic Node',
195
+ group_id='group_1',
196
+ labels=['Topic'],
197
+ )
198
+
199
+ extracted_edge = EntityEdge(
200
+ source_node_uuid=source_node.uuid,
201
+ target_node_uuid=target_node.uuid,
202
+ name='OCCURRED_AT',
203
+ group_id='group_1',
204
+ fact='Document occurred at somewhere',
205
+ episodes=[],
206
+ created_at=datetime.now(timezone.utc),
207
+ valid_at=None,
208
+ invalid_at=None,
209
+ )
210
+
211
+ episode = EpisodicNode(
212
+ uuid='episode_uuid',
213
+ name='Episode',
214
+ group_id='group_1',
215
+ source='message',
216
+ source_description='desc',
217
+ content='Episode content',
218
+ valid_at=datetime.now(timezone.utc),
219
+ )
220
+
221
+ edge_types = {'OCCURRED_AT': OccurredAtEdge}
222
+ edge_type_map = {('Event', 'Entity'): ['OCCURRED_AT']}
223
+
224
+ resolved_edges, invalidated_edges = await resolve_extracted_edges(
225
+ clients,
226
+ [extracted_edge],
227
+ episode,
228
+ [source_node, target_node],
229
+ edge_types,
230
+ edge_type_map,
231
+ )
232
+
233
+ assert resolved_edges[0].name == DEFAULT_EDGE_NAME
234
+ assert invalidated_edges == []
235
+
236
+
237
+ @pytest.mark.asyncio
238
+ async def test_resolve_extracted_edge_rejects_unmapped_fact_type(mock_llm_client):
239
+ mock_llm_client.generate_response.return_value = {
240
+ 'duplicate_facts': [],
241
+ 'contradicted_facts': [],
242
+ 'fact_type': 'OCCURRED_AT',
243
+ }
244
+
245
+ extracted_edge = EntityEdge(
246
+ source_node_uuid='source_uuid',
247
+ target_node_uuid='target_uuid',
248
+ name='OCCURRED_AT',
249
+ group_id='group_1',
250
+ fact='Document occurred at somewhere',
251
+ episodes=[],
252
+ created_at=datetime.now(timezone.utc),
253
+ valid_at=None,
254
+ invalid_at=None,
255
+ )
256
+
257
+ episode = EpisodicNode(
258
+ uuid='episode_uuid',
259
+ name='Episode',
260
+ group_id='group_1',
261
+ source='message',
262
+ source_description='desc',
263
+ content='Episode content',
264
+ valid_at=datetime.now(timezone.utc),
265
+ )
266
+
267
+ related_edge = EntityEdge(
268
+ source_node_uuid='alt_source',
269
+ target_node_uuid='alt_target',
270
+ name='OTHER',
271
+ group_id='group_1',
272
+ fact='Different fact',
273
+ episodes=[],
274
+ created_at=datetime.now(timezone.utc),
275
+ valid_at=None,
276
+ invalid_at=None,
277
+ )
278
+
279
+ resolved_edge, duplicates, invalidated = await resolve_extracted_edge(
280
+ mock_llm_client,
281
+ extracted_edge,
282
+ [related_edge],
283
+ [],
284
+ episode,
285
+ edge_type_candidates={},
286
+ ensure_ascii=True,
287
+ )
288
+
289
+ assert resolved_edge.name == DEFAULT_EDGE_NAME
290
+ assert duplicates == []
291
+ assert invalidated == []
@@ -783,7 +783,7 @@ wheels = [
783
783
 
784
784
  [[package]]
785
785
  name = "graphiti-core"
786
- version = "0.30.0rc3"
786
+ version = "0.30.0rc4"
787
787
  source = { editable = "." }
788
788
  dependencies = [
789
789
  { name = "diskcache" },
@@ -1,144 +0,0 @@
1
- from datetime import datetime, timedelta, timezone
2
- from unittest.mock import MagicMock
3
-
4
- import pytest
5
-
6
- from graphiti_core.edges import EntityEdge
7
- from graphiti_core.nodes import EpisodicNode
8
- from graphiti_core.utils.maintenance.edge_operations import resolve_extracted_edge
9
-
10
-
11
- @pytest.fixture
12
- def mock_llm_client():
13
- return MagicMock()
14
-
15
-
16
- @pytest.fixture
17
- def mock_extracted_edge():
18
- return EntityEdge(
19
- source_node_uuid='source_uuid',
20
- target_node_uuid='target_uuid',
21
- name='test_edge',
22
- group_id='group_1',
23
- fact='Test fact',
24
- episodes=['episode_1'],
25
- created_at=datetime.now(timezone.utc),
26
- valid_at=None,
27
- invalid_at=None,
28
- )
29
-
30
-
31
- @pytest.fixture
32
- def mock_related_edges():
33
- return [
34
- EntityEdge(
35
- source_node_uuid='source_uuid_2',
36
- target_node_uuid='target_uuid_2',
37
- name='related_edge',
38
- group_id='group_1',
39
- fact='Related fact',
40
- episodes=['episode_2'],
41
- created_at=datetime.now(timezone.utc) - timedelta(days=1),
42
- valid_at=datetime.now(timezone.utc) - timedelta(days=1),
43
- invalid_at=None,
44
- )
45
- ]
46
-
47
-
48
- @pytest.fixture
49
- def mock_existing_edges():
50
- return [
51
- EntityEdge(
52
- source_node_uuid='source_uuid_3',
53
- target_node_uuid='target_uuid_3',
54
- name='existing_edge',
55
- group_id='group_1',
56
- fact='Existing fact',
57
- episodes=['episode_3'],
58
- created_at=datetime.now(timezone.utc) - timedelta(days=2),
59
- valid_at=datetime.now(timezone.utc) - timedelta(days=2),
60
- invalid_at=None,
61
- )
62
- ]
63
-
64
-
65
- @pytest.fixture
66
- def mock_current_episode():
67
- return EpisodicNode(
68
- uuid='episode_1',
69
- content='Current episode content',
70
- valid_at=datetime.now(timezone.utc),
71
- name='Current Episode',
72
- group_id='group_1',
73
- source='message',
74
- source_description='Test source description',
75
- )
76
-
77
-
78
- @pytest.fixture
79
- def mock_previous_episodes():
80
- return [
81
- EpisodicNode(
82
- uuid='episode_2',
83
- content='Previous episode content',
84
- valid_at=datetime.now(timezone.utc) - timedelta(days=1),
85
- name='Previous Episode',
86
- group_id='group_1',
87
- source='message',
88
- source_description='Test source description',
89
- )
90
- ]
91
-
92
-
93
- # Run the tests
94
- if __name__ == '__main__':
95
- pytest.main([__file__])
96
-
97
-
98
- @pytest.mark.asyncio
99
- async def test_resolve_extracted_edge_exact_fact_short_circuit(
100
- mock_llm_client,
101
- mock_existing_edges,
102
- mock_current_episode,
103
- ):
104
- extracted = EntityEdge(
105
- source_node_uuid='source_uuid',
106
- target_node_uuid='target_uuid',
107
- name='test_edge',
108
- group_id='group_1',
109
- fact='Related fact',
110
- episodes=['episode_1'],
111
- created_at=datetime.now(timezone.utc),
112
- valid_at=None,
113
- invalid_at=None,
114
- )
115
-
116
- related_edges = [
117
- EntityEdge(
118
- source_node_uuid='source_uuid',
119
- target_node_uuid='target_uuid',
120
- name='related_edge',
121
- group_id='group_1',
122
- fact=' related FACT ',
123
- episodes=['episode_2'],
124
- created_at=datetime.now(timezone.utc) - timedelta(days=1),
125
- valid_at=None,
126
- invalid_at=None,
127
- )
128
- ]
129
-
130
- resolved_edge, duplicate_edges, invalidated = await resolve_extracted_edge(
131
- mock_llm_client,
132
- extracted,
133
- related_edges,
134
- mock_existing_edges,
135
- mock_current_episode,
136
- edge_types=None,
137
- ensure_ascii=True,
138
- )
139
-
140
- assert resolved_edge is related_edges[0]
141
- assert resolved_edge.episodes.count(mock_current_episode.uuid) == 1
142
- assert duplicate_edges == []
143
- assert invalidated == []
144
- mock_llm_client.generate_response.assert_not_called()