216 lines
7.1 KiB
Python
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"},
|
|
},
|
|
)
|