graphiti-core 0.17.2__tar.gz → 0.17.3__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 (183) hide show
  1. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/PKG-INFO +1 -1
  2. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/gemini.py +25 -19
  3. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/client.py +5 -5
  4. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/gemini_client.py +13 -7
  5. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/models/edges/edge_db_queries.py +3 -3
  6. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/pyproject.toml +1 -1
  7. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/embedder/test_gemini.py +3 -3
  8. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/llm_client/test_gemini_client.py +3 -6
  9. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/uv.lock +1 -1
  10. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.env.example +0 -0
  11. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/dependabot.yml +0 -0
  13. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/pull_request_template.md +0 -0
  14. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/secret_scanning.yml +0 -0
  15. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/cla.yml +0 -0
  16. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/claude-code-review.yml +0 -0
  17. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/claude.yml +0 -0
  18. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/codeql.yml +0 -0
  19. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/lint.yml +0 -0
  20. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/mcp-server-docker.yml +0 -0
  21. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/release-graphiti-core.yml +0 -0
  22. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/typecheck.yml +0 -0
  23. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.github/workflows/unit_tests.yml +0 -0
  24. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/.gitignore +0 -0
  25. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/CLAUDE.md +0 -0
  26. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/CODE_OF_CONDUCT.md +0 -0
  27. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/CONTRIBUTING.md +0 -0
  28. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/Dockerfile +0 -0
  29. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/LICENSE +0 -0
  30. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/Makefile +0 -0
  31. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/README.md +0 -0
  32. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/SECURITY.md +0 -0
  33. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/Zep-CLA.md +0 -0
  34. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/conftest.py +0 -0
  35. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/depot.json +0 -0
  36. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/docker-compose.test.yml +0 -0
  37. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/docker-compose.yml +0 -0
  38. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/ellipsis.yaml +0 -0
  39. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/data/manybirds_products.json +0 -0
  40. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/ecommerce/runner.ipynb +0 -0
  41. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/ecommerce/runner.py +0 -0
  42. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/langgraph-agent/agent.ipynb +0 -0
  43. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/langgraph-agent/tinybirds-jess.png +0 -0
  44. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/podcast/podcast_runner.py +0 -0
  45. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/podcast/podcast_transcript.txt +0 -0
  46. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/podcast/transcript_parser.py +0 -0
  47. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/quickstart/README.md +0 -0
  48. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/quickstart/quickstart_falkordb.py +0 -0
  49. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/quickstart/quickstart_neo4j.py +0 -0
  50. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/quickstart/requirements.txt +0 -0
  51. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/wizard_of_oz/parser.py +0 -0
  52. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/wizard_of_oz/runner.py +0 -0
  53. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/examples/wizard_of_oz/woo.txt +0 -0
  54. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/__init__.py +0 -0
  55. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/cross_encoder/__init__.py +0 -0
  56. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  57. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/cross_encoder/client.py +0 -0
  58. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/cross_encoder/gemini_reranker_client.py +0 -0
  59. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  60. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/driver/__init__.py +0 -0
  61. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/driver/driver.py +0 -0
  62. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/driver/falkordb_driver.py +0 -0
  63. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/driver/neo4j_driver.py +0 -0
  64. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/edges.py +0 -0
  65. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/__init__.py +0 -0
  66. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/azure_openai.py +0 -0
  67. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/client.py +0 -0
  68. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/openai.py +0 -0
  69. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/embedder/voyage.py +0 -0
  70. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/errors.py +0 -0
  71. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/graph_queries.py +0 -0
  72. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/graphiti.py +0 -0
  73. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/graphiti_types.py +0 -0
  74. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/helpers.py +0 -0
  75. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/__init__.py +0 -0
  76. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/anthropic_client.py +0 -0
  77. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/azure_openai_client.py +0 -0
  78. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/config.py +0 -0
  79. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/errors.py +0 -0
  80. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/groq_client.py +0 -0
  81. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/openai_base_client.py +0 -0
  82. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/openai_client.py +0 -0
  83. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/openai_generic_client.py +0 -0
  84. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/llm_client/utils.py +0 -0
  85. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/models/__init__.py +0 -0
  86. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/models/edges/__init__.py +0 -0
  87. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/models/nodes/__init__.py +0 -0
  88. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  89. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/nodes.py +0 -0
  90. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/__init__.py +0 -0
  91. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/dedupe_edges.py +0 -0
  92. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  93. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/eval.py +0 -0
  94. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  95. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/extract_edges.py +0 -0
  96. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/extract_nodes.py +0 -0
  97. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/invalidate_edges.py +0 -0
  98. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/lib.py +0 -0
  99. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/models.py +0 -0
  100. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/prompt_helpers.py +0 -0
  101. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/prompts/summarize_nodes.py +0 -0
  102. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/py.typed +0 -0
  103. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/__init__.py +0 -0
  104. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search.py +0 -0
  105. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search_config.py +0 -0
  106. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search_config_recipes.py +0 -0
  107. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search_filters.py +0 -0
  108. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search_helpers.py +0 -0
  109. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/search/search_utils.py +0 -0
  110. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/telemetry/__init__.py +0 -0
  111. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/telemetry/telemetry.py +0 -0
  112. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/__init__.py +0 -0
  113. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/bulk_utils.py +0 -0
  114. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/datetime_utils.py +0 -0
  115. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/__init__.py +0 -0
  116. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  117. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/edge_operations.py +0 -0
  118. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/graph_data_operations.py +0 -0
  119. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/node_operations.py +0 -0
  120. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  121. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/maintenance/utils.py +0 -0
  122. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/graphiti_core/utils/ontology_utils/entity_types_utils.py +0 -0
  123. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/images/arxiv-screenshot.png +0 -0
  124. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/images/graphiti-graph-intro.gif +0 -0
  125. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/images/graphiti-intro-slides-stock-2.gif +0 -0
  126. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/images/simple_graph.svg +0 -0
  127. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/.env.example +0 -0
  128. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/.python-version +0 -0
  129. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/Dockerfile +0 -0
  130. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/README.md +0 -0
  131. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/cursor_rules.md +0 -0
  132. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/docker-compose.yml +0 -0
  133. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/graphiti_mcp_server.py +0 -0
  134. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/mcp_config_sse_example.json +0 -0
  135. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/mcp_config_stdio_example.json +0 -0
  136. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/pyproject.toml +0 -0
  137. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/mcp_server/uv.lock +0 -0
  138. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/poetry.lock +0 -0
  139. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/py.typed +0 -0
  140. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/pytest.ini +0 -0
  141. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/.env.example +0 -0
  142. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/Makefile +0 -0
  143. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/README.md +0 -0
  144. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/__init__.py +0 -0
  145. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/config.py +0 -0
  146. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/dto/__init__.py +0 -0
  147. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/dto/common.py +0 -0
  148. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/dto/ingest.py +0 -0
  149. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/dto/retrieve.py +0 -0
  150. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/main.py +0 -0
  151. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/routers/__init__.py +0 -0
  152. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/routers/ingest.py +0 -0
  153. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/routers/retrieve.py +0 -0
  154. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/graph_service/zep_graphiti.py +0 -0
  155. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/pyproject.toml +0 -0
  156. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/server/uv.lock +0 -0
  157. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/signatures/version1/cla.json +0 -0
  158. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/cross_encoder/test_bge_reranker_client.py +0 -0
  159. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/cross_encoder/test_gemini_reranker_client.py +0 -0
  160. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/driver/__init__.py +0 -0
  161. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/driver/test_falkordb_driver.py +0 -0
  162. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/embedder/embedder_fixtures.py +0 -0
  163. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/embedder/test_openai.py +0 -0
  164. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/embedder/test_voyage.py +0 -0
  165. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/data/longmemeval_data/README.md +0 -0
  166. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/data/longmemeval_data/longmemeval_oracle.json +0 -0
  167. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/eval_cli.py +0 -0
  168. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/eval_e2e_graph_building.py +0 -0
  169. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/pytest.ini +0 -0
  170. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/evals/utils.py +0 -0
  171. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/helpers_test.py +0 -0
  172. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/llm_client/test_anthropic_client.py +0 -0
  173. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/llm_client/test_anthropic_client_int.py +0 -0
  174. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/llm_client/test_client.py +0 -0
  175. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/llm_client/test_errors.py +0 -0
  176. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/test_entity_exclusion_int.py +0 -0
  177. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/test_graphiti_falkordb_int.py +0 -0
  178. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/test_graphiti_int.py +0 -0
  179. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/test_node_falkordb_int.py +0 -0
  180. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/test_node_int.py +0 -0
  181. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/utils/maintenance/test_edge_operations.py +0 -0
  182. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/tests/utils/maintenance/test_temporal_operations_int.py +0 -0
  183. {graphiti_core-0.17.2 → graphiti_core-0.17.3}/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.17.2
