"""Pydantic schemas untuk request/response.""" from typing import List, Dict, Optional from pydantic import BaseModel class TextItem(BaseModel): id: int text: str # === Shared request === class TextItemsRequest(BaseModel): items: List[TextItem] # === Sentiment === class SentimentRequest(BaseModel): items: List[TextItem] class SentimentResult(BaseModel): id: int sentiment: str score: float confidence: float class SentimentResponse(BaseModel): results: List[SentimentResult] model_mode: str # === Summarize === class SummarizeRequest(BaseModel): text: str sentences: int = 3 class SummarizeResponse(BaseModel): summary: str sentences: List[str] # === Topics === class TopicRequest(BaseModel): items: List[TextItem] num_topics: int = 8 class TopicCluster(BaseModel): topic_id: int label: str keywords: List[str] article_ids: List[int] size: int class TopicResponse(BaseModel): topics: List[TopicCluster] model_mode: str # === Similarity === class SimilarityRequest(BaseModel): items: List[TextItem] threshold: float = 0.3 class SimilarityPair(BaseModel): id_a: int id_b: int score: float class SimilarityResponse(BaseModel): pairs: List[SimilarityPair] # === Emotion === class EmotionResult(BaseModel): id: int emotions: Dict[str, float] dominant_emotion: str dominant_score: float class EmotionResponse(BaseModel): results: List[EmotionResult] # === Framing === class FramingResult(BaseModel): id: int frames: Dict[str, float] dominant_frame: str score: float class FramingResponse(BaseModel): results: List[FramingResult] # === Fake Score === class FakeScoreResult(BaseModel): id: int score: int level: str reasons: List[str] class FakeScoreResponse(BaseModel): results: List[FakeScoreResult] # === Opinion vs Fact === class OpinionFactResult(BaseModel): id: int classification: str opinion_pct: int fact_pct: int confidence: float class OpinionFactResponse(BaseModel): results: List[OpinionFactResult] # === Keywords === class KeywordItem(BaseModel): keyword: str score: float count: int class KeywordsResult(BaseModel): id: int keywords: List[KeywordItem] class KeywordsResponse(BaseModel): results: List[KeywordsResult] # === NER === class EntitiesMap(BaseModel): persons: List[str] organizations: List[str] locations: List[str] class NerResult(BaseModel): id: int entities: EntitiesMap class NerResponse(BaseModel): results: List[NerResult] # === Digest === class DigestRequest(BaseModel): items: List[TextItem] project_name: str = "" class DigestTopicItem(BaseModel): topic: str count: int class DigestResponse(BaseModel): summary: str top_topics: List[DigestTopicItem] key_titles: List[str] article_count: int