muryshev's picture
update
fd3c8b9
raw
history blame
4.24 kB
import logging
from datetime import datetime
from typing import Annotated, Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import aliased
from starlette import status
from common import auth
from common.common import configure_logging
from common.exceptions import LogNotFoundException
from components.dbo.models.feedback import Feedback
from components.dbo.models.log import Log
from schemas.log import LogCreate
import common.dependencies as DI
from sqlalchemy.orm import sessionmaker
router = APIRouter(tags=['Logs'])
logger = logging.getLogger(__name__)
configure_logging()
@router.get('/logs', status_code=status.HTTP_200_OK)
async def get_all_logs(
db: Annotated[sessionmaker, Depends(DI.get_db)],
current_user: Annotated[any, Depends(auth.get_current_user)],
date_start: Optional[datetime] = Query(None, alias="date_start"),
date_end: Optional[datetime] = Query(None, alias="date_end")
):
logger.info(f'GET /logs: start')
logger.info(f'GET /logs: start_date={date_start}, end_date={date_end}')
feedback_alias = aliased(Feedback)
query = db.query(Log)
if date_start and date_end:
query = query.filter(Log.dateCreated.between(date_start, date_end))
elif date_start:
query = query.filter(Log.dateCreated >= date_start)
elif date_end:
query = query.filter(Log.dateCreated <= date_end)
query = query.outerjoin(feedback_alias, Log.id == feedback_alias.log_id)
logs_with_feedback = query.all()
combined_logs = []
for log in logs_with_feedback:
if log.feedback:
for feedback in log.feedback:
combined_logs.append(
{
"log_id": log.id,
"llmPrompt": log.llmPrompt,
"llmResponse": log.llmResponse,
"llm_classifier": log.llm_classifier,
"dateCreated": log.dateCreated,
"userRequest": log.userRequest,
"userName": log.userName,
"query_type": log.query_type,
"feedback_id": feedback.feedback_id,
"userComment": feedback.userComment,
"userScore": feedback.userScore,
"manualEstimate": feedback.manualEstimate,
"llmEstimate": feedback.llmEstimate,
}
)
else:
combined_logs.append(
{
"log_id": log.id,
"llmPrompt": log.llmPrompt,
"llmResponse": log.llmResponse,
"llm_classifier": log.llm_classifier,
"dateCreated": log.dateCreated,
"userRequest": log.userRequest,
"userName": log.userName,
"query_type": log.query_type,
"feedback_id": None,
"userComment": None,
"userScore": None,
"manualEstimate": None,
"llmEstimate": None,
}
)
return combined_logs
@router.get('/log/{log_id}', status_code=status.HTTP_200_OK)
async def get_log(db: Annotated[sessionmaker, Depends(DI.get_db)],
current_user: Annotated[any, Depends(auth.get_current_user)], log_id):
log = db.query(Log).filter(Log.id == log_id).first()
if log is None:
raise LogNotFoundException(log_id)
return log
@router.post('/log', status_code=status.HTTP_201_CREATED)
async def create_log(log: LogCreate, db: Annotated[sessionmaker, Depends(DI.get_db)]):
logger.info("Handling POST request to /log")
try:
new_log = Log(
llmPrompt=log.llmPrompt,
llmResponse=log.llmResponse,
llm_classifier=log.llm_classifier,
userRequest=log.userRequest,
userName=log.userName,
)
db.add(new_log)
db.commit()
db.refresh(new_log)
logger.info(f"Successfully created log with ID: {new_log.id}")
return new_log
except Exception as e:
logger.error(f"Error creating log: {str(e)}")
raise e