3
+ Version: 0.17.3
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
@@ -37,7 +37,7 @@ from .client import EmbedderClient, EmbedderConfig
37
37
 
38
38
  logger = logging.getLogger(__name__)
39
39
 
40
- DEFAULT_EMBEDDING_MODEL = 'text-embedding-001' # gemini-embedding-001 or text-embedding-005
40
+ DEFAULT_EMBEDDING_MODEL = 'text-embedding-001' # gemini-embedding-001 or text-embedding-005
41
41
 
42
42
  DEFAULT_BATCH_SIZE = 100
43
43
 
@@ -78,7 +78,7 @@ class GeminiEmbedder(EmbedderClient):
78
78
 
79
79
  if batch_size is None and self.config.embedding_model == 'gemini-embedding-001':
80
80
  # Gemini API has a limit on the number of instances per request
81
- #https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/text-embeddings-api
81
+ # https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/text-embeddings-api
82
82
  self.batch_size = 1
83
83
  elif batch_size is None:
84
84
  self.batch_size = DEFAULT_BATCH_SIZE
@@ -113,32 +113,34 @@ class GeminiEmbedder(EmbedderClient):
113
113
  async def create_batch(self, input_data_list: list[str]) -> list[list[float]]:
114
114
  """
115
115
  Create embeddings for a batch of input data using Google's Gemini embedding model.
116
-
116
+
117
117
  This method handles batching to respect the Gemini API's limits on the number
118
118
  of instances that can be processed in a single request.
119
-
119
+
120
120
  Args:
121
121
  input_data_list: A list of strings to create embeddings for.
122
-
122
+
123
123
  Returns:
124
124
  A list of embedding vectors (each vector is a list of floats).
125
125
  """
