from datetime import datetime from typing import Optional, List from pydantic import BaseModel, EmailStr # User schemas class UserBase(BaseModel): email: EmailStr username: str class UserCreate(UserBase): password: str class UserLogin(BaseModel): email: EmailStr password: str class UserUpdate(BaseModel): email: Optional[EmailStr] = None username: Optional[str] = None password: Optional[str] = None role: Optional[str] = None is_active: Optional[bool] = None class UserResponse(UserBase): id: int role: str is_active: bool created_at: datetime class Config: from_attributes = True # Token schemas class Token(BaseModel): access_token: str token_type: str = "bearer" class TokenData(BaseModel): user_id: Optional[int] = None # AIEndpoint schemas class AIEndpointBase(BaseModel): name: str endpoint_type: str # "openai" or "ollama" base_url: str api_key: Optional[str] = None model_name: str is_active: bool = True is_default: bool = False class AIEndpointCreate(AIEndpointBase): pass class AIEndpointUpdate(BaseModel): name: Optional[str] = None endpoint_type: Optional[str] = None base_url: Optional[str] = None api_key: Optional[str] = None model_name: Optional[str] = None is_active: Optional[bool] = None is_default: Optional[bool] = None class AIEndpointResponse(AIEndpointBase): id: int created_at: datetime class Config: from_attributes = True # ChatMessage schemas class ChatMessageBase(BaseModel): role: str content: str class ChatMessageCreate(ChatMessageBase): endpoint_id: Optional[int] = None class ChatMessageResponse(ChatMessageBase): id: int user_id: int endpoint_id: Optional[int] created_at: datetime class Config: from_attributes = True # UploadedFile schemas class UploadedFileBase(BaseModel): original_filename: str file_type: Optional[str] = None class UploadedFileResponse(UploadedFileBase): id: int user_id: int filename: str file_path: str file_size: int created_at: datetime class Config: from_attributes = True # Chat schemas class ChatRequest(BaseModel): message: str endpoint_id: Optional[int] = None file_ids: Optional[List[int]] = None conversation_history: Optional[List[dict]] = None class ChatResponse(BaseModel): response: str endpoint_used: Optional[str] = None model_used: Optional[str] = None # AdminStats schema class AdminStats(BaseModel): total_users: int total_endpoints: int total_messages: int active_endpoints: int