""" Pydantic models for API request/response schemas """ from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any from enum import Enum class SourceType(str, Enum): """Enumeration for text sources""" GITA = "Gita" PYS = "PYS" class QueryRequest(BaseModel): """Request model for spiritual query""" query: str = Field( ..., min_length=1, max_length=500, description="The spiritual question or topic to search for", example="How to control the mind?" ) top_n: int = Field( default=5, ge=1, le=20, description="Number of relevant verses to retrieve", example=5 ) include_summary: bool = Field( default=True, description="Whether to include AI-generated summary", example=True ) source_filter: Optional[List[SourceType]] = Field( default=None, description="Filter results by text source (Gita, PYS, or both)", example=["Gita", "PYS"] ) class Verse(BaseModel): """Model representing a single verse/shloka""" chapter: Optional[float] = Field( None, description="Chapter number", example=2.0 ) verse: Optional[float] = Field( None, description="Verse number", example=47.0 ) text: str = Field( ..., description="Main text content", example="कर्मण्येवाधिकारस्ते मा फलेषु कदाचन।" ) sanskrit: Optional[str] = Field( None, description="Sanskrit verse text", example="कर्मण्येवाधिकारस्ते मा फलेषु कदाचन।" ) translation: Optional[str] = Field( None, description="English translation", example="You have a right to perform your prescribed duty, but not to the fruits of action." ) source: SourceType = Field( ..., description="Source text (Gita or PYS)", example="Gita" ) similarity_score: float = Field( ..., ge=0.0, le=1.0, description="Cosine similarity score with query", example=0.85 ) concept: Optional[str] = Field( None, description="Main concept or theme", example="Karma Yoga" ) keyword: Optional[str] = Field( None, description="Key philosophical term", example="Detachment" ) class QueryResponse(BaseModel): """Response model for spiritual query""" query: str = Field( ..., description="Original query", example="How to control the mind?" ) retrieved_verses: List[Verse] = Field( ..., description="List of relevant verses", min_items=0, max_items=20 ) summary: Optional[str] = Field( None, description="AI-generated summary of the verses", example="The retrieved verses emphasize the importance of controlling the mind through practice, detachment, and devotion to the divine." ) total_results: int = Field( ..., description="Total number of verses found", example=5 ) processing_time_ms: float = Field( ..., description="Time taken to process the query in milliseconds", example=245.5 ) class HealthResponse(BaseModel): """Health check response""" status: str = Field( ..., description="Service status", example="healthy" ) message: str = Field( ..., description="Status message", example="Bhagwad Gita RAG Chatbot API is running" ) version: str = Field( ..., description="API version", example="1.0.0" ) class SourceInfo(BaseModel): """Information about a text source""" name: str = Field( ..., description="Source name", example="Bhagavad Gita" ) code: SourceType = Field( ..., description="Source code", example="Gita" ) total_verses: int = Field( ..., description="Total number of verses", example=700 ) chapters: int = Field( ..., description="Number of chapters", example=18 ) description: str = Field( ..., description="Brief description", example="A 700-verse Hindu scripture that is part of the epic Mahabharata" ) class SourcesResponse(BaseModel): """Response model for available sources""" sources: List[SourceInfo] = Field( ..., description="List of available text sources" ) total_verses: int = Field( ..., description="Total verses across all sources", example=895 ) class ErrorResponse(BaseModel): """Error response model""" error: str = Field( ..., description="Error type", example="ValidationError" ) message: str = Field( ..., description="Error message", example="Query cannot be empty" ) details: Optional[Dict[str, Any]] = Field( None, description="Additional error details" ) class TranslationRequest(BaseModel): """Request model for text translation""" text: str = Field( ..., min_length=1, max_length=1000, description="Text to translate", example="The essence of yoga is to control the mind" ) target_language: str = Field( ..., description="Target language code (hi, fr, de, es, it, pt, ru, ja, ko, zh)", example="hi" ) class TranslationResponse(BaseModel): """Response model for text translation""" original_text: str = Field( ..., description="Original text in English" ) translated_text: str = Field( ..., description="Translated text" ) target_language: str = Field( ..., description="Target language code" ) language_name: str = Field( ..., description="Target language name" ) class SupportedLanguagesResponse(BaseModel): """Response model for supported languages""" languages: Dict[str, str] = Field( ..., description="Dictionary of language codes to language names" )