graphiti-core 0.10.2__tar.gz → 0.10.4__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.
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/PKG-INFO +1 -1
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/graphiti.py +1 -1
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/nodes.py +28 -31
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/extract_edge_dates.py +1 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search.py +0 -3
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search_utils.py +36 -45
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/bulk_utils.py +2 -2
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/community_operations.py +5 -3
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/graph_data_operations.py +4 -4
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/node_operations.py +4 -2
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/pyproject.toml +1 -1
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/LICENSE +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/README.md +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/edges.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/embedder/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/embedder/client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/embedder/gemini.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/embedder/openai.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/embedder/voyage.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/errors.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/helpers.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/anthropic_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/config.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/errors.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/gemini_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/groq_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/openai_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/openai_generic_client.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/utils.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/models/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/models/edges/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/models/edges/edge_db_queries.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/models/nodes/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/models/nodes/node_db_queries.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/dedupe_edges.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/dedupe_nodes.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/eval.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/extract_edges.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/extract_nodes.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/invalidate_edges.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/lib.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/models.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/prompt_helpers.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/prompts/summarize_nodes.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/py.typed +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search_config.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search_config_recipes.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search_filters.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/search/search_helpers.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/datetime_utils.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/__init__.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/edge_operations.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/utils.py +0 -0
- {graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/ontology_utils/entity_types_utils.py +0 -0
|
@@ -797,7 +797,7 @@ class Graphiti:
|
|
|
797
797
|
# We should only delete edges created by the episode
|
|
798
798
|
edges_to_delete: list[EntityEdge] = []
|
|
799
799
|
for edge in edges:
|
|
800
|
-
if edge.episodes[0] == episode.uuid:
|
|
800
|
+
if edge.episodes and edge.episodes[0] == episode.uuid:
|
|
801
801
|
edges_to_delete.append(edge)
|
|
802
802
|
|
|
803
803
|
# Find nodes mentioned by the episode
|
|
@@ -38,6 +38,20 @@ from graphiti_core.utils.datetime_utils import utc_now
|
|
|
38
38
|
|
|
39
39
|
logger = logging.getLogger(__name__)
|
|
40
40
|
|
|
41
|
+
ENTITY_NODE_RETURN: LiteralString = """
|
|
42
|
+
OPTIONAL MATCH (e:Episodic)-[r:MENTIONS]->(n)
|
|
43
|
+
WITH n, collect(e.uuid) AS episodes
|
|
44
|
+
RETURN
|
|
45
|
+
n.uuid As uuid,
|
|
46
|
+
n.name AS name,
|
|
47
|
+
n.name_embedding AS name_embedding,
|
|
48
|
+
n.group_id AS group_id,
|
|
49
|
+
n.created_at AS created_at,
|
|
50
|
+
n.summary AS summary,
|
|
51
|
+
labels(n) AS labels,
|
|
52
|
+
properties(n) AS attributes,
|
|
53
|
+
episodes"""
|
|
54
|
+
|
|
41
55
|
|
|
42
56
|
class EpisodeType(Enum):
|
|
43
57
|
"""
|
|
@@ -280,6 +294,9 @@ class EpisodicNode(Node):
|
|
|
280
294
|
class EntityNode(Node):
|
|
281
295
|
name_embedding: list[float] | None = Field(default=None, description='embedding of the name')
|
|
282
296
|
summary: str = Field(description='regional summary of surrounding edges', default_factory=str)
|
|
297
|
+
episodes: list[str] | None = Field(
|
|
298
|
+
default=None, description='List of episode uuids that mention this node.'
|
|
299
|
+
)
|
|
283
300
|
attributes: dict[str, Any] = Field(
|
|
284
301
|
default={}, description='Additional attributes of the node. Dependent on node labels'
|
|
285
302
|
)
|
|
@@ -318,19 +335,14 @@ class EntityNode(Node):
|
|
|
318
335
|
|
|
319
336
|
@classmethod
|
|
320
337
|
async def get_by_uuid(cls, driver: AsyncDriver, uuid: str):
|
|
321
|
-
|
|
338
|
+
query = (
|
|
322
339
|
"""
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
n.created_at AS created_at,
|
|
330
|
-
n.summary AS summary,
|
|
331
|
-
labels(n) AS labels,
|
|
332
|
-
properties(n) AS attributes
|
|
333
|
-
""",
|
|
340
|
+
MATCH (n:Entity {uuid: $uuid})
|
|
341
|
+
"""
|
|
342
|
+
+ ENTITY_NODE_RETURN
|
|
343
|
+
)
|
|
344
|
+
records, _, _ = await driver.execute_query(
|
|
345
|
+
query,
|
|
334
346
|
uuid=uuid,
|
|
335
347
|
database_=DEFAULT_DATABASE,
|
|
336
348
|
routing_='r',
|
|
@@ -348,16 +360,8 @@ class EntityNode(Node):
|
|
|
348
360
|
records, _, _ = await driver.execute_query(
|
|
349
361
|
"""
|
|
350
362
|
MATCH (n:Entity) WHERE n.uuid IN $uuids
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
n.name AS name,
|
|
354
|
-
n.name_embedding AS name_embedding,
|
|
355
|
-
n.group_id AS group_id,
|
|
356
|
-
n.created_at AS created_at,
|
|
357
|
-
n.summary AS summary,
|
|
358
|
-
labels(n) AS labels,
|
|
359
|
-
properties(n) AS attributes
|
|
360
|
-
""",
|
|
363
|
+
"""
|
|
364
|
+
+ ENTITY_NODE_RETURN,
|
|
361
365
|
uuids=uuids,
|
|
362
366
|
database_=DEFAULT_DATABASE,
|
|
363
367
|
routing_='r',
|
|
@@ -383,16 +387,8 @@ class EntityNode(Node):
|
|
|
383
387
|
MATCH (n:Entity) WHERE n.group_id IN $group_ids
|
|
384
388
|
"""
|
|
385
389
|
+ cursor_query
|
|
390
|
+
+ ENTITY_NODE_RETURN
|
|
386
391
|
+ """
|
|
387
|
-
RETURN
|
|
388
|
-
n.uuid As uuid,
|
|
389
|
-
n.name AS name,
|
|
390
|
-
n.name_embedding AS name_embedding,
|
|
391
|
-
n.group_id AS group_id,
|
|
392
|
-
n.created_at AS created_at,
|
|
393
|
-
n.summary AS summary,
|
|
394
|
-
labels(n) AS labels,
|
|
395
|
-
properties(n) AS attributes
|
|
396
392
|
ORDER BY n.uuid DESC
|
|
397
393
|
"""
|
|
398
394
|
+ limit_query,
|
|
@@ -548,6 +544,7 @@ def get_entity_node_from_record(record: Any) -> EntityNode:
|
|
|
548
544
|
created_at=record['created_at'].to_native(),
|
|
549
545
|
summary=record['summary'],
|
|
550
546
|
attributes=record['attributes'],
|
|
547
|
+
episodes=record['episodes'],
|
|
551
548
|
)
|
|
552
549
|
|
|
553
550
|
entity_node.attributes.pop('uuid', None)
|
|
@@ -82,6 +82,7 @@ def v1(context: dict[str, Any]) -> list[Message]:
|
|
|
82
82
|
7. If only a date is mentioned without a specific time, use 00:00:00 (midnight) for that date.
|
|
83
83
|
8. If only year is mentioned, use January 1st of that year at 00:00:00.
|
|
84
84
|
9. Always include the time zone offset (use Z for UTC if no specific time zone is mentioned).
|
|
85
|
+
10. A fact discussing that something is no longer true should have a valid_at according to when the negated fact became true.
|
|
85
86
|
""",
|
|
86
87
|
),
|
|
87
88
|
]
|
|
@@ -210,7 +210,6 @@ async def edge_search(
|
|
|
210
210
|
query_vector,
|
|
211
211
|
search_result_uuids_and_vectors,
|
|
212
212
|
config.mmr_lambda,
|
|
213
|
-
min_score=reranker_min_score,
|
|
214
213
|
)
|
|
215
214
|
elif config.reranker == EdgeReranker.cross_encoder:
|
|
216
215
|
search_result_uuids = [[edge.uuid for edge in result] for result in search_results]
|
|
@@ -310,7 +309,6 @@ async def node_search(
|
|
|
310
309
|
query_vector,
|
|
311
310
|
search_result_uuids_and_vectors,
|
|
312
311
|
config.mmr_lambda,
|
|
313
|
-
min_score=reranker_min_score,
|
|
314
312
|
)
|
|
315
313
|
elif config.reranker == NodeReranker.cross_encoder:
|
|
316
314
|
# use rrf as a preliminary reranker
|
|
@@ -437,7 +435,6 @@ async def community_search(
|
|
|
437
435
|
query_vector,
|
|
438
436
|
search_result_uuids_and_vectors,
|
|
439
437
|
config.mmr_lambda,
|
|
440
|
-
min_score=reranker_min_score,
|
|
441
438
|
)
|
|
442
439
|
elif config.reranker == CommunityReranker.cross_encoder:
|
|
443
440
|
summary_to_uuid_map = {
|
|
@@ -32,6 +32,7 @@ from graphiti_core.helpers import (
|
|
|
32
32
|
semaphore_gather,
|
|
33
33
|
)
|
|
34
34
|
from graphiti_core.nodes import (
|
|
35
|
+
ENTITY_NODE_RETURN,
|
|
35
36
|
CommunityNode,
|
|
36
37
|
EntityNode,
|
|
37
38
|
EpisodicNode,
|
|
@@ -53,6 +54,20 @@ DEFAULT_MMR_LAMBDA = 0.5
|
|
|
53
54
|
MAX_SEARCH_DEPTH = 3
|
|
54
55
|
MAX_QUERY_LENGTH = 32
|
|
55
56
|
|
|
57
|
+
SEARCH_ENTITY_NODE_RETURN: LiteralString = """
|
|
58
|
+
OPTIONAL MATCH (e:Episodic)-[r:MENTIONS]->(n)
|
|
59
|
+
WITH n, score, collect(e.uuid) AS episodes
|
|
60
|
+
RETURN
|
|
61
|
+
n.uuid As uuid,
|
|
62
|
+
n.name AS name,
|
|
63
|
+
n.name_embedding AS name_embedding,
|
|
64
|
+
n.group_id AS group_id,
|
|
65
|
+
n.created_at AS created_at,
|
|
66
|
+
n.summary AS summary,
|
|
67
|
+
labels(n) AS labels,
|
|
68
|
+
properties(n) AS attributes,
|
|
69
|
+
episodes"""
|
|
70
|
+
|
|
56
71
|
|
|
57
72
|
def fulltext_query(query: str, group_ids: list[str] | None = None):
|
|
58
73
|
group_ids_filter_list = (
|
|
@@ -230,8 +245,8 @@ async def edge_similarity_search(
|
|
|
230
245
|
|
|
231
246
|
query: LiteralString = (
|
|
232
247
|
"""
|
|
233
|
-
|
|
234
|
-
|
|
248
|
+
MATCH (n:Entity)-[r:RELATES_TO]->(m:Entity)
|
|
249
|
+
"""
|
|
235
250
|
+ group_filter_query
|
|
236
251
|
+ filter_query
|
|
237
252
|
+ """\nWITH DISTINCT r, vector.similarity.cosine(r.fact_embedding, $search_vector) AS score
|
|
@@ -341,27 +356,21 @@ async def node_fulltext_search(
|
|
|
341
356
|
|
|
342
357
|
filter_query, filter_params = node_search_filter_query_constructor(search_filter)
|
|
343
358
|
|
|
344
|
-
|
|
345
|
-
"""
|
|
346
|
-
CALL db.index.fulltext.queryNodes("node_name_and_summary", $query, {limit: $limit})
|
|
347
|
-
YIELD node AS node, score
|
|
348
|
-
MATCH (n:Entity)
|
|
349
|
-
WHERE n.uuid = node.uuid
|
|
359
|
+
query = (
|
|
350
360
|
"""
|
|
361
|
+
CALL db.index.fulltext.queryNodes("node_name_and_summary", $query, {limit: $limit})
|
|
362
|
+
YIELD node AS n, score
|
|
363
|
+
WHERE n:Entity
|
|
364
|
+
"""
|
|
351
365
|
+ filter_query
|
|
366
|
+
+ SEARCH_ENTITY_NODE_RETURN
|
|
352
367
|
+ """
|
|
353
|
-
RETURN
|
|
354
|
-
n.uuid AS uuid,
|
|
355
|
-
n.group_id AS group_id,
|
|
356
|
-
n.name AS name,
|
|
357
|
-
n.name_embedding AS name_embedding,
|
|
358
|
-
n.created_at AS created_at,
|
|
359
|
-
n.summary AS summary,
|
|
360
|
-
labels(n) AS labels,
|
|
361
|
-
properties(n) AS attributes
|
|
362
368
|
ORDER BY score DESC
|
|
363
|
-
|
|
364
|
-
|
|
369
|
+
"""
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
records, _, _ = await driver.execute_query(
|
|
373
|
+
query,
|
|
365
374
|
filter_params,
|
|
366
375
|
query=fuzzy_query,
|
|
367
376
|
group_ids=group_ids,
|
|
@@ -406,19 +415,12 @@ async def node_similarity_search(
|
|
|
406
415
|
+ filter_query
|
|
407
416
|
+ """
|
|
408
417
|
WITH n, vector.similarity.cosine(n.name_embedding, $search_vector) AS score
|
|
409
|
-
WHERE score > $min_score
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
n.created_at AS created_at,
|
|
416
|
-
n.summary AS summary,
|
|
417
|
-
labels(n) AS labels,
|
|
418
|
-
properties(n) AS attributes
|
|
419
|
-
ORDER BY score DESC
|
|
420
|
-
LIMIT $limit
|
|
421
|
-
""",
|
|
418
|
+
WHERE score > $min_score"""
|
|
419
|
+
+ SEARCH_ENTITY_NODE_RETURN
|
|
420
|
+
+ """
|
|
421
|
+
ORDER BY score DESC
|
|
422
|
+
LIMIT $limit
|
|
423
|
+
""",
|
|
422
424
|
query_params,
|
|
423
425
|
search_vector=search_vector,
|
|
424
426
|
group_ids=group_ids,
|
|
@@ -452,16 +454,8 @@ async def node_bfs_search(
|
|
|
452
454
|
WHERE n.group_id = origin.group_id
|
|
453
455
|
"""
|
|
454
456
|
+ filter_query
|
|
457
|
+
+ ENTITY_NODE_RETURN
|
|
455
458
|
+ """
|
|
456
|
-
RETURN DISTINCT
|
|
457
|
-
n.uuid As uuid,
|
|
458
|
-
n.group_id AS group_id,
|
|
459
|
-
n.name AS name,
|
|
460
|
-
n.name_embedding AS name_embedding,
|
|
461
|
-
n.created_at AS created_at,
|
|
462
|
-
n.summary AS summary,
|
|
463
|
-
labels(n) AS labels,
|
|
464
|
-
properties(n) AS attributes
|
|
465
459
|
LIMIT $limit
|
|
466
460
|
""",
|
|
467
461
|
filter_params,
|
|
@@ -852,7 +846,6 @@ def maximal_marginal_relevance(
|
|
|
852
846
|
query_vector: list[float],
|
|
853
847
|
candidates: list[tuple[str, list[float]]],
|
|
854
848
|
mmr_lambda: float = DEFAULT_MMR_LAMBDA,
|
|
855
|
-
min_score: float = 0,
|
|
856
849
|
):
|
|
857
850
|
candidates_with_mmr: list[tuple[str, float]] = []
|
|
858
851
|
for candidate in candidates:
|
|
@@ -862,6 +855,4 @@ def maximal_marginal_relevance(
|
|
|
862
855
|
|
|
863
856
|
candidates_with_mmr.sort(reverse=True, key=lambda c: c[1])
|
|
864
857
|
|
|
865
|
-
return list(
|
|
866
|
-
set([candidate[0] for candidate in candidates_with_mmr if candidate[1] >= min_score])
|
|
867
|
-
)
|
|
858
|
+
return list(set([candidate[0] for candidate in candidates_with_mmr]))
|
|
@@ -26,7 +26,7 @@ from pydantic import BaseModel
|
|
|
26
26
|
from typing_extensions import Any
|
|
27
27
|
|
|
28
28
|
from graphiti_core.edges import Edge, EntityEdge, EpisodicEdge
|
|
29
|
-
from graphiti_core.helpers import semaphore_gather
|
|
29
|
+
from graphiti_core.helpers import DEFAULT_DATABASE, semaphore_gather
|
|
30
30
|
from graphiti_core.llm_client import LLMClient
|
|
31
31
|
from graphiti_core.models.edges.edge_db_queries import (
|
|
32
32
|
ENTITY_EDGE_SAVE_BULK,
|
|
@@ -95,7 +95,7 @@ async def add_nodes_and_edges_bulk(
|
|
|
95
95
|
entity_nodes: list[EntityNode],
|
|
96
96
|
entity_edges: list[EntityEdge],
|
|
97
97
|
):
|
|
98
|
-
async with driver.session() as session:
|
|
98
|
+
async with driver.session(database=DEFAULT_DATABASE) as session:
|
|
99
99
|
await session.execute_write(
|
|
100
100
|
add_nodes_and_edges_bulk_tx, episodic_nodes, episodic_edges, entity_nodes, entity_edges
|
|
101
101
|
)
|
|
@@ -101,9 +101,11 @@ def label_propagation(projection: dict[str, list[Neighbor]]) -> list[list[str]]:
|
|
|
101
101
|
]
|
|
102
102
|
|
|
103
103
|
community_lst.sort(reverse=True)
|
|
104
|
-
community_candidate = community_lst[0]
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
candidate_rank, community_candidate = community_lst[0] if community_lst else (0, -1)
|
|
105
|
+
if community_candidate != -1 and candidate_rank > 1:
|
|
106
|
+
new_community = community_candidate
|
|
107
|
+
else:
|
|
108
|
+
new_community = max(community_candidate, curr_community)
|
|
107
109
|
|
|
108
110
|
new_community_map[uuid] = new_community
|
|
109
111
|
|
|
@@ -42,7 +42,7 @@ async def build_indices_and_constraints(driver: AsyncDriver, delete_existing: bo
|
|
|
42
42
|
driver.execute_query(
|
|
43
43
|
"""DROP INDEX $name""",
|
|
44
44
|
name=name,
|
|
45
|
-
|
|
45
|
+
database_=DEFAULT_DATABASE,
|
|
46
46
|
)
|
|
47
47
|
for name in index_names
|
|
48
48
|
]
|
|
@@ -87,7 +87,7 @@ async def build_indices_and_constraints(driver: AsyncDriver, delete_existing: bo
|
|
|
87
87
|
*[
|
|
88
88
|
driver.execute_query(
|
|
89
89
|
query,
|
|
90
|
-
|
|
90
|
+
database_=DEFAULT_DATABASE,
|
|
91
91
|
)
|
|
92
92
|
for query in index_queries
|
|
93
93
|
]
|
|
@@ -95,7 +95,7 @@ async def build_indices_and_constraints(driver: AsyncDriver, delete_existing: bo
|
|
|
95
95
|
|
|
96
96
|
|
|
97
97
|
async def clear_data(driver: AsyncDriver, group_ids: list[str] | None = None):
|
|
98
|
-
async with driver.session() as session:
|
|
98
|
+
async with driver.session(database=DEFAULT_DATABASE) as session:
|
|
99
99
|
|
|
100
100
|
async def delete_all(tx):
|
|
101
101
|
await tx.run('MATCH (n) DETACH DELETE n')
|
|
@@ -150,7 +150,7 @@ async def retrieve_episodes(
|
|
|
150
150
|
reference_time=reference_time,
|
|
151
151
|
num_episodes=last_n,
|
|
152
152
|
group_ids=group_ids,
|
|
153
|
-
|
|
153
|
+
database_=DEFAULT_DATABASE,
|
|
154
154
|
)
|
|
155
155
|
episodes = [
|
|
156
156
|
EpisodicNode(
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/node_operations.py
RENAMED
|
@@ -306,7 +306,7 @@ async def resolve_extracted_node(
|
|
|
306
306
|
|
|
307
307
|
# Prepare context for LLM
|
|
308
308
|
existing_nodes_context = [
|
|
309
|
-
{'uuid': node.uuid, 'name': node.name, '
|
|
309
|
+
{**{'uuid': node.uuid, 'name': node.name, 'summary': node.summary}, **node.attributes}
|
|
310
310
|
for node in existing_nodes
|
|
311
311
|
]
|
|
312
312
|
|
|
@@ -408,6 +408,7 @@ async def resolve_extracted_node(
|
|
|
408
408
|
if new_attributes.get(attribute_name) is None:
|
|
409
409
|
new_attributes[attribute_name] = attribute_value
|
|
410
410
|
node.attributes = new_attributes
|
|
411
|
+
node.labels = list(set(existing_node.labels + extracted_node.labels))
|
|
411
412
|
|
|
412
413
|
uuid_map[extracted_node.uuid] = existing_node.uuid
|
|
413
414
|
|
|
@@ -432,7 +433,8 @@ async def dedupe_node_list(
|
|
|
432
433
|
|
|
433
434
|
# Prepare context for LLM
|
|
434
435
|
nodes_context = [
|
|
435
|
-
{'uuid': node.uuid, 'name': node.name, 'summary': node.summary}
|
|
436
|
+
{'uuid': node.uuid, 'name': node.name, 'summary': node.summary}.update(node.attributes)
|
|
437
|
+
for node in nodes
|
|
436
438
|
]
|
|
437
439
|
|
|
438
440
|
context = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "graphiti-core"
|
|
3
3
|
description = "A temporal graph building library"
|
|
4
|
-
version = "0.10.
|
|
4
|
+
version = "0.10.4"
|
|
5
5
|
authors = [
|
|
6
6
|
{ "name" = "Paul Paliychuk", "email" = "paul@getzep.com" },
|
|
7
7
|
{ "name" = "Preston Rasmussen", "email" = "preston@getzep.com" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/bge_reranker_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/cross_encoder/openai_reranker_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/llm_client/openai_generic_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/edge_operations.py
RENAMED
|
File without changes
|
{graphiti_core-0.10.2 → graphiti_core-0.10.4}/graphiti_core/utils/maintenance/temporal_operations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|