126
126
  if not input_data_list:
127
127
  return []
128
-
128
+
129
129
  batch_size = self.batch_size
130
130
  all_embeddings = []
131
-
131
+
132
132
  # Process inputs in batches
133
133
  for i in range(0, len(input_data_list), batch_size):
134
- batch = input_data_list[i:i + batch_size]
135
-
134
+ batch = input_data_list[i : i + batch_size]
135
+
136
136
  try:
137
137
  # Generate embeddings for this batch
138
138
  result = await self.client.aio.models.embed_content(
139
139
  model=self.config.embedding_model or DEFAULT_EMBEDDING_MODEL,
140
140
  contents=batch, # type: ignore[arg-type] # mypy fails on broad union type
141
- config=types.EmbedContentConfig(output_dimensionality=self.config.embedding_dim),
141
+ config=types.EmbedContentConfig(
142
+ output_dimensionality=self.config.embedding_dim
143
+ ),
142
144
  )
143
145
 
144
146
  if not result.embeddings or len(result.embeddings) == 0:
@@ -149,29 +151,33 @@ class GeminiEmbedder(EmbedderClient):
149
151
  if not embedding.values:
150
152
  raise ValueError('Empty embedding values returned')
151
153
  all_embeddings.append(embedding.values)
152
-
154
+
153
155
  except Exception as e:
154
156
  # If batch processing fails, fall back to individual processing
155
- logger.warning(f"Batch embedding failed for batch {i//batch_size + 1}, falling back to individual processing: {e}")
156
-
157
+ logger.warning(
158
+ f'Batch embedding failed for batch {i // batch_size + 1}, falling back to individual processing: {e}'
159
+ )
160
+
157
161
  for item in batch:
158
162
  try:
159
163
  # Process each item individually
160
164
  result = await self.client.aio.models.embed_content(
161
165
  model=self.config.embedding_model or DEFAULT_EMBEDDING_MODEL,
162
166
  contents=[item], # type: ignore[arg-type] # mypy fails on broad union type
163
- config=types.EmbedContentConfig(output_dimensionality=self.config.embedding_dim),
167
+ config=types.EmbedContentConfig(
168
+ output_dimensionality=self.config.embedding_dim
169
+ ),
164
170
  )
