graphiti-core 0.10.4__py3-none-any.whl → 0.10.5__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.

@@ -262,7 +262,7 @@ class AnthropicClient(LLMClient):
262
262
  self,
263
263
  messages: list[Message],
264
264
  response_model: type[BaseModel] | None = None,
265
- max_tokens: int = DEFAULT_MAX_TOKENS,
265
+ max_tokens: int | None = None,
266
266
  ) -> dict[str, typing.Any]:
267
267
  """
268
268
  Generate a response from the LLM.
@@ -280,6 +280,9 @@ class AnthropicClient(LLMClient):
280
280
  RefusalError: If the LLM refuses to respond.
281
281
  Exception: If an error occurs during the generation process.
282
282
  """
283
+ if max_tokens is None:
284
+ max_tokens = self.max_tokens
285
+
283
286
  retry_count = 0
284
287
  max_retries = 2
285
288
  last_error: Exception | None = None
@@ -127,8 +127,11 @@ class LLMClient(ABC):
127
127
  self,
128
128
  messages: list[Message],
129
129
  response_model: type[BaseModel] | None = None,
130
- max_tokens: int = DEFAULT_MAX_TOKENS,
130
+ max_tokens: int | None = None,
131
131
  ) -> dict[str, typing.Any]:
132
+ if max_tokens is None:
133
+ max_tokens = self.max_tokens
134
+
132
135
  if response_model is not None:
133
136
  serialized_model = json.dumps(response_model.model_json_schema())
134
137
  messages[
@@ -166,7 +166,7 @@ class GeminiClient(LLMClient):
166
166
  self,
167
167
  messages: list[Message],
168
168
  response_model: type[BaseModel] | None = None,
169
- max_tokens: int = DEFAULT_MAX_TOKENS,
169
+ max_tokens: int | None = None,
170
170
  ) -> dict[str, typing.Any]:
171
171
  """
172
172
  Generate a response from the Gemini language model.
@@ -180,6 +180,9 @@ class GeminiClient(LLMClient):
180
180
  Returns:
181
181
  dict[str, typing.Any]: The response from the language model.
182
182
  """
183
+ if max_tokens is None:
184
+ max_tokens = self.max_tokens
185
+
183
186
  # Call the internal _generate_response method
184
187
  return await self._generate_response(
185
188
  messages=messages, response_model=response_model, max_tokens=max_tokens
@@ -131,8 +131,11 @@ class OpenAIClient(LLMClient):
131
131
  self,
132
132
  messages: list[Message],
133
133
  response_model: type[BaseModel] | None = None,
134
- max_tokens: int = DEFAULT_MAX_TOKENS,
134
+ max_tokens: int | None = None,
135
135
  ) -> dict[str, typing.Any]:
136
+ if max_tokens is None:
137
+ max_tokens = self.max_tokens
138
+
136
139
  retry_count = 0
137
140
  last_error = None
138
141
 
@@ -117,8 +117,11 @@ class OpenAIGenericClient(LLMClient):
117
117
  self,
118
118
  messages: list[Message],
119
119
  response_model: type[BaseModel] | None = None,
120
- max_tokens: int = DEFAULT_MAX_TOKENS,
120
+ max_tokens: int | None = None,
121
121
  ) -> dict[str, typing.Any]:
122
+ if max_tokens is None:
123
+ max_tokens = self.max_tokens
124
+
122
125
  retry_count = 0
123
126
  last_error = None
124
127
 
graphiti_core/nodes.py CHANGED
@@ -39,8 +39,6 @@ from graphiti_core.utils.datetime_utils import utc_now
39
39
  logger = logging.getLogger(__name__)
40
40
 
41
41
  ENTITY_NODE_RETURN: LiteralString = """
42
- OPTIONAL MATCH (e:Episodic)-[r:MENTIONS]->(n)
43
- WITH n, collect(e.uuid) AS episodes
44
42
  RETURN
45
43
  n.uuid As uuid,
46
44
  n.name AS name,
@@ -49,8 +47,8 @@ ENTITY_NODE_RETURN: LiteralString = """
49
47
  n.created_at AS created_at,
50
48
  n.summary AS summary,
