graphiti-core 0.19.0rc1__tar.gz → 0.19.0rc3__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 (187) hide show
  1. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/PKG-INFO +8 -6
  2. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/README.md +7 -5
  3. graphiti_core-0.19.0rc3/examples/quickstart/quickstart_neptune.py +252 -0
  4. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/migrations/neo4j_node_group_labels.py +35 -3
  5. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search.py +29 -9
  6. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/graph_data_operations.py +2 -1
  7. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/pyproject.toml +1 -1
  8. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/uv.lock +2 -2
  9. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.env.example +0 -0
  10. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/dependabot.yml +0 -0
  12. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/pull_request_template.md +0 -0
  13. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/secret_scanning.yml +0 -0
  14. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/ai-moderator.yml +0 -0
  15. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/cla.yml +0 -0
  16. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/claude-code-review.yml +0 -0
  17. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/claude.yml +0 -0
  18. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/codeql.yml +0 -0
  19. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/lint.yml +0 -0
  20. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/mcp-server-docker.yml +0 -0
  21. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/release-graphiti-core.yml +0 -0
  22. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/typecheck.yml +0 -0
  23. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.github/workflows/unit_tests.yml +0 -0
  24. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/.gitignore +0 -0
  25. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/CLAUDE.md +0 -0
  26. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/CODE_OF_CONDUCT.md +0 -0
  27. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/CONTRIBUTING.md +0 -0
  28. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/Dockerfile +0 -0
  29. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/LICENSE +0 -0
  30. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/Makefile +0 -0
  31. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/SECURITY.md +0 -0
  32. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/Zep-CLA.md +0 -0
  33. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/conftest.py +0 -0
  34. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/depot.json +0 -0
  35. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/docker-compose.test.yml +0 -0
  36. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/docker-compose.yml +0 -0
  37. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/ellipsis.yaml +0 -0
  38. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/data/manybirds_products.json +0 -0
  39. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/ecommerce/runner.ipynb +0 -0
  40. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/ecommerce/runner.py +0 -0
  41. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/langgraph-agent/agent.ipynb +0 -0
  42. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/langgraph-agent/tinybirds-jess.png +0 -0
  43. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/podcast/podcast_runner.py +0 -0
  44. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/podcast/podcast_transcript.txt +0 -0
  45. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/podcast/transcript_parser.py +0 -0
  46. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/quickstart/README.md +0 -0
  47. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/quickstart/quickstart_falkordb.py +0 -0
  48. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/quickstart/quickstart_neo4j.py +0 -0
  49. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/quickstart/requirements.txt +0 -0
  50. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/wizard_of_oz/parser.py +0 -0
  51. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/wizard_of_oz/runner.py +0 -0
  52. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/examples/wizard_of_oz/woo.txt +0 -0
  53. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/__init__.py +0 -0
  54. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/cross_encoder/__init__.py +0 -0
  55. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  56. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/cross_encoder/client.py +0 -0
  57. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/cross_encoder/gemini_reranker_client.py +0 -0
  58. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  59. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/driver/__init__.py +0 -0
  60. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/driver/driver.py +0 -0
  61. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/driver/falkordb_driver.py +0 -0
  62. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/driver/neo4j_driver.py +0 -0
  63. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/driver/neptune_driver.py +0 -0
  64. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/edges.py +0 -0
  65. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/__init__.py +0 -0
  66. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/azure_openai.py +0 -0
  67. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/client.py +0 -0
  68. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/gemini.py +0 -0
  69. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/openai.py +0 -0
  70. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/embedder/voyage.py +0 -0
  71. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/errors.py +0 -0
  72. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/graph_queries.py +0 -0
  73. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/graphiti.py +0 -0
  74. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/graphiti_types.py +0 -0
  75. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/helpers.py +0 -0
  76. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/__init__.py +0 -0
  77. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/anthropic_client.py +0 -0
  78. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/azure_openai_client.py +0 -0
  79. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/client.py +0 -0
  80. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/config.py +0 -0
  81. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/errors.py +0 -0
  82. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/gemini_client.py +0 -0
  83. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/groq_client.py +0 -0
  84. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/openai_base_client.py +0 -0
  85. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/openai_client.py +0 -0
  86. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/openai_generic_client.py +0 -0
  87. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/llm_client/utils.py +0 -0
  88. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/migrations/__init__.py +0 -0
  89. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/models/__init__.py +0 -0
  90. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/models/edges/__init__.py +0 -0
  91. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/models/edges/edge_db_queries.py +0 -0
  92. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/models/nodes/__init__.py +0 -0
  93. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  94. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/nodes.py +0 -0
  95. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/__init__.py +0 -0
  96. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/dedupe_edges.py +0 -0
  97. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  98. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/eval.py +0 -0
  99. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  100. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/extract_edges.py +0 -0
  101. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/extract_nodes.py +0 -0
  102. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/invalidate_edges.py +0 -0
  103. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/lib.py +0 -0
  104. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/models.py +0 -0
  105. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/prompt_helpers.py +0 -0
  106. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/prompts/summarize_nodes.py +0 -0
  107. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/py.typed +0 -0
  108. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/__init__.py +0 -0
  109. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search_config.py +0 -0
  110. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search_config_recipes.py +0 -0
  111. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search_filters.py +0 -0
  112. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search_helpers.py +0 -0
  113. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/search/search_utils.py +0 -0
  114. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/telemetry/__init__.py +0 -0
  115. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/telemetry/telemetry.py +0 -0
  116. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/__init__.py +0 -0
  117. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/bulk_utils.py +0 -0
  118. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/datetime_utils.py +0 -0
  119. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/__init__.py +0 -0
  120. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  121. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/edge_operations.py +0 -0
  122. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/node_operations.py +0 -0
  123. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  124. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/maintenance/utils.py +0 -0
  125. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/graphiti_core/utils/ontology_utils/entity_types_utils.py +0 -0
  126. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/images/arxiv-screenshot.png +0 -0
  127. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/images/graphiti-graph-intro.gif +0 -0
  128. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/images/graphiti-intro-slides-stock-2.gif +0 -0
  129. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/images/simple_graph.svg +0 -0
  130. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/.env.example +0 -0
  131. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/.python-version +0 -0
  132. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/Dockerfile +0 -0
  133. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/README.md +0 -0
  134. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/cursor_rules.md +0 -0
  135. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/docker-compose.yml +0 -0
  136. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/graphiti_mcp_server.py +0 -0
  137. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/mcp_config_sse_example.json +0 -0
  138. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/mcp_config_stdio_example.json +0 -0
  139. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/pyproject.toml +0 -0
  140. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/mcp_server/uv.lock +0 -0
  141. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/poetry.lock +0 -0
  142. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/py.typed +0 -0
  143. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/pytest.ini +0 -0
  144. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/.env.example +0 -0
  145. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/Makefile +0 -0
  146. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/README.md +0 -0
  147. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/__init__.py +0 -0
  148. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/config.py +0 -0
  149. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/dto/__init__.py +0 -0
  150. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/dto/common.py +0 -0
  151. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/dto/ingest.py +0 -0
  152. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/dto/retrieve.py +0 -0
  153. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/main.py +0 -0
  154. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/routers/__init__.py +0 -0
  155. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/routers/ingest.py +0 -0
  156. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/routers/retrieve.py +0 -0
  157. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/graph_service/zep_graphiti.py +0 -0
  158. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/pyproject.toml +0 -0
  159. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/server/uv.lock +0 -0
  160. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/signatures/version1/cla.json +0 -0
  161. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/cross_encoder/test_bge_reranker_client.py +0 -0
  162. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/cross_encoder/test_gemini_reranker_client.py +0 -0
  163. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/driver/__init__.py +0 -0
  164. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/driver/test_falkordb_driver.py +0 -0
  165. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/embedder/embedder_fixtures.py +0 -0
  166. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/embedder/test_gemini.py +0 -0
  167. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/embedder/test_openai.py +0 -0
  168. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/embedder/test_voyage.py +0 -0
  169. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/data/longmemeval_data/README.md +0 -0
  170. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/data/longmemeval_data/longmemeval_oracle.json +0 -0
  171. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/eval_cli.py +0 -0
  172. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/eval_e2e_graph_building.py +0 -0
  173. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/pytest.ini +0 -0
  174. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/evals/utils.py +0 -0
  175. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/helpers_test.py +0 -0
  176. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/llm_client/test_anthropic_client.py +0 -0
  177. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/llm_client/test_anthropic_client_int.py +0 -0
  178. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/llm_client/test_client.py +0 -0
  179. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/llm_client/test_errors.py +0 -0
  180. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/llm_client/test_gemini_client.py +0 -0
  181. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/test_edge_int.py +0 -0
  182. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/test_entity_exclusion_int.py +0 -0
  183. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/test_graphiti_int.py +0 -0
  184. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/test_node_int.py +0 -0
  185. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/utils/maintenance/test_edge_operations.py +0 -0
  186. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/tests/utils/maintenance/test_temporal_operations_int.py +0 -0
  187. {graphiti_core-0.19.0rc1 → graphiti_core-0.19.0rc3}/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.19.0rc1
