packages/blueprints/gen-ai-chatbot/static-assets/chatbot-genai-components/backend/python/app/routes/conversation.py (118 lines of code) (raw):

from app.repositories.conversation import ( change_conversation_title, delete_conversation_by_id, delete_conversation_by_user_id, find_conversation_by_user_id, update_feedback, ) from app.repositories.models.conversation import FeedbackModel from app.routes.schemas.conversation import ( ChatInput, ChatOutput, Conversation, ConversationMetaOutput, FeedbackInput, FeedbackOutput, NewTitleInput, ProposedTitle, RelatedDocumentsOutput, ) from app.usecases.chat import ( chat, fetch_conversation, fetch_related_documents, propose_conversation_title, ) from app.user import User from fastapi import APIRouter, Request router = APIRouter(tags=["conversation"]) @router.get("/health") def health(): """For health check""" return {"status": "ok"} @router.post("/conversation", response_model=ChatOutput) def post_message(request: Request, chat_input: ChatInput): """Send chat message""" current_user: User = request.state.current_user output = chat(user_id=current_user.id, chat_input=chat_input) return output @router.post( "/conversation/related-documents", response_model=list[RelatedDocumentsOutput] | None, ) def get_related_documents( request: Request, chat_input: ChatInput ) -> list[RelatedDocumentsOutput] | None: """Get related documents NOTE: POST method is used to avoid query string length limit. If the bot prohibits displaying related documents, it will return `None`. """ current_user: User = request.state.current_user output = fetch_related_documents(user_id=current_user.id, chat_input=chat_input) return output @router.get("/conversation/{conversation_id}", response_model=Conversation) def get_conversation(request: Request, conversation_id: str): """Get a conversation history""" current_user: User = request.state.current_user output = fetch_conversation(current_user.id, conversation_id) return output @router.delete("/conversation/{conversation_id}") def remove_conversation(request: Request, conversation_id: str): """Delete conversation""" current_user: User = request.state.current_user delete_conversation_by_id(current_user.id, conversation_id) @router.get("/conversations", response_model=list[ConversationMetaOutput]) def get_all_conversations( request: Request, ): """Get all conversation metadata""" current_user: User = request.state.current_user conversations = find_conversation_by_user_id(current_user.id) output = [ ConversationMetaOutput( id=conversation.id, title=conversation.title, create_time=conversation.create_time, model=conversation.model, bot_id=conversation.bot_id, ) for conversation in conversations ] return output @router.delete("/conversations") def remove_all_conversations( request: Request, ): """Delete all conversations""" delete_conversation_by_user_id(request.state.current_user.id) @router.patch("/conversation/{conversation_id}/title") def patch_conversation_title( request: Request, conversation_id: str, new_title_input: NewTitleInput ): """Update conversation title""" current_user: User = request.state.current_user change_conversation_title( current_user.id, conversation_id, new_title_input.new_title ) @router.get( "/conversation/{conversation_id}/proposed-title", response_model=ProposedTitle ) def get_proposed_title(request: Request, conversation_id: str): """Suggest conversation title""" current_user: User = request.state.current_user title = propose_conversation_title(current_user.id, conversation_id) return ProposedTitle(title=title) @router.put( "/conversation/{conversation_id}/{message_id}/feedback", response_model=FeedbackOutput, ) def put_feedback( request: Request, conversation_id: str, message_id: str, feedback_input: FeedbackInput, ): """Send feedback.""" current_user: User = request.state.current_user update_feedback( user_id=current_user.id, conversation_id=conversation_id, message_id=message_id, feedback=FeedbackModel( thumbs_up=feedback_input.thumbs_up, category=feedback_input.category if feedback_input.category else "", comment=feedback_input.comment if feedback_input.comment else "", ), ) return FeedbackOutput( thumbs_up=feedback_input.thumbs_up, category=feedback_input.category if feedback_input.category else "", comment=feedback_input.comment if feedback_input.comment else "", )