cognee 0.5.1__py3-none-any.whl → 0.5.2__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.
Files changed (265) hide show
  1. cognee/__init__.py +2 -0
  2. cognee/alembic/README +1 -0
  3. cognee/alembic/env.py +107 -0
  4. cognee/alembic/script.py.mako +26 -0
  5. cognee/alembic/versions/1a58b986e6e1_enable_delete_for_old_tutorial_notebooks.py +52 -0
  6. cognee/alembic/versions/1d0bb7fede17_add_pipeline_run_status.py +33 -0
  7. cognee/alembic/versions/1daae0df1866_incremental_loading.py +48 -0
  8. cognee/alembic/versions/211ab850ef3d_add_sync_operations_table.py +118 -0
  9. cognee/alembic/versions/45957f0a9849_add_notebook_table.py +46 -0
  10. cognee/alembic/versions/46a6ce2bd2b2_expand_dataset_database_with_json_.py +333 -0
  11. cognee/alembic/versions/482cd6517ce4_add_default_user.py +30 -0
  12. cognee/alembic/versions/76625596c5c3_expand_dataset_database_for_multi_user.py +98 -0
  13. cognee/alembic/versions/8057ae7329c2_initial_migration.py +25 -0
  14. cognee/alembic/versions/9e7a3cb85175_loader_separation.py +104 -0
  15. cognee/alembic/versions/a1b2c3d4e5f6_add_label_column_to_data.py +38 -0
  16. cognee/alembic/versions/ab7e313804ae_permission_system_rework.py +236 -0
  17. cognee/alembic/versions/b9274c27a25a_kuzu_11_migration.py +75 -0
  18. cognee/alembic/versions/c946955da633_multi_tenant_support.py +137 -0
  19. cognee/alembic/versions/e1ec1dcb50b6_add_last_accessed_to_data.py +51 -0
  20. cognee/alembic/versions/e4ebee1091e7_expand_data_model_info.py +140 -0
  21. cognee/alembic.ini +117 -0
  22. cognee/api/v1/add/add.py +2 -1
  23. cognee/api/v1/add/routers/get_add_router.py +2 -0
  24. cognee/api/v1/cognify/cognify.py +11 -6
  25. cognee/api/v1/cognify/routers/get_cognify_router.py +8 -0
  26. cognee/api/v1/config/config.py +60 -0
  27. cognee/api/v1/datasets/routers/get_datasets_router.py +46 -3
  28. cognee/api/v1/memify/routers/get_memify_router.py +3 -0
  29. cognee/api/v1/search/routers/get_search_router.py +21 -6
  30. cognee/api/v1/search/search.py +21 -5
  31. cognee/api/v1/sync/routers/get_sync_router.py +3 -3
  32. cognee/cli/commands/add_command.py +1 -1
  33. cognee/cli/commands/cognify_command.py +6 -0
  34. cognee/cli/commands/config_command.py +1 -1
  35. cognee/context_global_variables.py +5 -1
  36. cognee/eval_framework/answer_generation/answer_generation_executor.py +7 -8
  37. cognee/infrastructure/databases/cache/cache_db_interface.py +38 -1
  38. cognee/infrastructure/databases/cache/config.py +6 -0
  39. cognee/infrastructure/databases/cache/fscache/FsCacheAdapter.py +21 -0
  40. cognee/infrastructure/databases/cache/get_cache_engine.py +9 -3
  41. cognee/infrastructure/databases/cache/redis/RedisAdapter.py +60 -1
  42. cognee/infrastructure/databases/dataset_database_handler/supported_dataset_database_handlers.py +7 -0
  43. cognee/infrastructure/databases/graph/get_graph_engine.py +29 -1
  44. cognee/infrastructure/databases/graph/neo4j_driver/Neo4jAuraDevDatasetDatabaseHandler.py +62 -27
  45. cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py +17 -4
  46. cognee/infrastructure/databases/relational/config.py +16 -1
  47. cognee/infrastructure/databases/relational/create_relational_engine.py +13 -3
  48. cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +26 -3
  49. cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +2 -0
  50. cognee/infrastructure/databases/vector/config.py +6 -0
  51. cognee/infrastructure/databases/vector/create_vector_engine.py +70 -16
  52. cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +64 -9
  53. cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +13 -2
  54. cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +16 -3
  55. cognee/infrastructure/databases/vector/models/ScoredResult.py +3 -3
  56. cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py +16 -3
  57. cognee/infrastructure/databases/vector/pgvector/PGVectorDatasetDatabaseHandler.py +86 -0
  58. cognee/infrastructure/databases/vector/pgvector/create_db_and_tables.py +81 -2
  59. cognee/infrastructure/databases/vector/vector_db_interface.py +8 -0
  60. cognee/infrastructure/files/utils/get_data_file_path.py +33 -27
  61. cognee/infrastructure/llm/LLMGateway.py +0 -13
  62. cognee/infrastructure/llm/prompts/extract_query_time.txt +1 -1
  63. cognee/infrastructure/llm/prompts/generate_event_entity_prompt.txt +1 -1
  64. cognee/infrastructure/llm/prompts/generate_event_graph_prompt.txt +1 -1
  65. cognee/infrastructure/llm/prompts/generate_graph_prompt.txt +2 -2
  66. cognee/infrastructure/llm/prompts/generate_graph_prompt_guided.txt +1 -1
  67. cognee/infrastructure/llm/prompts/generate_graph_prompt_oneshot.txt +2 -2
  68. cognee/infrastructure/llm/prompts/generate_graph_prompt_simple.txt +1 -1
  69. cognee/infrastructure/llm/prompts/generate_graph_prompt_strict.txt +1 -1
  70. cognee/infrastructure/llm/prompts/search_type_selector_prompt.txt +6 -6
  71. cognee/infrastructure/llm/prompts/test.txt +1 -1
  72. cognee/infrastructure/llm/prompts/translate_content.txt +19 -0
  73. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py +17 -12
  74. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py +31 -25
  75. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py +132 -7
  76. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +29 -5
  77. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/llama_cpp/adapter.py +191 -0
  78. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/llm_interface.py +2 -6
  79. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/mistral/adapter.py +58 -13
  80. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py +0 -1
  81. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py +25 -131
  82. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/types.py +10 -0
  83. cognee/modules/chunking/models/DocumentChunk.py +0 -1
  84. cognee/modules/cognify/config.py +2 -0
  85. cognee/modules/data/models/Data.py +3 -1
  86. cognee/modules/engine/models/Entity.py +0 -1
  87. cognee/modules/engine/operations/setup.py +6 -0
  88. cognee/modules/graph/cognee_graph/CogneeGraph.py +150 -37
  89. cognee/modules/graph/cognee_graph/CogneeGraphElements.py +48 -2
  90. cognee/modules/graph/utils/__init__.py +1 -0
  91. cognee/modules/graph/utils/get_entity_nodes_from_triplets.py +12 -0
  92. cognee/modules/notebooks/methods/__init__.py +1 -0
  93. cognee/modules/notebooks/methods/create_notebook.py +0 -34
  94. cognee/modules/notebooks/methods/create_tutorial_notebooks.py +191 -0
  95. cognee/modules/notebooks/methods/get_notebooks.py +12 -8
  96. cognee/modules/notebooks/tutorials/cognee-basics/cell-1.md +3 -0
  97. cognee/modules/notebooks/tutorials/cognee-basics/cell-2.md +10 -0
  98. cognee/modules/notebooks/tutorials/cognee-basics/cell-3.md +7 -0
  99. cognee/modules/notebooks/tutorials/cognee-basics/cell-4.py +28 -0
  100. cognee/modules/notebooks/tutorials/cognee-basics/cell-5.py +3 -0
  101. cognee/modules/notebooks/tutorials/cognee-basics/cell-6.py +9 -0
  102. cognee/modules/notebooks/tutorials/cognee-basics/cell-7.py +17 -0
  103. cognee/modules/notebooks/tutorials/cognee-basics/config.json +4 -0
  104. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-1.md +3 -0
  105. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-10.md +3 -0
  106. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-11.md +3 -0
  107. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-12.py +3 -0
  108. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-13.md +7 -0
  109. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-14.py +6 -0
  110. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-15.md +3 -0
  111. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-16.py +7 -0
  112. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-2.md +9 -0
  113. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-3.md +7 -0
  114. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-4.md +9 -0
  115. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-5.md +5 -0
  116. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-6.py +13 -0
  117. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-7.md +3 -0
  118. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-8.md +3 -0
  119. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-9.py +31 -0
  120. cognee/modules/notebooks/tutorials/python-development-with-cognee/config.json +4 -0
  121. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/copilot_conversations.json +107 -0
  122. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/guido_contributions.json +976 -0
  123. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/my_developer_rules.md +79 -0
  124. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/pep_style_guide.md +74 -0
  125. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/zen_principles.md +74 -0
  126. cognee/modules/retrieval/EntityCompletionRetriever.py +51 -38
  127. cognee/modules/retrieval/__init__.py +0 -1
  128. cognee/modules/retrieval/base_retriever.py +66 -10
  129. cognee/modules/retrieval/chunks_retriever.py +57 -49
  130. cognee/modules/retrieval/coding_rules_retriever.py +12 -5
  131. cognee/modules/retrieval/completion_retriever.py +29 -28
  132. cognee/modules/retrieval/cypher_search_retriever.py +25 -20
  133. cognee/modules/retrieval/graph_completion_context_extension_retriever.py +42 -46
  134. cognee/modules/retrieval/graph_completion_cot_retriever.py +68 -51
  135. cognee/modules/retrieval/graph_completion_retriever.py +78 -63
  136. cognee/modules/retrieval/graph_summary_completion_retriever.py +2 -0
  137. cognee/modules/retrieval/lexical_retriever.py +34 -12
  138. cognee/modules/retrieval/natural_language_retriever.py +18 -15
  139. cognee/modules/retrieval/summaries_retriever.py +51 -34
  140. cognee/modules/retrieval/temporal_retriever.py +59 -49
  141. cognee/modules/retrieval/triplet_retriever.py +32 -33
  142. cognee/modules/retrieval/utils/access_tracking.py +88 -0
  143. cognee/modules/retrieval/utils/brute_force_triplet_search.py +99 -103
  144. cognee/modules/retrieval/utils/node_edge_vector_search.py +174 -0
  145. cognee/modules/search/methods/__init__.py +1 -0
  146. cognee/modules/search/methods/get_retriever_output.py +53 -0
  147. cognee/modules/search/methods/get_search_type_retriever_instance.py +252 -0
  148. cognee/modules/search/methods/search.py +90 -222
  149. cognee/modules/search/models/SearchResultPayload.py +67 -0
  150. cognee/modules/search/types/SearchResult.py +1 -8
  151. cognee/modules/search/types/SearchType.py +1 -2
  152. cognee/modules/search/types/__init__.py +1 -1
  153. cognee/modules/search/utils/__init__.py +1 -2
  154. cognee/modules/search/utils/transform_insights_to_graph.py +2 -2
  155. cognee/modules/search/utils/{transform_context_to_graph.py → transform_triplets_to_graph.py} +2 -2
  156. cognee/modules/users/authentication/default/default_transport.py +11 -1
  157. cognee/modules/users/authentication/get_api_auth_backend.py +2 -1
  158. cognee/modules/users/authentication/get_client_auth_backend.py +2 -1
  159. cognee/modules/users/methods/create_user.py +0 -9
  160. cognee/modules/users/permissions/methods/has_user_management_permission.py +29 -0
  161. cognee/modules/visualization/cognee_network_visualization.py +1 -1
  162. cognee/run_migrations.py +48 -0
  163. cognee/shared/exceptions/__init__.py +1 -3
  164. cognee/shared/exceptions/exceptions.py +11 -1
  165. cognee/shared/usage_logger.py +332 -0
  166. cognee/shared/utils.py +12 -5
  167. cognee/tasks/chunks/__init__.py +9 -0
  168. cognee/tasks/cleanup/cleanup_unused_data.py +172 -0
  169. cognee/tasks/graph/__init__.py +7 -0
  170. cognee/tasks/ingestion/data_item.py +8 -0
  171. cognee/tasks/ingestion/ingest_data.py +12 -1
  172. cognee/tasks/ingestion/save_data_item_to_storage.py +5 -0
  173. cognee/tasks/memify/__init__.py +8 -0
  174. cognee/tasks/memify/extract_usage_frequency.py +613 -0
  175. cognee/tasks/summarization/models.py +0 -2
  176. cognee/tasks/temporal_graph/__init__.py +0 -1
  177. cognee/tasks/translation/__init__.py +96 -0
  178. cognee/tasks/translation/config.py +110 -0
  179. cognee/tasks/translation/detect_language.py +190 -0
  180. cognee/tasks/translation/exceptions.py +62 -0
  181. cognee/tasks/translation/models.py +72 -0
  182. cognee/tasks/translation/providers/__init__.py +44 -0
  183. cognee/tasks/translation/providers/azure_provider.py +192 -0
  184. cognee/tasks/translation/providers/base.py +85 -0
  185. cognee/tasks/translation/providers/google_provider.py +158 -0
  186. cognee/tasks/translation/providers/llm_provider.py +143 -0
  187. cognee/tasks/translation/translate_content.py +282 -0
  188. cognee/tasks/web_scraper/default_url_crawler.py +6 -2
  189. cognee/tests/cli_tests/cli_unit_tests/test_cli_commands.py +1 -0
  190. cognee/tests/cli_tests/cli_unit_tests/test_cli_edge_cases.py +3 -0
  191. cognee/tests/integration/retrieval/test_brute_force_triplet_search_with_cognify.py +62 -0
  192. cognee/tests/integration/retrieval/test_chunks_retriever.py +351 -0
  193. cognee/tests/integration/retrieval/test_graph_completion_retriever.py +276 -0
  194. cognee/tests/integration/retrieval/test_graph_completion_retriever_context_extension.py +228 -0
  195. cognee/tests/integration/retrieval/test_graph_completion_retriever_cot.py +217 -0
  196. cognee/tests/integration/retrieval/test_rag_completion_retriever.py +319 -0
  197. cognee/tests/integration/retrieval/test_structured_output.py +258 -0
  198. cognee/tests/integration/retrieval/test_summaries_retriever.py +195 -0
  199. cognee/tests/integration/retrieval/test_temporal_retriever.py +336 -0
  200. cognee/tests/integration/retrieval/test_triplet_retriever.py +45 -1
  201. cognee/tests/integration/shared/test_usage_logger_integration.py +255 -0
  202. cognee/tests/tasks/translation/README.md +147 -0
  203. cognee/tests/tasks/translation/__init__.py +1 -0
  204. cognee/tests/tasks/translation/config_test.py +93 -0
  205. cognee/tests/tasks/translation/detect_language_test.py +118 -0
  206. cognee/tests/tasks/translation/providers_test.py +151 -0
  207. cognee/tests/tasks/translation/translate_content_test.py +213 -0
  208. cognee/tests/test_chromadb.py +1 -1
  209. cognee/tests/test_cleanup_unused_data.py +165 -0
  210. cognee/tests/test_custom_data_label.py +68 -0
  211. cognee/tests/test_delete_by_id.py +6 -6
  212. cognee/tests/test_extract_usage_frequency.py +308 -0
  213. cognee/tests/test_kuzu.py +17 -7
  214. cognee/tests/test_lancedb.py +3 -1
  215. cognee/tests/test_library.py +1 -1
  216. cognee/tests/test_neo4j.py +17 -7
  217. cognee/tests/test_neptune_analytics_vector.py +3 -1
  218. cognee/tests/test_permissions.py +172 -187
  219. cognee/tests/test_pgvector.py +3 -1
  220. cognee/tests/test_relational_db_migration.py +15 -1
  221. cognee/tests/test_remote_kuzu.py +3 -1
  222. cognee/tests/test_s3_file_storage.py +1 -1
  223. cognee/tests/test_search_db.py +345 -205
  224. cognee/tests/test_usage_logger_e2e.py +268 -0
  225. cognee/tests/unit/api/test_get_raw_data_endpoint.py +206 -0
  226. cognee/tests/unit/eval_framework/answer_generation_test.py +4 -3
  227. cognee/tests/unit/eval_framework/benchmark_adapters_test.py +25 -0
  228. cognee/tests/unit/eval_framework/corpus_builder_test.py +33 -4
  229. cognee/tests/unit/infrastructure/databases/cache/test_cache_config.py +2 -0
  230. cognee/tests/unit/infrastructure/databases/relational/test_RelationalConfig.py +69 -0
  231. cognee/tests/unit/modules/graph/cognee_graph_elements_test.py +42 -2
  232. cognee/tests/unit/modules/graph/cognee_graph_test.py +329 -31
  233. cognee/tests/unit/modules/retrieval/chunks_retriever_test.py +122 -168
  234. cognee/tests/unit/modules/retrieval/conversation_history_test.py +338 -0
  235. cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +486 -157
  236. cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +693 -155
  237. cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py +619 -200
  238. cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py +300 -171
  239. cognee/tests/unit/modules/retrieval/summaries_retriever_test.py +184 -155
  240. cognee/tests/unit/modules/retrieval/temporal_retriever_test.py +544 -79
  241. cognee/tests/unit/modules/retrieval/test_brute_force_triplet_search.py +476 -28
  242. cognee/tests/unit/modules/retrieval/test_completion.py +343 -0
  243. cognee/tests/unit/modules/retrieval/test_graph_summary_completion_retriever.py +157 -0
  244. cognee/tests/unit/modules/retrieval/test_node_edge_vector_search.py +273 -0
  245. cognee/tests/unit/modules/retrieval/test_user_qa_feedback.py +312 -0
  246. cognee/tests/unit/modules/retrieval/triplet_retriever_test.py +267 -7
  247. cognee/tests/unit/modules/search/test_get_search_type_retriever_instance.py +125 -0
  248. cognee/tests/unit/modules/search/test_search.py +96 -20
  249. cognee/tests/unit/modules/search/test_search_prepare_search_result_contract.py +190 -0
  250. cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py +511 -297
  251. cognee/tests/unit/shared/test_usage_logger.py +241 -0
  252. cognee/tests/unit/users/permissions/test_has_user_management_permission.py +46 -0
  253. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/METADATA +22 -17
  254. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/RECORD +258 -157
  255. cognee/api/.env.example +0 -5
  256. cognee/modules/retrieval/base_graph_retriever.py +0 -24
  257. cognee/modules/search/methods/get_search_type_tools.py +0 -223
  258. cognee/modules/search/methods/no_access_control_search.py +0 -62
  259. cognee/modules/search/utils/prepare_search_result.py +0 -63
  260. cognee/tests/test_feedback_enrichment.py +0 -174
  261. cognee/tests/unit/modules/retrieval/structured_output_test.py +0 -204
  262. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/WHEEL +0 -0
  263. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/entry_points.txt +0 -0
  264. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/licenses/LICENSE +0 -0
  265. {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/licenses/NOTICE.md +0 -0
@@ -0,0 +1,228 @@
1
+ import os
2
+ import pytest
3
+ import pathlib
4
+ import pytest_asyncio
5
+ from typing import Optional, Union
6
+ import cognee
7
+
8
+ from cognee.low_level import setup, DataPoint
9
+ from cognee.tasks.storage import add_data_points
10
+ from cognee.modules.graph.utils import resolve_edges_to_text
11
+ from cognee.modules.retrieval.graph_completion_context_extension_retriever import (
12
+ GraphCompletionContextExtensionRetriever,
13
+ )
14
+
15
+
16
+ @pytest_asyncio.fixture
17
+ async def setup_test_environment_simple():
18
+ """Set up a clean test environment with simple graph data."""
19
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
20
+ system_directory_path = str(
21
+ base_dir / ".cognee_system/test_graph_completion_extension_context_simple"
22
+ )
23
+ data_directory_path = str(
24
+ base_dir / ".data_storage/test_graph_completion_extension_context_simple"
25
+ )
26
+
27
+ cognee.config.system_root_directory(system_directory_path)
28
+ cognee.config.data_root_directory(data_directory_path)
29
+
30
+ await cognee.prune.prune_data()
31
+ await cognee.prune.prune_system(metadata=True)
32
+ await setup()
33
+
34
+ class Company(DataPoint):
35
+ name: str
36
+
37
+ class Person(DataPoint):
38
+ name: str
39
+ works_for: Company
40
+
41
+ company1 = Company(name="Figma")
42
+ company2 = Company(name="Canva")
43
+ person1 = Person(name="Steve Rodger", works_for=company1)
44
+ person2 = Person(name="Ike Loma", works_for=company1)
45
+ person3 = Person(name="Jason Statham", works_for=company1)
46
+ person4 = Person(name="Mike Broski", works_for=company2)
47
+ person5 = Person(name="Christina Mayer", works_for=company2)
48
+
49
+ entities = [company1, company2, person1, person2, person3, person4, person5]
50
+
51
+ await add_data_points(entities)
52
+
53
+ yield
54
+
55
+ try:
56
+ await cognee.prune.prune_data()
57
+ await cognee.prune.prune_system(metadata=True)
58
+ except Exception:
59
+ pass
60
+
61
+
62
+ @pytest_asyncio.fixture
63
+ async def setup_test_environment_complex():
64
+ """Set up a clean test environment with complex graph data."""
65
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
66
+ system_directory_path = str(
67
+ base_dir / ".cognee_system/test_graph_completion_extension_context_complex"
68
+ )
69
+ data_directory_path = str(
70
+ base_dir / ".data_storage/test_graph_completion_extension_context_complex"
71
+ )
72
+
73
+ cognee.config.system_root_directory(system_directory_path)
74
+ cognee.config.data_root_directory(data_directory_path)
75
+
76
+ await cognee.prune.prune_data()
77
+ await cognee.prune.prune_system(metadata=True)
78
+ await setup()
79
+
80
+ class Company(DataPoint):
81
+ name: str
82
+ metadata: dict = {"index_fields": ["name"]}
83
+
84
+ class Car(DataPoint):
85
+ brand: str
86
+ model: str
87
+ year: int
88
+
89
+ class Location(DataPoint):
90
+ country: str
91
+ city: str
92
+
93
+ class Home(DataPoint):
94
+ location: Location
95
+ rooms: int
96
+ sqm: int
97
+
98
+ class Person(DataPoint):
99
+ name: str
100
+ works_for: Company
101
+ owns: Optional[list[Union[Car, Home]]] = None
102
+
103
+ company1 = Company(name="Figma")
104
+ company2 = Company(name="Canva")
105
+
106
+ person1 = Person(name="Mike Rodger", works_for=company1)
107
+ person1.owns = [Car(brand="Toyota", model="Camry", year=2020)]
108
+
109
+ person2 = Person(name="Ike Loma", works_for=company1)
110
+ person2.owns = [
111
+ Car(brand="Tesla", model="Model S", year=2021),
112
+ Home(location=Location(country="USA", city="New York"), sqm=80, rooms=4),
113
+ ]
114
+
115
+ person3 = Person(name="Jason Statham", works_for=company1)
116
+
117
+ person4 = Person(name="Mike Broski", works_for=company2)
118
+ person4.owns = [Car(brand="Ford", model="Mustang", year=1978)]
119
+
120
+ person5 = Person(name="Christina Mayer", works_for=company2)
121
+ person5.owns = [Car(brand="Honda", model="Civic", year=2023)]
122
+
123
+ entities = [company1, company2, person1, person2, person3, person4, person5]
124
+
125
+ await add_data_points(entities)
126
+
127
+ yield
128
+
129
+ try:
130
+ await cognee.prune.prune_data()
131
+ await cognee.prune.prune_system(metadata=True)
132
+ except Exception:
133
+ pass
134
+
135
+
136
+ @pytest_asyncio.fixture
137
+ async def setup_test_environment_empty():
138
+ """Set up a clean test environment without graph data."""
139
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
140
+ system_directory_path = str(
141
+ base_dir / ".cognee_system/test_get_graph_completion_extension_context_on_empty_graph"
142
+ )
143
+ data_directory_path = str(
144
+ base_dir / ".data_storage/test_get_graph_completion_extension_context_on_empty_graph"
145
+ )
146
+
147
+ cognee.config.system_root_directory(system_directory_path)
148
+ cognee.config.data_root_directory(data_directory_path)
149
+
150
+ await cognee.prune.prune_data()
151
+ await cognee.prune.prune_system(metadata=True)
152
+ await setup()
153
+
154
+ yield
155
+
156
+ try:
157
+ await cognee.prune.prune_data()
158
+ await cognee.prune.prune_system(metadata=True)
159
+ except Exception:
160
+ pass
161
+
162
+
163
+ @pytest.mark.asyncio
164
+ async def test_graph_completion_extension_context_simple(setup_test_environment_simple):
165
+ """Integration test: verify GraphCompletionContextExtensionRetriever can retrieve context (simple)."""
166
+ retriever = GraphCompletionContextExtensionRetriever()
167
+ query = "Who works at Canva?"
168
+
169
+ triplets = await retriever.get_retrieved_objects(query)
170
+
171
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
172
+
173
+ assert "Mike Broski --[works_for]--> Canva" in context, "Failed to get Mike Broski"
174
+ assert "Christina Mayer --[works_for]--> Canva" in context, "Failed to get Christina Mayer"
175
+
176
+ answer = await retriever.get_completion_from_context(
177
+ query=query, retrieved_objects=triplets, context=context
178
+ )
179
+
180
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
181
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
182
+ "Answer must contain only non-empty strings"
183
+ )
184
+
185
+
186
+ @pytest.mark.asyncio
187
+ async def test_graph_completion_extension_context_complex(setup_test_environment_complex):
188
+ """Integration test: verify GraphCompletionContextExtensionRetriever can retrieve context (complex)."""
189
+ retriever = GraphCompletionContextExtensionRetriever(top_k=20)
190
+ query = "Who works at Figma and drives Tesla?"
191
+
192
+ triplets = await retriever.get_retrieved_objects(query)
193
+
194
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
195
+
196
+ assert "Mike Rodger --[works_for]--> Figma" in context, "Failed to get Mike Rodger"
197
+ assert "Ike Loma --[works_for]--> Figma" in context, "Failed to get Ike Loma"
198
+ assert "Jason Statham --[works_for]--> Figma" in context, "Failed to get Jason Statham"
199
+
200
+ answer = await retriever.get_completion_from_context(
201
+ query=query, retrieved_objects=triplets, context=context
202
+ )
203
+
204
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
205
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
206
+ "Answer must contain only non-empty strings"
207
+ )
208
+
209
+
210
+ @pytest.mark.asyncio
211
+ async def test_get_graph_completion_extension_context_on_empty_graph(setup_test_environment_empty):
212
+ """Integration test: verify GraphCompletionContextExtensionRetriever handles empty graph correctly."""
213
+ retriever = GraphCompletionContextExtensionRetriever()
214
+ query = "Who works at Figma?"
215
+
216
+ triplets = await retriever.get_retrieved_objects(query)
217
+
218
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
219
+ assert context == "", "Context should be empty on an empty graph"
220
+
221
+ answer = await retriever.get_completion_from_context(
222
+ query=query, retrieved_objects=triplets, context=context
223
+ )
224
+
225
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
226
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
227
+ "Answer must contain only non-empty strings"
228
+ )
@@ -0,0 +1,217 @@
1
+ import pytest
2
+ import pathlib
3
+ import pytest_asyncio
4
+ from typing import Optional, Union
5
+ import cognee
6
+ from cognee.exceptions import CogneeValidationError
7
+
8
+ from cognee.low_level import setup, DataPoint
9
+ from cognee.tasks.storage import add_data_points
10
+ from cognee.modules.retrieval.graph_completion_cot_retriever import GraphCompletionCotRetriever
11
+
12
+
13
+ @pytest_asyncio.fixture
14
+ async def setup_test_environment_simple():
15
+ """Set up a clean test environment with simple graph data."""
16
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
17
+ system_directory_path = str(
18
+ base_dir / ".cognee_system/test_graph_completion_cot_context_simple"
19
+ )
20
+ data_directory_path = str(base_dir / ".data_storage/test_graph_completion_cot_context_simple")
21
+
22
+ cognee.config.system_root_directory(system_directory_path)
23
+ cognee.config.data_root_directory(data_directory_path)
24
+
25
+ await cognee.prune.prune_data()
26
+ await cognee.prune.prune_system(metadata=True)
27
+ await setup()
28
+
29
+ class Company(DataPoint):
30
+ name: str
31
+
32
+ class Person(DataPoint):
33
+ name: str
34
+ works_for: Company
35
+
36
+ company1 = Company(name="Figma")
37
+ company2 = Company(name="Canva")
38
+ person1 = Person(name="Steve Rodger", works_for=company1)
39
+ person2 = Person(name="Ike Loma", works_for=company1)
40
+ person3 = Person(name="Jason Statham", works_for=company1)
41
+ person4 = Person(name="Mike Broski", works_for=company2)
42
+ person5 = Person(name="Christina Mayer", works_for=company2)
43
+
44
+ entities = [company1, company2, person1, person2, person3, person4, person5]
45
+
46
+ await add_data_points(entities)
47
+
48
+ yield
49
+
50
+ try:
51
+ await cognee.prune.prune_data()
52
+ await cognee.prune.prune_system(metadata=True)
53
+ except Exception:
54
+ pass
55
+
56
+
57
+ @pytest_asyncio.fixture
58
+ async def setup_test_environment_complex():
59
+ """Set up a clean test environment with complex graph data."""
60
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
61
+ system_directory_path = str(
62
+ base_dir / ".cognee_system/test_graph_completion_cot_context_complex"
63
+ )
64
+ data_directory_path = str(base_dir / ".data_storage/test_graph_completion_cot_context_complex")
65
+
66
+ cognee.config.system_root_directory(system_directory_path)
67
+ cognee.config.data_root_directory(data_directory_path)
68
+
69
+ await cognee.prune.prune_data()
70
+ await cognee.prune.prune_system(metadata=True)
71
+ await setup()
72
+
73
+ class Company(DataPoint):
74
+ name: str
75
+ metadata: dict = {"index_fields": ["name"]}
76
+
77
+ class Car(DataPoint):
78
+ brand: str
79
+ model: str
80
+ year: int
81
+
82
+ class Location(DataPoint):
83
+ country: str
84
+ city: str
85
+
86
+ class Home(DataPoint):
87
+ location: Location
88
+ rooms: int
89
+ sqm: int
90
+
91
+ class Person(DataPoint):
92
+ name: str
93
+ works_for: Company
94
+ owns: Optional[list[Union[Car, Home]]] = None
95
+
96
+ company1 = Company(name="Figma")
97
+ company2 = Company(name="Canva")
98
+
99
+ person1 = Person(name="Mike Rodger", works_for=company1)
100
+ person1.owns = [Car(brand="Toyota", model="Camry", year=2020)]
101
+
102
+ person2 = Person(name="Ike Loma", works_for=company1)
103
+ person2.owns = [
104
+ Car(brand="Tesla", model="Model S", year=2021),
105
+ Home(location=Location(country="USA", city="New York"), sqm=80, rooms=4),
106
+ ]
107
+
108
+ person3 = Person(name="Jason Statham", works_for=company1)
109
+
110
+ person4 = Person(name="Mike Broski", works_for=company2)
111
+ person4.owns = [Car(brand="Ford", model="Mustang", year=1978)]
112
+
113
+ person5 = Person(name="Christina Mayer", works_for=company2)
114
+ person5.owns = [Car(brand="Honda", model="Civic", year=2023)]
115
+
116
+ entities = [company1, company2, person1, person2, person3, person4, person5]
117
+
118
+ await add_data_points(entities)
119
+
120
+ yield
121
+
122
+ try:
123
+ await cognee.prune.prune_data()
124
+ await cognee.prune.prune_system(metadata=True)
125
+ except Exception:
126
+ pass
127
+
128
+
129
+ @pytest_asyncio.fixture
130
+ async def setup_test_environment_empty():
131
+ """Set up a clean test environment without graph data."""
132
+ base_dir = pathlib.Path(__file__).parent.parent.parent.parent
133
+ system_directory_path = str(
134
+ base_dir / ".cognee_system/test_get_graph_completion_cot_context_on_empty_graph"
135
+ )
136
+ data_directory_path = str(
137
+ base_dir / ".data_storage/test_get_graph_completion_cot_context_on_empty_graph"
138
+ )
139
+
140
+ cognee.config.system_root_directory(system_directory_path)
141
+ cognee.config.data_root_directory(data_directory_path)
142
+
143
+ await cognee.prune.prune_data()
144
+ await cognee.prune.prune_system(metadata=True)
145
+ await setup()
146
+
147
+ yield
148
+
149
+ try:
150
+ await cognee.prune.prune_data()
151
+ await cognee.prune.prune_system(metadata=True)
152
+ except Exception:
153
+ pass
154
+
155
+
156
+ @pytest.mark.asyncio
157
+ async def test_graph_completion_cot_context_simple(setup_test_environment_simple):
158
+ """Integration test: verify GraphCompletionCotRetriever can retrieve context (simple)."""
159
+ retriever = GraphCompletionCotRetriever()
160
+ query = "Who works at Canva?"
161
+
162
+ triplets = await retriever.get_retrieved_objects(query)
163
+
164
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
165
+
166
+ assert "Mike Broski --[works_for]--> Canva" in context, "Failed to get Mike Broski"
167
+ assert "Christina Mayer --[works_for]--> Canva" in context, "Failed to get Christina Mayer"
168
+
169
+ answer = await retriever.get_completion_from_context(
170
+ query=query, retrieved_objects=triplets, context=context
171
+ )
172
+
173
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
174
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
175
+ "Answer must contain only non-empty strings"
176
+ )
177
+
178
+
179
+ @pytest.mark.asyncio
180
+ async def test_graph_completion_cot_context_complex(setup_test_environment_complex):
181
+ """Integration test: verify GraphCompletionCotRetriever can retrieve context (complex)."""
182
+ retriever = GraphCompletionCotRetriever(top_k=20)
183
+ query = "Who works at Figma?"
184
+
185
+ triplets = await retriever.get_retrieved_objects(query)
186
+
187
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
188
+
189
+ assert "Mike Rodger --[works_for]--> Figma" in context, "Failed to get Mike Rodger"
190
+ assert "Ike Loma --[works_for]--> Figma" in context, "Failed to get Ike Loma"
191
+ assert "Jason Statham --[works_for]--> Figma" in context, "Failed to get Jason Statham"
192
+
193
+ answer = await retriever.get_completion_from_context(
194
+ query=query, retrieved_objects=triplets, context=context
195
+ )
196
+
197
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
198
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
199
+ "Answer must contain only non-empty strings"
200
+ )
201
+
202
+
203
+ @pytest.mark.asyncio
204
+ async def test_get_graph_completion_cot_context_on_empty_graph(setup_test_environment_empty):
205
+ """Integration test: verify GraphCompletionCotRetriever handles empty graph correctly."""
206
+ retriever = GraphCompletionCotRetriever()
207
+ query = "Who works at Figma?"
208
+
209
+ triplets = await retriever.get_retrieved_objects(query)
210
+
211
+ context = await retriever.get_context_from_objects(query=query, retrieved_objects=triplets)
212
+ assert context == "", "Context should be empty on an empty graph"
213
+
214
+ with pytest.raises(CogneeValidationError):
215
+ await retriever.get_completion_from_context(
216
+ query=query, retrieved_objects=triplets, context=context
217
+ )