graphiti-core 0.3.17__tar.gz → 0.3.18__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 (57) hide show
  1. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/PKG-INFO +2 -2
  2. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/embedder/openai.py +4 -2
  3. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/embedder/voyage.py +13 -2
  4. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/search/search.py +15 -5
  5. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/search/search_utils.py +6 -1
  6. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/pyproject.toml +3 -3
  7. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/LICENSE +0 -0
  8. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/README.md +0 -0
  9. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/__init__.py +0 -0
  10. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/cross_encoder/__init__.py +0 -0
  11. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  12. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/cross_encoder/client.py +0 -0
  13. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  14. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/edges.py +0 -0
  15. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/embedder/__init__.py +0 -0
  16. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/embedder/client.py +0 -0
  17. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/errors.py +0 -0
  18. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/graphiti.py +0 -0
  19. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/helpers.py +0 -0
  20. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/__init__.py +0 -0
  21. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/anthropic_client.py +0 -0
  22. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/client.py +0 -0
  23. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/config.py +0 -0
  24. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/errors.py +0 -0
  25. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/groq_client.py +0 -0
  26. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/openai_client.py +0 -0
  27. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/llm_client/utils.py +0 -0
  28. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/models/__init__.py +0 -0
  29. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/models/edges/__init__.py +0 -0
  30. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/models/edges/edge_db_queries.py +0 -0
  31. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/models/nodes/__init__.py +0 -0
  32. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  33. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/nodes.py +0 -0
  34. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/__init__.py +0 -0
  35. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/dedupe_edges.py +0 -0
  36. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  37. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/eval.py +0 -0
  38. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  39. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/extract_edges.py +0 -0
  40. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/extract_nodes.py +0 -0
  41. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/invalidate_edges.py +0 -0
  42. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/lib.py +0 -0
  43. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/models.py +0 -0
  44. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/prompts/summarize_nodes.py +0 -0
  45. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/py.typed +0 -0
  46. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/search/__init__.py +0 -0
  47. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/search/search_config.py +0 -0
  48. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/search/search_config_recipes.py +0 -0
  49. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/__init__.py +0 -0
  50. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/bulk_utils.py +0 -0
  51. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/__init__.py +0 -0
  52. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  53. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/edge_operations.py +0 -0
  54. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/graph_data_operations.py +0 -0
  55. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/node_operations.py +0 -0
  56. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  57. {graphiti_core-0.3.17 → graphiti_core-0.3.18}/graphiti_core/utils/maintenance/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: graphiti-core
3
- Version: 0.3.17
3
+ Version: 0.3.18
4
4
  Summary: A temporal graph building library
5
5
  License: Apache-2.0
6
6
  Author: Paul Paliychuk
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.12
14
14
  Requires-Dist: diskcache (>=5.6.3,<6.0.0)
15
15
  Requires-Dist: neo4j (>=5.23.0,<6.0.0)
16
16
  Requires-Dist: numpy (>=1.0.0)
17
- Requires-Dist: openai (>=1.50.2,<2.0.0)
17
+ Requires-Dist: openai (>=1.52.2,<2.0.0)
18
18
  Requires-Dist: pydantic (>=2.8.2,<3.0.0)
19
19
  Requires-Dist: tenacity (<9.0.0)
20
20
  Description-Content-Type: text/markdown
@@ -42,7 +42,9 @@ class OpenAIEmbedder(EmbedderClient):
42
42
  self.client = AsyncOpenAI(api_key=config.api_key, base_url=config.base_url)
43
43
 
44
44
  async def create(
45
- self, input: str | List[str] | Iterable[int] | Iterable[Iterable[int]]
45
+ self, input_data: str | List[str] | Iterable[int] | Iterable[Iterable[int]]
46
46
  ) -> list[float]:
47
- result = await self.client.embeddings.create(input=input, model=self.config.embedding_model)
47
+ result = await self.client.embeddings.create(
48
+ input=input_data, model=self.config.embedding_model
49
+ )
48
50
  return result.data[0].embedding[: self.config.embedding_dim]
@@ -41,7 +41,18 @@ class VoyageAIEmbedder(EmbedderClient):
41
41
  self.client = voyageai.AsyncClient(api_key=config.api_key)
42
42
 
43
43
  async def create(
44
- self, input: str | List[str] | Iterable[int] | Iterable[Iterable[int]]
44
+ self, input_data: str | List[str] | Iterable[int] | Iterable[Iterable[int]]
45
45
  ) -> list[float]:
46
- result = await self.client.embed(input, model=self.config.embedding_model)
46
+ if isinstance(input_data, str):
47
+ input_list = [input_data]
48
+ elif isinstance(input_data, List):
49
+ input_list = [str(i) for i in input_data if i]
50
+ else:
51
+ input_list = [str(i) for i in input_data if i is not None]
52
+
53
+ input_list = [i for i in input_list if i]
54
+ if len(input_list) == 0:
55
+ return []
56
+
57
+ result = await self.client.embed(input_list, model=self.config.embedding_model)
47
58
  return result.embeddings[0][: self.config.embedding_dim]
@@ -45,6 +45,7 @@ from graphiti_core.search.search_utils import (
45
45
  edge_similarity_search,
46
46
  episode_mentions_reranker,
47
47
  maximal_marginal_relevance,
48
+ node_bfs_search,
48
49
  node_distance_reranker,
49
50
  node_fulltext_search,
50
51
  node_similarity_search,
@@ -138,7 +139,7 @@ async def edge_search(
138
139
  edge_similarity_search(
139
140
  driver, query_vector, None, None, group_ids, 2 * limit, config.sim_min_score
140
141
  ),
141
- edge_bfs_search(driver, bfs_origin_node_uuids, config.bfs_max_depth),
142
+ edge_bfs_search(driver, bfs_origin_node_uuids, config.bfs_max_depth, 2 * limit),
142
143
  ]
143
144
  )
