diff --git a/cognee/api/v1/add/routers/get_add_router.py b/cognee/api/v1/add/routers/get_add_router.py index 66b165a38..056345c18 100644 --- a/cognee/api/v1/add/routers/get_add_router.py +++ b/cognee/api/v1/add/routers/get_add_router.py @@ -9,7 +9,7 @@ from fastapi import Form, File, UploadFile, Depends from typing import List, Optional, Union, Literal from cognee.modules.users.models import User -from cognee.modules.users.methods import get_authenticated_user +from cognee.modules.users.methods import get_optional_authenticated_user, get_default_user from cognee.shared.utils import send_telemetry from cognee.modules.pipelines.models import PipelineRunErrored from cognee.shared.logging_utils import get_logger @@ -25,7 +25,7 @@ def get_add_router() -> APIRouter: data: List[UploadFile] = File(default=None), datasetName: Optional[str] = Form(default=None), datasetId: Union[UUID, Literal[""], None] = Form(default=None, examples=[""]), - user: User = Depends(get_authenticated_user), + user: Optional[User] = Depends(get_optional_authenticated_user), ): """ Add data to a dataset for processing and knowledge graph construction. @@ -62,6 +62,10 @@ def get_add_router() -> APIRouter: - The ALLOW_HTTP_REQUESTS environment variable controls URL processing - datasetId value can only be the UUID of an already existing dataset """ + # Use default user for anonymous requests + if user is None: + user = await get_default_user() + send_telemetry( "Add API Endpoint Invoked", user.id, diff --git a/cognee/api/v1/cognify/routers/get_cognify_router.py b/cognee/api/v1/cognify/routers/get_cognify_router.py index 6809f089a..68d756f0d 100644 --- a/cognee/api/v1/cognify/routers/get_cognify_router.py +++ b/cognee/api/v1/cognify/routers/get_cognify_router.py @@ -10,7 +10,7 @@ from starlette.status import WS_1000_NORMAL_CLOSURE, WS_1008_POLICY_VIOLATION from cognee.api.DTO import InDTO from cognee.modules.pipelines.methods import get_pipeline_run from cognee.modules.users.models import User -from cognee.modules.users.methods import get_authenticated_user +from cognee.modules.users.methods import get_optional_authenticated_user, get_default_user from cognee.modules.users.get_user_db import get_user_db_context from cognee.modules.graph.methods import get_formatted_graph_data from cognee.modules.users.get_user_manager import get_user_manager_context @@ -46,7 +46,7 @@ def get_cognify_router() -> APIRouter: router = APIRouter() @router.post("", response_model=dict) - async def cognify(payload: CognifyPayloadDTO, user: User = Depends(get_authenticated_user)): + async def cognify(payload: CognifyPayloadDTO, user: Optional[User] = Depends(get_optional_authenticated_user)): """ Transform datasets into structured knowledge graphs through cognitive processing. @@ -92,6 +92,10 @@ def get_cognify_router() -> APIRouter: ## Next Steps After successful processing, use the search endpoints to query the generated knowledge graph for insights, relationships, and semantic search. """ + # Use default user for anonymous requests + if user is None: + user = await get_default_user() + send_telemetry( "Cognify API Endpoint Invoked", user.id, diff --git a/cognee/api/v1/search/routers/get_search_router.py b/cognee/api/v1/search/routers/get_search_router.py index 0ceeb1abb..0f063f082 100644 --- a/cognee/api/v1/search/routers/get_search_router.py +++ b/cognee/api/v1/search/routers/get_search_router.py @@ -9,7 +9,7 @@ from cognee.api.DTO import InDTO, OutDTO from cognee.modules.users.exceptions.exceptions import PermissionDeniedError 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.modules.users.methods import get_optional_authenticated_user, get_default_user from cognee.shared.utils import send_telemetry @@ -33,7 +33,7 @@ def get_search_router() -> APIRouter: created_at: datetime @router.get("", response_model=list[SearchHistoryItem]) - async def get_search_history(user: User = Depends(get_authenticated_user)): + async def get_search_history(user: Optional[User] = Depends(get_optional_authenticated_user)): """ Get search history for the authenticated user. @@ -50,6 +50,10 @@ def get_search_router() -> APIRouter: ## Error Codes - **500 Internal Server Error**: Error retrieving search history """ + # Use default user for anonymous requests + if user is None: + user = await get_default_user() + send_telemetry( "Search API Endpoint Invoked", user.id, @@ -66,7 +70,7 @@ def get_search_router() -> APIRouter: return JSONResponse(status_code=500, content={"error": str(error)}) @router.post("", response_model=list) - async def search(payload: SearchPayloadDTO, user: User = Depends(get_authenticated_user)): + async def search(payload: SearchPayloadDTO, user: Optional[User] = Depends(get_optional_authenticated_user)): """ Search for nodes in the graph database. @@ -93,6 +97,10 @@ def get_search_router() -> APIRouter: - To search datasets not owned by the request sender, dataset UUID is needed - If permission is denied, returns empty list instead of error """ + # Use default user for anonymous requests + if user is None: + user = await get_default_user() + send_telemetry( "Search API Endpoint Invoked", user.id, diff --git a/cognee/modules/users/methods/__init__.py b/cognee/modules/users/methods/__init__.py index 969615b89..7d83cc314 100644 --- a/cognee/modules/users/methods/__init__.py +++ b/cognee/modules/users/methods/__init__.py @@ -5,3 +5,4 @@ from .get_default_user import get_default_user from .get_user_by_email import get_user_by_email from .create_default_user import create_default_user from .get_authenticated_user import get_authenticated_user +from .get_optional_authenticated_user import get_optional_authenticated_user diff --git a/cognee/modules/users/methods/get_optional_authenticated_user.py b/cognee/modules/users/methods/get_optional_authenticated_user.py new file mode 100644 index 000000000..1b82e6051 --- /dev/null +++ b/cognee/modules/users/methods/get_optional_authenticated_user.py @@ -0,0 +1,8 @@ +from ..get_fastapi_users import get_fastapi_users + +# Create optional authenticated user dependency using FastAPI Users' built-in optional parameter +fastapi_users = get_fastapi_users() +get_optional_authenticated_user = fastapi_users.current_user( + optional=True, # Returns None instead of raising HTTPException(401) + active=True # Still require users to be active when authenticated +)