2026-09-11 13:11:58 +08:00
|
|
|
|
"""投顾 Agent 的公共底座实现。"""
|
2026-09-11 11:49:11 +08:00
|
|
|
|
|
2026-09-11 13:11:58 +08:00
|
|
|
|
from typing import Any
|
2026-09-11 11:49:11 +08:00
|
|
|
|
|
2026-09-11 13:11:58 +08:00
|
|
|
|
from app.core.contracts import AgentDefinition, AgentRequest, CoreResult, RequestContext
|
2026-09-11 11:49:11 +08:00
|
|
|
|
from app.service.agent.implementations.fund_query_demo import FundQueryDemoAgent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdvisorAgent(FundQueryDemoAgent):
|
|
|
|
|
|
"""通过公共 BaseAgent 链路运行的最小投顾 Agent。"""
|
|
|
|
|
|
|
|
|
|
|
|
definition = AgentDefinition(
|
|
|
|
|
|
agent_type="advisor",
|
|
|
|
|
|
version="0.1.0",
|
|
|
|
|
|
allowed_roles=("customer", "advisor", "operator", "admin"),
|
|
|
|
|
|
allowed_portals=("api",),
|
2026-09-11 13:11:58 +08:00
|
|
|
|
allowed_tools=("query_fund_quote", "query_investment_goal"),
|
|
|
|
|
|
supported_intents=("fund_quote", "investment_goal"),
|
2026-09-11 11:49:11 +08:00
|
|
|
|
)
|
2026-09-11 13:11:58 +08:00
|
|
|
|
|
|
|
|
|
|
async def handle(self, request: AgentRequest, context: RequestContext) -> CoreResult:
|
|
|
|
|
|
if (
|
|
|
|
|
|
self._classified_intent is not None
|
|
|
|
|
|
and self._classified_intent.intent == "investment_goal"
|
|
|
|
|
|
):
|
|
|
|
|
|
output = await self.call_tool(
|
|
|
|
|
|
"query_investment_goal", {}, intent="investment_goal", context=context
|
|
|
|
|
|
)
|
|
|
|
|
|
if not isinstance(output, dict):
|
|
|
|
|
|
return CoreResult(text="当前没有已确认的投资目标,暂不能用于配置或产品推荐。")
|
|
|
|
|
|
return CoreResult(text=self._describe_goal(output))
|
|
|
|
|
|
return await super().handle(request, context)
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
def _describe_goal(goal: dict[str, Any]) -> str:
|
|
|
|
|
|
return (
|
|
|
|
|
|
f"当前投资目标:年化收益目标 {goal['annualized_return_lower_pct']}%-"
|
|
|
|
|
|
f"{goal['annualized_return_upper_pct']}%,最大回撤 {goal['max_drawdown_pct']}%,"
|
|
|
|
|
|
f"流动性要求 {goal['liquidity_requirement']},投资期限 "
|
|
|
|
|
|
f"{goal['investment_horizon_months']} 个月,业绩比较基准 {goal['benchmark_name']}。"
|
|
|
|
|
|
"以上为目标采集结果,不构成收益承诺或交易指令。"
|
|
|
|
|
|
)
|