merge: 并入同事的场外申购/推广/行情/NL2SQL 线(11 提交、334 文件)

冲突仅 3 个文件,全部取并集(双方都没有需要丢弃的改动):
- app/main.py:import 双方路由(我方 knowledge_management + 同事的 offsite_fund/
  promotion_material);include_router 段本已自动合并
- app/service/agent/bootstrap.py:import 与工具注册均取并集
  (query_customer_profile + query_financial_data 都注册)
- tests/integration/test_config_release_mysql.py:outbox 清理同时保留
  架构师的 event_type 限定(防误删其它域 outbox 行)与同事新增的 peer_release_id

同事这轮带入:11 个 alembic 迁移(建 offsite_* / promotion_* 等表)、
场外申购与推广素材 Agent、financial NL2SQL 工具。
注意:本库尚无 offsite_*/promotion_* 表,跑相关测试前需要执行 alembic upgrade。

边界核对:同事的场外代码未写入场内交易表(fin_sim_order/fin_capital_flow/fin_cash_ledger),
符合 AGENTS.md 规则 8。
This commit is contained in:
qyqy
2026-09-11 18:56:26 +08:00
118 changed files with 18967 additions and 191 deletions
+21
View File
@@ -8,6 +8,7 @@ from app.core.config import get_settings
from app.core.errors import RecoverableAgentError
from app.core.fund_contracts import FundQuoteQuery
from app.core.knowledge_contracts import KnowledgeSearchInput
from app.core.nl2sql_contracts import FinancialNL2SQLInput
from app.core.risk_contracts import RiskAlertEvidenceQuery, RiskAlertQuery
from app.infrastructure.fund_quote_cache import FundQuoteCache
from app.infrastructure.graph import build_graph_driver
@@ -28,10 +29,13 @@ from app.service.agent.implementations.platform_probe import (
probe_echo_tool,
)
from app.service.agent.implementations.risk_agent import RiskAgent
from app.service.agent.offsite_fund_agent import OffsiteFundAgent
from app.service.agent.promotion_material_agent import PromotionMaterialAgent
from app.service.customer_profile_service import (
CustomerProfileQuery,
query_customer_profile_tool,
)
from app.service.financial_nl2sql_service import query_financial_data_tool
from app.service.fund_quote_service import query_fund_quote_tool
from app.service.intent_classifier import IntentClassifier
from app.service.knowledge_search_service import KnowledgeSearchService
@@ -262,6 +266,14 @@ def get_agent_factory() -> AgentFactory:
required_permission="memory:read:self",
allowed_roles=("customer", "advisor", "operator", "risk_operator", "admin"),
))
registry.register(ToolDefinition(
name="query_financial_data",
input_model=FinancialNL2SQLInput,
handler=cast(Any, query_financial_data_tool),
required_permission="financial:nl2sql:read",
allowed_roles=("advisor", "operator", "admin", "super_admin"),
timeout_seconds=10,
))
registry.register(ToolDefinition(
name="search_knowledge",
input_model=KnowledgeSearchInput,
@@ -294,6 +306,7 @@ def get_agent_factory() -> AgentFactory:
required_permission="risk:alert:read",
allowed_roles=("risk_operator", "admin"),
))
model_service = get_model_service()
endpoint_resolver = DatabaseModelEndpointResolver()
factory = AgentFactory(
@@ -334,6 +347,14 @@ def register_business_agents(factory: AgentFactory) -> None:
RiskAgent.definition,
lambda _context: RiskAgent(RiskAgent.definition),
)
factory.register(
OffsiteFundAgent.definition,
lambda _context: OffsiteFundAgent(OffsiteFundAgent.definition),
)
factory.register(
PromotionMaterialAgent.definition,
lambda _context: PromotionMaterialAgent(PromotionMaterialAgent.definition),
)
# 基座验证探针:只读、无副作用,用于端到端验证工具链路的拒绝行为。
# 角色限定 admin,业务上不对外暴露用途。
factory.register(