165
-
171
+
166
172
  if not result.embeddings or len(result.embeddings) == 0:
167
173
  raise ValueError('No embeddings returned from Gemini API')
168
174
  if not result.embeddings[0].values:
169
175
  raise ValueError('Empty embedding values returned')
170
-
176
+
171
177
  all_embeddings.append(result.embeddings[0].values)
172
-
178
+
173
179
  except Exception as individual_error:
174
- logger.error(f"Failed to embed individual item: {individual_error}")
180
+ logger.error(f'Failed to embed individual item: {individual_error}')
175
181
  raise individual_error
176
-
182
+
177
183
  return all_embeddings
@@ -172,13 +172,13 @@ class LLMClient(ABC):
172
172
  """
173
173
  Log the full input messages, the raw output (if any), and the exception for debugging failed generations.
174
174
  """
175
- log = ""
176
- log += f"Input messages: {json.dumps([m.model_dump() for m in messages], indent=2)}\n"
175
+ log = ''
176
+ log += f'Input messages: {json.dumps([m.model_dump() for m in messages], indent=2)}\n'
177
177
  if output is not None:
178
178
  if len(output) > 4000:
179
- log += f"Raw output: {output[:2000]}... (truncated) ...{output[-2000:]}\n"
179
+ log += f'Raw output: {output[:2000]}... (truncated) ...{output[-2000:]}\n'
180
180
  else:
181
- log += f"Raw output: {output}\n"
181
+ log += f'Raw output: {output}\n'
182
182
  else:
183
- log += "No raw output available"
183
+ log += 'No raw output available'
184
184
  return log
@@ -219,14 +219,14 @@ class GeminiClient(LLMClient):
219
219
  array_match = re.search(r'\]\s*$', raw_output)
220
220
  if array_match:
221
221
  try:
222
- return json.loads(raw_output[:array_match.end()])
222
+ return json.loads(raw_output[: array_match.end()])
223
223
  except Exception:
224
224
  pass
225
225
  # Try to salvage a JSON object
226
226
  obj_match = re.search(r'\}\s*$', raw_output)
227
227
  if obj_match:
228
228
  try:
229
- return json.loads(raw_output[:obj_match.end()])
229
+ return json.loads(raw_output[: obj_match.end()])
230
230
  except Exception:
231
231
  pass
232
232
  return None
@@ -323,12 +323,14 @@ class GeminiClient(LLMClient):
323
323
  return validated_model.model_dump()
324
324
  except Exception as e:
325
325
  if raw_output:
326
- logger.error("🦀 LLM generation failed parsing as JSON, will try to salvage.")
326
+ logger.error(
327
+ '🦀 LLM generation failed parsing as JSON, will try to salvage.'
328
+ )
327
329
  logger.error(self._get_failed_generation_log(gemini_messages, raw_output))
328
330
  # Try to salvage
329
331
  salvaged = self.salvage_json(raw_output)
330
332
  if salvaged is not None:
331
- logger.warning("Salvaged partial JSON from truncated/malformed output.")
333
+ logger.warning('Salvaged partial JSON from truncated/malformed output.')
332
334
  return salvaged
333
335
  raise Exception(f'Failed to parse structured response: {e}') from e
334
336
 
@@ -384,7 +386,11 @@ class GeminiClient(LLMClient):
384
386
  max_tokens=max_tokens,
385
387
  model_size=model_size,
386
388
  )
387
- last_output = response.get('content') if isinstance(response, dict) and 'content' in response else None
389
+ last_output = (
390
+ response.get('content')
391
+ if isinstance(response, dict) and 'content' in response
392
+ else None
393
+ )
388
394
  return response
389
395
  except RateLimitError as e:
390
396
  # Rate limit errors should not trigger retries (fail fast)
@@ -416,7 +422,7 @@ class GeminiClient(LLMClient):
416
422
  )
417
423
 
418
424
  # If we exit the loop without returning, all retries are exhausted
419
- logger.error("🦀 LLM generation failed and retries are exhausted.")
425
+ logger.error('🦀 LLM generation failed and retries are exhausted.')
420
426
  logger.error(self._get_failed_generation_log(messages, last_output))
