File size: 2,617 Bytes
a63c61f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8f8038
 
 
a63c61f
 
 
 
d8f8038
a63c61f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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