""" V5.0 AI 画像强约束 Pydantic Schema - CompanyPersona: 企业级画像 (crm_customers.ai_persona) - BuyerPersona: 联系人级画像 (crm_contacts.ai_buyer_persona) """ from __future__ import annotations from pydantic import BaseModel, Field # ═══════════════════════════════════════════════════════ # 企业画像 (crm_customers.ai_persona) # ═══════════════════════════════════════════════════════ class Firmographics(BaseModel): """企业属性""" industry: str | None = None scale: str | None = None business_model: str | None = None class DynamicStatus(BaseModel): """时序动态""" pain_points: list[str] = Field(default_factory=list) purchase_intent: str | None = None recent_events: list[str] = Field(default_factory=list) class CompanyPersona(BaseModel): """企业级 AI 画像 Schema""" firmographics: Firmographics = Field(default_factory=Firmographics) dynamic_status: DynamicStatus = Field(default_factory=DynamicStatus) summary: str | None = None # ═══════════════════════════════════════════════════════ # 联系人画像 (crm_contacts.ai_buyer_persona) # ═══════════════════════════════════════════════════════ class BuyerRole(BaseModel): """决策角色""" decision_role: str | None = None # 决策者 / 影响者 / 执行者 authority_level: str | None = None # 高 / 中 / 低 class BuyerKPI(BaseModel): """核心痛点与目标""" core_goals: list[str] = Field(default_factory=list) pain_points: list[str] = Field(default_factory=list) class BuyerPreference(BaseModel): """交互偏好""" comm_style: str | None = None meeting_preference: str | None = None topics_of_interest: list[str] = Field(default_factory=list) class BuyerPersona(BaseModel): """联系人级 AI 画像 Schema""" role: BuyerRole = Field(default_factory=BuyerRole) kpi: BuyerKPI = Field(default_factory=BuyerKPI) preference: BuyerPreference = Field(default_factory=BuyerPreference) # ═══════════════════════════════════════════════════════ # 双轨画像回写 Payload(Dify Workflow 回调用) # ═══════════════════════════════════════════════════════ class ContactPersonaUpdate(BaseModel): """单个联系人画像增量""" contact_id: str role: dict | None = None kpi: dict | None = None preference: dict | None = None class PersonaUpdatePayload(BaseModel): """双轨画像回写请求体""" company_updates: dict | None = None contact_updates: list[ContactPersonaUpdate] | None = None