144
145
  )
@@ -160,7 +161,12 @@ async def edge_search(
160
161
  query_vector, search_result_uuids_and_vectors, config.mmr_lambda
161
162
  )
162
163
  elif config.reranker == EdgeReranker.cross_encoder:
163
- fact_to_uuid_map = {edge.fact: edge.uuid for result in search_results for edge in result}
164
+ search_result_uuids = [[edge.uuid for edge in result] for result in search_results]
165
+
166
+ rrf_result_uuids = rrf(search_result_uuids)
167
+ rrf_edges = [edge_uuid_map[uuid] for uuid in rrf_result_uuids][:limit]
168
+
169
+ fact_to_uuid_map = {edge.fact: edge.uuid for edge in rrf_edges}
164
170
  reranked_facts = await cross_encoder.rank(query, list(fact_to_uuid_map.keys()))
165
171
  reranked_uuids = [fact_to_uuid_map[fact] for fact, _ in reranked_facts]
166
172
  elif config.reranker == EdgeReranker.node_distance:
@@ -212,6 +218,7 @@ async def node_search(
212
218
  node_similarity_search(
213
219
  driver, query_vector, group_ids, 2 * limit, config.sim_min_score
214
220
  ),
221
+ node_bfs_search(driver, bfs_origin_node_uuids, config.bfs_max_depth, 2 * limit),
215
222
  ]
216
223
  )
217
224
  )
@@ -232,9 +239,12 @@ async def node_search(
232
239
  query_vector, search_result_uuids_and_vectors, config.mmr_lambda
233
240
  )
234
241
  elif config.reranker == NodeReranker.cross_encoder:
235
- summary_to_uuid_map = {
236
- node.summary: node.uuid for result in search_results for node in result
237
- }
242
+ # use rrf as a preliminary reranker
243
+ rrf_result_uuids = rrf(search_result_uuids)
244
+ rrf_results = [node_uuid_map[uuid] for uuid in rrf_result_uuids][:limit]
245
+
246
+ summary_to_uuid_map = {node.summary: node.uuid for node in rrf_results}
247
+
238
248
  reranked_summaries = await cross_encoder.rank(query, list(summary_to_uuid_map.keys()))
239
249
  reranked_uuids = [summary_to_uuid_map[fact] for fact, _ in reranked_summaries]
240
250
  elif config.reranker == NodeReranker.episode_mentions:
@@ -233,6 +233,7 @@ async def edge_bfs_search(
233
233
  driver: AsyncDriver,
234
234
  bfs_origin_node_uuids: list[str] | None,
235
235
  bfs_max_depth: int,
236
+ limit: int,
236
237
  ) -> list[EntityEdge]:
237
238
  # vector similarity search over embedded facts
238
239
  if bfs_origin_node_uuids is None:
@@ -256,12 +257,14 @@ async def edge_bfs_search(
256
257
  r.expired_at AS expired_at,
257
258
  r.valid_at AS valid_at,
258
259
  r.invalid_at AS invalid_at
260
+ LIMIT $limit
259
261
  """)
260
262
 
261
263
  records, _, _ = await driver.execute_query(
262
264
  query,
263
265
  bfs_origin_node_uuids=bfs_origin_node_uuids,
264
266
  depth=bfs_max_depth,
267
+ limit=limit,
265
268
  database_=DEFAULT_DATABASE,
266
269
  routing_='r',
267
270
  )
@@ -348,6 +351,7 @@ async def node_bfs_search(
348
351
  driver: AsyncDriver,
349
352
  bfs_origin_node_uuids: list[str] | None,
350
353
  bfs_max_depth: int,
354
+ limit: int,
351
355
  ) -> list[EntityNode]:
352
356
  # vector similarity search over entity names
353
357
  if bfs_origin_node_uuids is None:
@@ -368,6 +372,7 @@ async def node_bfs_search(
368
372
  """,
369
373
  bfs_origin_node_uuids=bfs_origin_node_uuids,
370
374
  depth=bfs_max_depth,
375
+ limit=limit,
371
376
  database_=DEFAULT_DATABASE,
372
377
  routing_='r',
373
378
  )
@@ -690,4 +695,4 @@ def maximal_marginal_relevance(
690
695
 
691
696
  candidates_with_mmr.sort(reverse=True, key=lambda c: c[1])
692
697
 
693
- return [candidate[0] for candidate in candidates_with_mmr]
698
+ return list(set([candidate[0] for candidate in candidates_with_mmr]))
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "graphiti-core"
3
- version = "0.3.17"
3
+ version = "0.3.18"
4
4
  description = "A temporal graph building library"
5
5
  authors = [
6
6
  "Paul Paliychuk <paul@getzep.com>",
@@ -17,7 +17,7 @@ python = "^3.10"
17
17
  pydantic = "^2.8.2"
18
18
  neo4j = "^5.23.0"
19
19
  diskcache = "^5.6.3"
20
- openai = "^1.50.2"
20
+ openai = "^1.52.2"
21
21
  tenacity = "<9.0.0"
22
22
  numpy = ">=1.0.0"
23
23
 
@@ -26,7 +26,7 @@ pytest = "^8.3.3"
26
26
  python-dotenv = "^1.0.1"
27
27
  pytest-asyncio = "^0.24.0"
28
28
  pytest-xdist = "^3.6.1"
29
- ruff = "^0.6.9"
29
+ ruff = "^0.7.1"
30
30
 
31
31
  [tool.poetry.group.dev.dependencies]
32
32
  pydantic = "^2.8.2"
File without changes
File without changes