from pydantic import BaseModel, Field, ConfigDict
from typing import List, Literal, Optional
from datetime import datetime
# --- Chat Schemas ---
class ChatRequest(BaseModel):
"""Defines the shape of a request to the /chat endpoint."""
prompt: str = Field(..., min_length=1)
# The 'model' can now be specified in the request body to switch models mid-conversation.
provider_name: Literal["deepseek", "gemini"] = Field("deepseek")
# Add a new optional boolean field to control the retriever
load_faiss_retriever: Optional[bool] = Field(False, description="Whether to use the FAISS DB retriever for the chat.")
class ChatResponse(BaseModel):
"""Defines the shape of a successful response from the /chat endpoint."""
answer: str
provider_used: str
# --- Document Schemas ---
class DocumentCreate(BaseModel):
title: str
text: str
source_url: Optional[str] = None
author: Optional[str] = None
user_id: str = "default_user"
class DocumentResponse(BaseModel):
message: str
class DocumentInfo(BaseModel):
id: int
title: str
source_url: Optional[str] = None
status: str
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class DocumentListResponse(BaseModel):
documents: List[DocumentInfo]
class DocumentDeleteResponse(BaseModel):
message: str
document_id: int
# --- Session Schemas ---
class SessionCreate(BaseModel):
"""Defines the shape for starting a new conversation session."""
user_id: str
provider_name: Literal["deepseek", "gemini"] = "deepseek"
class Session(BaseModel):
"""Defines the shape of a session object returned by the API."""
id: int
user_id: str
title: str
provider_name: str
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class Message(BaseModel):
"""Defines the shape of a single message within a session's history."""
# The sender can only be one of two roles.
sender: Literal["user", "assistant"]
# The text content of the message.
content: str
# The timestamp for when the message was created.
created_at: datetime
# Enables creating this schema from a SQLAlchemy database object.
model_config = ConfigDict(from_attributes=True)
class MessageHistoryResponse(BaseModel):
"""Defines the response for retrieving a session's chat history."""
session_id: int
messages: List[Message]
class SpeechRequest(BaseModel):
text: str
# --- STT Schemas ---
class STTResponse(BaseModel):
"""Defines the shape of a successful response from the /stt endpoint."""
transcript: str