-
Notifications
You must be signed in to change notification settings - Fork 89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
added boilerplate for user management #123
Changes from 12 commits
866270b
77e8c1b
e785b30
14e1eba
36e156e
3f5e665
e7b0e71
a93bd53
9616545
218d322
b4d1a73
7930586
797e7ba
66749fa
2717272
401167b
07e2bc1
085ca5e
7d3e124
b5a3b69
9a2cde9
6035010
709a10c
73dd6c2
0519986
cb9bfa2
4749995
7846291
acf41ff
3f35a45
3e3134b
0dad12c
a590c6a
896a2ce
e492a18
ed6e8eb
a34acbc
1c89119
8a63aa3
4f72eb5
6d38bcd
887d4e1
fd20fac
8fa572a
9927855
841e7b5
f808cf1
e3c3f35
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,8 @@ | |
from fastapi.middleware.cors import CORSMiddleware | ||
from pydantic import BaseModel | ||
|
||
from cognee.infrastructure.databases.relational.user_authentication.routers import permission_router | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Reorganize import statements to the top of the file. Imports should be at the top of the file to comply with PEP 8 standards. - from contextlib import asynccontextmanager
- from fastapi import Depends, FastAPI
- from cognee.infrastructure.databases.relational.user_authentication.authentication_db import User, create_db_and_tables
- from cognee.infrastructure.databases.relational.user_authentication.schemas import UserCreate, UserRead, UserUpdate
- from cognee.infrastructure.databases.relational.user_authentication.users import auth_backend, current_active_user, fastapi_users
+ from contextlib import asynccontextmanager
+ from fastapi import Depends, FastAPI
+ from cognee.infrastructure.databases.relational.user_authentication.routers import permission_router
+ from cognee.infrastructure.databases.relational.user_authentication.authentication_db import User, create_db_and_tables
+ from cognee.infrastructure.databases.relational.user_authentication.schemas import UserCreate, UserRead, UserUpdate
+ from cognee.infrastructure.databases.relational.user_authentication.users import auth_backend, current_active_user, fastapi_users Also applies to: 31-32, 53-60 |
||
# Set up logging | ||
logging.basicConfig( | ||
level=logging.INFO, # Set the logging level (e.g., DEBUG, INFO, WARNING, ERROR, CRITICAL) | ||
|
@@ -26,8 +28,13 @@ | |
traces_sample_rate = 1.0, | ||
profiles_sample_rate = 1.0, | ||
) | ||
|
||
app = FastAPI(debug = os.getenv("ENV") != "prod") | ||
from contextlib import asynccontextmanager | ||
@asynccontextmanager | ||
async def lifespan(app: FastAPI): | ||
# Not needed if you setup a migration system like Alembic | ||
await create_db_and_tables() | ||
yield | ||
app = FastAPI(debug = os.getenv("ENV") != "prod", lifespan=lifespan) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove duplicate The - @asynccontextmanager
- async def lifespan(app: FastAPI):
- # Not needed if you setup a migration system like Alembic
- await create_db_and_tables()
- yield Also applies to: 90-95 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Vasilije1990 This one There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove duplicate The - @asynccontextmanager
- async def lifespan(app: FastAPI):
- # Not needed if you setup a migration system like Alembic
- await create_db_and_tables()
- yield Also applies to: 90-95 |
||
|
||
origins = [ | ||
"http://frontend:3000", | ||
|
@@ -43,6 +50,71 @@ | |
allow_headers=["*"], | ||
) | ||
|
||
from contextlib import asynccontextmanager | ||
|
||
from fastapi import Depends, FastAPI | ||
|
||
from cognee.infrastructure.databases.relational.user_authentication.authentication_db import User, create_db_and_tables | ||
from cognee.infrastructure.databases.relational.user_authentication.schemas import UserCreate, UserRead, UserUpdate | ||
from cognee.infrastructure.databases.relational.user_authentication.users import auth_backend, current_active_user, fastapi_users | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Reorganize import statements to the top of the file. Imports should be at the top of the file to comply with PEP 8 standards. - from contextlib import asynccontextmanager
- from fastapi import Depends, FastAPI
- from cognee.infrastructure.databases.relational.user_authentication.authentication_db import User, create_db_and_tables
- from cognee.infrastructure.databases.relational.user_authentication.schemas import UserCreate, UserRead, UserUpdate
- from cognee.infrastructure.databases.relational.user_authentication.users import auth_backend, current_active_user, fastapi_users
+ from contextlib import asynccontextmanager
+ from fastapi import Depends, FastAPI
+ from cognee.infrastructure.databases.relational.user_authentication.authentication_db import User, create_db_and_tables
+ from cognee.infrastructure.databases.relational.user_authentication.schemas import UserCreate, UserRead, UserUpdate
+ from cognee.infrastructure.databases.relational.user_authentication.users import auth_backend, current_active_user, fastapi_users
ToolsRuff
|
||
|
||
app.include_router( | ||
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] | ||
) | ||
app.include_router( | ||
fastapi_users.get_register_router(UserRead, UserCreate), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_reset_password_router(), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_verify_router(UserRead), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_users_router(UserRead, UserUpdate), | ||
prefix="/users", | ||
tags=["users"], | ||
) | ||
|
||
app.include_router(permission_router, prefix="/manage", tags=["management"]) | ||
|
||
@asynccontextmanager | ||
async def lifespan(app: FastAPI): | ||
# Not needed if you setup a migration system like Alembic | ||
await create_db_and_tables() | ||
yield | ||
app.include_router( | ||
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] | ||
) | ||
app.include_router( | ||
fastapi_users.get_register_router(UserRead, UserCreate), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_reset_password_router(), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_verify_router(UserRead), | ||
prefix="/auth", | ||
tags=["auth"], | ||
) | ||
app.include_router( | ||
fastapi_users.get_users_router(UserRead, UserUpdate), | ||
prefix="/users", | ||
tags=["users"], | ||
) | ||
|
||
|
||
|
||
@app.get("/") | ||
async def root(): | ||
""" | ||
|
@@ -267,8 +339,8 @@ def start_api_server(host: str = "0.0.0.0", port: int = 8000): | |
relational_config.create_engine() | ||
|
||
from cognee.modules.data.deletion import prune_system, prune_data | ||
asyncio.run(prune_data()) | ||
asyncio.run(prune_system(metadata = True)) | ||
# asyncio.run(prune_data()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please uncomment this after you are done. |
||
# asyncio.run(prune_system(metadata = True)) | ||
|
||
uvicorn.run(app, host = host, port = port) | ||
except Exception as e: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .authenticate_user import authenticate_user |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,9 @@ | ||||||||||||||||||||||||||||||||||||||||
from cognee.infrastructure.databases.relational.user_authentication.users import authenticate_user_method | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
async def authenticate_user(): | ||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
This function is used to authenticate a user. | ||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
output = await authenticate_user_method() | ||||||||||||||||||||||||||||||||||||||||
return output | ||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling and improve the docstring. The function lacks error handling and the docstring could be more descriptive. Consider adding a try-except block and enhancing the docstring. async def authenticate_user():
- """
- This function is used to authenticate a user.
- """
+ """
+ Authenticate a user.
+
+ Returns:
+ output: The result of the user authentication.
+ """
+ try:
output = await authenticate_user_method()
+ except Exception as e:
+ # Handle the exception (e.g., log the error, raise a custom exception, etc.)
+ raise e
return output Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,8 +1,18 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import asyncio | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import hashlib | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import logging | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import uuid | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from typing import Union | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
from fastapi_users import fastapi_users | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from sqlalchemy.ext.asyncio import AsyncSession | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.infrastructure.databases.graph import get_graph_config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.infrastructure.databases.relational.user_authentication.authentication_db import async_session_maker | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.infrastructure.databases.relational.user_authentication.users import has_permission_document, \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
get_user_permissions, get_async_session_context, fast_api_users_init | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
# from cognee.infrastructure.databases.relational.user_authentication.authentication_db import async_session_maker | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
# from cognee.infrastructure.databases.relational.user_authentication.users import get_user_permissions, fastapi_users | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.cognify.config import get_cognify_config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.infrastructure.databases.relational.config import get_relationaldb_config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.data.processing.document_types.AudioDocument import AudioDocument | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -25,7 +35,13 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_status_lock = asyncio.Lock() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
class PermissionDeniedException(Exception): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self, message: str): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.message = message | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
super().__init__(self.message) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async def cognify(datasets: Union[str, list[str]] = None, root_node_id: str = None): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
relational_config = get_relationaldb_config() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
db_engine = relational_config.database_engine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
create_task_status_table() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -35,68 +51,79 @@ async def cognify(datasets: Union[str, list[str]] = None, root_node_id: str = No | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async def run_cognify_pipeline(dataset_name: str, files: list[dict]): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
async with update_status_lock: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
task_status = get_task_status([dataset_name]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if dataset_name in task_status and task_status[dataset_name] == "DATASET_PROCESSING_STARTED": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
logger.info(f"Dataset {dataset_name} is being processed.") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_STARTED") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cognee_config = get_cognify_config() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
graph_config = get_graph_config() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if graph_config.infer_graph_topology and graph_config.graph_topology_task: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.topology.topology import TopologyEngine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
topology_engine = TopologyEngine(infer=graph_config.infer_graph_topology) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = await topology_engine.add_graph_topology(files = files) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif graph_config.infer_graph_topology and not graph_config.infer_graph_topology: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.topology.topology import TopologyEngine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
topology_engine = TopologyEngine(infer=graph_config.infer_graph_topology) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
await topology_engine.add_graph_topology(graph_config.topology_file_path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif not graph_config.graph_topology_task: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = "ROOT" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
tasks = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(process_documents, parent_node_id = root_node_id, task_config = { "batch_size": 10 }), # Classify documents and save them as a nodes in graph db, extract text chunks based on the document type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(establish_graph_topology, topology_model = KnowledgeGraph), # Set the graph topology for the document chunk data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(expand_knowledge_graph, graph_model = KnowledgeGraph), # Generate knowledge graphs from the document chunks and attach it to chunk nodes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(filter_affected_chunks, collection_name = "chunks"), # Find all affected chunks, so we don't process unchanged chunks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
save_data_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
collection_name = "chunks", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), # Save the document chunks in vector db and as nodes in graph db (connected to the document node and between each other) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run_tasks_parallel([ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
summarize_text_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
summarization_model = cognee_config.summarization_model, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
collection_name = "chunk_summaries", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), # Summarize the document chunks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
classify_text_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
classification_model = cognee_config.classification_model, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
]), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(remove_obsolete_chunks), # Remove the obsolete document chunks. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
pipeline = run_tasks(tasks, [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
PdfDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "pdf" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
AudioDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "audio" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImageDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "image" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TextDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
for file in files | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async for result in pipeline: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
print(result) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_FINISHED") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
except Exception as error: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_ERROR") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise error | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
for file in files: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
file["id"] = str(uuid.uuid4()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
file["name"] = file["name"].replace(" ", "_") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async with get_async_session_context() as session: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
active_user = await fast_api_users_init() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
out = await has_permission_document(active_user.current_user(active=True), file["id"], "write", session) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove assignment to unused variable The variable - out = await has_permission_document(active_user.current_user(active=True), file["id"], "write", session)
+ await has_permission_document(active_user.current_user(active=True), file["id"], "write", session) Committable suggestion
Suggested change
ToolsRuff
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove unused variable The variable - out = await has_permission_document(active_user.current_user(active=True), file["id"], "write", session)
+ await has_permission_document(active_user.current_user(active=True), file["id"], "write", session) Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async with update_status_lock: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
task_status = get_task_status([dataset_name]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if dataset_name in task_status and task_status[dataset_name] == "DATASET_PROCESSING_STARTED": | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
logger.info(f"Dataset {dataset_name} is being processed.") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_STARTED") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cognee_config = get_cognify_config() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
graph_config = get_graph_config() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if graph_config.infer_graph_topology and graph_config.graph_topology_task: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.topology.topology import TopologyEngine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
topology_engine = TopologyEngine(infer=graph_config.infer_graph_topology) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = await topology_engine.add_graph_topology(files = files) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif graph_config.infer_graph_topology and not graph_config.infer_graph_topology: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
from cognee.modules.topology.topology import TopologyEngine | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
topology_engine = TopologyEngine(infer=graph_config.infer_graph_topology) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
await topology_engine.add_graph_topology(graph_config.topology_file_path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif not graph_config.graph_topology_task: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
root_node_id = "ROOT" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
tasks = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(process_documents, parent_node_id = root_node_id, task_config = { "batch_size": 10 }, user_id = hashed_user_id, user_permissions=user_permissions), # Classify documents and save them as a nodes in graph db, extract text chunks based on the document type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Undefined variables The variables - Task(process_documents, parent_node_id = root_node_id, task_config = { "batch_size": 10 }, user_id = hashed_user_id, user_permissions=user_permissions), # Classify documents and save them as a nodes in graph db, extract text chunks based on the document type
+ Task(process_documents, parent_node_id = root_node_id, task_config = { "batch_size": 10 }), # Classify documents and save them as a nodes in graph db, extract text chunks based on the document type Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(establish_graph_topology, topology_model = KnowledgeGraph), # Set the graph topology for the document chunk data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(expand_knowledge_graph, graph_model = KnowledgeGraph), # Generate knowledge graphs from the document chunks and attach it to chunk nodes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(filter_affected_chunks, collection_name = "chunks"), # Find all affected chunks, so we don't process unchanged chunks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
save_data_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
collection_name = "chunks", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), # Save the document chunks in vector db and as nodes in graph db (connected to the document node and between each other) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
run_tasks_parallel([ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
summarize_text_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
summarization_model = cognee_config.summarization_model, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
collection_name = "chunk_summaries", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), # Summarize the document chunks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
classify_text_chunks, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
classification_model = cognee_config.classification_model, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
]), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Task(remove_obsolete_chunks), # Remove the obsolete document chunks. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
pipeline = run_tasks(tasks, [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
PdfDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "pdf" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
AudioDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "audio" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImageDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) if file["extension"] == "image" else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TextDocument(title=f"{file['name']}.{file['extension']}", file_path=file["file_path"]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
for file in files | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
async for result in pipeline: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
print(result) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_FINISHED") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
except Exception as error: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_task_status(dataset_name, "DATASET_PROCESSING_ERROR") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise error | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Improve error handling in the task execution segment. Avoid using bare - except Exception as error:
+ except Exception as e:
+ logger.error(f"Error during task execution: {e}")
ToolsRuff
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
existing_datasets = db_engine.get_datasets() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .create_user import create_user |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
from cognee.infrastructure.databases.relational.user_authentication.users import create_user_method | ||
|
||
|
||
|
||
async def create_user(email: str, password: str, is_superuser: bool = False): | ||
output = await create_user_method(email=email, password=password, is_superuser=is_superuser) | ||
return output | ||
|
||
|
||
if __name__ == "__main__": | ||
import asyncio | ||
# Define an example user | ||
example_email = "[email protected]" | ||
example_password = "securepassword123" | ||
example_is_superuser = False | ||
|
||
# Create an event loop and run the create_user function | ||
loop = asyncio.get_event_loop() | ||
result = loop.run_until_complete(create_user(example_email, example_password, example_is_superuser)) | ||
|
||
# Print the result | ||
print(result) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .create_user import create_user |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .verify_user_token import verify_user_token |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
from cognee.infrastructure.databases.relational.user_authentication.users import user_check_token | ||
|
||
|
||
|
||
async def verify_user_token(token: str): | ||
|
||
output = await user_check_token(token=token) | ||
return output | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling and a docstring. The function lacks error handling and documentation. Consider adding a try-except block and a docstring. + """
+ Verify the user token.
+
+ Args:
+ token (str): The user token to verify.
+
+ Returns:
+ output: The result of the token verification.
+ """
async def verify_user_token(token: str):
+ try:
output = await user_check_token(token=token)
+ except Exception as e:
+ # Handle the exception (e.g., log the error, raise a custom exception, etc.)
+ raise e
return output
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reorganize import statements to the top of the file.
Imports should be at the top of the file to comply with PEP 8 standards.
Also applies to: 31-31, 53-59