dsmultimedika's picture
fix : update code
0767396
raw
history blame
4.79 kB
from typing import Annotated
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
import pytz
from service.dto import UserPromptRequest, BotResponse, BotCreateRequest
from datetime import datetime
from core.chat.chatstore import ChatStore
# from core.chat.bot_service import ChatCompletionService
from core.chat.bot_service_multimodal import ChatCompletionService
from db.database import get_db
from db.models import Session_Publisher
from db.query.query_book import BookQuery
from db.query.query_bot import BotQuery
from sqlalchemy.orm import Session
from sse_starlette.sse import EventSourceResponse
from utils.utils import generate_uuid
from utils.error_handlers import handle_exception
from langfuse.llama_index import LlamaIndexCallbackHandler
from api.auth import check_user_authentication
from api.router.user import user_dependency
from api.function import generate_streaming_completion
router = APIRouter(tags=["Bot_One"])
db_dependency = Annotated[Session, Depends(get_db)]
def get_chat_store():
return ChatStore()
@router.post("/bot_one/{metadata_id}")
async def create_bot_one(
user: user_dependency,
db: db_dependency,
metadata_id: int,
bot_name: BotCreateRequest,
):
auth_response = check_user_authentication(user)
if auth_response:
return auth_response
# Generate a new session ID (UUID)
try:
session_id = generate_uuid()
bot_query = BotQuery(user)
bot_query.add_bot(db, session_id, bot_name.name, metadata_id)
return {
"status": "session id created successfully",
"bot_name": bot_name.name,
"session_id": session_id,
}
except Exception as e:
return JSONResponse(
status_code=500, content=f"An unexpected in retrieving session id {str(e)}"
)
@router.post("/bot_one/{metadata_id}/{session_id}")
async def generator_bot(
user: user_dependency,
db: db_dependency,
metadata_id: int,
session_id: str,
user_prompt_request: UserPromptRequest,
):
auth_response = check_user_authentication(user)
if auth_response:
return auth_response
langfuse_callback_handler = LlamaIndexCallbackHandler()
langfuse_callback_handler.set_trace_params(
user_id=user.get("username"), session_id=session_id
)
# Query to retrieve the titles
try:
book_query = BookQuery(user)
output_titles = book_query.get_title_from_session(db, metadata_id, session_id)
titles = [item[0] for item in output_titles]
print(titles)
except Exception as e:
return handle_exception(e)
if user_prompt_request.streaming:
return EventSourceResponse(
generate_streaming_completion(
user_prompt_request.prompt,
session_id,
)
)
else:
bot_service = ChatCompletionService(
session_id, user_prompt_request.prompt, titles, type_bot="specific"
)
response, metadata, scores = bot_service.generate_completion()
# Set Jakarta timezone
jakarta_tz = pytz.timezone("Asia/Jakarta")
existing_session = (
db.query(Session_Publisher)
.filter(Session_Publisher.id == session_id)
.first()
)
existing_session.updated_at = datetime.now(jakarta_tz)
db.commit()
return BotResponse(
content=response,
metadata=metadata,
scores=scores,
)
@router.get("/bot_one/{metadata_id}")
async def get_all_session_bot_one(
user: user_dependency, db: db_dependency, metadata_id: int
):
auth_response = check_user_authentication(user)
if auth_response:
return auth_response
try:
# Query the session IDs based on the user ID
bot_query = BotQuery(user)
chat_store = ChatStore()
sessions = bot_query.get_session_ids_bot(db, metadata_id)
session_data = [
{
"id": session.id,
"bot_name": session.bot_name,
"updated_at": str(session.updated_at),
"last_message": chat_store.get_last_message_mongodb(session.id)
}
for session in sessions
]
# Convert list of tuples to a simple list
session_sorted_data = sorted(
session_data,
key=lambda x: datetime.fromisoformat(x["updated_at"]),
reverse=True,
)
return session_sorted_data
except Exception as e:
# Log the error and return JSONResponse for FastAPI
print(f"An error occurred while fetching session IDs: {e}")
return JSONResponse(status_code=400, content="Error retrieving session IDs")