graphiti-core 0.19.0rc1__py3-none-any.whl → 0.19.0rc3__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.

@@ -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,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",
@@ -36,7 +36,7 @@ graphiti_core/llm_client/openai_client.py,sha256=AuaCFQFMJEGzBkFVouccq3XentmWRIK
36
36
  graphiti_core/llm_client/openai_generic_client.py,sha256=WElMnPqdb1CxzYH4p2-m_9rVMr5M93-eXnc3yVxBgFg,7001
37
37
  graphiti_core/llm_client/utils.py,sha256=zKpxXEbKa369m4W7RDEf-m56kH46V1Mx3RowcWZEWWs,1000
38
38
  graphiti_core/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- graphiti_core/migrations/neo4j_node_group_labels.py,sha256=faE7zl5kRSJsKEZudgqpS6HQBzJP8E-wqvb2wqBVFCU,1894
39
+ graphiti_core/migrations/neo4j_node_group_labels.py,sha256=7hmB8DHkpcP0N2YLw-kF1mtD2NLMLF39xQmkjal90Yg,2769
40
40
  graphiti_core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  graphiti_core/models/edges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  graphiti_core/models/edges/edge_db_queries.py,sha256=Poh5E6DcsU3tMsDLYQZ-pVw0kDorQZ-BXoxIiQiyP3Y,7168
@@ -55,7 +55,7 @@ graphiti_core/prompts/models.py,sha256=NgxdbPHJpBEcpbXovKyScgpBc73Q-GIW-CBDlBtDj
55
55
  graphiti_core/prompts/prompt_helpers.py,sha256=gMDDNqBpxcnTO9psJQm7QU7M6OQgRumFq4oGYiycrfM,795
56
56
  graphiti_core/prompts/summarize_nodes.py,sha256=tn6LPEv_nNFLjKuT_FB_st7TAIYOEUOg9QR5YG7PpMA,4437
57
57
  graphiti_core/search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- graphiti_core/search/search.py,sha256=TnBtwqL0dWADBZqQT_ymlJm2qA2Llj-0SwS8vS6nH-0,17464
58
+ graphiti_core/search/search.py,sha256=iCF_NhFFzhDBx9-yty6j4BCwFUokl-1XsOi6LgDpnUU,18306
59
59
  graphiti_core/search/search_config.py,sha256=v_rUHsu1yo5OuPfEm21lSuXexQs-o8qYwSSemW2QWhU,4165
60
60
  graphiti_core/search/search_config_recipes.py,sha256=4GquRphHhJlpXQhAZOySYnCzBWYoTwxlJj44eTOavZQ,7443
61
61
  graphiti_core/search/search_filters.py,sha256=BkkVpweN5U_ld5n2GyQrljwGw4QwbFphE7FT0jpTys8,7772
@@ -69,12 +69,12 @@ graphiti_core/utils/datetime_utils.py,sha256=Ti-2tnrDFRzBsbfblzsHybsM3jaDLP4-VT2
69
69
  graphiti_core/utils/maintenance/__init__.py,sha256=vW4H1KyapTl-OOz578uZABYcpND4wPx3Vt6aAPaXh78,301
70
70
  graphiti_core/utils/maintenance/community_operations.py,sha256=gHqsRtX19LVH88B70GNTGnnq5Ic5kcm0Gu24wKP3-yQ,10492
71
71
  graphiti_core/utils/maintenance/edge_operations.py,sha256=WOeuei29X5bcKP28WtCWTJGBea9TaBLYfZ3xKXbMhcU,19618
72
- graphiti_core/utils/maintenance/graph_data_operations.py,sha256=NdKkyja1w0liulWOHsbeL8Mv_wRaWflzWzZTn67Os0I,6857
72
+ graphiti_core/utils/maintenance/graph_data_operations.py,sha256=fzDOUgf17rUM6Ubigi-ujxsESn4bJ_RKNO4DWsHyLuI,6908
73
73
  graphiti_core/utils/maintenance/node_operations.py,sha256=r9ilkA01eq1z-nF8P_s1EXG6A6j15qmnfIqetnzqF50,13644
74
74
  graphiti_core/utils/maintenance/temporal_operations.py,sha256=IIaVtShpVkOYe6haxz3a1x3v54-MzaEXG8VsxFUNeoY,3582
75
75
  graphiti_core/utils/maintenance/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  graphiti_core/utils/ontology_utils/entity_types_utils.py,sha256=4eVgxLWY6Q8k9cRJ5pW59IYF--U4nXZsZIGOVb_yHfQ,1285
77
- graphiti_core-0.19.0rc1.dist-info/METADATA,sha256=jntXiXKlshMrypjRhK0so-qP0ayC_F_e1y-0zF_fLWM,25811
78
- graphiti_core-0.19.0rc1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
79
- graphiti_core-0.19.0rc1.dist-info/licenses/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
80
- graphiti_core-0.19.0rc1.dist-info/RECORD,,
77
+ graphiti_core-0.19.0rc3.dist-info/METADATA,sha256=_b6pt1z5sTtCN-HUL1Hv9d9ARiWR3eHGXIi9sWd66Ro,25917
78
+ graphiti_core-0.19.0rc3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
79
+ graphiti_core-0.19.0rc3.dist-info/licenses/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
80
+ graphiti_core-0.19.0rc3.dist-info/RECORD,,