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 "",
)