CI / lint / typecheck / import-linter / tests / secrets (push) Canceled after 0s
- agent: ag_conversation/ag_message 表(迁移0007),上下文组装注入最近报告画像摘要 (report.profile.latest_profile_summary 经 apps 层闭包注入,同层不互调),历史带最近 AGENT_HISTORY_TURNS=10 轮;POST/GET /agent/conversations 与消息历史接口 - agent 修复:ChatRequest.conversation_id 改 str(雪花ID超2^53,JS Number丢精度); _build_context 挪进 reserve commit 后同一 try,异常走 refund 兜底 - report: rp_feedback(维度反馈 upsert,认同率/修正率 SQL 可算,T-P3-21 最小版—— L1 记忆未建,不回写结论)+ rp_reservation(预约留资幂等,T-P3-22,预约率口径 行数/full_report.card_view 去重曝光,门槛≥8%),迁移0008 - 测试:全量 606 passed;ruff/mypy/lint-imports 全绿;E2E 真实 deepseek-v4-flash 验证 画像注入与历史携带
51 lines
1.9 KiB
Python
51 lines
1.9 KiB
Python
"""对外(同层以上)提供「最近一份报告的画像摘要」,供 Agent 上下文注入。
|
|
|
|
只取结论摘要而非报告全文:素材走 ``copy.compose_prompt_material``——与
|
|
REPORT_COPY 场景同一套裁剪纪律(skipped 维度不进素材防幻觉、超长按优先级
|
|
裁、硬结论永不裁),只是预算从报告的 6000 字符收紧到调用方给的额度。
|
|
|
|
归属纪律不变:rp_report / rp_input 只有 report 域内部可触(repo.py 头部
|
|
约定),外部要画像只能走这里。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from packages.report import repo
|
|
from packages.report.copy import compose_prompt_material
|
|
from packages.shared.logging import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
#: 往前翻几份报告找可用的诊断产物。正常用户只有几份;留余量是为了容错
|
|
#: 「最新一份 failed/processing 而上一份 succeeded」的场景。
|
|
_SCAN_LIMIT = 5
|
|
|
|
|
|
async def latest_profile_summary(
|
|
session: AsyncSession, *, user_id: int, max_chars: int
|
|
) -> str | None:
|
|
"""该用户最近一份带诊断结论的 succeeded 报告 → 紧凑 JSON 素材;无则 None。
|
|
|
|
NFR-SEC-03:摘要内容不进日志,这里只记「命中第几份报告」。
|
|
"""
|
|
reports = await repo.list_reports(session, user_id=user_id, limit=_SCAN_LIMIT)
|
|
for index, report in enumerate(reports):
|
|
if report.status != repo.STATUS_SUCCEEDED:
|
|
continue
|
|
diagnosis: Any = (report.result or {}).get("diagnosis")
|
|
if not isinstance(diagnosis, dict) or not diagnosis.get("dimensions"):
|
|
continue
|
|
material, dropped = compose_prompt_material(diagnosis, max_chars=max_chars)
|
|
logger.info(
|
|
"report_profile_summary_built",
|
|
report_id=report.report_id,
|
|
scan_depth=index,
|
|
dropped_keys=len(dropped),
|
|
)
|
|
return material
|
|
return None
|