依据《实现方案-风控追加需求v1.1-C4C6.md》§2;不改表结构(alert_type/status 复用 payload 承载,audit_log.event_type 为 VARCHAR 可直接扩)。 1. settings.py + .env.example:一次性加齐风控追加 v1.1 共 11 项配置(C4~C6 共用)。 2. core_ro.concentration_profile(customer_id, limit=500):一次 SQL 取明细 (LIMIT limit+1 探测截断)+ Python 端按 min_risk_code in (R4,R5) 聚合; 收口挂账 #1(PRD 字面为 list_holdings,改聚合封装,docstring 注明偏离)。 3. rules.py:RULE_SCORES/RULE_ALERT_TYPES 加 RISK-006=60/pattern;RuleHit 加 alert_subtype;RiskThresholds 加 concentration_threshold 且 from_settings 必须补读(评审 P1-2:漏读会让 conftest monkeypatch 失效打穿现有断言); 新增纯函数 rule_concentration——空仓不触发、截断视同达标(保守告警)、 阈值边界 79.9% 不触发 / 80% 触发、R4+R5 为 0 不触发。 4. engine.process_trade_event:run_rules 之后、record_trade_alerts 之前并入 集中度命中(不动 run_rules 签名);命中后 L3 打 high_risk_concentration 标签 + 写 risk_concentration 审计(金额只落合计与前 5 条摘要)。 5. risk_repository:find_pending_event_alert 改候选 LIMIT 50 + Python 过滤掉 payload.alert_subtype 含 agent_behavior 的单(评审 P0-1:代理人维度行为链单 不得充当客户维度事件单的聚合锚点);append_alert_event 加 extra_subtypes 合并进 payload.alert_subtype(不传时行为与原先一致,向后兼容)。 6. alert_service:subtypes 集合维护(空集不注入 payload,评审 P2-3); 追加时 alert_type 按「老单规则 ∪ 本批规则」重算(评审 P1-3,修掉既有 large_amount 单被本批仅 RISK-006(60) 翻转为 pattern 的缺陷); _publish_alert 加 notify_role/extra 可选参数(C5/C6 复用)。 7. 对话线:chat_tools.customer_context 加 profile(concentration_ratio/ r45_value/total_value/holdings_truncated),tool_service.summarize 加 「高风险持仓占比 X%(仅供参考)」;不新增意图词。 8. 02-redis-keys.md 增补 alert_subtype / escalation_level 附加推送字段。 测试:conftest 加 autouse _disable_concentration_rule(阈值推 1.01 做回归隔离, 现有用例断言零改动);test_risk_rules 加 RISK-006 纯函数 6 例;新建 tests/test_concentration_c4.py 11 例(与 RISK-001 同单聚合、score max=70、 L3 tag、risk_concentration 审计、仅集中度也出单、subtype 合并、P0-1 回归、 alert_type 不翻转、对话线 ratio)。全量 453 绿(436 + 17)。
70 lines
2.1 KiB
Bash
70 lines
2.1 KiB
Bash
# Application
|
||
APP_ENV=development
|
||
|
||
# MySQL
|
||
MYSQL_HOST=127.0.0.1
|
||
MYSQL_PORT=3306
|
||
MYSQL_DATABASE=jinrong_agent
|
||
MYSQL_CORE_DATABASE=jinrong_core
|
||
MYSQL_USER=root
|
||
MYSQL_PASSWORD=
|
||
|
||
# Redis
|
||
REDIS_URL=redis://127.0.0.1:6379/0
|
||
|
||
# Neo4j
|
||
NEO4J_URI=bolt://localhost:7687
|
||
NEO4J_USER=neo4j
|
||
NEO4J_PASSWORD=
|
||
|
||
# Milvus Lite
|
||
# 注意:路径含中文会触发 Milvus Lite(faiss) 文件 IO 失败,Windows 中文用户目录请改纯英文绝对路径
|
||
MILVUS_URI=./data/milvus.db
|
||
|
||
# Ollama Embedding
|
||
OLLAMA_BASE_URL=http://127.0.0.1:11434
|
||
EMBED_MODEL=bge-m3
|
||
|
||
# DeepSeek LLM
|
||
DEEPSEEK_API_KEY=
|
||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
|
||
# JWT (T-01): production uses RS256 public key from IdP; empty path -> HS256 dev secret
|
||
# (HS256 is rejected at startup when APP_ENV != development)
|
||
JWT_PUBLIC_KEY_PATH=
|
||
JWT_DEV_SECRET=change-me-in-dev-only
|
||
JWT_ISSUER=https://idp.jinrong.internal
|
||
JWT_AUDIENCE=agent-gateway
|
||
|
||
# Risk thresholds (defaults = frozen rules, see docs/PRD/附-风控规则表.md)
|
||
# 注:RISK_ASSESSMENT_VALID_DAYS 已退役(AL-05 对齐 main 基准)——
|
||
# 风评有效期改由 jinrong_core.core_customer_risk.expires_at 数据驱动(FM-03)。
|
||
RISK_LARGE_AMOUNT=500000
|
||
RISK_DAILY_TOTAL=500000
|
||
RISK_FREQ_COUNT=3
|
||
RISK_PROBE_WINDOW_MINUTES=5
|
||
RISK_PROBE_COUNT=3
|
||
RISK_PROBE_AMOUNT=400000
|
||
RISK_SMALL_AMOUNT=10000
|
||
RISK_SMALL_COUNT=3
|
||
RISK_AML_DEFAULT_THRESHOLD=0.85
|
||
|
||
# 风控追加 v1.1(FR-8/9/10 · PRD §4A · C4~C6 共用)
|
||
# FR-8 RISK-006 集中度:R4+R5 市值占比 ≥ 该阈值即命中(0~1)
|
||
RISK_CONCENTRATION_THRESHOLD=0.80
|
||
# FR-9 RISK-007 时效升级:扫描周期(脚本参考)与两级超时小时数
|
||
RISK_ESCALATION_SCAN_MINUTES=15
|
||
RISK_ESCALATION_L1_HOURS=4
|
||
RISK_ESCALATION_L2_HOURS=24
|
||
# AML 单走短通道(1h/4h),与普通单分开计
|
||
RISK_ESCALATION_AML_L1_HOURS=1
|
||
RISK_ESCALATION_AML_L2_HOURS=4
|
||
# FR-10 RISK-008 代理人行为链:扫描周期与 A/B/C 三条件窗口与次数
|
||
RISK_AGENT_BEHAVIOR_SCAN_MINUTES=30
|
||
RISK_AGENT_BEHAVIOR_A_WINDOW_HOURS=24
|
||
RISK_AGENT_BEHAVIOR_A_COUNT=3
|
||
RISK_AGENT_BEHAVIOR_B_WINDOW_HOURS=72
|
||
RISK_AGENT_BEHAVIOR_B_COUNT=5
|
||
RISK_AGENT_BEHAVIOR_C_WINDOW_HOURS=24
|
||
RISK_AGENT_BEHAVIOR_C_COUNT=10
|