from datetime import datetime from typing import Optional from pydantic import Field from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol class LearningProtocol(WebPacketProtocol): pass class LearningKpi(LearningProtocol): learned_sessions: int = 0 # 학습에 반영된 협상 수 records: int = 0 # 학습 기록 수(카드 선택 1회 = 1건) settled_sessions: int = 0 # 그중 타결된 협상 수 settle_rate: float = 0.0 # 타결 비율 last_learned_at: Optional[datetime] = None class CardPerformanceRow(LearningProtocol): number: str # 카드번호(NGC-001 등) name: Optional[str] = None type: str = "nego" # nego | wild used_sessions: int = 0 # 이 카드를 쓴 협상 수 uses: int = 0 # 총 사용 횟수 avg_reward: float = 0.0 # 평균 보상 — agent 가 협상 결과로 매긴 성적 settled_sessions: int = 0 settle_rate: float = 0.0 # 이 카드를 쓴 협상의 타결 비율 class AnchoringCell(LearningProtocol): supplier_type: int = 0 supplier_type_label: str = "미지정" price_range_index: int = 0 # 목표가 기준 가격대 구간 anchoring_value: float = 0.0 # 앵커링 인하폭(‰) last_adjusted_at: Optional[datetime] = None class AnchoringHistoryRow(LearningProtocol): supplier_type_label: str = "미지정" price_range_index: int = 0 value_before: float = 0.0 value_after: float = 0.0 sample_count: int = 0 # 조정 판단에 쓴 협상 표본 수 success_count: int = 0 success_rate: float = 0.0 created_at: Optional[datetime] = None class Res_LearningStatus(Res_WebPacketProtocol): kpi: LearningKpi = Field(default_factory=LearningKpi) cards: list[CardPerformanceRow] = [] class Res_AnchoringStatus(Res_WebPacketProtocol): cells: list[AnchoringCell] = [] history: list[AnchoringHistoryRow] = [] adjusted_count: int = 0