graphiti-core 0.5.0rc2__tar.gz → 0.5.0rc3__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 (58) hide show
  1. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/PKG-INFO +1 -1
  2. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/openai_client.py +45 -4
  3. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/pyproject.toml +1 -1
  4. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/LICENSE +0 -0
  5. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/README.md +0 -0
  6. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/__init__.py +0 -0
  7. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/cross_encoder/__init__.py +0 -0
  8. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/cross_encoder/bge_reranker_client.py +0 -0
  9. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/cross_encoder/client.py +0 -0
  10. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/cross_encoder/openai_reranker_client.py +0 -0
  11. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/edges.py +0 -0
  12. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/embedder/__init__.py +0 -0
  13. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/embedder/client.py +0 -0
  14. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/embedder/openai.py +0 -0
  15. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/embedder/voyage.py +0 -0
  16. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/errors.py +0 -0
  17. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/graphiti.py +0 -0
  18. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/helpers.py +0 -0
  19. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/__init__.py +0 -0
  20. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/anthropic_client.py +0 -0
  21. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/client.py +0 -0
  22. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/config.py +0 -0
  23. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/errors.py +0 -0
  24. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/groq_client.py +0 -0
  25. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/llm_client/utils.py +0 -0
  26. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/models/__init__.py +0 -0
  27. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/models/edges/__init__.py +0 -0
  28. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/models/edges/edge_db_queries.py +0 -0
  29. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/models/nodes/__init__.py +0 -0
  30. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/models/nodes/node_db_queries.py +0 -0
  31. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/nodes.py +0 -0
  32. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/__init__.py +0 -0
  33. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/dedupe_edges.py +0 -0
  34. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/dedupe_nodes.py +0 -0
  35. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/eval.py +0 -0
  36. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/extract_edge_dates.py +0 -0
  37. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/extract_edges.py +0 -0
  38. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/extract_nodes.py +0 -0
  39. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/invalidate_edges.py +0 -0
  40. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/lib.py +0 -0
  41. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/models.py +0 -0
  42. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/prompt_helpers.py +0 -0
  43. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/prompts/summarize_nodes.py +0 -0
  44. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/py.typed +0 -0
  45. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/search/__init__.py +0 -0
  46. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/search/search.py +0 -0
  47. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/search/search_config.py +0 -0
  48. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/search/search_config_recipes.py +0 -0
  49. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/search/search_utils.py +0 -0
  50. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/__init__.py +0 -0
  51. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/bulk_utils.py +0 -0
  52. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/__init__.py +0 -0
  53. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/community_operations.py +0 -0
  54. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/edge_operations.py +0 -0
  55. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/graph_data_operations.py +0 -0
  56. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/node_operations.py +0 -0
  57. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/graphiti_core/utils/maintenance/temporal_operations.py +0 -0
  58. {graphiti_core-0.5.0rc2 → graphiti_core-0.5.0rc3}/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.5.0rc2
3
+ Version: 0.5.0rc3
4
4
  Summary: A temporal graph building library
5
5
  License: Apache-2.0
6
6
  Author: Paul Paliychuk
@@ -16,6 +16,7 @@ limitations under the License.
16
16
 
17
17
  import logging
18
18
  import typing
19
+ from typing import ClassVar
19
20
 
20
21
  import openai
21
22
  from openai import AsyncOpenAI
@@ -53,6 +54,9 @@ class OpenAIClient(LLMClient):
53
54
  Generates a response from the language model based on the provided messages.
54
55
  """
55
56
 
57
+ # Class-level constants
58
+ MAX_RETRIES: ClassVar[int] = 2
59
+
56
60
  def __init__(
57
61
  self, config: LLMConfig | None = None, cache: bool = False, client: typing.Any = None
58
62
  ):
@@ -104,7 +108,7 @@ class OpenAIClient(LLMClient):
104
108
  elif response_object.refusal:
105
109
  raise RefusalError(response_object.refusal)
106
110
  else:
107
- raise Exception('No response from LLM')
111
+ raise Exception(f'Invalid response from LLM: {response_object.model_dump()}')
108
112
  except openai.LengthFinishReasonError as e:
109
113
  raise Exception(f'Output length exceeded max tokens {self.max_tokens}: {e}') from e
110
114
  except openai.RateLimitError as e:
@@ -116,6 +120,43 @@ class OpenAIClient(LLMClient):
116
120
  async def generate_response(
117
121
  self, messages: list[Message], response_model: type[BaseModel] | None = None
118
122
  ) -> dict[str, typing.Any]:
119
- response = await self._generate_response(messages, response_model)
120
-
121
- return response
123
+ retry_count = 0
124
+ last_error = None
125
+
126
+ while retry_count <= self.MAX_RETRIES:
127
+ try:
128
+ response = await self._generate_response(messages, response_model)
129
+ return response
130
+ except (RateLimitError, RefusalError):
131
+ # These errors should not trigger retries
132
+ raise
133
+ except (openai.APITimeoutError, openai.APIConnectionError, openai.InternalServerError):
134
+ # Let OpenAI's client handle these retries
135
+ raise
136
+ except Exception as e:
137
+ last_error = e
138
+
139
+ # Don't retry if we've hit the max retries
140
+ if retry_count >= self.MAX_RETRIES:
141
+ logger.error(f'Max retries ({self.MAX_RETRIES}) exceeded. Last error: {e}')
142
+ raise
143
+
144
+ retry_count += 1
145
+
146
+ # Construct a detailed error message for the LLM
147
+ error_context = (
148
+ f'The previous response attempt was invalid. '
149
+ f'Error type: {e.__class__.__name__}. '
150
+ f'Error details: {str(e)}. '
151
+ f'Please try again with a valid response, ensuring the output matches '
152
+ f'the expected format and constraints.'
153
+ )
154
+
155
+ error_message = Message(role='user', content=error_context)
156
+ messages.append(error_message)
157
+ logger.warning(
158
+ f'Retrying after application error (attempt {retry_count}/{self.MAX_RETRIES}): {e}'
159
+ )
160
+
161
+ # If we somehow get here, raise the last error
162
+ raise last_error or Exception('Max retries exceeded with no specific error')
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "graphiti-core"
3
- version = "0.5.0pre2"
3
+ version = "0.5.0pre3"
4
4
  description = "A temporal graph building library"
5
5
  authors = [
6
6
  "Paul Paliychuk <paul@getzep.com>",