Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions chatbot-core/api/config/config-testing.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
api:
prefix: "/api/chatbot"

chat:
max_message_length: 5000

is_test_mode: true

session:
Expand Down
3 changes: 3 additions & 0 deletions chatbot-core/api/config/config.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
api:
prefix: "/api/chatbot"

chat:
max_message_length: 5000

is_test_mode: false

session:
Expand Down
16 changes: 14 additions & 2 deletions chatbot-core/api/models/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel, field_validator, model_validator
from api.config.loader import CONFIG

chat_config = CONFIG.get("chat", {})
MAX_MESSAGE_LENGTH = chat_config.get("max_message_length", 5000)


class FileType(str, Enum):
Expand Down Expand Up @@ -46,9 +50,13 @@ class ChatRequest(BaseModel):

@field_validator("message")
def message_must_not_be_empty(cls, v): # pylint: disable=no-self-argument
"""Validator that checks that a message is not empty."""
"""Validator that checks that a message is not empty or too long."""
if not v.strip():
raise ValueError("Message cannot be empty.")
if len(v) > MAX_MESSAGE_LENGTH:
raise ValueError(
f"Message too long. Maximum {MAX_MESSAGE_LENGTH} characters."
)
return v


Expand All @@ -68,11 +76,15 @@ class ChatRequestWithFiles(BaseModel):

@model_validator(mode="after")
def validate_message_or_files(self):
"""Validates that at least message or files are present."""
"""Validates that at least message or files are present, and message is not too long."""
has_message = bool(self.message and self.message.strip())
has_files = bool(self.files and len(self.files) > 0)
if not has_message and not has_files:
raise ValueError("Either message or files must be provided.")
if has_message and len(self.message) > MAX_MESSAGE_LENGTH:
raise ValueError(
f"Message too long. Maximum {MAX_MESSAGE_LENGTH} characters."
)
return self

class ChatResponse(BaseModel):
Expand Down
8 changes: 8 additions & 0 deletions chatbot-core/api/routes/chatbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
SessionResponse,
FileAttachment,
SupportedExtensionsResponse,
MAX_MESSAGE_LENGTH,
)
from api.services.chat_service import (
get_chatbot_reply,
Expand Down Expand Up @@ -111,6 +112,13 @@ async def chatbot_stream(websocket: WebSocket, session_id: str):
if not user_message:
continue

if len(user_message) > MAX_MESSAGE_LENGTH:
await websocket.send_text(json.dumps({
"error": f"Message too long. "
f"Maximum {MAX_MESSAGE_LENGTH} characters."
}))
continue

async for token in get_chatbot_reply_stream(
session_id,
user_message,
Expand Down
Loading