feat:新增投顾agent和nl2sqlagent

This commit is contained in:
2026-09-13 16:19:24 +08:00
parent c80c6acac0
commit 163192bf55
122 changed files with 7488 additions and 362 deletions
@@ -0,0 +1,97 @@
"""投顾意图结果到草稿与事件的编排。"""
from __future__ import annotations
from decimal import Decimal
import json
from agent.advisor_agent.intent.draft_generation import (
build_rebalance_draft,
build_recommendation_draft,
)
from common.common_const import EVENT_ADVISOR_REBALANCE_DRAFT_CREATED
from service.advisor_agent.draft import create_draft
from agent.advisor_agent.llm import generate_text
async def generate_rebalance_draft(
*,
draft_repo,
publish,
customer_id: int,
advisor_id: int,
customer_risk: str,
relation_status: str,
holdings: list[dict],
target_allocation: dict[str, int | float | Decimal],
threshold: Decimal,
candidates: list[dict],
trace_id: str,
) -> dict | None:
draft_data = build_rebalance_draft(
customer_id=customer_id,
advisor_id=advisor_id,
customer_risk=customer_risk,
relation_status=relation_status,
holdings=holdings,
target_allocation=target_allocation,
threshold=threshold,
candidates=candidates,
)
if draft_data is None:
return None
draft = await create_draft(draft_repo, draft_data)
event_id = await publish(
event_name=EVENT_ADVISOR_REBALANCE_DRAFT_CREATED,
trace_id=trace_id,
trigger_user_id=advisor_id,
customer_id=customer_id,
payload={
"draft_id": draft.draft_id,
"customer_id": customer_id,
"advisor_id": advisor_id,
"deviation": float(draft.deviation or 0),
"created_at": draft.create_time.isoformat()
if draft.create_time
else None,
},
)
return {"draft": draft, "event_id": event_id}
async def generate_recommendation_draft(
*,
draft_repo,
customer_id: int,
advisor_id: int,
customer_risk: str,
relation_status: str,
candidates: list[dict],
trace_id: str,
memories: list[dict] | None = None,
llm_client=None,
llm_timeout: float = 5.0,
):
draft_data = build_recommendation_draft(
customer_id=customer_id,
advisor_id=advisor_id,
customer_risk=customer_risk,
candidates=candidates,
relation_status=relation_status,
memories=memories,
)
if llm_client is not None:
draft_data["content"] = await generate_text(
llm_client,
system_prompt="你是基金投顾助手,只生成内部投顾草稿说明,不下单、不承诺收益。",
user_prompt=(
"请根据以下候选基金和客户记忆生成简洁推荐说明:"
+ json.dumps(
{"candidates": candidates, "memories": memories or []},
ensure_ascii=False,
)
),
fallback=lambda: draft_data["content"],
timeout=llm_timeout,
)
return await create_draft(draft_repo, draft_data)