graphiti-core 0.3.19__py3-none-any.whl → 0.3.21__py3-none-any.whl

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.

graphiti_core/graphiti.py CHANGED
@@ -51,6 +51,7 @@ from graphiti_core.utils import (
51
51
  )
52
52
  from graphiti_core.utils.bulk_utils import (
53
53
  RawEpisode,
54
+ add_nodes_and_edges_bulk,
54
55
  dedupe_edges_bulk,
55
56
  dedupe_nodes_bulk,
56
57
  extract_edge_dates_bulk,
@@ -451,10 +452,9 @@ class Graphiti:
451
452
  if not self.store_raw_episode_content:
452
453
  episode.content = ''
453
454
 
454
- await episode.save(self.driver)
455
- await asyncio.gather(*[node.save(self.driver) for node in nodes])
456
- await asyncio.gather(*[edge.save(self.driver) for edge in episodic_edges])
457
- await asyncio.gather(*[edge.save(self.driver) for edge in entity_edges])
455
+ await add_nodes_and_edges_bulk(
456
+ self.driver, [episode], episodic_edges, nodes, entity_edges
457
+ )
458
458
 
459
459
  # Update any communities
460
460
  if update_communities:
graphiti_core/helpers.py CHANGED
@@ -24,6 +24,7 @@ from neo4j import time as neo4j_time
24
24
  load_dotenv()
25
25
 
26
26
  DEFAULT_DATABASE = os.getenv('DEFAULT_DATABASE', None)
27
+ USE_PARALLEL_RUNTIME = bool(os.getenv('USE_PARALLEL_RUNTIME', False))
27
28
 
28
29
 
29
30
  def parse_db_date(neo_date: neo4j_time.DateTime | None) -> datetime | None:
@@ -5,6 +5,15 @@ EPISODIC_EDGE_SAVE = """
5
5
  SET r = {uuid: $uuid, group_id: $group_id, created_at: $created_at}
6
6
  RETURN r.uuid AS uuid"""
7
7
 
8
+ EPISODIC_EDGE_SAVE_BULK = """
9
+ UNWIND $episodic_edges AS edge
10
+ MATCH (episode:Episodic {uuid: edge.source_node_uuid})
11
+ MATCH (node:Entity {uuid: edge.target_node_uuid})
12
+ MERGE (episode)-[r:MENTIONS {uuid: edge.uuid}]->(node)
13
+ SET r = {uuid: edge.uuid, group_id: edge.group_id, created_at: edge.created_at}
14
+ RETURN r.uuid AS uuid
15
+ """
16
+
8
17
  ENTITY_EDGE_SAVE = """
9
18
  MATCH (source:Entity {uuid: $source_uuid})
10
19
  MATCH (target:Entity {uuid: $target_uuid})
@@ -14,6 +23,17 @@ ENTITY_EDGE_SAVE = """
14
23
  WITH r CALL db.create.setRelationshipVectorProperty(r, "fact_embedding", $fact_embedding)
15
24
  RETURN r.uuid AS uuid"""
16
25
 
26
+ ENTITY_EDGE_SAVE_BULK = """
27
+ UNWIND $entity_edges AS edge
28
+ MATCH (source:Entity {uuid: edge.source_node_uuid})
29
+ MATCH (target:Entity {uuid: edge.target_node_uuid})
30
+ MERGE (source)-[r:RELATES_TO {uuid: edge.uuid}]->(target)
31
+ SET r = {uuid: edge.uuid, name: edge.name, group_id: edge.group_id, fact: edge.fact, episodes: edge.episodes,
32
+ created_at: edge.created_at, expired_at: edge.expired_at, valid_at: edge.valid_at, invalid_at: edge.invalid_at}
33
+ WITH r, edge CALL db.create.setRelationshipVectorProperty(r, "fact_embedding", edge.fact_embedding)
34
+ RETURN r.uuid AS uuid
35
+ """
36
+
17
37
  COMMUNITY_EDGE_SAVE = """
18
38
  MATCH (community:Community {uuid: $community_uuid})
19
39
  MATCH (node:Entity | Community {uuid: $entity_uuid})
@@ -4,12 +4,29 @@ EPISODIC_NODE_SAVE = """
4
4
  entity_edges: $entity_edges, created_at: $created_at, valid_at: $valid_at}
5
5
  RETURN n.uuid AS uuid"""
6
6
 
7
+ EPISODIC_NODE_SAVE_BULK = """
8
+ UNWIND $episodes AS episode
9
+ MERGE (n:Episodic {uuid: episode.uuid})
10
+ SET n = {uuid: episode.uuid, name: episode.name, group_id: episode.group_id, source_description: episode.source_description,
11
+ source: episode.source, content: episode.content,
12
+ entity_edges: episode.entity_edges, created_at: episode.created_at, valid_at: episode.valid_at}
13
+ RETURN n.uuid AS uuid
14
+ """
15
+
7
16
  ENTITY_NODE_SAVE = """
8
17
  MERGE (n:Entity {uuid: $uuid})
9
18
  SET n = {uuid: $uuid, name: $name, group_id: $group_id, summary: $summary, created_at: $created_at}
10
19
  WITH n CALL db.create.setNodeVectorProperty(n, "name_embedding", $name_embedding)
11
20
  RETURN n.uuid AS uuid"""
12
21
 
22
+ ENTITY_NODE_SAVE_BULK = """
23
+ UNWIND $nodes AS node
24
+ MERGE (n:Entity {uuid: node.uuid})
25
+ SET n = {uuid: node.uuid, name: node.name, group_id: node.group_id, summary: node.summary, created_at: node.created_at}
26
+ WITH n, node CALL db.create.setNodeVectorProperty(n, "name_embedding", node.name_embedding)
27
+ RETURN n.uuid AS uuid
28
+ """
29
+
13
30
  COMMUNITY_NODE_SAVE = """
14
31
  MERGE (n:Community {uuid: $uuid})
15
32
  SET n = {uuid: $uuid, name: $name, group_id: $group_id, summary: $summary, created_at: $created_at}
@@ -66,6 +66,12 @@ async def search(
66
66
  bfs_origin_node_uuids: list[str] | None = None,
67
67
  ) -> SearchResults:
68
68
  start = time()
69
+ if query.strip() == '':
70
+ return SearchResults(
71
+ edges=[],
72
+ nodes=[],
73
+ communities=[],
74
+ )
69
75
  query_vector = await embedder.create(input_data=[query.replace('\n', ' ')])
70
76
 
71
77
  # if group_ids is empty, set it to None
@@ -21,9 +21,15 @@ from time import time
21
21
 
22
22
  import numpy as np
23
23
  from neo4j import AsyncDriver, Query
24
+ from typing_extensions import LiteralString
24
25
 
25
26
  from graphiti_core.edges import EntityEdge, get_entity_edge_from_record
26
- from graphiti_core.helpers import DEFAULT_DATABASE, lucene_sanitize, normalize_l2
27
+ from graphiti_core.helpers import (
28
+ DEFAULT_DATABASE,
29
+ USE_PARALLEL_RUNTIME,
30
+ lucene_sanitize,
31
+ normalize_l2,
32
+ )
27
33
  from graphiti_core.nodes import (
28
34
  CommunityNode,
29
35
  EntityNode,
@@ -38,7 +44,7 @@ RELEVANT_SCHEMA_LIMIT = 3
38
44
  DEFAULT_MIN_SCORE = 0.6
39
45
  DEFAULT_MMR_LAMBDA = 0.5
40
46
  MAX_SEARCH_DEPTH = 3
41
- MAX_QUERY_LENGTH = 128
47
+ MAX_QUERY_LENGTH = 32
42
48
 
43
49
 
44
50
  def fulltext_query(query: str, group_ids: list[str] | None = None):
@@ -187,8 +193,11 @@ async def edge_similarity_search(
187
193
  min_score: float = DEFAULT_MIN_SCORE,
188
194
  ) -> list[EntityEdge]:
189
195
  # vector similarity search over embedded facts
190
- query = Query("""
191
- CYPHER runtime = parallel parallelRuntimeSupport=all
196
+ runtime_query: LiteralString = (
197
+ 'CYPHER runtime = parallel parallelRuntimeSupport=all\n' if USE_PARALLEL_RUNTIME else ''
198
+ )
199
+
200
+ query: LiteralString = """
192
201
  MATCH (n:Entity)-[r:RELATES_TO]->(m:Entity)
193
202
  WHERE ($group_ids IS NULL OR r.group_id IN $group_ids)
194
203
  AND ($source_uuid IS NULL OR n.uuid IN [$source_uuid, $target_uuid])
@@ -210,10 +219,10 @@ async def edge_similarity_search(
210
219
  r.invalid_at AS invalid_at
211
220
  ORDER BY score DESC
212
221
  LIMIT $limit
213
- """)
222
+ """
214
223
 
215
224
  records, _, _ = await driver.execute_query(
216
- query,
225
+ runtime_query + query,
217
226
  search_vector=search_vector,
218
227
  source_uuid=source_node_uuid,
219
228
  target_uuid=target_node_uuid,
@@ -318,9 +327,13 @@ async def node_similarity_search(
318
327
  min_score: float = DEFAULT_MIN_SCORE,
319
328
  ) -> list[EntityNode]:
320
329
  # vector similarity search over entity names
330
+ runtime_query: LiteralString = (
331
+ 'CYPHER runtime = parallel parallelRuntimeSupport=all\n' if USE_PARALLEL_RUNTIME else ''
332
+ )
333
+
321
334
  records, _, _ = await driver.execute_query(
322
- """
323
- CYPHER runtime = parallel parallelRuntimeSupport=all
335
+ runtime_query
336
+ + """
324
337
  MATCH (n:Entity)
325
338
  WHERE $group_ids IS NULL OR n.group_id IN $group_ids
326
339
  WITH n, vector.similarity.cosine(n.name_embedding, $search_vector) AS score
@@ -425,23 +438,27 @@ async def community_similarity_search(
425
438
  min_score=DEFAULT_MIN_SCORE,
426
439
  ) -> list[CommunityNode]:
427
440
  # vector similarity search over entity names
441
+ runtime_query: LiteralString = (
442
+ 'CYPHER runtime = parallel parallelRuntimeSupport=all\n' if USE_PARALLEL_RUNTIME else ''
443
+ )
444
+
428
445
  records, _, _ = await driver.execute_query(
429
- """
430
- CYPHER runtime = parallel parallelRuntimeSupport=all
431
- MATCH (comm:Community)
432
- WHERE ($group_ids IS NULL OR comm.group_id IN $group_ids)
433
- WITH comm, vector.similarity.cosine(comm.name_embedding, $search_vector) AS score
434
- WHERE score > $min_score
435
- RETURN
436
- comm.uuid As uuid,
437
- comm.group_id AS group_id,
438
- comm.name AS name,
439
- comm.name_embedding AS name_embedding,
440
- comm.created_at AS created_at,
441
- comm.summary AS summary
442
- ORDER BY score DESC
443
- LIMIT $limit
444
- """,
446
+ runtime_query
447
+ + """
448
+ MATCH (comm:Community)
449
+ WHERE ($group_ids IS NULL OR comm.group_id IN $group_ids)
450
+ WITH comm, vector.similarity.cosine(comm.name_embedding, $search_vector) AS score
451
+ WHERE score > $min_score
452
+ RETURN
453
+ comm.uuid As uuid,
454
+ comm.group_id AS group_id,
455
+ comm.name AS name,
456
+ comm.name_embedding AS name_embedding,
457
+ comm.created_at AS created_at,
458
+ comm.summary AS summary
459
+ ORDER BY score DESC
460
+ LIMIT $limit
461
+ """,
445
462
  search_vector=search_vector,
446
463
  group_ids=group_ids,
447
464
  limit=limit,
@@ -21,12 +21,20 @@ from collections import defaultdict
21
21
  from datetime import datetime
22
22
  from math import ceil
23
23
 
24
- from neo4j import AsyncDriver
24
+ from neo4j import AsyncDriver, AsyncManagedTransaction
25
25
  from numpy import dot, sqrt
26
26
  from pydantic import BaseModel
27
27
 
28
28
  from graphiti_core.edges import Edge, EntityEdge, EpisodicEdge
29
29
  from graphiti_core.llm_client import LLMClient
30
+ from graphiti_core.models.edges.edge_db_queries import (
31
+ ENTITY_EDGE_SAVE_BULK,
32
+ EPISODIC_EDGE_SAVE_BULK,
33
+ )
34
+ from graphiti_core.models.nodes.node_db_queries import (
35
+ ENTITY_NODE_SAVE_BULK,
36
+ EPISODIC_NODE_SAVE_BULK,
37
+ )
30
38
  from graphiti_core.nodes import EntityNode, EpisodeType, EpisodicNode
31
39
  from graphiti_core.search.search_utils import get_relevant_edges, get_relevant_nodes
32
40
  from graphiti_core.utils import retrieve_episodes
@@ -75,6 +83,35 @@ async def retrieve_previous_episodes_bulk(
75
83
  return episode_tuples
76
84
 
77
85
 
86
+ async def add_nodes_and_edges_bulk(
87
+ driver: AsyncDriver,
88
+ episodic_nodes: list[EpisodicNode],
89
+ episodic_edges: list[EpisodicEdge],
90
+ entity_nodes: list[EntityNode],
91
+ entity_edges: list[EntityEdge],
92
+ ):
93
+ async with driver.session() as session:
94
+ await session.execute_write(
95
+ add_nodes_and_edges_bulk_tx, episodic_nodes, episodic_edges, entity_nodes, entity_edges
96
+ )
97
+
98
+
99
+ async def add_nodes_and_edges_bulk_tx(
100
+ tx: AsyncManagedTransaction,
101
+ episodic_nodes: list[EpisodicNode],
102
+ episodic_edges: list[EpisodicEdge],
103
+ entity_nodes: list[EntityNode],
104
+ entity_edges: list[EntityEdge],
105
+ ):
106
+ episodes = [dict(episode) for episode in episodic_nodes]
107
+ for episode in episodes:
108
+ episode['source'] = str(episode['source'].value)
109
+ await tx.run(EPISODIC_NODE_SAVE_BULK, episodes=episodes)
110
+ await tx.run(ENTITY_NODE_SAVE_BULK, nodes=[dict(entity) for entity in entity_nodes])
111
+ await tx.run(EPISODIC_EDGE_SAVE_BULK, episodic_edges=[dict(edge) for edge in episodic_edges])
112
+ await tx.run(ENTITY_EDGE_SAVE_BULK, entity_edges=[dict(edge) for edge in entity_edges])
113
+
114
+
78
115
  async def extract_nodes_and_edges_bulk(
79
116
  llm_client: LLMClient, episode_tuples: list[tuple[EpisodicNode, list[EpisodicNode]]]
80
117
  ) -> tuple[list[EntityNode], list[EntityEdge], list[EpisodicEdge]]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: graphiti-core
3
- Version: 0.3.19
3
+ Version: 0.3.21
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.52.2,<2.0.0)
17
+ Requires-Dist: openai (>=1.53.0,<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
@@ -194,6 +194,17 @@ The `server` directory contains an API service for interacting with the Graphiti
194
194
 
195
195
  Please see the [server README](./server/README.md) for more information.
196
196
 
197
+ ## Optional Environment Variables
198
+
199
+ In addition to the Neo4j and OpenAi-compatible credentials, Graphiti also has a few optional environment variables.
200
+ If you are using one of our supported models, such as Anthropic or Voyage models, the necessary environment variables
201
+ must be set.
202
+
203
+ `USE_PARALLEL_RUNTIME` is an optional boolean variable that can be set to true if you wish
204
+ to enable Neo4j's parallel runtime feature for several of our search queries.
205
+ Note that this feature is not supported for Neo4j Community edition or for smaller AuraDB instances,
206
+ as such this feature is off by default.
207
+
197
208
  ## Documentation
198
209
 
199
210
  - [Guides and API documentation](https://help.getzep.com/graphiti).
@@ -207,11 +218,11 @@ Graphiti is under active development. We aim to maintain API stability while wor
207
218
  - [x] Implementing node and edge CRUD operations
208
219
  - [ ] Improving performance and scalability
209
220
  - [ ] Achieving good performance with different LLM and embedding models
210
- - [ ] Creating a dedicated embedder interface
221
+ - [x] Creating a dedicated embedder interface
211
222
  - [ ] Supporting custom graph schemas:
212
223
  - Allow developers to provide their own defined node and edge classes when ingesting episodes
213
224
  - Enable more flexible knowledge representation tailored to specific use cases
214
- - [ ] Enhancing retrieval capabilities with more robust and configurable options
225
+ - [x] Enhancing retrieval capabilities with more robust and configurable options
215
226
  - [ ] Expanding test coverage to ensure reliability and catch edge cases
216
227
 
217
228
  ## Contributing
@@ -9,8 +9,8 @@ graphiti_core/embedder/client.py,sha256=gVr_xdN-d0UQfeE4Nyoa4pL3M8UxllNH4eFqmarx
9
9
  graphiti_core/embedder/openai.py,sha256=yYUYPymx_lBlxDTGrlc03yNhPFyGG-etM2sszRK2G2U,1618
10
10
  graphiti_core/embedder/voyage.py,sha256=_eGFI5_NjNG8z7qG3jTWCdE7sAs1Yb8fiSZSJlQLD9o,1879
11
11
  graphiti_core/errors.py,sha256=ddHrHGQxhwkVAtSph4AV84UoOlgwZufMczXPwB7uqPo,1795
12
- graphiti_core/graphiti.py,sha256=c9Rh777TrHYffPF6qvFAfm-m-PA4kD8a3ZW_ShsZGxE,27714
13
- graphiti_core/helpers.py,sha256=kqC2TD8Auwty4sG7KH4BuRMX413oTChGaAT_XUt9ZjU,2108
12
+ graphiti_core/graphiti.py,sha256=MIwkprC9L9FVj7cGrAzrNbpgkpPtUPPofLlfCrtXLHU,27584
13
+ graphiti_core/helpers.py,sha256=6N5nNgyXiHWsMXHxm9M_S6Og7_TuejE5GuyV6EtZgVw,2178
14
14
  graphiti_core/llm_client/__init__.py,sha256=PA80TSMeX-sUXITXEAxMDEt3gtfZgcJrGJUcyds1mSo,207
15
15
  graphiti_core/llm_client/anthropic_client.py,sha256=4l2PbCjIoeRr7UJ2DUh2grYLTtE2vNaWlo72IIRQDeI,2405
16
16
  graphiti_core/llm_client/client.py,sha256=WAnX0e4EuCFHXdFHeq_O1HZsW1STSByvDCFUHMAHEFU,3394
@@ -21,9 +21,9 @@ graphiti_core/llm_client/openai_client.py,sha256=xLkbpusRVFRK0zPr3kOqY31HK_XCXrp
21
21
  graphiti_core/llm_client/utils.py,sha256=zKpxXEbKa369m4W7RDEf-m56kH46V1Mx3RowcWZEWWs,1000
22
22
  graphiti_core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  graphiti_core/models/edges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- graphiti_core/models/edges/edge_db_queries.py,sha256=gUC5AZeXvobsIzG8Zqxj4Sa-j0PKV4CuEPHWupFTXQs,1145
24
+ graphiti_core/models/edges/edge_db_queries.py,sha256=0T1OSSQeP63OjoMTrscqVhq0gNRRxh3-n1sNxo0kTJE,2102
25
25
  graphiti_core/models/nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- graphiti_core/models/nodes/node_db_queries.py,sha256=HxZIjVLqVRnG7OJHeZv7t3KCEWFTWvdNOBJyLSN-1Ts,918
26
+ graphiti_core/models/nodes/node_db_queries.py,sha256=zIEKhodGOEYQ2ZdH766t-QRSk2xZNmtmAaPv60pvepM,1688
27
27
  graphiti_core/nodes.py,sha256=xlObDAC6Osp6L0wwqREuzBlIFlOzuUs9lN3ZpIv4seM,13844
28
28
  graphiti_core/prompts/__init__.py,sha256=EA-x9xUki9l8wnu2l8ek_oNf75-do5tq5hVq7Zbv8Kw,101
29
29
  graphiti_core/prompts/dedupe_edges.py,sha256=DUNHdIudj50FAjkla4nc68tSFSD2yjmYHBw-Bb7ph20,6529
@@ -38,12 +38,12 @@ graphiti_core/prompts/models.py,sha256=cvx_Bv5RMFUD_5IUawYrbpOKLPHogai7_bm7YXrSz
38
38
  graphiti_core/prompts/summarize_nodes.py,sha256=FLuZpGTABgcxuIDkx_IKH115nHEw0rIaFhcGlWveAMc,2357
39
39
  graphiti_core/py.typed,sha256=vlmmzQOt7bmeQl9L3XJP4W6Ry0iiELepnOrinKz5KQg,79
40
40
  graphiti_core/search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- graphiti_core/search/search.py,sha256=Fz45sXToQ6KN_y2k94kg9UyUZeqsS14jfaGfQ5KGifQ,11176
41
+ graphiti_core/search/search.py,sha256=u512ZK2qPL28SmXDIo_RELq_dTRndo-GUPlSJrQqo5A,11316
42
42
  graphiti_core/search/search_config.py,sha256=UZN8jFA4pBlw2O5N1cuhVRBdTwMLR9N3Oyo6sQ4MDVw,3117
43
43
  graphiti_core/search/search_config_recipes.py,sha256=20jS7veJExDnXA-ovJSUJfyDHKt7GW-nng-eoiT7ATA,5810
44
- graphiti_core/search/search_utils.py,sha256=l8BR4GOo-A2eIXx4ybC18n6t6CeerN_9KQbYzCB6ix0,22551
44
+ graphiti_core/search/search_utils.py,sha256=gqBlhnb75srhymQ4_yzb7o019UxtE3e7eHHK9NL6nCc,22916
45
45
  graphiti_core/utils/__init__.py,sha256=cJAcMnBZdHBQmWrZdU1PQ1YmaL75bhVUkyVpIPuOyns,260
46
- graphiti_core/utils/bulk_utils.py,sha256=JtoYTZPCigPa3n2E43Oe7QhFZRTA_QKNGy1jVgklHag,12614
46
+ graphiti_core/utils/bulk_utils.py,sha256=azn8xlUT9u5-CFDkLSAY4y5zt5uvOvKBzatZZKDvp1g,13994
47
47
  graphiti_core/utils/maintenance/__init__.py,sha256=TRY3wWWu5kn3Oahk_KKhltrWnh0NACw0FskjqF6OtlA,314
48
48
  graphiti_core/utils/maintenance/community_operations.py,sha256=Ltx8cQJcFDXcQs17lHDkh2r3qmJalzpRdA3Azl2U3m8,9804
49
49
  graphiti_core/utils/maintenance/edge_operations.py,sha256=htG9h32u0O1g7ZdR-jFSHuzDgiO4MChYJsNuvrRMTu8,11270
@@ -51,7 +51,7 @@ graphiti_core/utils/maintenance/graph_data_operations.py,sha256=w66_SLlvPapuG91Y
51
51
  graphiti_core/utils/maintenance/node_operations.py,sha256=h5nlRojbXOGJs-alpv6z6WnZ1UCixVGlAQYBQUqz8Bs,9030
52
52
  graphiti_core/utils/maintenance/temporal_operations.py,sha256=MvaRLWrBlDeYw8CQrKish1xbYcY5ovpfdqA2hSX7v5k,3367
53
53
  graphiti_core/utils/maintenance/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- graphiti_core-0.3.19.dist-info/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
55
- graphiti_core-0.3.19.dist-info/METADATA,sha256=uwulLozcE0fov_hyYb3rIWUtuvcy6BObIuOcfng0aaQ,9396
56
- graphiti_core-0.3.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
57
- graphiti_core-0.3.19.dist-info/RECORD,,
54
+ graphiti_core-0.3.21.dist-info/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
55
+ graphiti_core-0.3.21.dist-info/METADATA,sha256=dGRf7FLQ0HBD58uYXHMjHzT8uF2dcJG2mPgbyw2CobU,9990
56
+ graphiti_core-0.3.21.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
57
+ graphiti_core-0.3.21.dist-info/RECORD,,