from typing import List, Optional, Literal from langchain_core.pydantic_v1 import BaseModel, Field Language = Literal["ja", "en"] Tone = Literal["formal", "friendly", "excited", "neutral"] EventType = Literal["product_update", "earnings_summary"] class CompanyInfo(BaseModel): company_name: str = Field(..., description="会社名") brand_voice: Optional[str] = Field(None, description="ブランドボイス(例:信頼性、革新性など)") region: Optional[str] = Field(None, description="主な地域/市場(例:JP, US, APAC など)") language: Language = Field("ja", description="出力言語: ja or en") class Quote(BaseModel): speaker: str = Field(..., description="話者名") role: Optional[str] = Field(None, description="役職/肩書") quote: str = Field(..., description="引用文") class KPI(BaseModel): name: str = Field(..., description="指標名(売上高、ARR等)") value: str = Field(..., description="値(例:12.3億円、+42% YoY)") period: Optional[str] = Field(None, description="対象期間(FY2025Q2等)") delta: Optional[str] = Field(None, description="変化率/差分(例:+12% QoQ)") class SeedInput(BaseModel): event_type: EventType = Field(..., description="product_update または earnings_summary") announce_date: Optional[str] = Field(None, description="発表日(任意、YYYY-MM-DD等)") source_text: str = Field(..., description="元ネタ本文(製品更新や決算要旨)") goals: List[str] = Field(default_factory=list, description="広報/IRの目的(KGI/KPI含む)") tone: Tone = Field("formal", description="トーン") company: CompanyInfo = Field(..., description="会社情報") include_esg: bool = Field(True, description="ESGテンプレを出力するか") include_ir: bool = Field(True, description="IRテンプレを出力するか") class LPSection(BaseModel): hero: str = Field(..., description="ヒーロー見出し+導入文") features: List[str] = Field(default_factory=list, description="主な特徴・利点の箇条書き") cta_text: Optional[str] = Field(None, description="CTA文言") class ESGBlock(BaseModel): environment: List[str] = Field(default_factory=list, description="E: 環境に関する施策") social: List[str] = Field(default_factory=list, description="S: 社会に関する施策") governance: List[str] = Field(default_factory=list, description="G: ガバナンスに関する施策") class IRBlock(BaseModel): highlights: List[str] = Field(default_factory=list, description="四半期・通期のハイライト") financials: List[KPI] = Field(default_factory=list, description="主要KPI(売上・利益・ユーザー数等)") guidance: List[str] = Field(default_factory=list, description="見通し・ガイダンス(任意)") cautionary: Optional[str] = Field(None, description="将来見通しに関する注意事項") class NarrativeData(BaseModel): # Press Release press_headline: str = Field(..., description="プレスリリースの見出し") press_subhead: Optional[str] = Field(None, description="サブヘッド") press_body_points: List[str] = Field(default_factory=list, description="本文要点(段落の素)") quotes: List[Quote] = Field(default_factory=list, description="引用(経営陣・顧客等)") # LP lp: LPSection = Field(..., description="LPセクション(ヒーロー/特徴/CTA)") # SNS sns_thread: List[str] = Field(default_factory=list, description="SNSスレッドの各ポスト(140-280文字程度)") # Media Pitch media_pitch_subject: str = Field(..., description="メディア向けピッチの件名") media_pitch_body: str = Field(..., description="メディア向けピッチ本文(メール想定)") # ESG esg: Optional[ESGBlock] = Field(None, description="ESGテンプレ(任意)") # IR ir: Optional[IRBlock] = Field(None, description="IRテンプレ(任意)")