|
from pydantic import BaseModel, ConfigDict |
|
from uuid import UUID |
|
from typing import Optional, Dict, Any, List |
|
|
|
|
|
class NewsArticle(BaseModel): |
|
title: str |
|
url: str |
|
source: str |
|
sentiment: str |
|
sentiment_score: float |
|
|
|
class SentimentSummary(BaseModel): |
|
total_items: int |
|
positive: int |
|
negative: int |
|
neutral: int |
|
error: Optional[str] = None |
|
|
|
class IntelligenceBriefing(BaseModel): |
|
articles: List[NewsArticle] |
|
sentiment_summary: SentimentSummary |
|
|
|
|
|
class LLMReport(BaseModel): |
|
llm_report: str |
|
error: Optional[str] = None |
|
|
|
|
|
class JobResult(BaseModel): |
|
|
|
ticker: Optional[str] = None |
|
company_name: Optional[str] = None |
|
current_price: Optional[float] = None |
|
previous_close: Optional[float] = None |
|
market_cap: Optional[int] = None |
|
pe_ratio: Optional[float] = None |
|
pb_ratio: Optional[float] = None |
|
dividend_yield: Optional[float] = None |
|
sector: Optional[str] = None |
|
industry: Optional[str] = None |
|
summary: Optional[str] = None |
|
website: Optional[str] = None |
|
|
|
|
|
intelligence_briefing: Optional[IntelligenceBriefing] = None |
|
|
|
|
|
llm_analysis: Optional[LLMReport] = None |
|
|
|
|
|
error: Optional[str] = None |
|
|
|
|
|
class JobCreate(BaseModel): |
|
ticker: str |
|
|
|
class Job(BaseModel): |
|
id: UUID |
|
ticker: str |
|
status: str |
|
result: Optional[JobResult] = None |
|
|
|
model_config = ConfigDict(from_attributes=True) |