3
+ Version: 0.19.0rc3
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
@@ -487,25 +487,27 @@ The Gemini reranker uses the `gemini-2.5-flash-lite-preview-06-17` model by defa
487
487
  Graphiti supports Ollama for running local LLMs and embedding models via Ollama's OpenAI-compatible API. This is ideal for privacy-focused applications or when you want to avoid API costs.
488
488
 
489
489
  Install the models:
490
+ ```bash
490
491
  ollama pull deepseek-r1:7b # LLM
491
492
  ollama pull nomic-embed-text # embeddings
493
+ ```
492
494
 
493
495
  ```python
494
496
  from graphiti_core import Graphiti
495
497
  from graphiti_core.llm_client.config import LLMConfig
496
- from graphiti_core.llm_client.openai_client import OpenAIClient
498
+ from graphiti_core.llm_client.openai_generic_client import OpenAIGenericClient
497
499
  from graphiti_core.embedder.openai import OpenAIEmbedder, OpenAIEmbedderConfig
498
500
  from graphiti_core.cross_encoder.openai_reranker_client import OpenAIRerankerClient
499
501
 
500
502
  # Configure Ollama LLM client
501
503
  llm_config = LLMConfig(
502
- api_key="abc", # Ollama doesn't require a real API key
504
+ api_key="ollama", # Ollama doesn't require a real API key, but some placeholder is needed
503
505
  model="deepseek-r1:7b",
504
506
  small_model="deepseek-r1:7b",
505
- base_url="http://localhost:11434/v1", # Ollama provides this port
507
+ base_url="http://localhost:11434/v1", # Ollama's OpenAI-compatible endpoint
506
508
  )
507
509
 
508
- llm_client = OpenAIClient(config=llm_config)
510
+ llm_client = OpenAIGenericClient(config=llm_config)
509
511
 
510
512
  # Initialize Graphiti with Ollama clients
511
513
  graphiti = Graphiti(
@@ -515,7 +517,7 @@ graphiti = Graphiti(
515
517
  llm_client=llm_client,
516
518
  embedder=OpenAIEmbedder(
517
519
  config=OpenAIEmbedderConfig(
518
- api_key="abc",
520
+ api_key="ollama", # Placeholder API key
519
521
  embedding_model="nomic-embed-text",
520
522
  embedding_dim=768,
521
523
  base_url="http://localhost:11434/v1",
@@ -431,25 +431,27 @@ The Gemini reranker uses the `gemini-2.5-flash-lite-preview-06-17` model by defa
431
431
  Graphiti supports Ollama for running local LLMs and embedding models via Ollama's OpenAI-compatible API. This is ideal for privacy-focused applications or when you want to avoid API costs.
432
432
 
433
433
  Install the models:
434
+ ```bash
434
435
  ollama pull deepseek-r1:7b # LLM
