gateway/modules/datamodels/datamodelChatbot.py
2025-10-09 16:56:27 +02:00

216 lines
7.1 KiB
Python

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