421
427
  logger.error(f'Max retries ({self.MAX_RETRIES}) exceeded. Last error: {last_error}')
422
- raise last_error or Exception("Max retries exceeded")
428
+ raise last_error or Exception('Max retries exceeded')
@@ -31,9 +31,9 @@ EPISODIC_EDGE_SAVE_BULK = """
31
31
  """
32
32
 
33
33
  ENTITY_EDGE_SAVE = """
34
- MATCH (source:Entity {uuid: $source_uuid})
35
- MATCH (target:Entity {uuid: $target_uuid})
36
- MERGE (source)-[r:RELATES_TO {uuid: $uuid}]->(target)
34
+ MATCH (source:Entity {uuid: $edge_data.source_uuid})
35
+ MATCH (target:Entity {uuid: $edge_data.target_uuid})
36
+ MERGE (source)-[r:RELATES_TO {uuid: $edge_data.uuid}]->(target)
37
37
  SET r = $edge_data
38
38
  WITH r CALL db.create.setRelationshipVectorProperty(r, "fact_embedding", $edge_data.fact_embedding)
39
39
  RETURN r.uuid AS uuid"""
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "graphiti-core"
3
3
  description = "A temporal graph building library"
4
- version = "0.17.2"
4
+ version = "0.17.3"
5
5
  authors = [
6
6
  { "name" = "Paul Paliychuk", "email" = "paul@getzep.com" },
7
7
  { "name" = "Preston Rasmussen", "email" = "preston@getzep.com" },
@@ -345,9 +345,9 @@ class TestGeminiEmbedderCreateBatch:
345
345
 
346
346
  # Set side_effect for embed_content to control return values for each call
347
347
  mock_gemini_client.aio.models.embed_content.side_effect = [
348
- mock_batch_response, # First call for the batch
349
- mock_individual_response_1, # Second call for individual item 1
350
- mock_individual_response_2 # Third call for individual item 2
348
+ mock_batch_response, # First call for the batch
349
+ mock_individual_response_1, # Second call for individual item 1
350
+ mock_individual_response_2, # Third call for individual item 2
351
351
  ]
352
352
 
353
353
  input_batch = ['Input 1', 'Input 2']
@@ -273,7 +273,7 @@ class TestGeminiClientGenerateResponse:
273
273
  messages = [Message(role='user', content='Test message')]
274
274
  with pytest.raises(Exception): # noqa: B017
275
275
  await gemini_client.generate_response(messages, response_model=ResponseModel)
276
-
276
+
277
277
  # Should have called generate_content MAX_RETRIES times (2 attempts total)
278
278
  assert mock_gemini_client.aio.models.generate_content.call_count == GeminiClient.MAX_RETRIES
279
279
 
@@ -344,10 +344,7 @@ class TestGeminiClientGenerateResponse:
344
344
  await gemini_client.generate_response(messages, response_model=ResponseModel)
345
345
 
346
346
  # Should have called generate_content MAX_RETRIES times (2 attempts total)
347
- assert (
348
- mock_gemini_client.aio.models.generate_content.call_count
349
- == GeminiClient.MAX_RETRIES
350
- )
347
+ assert mock_gemini_client.aio.models.generate_content.call_count == GeminiClient.MAX_RETRIES
351
348
 
352
349
  @pytest.mark.asyncio
353
350
  async def test_empty_response_handling(self, gemini_client, mock_gemini_client):
@@ -363,7 +360,7 @@ class TestGeminiClientGenerateResponse:
363
360
  messages = [Message(role='user', content='Test message')]
364
361
  with pytest.raises(Exception): # noqa: B017
365
362
  await gemini_client.generate_response(messages, response_model=ResponseModel)
366
-
363
+
367
364
  # Should have exhausted retries due to empty response (2 attempts total)
368
365
  assert mock_gemini_client.aio.models.generate_content.call_count == GeminiClient.MAX_RETRIES
369
366
 
@@ -746,7 +746,7 @@ wheels = [
746
746
 
747
747
  [[package]]
748
748
  name = "graphiti-core"
749
- version = "0.17.2"
749
+ version = "0.17.3"
750
750
  source = { editable = "." }
751
751
  dependencies = [
752
752
  { name = "diskcache" },
File without changes
File without changes
File without changes
File without changes
File without changes