feat(report): 形象深度诊断全链路——POST /reports/{id}/full 派生 tier=full 报告,复用 basic 输入与 32 维结果;full 流水线(无视觉阶段)LLM 扩写四大块(十二季定位/规则色板/4场景穿搭/30天计划),三重校验+语义重试+规则兜底降级;删除终身一次硬校验(40920 下线,重复生成由配额兜底);validation 枚举一致性校验放宽(十二季词表);迁移 0003 SSOT 补 full_report 规则行

This commit is contained in:
xsl
2026-09-15 00:02:44 +08:00
parent a1d0171fc5
commit 5c4f1fc75a
16 changed files with 1491 additions and 69 deletions
+17
View File
@@ -197,6 +197,23 @@ async def regenerate_report(
return ok(_submit_payload(submission))
@router.post(
"/{report_id}/full",
summary="生成深度诊断报告(基于该基础报告派生 tier=full,走 full_report 日配额)",
)
async def derive_full_report(
report_id: int,
payload: ReportRegenerateRequest,
user_id: CurrentUserId,
service: ReportServiceDep,
) -> dict[str, object]:
request_key = payload.request_key or f"report-full:{user_id}:{report_id}:{uuid.uuid4().hex}"
submission = await service.derive_full_report(
user_id=user_id, report_id=report_id, request_key=request_key
)
return ok(_submit_payload(submission))
@router.post(
"/{report_id}/export", summary="导出形象报告 PDF(走 hd_export 日配额,tier2 熔断可拦)"
)
+6 -1
View File
@@ -213,7 +213,12 @@ async def _generate_report(task_id: int) -> dict[str, Any]:
gateway = build_llm_gateway(settings)
try:
stages = assemble_stages(settings)
if report.tier == "full":
# 深度诊断:复用 basic 报告的 derived_features,无视觉阶段,
# 文案/校验换 full 专用阶段(产出 result.full 四大块)。
stages = assemble_stages(settings, paths=settings.report_full_pipeline_stages)
else:
stages = assemble_stages(settings)
ctx = ReportContext(
report=report,
report_input=report_input,