from pydantic import BaseModel, Field from typing import List, Optional, Literal from app.core.config import settings class SettingsUpdate(BaseModel): """Schema for updating application settings.""" # RAG Settings chunk_size: Optional[int] = Field(default=settings.chunk_size, ge=100, le=5000, description="Text chunk size") chunk_overlap: Optional[int] = Field(default=settings.chunk_overlap, ge=0, le=1000, description="Chunk overlap size") similarity_top_k: Optional[int] = Field(default=settings.similarity_top_k, ge=1, le=20, description="Number of similar docs to retrieve") similarity_threshold: Optional[float] = Field(default=settings.similarity_threshold, ge=0, le=1, description="Similarity threshold") # Model Settings llm_provider: Optional[Literal["gemini", "local"]] = Field(default=settings.llm_provider, description="LLM provider to use") enable_fallback: Optional[bool] = Field(default=settings.enable_fallback, description="Enable fallback to alternate model") gemini_model_name: Optional[str] = Field(default=settings.gemini_model_name, description="Gemini model name") local_model_name: Optional[str] = Field(default=settings.local_model_name, description="Local model filename") # API Settings cors_origins: Optional[List[str]] = Field(default=settings.cors_origins, description="Allowed CORS origins") class SettingsResponse(BaseModel): """Schema for settings response.""" # Paths (read-only) root_path: str model_path: str data_path: str # API Settings api_title: str api_version: str cors_origins: List[str] # RAG Settings chunk_size: int chunk_overlap: int similarity_top_k: int similarity_threshold: float collection_name: str persist_directory: str # Model Settings llm_provider: str enable_fallback: bool embedding_model_name: str gemini_model_name: str local_model_name: str class Config: from_attributes = True