personal-rag-backend / app /api /v1 /endpoints /knowledgebases.py
github-actions[bot]
Deploying latest backend to Hugging Face
20256e7
Raw
History Blame Contribute Delete
5.42 kB
import uuid
from typing import List
from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.api.v1 import deps
from app.db.models.user import User
from app.db.models.knowledgebase import KnowledgeBase
from app.schemas import knowledgebase as kb_schema
from app.services import kb_service
router = APIRouter()
@router.post("/", response_model=kb_schema.KnowledgeBase, status_code=status.HTTP_201_CREATED)
def create_knowledge_base(
kb_in: kb_schema.KnowledgeBaseCreate,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Create a new Knowledge Base.
"""
kb = kb_service.create_kb(db=db, kb_in=kb_in, user=current_user)
return kb_schema.KnowledgeBase.model_validate(kb)
@router.get("/", response_model=List[kb_schema.KnowledgeBase])
def list_knowledge_bases(
db: Session = Depends(get_db),
skip: int = Query(0, ge=0),
limit: int = Query(10, ge=1, le=100),
current_user: User = Depends(deps.get_current_active_user)
):
"""
List all Knowledge Bases for the current user.
"""
kbs_with_counts = kb_service.get_all_kbs_for_user(db, user_id=current_user.id, skip=skip, limit=limit)
response = []
for kb, num_docs, num_processed in kbs_with_counts:
kb_data = kb_schema.KnowledgeBase.model_validate(kb)
kb_data.num_documents = num_docs or 0
kb_data.num_processed_documents = num_processed or 0
response.append(kb_data)
return response
@router.get("/{kb_id}", response_model=kb_schema.KnowledgeBase)
def get_knowledge_base(
kb_id: uuid.UUID,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Get details of a specific Knowledge Base.
"""
db_kb = kb_service.get_kb_by_id(db, kb_id=kb_id, user_id=current_user.id)
if not db_kb:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
kbs_with_counts = kb_service.get_all_kbs_for_user(db, user_id=current_user.id)
kb_with_count = next((item for item in kbs_with_counts if item[0].id == kb_id), None)
if not kb_with_count:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
kb, num_docs, num_processed = kb_with_count
response = kb_schema.KnowledgeBase.model_validate(kb)
response.num_documents = num_docs or 0
response.num_processed_documents = num_processed or 0
return response
@router.put("/{kb_id}", response_model=kb_schema.KnowledgeBase)
def update_knowledge_base(
kb_id: uuid.UUID,
kb_in: kb_schema.KnowledgeBaseUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Update a Knowledge Base's name or description.
"""
db_kb = kb_service.get_kb_by_id(db, kb_id=kb_id, user_id=current_user.id)
if not db_kb:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
updated_kb = kb_service.update_kb(db=db, db_kb=db_kb, kb_in=kb_in)
return updated_kb
@router.delete("/{kb_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_knowledge_base(
kb_id: uuid.UUID,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Delete a Knowledge Base and all its associated documents.
"""
db_kb = kb_service.get_kb_by_id(db, kb_id=kb_id, user_id=current_user.id)
if not db_kb:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
kb_service.delete_kb(db=db, db_kb=db_kb)
return None
@router.get("/{kb_id}/config", response_model=kb_schema.KnowledgeBaseWithConfig)
def get_kb_configuration(
kb_id: uuid.UUID,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Get the advanced configuration of a Knowledge Base.
"""
db_kb = kb_service.get_kb_by_id(db, kb_id=kb_id, user_id=current_user.id)
if not db_kb:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
kbs_with_counts = kb_service.get_all_kbs_for_user(db, user_id=current_user.id)
kb_with_count = next((item for item in kbs_with_counts if item[0].id == kb_id), (None, 0, 0))
response = kb_schema.KnowledgeBaseWithConfig.model_validate(db_kb)
response.num_documents = kb_with_count[1] or 0
response.num_processed_documents = kb_with_count[2] or 0
return response
@router.put("/{kb_id}/config", response_model=kb_schema.KnowledgeBaseWithConfig)
def update_kb_configuration(
kb_id: uuid.UUID,
config_in: kb_schema.KnowledgeBaseConfigUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(deps.get_current_active_user)
):
"""
Update the advanced configuration of a Knowledge Base.
"""
db_kb = kb_service.get_kb_by_id(db, kb_id=kb_id, user_id=current_user.id)
if not db_kb:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Knowledge Base not found")
updated_kb = kb_service.update_kb_config(db=db, db_kb=db_kb, config_in=config_in)
return get_kb_configuration(kb_id=updated_kb.id, db=db, current_user=current_user)