# -*- coding: utf-8 -*- """Signal and analysis-related schemas.""" from pydantic import BaseModel from shared.schema.portfolio import Portfolio class AnalystSignal(BaseModel): signal: str | None = None confidence: float | None = None reasoning: dict | str | None = None # Extended fields for richer signal information reasons: list[str] | None = None # Core drivers/reasons for the signal risks: list[str] | None = None # Key risk factors invalidation: str | None = None # Conditions that would invalidate the thesis next_action: str | None = None # Suggested next action for PM # Valuation-related fields intrinsic_value: float | None = None # DCF intrinsic value fair_value_range: dict | None = None # {bear, base, bull} fair value range value_gap_pct: float | None = None # Value gap percentage valuation_methods: list[str] | None = None # List of valuation methods used max_position_size: float | None = None # For risk management signals class TickerAnalysis(BaseModel): ticker: str analyst_signals: dict[str, AnalystSignal] # agent_name -> signal mapping class AgentStateData(BaseModel): tickers: list[str] portfolio: Portfolio start_date: str end_date: str ticker_analyses: dict[str, TickerAnalysis] # ticker -> analysis mapping class AgentStateMetadata(BaseModel): show_reasoning: bool = False model_config = {"extra": "allow"}