51
49
  labels(n) AS labels,
52
- properties(n) AS attributes,
53
- episodes"""
50
+ properties(n) AS attributes
51
+ """
54
52
 
55
53
 
56
54
  class EpisodeType(Enum):
@@ -294,9 +292,6 @@ class EpisodicNode(Node):
294
292
  class EntityNode(Node):
295
293
  name_embedding: list[float] | None = Field(default=None, description='embedding of the name')
296
294
  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
- )
300
295
  attributes: dict[str, Any] = Field(
301
296
  default={}, description='Additional attributes of the node. Dependent on node labels'
302
297
  )
@@ -337,8 +332,8 @@ class EntityNode(Node):
337
332
  async def get_by_uuid(cls, driver: AsyncDriver, uuid: str):
338
333
  query = (
339
334
  """
340
- MATCH (n:Entity {uuid: $uuid})
341
- """
335
+ MATCH (n:Entity {uuid: $uuid})
336
+ """
342
337
  + ENTITY_NODE_RETURN
343
338
  )
344
339
  records, _, _ = await driver.execute_query(
@@ -544,7 +539,6 @@ def get_entity_node_from_record(record: Any) -> EntityNode:
544
539
  created_at=record['created_at'].to_native(),
545
540
  summary=record['summary'],
546
541
  attributes=record['attributes'],
547
- episodes=record['episodes'],
548
542
  )
549
543
 
550
544
  entity_node.attributes.pop('uuid', None)
@@ -54,20 +54,6 @@ DEFAULT_MMR_LAMBDA = 0.5
54
54
  MAX_SEARCH_DEPTH = 3
55
55
  MAX_QUERY_LENGTH = 32
56
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
-
71
57
 
72
58
  def fulltext_query(query: str, group_ids: list[str] | None = None):
73
59
  group_ids_filter_list = (
@@ -245,8 +231,8 @@ async def edge_similarity_search(
245
231
 
246
232
  query: LiteralString = (
247
233
  """
248
- MATCH (n:Entity)-[r:RELATES_TO]->(m:Entity)
249
- """
234
+ MATCH (n:Entity)-[r:RELATES_TO]->(m:Entity)
235
+ """
250
236
  + group_filter_query
251
237
  + filter_query
252
238
  + """\nWITH DISTINCT r, vector.similarity.cosine(r.fact_embedding, $search_vector) AS score
@@ -358,12 +344,12 @@ async def node_fulltext_search(
358
344
 
359
345
  query = (
360
346
  """
361
- CALL db.index.fulltext.queryNodes("node_name_and_summary", $query, {limit: $limit})
362
- YIELD node AS n, score
363
- WHERE n:Entity
364
- """
347
+ CALL db.index.fulltext.queryNodes("node_name_and_summary", $query, {limit: $limit})
348
+ YIELD node AS n, score
349
+ WHERE n:Entity
350
+ """
365
351
  + filter_query
366
- + SEARCH_ENTITY_NODE_RETURN
352
+ + ENTITY_NODE_RETURN
367
353
  + """
368
354
  ORDER BY score DESC
369
355
  """
@@ -416,7 +402,7 @@ async def node_similarity_search(
416
402
  + """
417
403
  WITH n, vector.similarity.cosine(n.name_embedding, $search_vector) AS score
418
404
  WHERE score > $min_score"""
419
- + SEARCH_ENTITY_NODE_RETURN
405
+ + ENTITY_NODE_RETURN
420
406
  + """
421
407
  ORDER BY score DESC
422
408
  LIMIT $limit
@@ -72,7 +72,7 @@ async def build_indices_and_constraints(driver: AsyncDriver, delete_existing: bo
72
72
 
73
73
  fulltext_indices: list[LiteralString] = [
74
74
  """CREATE FULLTEXT INDEX episode_content IF NOT EXISTS
75
- FOR (e:Episodic) ON EACH [e.content, e.source, e.group_id]""",
75
+ FOR (e:Episodic) ON EACH [e.content, e.source, e.source_description, e.group_id]""",
76
76
  """CREATE FULLTEXT INDEX node_name_and_summary IF NOT EXISTS
77
77
  FOR (n:Entity) ON EACH [n.name, n.summary, n.group_id]""",
78
78
  """CREATE FULLTEXT INDEX community_name IF NOT EXISTS
@@ -132,10 +132,14 @@ async def retrieve_episodes(
132
132
  Returns:
133
133
  list[EpisodicNode]: A list of EpisodicNode objects representing the retrieved episodes.
134
134
  """
135
- result = await driver.execute_query(
135
+ group_id_filter: LiteralString = 'AND e.group_id IN $group_ids' if group_ids and len(group_ids) > 0 else ''
136
+
137
+ query: LiteralString = (
136
138
  """
137
- MATCH (e:Episodic) WHERE e.valid_at <= $reference_time
138
- AND ($group_ids IS NULL) OR e.group_id in $group_ids
139
+ MATCH (e:Episodic) WHERE e.valid_at <= $reference_time
140
+ """
141
+ + group_id_filter
142
+ + """
139
143
  RETURN e.content AS content,
140
144
  e.created_at AS created_at,
141
145
  e.valid_at AS valid_at,
@@ -144,9 +148,13 @@ async def retrieve_episodes(
144
148
  e.name AS name,
145
149
  e.source_description AS source_description,
146
150
  e.source AS source
147
- ORDER BY e.created_at DESC
151
+ ORDER BY e.valid_at DESC
148
152
  LIMIT $num_episodes
149
- """,
153
+ """
154
+ )
155
+
156
+ result = await driver.execute_query(
157
+ query,
150
158
  reference_time=reference_time,
151
159
  num_episodes=last_n,
152
160
  group_ids=group_ids,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: graphiti-core
3
- Version: 0.10.4
3
+ Version: 0.10.5
4
4
  Summary: A temporal graph building library
5
5
  License: Apache-2.0
6
6
  Author: Paul Paliychuk
@@ -40,14 +40,22 @@ Description-Content-Type: text/markdown
40
40
  Graphiti
41
41
  </h1>
42
42
  <h2 align="center"> Build Real-Time Knowledge Graphs for AI Agents</h2>
43
- <br />
43
+ <div align="center">
44
44
 
45
- [![Discord](https://dcbadge.vercel.app/api/server/W8Kw6bsgXQ?style=flat)](https://discord.com/invite/W8Kw6bsgXQ)
46
- [![Lint](https://github.com/getzep/Graphiti/actions/workflows/lint.yml/badge.svg)](https://github.com/getzep/Graphiti/actions/workflows/lint.yml)
45
+
46
+ [![Lint](https://github.com/getzep/Graphiti/actions/workflows/lint.yml/badge.svg?style=flat)](https://github.com/getzep/Graphiti/actions/workflows/lint.yml)
47
47
  [![Unit Tests](https://github.com/getzep/Graphiti/actions/workflows/unit_tests.yml/badge.svg)](https://github.com/getzep/Graphiti/actions/workflows/unit_tests.yml)
48
48
  [![MyPy Check](https://github.com/getzep/Graphiti/actions/workflows/typecheck.yml/badge.svg)](https://github.com/getzep/Graphiti/actions/workflows/typecheck.yml)
49
- [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/getzep/Graphiti)
50
49
 
50
+ [![Discord](https://dcbadge.vercel.app/api/server/W8Kw6bsgXQ?style=flat)](https://discord.com/invite/W8Kw6bsgXQ)
51
+ [![arXiv](https://img.shields.io/badge/arXiv-2501.13956-b31b1b.svg?style=flat)](https://arxiv.org/abs/2501.13956)
52
+ [![Release](https://img.shields.io/github/v/release/getzep/graphiti?style=flat&label=Release&color=limegreen)](https://github.com/getzep/graphiti/releases)
53
+
54
+ </div>
55
+ <div align="center">
56
+
57
+ <a href="https://trendshift.io/repositories/12986" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12986" alt="getzep%2Fgraphiti | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
58
+ </div>
51
59
  :star: _Help us reach more developers and grow the Graphiti community. Star this repo!_
52
60
  <br />
53
61
 
@@ -13,21 +13,21 @@ graphiti_core/errors.py,sha256=Nib1uQx2cO_VOizupmRjpFfmuRg-hFAVqTtZAuBehR8,2405
13
13
  graphiti_core/graphiti.py,sha256=6YcBSpUSpcQ_DJ4mWaFtmaTuB988U029vhTUz6axliU,30825
14
14
  graphiti_core/helpers.py,sha256=7BQzUBFmoBDA2OIDdFtoN4W-vXOhPRIsF0uDb7PsNi0,2913
15
15
  graphiti_core/llm_client/__init__.py,sha256=PA80TSMeX-sUXITXEAxMDEt3gtfZgcJrGJUcyds1mSo,207
16
- graphiti_core/llm_client/anthropic_client.py,sha256=qVLtRdlYksdl221lIBv7saOmuJtgG5p3af0HUsVxseM,12926
17
- graphiti_core/llm_client/client.py,sha256=jLyrn--opI6_ekCgmCaHLvC9XRhU25HYeoKVIivPHgQ,5507
16
+ graphiti_core/llm_client/anthropic_client.py,sha256=u-vI3GC8I8V0nHQF_8vLttZ0R4ncWA2c6Ekb_a0VRwg,12992
17
+ graphiti_core/llm_client/client.py,sha256=YHX8IYRhAOdg5g7ZLw66GkkjgyFy4QaPGWCiYdpeLpk,5573
18
18
  graphiti_core/llm_client/config.py,sha256=JO-biZwGwakTKGKyNQQqt9fjqyXxtqP-h0sB4wsJ2Kk,2339
19
19
  graphiti_core/llm_client/errors.py,sha256=pn6brRiLW60DAUIXJYKBT6MInrS4ueuH1hNLbn_JbQo,1243
20
- graphiti_core/llm_client/gemini_client.py,sha256=uibmwppDgkEv60FsIhS-oakuafTUFgpu3qr5Kdcbhz4,7321
20
+ graphiti_core/llm_client/gemini_client.py,sha256=BCDcNFTIHNGlbBo28vF7lmgK9wR58fz2cfhhd9YCLro,7387
21
21
  graphiti_core/llm_client/groq_client.py,sha256=EesX0_iFOIvvIc3ql6Xa8EOm0dbGJ_o3VpqyDM83mKg,2498
22
- graphiti_core/llm_client/openai_client.py,sha256=ZqkBa127i5gCIA2UoiXuPDM-357xFK_uwKlgafDhVyQ,6989
23
- graphiti_core/llm_client/openai_generic_client.py,sha256=_8ySd4fQS8iMnUc-wmvvqranbp9coNHlG1Qwsyz-PHM,6801
22
+ graphiti_core/llm_client/openai_client.py,sha256=97-3nEEVSoMSD3lughdcFYHa8MT-JrLbppa-5OMP1CQ,7055
23
+ graphiti_core/llm_client/openai_generic_client.py,sha256=XRt5wbAeeh09DymwMelC7Tls2o65-ulWuDP2RUgFmdA,6867
24
24
  graphiti_core/llm_client/utils.py,sha256=zKpxXEbKa369m4W7RDEf-m56kH46V1Mx3RowcWZEWWs,1000
25
25
  graphiti_core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  graphiti_core/models/edges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  graphiti_core/models/edges/edge_db_queries.py,sha256=2UoLkmazO-FJYqjc3g0LuL-pyjekzQxxed_XHVv_HZE,2671
28
28
  graphiti_core/models/nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  graphiti_core/models/nodes/node_db_queries.py,sha256=AQgRGVO-GgFWfLq1G6k8s86WItwpXruy3Mj4DBli-vM,2145
30
- graphiti_core/nodes.py,sha256=gwrxygjBaC29KfEHkeEMDXWUclc1nPnZxnGYTHfCRTs,17712
30
+ graphiti_core/nodes.py,sha256=0lOIQDB9FKj7rU31xg-H5j6EQvlGXKGYRlWozZ7SU_Q,17464
31
31
  graphiti_core/prompts/__init__.py,sha256=EA-x9xUki9l8wnu2l8ek_oNf75-do5tq5hVq7Zbv8Kw,101
32
32
  graphiti_core/prompts/dedupe_edges.py,sha256=GrLKEHPrEsjK31wQf7AnMJDXaVCrCuJWaNlVAxEd4ks,3543
33
33
  graphiti_core/prompts/dedupe_nodes.py,sha256=VXSb3chBo4l7qzzWxT-sNHJhjY3jNtUBAndnALUcqws,4632
@@ -47,19 +47,19 @@ graphiti_core/search/search_config.py,sha256=VvKg6AB_RPhoe56DBBXHRBXHThAVJ_OLFCy
47
47
  graphiti_core/search/search_config_recipes.py,sha256=4GquRphHhJlpXQhAZOySYnCzBWYoTwxlJj44eTOavZQ,7443
48
48
  graphiti_core/search/search_filters.py,sha256=JkP7NbM4Dor27dne5vAuxbJic12dIJDtWJxNqmVuRec,5884
49
49
  graphiti_core/search/search_helpers.py,sha256=G5Ceaq5Pfgx0Weelqgeylp_pUHwiBnINaUYsDbURJbE,2636
50
- graphiti_core/search/search_utils.py,sha256=MkuY9Pn1Xl_PJXUMiiBe2eEuchIqJTn6K4auJh-bj9Q,27072
50
+ graphiti_core/search/search_utils.py,sha256=J6Ia95CsP6FklVMh85Pj8a7_WGYZm8ll5RsqhTqhlgg,26624
51
51
  graphiti_core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  graphiti_core/utils/bulk_utils.py,sha256=mX7ftT-vbt4ac_BODPyWaSwDCSSCiF0RNu4YRLqF6N0,14733
53
53
  graphiti_core/utils/datetime_utils.py,sha256=Ti-2tnrDFRzBsbfblzsHybsM3jaDLP4-VT2t0VhpIzU,1357
54
54
  graphiti_core/utils/maintenance/__init__.py,sha256=vW4H1KyapTl-OOz578uZABYcpND4wPx3Vt6aAPaXh78,301
55
55
  graphiti_core/utils/maintenance/community_operations.py,sha256=aLMfQ5l8PkNJY3ugqV6UOMG74aI6L9Zz2zFiLBsnKvM,10155
56
56
  graphiti_core/utils/maintenance/edge_operations.py,sha256=9i0PBgaW3dLPTLmx-9j1W86Rb4sPc1bG4Y3TjPn07Gg,12794
57
- graphiti_core/utils/maintenance/graph_data_operations.py,sha256=3JmVIvX19ZdHvOy-gPUBy1A8vBHTv9cH0DESgnPhr50,7055
57
+ graphiti_core/utils/maintenance/graph_data_operations.py,sha256=klbxB8rANnAGWSwRJseRJUWRIvO9joPhQq2DLUfR_Mo,7228
58
58
  graphiti_core/utils/maintenance/node_operations.py,sha256=_MZ0ZcwZsU6id7SUalMgmrytpdn3aUQwOM12dP9OqmE,15932
59
59
  graphiti_core/utils/maintenance/temporal_operations.py,sha256=RdNtubCyYhOVrvcOIq2WppHls1Q-BEjtsN8r38l-Rtc,3691
60
60
  graphiti_core/utils/maintenance/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  graphiti_core/utils/ontology_utils/entity_types_utils.py,sha256=QJX5cG0GSSNF_Mm_yrldr69wjVAbN_MxLhOSznz85Hk,1279
62
- graphiti_core-0.10.4.dist-info/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
63
- graphiti_core-0.10.4.dist-info/METADATA,sha256=Da7oA1ru5YgGpYutZY0XQZcICgc_DIMT6bLZzJp9ylk,14659
64
- graphiti_core-0.10.4.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
65
- graphiti_core-0.10.4.dist-info/RECORD,,
62
+ graphiti_core-0.10.5.dist-info/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
63
+ graphiti_core-0.10.5.dist-info/METADATA,sha256=Xvxzo0uSFEXQG88_SgAP3X4CcNpsGsKBQfaT1CqYp7c,15112
64
+ graphiti_core-0.10.5.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
65
+ graphiti_core-0.10.5.dist-info/RECORD,,