99 lines
2.1 KiB
Python
99 lines
2.1 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from typing import Literal
|
||
|
|
|
||
|
|
from pydantic import BaseModel, Field
|
||
|
|
|
||
|
|
Sentiment = Literal["看多", "看空", "中性"]
|
||
|
|
|
||
|
|
|
||
|
|
class Account(BaseModel):
|
||
|
|
id: str
|
||
|
|
name: str
|
||
|
|
description: str
|
||
|
|
|
||
|
|
|
||
|
|
class DailyInputAccountPayload(BaseModel):
|
||
|
|
account_id: str
|
||
|
|
links: list[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class DailyInputUpsertPayload(BaseModel):
|
||
|
|
accounts: list[DailyInputAccountPayload] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class DailyInputAccount(BaseModel):
|
||
|
|
account_id: str
|
||
|
|
account_name: str
|
||
|
|
links: list[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class DailyInputDocument(BaseModel):
|
||
|
|
date: str
|
||
|
|
updated_at: str
|
||
|
|
accounts: list[DailyInputAccount] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class OpinionArticle(BaseModel):
|
||
|
|
id: str
|
||
|
|
account_id: str
|
||
|
|
account_name: str
|
||
|
|
title: str
|
||
|
|
published_at: str
|
||
|
|
summary: str
|
||
|
|
source_url: str
|
||
|
|
sectors: list[str] = Field(default_factory=list)
|
||
|
|
sentiment: Sentiment
|
||
|
|
article_type: str
|
||
|
|
|
||
|
|
|
||
|
|
class ReportDocument(BaseModel):
|
||
|
|
date: str
|
||
|
|
generated_at: str
|
||
|
|
summary: str
|
||
|
|
focus_sectors: list[str] = Field(default_factory=list)
|
||
|
|
article_count: int
|
||
|
|
account_count: int
|
||
|
|
articles: list[OpinionArticle] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class ReportListItem(BaseModel):
|
||
|
|
date: str
|
||
|
|
generated_at: str
|
||
|
|
summary: str
|
||
|
|
article_count: int
|
||
|
|
focus_sectors: list[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class ClsNewsItem(BaseModel):
|
||
|
|
id: str
|
||
|
|
title: str
|
||
|
|
published_at: str
|
||
|
|
source: str
|
||
|
|
summary: str
|
||
|
|
reference_url: str
|
||
|
|
sectors: list[str] = Field(default_factory=list)
|
||
|
|
sentiment: Sentiment
|
||
|
|
|
||
|
|
|
||
|
|
class ClsNewsSummary(BaseModel):
|
||
|
|
overview: str
|
||
|
|
hot_topics: str
|
||
|
|
watch_list: list[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class ClsSectorImpact(BaseModel):
|
||
|
|
sector: str
|
||
|
|
sentiment: Sentiment
|
||
|
|
reason: str
|
||
|
|
related_titles: list[str] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class ClsNewsDocument(BaseModel):
|
||
|
|
date: str
|
||
|
|
updated_at: str
|
||
|
|
window_label: str
|
||
|
|
summary: ClsNewsSummary
|
||
|
|
sector_impacts: list[ClsSectorImpact] = Field(default_factory=list)
|
||
|
|
items: list[ClsNewsItem] = Field(default_factory=list)
|