"""投顾 Agent HTTP 请求 DTO。""" from __future__ import annotations from typing import Any, Literal from pydantic import BaseModel, Field from common.common_const import ( AGENT_INTENT_DIALOGUE_SCRIPT, AGENT_INTENT_DATA_QUERY, AGENT_INTENT_FUND_ANALYSIS, AGENT_INTENT_REBALANCE, AGENT_INTENT_RECOMMEND, TALK_SCENE_CUSTOMER_COMPLAINT, TALK_SCENE_MARKET_FLUCTUATION, TALK_SCENE_PORTFOLIO_DIVERGENCE, TALK_SCENE_RISK_BLOCK_ORDER, ) class AdvisorDraftSaveReq(BaseModel): title: str | None = Field(default=None, max_length=128) content: str | None = None structured_data: dict[str, Any] | None = None class AdvisorDraftOperateReq(BaseModel): operation: Literal["discard"] class AdvisorRebalanceRunReq(BaseModel): customer_id: int = Field(gt=0) class AdvisorChatReq(BaseModel): customer_id: int = Field(gt=0) intent: Literal[ AGENT_INTENT_RECOMMEND, AGENT_INTENT_REBALANCE, AGENT_INTENT_FUND_ANALYSIS, AGENT_INTENT_DIALOGUE_SCRIPT, AGENT_INTENT_DATA_QUERY, ] | None = None query: str | None = Field(default=None, max_length=4000) class AdvisorDataQueryReq(BaseModel): customer_id: int = Field(gt=0) question: str = Field(min_length=1, max_length=2000) session_id: str | None = Field(default=None, max_length=64) max_rows: int | None = Field(default=None, gt=0, le=10000) page: int = Field(default=1, ge=1, le=100000) page_size: int = Field(default=100, ge=1, le=10000) sort_by: str | None = Field(default=None, max_length=128) sort_order: Literal["asc", "desc"] = "asc" class AdvisorFundAnalysisReq(BaseModel): customer_id: int | None = Field(default=None, gt=0) fund_codes: list[str] = Field(min_length=1) fund: dict[str, Any] | None = None performance: list[dict[str, Any]] | None = None class AdvisorTalkScriptReq(BaseModel): customer_id: int = Field(gt=0) scene_type: Literal[ TALK_SCENE_RISK_BLOCK_ORDER, TALK_SCENE_MARKET_FLUCTUATION, TALK_SCENE_PORTFOLIO_DIVERGENCE, TALK_SCENE_CUSTOMER_COMPLAINT, ] customer_name: str = Field(default="客户", max_length=32)