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.
- cognee/__init__.py +2 -0
- cognee/__main__.py +4 -0
- cognee/api/client.py +28 -3
- cognee/api/health.py +10 -13
- cognee/api/v1/add/add.py +20 -6
- cognee/api/v1/add/routers/get_add_router.py +12 -37
- cognee/api/v1/cloud/routers/__init__.py +1 -0
- cognee/api/v1/cloud/routers/get_checks_router.py +23 -0
- cognee/api/v1/cognify/code_graph_pipeline.py +14 -3
- cognee/api/v1/cognify/cognify.py +67 -105
- cognee/api/v1/cognify/routers/get_cognify_router.py +11 -3
- cognee/api/v1/datasets/routers/get_datasets_router.py +16 -5
- cognee/api/v1/memify/routers/__init__.py +1 -0
- cognee/api/v1/memify/routers/get_memify_router.py +100 -0
- cognee/api/v1/notebooks/routers/__init__.py +1 -0
- cognee/api/v1/notebooks/routers/get_notebooks_router.py +96 -0
- cognee/api/v1/responses/default_tools.py +4 -0
- cognee/api/v1/responses/dispatch_function.py +6 -1
- cognee/api/v1/responses/models.py +1 -1
- cognee/api/v1/search/routers/get_search_router.py +20 -1
- cognee/api/v1/search/search.py +17 -4
- cognee/api/v1/sync/__init__.py +17 -0
- cognee/api/v1/sync/routers/__init__.py +3 -0
- cognee/api/v1/sync/routers/get_sync_router.py +241 -0
- cognee/api/v1/sync/sync.py +877 -0
- cognee/api/v1/ui/__init__.py +1 -0
- cognee/api/v1/ui/ui.py +529 -0
- cognee/api/v1/users/routers/get_auth_router.py +13 -1
- cognee/base_config.py +10 -1
- cognee/cli/__init__.py +10 -0
- cognee/cli/_cognee.py +273 -0
- cognee/cli/commands/__init__.py +1 -0
- cognee/cli/commands/add_command.py +80 -0
- cognee/cli/commands/cognify_command.py +128 -0
- cognee/cli/commands/config_command.py +225 -0
- cognee/cli/commands/delete_command.py +80 -0
- cognee/cli/commands/search_command.py +149 -0
- cognee/cli/config.py +33 -0
- cognee/cli/debug.py +21 -0
- cognee/cli/echo.py +45 -0
- cognee/cli/exceptions.py +23 -0
- cognee/cli/minimal_cli.py +97 -0
- cognee/cli/reference.py +26 -0
- cognee/cli/suppress_logging.py +12 -0
- cognee/eval_framework/corpus_builder/corpus_builder_executor.py +2 -2
- cognee/eval_framework/eval_config.py +1 -1
- cognee/infrastructure/databases/graph/config.py +10 -4
- cognee/infrastructure/databases/graph/get_graph_engine.py +4 -9
- cognee/infrastructure/databases/graph/kuzu/adapter.py +199 -2
- cognee/infrastructure/databases/graph/neo4j_driver/adapter.py +138 -0
- cognee/infrastructure/databases/relational/__init__.py +2 -0
- cognee/infrastructure/databases/relational/get_async_session.py +15 -0
- cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +6 -1
- cognee/infrastructure/databases/relational/with_async_session.py +25 -0
- cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +1 -1
- cognee/infrastructure/databases/vector/config.py +13 -6
- cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py +6 -4
- cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +16 -7
- cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +5 -5
- cognee/infrastructure/databases/vector/embeddings/config.py +2 -2
- cognee/infrastructure/databases/vector/embeddings/embedding_rate_limiter.py +2 -6
- cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py +10 -7
- cognee/infrastructure/files/storage/LocalFileStorage.py +9 -0
- cognee/infrastructure/files/storage/S3FileStorage.py +5 -0
- cognee/infrastructure/files/storage/StorageManager.py +7 -1
- cognee/infrastructure/files/storage/storage.py +16 -0
- cognee/infrastructure/files/utils/get_data_file_path.py +14 -9
- cognee/infrastructure/files/utils/get_file_metadata.py +2 -1
- cognee/infrastructure/llm/LLMGateway.py +32 -5
- cognee/infrastructure/llm/config.py +6 -4
- cognee/infrastructure/llm/prompts/extract_query_time.txt +15 -0
- cognee/infrastructure/llm/prompts/generate_event_entity_prompt.txt +25 -0
- cognee/infrastructure/llm/prompts/generate_event_graph_prompt.txt +30 -0
- cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/knowledge_graph/extract_content_graph.py +16 -5
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/__init__.py +2 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/extract_event_entities.py +44 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/__init__.py +1 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/extract_content_graph.py +19 -15
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/extraction/knowledge_graph/extract_event_graph.py +46 -0
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py +3 -3
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py +3 -3
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py +2 -2
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +14 -8
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py +6 -4
- cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py +28 -4
- cognee/infrastructure/llm/tokenizer/Gemini/adapter.py +2 -2
- cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py +3 -3
- cognee/infrastructure/llm/tokenizer/Mistral/adapter.py +3 -3
- cognee/infrastructure/llm/tokenizer/TikToken/adapter.py +6 -6
- cognee/infrastructure/llm/utils.py +7 -7
- cognee/infrastructure/utils/run_sync.py +8 -1
- cognee/modules/chunking/models/DocumentChunk.py +4 -3
- cognee/modules/cloud/exceptions/CloudApiKeyMissingError.py +15 -0
- cognee/modules/cloud/exceptions/CloudConnectionError.py +15 -0
- cognee/modules/cloud/exceptions/__init__.py +2 -0
- cognee/modules/cloud/operations/__init__.py +1 -0
- cognee/modules/cloud/operations/check_api_key.py +25 -0
- cognee/modules/data/deletion/prune_system.py +1 -1
- cognee/modules/data/methods/__init__.py +2 -0
- cognee/modules/data/methods/check_dataset_name.py +1 -1
- cognee/modules/data/methods/create_authorized_dataset.py +19 -0
- cognee/modules/data/methods/get_authorized_dataset.py +11 -5
- cognee/modules/data/methods/get_authorized_dataset_by_name.py +16 -0
- cognee/modules/data/methods/get_dataset_data.py +1 -1
- cognee/modules/data/methods/load_or_create_datasets.py +2 -20
- cognee/modules/engine/models/Event.py +16 -0
- cognee/modules/engine/models/Interval.py +8 -0
- cognee/modules/engine/models/Timestamp.py +13 -0
- cognee/modules/engine/models/__init__.py +3 -0
- cognee/modules/engine/utils/__init__.py +2 -0
- cognee/modules/engine/utils/generate_event_datapoint.py +46 -0
- cognee/modules/engine/utils/generate_timestamp_datapoint.py +51 -0
- cognee/modules/graph/cognee_graph/CogneeGraph.py +2 -2
- cognee/modules/graph/methods/get_formatted_graph_data.py +3 -2
- cognee/modules/graph/utils/__init__.py +1 -0
- cognee/modules/graph/utils/resolve_edges_to_text.py +71 -0
- cognee/modules/memify/__init__.py +1 -0
- cognee/modules/memify/memify.py +118 -0
- cognee/modules/notebooks/methods/__init__.py +5 -0
- cognee/modules/notebooks/methods/create_notebook.py +26 -0
- cognee/modules/notebooks/methods/delete_notebook.py +13 -0
- cognee/modules/notebooks/methods/get_notebook.py +21 -0
- cognee/modules/notebooks/methods/get_notebooks.py +18 -0
- cognee/modules/notebooks/methods/update_notebook.py +17 -0
- cognee/modules/notebooks/models/Notebook.py +53 -0
- cognee/modules/notebooks/models/__init__.py +1 -0
- cognee/modules/notebooks/operations/__init__.py +1 -0
- cognee/modules/notebooks/operations/run_in_local_sandbox.py +55 -0
- cognee/modules/pipelines/__init__.py +1 -1
- cognee/modules/pipelines/exceptions/tasks.py +18 -0
- cognee/modules/pipelines/layers/__init__.py +1 -0
- cognee/modules/pipelines/layers/check_pipeline_run_qualification.py +59 -0
- cognee/modules/pipelines/layers/pipeline_execution_mode.py +127 -0
- cognee/modules/pipelines/layers/reset_dataset_pipeline_run_status.py +28 -0
- cognee/modules/pipelines/layers/resolve_authorized_user_dataset.py +34 -0
- cognee/modules/pipelines/layers/resolve_authorized_user_datasets.py +55 -0
- cognee/modules/pipelines/layers/setup_and_check_environment.py +41 -0
- cognee/modules/pipelines/layers/validate_pipeline_tasks.py +20 -0
- cognee/modules/pipelines/methods/__init__.py +2 -0
- cognee/modules/pipelines/methods/get_pipeline_runs_by_dataset.py +34 -0
- cognee/modules/pipelines/methods/reset_pipeline_run_status.py +16 -0
- cognee/modules/pipelines/operations/__init__.py +0 -1
- cognee/modules/pipelines/operations/log_pipeline_run_initiated.py +1 -1
- cognee/modules/pipelines/operations/pipeline.py +24 -138
- cognee/modules/pipelines/operations/run_tasks.py +17 -41
- cognee/modules/retrieval/base_feedback.py +11 -0
- cognee/modules/retrieval/base_graph_retriever.py +18 -0
- cognee/modules/retrieval/base_retriever.py +1 -1
- cognee/modules/retrieval/code_retriever.py +8 -0
- cognee/modules/retrieval/coding_rules_retriever.py +31 -0
- cognee/modules/retrieval/completion_retriever.py +9 -3
- cognee/modules/retrieval/context_providers/TripletSearchContextProvider.py +1 -0
- cognee/modules/retrieval/cypher_search_retriever.py +1 -9
- cognee/modules/retrieval/graph_completion_context_extension_retriever.py +29 -13
- cognee/modules/retrieval/graph_completion_cot_retriever.py +30 -13
- cognee/modules/retrieval/graph_completion_retriever.py +107 -56
- cognee/modules/retrieval/graph_summary_completion_retriever.py +5 -1
- cognee/modules/retrieval/insights_retriever.py +14 -3
- cognee/modules/retrieval/natural_language_retriever.py +0 -4
- cognee/modules/retrieval/summaries_retriever.py +1 -1
- cognee/modules/retrieval/temporal_retriever.py +152 -0
- cognee/modules/retrieval/user_qa_feedback.py +83 -0
- cognee/modules/retrieval/utils/brute_force_triplet_search.py +7 -32
- cognee/modules/retrieval/utils/completion.py +10 -3
- cognee/modules/retrieval/utils/extract_uuid_from_node.py +18 -0
- cognee/modules/retrieval/utils/models.py +40 -0
- cognee/modules/search/methods/get_search_type_tools.py +168 -0
- cognee/modules/search/methods/no_access_control_search.py +47 -0
- cognee/modules/search/methods/search.py +239 -118
- cognee/modules/search/types/SearchResult.py +21 -0
- cognee/modules/search/types/SearchType.py +3 -0
- cognee/modules/search/types/__init__.py +1 -0
- cognee/modules/search/utils/__init__.py +2 -0
- cognee/modules/search/utils/prepare_search_result.py +41 -0
- cognee/modules/search/utils/transform_context_to_graph.py +38 -0
- cognee/modules/settings/get_settings.py +2 -2
- cognee/modules/sync/__init__.py +1 -0
- cognee/modules/sync/methods/__init__.py +23 -0
- cognee/modules/sync/methods/create_sync_operation.py +53 -0
- cognee/modules/sync/methods/get_sync_operation.py +107 -0
- cognee/modules/sync/methods/update_sync_operation.py +248 -0
- cognee/modules/sync/models/SyncOperation.py +142 -0
- cognee/modules/sync/models/__init__.py +3 -0
- cognee/modules/users/__init__.py +0 -1
- cognee/modules/users/methods/__init__.py +4 -1
- cognee/modules/users/methods/create_user.py +26 -1
- cognee/modules/users/methods/get_authenticated_user.py +36 -42
- cognee/modules/users/methods/get_default_user.py +3 -1
- cognee/modules/users/permissions/methods/get_specific_user_permission_datasets.py +2 -1
- cognee/root_dir.py +19 -0
- cognee/shared/CodeGraphEntities.py +1 -0
- cognee/shared/logging_utils.py +143 -32
- cognee/shared/utils.py +0 -1
- cognee/tasks/codingagents/coding_rule_associations.py +127 -0
- cognee/tasks/graph/extract_graph_from_data.py +6 -2
- cognee/tasks/ingestion/save_data_item_to_storage.py +23 -0
- cognee/tasks/memify/__init__.py +2 -0
- cognee/tasks/memify/extract_subgraph.py +7 -0
- cognee/tasks/memify/extract_subgraph_chunks.py +11 -0
- cognee/tasks/repo_processor/get_local_dependencies.py +2 -0
- cognee/tasks/repo_processor/get_repo_file_dependencies.py +144 -47
- cognee/tasks/storage/add_data_points.py +33 -3
- cognee/tasks/temporal_graph/__init__.py +1 -0
- cognee/tasks/temporal_graph/add_entities_to_event.py +85 -0
- cognee/tasks/temporal_graph/enrich_events.py +34 -0
- cognee/tasks/temporal_graph/extract_events_and_entities.py +32 -0
- cognee/tasks/temporal_graph/extract_knowledge_graph_from_events.py +41 -0
- cognee/tasks/temporal_graph/models.py +49 -0
- cognee/tests/integration/cli/__init__.py +3 -0
- cognee/tests/integration/cli/test_cli_integration.py +331 -0
- cognee/tests/integration/documents/PdfDocument_test.py +2 -2
- cognee/tests/integration/documents/TextDocument_test.py +2 -4
- cognee/tests/integration/documents/UnstructuredDocument_test.py +5 -8
- cognee/tests/{test_deletion.py → test_delete_hard.py} +0 -37
- cognee/tests/test_delete_soft.py +85 -0
- cognee/tests/test_kuzu.py +2 -2
- cognee/tests/test_neo4j.py +2 -2
- cognee/tests/test_permissions.py +3 -3
- cognee/tests/test_relational_db_migration.py +7 -5
- cognee/tests/test_search_db.py +136 -23
- cognee/tests/test_temporal_graph.py +167 -0
- cognee/tests/unit/api/__init__.py +1 -0
- cognee/tests/unit/api/test_conditional_authentication_endpoints.py +246 -0
- cognee/tests/unit/cli/__init__.py +3 -0
- cognee/tests/unit/cli/test_cli_commands.py +483 -0
- cognee/tests/unit/cli/test_cli_edge_cases.py +625 -0
- cognee/tests/unit/cli/test_cli_main.py +173 -0
- cognee/tests/unit/cli/test_cli_runner.py +62 -0
- cognee/tests/unit/cli/test_cli_utils.py +127 -0
- cognee/tests/unit/modules/retrieval/chunks_retriever_test.py +18 -2
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +12 -15
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +10 -15
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py +4 -3
- cognee/tests/unit/modules/retrieval/insights_retriever_test.py +4 -2
- cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py +18 -2
- cognee/tests/unit/modules/retrieval/temporal_retriever_test.py +225 -0
- cognee/tests/unit/modules/users/__init__.py +1 -0
- cognee/tests/unit/modules/users/test_conditional_authentication.py +277 -0
- cognee/tests/unit/processing/utils/utils_test.py +20 -1
- {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/METADATA +13 -9
- {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/RECORD +247 -135
- cognee-0.3.0.dist-info/entry_points.txt +2 -0
- cognee/infrastructure/databases/graph/networkx/adapter.py +0 -1017
- cognee/infrastructure/pipeline/models/Operation.py +0 -60
- cognee/notebooks/github_analysis_step_by_step.ipynb +0 -37
- cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py +0 -7
- cognee/tests/unit/modules/search/search_methods_test.py +0 -223
- /cognee/{infrastructure/databases/graph/networkx → api/v1/memify}/__init__.py +0 -0
- /cognee/{infrastructure/pipeline/models → tasks/codingagents}/__init__.py +0 -0
- {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/WHEEL +0 -0
- {cognee-0.2.3.dev1.dist-info → cognee-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {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
|