from pydantic import BaseModel from typing import List, Optional, Any from datetime import datetime class ChatRequest(BaseModel): query: str session_id: Optional[str] = None top_k: int = 7 # increased from 5 — gives multilingual diversity room source_filter: Optional[str] = None language_filter: Optional[str] = None class SourceDocument(BaseModel): content: str metadata: dict score: float snippet: Optional[str] = None image_url: Optional[str] = None citation_index: Optional[int] = None class ChatResponse(BaseModel): answer: str sources: List[SourceDocument] follow_up_questions: List[str] = [] session_id: str = "anonymous" class FeedbackRequest(BaseModel): session_id: str message_id: int rating: int comment: Optional[str] = None class SentimentData(BaseModel): entity: str avg_sentiment: float mention_count: int class TrendData(BaseModel): topic: str volume: int momentum: float class NewsArticle(BaseModel): doc_id: str url: Optional[str] = None title: Optional[str] = None content: str source: Optional[str] = None published_at: Optional[str] = None score: Optional[float] = None metadata: dict = {} class BrowseResponse(BaseModel): total_returned: int articles: List[NewsArticle] next_offset: Optional[int] = None class SearchResponse(BaseModel): results: List[NewsArticle] class SourceStat(BaseModel): source: str article_count: int avg_sentiment: float class PipelineStats(BaseModel): total_articles_in_vector_db: int total_sentiment_results: int class ChatSession(BaseModel): session_id: str message_count: int last_active: Optional[datetime] = None class UserCreate(BaseModel): username: str email: str password: str full_name: Optional[str] = None class UserResponse(BaseModel): id: int username: str email: str full_name: Optional[str] = None role: str is_active: bool created_at: Optional[datetime] = None class Config: from_attributes = True class UserUpdate(BaseModel): username: Optional[str] = None full_name: Optional[str] = None email: Optional[str] = None class PasswordChange(BaseModel): current_password: str new_password: str class TokenResponse(BaseModel): access_token: str refresh_token: str token_type: str = "bearer" class RefreshRequest(BaseModel): refresh_token: str class AdminUserUpdate(BaseModel): is_active: Optional[bool] = None role: Optional[str] = None