风控 SSE 内容协商与鉴权时序;docs/05 补齐 413 与风控入口(docs/25 P3 #23 #24 #25)

#23:413 是上传超限的标准语义,前端文档(风控业务演示文档 17)也已按 413 做提示
映射,所以不把代码降成 422,而是在 docs/05 §3.5 状态码表补登 413 —— 契约以"补齐"
而不是"改动"的方式对齐。

#24:/api/v1/risk/daily-report/stream 此前既不校验 Accept,又把鉴权留在 async
generator 内部。后者更隐蔽:StreamingResponse 已经返回、响应头已经发出,403 只能
变成"200 + 半截流"。现在 controller 先 await service.authorize(context) 再判定
Accept,顺序与 §6.4 一致(鉴权先行,不用状态码差异做探测)。SSE 协商逻辑抽到
app/api/dependencies/negotiation.py,与 /agent-runs/{run_id}/events 共用同一口径,
避免同一种客户端在一个端点上 200、另一个端点上 406。

#25:复核后确认前半段不成立 —— §19 末尾写明业务域接口由各自业务文档登记,风控 15 条
端点已在 06-模块接口与字段映射.md 逐条登记。真问题是 §12 表里写的
/api/v1/risk-scans/**、/api/v1/risk-alerts/** 与实际实现 /api/v1/risk/** 不符,
按实际实现更新 §12 并加说明;顺带把风控文档里 /daily-report/mail 的权限从
"按主项目邮件策略执行"改为实际的 risk:report:mail。

新增 tests/unit/api/test_risk_stream_negotiation.py(7 例)。
This commit is contained in:
2026-09-11 14:08:55 +08:00
parent a572c09a5c
commit 790518114b
8 changed files with 183 additions and 39 deletions
+7 -2
View File
@@ -153,6 +153,7 @@ Run Query Service -> RunRepository/ConversationRepository -> JSON/SSE View
| `403` | 角色、权限、适当性或数据范围拒绝 |
| `404` | 资源不存在,或为防止越权枚举而隐藏资源 |
| `409` | 幂等冲突、版本冲突或非法状态转换 |
| `413` | 请求体或上传文件超过大小限制 |
| `422` | 已解析请求不满足字段或业务输入约束 |
| `429` | 频率、并发或配额限制 |
| `500` | 未分类内部错误 |
@@ -787,10 +788,14 @@ Outbox 消费者按 `event_id` 幂等。失败事件保留并重试,超过阈
| 客服工单 | `/api/v1/customer-service/handover-tickets/**` | 客服业务文档 | 可生成摘要和转人工请求,不分配、接单、解决或关闭工单 |
| 投顾方案 | `/api/v1/advisory-plans/**` | 投顾业务文档 | 只生成分析草案,不代替投顾审核发布 |
| 场内模拟交易 | `/api/v1/sim-orders/**` | 交易业务文档 | 只读查询,不创建、确认或撤销委托 |
| 风控扫描 | `/api/v1/risk-scans/**` | 风控业务文档 | 可解释规则结果,不启动人工处置 |
| 风险预警 | `/api/v1/risk-alerts/**` | 风控业务文档 | 只读分析,不确认、升级或关闭预警 |
| 风控扫描 | `/api/v1/risk/**` | 风控业务文档 | 可解释规则结果,不启动人工处置 |
| 风险预警 | `/api/v1/risk/**` | 风控业务文档 | 只读分析,不确认、升级或关闭预警 |
| 场外基金运营 | 不属于当前系统 | 独立运营系统 | 不读写场内交易表 |
风控模块落地时把扫描、预警、证据、通知和日报收在同一个 Controller 下,入口为
`/api/v1/risk/**`(早期规划写作 `/risk-scans/**`、`/risk-alerts/**`,以本节的实际入口为准)。
具体端点清单、权限与字段映射由风控业务文档登记,见第 19 节末尾。
B 类业务写接口必须复用 JWT、响应信封、错误码、幂等、统一 `RequestContext`、事务和审计规则。Controller 只路由、校验、映射和调用 Service;禁止直接访问 Model。
## 13. A 类和 B 类扩展
@@ -67,7 +67,7 @@
|---|---|---|---|
| POST | `/daily-report` | 生成结构化日报 | `risk:alert:read` |
| POST | `/daily-report/stream` | 流式生成日报 | `risk:alert:read` |
| POST | `/daily-report/mail` | 发送日报邮件 | 按主项目邮件策略执行 |
| POST | `/daily-report/mail` | 发送日报邮件 | `risk:report:mail` |
## Agent Run