pr_ir_onepass / models.py
Corin1998's picture
Update models.py
3b6a5bd verified
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テンプレ(任意)")