435
436
  ollama pull nomic-embed-text # embeddings
437
+ ```
436
438
 
437
439
  ```python
438
440
  from graphiti_core import Graphiti
439
441
  from graphiti_core.llm_client.config import LLMConfig
440
- from graphiti_core.llm_client.openai_client import OpenAIClient
442
+ from graphiti_core.llm_client.openai_generic_client import OpenAIGenericClient
441
443
  from graphiti_core.embedder.openai import OpenAIEmbedder, OpenAIEmbedderConfig
442
444
  from graphiti_core.cross_encoder.openai_reranker_client import OpenAIRerankerClient
443
445
 
444
446
  # Configure Ollama LLM client
445
447
  llm_config = LLMConfig(
446
- api_key="abc", # Ollama doesn't require a real API key
448
+ api_key="ollama", # Ollama doesn't require a real API key, but some placeholder is needed
447
449
  model="deepseek-r1:7b",
448
450
  small_model="deepseek-r1:7b",
449
- base_url="http://localhost:11434/v1", # Ollama provides this port
451
+ base_url="http://localhost:11434/v1", # Ollama's OpenAI-compatible endpoint
450
452
  )
451
453
 
452
- llm_client = OpenAIClient(config=llm_config)
454
+ llm_client = OpenAIGenericClient(config=llm_config)
453
455
 
