diff --git a/cognee/api/v1/add/routers/get_add_router.py b/cognee/api/v1/add/routers/get_add_router.py index 4d0063cc9..b2e7068b0 100644 --- a/cognee/api/v1/add/routers/get_add_router.py +++ b/cognee/api/v1/add/routers/get_add_router.py @@ -10,6 +10,7 @@ from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry from cognee.modules.pipelines.models import PipelineRunErrored from cognee.shared.logging_utils import get_logger +from cognee import __version__ as cognee_version logger = get_logger() @@ -63,7 +64,11 @@ def get_add_router() -> APIRouter: send_telemetry( "Add API Endpoint Invoked", user.id, - additional_properties={"endpoint": "POST /v1/add", "node_set": node_set}, + additional_properties={ + "endpoint": "POST /v1/add", + "node_set": node_set, + "cognee_version": cognee_version, + }, ) from cognee.api.v1.add import add as cognee_add diff --git a/cognee/api/v1/cognify/routers/get_cognify_router.py b/cognee/api/v1/cognify/routers/get_cognify_router.py index 9e4bdbbfd..231bbcd11 100644 --- a/cognee/api/v1/cognify/routers/get_cognify_router.py +++ b/cognee/api/v1/cognify/routers/get_cognify_router.py @@ -29,7 +29,7 @@ from cognee.modules.pipelines.queues.pipeline_run_info_queues import ( ) from cognee.shared.logging_utils import get_logger from cognee.shared.utils import send_telemetry - +from cognee import __version__ as cognee_version logger = get_logger("api.cognify") @@ -98,6 +98,7 @@ def get_cognify_router() -> APIRouter: user.id, additional_properties={ "endpoint": "POST /v1/cognify", + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/datasets/routers/get_datasets_router.py b/cognee/api/v1/datasets/routers/get_datasets_router.py index be8b5af8d..eff87b3af 100644 --- a/cognee/api/v1/datasets/routers/get_datasets_router.py +++ b/cognee/api/v1/datasets/routers/get_datasets_router.py @@ -24,6 +24,7 @@ from cognee.modules.users.permissions.methods import ( from cognee.modules.graph.methods import get_formatted_graph_data from cognee.modules.pipelines.models import PipelineRunStatus from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version logger = get_logger() @@ -100,6 +101,7 @@ def get_datasets_router() -> APIRouter: user.id, additional_properties={ "endpoint": "GET /v1/datasets", + "cognee_version": cognee_version, }, ) @@ -147,6 +149,7 @@ def get_datasets_router() -> APIRouter: user.id, additional_properties={ "endpoint": "POST /v1/datasets", + "cognee_version": cognee_version, }, ) @@ -201,6 +204,7 @@ def get_datasets_router() -> APIRouter: additional_properties={ "endpoint": f"DELETE /v1/datasets/{str(dataset_id)}", "dataset_id": str(dataset_id), + "cognee_version": cognee_version, }, ) @@ -246,6 +250,7 @@ def get_datasets_router() -> APIRouter: "endpoint": f"DELETE /v1/datasets/{str(dataset_id)}/data/{str(data_id)}", "dataset_id": str(dataset_id), "data_id": str(data_id), + "cognee_version": cognee_version, }, ) @@ -327,6 +332,7 @@ def get_datasets_router() -> APIRouter: additional_properties={ "endpoint": f"GET /v1/datasets/{str(dataset_id)}/data", "dataset_id": str(dataset_id), + "cognee_version": cognee_version, }, ) @@ -387,6 +393,7 @@ def get_datasets_router() -> APIRouter: additional_properties={ "endpoint": "GET /v1/datasets/status", "datasets": [str(dataset_id) for dataset_id in datasets], + "cognee_version": cognee_version, }, ) @@ -433,6 +440,7 @@ def get_datasets_router() -> APIRouter: "endpoint": f"GET /v1/datasets/{str(dataset_id)}/data/{str(data_id)}/raw", "dataset_id": str(dataset_id), "data_id": str(data_id), + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/delete/routers/get_delete_router.py b/cognee/api/v1/delete/routers/get_delete_router.py index 9e6aa5799..3ff97681d 100644 --- a/cognee/api/v1/delete/routers/get_delete_router.py +++ b/cognee/api/v1/delete/routers/get_delete_router.py @@ -6,6 +6,7 @@ from cognee.shared.logging_utils import get_logger from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version logger = get_logger() @@ -39,6 +40,7 @@ def get_delete_router() -> APIRouter: "endpoint": "DELETE /v1/delete", "dataset_id": str(dataset_id), "data_id": str(data_id), + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/memify/routers/get_memify_router.py b/cognee/api/v1/memify/routers/get_memify_router.py index 1976d7414..cc07a3a0c 100644 --- a/cognee/api/v1/memify/routers/get_memify_router.py +++ b/cognee/api/v1/memify/routers/get_memify_router.py @@ -12,6 +12,7 @@ from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry from cognee.modules.pipelines.models import PipelineRunErrored from cognee.shared.logging_utils import get_logger +from cognee import __version__ as cognee_version logger = get_logger() @@ -73,7 +74,7 @@ def get_memify_router() -> APIRouter: send_telemetry( "Memify API Endpoint Invoked", user.id, - additional_properties={"endpoint": "POST /v1/memify"}, + additional_properties={"endpoint": "POST /v1/memify", "cognee_version": cognee_version}, ) if not payload.dataset_id and not payload.dataset_name: diff --git a/cognee/api/v1/permissions/routers/get_permissions_router.py b/cognee/api/v1/permissions/routers/get_permissions_router.py index 637293268..565e95732 100644 --- a/cognee/api/v1/permissions/routers/get_permissions_router.py +++ b/cognee/api/v1/permissions/routers/get_permissions_router.py @@ -7,6 +7,7 @@ from fastapi.responses import JSONResponse from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version def get_permissions_router() -> APIRouter: @@ -48,6 +49,7 @@ def get_permissions_router() -> APIRouter: "endpoint": f"POST /v1/permissions/datasets/{str(principal_id)}", "dataset_ids": str(dataset_ids), "principal_id": str(principal_id), + "cognee_version": cognee_version, }, ) @@ -89,6 +91,7 @@ def get_permissions_router() -> APIRouter: additional_properties={ "endpoint": "POST /v1/permissions/roles", "role_name": role_name, + "cognee_version": cognee_version, }, ) @@ -133,6 +136,7 @@ def get_permissions_router() -> APIRouter: "endpoint": f"POST /v1/permissions/users/{str(user_id)}/roles", "user_id": str(user_id), "role_id": str(role_id), + "cognee_version": cognee_version, }, ) @@ -175,6 +179,7 @@ def get_permissions_router() -> APIRouter: "endpoint": f"POST /v1/permissions/users/{str(user_id)}/tenants", "user_id": str(user_id), "tenant_id": str(tenant_id), + "cognee_version": cognee_version, }, ) @@ -209,6 +214,7 @@ def get_permissions_router() -> APIRouter: additional_properties={ "endpoint": "POST /v1/permissions/tenants", "tenant_name": tenant_name, + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/search/routers/get_search_router.py b/cognee/api/v1/search/routers/get_search_router.py index 36d1c567e..171c03e49 100644 --- a/cognee/api/v1/search/routers/get_search_router.py +++ b/cognee/api/v1/search/routers/get_search_router.py @@ -13,6 +13,7 @@ from cognee.modules.users.models import User from cognee.modules.search.operations import get_history from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version # Note: Datasets sent by name will only map to datasets owned by the request sender @@ -61,9 +62,7 @@ def get_search_router() -> APIRouter: send_telemetry( "Search API Endpoint Invoked", user.id, - additional_properties={ - "endpoint": "GET /v1/search", - }, + additional_properties={"endpoint": "GET /v1/search", "cognee_version": cognee_version}, ) try: @@ -118,6 +117,7 @@ def get_search_router() -> APIRouter: "top_k": payload.top_k, "only_context": payload.only_context, "use_combined_context": payload.use_combined_context, + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/sync/routers/get_sync_router.py b/cognee/api/v1/sync/routers/get_sync_router.py index d74ae4e7d..a7d466c10 100644 --- a/cognee/api/v1/sync/routers/get_sync_router.py +++ b/cognee/api/v1/sync/routers/get_sync_router.py @@ -12,6 +12,7 @@ from cognee.modules.sync.methods import get_running_sync_operations_for_user, ge from cognee.shared.utils import send_telemetry from cognee.shared.logging_utils import get_logger from cognee.api.v1.sync import SyncResponse +from cognee import __version__ as cognee_version from cognee.context_global_variables import set_database_global_context_variables logger = get_logger() @@ -99,6 +100,7 @@ def get_sync_router() -> APIRouter: user.id, additional_properties={ "endpoint": "POST /v1/sync", + "cognee_version": cognee_version, "dataset_ids": [str(id) for id in request.dataset_ids] if request.dataset_ids else "*", @@ -205,6 +207,7 @@ def get_sync_router() -> APIRouter: user.id, additional_properties={ "endpoint": "GET /v1/sync/status", + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/update/routers/get_update_router.py b/cognee/api/v1/update/routers/get_update_router.py index 4101e1e31..95e43b94f 100644 --- a/cognee/api/v1/update/routers/get_update_router.py +++ b/cognee/api/v1/update/routers/get_update_router.py @@ -9,6 +9,7 @@ from cognee.shared.logging_utils import get_logger from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version from cognee.modules.pipelines.models.PipelineRunInfo import ( PipelineRunErrored, ) @@ -64,6 +65,7 @@ def get_update_router() -> APIRouter: "dataset_id": str(dataset_id), "data_id": str(data_id), "node_set": str(node_set), + "cognee_version": cognee_version, }, ) diff --git a/cognee/api/v1/users/routers/get_visualize_router.py b/cognee/api/v1/users/routers/get_visualize_router.py index 95e79d3d5..5dc3868a6 100644 --- a/cognee/api/v1/users/routers/get_visualize_router.py +++ b/cognee/api/v1/users/routers/get_visualize_router.py @@ -8,6 +8,7 @@ from cognee.modules.users.models import User from cognee.context_global_variables import set_database_global_context_variables from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version logger = get_logger() @@ -46,6 +47,7 @@ def get_visualize_router() -> APIRouter: additional_properties={ "endpoint": "GET /v1/visualize", "dataset_id": str(dataset_id), + "cognee_version": cognee_version, }, ) diff --git a/cognee/modules/pipelines/operations/run_tasks_base.py b/cognee/modules/pipelines/operations/run_tasks_base.py index e5f577848..ee2ccfd8c 100644 --- a/cognee/modules/pipelines/operations/run_tasks_base.py +++ b/cognee/modules/pipelines/operations/run_tasks_base.py @@ -2,6 +2,7 @@ import inspect from cognee.shared.logging_utils import get_logger from cognee.modules.users.models import User from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version from ..tasks.task import Task @@ -25,6 +26,7 @@ async def handle_task( user_id=user.id, additional_properties={ "task_name": running_task.executable.__name__, + "cognee_version": cognee_version, }, ) @@ -46,6 +48,7 @@ async def handle_task( user_id=user.id, additional_properties={ "task_name": running_task.executable.__name__, + "cognee_version": cognee_version, }, ) except Exception as error: @@ -58,6 +61,7 @@ async def handle_task( user_id=user.id, additional_properties={ "task_name": running_task.executable.__name__, + "cognee_version": cognee_version, }, ) raise error diff --git a/cognee/modules/pipelines/operations/run_tasks_with_telemetry.py b/cognee/modules/pipelines/operations/run_tasks_with_telemetry.py index a2af18be6..9a52bf854 100644 --- a/cognee/modules/pipelines/operations/run_tasks_with_telemetry.py +++ b/cognee/modules/pipelines/operations/run_tasks_with_telemetry.py @@ -4,6 +4,7 @@ from cognee.modules.settings import get_current_settings from cognee.modules.users.models import User from cognee.shared.logging_utils import get_logger from cognee.shared.utils import send_telemetry +from cognee import __version__ as cognee_version from .run_tasks_base import run_tasks_base from ..tasks.task import Task @@ -26,6 +27,7 @@ async def run_tasks_with_telemetry( user.id, additional_properties={ "pipeline_name": str(pipeline_name), + "cognee_version": cognee_version, } | config, ) @@ -39,7 +41,9 @@ async def run_tasks_with_telemetry( user.id, additional_properties={ "pipeline_name": str(pipeline_name), - }, + "cognee_version": cognee_version, + } + | config, ) except Exception as error: logger.error( @@ -53,6 +57,7 @@ async def run_tasks_with_telemetry( user.id, additional_properties={ "pipeline_name": str(pipeline_name), + "cognee_version": cognee_version, } | config, ) diff --git a/cognee/modules/search/methods/search.py b/cognee/modules/search/methods/search.py index 29f50119c..93c0ef5c8 100644 --- a/cognee/modules/search/methods/search.py +++ b/cognee/modules/search/methods/search.py @@ -24,7 +24,7 @@ from cognee.modules.data.models import Dataset from cognee.modules.data.methods.get_authorized_existing_datasets import ( get_authorized_existing_datasets, ) - +from cognee import __version__ as cognee_version from .get_search_type_tools import get_search_type_tools from .no_access_control_search import no_access_control_search from ..utils.prepare_search_result import prepare_search_result @@ -64,7 +64,11 @@ async def search( Searching by dataset is only available in ENABLE_BACKEND_ACCESS_CONTROL mode """ query = await log_query(query_text, query_type.value, user.id) - send_telemetry("cognee.search EXECUTION STARTED", user.id) + send_telemetry( + "cognee.search EXECUTION STARTED", + user.id, + additional_properties={"cognee_version": cognee_version}, + ) # Use search function filtered by permissions if access control is enabled if os.getenv("ENABLE_BACKEND_ACCESS_CONTROL", "false").lower() == "true": @@ -101,7 +105,11 @@ async def search( ) ] - send_telemetry("cognee.search EXECUTION COMPLETED", user.id) + send_telemetry( + "cognee.search EXECUTION COMPLETED", + user.id, + additional_properties={"cognee_version": cognee_version}, + ) await log_result( query.id, diff --git a/cognee/shared/utils.py b/cognee/shared/utils.py index 90fbb9cd4..08b478adf 100644 --- a/cognee/shared/utils.py +++ b/cognee/shared/utils.py @@ -8,7 +8,7 @@ import http.server import socketserver from threading import Thread import pathlib -from uuid import uuid4 +from uuid import uuid4, uuid5, NAMESPACE_OID from cognee.base_config import get_base_config from cognee.infrastructure.databases.graph import get_graph_engine @@ -51,6 +51,26 @@ def get_anonymous_id(): return anonymous_id +def _sanitize_nested_properties(obj, property_names: list[str]): + """ + Recursively replaces any property whose key matches one of `property_names` + (e.g., ['url', 'path']) in a nested dict or list with a uuid5 hash + of its string value. Returns a new sanitized copy. + """ + if isinstance(obj, dict): + new_obj = {} + for k, v in obj.items(): + if k in property_names and isinstance(v, str): + new_obj[k] = str(uuid5(NAMESPACE_OID, v)) + else: + new_obj[k] = _sanitize_nested_properties(v, property_names) + return new_obj + elif isinstance(obj, list): + return [_sanitize_nested_properties(item, property_names) for item in obj] + else: + return obj + + def send_telemetry(event_name: str, user_id, additional_properties: dict = {}): if os.getenv("TELEMETRY_DISABLED"): return @@ -58,7 +78,9 @@ def send_telemetry(event_name: str, user_id, additional_properties: dict = {}): env = os.getenv("ENV") if env in ["test", "dev"]: return - + additional_properties = _sanitize_nested_properties( + obj=additional_properties, property_names=["url"] + ) current_time = datetime.now(timezone.utc) payload = { "anonymous_id": str(get_anonymous_id()),