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.
- cognee/__init__.py +2 -0
- cognee/alembic/README +1 -0
- cognee/alembic/env.py +107 -0
- cognee/alembic/script.py.mako +26 -0
- cognee/alembic/versions/1a58b986e6e1_enable_delete_for_old_tutorial_notebooks.py +52 -0
- cognee/alembic/versions/1d0bb7fede17_add_pipeline_run_status.py +33 -0
- cognee/alembic/versions/1daae0df1866_incremental_loading.py +48 -0
- cognee/alembic/versions/211ab850ef3d_add_sync_operations_table.py +118 -0
- cognee/alembic/versions/45957f0a9849_add_notebook_table.py +46 -0
- cognee/alembic/versions/46a6ce2bd2b2_expand_dataset_database_with_json_.py +333 -0
- cognee/alembic/versions/482cd6517ce4_add_default_user.py +30 -0
- cognee/alembic/versions/76625596c5c3_expand_dataset_database_for_multi_user.py +98 -0
- cognee/alembic/versions/8057ae7329c2_initial_migration.py +25 -0
- cognee/alembic/versions/9e7a3cb85175_loader_separation.py +104 -0
- cognee/alembic/versions/a1b2c3d4e5f6_add_label_column_to_data.py +38 -0
- cognee/alembic/versions/ab7e313804ae_permission_system_rework.py +236 -0
- cognee/alembic/versions/b9274c27a25a_kuzu_11_migration.py +75 -0
- cognee/alembic/versions/c946955da633_multi_tenant_support.py +137 -0
- cognee/alembic/versions/e1ec1dcb50b6_add_last_accessed_to_data.py +51 -0
- cognee/alembic/versions/e4ebee1091e7_expand_data_model_info.py +140 -0
- cognee/alembic.ini +117 -0
- cognee/api/v1/add/add.py +2 -1
- cognee/api/v1/add/routers/get_add_router.py +2 -0
- cognee/api/v1/cognify/cognify.py +11 -6
- cognee/api/v1/cognify/routers/get_cognify_router.py +8 -0
- cognee/api/v1/config/config.py +60 -0
- cognee/api/v1/datasets/routers/get_datasets_router.py +46 -3
- cognee/api/v1/memify/routers/get_memify_router.py +3 -0
- cognee/api/v1/search/routers/get_search_router.py +21 -6
- cognee/api/v1/search/search.py +21 -5
- cognee/api/v1/sync/routers/get_sync_router.py +3 -3
- cognee/cli/commands/add_command.py +1 -1
- cognee/cli/commands/cognify_command.py +6 -0
- cognee/cli/commands/config_command.py +1 -1
- cognee/context_global_variables.py +5 -1
- cognee/eval_framework/answer_generation/answer_generation_executor.py +7 -8
- cognee/infrastructure/databases/cache/cache_db_interface.py +38 -1
- cognee/infrastructure/databases/cache/config.py +6 -0
- cognee/infrastructure/databases/cache/fscache/FsCacheAdapter.py +21 -0
- cognee/infrastructure/databases/cache/get_cache_engine.py +9 -3
- cognee/infrastructure/databases/cache/redis/RedisAdapter.py +60 -1
- cognee/infrastructure/databases/dataset_database_handler/supported_dataset_database_handlers.py +7 -0
- cognee/infrastructure/databases/graph/get_graph_engine.py +29 -1
- cognee/infrastructure/databases/graph/neo4j_driver/Neo4jAuraDevDatasetDatabaseHandler.py +62 -27
- cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py +17 -4
- cognee/infrastructure/databases/relational/config.py +16 -1
- cognee/infrastructure/databases/relational/create_relational_engine.py +13 -3
- cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +26 -3
- cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +2 -0
- cognee/infrastructure/databases/vector/config.py +6 -0
- cognee/infrastructure/databases/vector/create_vector_engine.py +70 -16
- cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +64 -9
- cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +13 -2
- cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +16 -3
- cognee/infrastructure/databases/vector/models/ScoredResult.py +3 -3
- cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py +16 -3
- cognee/infrastructure/databases/vector/pgvector/PGVectorDatasetDatabaseHandler.py +86 -0
- cognee/infrastructure/databases/vector/pgvector/create_db_and_tables.py +81 -2
- cognee/infrastructure/databases/vector/vector_db_interface.py +8 -0
- cognee/infrastructure/files/utils/get_data_file_path.py +33 -27
- cognee/infrastructure/llm/LLMGateway.py +0 -13
- cognee/infrastructure/llm/prompts/extract_query_time.txt +1 -1
- cognee/infrastructure/llm/prompts/generate_event_entity_prompt.txt +1 -1
- cognee/infrastructure/llm/prompts/generate_event_graph_prompt.txt +1 -1
- cognee/infrastructure/llm/prompts/generate_graph_prompt.txt +2 -2
- cognee/infrastructure/llm/prompts/generate_graph_prompt_guided.txt +1 -1
- cognee/infrastructure/llm/prompts/generate_graph_prompt_oneshot.txt +2 -2
- cognee/infrastructure/llm/prompts/generate_graph_prompt_simple.txt +1 -1
- cognee/infrastructure/llm/prompts/generate_graph_prompt_strict.txt +1 -1
- cognee/infrastructure/llm/prompts/search_type_selector_prompt.txt +6 -6
- cognee/infrastructure/llm/prompts/test.txt +1 -1
- cognee/infrastructure/llm/prompts/translate_content.txt +19 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py +17 -12
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py +31 -25
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py +132 -7
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +29 -5
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/llama_cpp/adapter.py +191 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/llm_interface.py +2 -6
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/mistral/adapter.py +58 -13
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py +0 -1
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py +25 -131
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/types.py +10 -0
- cognee/modules/chunking/models/DocumentChunk.py +0 -1
- cognee/modules/cognify/config.py +2 -0
- cognee/modules/data/models/Data.py +3 -1
- cognee/modules/engine/models/Entity.py +0 -1
- cognee/modules/engine/operations/setup.py +6 -0
- cognee/modules/graph/cognee_graph/CogneeGraph.py +150 -37
- cognee/modules/graph/cognee_graph/CogneeGraphElements.py +48 -2
- cognee/modules/graph/utils/__init__.py +1 -0
- cognee/modules/graph/utils/get_entity_nodes_from_triplets.py +12 -0
- cognee/modules/notebooks/methods/__init__.py +1 -0
- cognee/modules/notebooks/methods/create_notebook.py +0 -34
- cognee/modules/notebooks/methods/create_tutorial_notebooks.py +191 -0
- cognee/modules/notebooks/methods/get_notebooks.py +12 -8
- cognee/modules/notebooks/tutorials/cognee-basics/cell-1.md +3 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-2.md +10 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-3.md +7 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-4.py +28 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-5.py +3 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-6.py +9 -0
- cognee/modules/notebooks/tutorials/cognee-basics/cell-7.py +17 -0
- cognee/modules/notebooks/tutorials/cognee-basics/config.json +4 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-1.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-10.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-11.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-12.py +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-13.md +7 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-14.py +6 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-15.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-16.py +7 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-2.md +9 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-3.md +7 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-4.md +9 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-5.md +5 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-6.py +13 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-7.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-8.md +3 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-9.py +31 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/config.json +4 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/data/copilot_conversations.json +107 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/data/guido_contributions.json +976 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/data/my_developer_rules.md +79 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/data/pep_style_guide.md +74 -0
- cognee/modules/notebooks/tutorials/python-development-with-cognee/data/zen_principles.md +74 -0
- cognee/modules/retrieval/EntityCompletionRetriever.py +51 -38
- cognee/modules/retrieval/__init__.py +0 -1
- cognee/modules/retrieval/base_retriever.py +66 -10
- cognee/modules/retrieval/chunks_retriever.py +57 -49
- cognee/modules/retrieval/coding_rules_retriever.py +12 -5
- cognee/modules/retrieval/completion_retriever.py +29 -28
- cognee/modules/retrieval/cypher_search_retriever.py +25 -20
- cognee/modules/retrieval/graph_completion_context_extension_retriever.py +42 -46
- cognee/modules/retrieval/graph_completion_cot_retriever.py +68 -51
- cognee/modules/retrieval/graph_completion_retriever.py +78 -63
- cognee/modules/retrieval/graph_summary_completion_retriever.py +2 -0
- cognee/modules/retrieval/lexical_retriever.py +34 -12
- cognee/modules/retrieval/natural_language_retriever.py +18 -15
- cognee/modules/retrieval/summaries_retriever.py +51 -34
- cognee/modules/retrieval/temporal_retriever.py +59 -49
- cognee/modules/retrieval/triplet_retriever.py +32 -33
- cognee/modules/retrieval/utils/access_tracking.py +88 -0
- cognee/modules/retrieval/utils/brute_force_triplet_search.py +99 -103
- cognee/modules/retrieval/utils/node_edge_vector_search.py +174 -0
- cognee/modules/search/methods/__init__.py +1 -0
- cognee/modules/search/methods/get_retriever_output.py +53 -0
- cognee/modules/search/methods/get_search_type_retriever_instance.py +252 -0
- cognee/modules/search/methods/search.py +90 -222
- cognee/modules/search/models/SearchResultPayload.py +67 -0
- cognee/modules/search/types/SearchResult.py +1 -8
- cognee/modules/search/types/SearchType.py +1 -2
- cognee/modules/search/types/__init__.py +1 -1
- cognee/modules/search/utils/__init__.py +1 -2
- cognee/modules/search/utils/transform_insights_to_graph.py +2 -2
- cognee/modules/search/utils/{transform_context_to_graph.py → transform_triplets_to_graph.py} +2 -2
- cognee/modules/users/authentication/default/default_transport.py +11 -1
- cognee/modules/users/authentication/get_api_auth_backend.py +2 -1
- cognee/modules/users/authentication/get_client_auth_backend.py +2 -1
- cognee/modules/users/methods/create_user.py +0 -9
- cognee/modules/users/permissions/methods/has_user_management_permission.py +29 -0
- cognee/modules/visualization/cognee_network_visualization.py +1 -1
- cognee/run_migrations.py +48 -0
- cognee/shared/exceptions/__init__.py +1 -3
- cognee/shared/exceptions/exceptions.py +11 -1
- cognee/shared/usage_logger.py +332 -0
- cognee/shared/utils.py +12 -5
- cognee/tasks/chunks/__init__.py +9 -0
- cognee/tasks/cleanup/cleanup_unused_data.py +172 -0
- cognee/tasks/graph/__init__.py +7 -0
- cognee/tasks/ingestion/data_item.py +8 -0
- cognee/tasks/ingestion/ingest_data.py +12 -1
- cognee/tasks/ingestion/save_data_item_to_storage.py +5 -0
- cognee/tasks/memify/__init__.py +8 -0
- cognee/tasks/memify/extract_usage_frequency.py +613 -0
- cognee/tasks/summarization/models.py +0 -2
- cognee/tasks/temporal_graph/__init__.py +0 -1
- cognee/tasks/translation/__init__.py +96 -0
- cognee/tasks/translation/config.py +110 -0
- cognee/tasks/translation/detect_language.py +190 -0
- cognee/tasks/translation/exceptions.py +62 -0
- cognee/tasks/translation/models.py +72 -0
- cognee/tasks/translation/providers/__init__.py +44 -0
- cognee/tasks/translation/providers/azure_provider.py +192 -0
- cognee/tasks/translation/providers/base.py +85 -0
- cognee/tasks/translation/providers/google_provider.py +158 -0
- cognee/tasks/translation/providers/llm_provider.py +143 -0
- cognee/tasks/translation/translate_content.py +282 -0
- cognee/tasks/web_scraper/default_url_crawler.py +6 -2
- cognee/tests/cli_tests/cli_unit_tests/test_cli_commands.py +1 -0
- cognee/tests/cli_tests/cli_unit_tests/test_cli_edge_cases.py +3 -0
- cognee/tests/integration/retrieval/test_brute_force_triplet_search_with_cognify.py +62 -0
- cognee/tests/integration/retrieval/test_chunks_retriever.py +351 -0
- cognee/tests/integration/retrieval/test_graph_completion_retriever.py +276 -0
- cognee/tests/integration/retrieval/test_graph_completion_retriever_context_extension.py +228 -0
- cognee/tests/integration/retrieval/test_graph_completion_retriever_cot.py +217 -0
- cognee/tests/integration/retrieval/test_rag_completion_retriever.py +319 -0
- cognee/tests/integration/retrieval/test_structured_output.py +258 -0
- cognee/tests/integration/retrieval/test_summaries_retriever.py +195 -0
- cognee/tests/integration/retrieval/test_temporal_retriever.py +336 -0
- cognee/tests/integration/retrieval/test_triplet_retriever.py +45 -1
- cognee/tests/integration/shared/test_usage_logger_integration.py +255 -0
- cognee/tests/tasks/translation/README.md +147 -0
- cognee/tests/tasks/translation/__init__.py +1 -0
- cognee/tests/tasks/translation/config_test.py +93 -0
- cognee/tests/tasks/translation/detect_language_test.py +118 -0
- cognee/tests/tasks/translation/providers_test.py +151 -0
- cognee/tests/tasks/translation/translate_content_test.py +213 -0
- cognee/tests/test_chromadb.py +1 -1
- cognee/tests/test_cleanup_unused_data.py +165 -0
- cognee/tests/test_custom_data_label.py +68 -0
- cognee/tests/test_delete_by_id.py +6 -6
- cognee/tests/test_extract_usage_frequency.py +308 -0
- cognee/tests/test_kuzu.py +17 -7
- cognee/tests/test_lancedb.py +3 -1
- cognee/tests/test_library.py +1 -1
- cognee/tests/test_neo4j.py +17 -7
- cognee/tests/test_neptune_analytics_vector.py +3 -1
- cognee/tests/test_permissions.py +172 -187
- cognee/tests/test_pgvector.py +3 -1
- cognee/tests/test_relational_db_migration.py +15 -1
- cognee/tests/test_remote_kuzu.py +3 -1
- cognee/tests/test_s3_file_storage.py +1 -1
- cognee/tests/test_search_db.py +345 -205
- cognee/tests/test_usage_logger_e2e.py +268 -0
- cognee/tests/unit/api/test_get_raw_data_endpoint.py +206 -0
- cognee/tests/unit/eval_framework/answer_generation_test.py +4 -3
- cognee/tests/unit/eval_framework/benchmark_adapters_test.py +25 -0
- cognee/tests/unit/eval_framework/corpus_builder_test.py +33 -4
- cognee/tests/unit/infrastructure/databases/cache/test_cache_config.py +2 -0
- cognee/tests/unit/infrastructure/databases/relational/test_RelationalConfig.py +69 -0
- cognee/tests/unit/modules/graph/cognee_graph_elements_test.py +42 -2
- cognee/tests/unit/modules/graph/cognee_graph_test.py +329 -31
- cognee/tests/unit/modules/retrieval/chunks_retriever_test.py +122 -168
- cognee/tests/unit/modules/retrieval/conversation_history_test.py +338 -0
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +486 -157
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +693 -155
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py +619 -200
- cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py +300 -171
- cognee/tests/unit/modules/retrieval/summaries_retriever_test.py +184 -155
- cognee/tests/unit/modules/retrieval/temporal_retriever_test.py +544 -79
- cognee/tests/unit/modules/retrieval/test_brute_force_triplet_search.py +476 -28
- cognee/tests/unit/modules/retrieval/test_completion.py +343 -0
- cognee/tests/unit/modules/retrieval/test_graph_summary_completion_retriever.py +157 -0
- cognee/tests/unit/modules/retrieval/test_node_edge_vector_search.py +273 -0
- cognee/tests/unit/modules/retrieval/test_user_qa_feedback.py +312 -0
- cognee/tests/unit/modules/retrieval/triplet_retriever_test.py +267 -7
- cognee/tests/unit/modules/search/test_get_search_type_retriever_instance.py +125 -0
- cognee/tests/unit/modules/search/test_search.py +96 -20
- cognee/tests/unit/modules/search/test_search_prepare_search_result_contract.py +190 -0
- cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py +511 -297
- cognee/tests/unit/shared/test_usage_logger.py +241 -0
- cognee/tests/unit/users/permissions/test_has_user_management_permission.py +46 -0
- {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/METADATA +22 -17
- {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/RECORD +258 -157
- cognee/api/.env.example +0 -5
- cognee/modules/retrieval/base_graph_retriever.py +0 -24
- cognee/modules/search/methods/get_search_type_tools.py +0 -223
- cognee/modules/search/methods/no_access_control_search.py +0 -62
- cognee/modules/search/utils/prepare_search_result.py +0 -63
- cognee/tests/test_feedback_enrichment.py +0 -174
- cognee/tests/unit/modules/retrieval/structured_output_test.py +0 -204
- {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/WHEEL +0 -0
- {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/entry_points.txt +0 -0
- {cognee-0.5.1.dist-info → cognee-0.5.2.dist-info}/licenses/LICENSE +0 -0
- {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
|
+
)
|