454
456
  # Initialize Graphiti with Ollama clients
455
457
  graphiti = Graphiti(
@@ -459,7 +461,7 @@ graphiti = Graphiti(
459
461
  llm_client=llm_client,
460
462
  embedder=OpenAIEmbedder(
461
463
  config=OpenAIEmbedderConfig(
462
- api_key="abc",
464
+ api_key="ollama", # Placeholder API key
463
465
  embedding_model="nomic-embed-text",
464
466
  embedding_dim=768,
465
467
  base_url="http://localhost:11434/v1",
@@ -0,0 +1,252 @@
1
+ """
2
+ Copyright 2025, Zep Software, Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ import asyncio
18
+ import json
19
+ import logging
20
+ import os
21
+ from datetime import datetime, timezone
22
+ from logging import INFO
23
+
24
+ from dotenv import load_dotenv
25
+
26
+ from graphiti_core import Graphiti
27
+ from graphiti_core.driver.neptune_driver import NeptuneDriver
28
+ from graphiti_core.nodes import EpisodeType
29
+ from graphiti_core.search.search_config_recipes import NODE_HYBRID_SEARCH_RRF
30
+
31
+ #################################################
32
+ # CONFIGURATION
33
+ #################################################
34
+ # Set up logging and environment variables for
35
+ # connecting to Neptune database
36
+ #################################################
37
+
38
+ # Configure logging
39
+ logging.basicConfig(
40
+ level=INFO,
41
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
42
+ datefmt='%Y-%m-%d %H:%M:%S',
43
+ )
44
+ logger = logging.getLogger(__name__)
45
+
46
+ load_dotenv()
47
+
48
+ # Neptune and OpenSearch connection parameters
49
+ neptune_uri = os.environ.get('NEPTUNE_HOST')
50
+ neptune_port = int(os.environ.get('NEPTUNE_PORT', 8182))
51
+ aoss_host = os.environ.get('AOSS_HOST')
52
+
53
+ if not neptune_uri:
54
+ raise ValueError('NEPTUNE_HOST must be set')
55
+
56
+
57
+ if not aoss_host:
58
+ raise ValueError('AOSS_HOST must be set')
59
+
60
+
61
+ async def main():
62
+ #################################################
63
+ # INITIALIZATION
64
+ #################################################
65
+ # Connect to Neptune and set up Graphiti indices
66
+ # This is required before using other Graphiti
67
+ # functionality
68
+ #################################################
69
+
70
+ # Initialize Graphiti with Neptune connection
71
+ driver = NeptuneDriver(host=neptune_uri, aoss_host=aoss_host, port=neptune_port)
72
+
73
+ graphiti = Graphiti(graph_driver=driver)
74
+
75
+ try:
76
+ # Initialize the graph database with graphiti's indices. This only needs to be done once.
77
+ await driver.delete_aoss_indices()
78
+ await driver._delete_all_data()
79
+ await graphiti.build_indices_and_constraints()
80
+
81
+ #################################################
82
+ # ADDING EPISODES
83
+ #################################################
84
+ # Episodes are the primary units of information
85
+ # in Graphiti. They can be text or structured JSON
86
+ # and are automatically processed to extract entities
87
+ # and relationships.
88
+ #################################################
89
+
90
+ # Example: Add Episodes
91
+ # Episodes list containing both text and JSON episodes
92
+ episodes = [
93
+ {
94
+ 'content': 'Kamala Harris is the Attorney General of California. She was previously '
95
+ 'the district attorney for San Francisco.',
96
+ 'type': EpisodeType.text,
97
+ 'description': 'podcast transcript',
98
+ },
99
+ {
100
+ 'content': 'As AG, Harris was in office from January 3, 2011 – January 3, 2017',
101
+ 'type': EpisodeType.text,
102
+ 'description': 'podcast transcript',
103
+ },
104
+ {
105
+ 'content': {
106
+ 'name': 'Gavin Newsom',
107
+ 'position': 'Governor',
108
+ 'state': 'California',
109
+ 'previous_role': 'Lieutenant Governor',
110
+ 'previous_location': 'San Francisco',
111
+ },
112
+ 'type': EpisodeType.json,
113
+ 'description': 'podcast metadata',
114
+ },
115
+ {
116
+ 'content': {
117
+ 'name': 'Gavin Newsom',
118
+ 'position': 'Governor',
119
+ 'term_start': 'January 7, 2019',
120
+ 'term_end': 'Present',
121
+ },
122
+ 'type': EpisodeType.json,
123
+ 'description': 'podcast metadata',
124
+ },
125
+ ]
126
+
127
+ # Add episodes to the graph
128
+ for i, episode in enumerate(episodes):
129
+ await graphiti.add_episode(
130
+ name=f'Freakonomics Radio {i}',
131
+ episode_body=episode['content']
132
+ if isinstance(episode['content'], str)
133
+ else json.dumps(episode['content']),
134
+ source=episode['type'],
135
+ source_description=episode['description'],
136
+ reference_time=datetime.now(timezone.utc),
137
+ )
138
+ print(f'Added episode: Freakonomics Radio {i} ({episode["type"].value})')
139
+
140
+ await graphiti.build_communities()
141
+
142
+ #################################################
143
+ # BASIC SEARCH
144
+ #################################################
145
+ # The simplest way to retrieve relationships (edges)
146
+ # from Graphiti is using the search method, which
147
+ # performs a hybrid search combining semantic
148
+ # similarity and BM25 text retrieval.
149
+ #################################################
150
+
151
+ # Perform a hybrid search combining semantic similarity and BM25 retrieval
152
+ print("\nSearching for: 'Who was the California Attorney General?'")
153
+ results = await graphiti.search('Who was the California Attorney General?')
154
+
155
+ # Print search results
156
+ print('\nSearch Results:')
157
+ for result in results:
158
+ print(f'UUID: {result.uuid}')
159
+ print(f'Fact: {result.fact}')
160
+ if hasattr(result, 'valid_at') and result.valid_at:
161
+ print(f'Valid from: {result.valid_at}')
162
+ if hasattr(result, 'invalid_at') and result.invalid_at:
163
+ print(f'Valid until: {result.invalid_at}')
164
+ print('---')
165
+
166
+ #################################################
167
+ # CENTER NODE SEARCH
168
+ #################################################
169
+ # For more contextually relevant results, you can
170
+ # use a center node to rerank search results based
171
+ # on their graph distance to a specific node
172
+ #################################################
173
+
174
+ # Use the top search result's UUID as the center node for reranking
175
+ if results and len(results) > 0:
176
+ # Get the source node UUID from the top result
177
+ center_node_uuid = results[0].source_node_uuid
178
+
179
+ print('\nReranking search results based on graph distance:')
180
+ print(f'Using center node UUID: {center_node_uuid}')
181
+
182
+ reranked_results = await graphiti.search(
183
+ 'Who was the California Attorney General?', center_node_uuid=center_node_uuid
184
+ )
185
+
186
+ # Print reranked search results
187
+ print('\nReranked Search Results:')
188
+ for result in reranked_results:
189
+ print(f'UUID: {result.uuid}')
190
+ print(f'Fact: {result.fact}')
191
+ if hasattr(result, 'valid_at') and result.valid_at:
192
+ print(f'Valid from: {result.valid_at}')
193
+ if hasattr(result, 'invalid_at') and result.invalid_at:
194
+ print(f'Valid until: {result.invalid_at}')
195
+ print('---')
196
+ else:
197
+ print('No results found in the initial search to use as center node.')
198
+
199
+ #################################################
200
+ # NODE SEARCH USING SEARCH RECIPES
201
+ #################################################
202
+ # Graphiti provides predefined search recipes
203
+ # optimized for different search scenarios.
204
+ # Here we use NODE_HYBRID_SEARCH_RRF for retrieving
205
+ # nodes directly instead of edges.
206
+ #################################################
207
+
208
+ # Example: Perform a node search using _search method with standard recipes
209
+ print(
210
+ '\nPerforming node search using _search method with standard recipe NODE_HYBRID_SEARCH_RRF:'
211
+ )
212
+
213
+ # Use a predefined search configuration recipe and modify its limit
214
+ node_search_config = NODE_HYBRID_SEARCH_RRF.model_copy(deep=True)
215
+ node_search_config.limit = 5 # Limit to 5 results
216
+
217
+ # Execute the node search
218
+ node_search_results = await graphiti._search(
219
+ query='California Governor',
220
+ config=node_search_config,
221
+ )
222
+
223
+ # Print node search results
224
+ print('\nNode Search Results:')
225
+ for node in node_search_results.nodes:
226
+ print(f'Node UUID: {node.uuid}')
227
+ print(f'Node Name: {node.name}')
228
+ node_summary = node.summary[:100] + '...' if len(node.summary) > 100 else node.summary
229
+ print(f'Content Summary: {node_summary}')
230
+ print(f'Node Labels: {", ".join(node.labels)}')
231
+ print(f'Created At: {node.created_at}')
232
+ if hasattr(node, 'attributes') and node.attributes:
233
+ print('Attributes:')
234
+ for key, value in node.attributes.items():
235
+ print(f' {key}: {value}')
236
+ print('---')
237
+
238
+ finally:
239
+ #################################################
240
+ # CLEANUP
241
+ #################################################
242
+ # Always close the connection to Neptune when
243
+ # finished to properly release resources
244
+ #################################################
245
+
246
+ # Close the connection
247
+ await graphiti.close()
248
+ print('\nConnection closed')
249
+
250
+
251
+ if __name__ == '__main__':
252
+ asyncio.run(main())
@@ -1,4 +1,8 @@
1
+ import asyncio
2
+ import os
3
+
1
4
  from graphiti_core.driver.driver import GraphDriver
5
+ from graphiti_core.driver.neo4j_driver import Neo4jDriver
2
6
  from graphiti_core.helpers import validate_group_id
3
7
  from graphiti_core.utils.maintenance.graph_data_operations import build_dynamic_indexes
4
8
 
@@ -11,21 +15,21 @@ async def neo4j_node_group_labels(driver: GraphDriver, group_id: str, batch_size
11
15
  MATCH (n:Episodic {group_id: $group_id})
12
16
  CALL {
13
17
  WITH n
14
- SET n:$group_label
18
+ SET n:$($group_label)
15
19
  } IN TRANSACTIONS OF $batch_size ROWS"""
16
20
 
17
21
  entity_query = """
18
22
  MATCH (n:Entity {group_id: $group_id})
19
23
  CALL {
20
24
  WITH n
21
- SET n:$group_label
25
+ SET n:$($group_label)
22
26
  } IN TRANSACTIONS OF $batch_size ROWS"""
23
27
 
24
28
  community_query = """
25
29
  MATCH (n:Community {group_id: $group_id})
26
30
  CALL {
27
31
  WITH n
28
- SET n:$group_label
32
+ SET n:$($group_label)
29
33
  } IN TRANSACTIONS OF $batch_size ROWS"""
30
34
 
31
35
  async with driver.session() as session:
@@ -51,3 +55,31 @@ async def neo4j_node_group_labels(driver: GraphDriver, group_id: str, batch_size
51
55
  group_label='Community_' + group_id.replace('-', ''),
52
56
  batch_size=batch_size,
53
57
  )
58
+
59
+
60
+ async def neo4j_node_label_migration(driver: GraphDriver):
61
+ query = """MATCH (n:Episodic)
62
+ RETURN DISTINCT n.group_id AS group_id"""
63
+
64
+ results, _, _ = await driver.execute_query(query)
65
+ for result in results:
66
+ group_id = result['group_id']
67
+ await neo4j_node_group_labels(driver, group_id)
68
+
69
+
70
+ async def main():
71
+ neo4j_uri = os.environ.get('NEO4J_URI') or 'bolt://localhost:7687'
72
+ neo4j_user = os.environ.get('NEO4J_USER') or 'neo4j'
73
+ neo4j_password = os.environ.get('NEO4J_PASSWORD') or 'password'
74
+
75
+ driver = Neo4jDriver(
76
+ uri=neo4j_uri,
77
+ user=neo4j_user,
78
+ password=neo4j_password,
79
+ )
80
+ await neo4j_node_label_migration(driver)
81
+ await driver.close()
82
+
83
+
84
+ if __name__ == '__main__':
85
+ asyncio.run(main())
@@ -21,6 +21,7 @@ from time import time
21
21
  from graphiti_core.cross_encoder.client import CrossEncoderClient
22
22
  from graphiti_core.driver.driver import GraphDriver
23
23
  from graphiti_core.edges import EntityEdge
24
+ from graphiti_core.embedder.client import EMBEDDING_DIM
24
25
  from graphiti_core.errors import SearchRerankerError
25
26
  from graphiti_core.graphiti_types import GraphitiClients
26
27
  from graphiti_core.helpers import semaphore_gather
@@ -29,6 +30,7 @@ from graphiti_core.search.search_config import (
29
30
  DEFAULT_SEARCH_LIMIT,
30
31
  CommunityReranker,
31
32
  CommunitySearchConfig,
33
+ CommunitySearchMethod,
32
34
  EdgeReranker,
33
35
  EdgeSearchConfig,
34
36
  EdgeSearchMethod,
@@ -81,11 +83,29 @@ async def search(
81
83
 
82
84
  if query.strip() == '':
83
85
  return SearchResults()
84
- query_vector = (
85
- query_vector
86
- if query_vector is not None
87
- else await embedder.create(input_data=[query.replace('\n', ' ')])
88
- )
86
+
87
+ if (
88
+ config.edge_config
89
+ and EdgeSearchMethod.cosine_similarity in config.edge_config.search_methods
90
+ or config.edge_config
91
+ and EdgeReranker.mmr == config.edge_config.reranker
92
+ or config.node_config
93
+ and NodeSearchMethod.cosine_similarity in config.node_config.search_methods
94
+ or config.node_config
95
+ and NodeReranker.mmr == config.node_config.reranker
96
+ or (
97
+ config.community_config
98
+ and CommunitySearchMethod.cosine_similarity in config.community_config.search_methods
99
+ )
100
+ or (config.community_config and CommunityReranker.mmr == config.community_config.reranker)
101
+ ):
102
+ search_vector = (
103
+ query_vector
104
+ if query_vector is not None
105
+ else await embedder.create(input_data=[query.replace('\n', ' ')])
106
+ )
107
+ else:
108
+ search_vector = [0.0] * EMBEDDING_DIM
89
109
 
90
110
  # if group_ids is empty, set it to None
91
111
  group_ids = group_ids if group_ids and group_ids != [''] else None
@@ -99,7 +119,7 @@ async def search(
99
119
  driver,
100
120
  cross_encoder,
101
121
  query,
102
- query_vector,
122
+ search_vector,
103
123
  group_ids,
104
124
  config.edge_config,
105
125
  search_filter,
@@ -112,7 +132,7 @@ async def search(
112
132
  driver,
113
133
  cross_encoder,
114
134
  query,
115
- query_vector,
135
+ search_vector,
116
136
  group_ids,
117
137
  config.node_config,
118
138
  search_filter,
@@ -125,7 +145,7 @@ async def search(
125
145
  driver,
126
146
  cross_encoder,
127
147
  query,
128
- query_vector,
148
+ search_vector,
129
149
  group_ids,
130
150
  config.episode_config,
131
151
  search_filter,
@@ -136,7 +156,7 @@ async def search(
136
156
  driver,
137
157
  cross_encoder,
138
158
  query,
139
- query_vector,
159
+ search_vector,
140
160
  group_ids,
141
161
  config.community_config,
142
162
  config.limit,
@@ -35,7 +35,8 @@ logger = logging.getLogger(__name__)
35
35
 
36
36
  async def build_indices_and_constraints(driver: GraphDriver, delete_existing: bool = False):
37
37
  if driver.provider == GraphProvider.NEPTUNE:
38
- return # Neptune does not need indexes built
38
+ await driver.create_aoss_indices() # pyright: ignore[reportAttributeAccessIssue]
39
+ return
39
40
  if delete_existing:
40
41
  records, _, _ = await driver.execute_query(
41
42
  """
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "graphiti-core"
3
3
  description = "A temporal graph building library"
4
- version = "0.19.0pre1"
4
+ version = "0.19.0pre3"
5
5
  authors = [
6
6
  { name = "Paul Paliychuk", email = "paul@getzep.com" },
7
7
  { name = "Preston Rasmussen", email = "preston@getzep.com" },
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 3
2
+ revision = 2
3
3
  requires-python = ">=3.10, <4"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.14'",
@@ -783,7 +783,7 @@ wheels = [
783
783
 
784
784
  [[package]]
785
785
  name = "graphiti-core"
786
- version = "0.19.0rc1"
786
+ version = "0.19.0rc3"
787
787
  source = { editable = "." }
788
788
  dependencies = [
789
789
  { name = "diskcache" },