"""Chatbot API models for request/response handling.""" from typing import List, Optional from pydantic import BaseModel, Field from modules.shared.attributeUtils import register_model_labels, ModelMixin # Chatbot API Models class MessageItem(BaseModel, ModelMixin): """Individual message in a thread""" role: str = Field(..., description="Message role (user or assistant)") content: str = Field(..., description="Message content") class ChatMessageRequest(BaseModel, ModelMixin): """Request model for posting a chat message""" thread_id: Optional[str] = Field( None, description="Thread ID (creates new thread if not provided)" ) message: str = Field(..., description="User message content") tools: Optional[List[str]] = Field( None, description="List of tool IDs to use. If not provided, all user's tools will be used", ) class ChatMessageResponse(BaseModel, ModelMixin): """Response model for posting a chat message""" thread_id: str = Field(..., description="Thread ID") messages: List[MessageItem] = Field(..., description="All messages in thread") class ThreadSummary(BaseModel, ModelMixin): """Summary of a chat thread for list view""" thread_id: str = Field(..., description="Thread ID") thread_name: str = Field(..., description="Thread name") date_created: float = Field(..., description="Thread creation timestamp") date_updated: float = Field(..., description="Thread last updated timestamp") class ThreadListResponse(BaseModel, ModelMixin): """Response model for listing all threads""" threads: List[ThreadSummary] = Field(..., description="List of thread summaries") class ThreadDetail(BaseModel, ModelMixin): """Detailed view of a single thread""" thread_id: str = Field(..., description="Thread ID") date_created: float = Field(..., description="Thread creation timestamp") date_updated: float = Field(..., description="Thread last updated timestamp") messages: List[MessageItem] = Field( ..., description="All messages in chronological order" ) class RenameThreadRequest(BaseModel, ModelMixin): """Request model for renaming a thread""" new_name: str = Field(..., description="New name for the thread") class DeleteResponse(BaseModel, ModelMixin): """Response model for delete operations""" message: str = Field(..., description="Confirmation message") thread_id: str = Field(..., description="Deleted thread ID") # Tool Management Models class ToolInfo(BaseModel, ModelMixin): """Information about a chatbot tool""" id: str = Field(..., description="Tool UUID") tool_id: str = Field( ..., description="Tool identifier (e.g., 'shared.tavily_search')" ) name: str = Field(..., description="Tool function name") label: str = Field(..., description="Display label for the tool") category: str = Field(..., description="Tool category (shared or customer)") description: str = Field(..., description="Tool description") is_active: bool = Field(..., description="Whether the tool is active") date_created: float = Field(..., description="Creation timestamp") date_updated: float = Field(..., description="Last update timestamp") class ToolListResponse(BaseModel, ModelMixin): """Response model for listing all tools""" tools: List[ToolInfo] = Field(..., description="List of available tools") class GrantToolRequest(BaseModel, ModelMixin): """Request model for granting a tool to a user""" user_id: str = Field(..., description="User ID to grant the tool to") tool_id: str = Field(..., description="Tool UUID from tools table") class GrantToolResponse(BaseModel, ModelMixin): """Response model after granting a tool""" message: str = Field(..., description="Confirmation message") user_id: str = Field(..., description="User ID") tool_id: str = Field(..., description="Tool UUID") class RevokeToolRequest(BaseModel, ModelMixin): """Request model for revoking a tool from a user""" user_id: str = Field(..., description="User ID to revoke the tool from") tool_id: str = Field(..., description="Tool UUID from tools table") class RevokeToolResponse(BaseModel, ModelMixin): """Response model after revoking a tool""" message: str = Field(..., description="Confirmation message") user_id: str = Field(..., description="User ID") tool_id: str = Field(..., description="Tool UUID") class UpdateToolRequest(BaseModel, ModelMixin): """Request model for updating a tool's label and description""" label: Optional[str] = Field(None, description="New label for the tool") description: Optional[str] = Field(None, description="New description for the tool") class UpdateToolResponse(BaseModel, ModelMixin): """Response model after updating a tool""" message: str = Field(..., description="Confirmation message") tool_id: str = Field(..., description="Tool UUID") updated_fields: List[str] = Field(..., description="List of updated field names") # Register model labels for internationalization register_model_labels( "MessageItem", {"en": "Message Item", "fr": "Élément de message"}, { "role": {"en": "Role", "fr": "Rôle"}, "content": {"en": "Content", "fr": "Contenu"}, }, ) register_model_labels( "ChatMessageRequest", {"en": "Chat Message Request", "fr": "Demande de message de chat"}, { "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, "message": {"en": "Message", "fr": "Message"}, }, ) register_model_labels( "ChatMessageResponse", {"en": "Chat Message Response", "fr": "Réponse du message de chat"}, { "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, "messages": {"en": "Messages", "fr": "Messages"}, }, ) register_model_labels( "ThreadSummary", {"en": "Thread Summary", "fr": "Résumé du fil"}, { "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, "thread_name": {"en": "Thread Name", "fr": "Nom du fil"}, "date_created": {"en": "Date Created", "fr": "Date de création"}, "date_updated": {"en": "Date Updated", "fr": "Date de mise à jour"}, }, ) register_model_labels( "ThreadListResponse", {"en": "Thread List Response", "fr": "Réponse de liste de fils"}, { "threads": {"en": "Threads", "fr": "Fils"}, }, ) register_model_labels( "ThreadDetail", {"en": "Thread Detail", "fr": "Détail du fil"}, { "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, "date_created": {"en": "Date Created", "fr": "Date de création"}, "date_updated": {"en": "Date Updated", "fr": "Date de mise à jour"}, "messages": {"en": "Messages", "fr": "Messages"}, }, ) register_model_labels( "RenameThreadRequest", {"en": "Rename Thread Request", "fr": "Demande de renommage de fil"}, { "new_name": {"en": "New Name", "fr": "Nouveau nom"}, }, ) register_model_labels( "DeleteResponse", {"en": "Delete Response", "fr": "Réponse de suppression"}, { "message": {"en": "Message", "fr": "Message"}, "thread_id": {"en": "Thread ID", "fr": "ID du fil"}, }, )