cognee 0.2.3.dev1__py3-none-any.whl → 0.3.0__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 (252) hide show
  1. cognee/__init__.py +2 -0
  2. cognee/__main__.py +4 -0
  3. cognee/api/client.py +28 -3
  4. cognee/api/health.py +10 -13
  5. cognee/api/v1/add/add.py +20 -6
  6. cognee/api/v1/add/routers/get_add_router.py +12 -37
  7. cognee/api/v1/cloud/routers/__init__.py +1 -0
  8. cognee/api/v1/cloud/routers/get_checks_router.py +23 -0
  9. cognee/api/v1/cognify/code_graph_pipeline.py +14 -3
  10. cognee/api/v1/cognify/cognify.py +67 -105
  11. cognee/api/v1/cognify/routers/get_cognify_router.py +11 -3
  12. cognee/api/v1/datasets/routers/get_datasets_router.py +16 -5
  13. cognee/api/v1/memify/routers/__init__.py +1 -0
  14. cognee/api/v1/memify/routers/get_memify_router.py +100 -0
  15. cognee/api/v1/notebooks/routers/__init__.py +1 -0
  16. cognee/api/v1/notebooks/routers/get_notebooks_router.py +96 -0
  17. cognee/api/v1/responses/default_tools.py +4 -0
  18. cognee/api/v1/responses/dispatch_function.py +6 -1
  19. cognee/api/v1/responses/models.py +1 -1
  20. cognee/api/v1/search/routers/get_search_router.py +20 -1
  21. cognee/api/v1/search/search.py +17 -4
  22. cognee/api/v1/sync/__init__.py +17 -0
  23. cognee/api/v1/sync/routers/__init__.py +3 -0
  24. cognee/api/v1/sync/routers/get_sync_router.py +241 -0
  25. cognee/api/v1/sync/sync.py +877 -0
  26. cognee/api/v1/ui/__init__.py +1 -0
  27. cognee/api/v1/ui/ui.py +529 -0
  28. cognee/api/v1/users/routers/get_auth_router.py +13 -1
  29. cognee/base_config.py +10 -1
  30. cognee/cli/__init__.py +10 -0
  31. cognee/cli/_cognee.py +273 -0
  32. cognee/cli/commands/__init__.py +1 -0
  33. cognee/cli/commands/add_command.py +80 -0
  34. cognee/cli/commands/cognify_command.py +128 -0
  35. cognee/cli/commands/config_command.py +225 -0
  36. cognee/cli/commands/delete_command.py +80 -0
  37. cognee/cli/commands/search_command.py +149 -0
  38. cognee/cli/config.py +33 -0
  39. cognee/cli/debug.py +21 -0
  40. cognee/cli/echo.py +45 -0
  41. cognee/cli/exceptions.py +23 -0
  42. cognee/cli/minimal_cli.py +97 -0
  43. cognee/cli/reference.py +26 -0
  44. cognee/cli/suppress_logging.py +12 -0
  45. cognee/eval_framework/corpus_builder/corpus_builder_executor.py +2 -2
  46. cognee/eval_framework/eval_config.py +1 -1
  47. cognee/infrastructure/databases/graph/config.py +10 -4
  48. cognee/infrastructure/databases/graph/get_graph_engine.py +4 -9
  49. cognee/infrastructure/databases/graph/kuzu/adapter.py +199 -2
  50. cognee/infrastructure/databases/graph/neo4j_driver/adapter.py +138 -0
  51. cognee/infrastructure/databases/relational/__init__.py +2 -0
  52. cognee/infrastructure/databases/relational/get_async_session.py +15 -0
  53. cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +6 -1
  54. cognee/infrastructure/databases/relational/with_async_session.py +25 -0
  55. cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +1 -1
  56. cognee/infrastructure/databases/vector/config.py +13 -6
  57. cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py +6 -4
  58. cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +16 -7
  59. cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +5 -5
  60. cognee/infrastructure/databases/vector/embeddings/config.py +2 -2
  61. cognee/infrastructure/databases/vector/embeddings/embedding_rate_limiter.py +2 -6
  62. cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py +10 -7
  63. cognee/infrastructure/files/storage/LocalFileStorage.py +9 -0
  64. cognee/infrastructure/files/storage/S3FileStorage.py +5 -0
  65. cognee/infrastructure/files/storage/StorageManager.py +7 -1
  66. cognee/infrastructure/files/storage/storage.py +16 -0
  67. cognee/infrastructure/files/utils/get_data_file_path.py +14 -9
  68. cognee/infrastructure/files/utils/get_file_metadata.py +2 -1
  69. cognee/infrastructure/llm/LLMGateway.py +32 -5
  70. cognee/infrastructure/llm/config.py +6 -4
  71. cognee/infrastructure/llm/prompts/extract_query_time.txt +15 -0
  72. cognee/infrastructure/llm/prompts/generate_event_entity_prompt.txt +25 -0
  73. cognee/infrastructure/llm/prompts/generate_event_graph_prompt.txt +30 -0
  74. cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/knowledge_graph/extract_content_graph.py +16 -5
  75. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/__init__.py +2 -0
  76. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/extract_event_entities.py +44 -0
  77. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/__init__.py +1 -0
  78. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/extract_content_graph.py +19 -15
  79. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/extract_event_graph.py +46 -0
  80. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py +3 -3
  81. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py +3 -3
  82. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py +2 -2
  83. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +14 -8
  84. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py +6 -4
  85. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py +28 -4
  86. cognee/infrastructure/llm/tokenizer/Gemini/adapter.py +2 -2
  87. cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py +3 -3
  88. cognee/infrastructure/llm/tokenizer/Mistral/adapter.py +3 -3
  89. cognee/infrastructure/llm/tokenizer/TikToken/adapter.py +6 -6
  90. cognee/infrastructure/llm/utils.py +7 -7
  91. cognee/infrastructure/utils/run_sync.py +8 -1
  92. cognee/modules/chunking/models/DocumentChunk.py +4 -3
  93. cognee/modules/cloud/exceptions/CloudApiKeyMissingError.py +15 -0
  94. cognee/modules/cloud/exceptions/CloudConnectionError.py +15 -0
  95. cognee/modules/cloud/exceptions/__init__.py +2 -0
  96. cognee/modules/cloud/operations/__init__.py +1 -0
  97. cognee/modules/cloud/operations/check_api_key.py +25 -0
  98. cognee/modules/data/deletion/prune_system.py +1 -1
  99. cognee/modules/data/methods/__init__.py +2 -0
  100. cognee/modules/data/methods/check_dataset_name.py +1 -1
  101. cognee/modules/data/methods/create_authorized_dataset.py +19 -0
  102. cognee/modules/data/methods/get_authorized_dataset.py +11 -5
  103. cognee/modules/data/methods/get_authorized_dataset_by_name.py +16 -0
  104. cognee/modules/data/methods/get_dataset_data.py +1 -1
  105. cognee/modules/data/methods/load_or_create_datasets.py +2 -20
  106. cognee/modules/engine/models/Event.py +16 -0
  107. cognee/modules/engine/models/Interval.py +8 -0
  108. cognee/modules/engine/models/Timestamp.py +13 -0
  109. cognee/modules/engine/models/__init__.py +3 -0
  110. cognee/modules/engine/utils/__init__.py +2 -0
  111. cognee/modules/engine/utils/generate_event_datapoint.py +46 -0
  112. cognee/modules/engine/utils/generate_timestamp_datapoint.py +51 -0
  113. cognee/modules/graph/cognee_graph/CogneeGraph.py +2 -2
  114. cognee/modules/graph/methods/get_formatted_graph_data.py +3 -2
  115. cognee/modules/graph/utils/__init__.py +1 -0
  116. cognee/modules/graph/utils/resolve_edges_to_text.py +71 -0
  117. cognee/modules/memify/__init__.py +1 -0
  118. cognee/modules/memify/memify.py +118 -0
  119. cognee/modules/notebooks/methods/__init__.py +5 -0
  120. cognee/modules/notebooks/methods/create_notebook.py +26 -0
  121. cognee/modules/notebooks/methods/delete_notebook.py +13 -0
  122. cognee/modules/notebooks/methods/get_notebook.py +21 -0
  123. cognee/modules/notebooks/methods/get_notebooks.py +18 -0
  124. cognee/modules/notebooks/methods/update_notebook.py +17 -0
  125. cognee/modules/notebooks/models/Notebook.py +53 -0
  126. cognee/modules/notebooks/models/__init__.py +1 -0
  127. cognee/modules/notebooks/operations/__init__.py +1 -0
  128. cognee/modules/notebooks/operations/run_in_local_sandbox.py +55 -0
  129. cognee/modules/pipelines/__init__.py +1 -1
  130. cognee/modules/pipelines/exceptions/tasks.py +18 -0
  131. cognee/modules/pipelines/layers/__init__.py +1 -0
  132. cognee/modules/pipelines/layers/check_pipeline_run_qualification.py +59 -0
  133. cognee/modules/pipelines/layers/pipeline_execution_mode.py +127 -0
  134. cognee/modules/pipelines/layers/reset_dataset_pipeline_run_status.py +28 -0
  135. cognee/modules/pipelines/layers/resolve_authorized_user_dataset.py +34 -0
  136. cognee/modules/pipelines/layers/resolve_authorized_user_datasets.py +55 -0
  137. cognee/modules/pipelines/layers/setup_and_check_environment.py +41 -0
  138. cognee/modules/pipelines/layers/validate_pipeline_tasks.py +20 -0
  139. cognee/modules/pipelines/methods/__init__.py +2 -0
  140. cognee/modules/pipelines/methods/get_pipeline_runs_by_dataset.py +34 -0
  141. cognee/modules/pipelines/methods/reset_pipeline_run_status.py +16 -0
  142. cognee/modules/pipelines/operations/__init__.py +0 -1
  143. cognee/modules/pipelines/operations/log_pipeline_run_initiated.py +1 -1
  144. cognee/modules/pipelines/operations/pipeline.py +24 -138
  145. cognee/modules/pipelines/operations/run_tasks.py +17 -41
  146. cognee/modules/retrieval/base_feedback.py +11 -0
  147. cognee/modules/retrieval/base_graph_retriever.py +18 -0
  148. cognee/modules/retrieval/base_retriever.py +1 -1
  149. cognee/modules/retrieval/code_retriever.py +8 -0
  150. cognee/modules/retrieval/coding_rules_retriever.py +31 -0
  151. cognee/modules/retrieval/completion_retriever.py +9 -3
  152. cognee/modules/retrieval/context_providers/TripletSearchContextProvider.py +1 -0
  153. cognee/modules/retrieval/cypher_search_retriever.py +1 -9
  154. cognee/modules/retrieval/graph_completion_context_extension_retriever.py +29 -13
  155. cognee/modules/retrieval/graph_completion_cot_retriever.py +30 -13
  156. cognee/modules/retrieval/graph_completion_retriever.py +107 -56
  157. cognee/modules/retrieval/graph_summary_completion_retriever.py +5 -1
  158. cognee/modules/retrieval/insights_retriever.py +14 -3
  159. cognee/modules/retrieval/natural_language_retriever.py +0 -4
  160. cognee/modules/retrieval/summaries_retriever.py +1 -1
  161. cognee/modules/retrieval/temporal_retriever.py +152 -0
  162. cognee/modules/retrieval/user_qa_feedback.py +83 -0
  163. cognee/modules/retrieval/utils/brute_force_triplet_search.py +7 -32
  164. cognee/modules/retrieval/utils/completion.py +10 -3
  165. cognee/modules/retrieval/utils/extract_uuid_from_node.py +18 -0
  166. cognee/modules/retrieval/utils/models.py +40 -0
  167. cognee/modules/search/methods/get_search_type_tools.py +168 -0
  168. cognee/modules/search/methods/no_access_control_search.py +47 -0
  169. cognee/modules/search/methods/search.py +239 -118
  170. cognee/modules/search/types/SearchResult.py +21 -0
  171. cognee/modules/search/types/SearchType.py +3 -0
  172. cognee/modules/search/types/__init__.py +1 -0
  173. cognee/modules/search/utils/__init__.py +2 -0
  174. cognee/modules/search/utils/prepare_search_result.py +41 -0
  175. cognee/modules/search/utils/transform_context_to_graph.py +38 -0
  176. cognee/modules/settings/get_settings.py +2 -2
  177. cognee/modules/sync/__init__.py +1 -0
  178. cognee/modules/sync/methods/__init__.py +23 -0
  179. cognee/modules/sync/methods/create_sync_operation.py +53 -0
  180. cognee/modules/sync/methods/get_sync_operation.py +107 -0
  181. cognee/modules/sync/methods/update_sync_operation.py +248 -0
  182. cognee/modules/sync/models/SyncOperation.py +142 -0
  183. cognee/modules/sync/models/__init__.py +3 -0
  184. cognee/modules/users/__init__.py +0 -1
  185. cognee/modules/users/methods/__init__.py +4 -1
  186. cognee/modules/users/methods/create_user.py +26 -1
  187. cognee/modules/users/methods/get_authenticated_user.py +36 -42
  188. cognee/modules/users/methods/get_default_user.py +3 -1
  189. cognee/modules/users/permissions/methods/get_specific_user_permission_datasets.py +2 -1
  190. cognee/root_dir.py +19 -0
  191. cognee/shared/CodeGraphEntities.py +1 -0
  192. cognee/shared/logging_utils.py +143 -32
  193. cognee/shared/utils.py +0 -1
  194. cognee/tasks/codingagents/coding_rule_associations.py +127 -0
  195. cognee/tasks/graph/extract_graph_from_data.py +6 -2
  196. cognee/tasks/ingestion/save_data_item_to_storage.py +23 -0
  197. cognee/tasks/memify/__init__.py +2 -0
  198. cognee/tasks/memify/extract_subgraph.py +7 -0
  199. cognee/tasks/memify/extract_subgraph_chunks.py +11 -0
  200. cognee/tasks/repo_processor/get_local_dependencies.py +2 -0
  201. cognee/tasks/repo_processor/get_repo_file_dependencies.py +144 -47
  202. cognee/tasks/storage/add_data_points.py +33 -3
  203. cognee/tasks/temporal_graph/__init__.py +1 -0
  204. cognee/tasks/temporal_graph/add_entities_to_event.py +85 -0
  205. cognee/tasks/temporal_graph/enrich_events.py +34 -0
  206. cognee/tasks/temporal_graph/extract_events_and_entities.py +32 -0
  207. cognee/tasks/temporal_graph/extract_knowledge_graph_from_events.py +41 -0
  208. cognee/tasks/temporal_graph/models.py +49 -0
  209. cognee/tests/integration/cli/__init__.py +3 -0
  210. cognee/tests/integration/cli/test_cli_integration.py +331 -0
  211. cognee/tests/integration/documents/PdfDocument_test.py +2 -2
  212. cognee/tests/integration/documents/TextDocument_test.py +2 -4
  213. cognee/tests/integration/documents/UnstructuredDocument_test.py +5 -8
  214. cognee/tests/{test_deletion.py → test_delete_hard.py} +0 -37
  215. cognee/tests/test_delete_soft.py +85 -0
  216. cognee/tests/test_kuzu.py +2 -2
  217. cognee/tests/test_neo4j.py +2 -2
  218. cognee/tests/test_permissions.py +3 -3
  219. cognee/tests/test_relational_db_migration.py +7 -5
  220. cognee/tests/test_search_db.py +136 -23
  221. cognee/tests/test_temporal_graph.py +167 -0
  222. cognee/tests/unit/api/__init__.py +1 -0
  223. cognee/tests/unit/api/test_conditional_authentication_endpoints.py +246 -0
  224. cognee/tests/unit/cli/__init__.py +3 -0
  225. cognee/tests/unit/cli/test_cli_commands.py +483 -0
  226. cognee/tests/unit/cli/test_cli_edge_cases.py +625 -0
  227. cognee/tests/unit/cli/test_cli_main.py +173 -0
  228. cognee/tests/unit/cli/test_cli_runner.py +62 -0
  229. cognee/tests/unit/cli/test_cli_utils.py +127 -0
  230. cognee/tests/unit/modules/retrieval/chunks_retriever_test.py +18 -2
  231. cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +12 -15
  232. cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +10 -15
  233. cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py +4 -3
  234. cognee/tests/unit/modules/retrieval/insights_retriever_test.py +4 -2
  235. cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py +18 -2
  236. cognee/tests/unit/modules/retrieval/temporal_retriever_test.py +225 -0
  237. cognee/tests/unit/modules/users/__init__.py +1 -0
  238. cognee/tests/unit/modules/users/test_conditional_authentication.py +277 -0
  239. cognee/tests/unit/processing/utils/utils_test.py +20 -1
  240. {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/METADATA +13 -9
  241. {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/RECORD +247 -135
  242. cognee-0.3.0.dist-info/entry_points.txt +2 -0
  243. cognee/infrastructure/databases/graph/networkx/adapter.py +0 -1017
  244. cognee/infrastructure/pipeline/models/Operation.py +0 -60
  245. cognee/notebooks/github_analysis_step_by_step.ipynb +0 -37
  246. cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py +0 -7
  247. cognee/tests/unit/modules/search/search_methods_test.py +0 -223
  248. /cognee/{infrastructure/databases/graph/networkx → api/v1/memify}/__init__.py +0 -0
  249. /cognee/{infrastructure/pipeline/models → tasks/codingagents}/__init__.py +0 -0
  250. {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/WHEEL +0 -0
  251. {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/licenses/LICENSE +0 -0
  252. {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/licenses/NOTICE.md +0 -0
@@ -0,0 +1,241 @@
1
+ from uuid import UUID
2
+ from typing import Optional, List
3
+ from fastapi import APIRouter, Depends
4
+ from fastapi.responses import JSONResponse
5
+
6
+
7
+ from cognee.api.DTO import InDTO
8
+ from cognee.modules.users.models import User
9
+ from cognee.modules.users.methods import get_authenticated_user
10
+ from cognee.modules.users.permissions.methods import get_specific_user_permission_datasets
11
+ from cognee.modules.sync.methods import get_running_sync_operations_for_user, get_sync_operation
12
+ from cognee.shared.utils import send_telemetry
13
+ from cognee.shared.logging_utils import get_logger
14
+ from cognee.api.v1.sync import SyncResponse
15
+ from cognee.context_global_variables import set_database_global_context_variables
16
+
17
+ logger = get_logger()
18
+
19
+
20
+ class SyncRequest(InDTO):
21
+ """Request model for sync operations."""
22
+
23
+ dataset_ids: Optional[List[UUID]] = None
24
+
25
+
26
+ def get_sync_router() -> APIRouter:
27
+ router = APIRouter()
28
+
29
+ @router.post("", response_model=dict[str, SyncResponse])
30
+ async def sync_to_cloud(
31
+ request: SyncRequest,
32
+ user: User = Depends(get_authenticated_user),
33
+ ):
34
+ """
35
+ Sync local data to Cognee Cloud.
36
+
37
+ This endpoint triggers synchronization of local Cognee data to your cloud instance.
38
+ It uploads your local datasets, knowledge graphs, and processed data to the cloud
39
+ for backup, sharing, or cloud-based processing.
40
+
41
+ ## Request Body (JSON)
42
+ ```json
43
+ {
44
+ "dataset_ids": ["123e4567-e89b-12d3-a456-426614174000", "456e7890-e12b-34c5-d678-901234567000"]
45
+ }
46
+ ```
47
+
48
+ ## Response
49
+ Returns immediate response for the sync operation:
50
+ - **run_id**: Unique identifier for tracking the background sync operation
51
+ - **status**: Always "started" (operation runs in background)
52
+ - **dataset_ids**: List of dataset IDs being synced
53
+ - **dataset_names**: List of dataset names being synced
54
+ - **message**: Description of the background operation
55
+ - **timestamp**: When the sync was initiated
56
+ - **user_id**: User who initiated the sync
57
+
58
+ ## Cloud Sync Features
59
+ - **Automatic Authentication**: Uses your Cognee Cloud credentials
60
+ - **Data Compression**: Optimizes transfer size for faster uploads
61
+ - **Smart Sync**: Automatically handles data updates efficiently
62
+ - **Progress Tracking**: Monitor sync status with sync_id
63
+ - **Error Recovery**: Automatic retry for failed transfers
64
+ - **Data Validation**: Ensures data integrity during transfer
65
+
66
+ ## Example Usage
67
+ ```bash
68
+ # Sync multiple datasets to cloud by IDs (JSON request)
69
+ curl -X POST "http://localhost:8000/api/v1/sync" \\
70
+ -H "Content-Type: application/json" \\
71
+ -H "Cookie: auth_token=your-token" \\
72
+ -d '{"dataset_ids": ["123e4567-e89b-12d3-a456-426614174000", "456e7890-e12b-34c5-d678-901234567000"]}'
73
+
74
+ # Sync all user datasets (empty request body or null dataset_ids)
75
+ curl -X POST "http://localhost:8000/api/v1/sync" \\
76
+ -H "Content-Type: application/json" \\
77
+ -H "Cookie: auth_token=your-token" \\
78
+ -d '{}'
79
+ ```
80
+
81
+ ## Error Codes
82
+ - **400 Bad Request**: Invalid dataset_ids format
83
+ - **401 Unauthorized**: Invalid or missing authentication
84
+ - **403 Forbidden**: User doesn't have permission to access dataset
85
+ - **404 Not Found**: Dataset not found
86
+ - **409 Conflict**: Sync operation conflict or cloud service unavailable
87
+ - **413 Payload Too Large**: Dataset too large for current cloud plan
88
+ - **429 Too Many Requests**: Rate limit exceeded
89
+
90
+ ## Notes
91
+ - Sync operations run in the background - you get an immediate response
92
+ - Use the returned run_id to track progress (status API coming soon)
93
+ - Large datasets are automatically chunked for efficient transfer
94
+ - Cloud storage usage counts against your plan limits
95
+ - The sync will continue even if you close your connection
96
+ """
97
+ send_telemetry(
98
+ "Cloud Sync API Endpoint Invoked",
99
+ user.id,
100
+ additional_properties={
101
+ "endpoint": "POST /v1/sync",
102
+ "dataset_ids": [str(id) for id in request.dataset_ids]
103
+ if request.dataset_ids
104
+ else "*",
105
+ },
106
+ )
107
+
108
+ from cognee.api.v1.sync import sync as cognee_sync
109
+
110
+ try:
111
+ # Check if user has any running sync operations
112
+ running_syncs = await get_running_sync_operations_for_user(user.id)
113
+ if running_syncs:
114
+ # Return information about the existing sync operation
115
+ existing_sync = running_syncs[0] # Get the most recent running sync
116
+ return JSONResponse(
117
+ status_code=409,
118
+ content={
119
+ "error": "Sync operation already in progress",
120
+ "details": {
121
+ "run_id": existing_sync.run_id,
122
+ "status": "already_running",
123
+ "dataset_ids": existing_sync.dataset_ids,
124
+ "dataset_names": existing_sync.dataset_names,
125
+ "message": f"You have a sync operation already in progress with run_id '{existing_sync.run_id}'. Use the status endpoint to monitor progress, or wait for it to complete before starting a new sync.",
126
+ "timestamp": existing_sync.created_at.isoformat(),
127
+ "progress_percentage": existing_sync.progress_percentage,
128
+ },
129
+ },
130
+ )
131
+
132
+ # Retrieve existing dataset and check permissions
133
+ datasets = await get_specific_user_permission_datasets(
134
+ user.id, "write", request.dataset_ids if request.dataset_ids else None
135
+ )
136
+
137
+ # Execute new cloud sync operation for all datasets
138
+ sync_result = await cognee_sync(
139
+ datasets=datasets,
140
+ user=user,
141
+ )
142
+
143
+ return sync_result
144
+
145
+ except ValueError as e:
146
+ return JSONResponse(status_code=400, content={"error": str(e)})
147
+ except PermissionError as e:
148
+ return JSONResponse(status_code=403, content={"error": str(e)})
149
+ except ConnectionError as e:
150
+ return JSONResponse(
151
+ status_code=409, content={"error": f"Cloud service unavailable: {str(e)}"}
152
+ )
153
+ except Exception as e:
154
+ logger.error(f"Cloud sync operation failed: {str(e)}")
155
+ return JSONResponse(status_code=409, content={"error": "Cloud sync operation failed."})
156
+
157
+ @router.get("/status")
158
+ async def get_sync_status_overview(
159
+ user: User = Depends(get_authenticated_user),
160
+ ):
161
+ """
162
+ Check if there are any running sync operations for the current user.
163
+
164
+ This endpoint provides a simple check to see if the user has any active sync operations
165
+ without needing to know specific run IDs.
166
+
167
+ ## Response
168
+ Returns a simple status overview:
169
+ - **has_running_sync**: Boolean indicating if there are any running syncs
170
+ - **running_sync_count**: Number of currently running sync operations
171
+ - **latest_running_sync** (optional): Information about the most recent running sync if any exists
172
+
173
+ ## Example Usage
174
+ ```bash
175
+ curl -X GET "http://localhost:8000/api/v1/sync/status" \\
176
+ -H "Cookie: auth_token=your-token"
177
+ ```
178
+
179
+ ## Example Responses
180
+
181
+ **No running syncs:**
182
+ ```json
183
+ {
184
+ "has_running_sync": false,
185
+ "running_sync_count": 0
186
+ }
187
+ ```
188
+
189
+ **With running sync:**
190
+ ```json
191
+ {
192
+ "has_running_sync": true,
193
+ "running_sync_count": 1,
194
+ "latest_running_sync": {
195
+ "run_id": "12345678-1234-5678-9012-123456789012",
196
+ "dataset_name": "My Dataset",
197
+ "progress_percentage": 45,
198
+ "created_at": "2025-01-01T00:00:00Z"
199
+ }
200
+ }
201
+ ```
202
+ """
203
+ send_telemetry(
204
+ "Sync Status Overview API Endpoint Invoked",
205
+ user.id,
206
+ additional_properties={
207
+ "endpoint": "GET /v1/sync/status",
208
+ },
209
+ )
210
+
211
+ try:
212
+ # Get any running sync operations for the user
213
+ running_syncs = await get_running_sync_operations_for_user(user.id)
214
+
215
+ response = {
216
+ "has_running_sync": len(running_syncs) > 0,
217
+ "running_sync_count": len(running_syncs),
218
+ }
219
+
220
+ # If there are running syncs, include info about the latest one
221
+ if running_syncs:
222
+ latest_sync = running_syncs[0] # Already ordered by created_at desc
223
+ response["latest_running_sync"] = {
224
+ "run_id": latest_sync.run_id,
225
+ "dataset_ids": latest_sync.dataset_ids,
226
+ "dataset_names": latest_sync.dataset_names,
227
+ "progress_percentage": latest_sync.progress_percentage,
228
+ "created_at": latest_sync.created_at.isoformat()
229
+ if latest_sync.created_at
230
+ else None,
231
+ }
232
+
233
+ return response
234
+
235
+ except Exception as e:
236
+ logger.error(f"Failed to get sync status overview: {str(e)}")
237
+ return JSONResponse(
238
+ status_code=500, content={"error": "Failed to get sync status overview"}
239
+ )
240
+
241
+ return router