diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py new file mode 100644 index 00000000..707c1938 --- /dev/null +++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed.py @@ -0,0 +1,83 @@ +"""Seed the experimental ``页面研报设计师`` agent and reusable public skills. + +The runtime state directory (``.deer-flow``) and its ``skills/`` directory are +not source controlled. The verified agent/skill assets therefore live next to +this module and are copied only when a target is missing. Existing operations +or admin changes are always preserved. +""" + +from __future__ import annotations + +import logging +import shutil +from pathlib import Path + +from deerflow.config.paths import get_paths + +logger = logging.getLogger(__name__) + +PAGE_REPORT_DESIGNER_AGENT_ID = "page-report-designer" +PAGE_REPORT_SKILL_NAMES: tuple[str, ...] = ( + "page-report-generation", + "page-template-library", + "page-quality-review", +) + +_ASSETS_DIR = Path(__file__).parent / "_page_report_designer_seed_assets" +_AGENT_FILES: tuple[str, ...] = ("config.yaml", "SOUL.md") + + +def _ensure_skills() -> None: + """Seed every public page-report skill that is absent from this deployment.""" + try: + from deerflow.skills.storage import get_or_new_skill_storage + + public_dir = Path(get_or_new_skill_storage().get_skills_root_path()) / "public" + public_dir.mkdir(parents=True, exist_ok=True) + for skill_name in PAGE_REPORT_SKILL_NAMES: + source = _ASSETS_DIR / "skills" / skill_name + target = public_dir / skill_name + if target.exists(): + continue + if not (source / "SKILL.md").is_file(): + logger.error("Missing seed asset for page-report skill '%s': %s", skill_name, source) + continue + shutil.copytree(source, target) + logger.info("Seeded public page-report skill '%s'", skill_name) + except Exception: + logger.exception("Failed to seed page-report public skills") + + +def _ensure_agent() -> bool: + """Create the built-in agent directory once, without overwriting edits.""" + try: + target = get_paths().agent_dir(PAGE_REPORT_DESIGNER_AGENT_ID) + if target.exists(): + return False + source = _ASSETS_DIR / PAGE_REPORT_DESIGNER_AGENT_ID + if not source.is_dir(): + logger.error("Missing seed assets for page-report agent: %s", source) + return False + target.mkdir(parents=True, exist_ok=True) + for filename in _AGENT_FILES: + asset = source / filename + if asset.is_file(): + (target / filename).write_bytes(asset.read_bytes()) + logger.info("Seeded built-in agent '%s'", PAGE_REPORT_DESIGNER_AGENT_ID) + return True + except Exception: + logger.exception("Failed to seed built-in page-report agent") + return False + + +def ensure_page_report_designer_agent() -> bool: + """Seed the experimental agent and all of its public reusable skills.""" + _ensure_skills() + return _ensure_agent() + + +__all__ = [ + "PAGE_REPORT_DESIGNER_AGENT_ID", + "PAGE_REPORT_SKILL_NAMES", + "ensure_page_report_designer_agent", +] diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md new file mode 100644 index 00000000..36c8d557 --- /dev/null +++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/SOUL.md @@ -0,0 +1,37 @@ +# 页面研报设计师 + +你是「页面研报设计师」:把用户提供的数据、附件、当前会话产物和已生成的 Markdown 报告,组织成可交付的 HTML 汇报页面。你擅长深蓝和浅色大屏、文字型研判面板、表格、卡片、图表、甘特图与克制的动效。 + +你只编辑当前会话的工作副本和 `outputs/` 产物,绝不修改模板源文件。 + +## 先判断要不要画页面 + +1. 用户只是提问、解释、讨论、审阅时,正常用文字回答,不生成页面。 +2. 用户明确要求 Markdown / 报告 / 方案文档,且没有要求页面或 HTML 时,正常产出 Markdown;不要强制画页面。 +3. 用户明确说“页面、HTML、大屏、看板、可视化、图表展示、把材料做成页面”时,生成页面。 +4. 对于有明确“创作/产出”意图但未指定格式的请求,默认生成页面;若语气更像普通问答,仍按问答处理。 + +## 材料与检索边界 + +- 先读取本轮用户材料、上传文件、会话中的 Markdown / JSON 产物;已有信息足够时直接制作,**不得自动检索**。 +- 信息不足以支撑结论、用户没有提供数据且未授权检索时,先简洁说明缺口,并询问:“是否允许我检索公开资料补充?”不要先调用 `web_search`。 +- 用户明确强调“即使没有数据也要图表”时,仍应正常绘制图表:使用用户已给的定性信息或合理示意数据,但必须在图例、口径或脚注标注“示意数据 / 待补充数据”。不得把示意数值说成真实事实。 +- 用户确认可以检索后,才使用 `web_search`;把来源、日期和不确定性写进相应文字面板或页脚。 + +## 页面生成流程 + +1. 将材料归为:事实数据、可推导结论、待补充项、图表数据、长文本、表格行、行动/风险项。优先保留用户原文的关键判断和数据口径。 +2. 读取 `page-template-library` 技能;调用 `page_report_template(action="prepare")`,传入当前界面提供的 `presentation_theme`(`dark` 或 `light`)。无该上下文时,按用户明示主题,否则默认浅色。 +3. 页面文字通常要多于图表:至少包含结论摘要、关键发现、事项/风险说明、数据口径或来源、行动建议中的多个展示样式。材料丰富时优先生成约 3 页;材料较少时删减模板页和无数据卡片,不留空面板。 +4. 复制后的工作副本是骨架。保留已有图表渲染、动效和导航逻辑;用真实数据替换 `reportData` 和相关文本。若模板存在 5 页,可保留其中最贴合的 3 页而不是机械展示全部。 +5. 所有可见正文、表头、标签、说明文字最小字号均为 16px;长文本面板要增高、提高行高,不能把段落挤成一团。 +6. 最终 HTML 写入 `/mnt/user-data/outputs/`。调用 `page_report_template(action="validate")`;若返回错误,先修复再交付。通过后调用 `present_files` 展示 HTML 和必要的质量报告。 + +## 设计要求 + +- 跟随 `presentation_theme`:`dark` 选深蓝骨架,`light` 选浅色骨架;不要把产品现有聊天页面风格照搬进汇报页面。 +- 深色使用深蓝科技感,选中状态可有细腻的扫描光、描边或流光;浅色使用清晰留白与高对比文字。 +- 动效服务于阅读:数字滚动、图表入场、进度条、轻量背景粒子即可;支持 `prefers-reduced-motion`,不使用刺眼或持续大幅运动。 +- 图表必须与材料一致。数据不够时宁可删掉图表或明确标为示意,不伪造事实;避免为了“丰富”而堆满图。 +- 文字展示不能只是一种卡片。灵活组合:摘要带、洞察卡、左右对照、时间线、风险清单、引用/口径块、行动闭环、说明段、表格、问答式要点、负责人/截止日清单。 +- 每页都要有明确标题、数据时间/口径、可读的结论。HTML 必须自包含,不依赖第三方 CDN。 diff --git a/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml new file mode 100644 index 00000000..120ef28d --- /dev/null +++ b/offline-backend-20260512/backend/app/gateway/routers/_page_report_designer_seed_assets/page-report-designer/config.yaml @@ -0,0 +1,18 @@ +id: page-report-designer +name: 页面研报设计师 +description: 实验性页面研报智能体:根据用户材料、上下文产物和主题色,选择可复用 HTML 骨架,生成文字与图表详略得当的高质量汇报页面 +tool_groups: + - web + - file:read + - file:write + - bash + - page:report +skills: + - page-report-generation + - page-template-library + - page-quality-review +common_questions: + - title: 根据材料生成汇报页面 + prompt: 请根据我提供的材料,生成一套文字为主、图表详略得当的 HTML 汇报页面;沿用当前界面主题色。 + - title: 将报告转为多页面大屏 + prompt: 请读取当前会话中的 Markdown 报告和附件,生成 3 页左右的 HTML 大屏汇报,并保留关键结论、表格和图表。 diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py new file mode 100644 index 00000000..cfa44713 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/__init__.py @@ -0,0 +1,19 @@ +"""Reusable report-page template selection and quality helpers. + +The package deliberately lives in the harness layer: it knows only about +template files and the current thread sandbox, never Gateway/application code. +""" + +from .templates import ( + PageTemplateProfile, + choose_template, + list_template_profiles, + resolve_template_file, +) + +__all__ = [ + "PageTemplateProfile", + "choose_template", + "list_template_profiles", + "resolve_template_file", +] diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html new file mode 100644 index 00000000..c4623054 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-charts-portal-template.html @@ -0,0 +1,1475 @@ + + + + + + 深蓝科技风 · 图表增强导航式汇报模版 + + + + + +
+ + +
+
+ +
态势汇报平台SITUATION REPORT PORTAL
+
+ +
+ LIVE +
+
--:--:--
+
—
+
+ +
+
+ +
+ +
+
+
+
本期任务总量详情 ↗
+
0件
+
↑ 14.8%较上期
+
+
+
按时处置率详情 ↗
+
0%
+
↑ 2.1%较上期
+
+
+
高优先级事项详情 ↗
+
0件
+
↓ 8.6%连续两期下降
+
+
+
综合运行指数详情 ↗
+
0
+
良好处于健康区间
+
+
+ +
+
+
+

任务处置趋势

+
处置完成量新增任务量
+ 近 12 个月 · 单位:件 +
+
+ +
8 月处置完成量创年度新高
+
+
+
+

区域活跃度排行

TOP 6 · 单位:件
+
+
前三区域贡献 56% 新增量
+
+
+ +
+
+

态势简报

本期综述
+
整体运行保持「增长有支撑、风险可前置、协同待加强」的特征,核心任务全部按时闭环,为四季度收口打下坚实基础。
+

任务总量保持稳定扩张,华东与华北区域形成明显拉动效应,新增业务主要来自高价值场景。随着重点项目进入成果验收期,跨部门协同请求较上一阶段有所增加,但绝大多数事项仍在既定时效内完成闭环,未出现重大延期或质量回退。

+

当前需要特别关注资源分配的均衡性:部分区域在高峰时段的待办积压接近预警线。建议以「责任到人、日清日结」的方式完成临期事项处置,并在周例会上对异常波动进行复盘。

+
增长有支撑风险可前置协同待加强口径已核验
+
+
+

实时动态

自动滚动 · 悬停暂停
+
+
列表自动向上无限滚动,鼠标悬停可暂停阅读
+
+
+
+ + +
+
+

研判导语

打字机输入中
+
+
+
+
+
+

综合能力雷达

+
本期上期
+ 五维评估 +
+
+
+ +
+
+
+
+
+
+

投入产出分布

+
常规事项重点项目创新事项
+ 气泡大小:影响度 +
+
+ 价值贡献 ↑投入强度 → +
+
+
+
+
+

任务类型构成

本期占比
+
+
+ + + + +
0任务总量
+
+
+
+
+
+
✓成效与亮点STRENGTHS
+
核心任务全部按时闭环

本阶段无重大延期事项,交付质量稳中有升。

+
跨区域协同效率提升

平均响应时长缩短,协同请求大多在时效内完成。

+
风险预警机制见效

预警前置后临期事项明显减少,处置节奏更从容。

+
数据治理口径统一

期末核验完成,跨阶段对比与追溯具备数据基础。

+
+
+
!问题与挑战CHALLENGES
+
资源分配仍不均衡

部分区域高峰时段待办积压接近预警线。

+
跨部门等待时长偏高

少数事项在流转环节停留过久,责任边界待明确。

+
两项专项资源临界

四季度交付与验收并行,关键岗位依赖度上升。

+
经验沉淀不够系统

领先做法尚未形成标准流程,复制速度受限。

+
+
+
+
+ 01
结构性增长明显

核心区域增速领先,新增贡献集中于高价值场景,增长来源清晰可持续。

+
+
+ 02
协同机制成效显现

平均响应时长明显缩短,领先打法已具备向其他区域复制的条件。

+
+
+ 03
风险处置持续前置

预警前置后大部分临期事项提前进入处置流程,风险总体可控。

+
+
+
+ + +
+
+
+
+

重点任务推进计划

2026 年 04 — 09 月 · 点击行看详情
+
任务事项
040506070809
状态
+
+
+ 按计划 + 已提前完成 + 需重点跟进 + 闪烁竖线 = 当前时间(09 月) +
+
+
+
+

周度任务节奏

+
周闭环量周新增量
+ 近 12 周 · 单位:件 +
+
+
+
+
+
+

推进说明

本期口径
+

六项重点任务中,两项已提前完成并转入常态运行;三项按计划推进,节点偏差均在 5% 以内;一项因试点适配差异需要额外磨合期,已列入重点关注。

+

甘特条上的流光表示任务处于活跃推进状态;竖线为当前时间指示,便于直观判断各任务的剩余窗口。

+
+
+

阶段完成度

截至 09.01
+
+
+
+

下阶段重点

Q4 安排
+
+
一
锁定临界资源

本周内完成两项临界专项的补充排期与责任人确认。

+
二
复制领先经验

华东协同打法向华南、西南推广,季度内完成首轮验证。

+
三
固化复盘机制

以周为周期刷新里程碑,偏差超 5% 启动专项复盘。

+
+
+
+
+
+

关键里程碑

08 — 09 月节点 · 进度线自动填充
+
+
+
08.15资源调度机制启动

动态支援名单上线,高峰积压初步缓解。

+
08.21预警规则优化上线

窗口 24h 前置至 48h,临期事项明显减少。

+
08.28重点项目验收准备

阶段交付完成,成果校验与归档推进中。

+
09.01月度数据完成更新

完整度 97.8%,统一口径已锁定。

+
09.15四季度资源预置

资源锁定与经验复制双线并行推进。

+
+
+
+ + +
+
+
+

月度处置对比

单位:件 · 绿色为峰值
+
+
柱体从底部回弹生长(transform 动画,不卡顿)
+
+
+

处置记录

自动滚动 · 悬停暂停
+
+
+
+
+
+

重点事项清单

点击行查看详情
+ + + + + + + + + + +
事项归属优先级状态更新
区域协同专项(二轮)机制标准化推广运营管理组高需关注
重点事项闭环治理清单化 · 日清日结综合协调组高进行中
数据质量提升行动口径统一 · 期末核验数据管理组中进行中
阶段成果验收准备材料预审 · 资源协调项目统筹组高进行中
临期预警规则优化24h → 48h 前置运营管理组中已完成
专项资源调度机制动态支援名单综合协调组高已完成
+
+
+

明细口径说明

阅读指引
+

月度柱状图统计近 12 个月的处置完成量,峰值月以绿色高亮;处置记录按时间倒序自动滚动,覆盖五类事项闭环情况。所有明细均可追溯至运行台账,口径与总览页一致。

+

点击清单任意行可查看事项详情与阶段完成度;若需按状态或区域过滤,可在台账系统按相同口径导出。

+
+
+
+ + +
+
+
CONCLUSION · 管理层研判
+
以「机制固化 + 资源前置」保障年度目标如期收口
+

本报告基于统一核验口径的数据与事实,归纳本阶段运行特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。

+
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华北区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度各项收口动作按计划推进。

+
+
“汇报不只是展示数据,更要明确数据说明了什么、下一步由谁在什么时间完成什么动作。”
+
+
+
+

核心结论

三条判断
+
一
运行态势稳中向好

核心指标处于健康区间,增长有支撑、结构在优化,具备四季度收口的坚实基础。

+
二
机制价值已经验证

预警前置、协同调度等机制经受检验,应固化为标准流程并扩大适用范围。

+
三
风险收敛但需跟踪

风险总量下降趋势明确,临界资源与跨部门流转仍是需要持续关注的重点。

+
+
+
+

↗增长机会 · 区域经验复制

+

将华东区域的协同打法沉淀为标准化流程,优先覆盖高频业务场景,向华南、西南推广并季度内完成首轮验证。

+
建议责任:运营管理组完成期限:09.15
+
+
+

!重点关注 · 临界资源调度

+

两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。

+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+

判断 — 依据 — 行动矩阵

结构化对照
+
+
核心判断
事实依据
建议行动
+
增长质量向好
累计完成量、重点项目交付与区域活跃度均保持增长,新增业务主要来自高价值场景。
沉淀领先区域协同流程,在华南、西南先行试点复制。
+
收口压力上升
验收准备、资源协调与成果归档进入并行阶段,少数事项临近时间窗口。
建立专项清单,明确日级负责人与周例会偏差复盘规则。
+
风险总体可控
高优先级事项连续两期下降,预警前置后大部分临期事项已在时限内闭环。
维持 48 小时临期预警,跨区域事项保留人工兜底通道。
+
+
+
+
+ + + + + + + + +
操作成功(演示)
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html new file mode 100644 index 00000000..2676662a --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-portal-template.html @@ -0,0 +1,1053 @@ + + + + + + 深蓝科技风 · 导航式多页面汇报模版 + + + + + +
+ + +
+
+ +
态势汇报平台SITUATION REPORT PORTAL
+
+ +
+ LIVE +
+
--:--:--
+
—
+
+ +
+
+ +
+ +
+
+
+
本期任务总量口径说明 ↗
+
0件
+
↑ 14.8%较上期
+
+
+
按时处置率口径说明 ↗
+
0%
+
↑ 2.1%较上期
+
+
+
高优先级事项口径说明 ↗
+
0件
+
↓ 8.6%连续两期下降
+
+
+
综合运行指数口径说明 ↗
+
0
+
良好处于健康区间
+
+
+ +
+
+

态势简报

本期综述
+
整体运行保持「增长有支撑、风险可前置、协同待加强」的特征,核心任务全部按时闭环,为四季度收口打下坚实基础。
+

任务总量保持稳定扩张,华东与华北区域形成明显拉动效应,新增业务主要来自高价值场景。随着重点项目进入成果验收期,跨部门协同请求较上一阶段有所增加,但绝大多数事项仍在既定时效内完成闭环,未出现重大延期或质量回退。

+

当前需要特别关注资源分配的均衡性:部分区域在高峰时段的待办积压接近预警线。建议以「责任到人、日清日结」的方式完成临期事项处置,并在周例会上对异常波动进行复盘。

+
+
+

预警动态

点击查看详情
+
+
跨区域协同事项临近时限华北 · 协同处置
› +
+
+
重点任务处理量短时波动华东 · 数据研判
› +
+
+
待分派事项超过预设阈值西南 · 任务分派
› +
+
+
两项指标进入观察区间综合 · 运行质量
› +
+
+
夜间巡检任务已按时闭环华南 · 巡查监测
› +
+
+
+ +
+
+ 区域协同专项 +

跨区域协同机制进入第二轮验证,平均响应时长已缩短,正在沉淀标准流程。

+
阶段完成度78%
+
+ +
+
+ 重点事项闭环治理 +

对临期、高频、跨部门三类事项建立清单化治理,实行日清日结跟踪。

+
阶段完成度65%
+
+ +
+
+ 数据质量提升行动 +

统一统计口径与期末核验机制,保障跨阶段数据可对比、可追溯。

+
阶段完成度52%
+
+ +
+
+
+ + +
+
+
本阶段研判基于统一核验口径的事实数据,从增长、协同、风险、数据治理四个维度归纳关键发现,并给出对应的行动建议。
+
+
+
+ 01 +
结构性增长更加明显

核心区域业务量增长高于整体平均水平,新增贡献集中在高价值场景,增长来源清晰、可持续。

› +
+
+ 02 +
协同机制成效显现

跨区域协同请求平均响应时长明显缩短,领先打法已具备复制条件。

› +
+
+ 03 +
风险处置持续前置

预警窗口前置至 48 小时后,大部分临期事项提前进入处置流程,风险总体可控。

› +
+
+ 04 +
数据口径保持统一

全部统计完成期末核验,与上期口径一致,支持跨阶段对比与追溯。

› +
+
+
+
+
✓成效与亮点STRENGTHS
+
核心任务全部按时闭环

本阶段无重大延期事项,交付质量稳中有升。

+
跨区域协同效率提升

平均响应时长缩短,协同请求大多在时效内完成。

+
风险预警机制见效

预警前置后临期事项明显减少,处置节奏更从容。

+
+
+
!问题与挑战CHALLENGES
+
资源分配仍不均衡

部分区域高峰时段待办积压接近预警线。

+
跨部门等待时长偏高

少数事项在流转环节停留过久,责任边界待明确。

+
经验沉淀不够系统

领先做法尚未形成标准流程,复制速度受限。

+
+
+
+ 析 +

综合研判:成效源于机制而非偶然,挑战集中在资源与流程两端。建议以「机制固化 + 资源前置」为主线安排四季度工作,把已验证的做法沉淀为标准流程,同时对临界资源提前排期。

+
+
+ + +
+
+ + + + + 共 8 条 +
+
+ + + + + + + + + + + + +
任务事项归属优先级状态更新时间操作
区域协同专项(第二轮验证)协同机制标准化推广运营管理组高需关注
重点事项闭环治理清单化 · 日清日结综合协调组高进行中
数据质量提升行动口径统一 · 期末核验数据管理组中进行中
阶段成果验收准备材料预审 · 资源协调项目统筹组高需关注
四季度资源预置岗位锁定 · 协作预置人力协调组中进行中
临期预警规则优化24h → 48h 前置运营管理组中已完成
专项资源调度机制动态支援名单综合协调组高已完成
风险事项专项排查全量排查 · 台账建立风控管理组中已完成
+
提示:点击任意行或「查看」可打开任务详情弹窗;上方筛选标签可按状态过滤。
+
+
+ + +
+
+
+

关键里程碑

点击节点查看详情
+
+
+
08.15已完成
专项资源调度机制启动

建立动态支援名单,高峰积压问题初步缓解。

+
+
+
08.21已完成
临期预警规则优化上线

预警窗口 24h 前置至 48h,临期事项明显减少。

+
+
+
08.28已完成
重点项目进入验收准备

阶段交付完成,成果校验与归档推进中。

+
+
+
09.01进行中
月度态势数据完成更新

完整度 97.8%,统一口径已锁定。

+
+
+
09.15计划中
四季度资源预置与经验复制

资源锁定 + 经验复制双线并行推进。

+
+
+
+
+
+

阶段完成度

截至 09.01
+
协同专项78%
+
闭环治理65%
+
数据质量行动52%
+
验收准备38%
+
+
+

下阶段重点

Q4 安排
+
+
一
锁定临界资源

本周内完成两项临界专项的补充排期与责任人确认。

+
二
复制领先经验

华东协同打法向华南、西南推广,季度内完成首轮验证。

+
三
固化复盘机制

以周为周期刷新里程碑,偏差超 5% 启动专项复盘。

+
+
+
+
+
+ + +
+
+
CONCLUSION · 管理层研判
+
以「机制固化 + 资源前置」保障年度目标如期收口
+

本报告基于统一核验口径的数据与事实,归纳本阶段运行特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。

+
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度各项收口动作按计划推进,避免风险在期末集中暴露。

+
+
“汇报不只是展示数据,更要明确数据说明了什么、下一步由谁在什么时间完成什么动作。”
+
+
+
+

核心结论

三条判断
+
一
运行态势稳中向好

核心指标处于健康区间,增长有支撑、结构在优化,具备四季度收口的坚实基础。

+
二
机制价值已经验证

预警前置、协同调度等机制经受检验,应固化为标准流程并扩大适用范围。

+
三
风险收敛但需跟踪

风险总量下降趋势明确,临界资源与跨部门流转仍是需要持续关注的重点。

+
+
+
+

↗增长机会 · 区域经验复制

+

将华东区域的协同打法沉淀为标准化流程,优先覆盖高频业务场景,向华南、西南推广并季度内完成首轮验证,预计可贡献新增规模 0.32 亿元。

+
建议责任:运营管理组完成期限:09.15
+ +
+
+

!重点关注 · 临界资源调度

+

两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。

+
建议责任:项目统筹组完成期限:本周内
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作成功(演示)
+
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html new file mode 100644 index 00000000..4df2da78 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-neon-template.html @@ -0,0 +1,824 @@ + + + + + + 深蓝科技风 · 大屏汇报模版(炫光精简版) + + + + + +
+ +
+ +
+
+ +
战略智能运行中心STRATEGIC INTELLIGENCE CENTER
+
+
+
+
+

城市运行态势感知大屏

+

URBAN OPERATION SITUATION AWARENESS · 2026

+
+
+
+
+
LIVE
+
+
--:--:--
+
——
+
+
+
+ +
+ +
+
+

核心运行指标

实时
+
+
+
+

区域活跃度排行

TOP 5
+
+
+
+

运行健康度

实时评估
+
+
+ + + + + + + + + + + +
0健康指数
+
+
+
+
+
+ + +
+
+

任务处置趋势

近 12 个月 · 单位:件
+
+
处置完成量新增任务量
+
8 月处置完成量创年度新高
+
+
+
+
+

实时态势雷达

信号自动跟踪
+
+
+ + + + + + + + +
+
+
0路活动信号
+
+
+
+
+
+

任务类型构成

本期占比
+
+
+ + + + +
0任务总量
+
+
+
+
+
+
+ + +
+
+

实时预警滚动

最近更新
+
+
+
+
+
+

月度处置对比

单位:件
+
+
+
柱体高亮为月度峰值
+
+
+
+

重点任务进度

本期跟踪
+
+
+
+
+ + + +
+ +
+
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html new file mode 100644 index 00000000..01ea03d8 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-dark-template.html @@ -0,0 +1,1337 @@ + + + + + + 深蓝科技风 · 数据驾驶舱大屏 + + + +
+
+
+
+ +
+ +
+
+
+ + + +
+ DATA COMMAND CENTER +
+
+

智能数据驾驶舱

+

INTELLIGENT DATA COMMAND CENTER · REAL-TIME MONITORING

+
+
+
+ + LIVE DATA +
+ 2026-09-01 10:30:00 +
+
+ + +
+
+
+ + + +
+
本月处理总量
+
0
+
+ ↑ 14.8% + 较上月 +
+ + + +
+ +
+
+ + + + +
+
按时处置率
+
0%
+
+ ↑ 2.1% + 较上月 +
+ + + +
+ +
+
+ + + +
+
高优先级事项
+
0
+
+ ↓ 8.6% + 较上月 +
+ + + +
+ +
+
+ + + +
+
综合健康指数
+
0
+
+ 良好 + 健康区间 +
+ + + +
+
+ + +
+ +
+
+

任务处置趋势

+ 近12月 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ 完成量 + 新增量 +
+
+ + +
+
+

业务类型分布

+ 结构分析 +
+
+
+ + + + + + + +
+
8,420
+
总事务
+
+
+
+
研判分析45%
+
协同处置30%
+
巡查监管20%
+
其他事项5%
+
+
+ + +
+
各类型月度趋势
+
+
+
+ + +
+
+

能力雷达评估

+ 五维分析 +
+
+ + + + + + + + + + + + + + + + +
+
+ 处置效率 +
+ 92 +
+
+ 协同能力 +
+ 88 +
+
+ 数据质量 +
+ 95 +
+
+ 响应速度 +
+ 84 +
+
+ 风险管控 +
+ 86 +
+
+
+
+ + +
+
+

区域活跃度排行

+ TOP 5 +
+
+
+ 1 + 华东区域 +
+ 3,420 +
+
+ 2 + 华北区域 +
+ 2,980 +
+
+ 3 + 华南区域 +
+ 2,640 +
+
+ 4 + 西南区域 +
+ 1,860 +
+
+ 5 + 西北区域 +
+ 1,250 +
+
+
+ + +
+
+

实时预警信息

+ 3 条 +
+
+
+
+ + + + +
+
+
跨区域协同事项临近时限
+
华北区域 · 协同处置
+
+ 10:18 +
+
+
+ + + + + +
+
+
重点任务处理量波动
+
华东区域 · 数据研判
+
+ 10:05 +
+
+
+ + + + + +
+
+
待分派事项超过阈值
+
西南区域 · 任务分派
+
+ 09:42 +
+
+
+
+ + +
+ +
+
+

关键进展时间线

+ 最新动态 +
+
+
+
09.01 · 09:30
+
月度态势数据完成更新
+
数据完整度达 97.8%,报告已同步
+
+
+
08.28 · 16:40
+
重点项目进入验收准备
+
区域协同专项完成阶段交付
+
+
+
08.21 · 11:20
+
临期预警规则优化
+
预警触发窗口由24h提前至48h
+
+
+
08.15 · 14:00
+
专项资源调度启动
+
建立动态支援名单监测流转效率
+
+
+
+ + +
+
+

运行健康度

+ 实时 +
+
+
+
0
+
处理时效
+
+
+
0
+
协同效率
+
+
+
0
+
数据完整度
+
+
+
0
+
风险可控度
+
+
+
+ + +
+
+

投入产出分布

+ 价值分析 +
+
+ + + + + + + 低价值 + 高价值 + 高投入 +
+
+
+ + + +
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html new file mode 100644 index 00000000..ac98e458 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-portal-template.html @@ -0,0 +1,1029 @@ + + + + + + 浅色轻盈风 · 导航式多页面汇报模版 + + + + +
+
+
+ + +
+
+ +
经营分析平台BUSINESS INSIGHT PORTAL
+
+ +
+ LIVE +
+
--:--:--
+
—
+
+ +
+
+ +
+ +
+
+
+
年度累计达成率口径说明 ↗
+
0%
+
↑ 6.2%较去年同期
+
+
+
累计业务规模口径说明 ↗
+
¥ 0亿
+
↑ 12.6%同比增长
+
+
+
重点项目完成率口径说明 ↗
+
0%
+
↑ 3.8%较上月
+
+
+
风险事项数量口径说明 ↗
+
0项
+
↓ 21.7%较年初
+
+
+ +
+
+

经营简报

本期综述
+
经营呈现「规模稳步增长、结构持续优化、风险总体可控」的积极态势,年度目标达成进度符合预期,为四季度收口留出充分空间。
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。

+
+
+

风险与提示

点击查看详情
+
+
两项专项进入资源临界区项目统筹 · 资源协调
› +
+
+
区域间运营差距扩大区域经营 · 梯队建设
› +
+
+
经验沉淀进度滞后运营管理 · 流程建设
› +
+
+
两项指标进入观察区间综合 · 经营质量
› +
+
+
月度经营数据完成校验综合 · 数据管理
› +
+
+
+ +
+
+ 区域经验复制专项 +

将华东协同打法沉淀为标准流程,向华南、西南推广并完成首轮验证。

+
阶段完成度72%
+
+ +
+
+ 重点项目收口 +

统筹交付、验收与归档三线并行,锁定关键岗位与外部协作资源。

+
阶段完成度58%
+
+ +
+
+ 经营复盘机制建设 +

建立以周为周期的里程碑刷新与偏差复盘,固化跟踪动作。

+
阶段完成度44%
+
+ +
+
+
+ + +
+
+
本阶段研判基于财务与业务双重校验的事实数据,从增长、结构、项目、风险四个维度归纳关键发现,并给出对应的行动建议。
+
+
+
+ 01 +
业务结构进一步优化

高价值场景占比持续提升,收入质量改善为后续增长提供更稳固基础。

› +
+
+ 02 +
区域增长梯队分化

领先区域已形成可复制经验,但各区域运营差距仍需标准化方法缩小。

› +
+
+ 03 +
项目收口进入关键窗口

交付、验收与资源协调并行推进,里程碑偏差整体可控。

› +
+
+ 04 +
风险治理成效显现

风险事项数量较年初明显下降,预警机制帮助多数临期事项提前处置。

› +
+
+
+
+
✓成效与亮点STRENGTHS
+
达成进度符合预期

年度累计达成率 86.8%,较去年同期提高 6.2 个百分点。

+
重点项目交付领先

阶段完成率 94.1%,多数项目快于计划节奏推进。

+
区域协同机制成型

领先区域打法开始沉淀,具备复制推广条件。

+
+
+
!问题与挑战CHALLENGES
+
区域间差距待缩小

梯队分化明显,后发区域能力建设需要体系化投入。

+
两项项目资源临界

关键岗位依赖度高,四季度并行压力上升。

+
复盘机制尚未闭环

偏差复盘以事后为主,缺少周期化、制度化安排。

+
+
+
+ 析 +

综合研判:本期成效更多来自机制与结构性改善,而非短期投入。建议围绕「复制增长经验、前置收口资源、固化复盘机制」三条主线安排四季度工作,把已验证的做法转化为可持续的经营能力。

+
+
+ + +
+
+ + + + + 共 8 条 +
+
+ + + + + + + + + + + + +
任务事项归属优先级状态更新时间操作
区域经验复制专项流程沉淀 · 试点推广区域经营组高进行中
重点项目收口交付 · 验收 · 归档并行项目统筹组高需关注
经营复盘机制建设周度刷新 · 偏差复盘经营管理组中进行中
四季度资源预置岗位锁定 · 协作预置人力协调组中进行中
经验手册定稿标准流程输出区域经营组中需关注
重点客户项目阶段验收成果达标 · 材料归档项目统筹组高已完成
区域经营复盘启动经验提炼 · 素材归集经营管理组中已完成
风险事项专项排查全量排查 · 台账建立风控管理组中已完成
+
提示:点击任意行或「查看」可打开任务详情弹窗;上方筛选标签可按状态过滤。
+
+
+ + +
+
+
+

关键里程碑

点击节点查看详情
+
+
+
08.08已完成
风险事项专项排查完成

识别两项临界风险,台账转入周更。

+
+
+
08.18已完成
区域经营复盘机制启动

经验提炼完成,复盘升级为周度。

+
+
+
08.27已完成
重点客户项目完成阶段验收

成果达标,进入交付准备。

+
+
+
09.01进行中
经营数据完成期末更新

双重校验完成,统一口径锁定。

+
+
+
09.15计划中
四季度资源预置与经验复制

资源锁定 + 经验复制双线并行。

+
+
+
+
+
+

阶段完成度

截至 09.01
+
经验复制专项72%
+
重点项目收口58%
+
复盘机制建设44%
+
四季度资源预置35%
+
+
+

下阶段重点

Q4 安排
+
+
一
复制增长经验

华东协同打法向华南、西南推广,季度内完成首轮验证。

+
二
前置收口资源

本周完成临界项目的补充排期与责任人确认。

+
三
固化复盘机制

周度里程碑刷新,偏差超 5% 启动专项复盘。

+
+
+
+
+
+ + +
+
+
CONCLUSION · 管理层研判
+
以「复制增长经验 + 前置收口资源」保障年度目标达成
+

本报告基于财务与业务双重校验的数据与事实,归纳本阶段经营特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。

+
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进,避免风险在期末集中暴露。

+
+
“一份好的汇报应把事实、判断和行动连接起来,让每段文字都能落到可执行的下一步。”
+
+
+
+

核心结论

三条判断
+
一
经营态势积极稳健

规模、结构与质量指标同步改善,年度目标达成在望。

+
二
增长动力可以复制

领先区域经验已被验证,标准化推广可转化为整体能力。

+
三
管理重点转向前置

资源、风险与复盘均需前置安排,把事后补救变为事前布防。

+
+
+
+

↗增长机会 · 区域经验复制

+

将华东区域的协同打法沉淀为标准化流程,优先覆盖高频客户场景,向华南、西南推广并季度内完成首轮验证,预计可新增业务规模 0.32 亿元。

+
建议责任:区域经营组完成期限:09.15
+ +
+
+

!重点关注 · 临界资源调度

+

两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。

+
建议责任:项目统筹组完成期限:本周内
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作成功(演示)
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html new file mode 100644 index 00000000..56b8a47c --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-airy-template.html @@ -0,0 +1,750 @@ + + + + + + 浅色轻盈风 · 大屏汇报模版(玻璃拟态动画版) + + + + +
+
+
+ +
+ +
+
+
+
经营分析中心EXECUTIVE INSIGHTS
+
+
+

年度经营分析汇报

+
+

BUSINESS PERFORMANCE REVIEW · 2026

+
+
+ 累计至 09 月 + — +
+
+ + +
+
+
+
年度累计达成
+
+
↑ +6.2%较去年同期
+
+ + + + +
+
+
+
+
+
+ + +
+
+

月度目标达成趋势

单位:% · 悬停查看数值
+
+
实际达成目标基线
+ +
+
+
+ +
+

业务结构占比

累计规模
+
+
+ + + + +
0亿元
+
+
+
+
+ +
+

区域达成排行

目标完成率
+
+
+ +
+

月度处置节奏

单位:件
+
+
+
青色柱体为月度峰值
+
+
+ +
+

关键里程碑

本期节点
+
+
+
+
+
+
+
+ + +
+ + + +
+ 本页面为独立 HTML 汇报模板 · 数据与文案均可替换 +
+ 数据每 5 分钟自动刷新 + +
+
+
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html new file mode 100644 index 00000000..81c6e573 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-light-charts-portal-template.html @@ -0,0 +1,1468 @@ + + + + + + 浅色轻盈风 · 图表增强导航式汇报模版 + + + + +
+
+
+ + +
+
+ +
经营分析平台BUSINESS INSIGHT PORTAL
+
+ +
+ LIVE +
+
--:--:--
+
—
+
+ +
+
+ +
+ +
+
+
+
年度累计达成率详情 ↗
+
0%
+
↑ 6.2%较去年同期
+
+
+
累计业务规模详情 ↗
+
¥ 0亿
+
↑ 12.6%同比增长
+
+
+
重点项目完成率详情 ↗
+
0%
+
↑ 3.8%较上月
+
+
+
风险事项数量详情 ↗
+
0项
+
↓ 21.7%较年初
+
+
+ +
+
+
+

月度目标达成趋势

+
实际达成目标基线
+ 2026 年 1 — 9 月 · 单位:% · 悬停无干扰 +
+
+ +
9 月达成率 86.8%,持续领先目标基线
+
+
+
+

区域达成排行

TOP 6 · 目标完成率
+
+
前三区域贡献 62% 业务规模
+
+
+ +
+
+

经营简报

本期综述
+
经营呈现「规模稳步增长、结构持续优化、风险总体可控」的积极态势,年度目标达成进度符合预期,为四季度收口留出充分空间。
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。

+
规模稳步增长结构持续优化风险总体可控口径双重校验
+
+
+

经营动态

自动滚动 · 悬停暂停
+
+
列表自动向上无限滚动,鼠标悬停可暂停阅读
+
+
+
+ + +
+
+

研判导语

打字机输入中
+
+
+
+
+
+

经营能力雷达

+
本期上期
+ 五维评估 +
+
+
+ +
+
+
+
+
+
+

投入产出分布

+
常规业务重点项目创新业务
+ 气泡大小:收益贡献 +
+
+ 收益贡献 ↑投入强度 → +
+
+
+
+
+

业务结构占比

累计规模
+
+
+ + + + +
0亿元
+
+
+
+
+
+
✓成效与亮点STRENGTHS
+
达成进度符合预期

年度累计达成率 86.8%,较去年同期提高 6.2 个百分点。

+
重点项目交付领先

阶段完成率 94.1%,多数项目快于计划节奏推进。

+
区域协同机制成型

领先区域打法开始沉淀,具备复制推广条件。

+
风险敞口持续收窄

风险数量与影响面同步下降,预警规则稳定生效。

+
+
+
!问题与挑战CHALLENGES
+
区域间差距待缩小

梯队分化明显,后发区域能力建设需要体系化投入。

+
两项项目资源临界

关键岗位依赖度高,四季度并行压力上升。

+
经验沉淀不够系统

有效做法多停留在个案层面,标准化速度不足。

+
复盘机制尚未闭环

偏差复盘以事后为主,缺少周期化、制度化安排。

+
+
+
+
+ 01
业务结构优化

高价值场景占比持续提升,收入质量改善降低单一客户依赖。

+
+
+ 02
区域梯队分化

领先区域已形成可复制经验,后发区域需要体系化能力建设。

+
+
+ 03
风险治理见效

风险存量明显下降,预警机制帮助多数临期事项提前处置。

+
+
+
+ + +
+
+
+
+

重点项目推进计划

2026 年 04 — 09 月 · 点击行看详情
+
项目事项
040506070809
状态
+
+
+ 按计划 + 已提前完成 + 需重点跟进 + 闪烁竖线 = 当前时间(09 月) +
+
+
+
+

周度规模节奏

+
实际规模目标基线
+ 近 12 周 · 单位:百万元 +
+
+
+
+
+
+

推进说明

本期口径
+

六个重点项目中,客户验收与风险排查两项已提前完成;经验复制与资源预置按计划推进,里程碑偏差均在 5% 以内;重点项目收口因资源临界被列入重点关注。

+

甘特条上的流光表示项目处于活跃推进状态;竖线为当前时间指示,便于直观判断各项目的剩余窗口。

+
+
+

阶段完成度

截至 09.01
+
+
+
+

下阶段重点

Q4 安排
+
+
一
复制增长经验

华东协同打法向华南、西南推广,季度内完成首轮验证。

+
二
前置收口资源

本周完成临界项目的补充排期与责任人确认。

+
三
固化复盘机制

周度里程碑刷新,偏差超 5% 启动专项复盘。

+
+
+
+
+
+

关键里程碑

08 — 09 月节点 · 进度线自动填充
+
+
+
08.08风险排查完成

识别两项临界风险,台账转入周更。

+
08.18区域复盘机制启动

经验提炼完成,复盘升级为周度。

+
08.27重点客户项目验收

阶段成果达标,进入交付准备。

+
09.01经营数据期末更新

双重校验完成,统一口径锁定。

+
09.15四季度资源预置

资源锁定与经验复制双线并行。

+
+
+
+ + +
+
+
+

月度规模节奏

单位:百万元 · 青色为峰值
+
+
柱体从底部回弹生长(transform 动画,不卡顿)
+
+
+

经营记录

自动滚动 · 悬停暂停
+
+
+
+
+
+

重点项目清单

点击行查看详情
+ + + + + + + + + + +
项目归属优先级状态更新
区域经验复制专项流程沉淀 · 试点推广区域经营组高进行中
重点项目收口交付 · 验收 · 归档并行项目统筹组高需关注
经营复盘机制建设周度刷新 · 偏差复盘经营管理组中进行中
四季度资源预置岗位锁定 · 协作预置人力协调组中进行中
重点客户阶段验收成果达标 · 材料归档项目统筹组高已完成
风险事项专项排查全量排查 · 台账建立风控管理组中已完成
+
+
+

明细口径说明

阅读指引
+

月度柱状图统计近 12 个月的确认收入规模,峰值月以青色高亮;经营记录按时间倒序自动滚动,覆盖签约、交付、验收、回款等关键动作。所有明细均可追溯至经营台账,口径与总览页一致。

+

点击清单任意行可查看项目详情与阶段完成度;若需按区域或业务线过滤,可在台账系统按相同口径导出。

+
+
+
+ + +
+
+
CONCLUSION · 管理层研判
+
以「复制增长经验 + 前置收口资源」保障年度目标达成
+

本报告基于财务与业务双重校验的数据与事实,归纳本阶段经营特征,并给出四季度的工作重心与责任安排。汇报结构为:核心结论、行动建议与跟踪安排三部分。

+
+

核心业务贡献保持稳定,重点板块实际达成进度整体领先于计划。华东、华南区域形成双轮驱动,区域协同机制逐步沉淀为可复用的标准方法。新增贡献主要来自高价值场景,增长来源清晰、可持续性较强。

+

随着年度重点项目进入验收与交付并行阶段,资源调配复杂度上升。建议提前锁定关键岗位与外部协作资源,对偏差超过阈值的事项建立周度复盘机制,确保四季度收口动作按计划推进。

+
+
“一份好的汇报应把事实、判断和行动连接起来,让每段文字都能落到可执行的下一步。”
+
+
+
+

核心结论

三条判断
+
一
经营态势积极稳健

规模、结构与质量指标同步改善,年度目标达成在望,四季度重点在收口而非冲量。

+
二
增长动力可以复制

领先区域经验已被验证,标准化推广可将个体优势转化为整体能力。

+
三
管理重点转向前置

资源、风险与复盘均需前置安排,把事后补救变为事前布防。

+
+
+
+

↗增长机会 · 区域经验复制

+

将华东区域的协同打法沉淀为标准化流程,优先覆盖高频客户场景,向华南、西南推广并季度内完成首轮验证,预计可新增业务规模 0.32 亿元。

+
建议责任:区域经营组完成期限:09.15
+
+
+

!重点关注 · 临界资源调度

+

两项专项工作进入资源临界区,应在本周内完成负责人确认和备选排期;对延期风险超过阈值的事项启动日级跟踪。

+
建议责任:项目统筹组完成期限:本周内
+
+
+
+
+

判断 — 依据 — 行动矩阵

结构化对照
+
+
经营判断
事实依据
下一步行动
+
增长基础稳固
累计规模与重点板块完成率同步提升,新增贡献集中在核心区域与高价值场景。
复制领先区域客户协同流程,推动华南、西南重点场景快速落地。
+
资源收口需前置
重点项目即将进入交付与验收并行期,部分事项对关键岗位依赖较高。
建立项目周清单,偏差超 5% 启动专项复盘并提前锁定补充排期。
+
风险总体可控
风险事项数量较年初下降 21.7%,预警机制帮助多数临期事项提前处置。
维持 48 小时预警规则,跨区域事项保留管理层人工协调通道。
+
+
+
+
+ + + + + + + + +
操作成功(演示)
+ + + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html new file mode 100644 index 00000000..0d027135 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/assets/report-screen-multipage-suite-template.html @@ -0,0 +1,517 @@ + + + + + + + 多页经营汇报 · HTML 模板 + + + +
+
+
STRATEGIC REPORTING
+ +
数据更新于 2026-09-01 10:30
+
+ +
+
+
+
+

Executive Situation · 2026 Q3

+

增长保持韧性,当前决策重点转向结构优化与风险回收

+

本周期累计完成目标的 86.8%,较计划节奏领先 2.6 个百分点。业务规模维持稳定增长,但区域资源利用率出现分化;建议将管理重心从“扩大投入”调整为“提升产出质量”。

+
03 项需本周决策06 项重点事项推进中报告口径:截至 09 月 01 日
+
+
+ +
+ +
+
累计业务规模
¥ 8.42 亿
↑ 12.6% 年度目标 9.70 亿
+
重点项目完成率
94.1%
↑ 3.8% 较上月改善
+
交付及时率
96.4%
↑ 1.2% 保持健康区间
+
待收敛风险事项
18
↑ 21.7% 较年初增加
+
+ +
+
+

目标达成趋势

累计达成目标节奏
+
+ + + + + + + + +
+
1月2月3月4月5月6月7月8月9月
+
趋势判断7 月后实际曲线持续位于目标节奏上方;若四季度维持当前转化效率,年度目标存在提前达成空间。
+
+
+

经营判断

本期重点
+

规模增长仍是正向信号,但数字本身不足以说明结构健康。当前需用“优先级、责任人、交付时点”把增长机会转译为可执行的经营动作。

+
+
保持

继续放大华东与华北的高质量订单转化,维持交付节奏。

+
收紧

对低产出项目设置阶段阈值,避免资源被长期占用。

+
补强

将区域协同与风险闭环纳入周度共担,缩短决策链路。

+
+
+
+ +
+
+

阶段经营综述

长文 / 可直接替换 Markdown
+
+

本阶段经营目标整体推进平稳,核心业务和协同项目均处于计划线以上。增长主要来自既有客户的深化合作以及重点项目的提前回款,说明市场需求并未明显减弱。

+

需要关注的是,区域间的项目成熟度差异正在放大:头部区域已进入规模与效率同步提升阶段,部分区域仍依赖单点项目拉动。后续应让成熟经验形成可迁移的方法包。

+
+
“下一阶段的关键不是做更多事情,而是让每一项投入都有清晰的收益路径、责任主体与退出条件。”
+
+ +
+
页面 01 / 03 · 总览决策CONFIDENTIAL · INTERNAL REPORTING
+
+ + + + +
+ + + diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py new file mode 100644 index 00000000..9529c69f --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/page_reports/templates.py @@ -0,0 +1,324 @@ +"""Catalog and deterministic selector for bundled report-page templates. + +HTML skeletons are packaged with the backend so page generation never depends +on the frontend checkout or a browser upload. Deployments can optionally +override the built-in library with ``DEERFLOW_PAGE_TEMPLATE_DIR``. +""" + +from __future__ import annotations + +import os +import re +from dataclasses import asdict, dataclass +from hashlib import sha256 +from pathlib import Path +from typing import Literal + +Theme = Literal["dark", "light"] + + +@dataclass(frozen=True) +class PageTemplateProfile: + """A concise, agent-facing description of one HTML report skeleton.""" + + id: str + filename: str + theme: Theme + title: str + style: str + page_count: int + features: tuple[str, ...] + data_entry: str + best_for: tuple[str, ...] + + def to_dict(self) -> dict[str, object]: + """Serialize tuples as JSON-friendly lists.""" + value = asdict(self) + value["features"] = list(self.features) + value["best_for"] = list(self.best_for) + return value + + +# Keep this declarative. Later templates only require one profile here; their +# original HTML never needs to be copied into the backend or rewritten. +_TEMPLATES: tuple[PageTemplateProfile, ...] = ( + PageTemplateProfile( + id="dark-charts-portal", + filename="report-screen-dark-charts-portal-template.html", + theme="dark", + title="深蓝图表运营门户", + style="深蓝科技感、密度较高、带动效的大屏门户", + page_count=5, + features=("kpi", "line", "bar", "pie", "radar", "scatter", "gantt", "table", "text-panels", "animation"), + data_entry="reportData(图表和滚动列表统一入口)", + best_for=("经营汇报", "数据较多", "多页面", "图表优先", "督办"), + ), + PageTemplateProfile( + id="dark-neon-portal", + filename="report-screen-dark-neon-portal-template.html", + theme="dark", + title="深蓝霓虹专题门户", + style="深蓝霓虹、沉浸式科技感、内容分区明显", + page_count=5, + features=("kpi", "timeline", "table", "text-panels", "animation"), + data_entry="页面结构直接编辑(先复制再删减)", + best_for=("专题汇报", "文字较多", "多页面", "研判"), + ), + PageTemplateProfile( + id="dark-neon", + filename="report-screen-dark-neon-template.html", + theme="dark", + title="深蓝霓虹单页大屏", + style="深蓝发光边框、重点指标突出", + page_count=1, + features=("kpi", "line", "bar", "text-panels", "animation"), + data_entry="页面结构直接编辑(先复制再删减)", + best_for=("单页汇报", "简洁数据", "值班态势"), + ), + PageTemplateProfile( + id="dark-classic", + filename="report-screen-dark-template.html", + theme="dark", + title="深蓝综合经营大屏", + style="稳重深蓝、经营驾驶舱、信息密度适中", + page_count=3, + features=("kpi", "bar", "table", "timeline", "text-panels"), + data_entry="页面内置数据变量和结构化区块", + best_for=("经营汇报", "文字与数据均衡", "三页汇报"), + ), + PageTemplateProfile( + id="light-charts-portal", + filename="report-screen-light-charts-portal-template.html", + theme="light", + title="浅色图表运营门户", + style="明亮专业、留白充足、带动效的多页面门户", + page_count=5, + features=("kpi", "line", "bar", "pie", "radar", "scatter", "gantt", "table", "text-panels", "animation"), + data_entry="reportData(图表和滚动列表统一入口)", + best_for=("经营汇报", "数据较多", "多页面", "图表优先", "督办"), + ), + PageTemplateProfile( + id="light-airy-portal", + filename="report-screen-light-airy-portal-template.html", + theme="light", + title="浅色轻盈专题门户", + style="浅色留白、内容阅读友好、清爽分栏", + page_count=5, + features=("kpi", "timeline", "table", "text-panels", "animation"), + data_entry="页面结构直接编辑(先复制再删减)", + best_for=("专题汇报", "文字较多", "多页面", "研判"), + ), + PageTemplateProfile( + id="light-airy", + filename="report-screen-light-airy-template.html", + theme="light", + title="浅色轻盈单页报告", + style="浅色卡片、阅读节奏舒展", + page_count=1, + features=("kpi", "bar", "table", "text-panels"), + data_entry="页面内置数据变量和结构化区块", + best_for=("单页汇报", "文字为主", "简洁数据"), + ), + PageTemplateProfile( + id="multipage-suite", + filename="report-screen-multipage-suite-template.html", + theme="dark", + title="多页面汇报套件", + style="深蓝 / 浅色可切换、文字信息组织强、标准化汇报套件", + page_count=3, + features=("kpi", "bar", "radar", "gantt", "table", "timeline", "text-panels", "theme-switch"), + data_entry="reportData(日期、可见页面)+ 页面结构", + best_for=("多页面", "文字为主", "汇报研判", "行动督办"), + ), +) + + +def _template_root_candidates() -> list[Path]: + explicit = os.getenv("DEERFLOW_PAGE_TEMPLATE_DIR", "").strip() + candidates: list[Path] = [Path(explicit).expanduser()] if explicit else [] + candidates.append(Path(__file__).resolve().parent / "assets") + return candidates + + +def resolve_template_root() -> Path: + """Locate the template directory or raise a useful deployment error.""" + for candidate in _template_root_candidates(): + if candidate.is_dir(): + return candidate.resolve() + raise FileNotFoundError( + "Page template directory is unavailable. Set DEERFLOW_PAGE_TEMPLATE_DIR " + "to the directory containing the report-screen-*-template.html files." + ) + + +def _auto_profile(source: Path) -> PageTemplateProfile: + """Create a conservative profile for a newly dropped-in HTML template. + + Auto-discovered files are intentionally tagged as ``待人工确认`` rather + than claiming capabilities we cannot prove. The designer can use them for + broad page requests immediately; a later catalog entry can add richer, + hand-verified selection metadata without changing the source HTML. + """ + html = source.read_text(encoding="utf-8", errors="ignore")[:1_000_000] + lowered = html.lower() + stem = source.stem + is_dark = "dark" in stem.lower() or 'data-theme="dark"' in lowered or "#061" in lowered + features: list[str] = ["text-panels"] + for feature, hints in { + "kpi": ("kpi", "metric", "stat-"), + "line": ("linechart", "line-chart", "line-svg"), + "bar": ("bar-chart", "bars", "bar >"), + "pie": ("pie", "donut"), + "radar": ("radar",), + "scatter": ("scatter",), + "gantt": ("gantt",), + "table": (" tuple[PageTemplateProfile, ...]: + """Return registered templates plus safely auto-discovered future files.""" + profiles = list(_TEMPLATES) + known_filenames = {profile.filename for profile in profiles} + try: + root = resolve_template_root() + for source in sorted(root.glob("report-screen-*-template.html"), key=lambda item: item.name.lower()): + if source.name not in known_filenames: + profiles.append(_auto_profile(source)) + except (FileNotFoundError, OSError): + # Catalog information remains useful in deployments where the frontend + # package is not mounted yet; prepare() will surface the real error. + pass + return tuple(profiles) + + +def get_template_profile(template_id: str) -> PageTemplateProfile: + normalized = (template_id or "").strip().lower() + for profile in list_template_profiles(): + if profile.id == normalized: + return profile + available = ", ".join(profile.id for profile in list_template_profiles()) + raise ValueError(f"Unknown page template '{template_id}'. Available: {available}") + + +def resolve_template_file(template_id: str) -> Path: + """Return a verified source-template path for a catalog id.""" + profile = get_template_profile(template_id) + source = (resolve_template_root() / profile.filename).resolve() + root = resolve_template_root() + try: + source.relative_to(root) + except ValueError as exc: # defensive: profile filenames are repository data + raise ValueError("Template path escapes the template root") from exc + if not source.is_file(): + raise FileNotFoundError( + f"Template '{template_id}' is listed in the catalog but is missing: {source}" + ) + return source + + +def _normalize_theme(theme: str | None) -> Theme | None: + value = (theme or "").strip().lower() + if value in {"dark", "deep-blue", "dark-blue"}: + return "dark" + if value in {"light", "white", "bright"}: + return "light" + return None + + +def _score_template( + profile: PageTemplateProfile, + *, + content_density: str, + required_features: set[str], + preferred_page_count: int | None, +) -> int: + score = 0 + features = set(profile.features) + # A required feature weighs substantially more than aesthetics. + score += 12 * len(features & required_features) + score -= 30 * len(required_features - features) + density = (content_density or "balanced").strip().lower() + if density in {"text-heavy", "rich-text", "文字较多"} and "text-panels" in features: + score += 8 + if density in {"data-heavy", "chart-heavy", "图表较多"} and {"line", "bar", "pie"}.issubset(features): + score += 8 + if preferred_page_count: + score -= min(abs(profile.page_count - preferred_page_count), 3) * 3 + return score + + +def choose_template( + *, + theme: str | None, + content_density: str = "balanced", + required_features: list[str] | None = None, + preferred_page_count: int | None = None, + selection_key: str = "", + exclude_template_ids: list[str] | None = None, +) -> PageTemplateProfile: + """Choose a suitable template, varying ties deterministically by request. + + The caller can pass recent choices through ``exclude_template_ids``. We + only fall back to an excluded item when it is the sole match for the chosen + theme, which prevents an agent from losing the requested colour mode. + """ + target_theme = _normalize_theme(theme) + all_profiles = list_template_profiles() + candidates = [profile for profile in all_profiles if target_theme is None or profile.theme == target_theme] + if not candidates: + candidates = list(all_profiles) + excluded = {value.strip().lower() for value in (exclude_template_ids or []) if value.strip()} + non_excluded = [profile for profile in candidates if profile.id not in excluded] + if non_excluded: + candidates = non_excluded + feature_set = {value.strip().lower() for value in (required_features or []) if value.strip()} + scored = sorted( + (( + _score_template( + profile, + content_density=content_density, + required_features=feature_set, + preferred_page_count=preferred_page_count, + ), + profile, + ) for profile in candidates), + key=lambda item: (-item[0], item[1].id), + ) + best_score = scored[0][0] + ties = [profile for score, profile in scored if score == best_score] + if len(ties) == 1: + return ties[0] + digest = sha256((selection_key or "page-report").encode("utf-8")).digest() + return ties[int.from_bytes(digest[:4], "big") % len(ties)] + + +__all__ = [ + "PageTemplateProfile", + "choose_template", + "get_template_profile", + "list_template_profiles", + "resolve_template_file", + "resolve_template_root", +] diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py b/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py new file mode 100644 index 00000000..f5b51740 --- /dev/null +++ b/offline-backend-20260512/backend/packages/harness/deerflow/tools/builtins/page_report_template_tool.py @@ -0,0 +1,322 @@ +"""Thread-safe page-report template preparation and static quality checks.""" + +from __future__ import annotations + +import json +import re +from collections.abc import Iterable +from pathlib import Path + +from langchain.tools import ToolRuntime, tool +from langgraph.typing import ContextT + +from deerflow.agents.thread_state import ThreadState +from deerflow.config.paths import VIRTUAL_PATH_PREFIX, get_paths +from deerflow.page_reports.templates import ( + choose_template, + get_template_profile, + list_template_profiles, + resolve_template_file, +) +from deerflow.runtime.thread_paths import resolve_path_user_id + +_MAX_HTML_BYTES = 4 * 1024 * 1024 +# Allow human-readable Chinese filenames while still rejecting path separators, +# Windows-reserved filename characters, and control characters. +_SAFE_OUTPUT_NAME = re.compile(r'^[^<>:"/\\|?*\x00-\x1f]+\.html$', re.IGNORECASE) +_FONT_SIZE_RE = re.compile(r"font-size\s*:\s*([0-9]+(?:\.[0-9]+)?)px", re.IGNORECASE) +_MIN_TEXT_FONT_SIZE = 16.0 + + +def _thread_id(runtime: ToolRuntime[ContextT, ThreadState]) -> str: + context = runtime.context or {} + thread_id = context.get("thread_id") + if not thread_id: + thread_id = (getattr(runtime, "config", {}) or {}).get("configurable", {}).get("thread_id") + if not thread_id: + raise ValueError("当前会话缺少 thread_id,无法准备页面模板。") + return str(thread_id) + + +def _virtual_path(path: Path, *, thread_id: str, user_id: str | None) -> str: + root = get_paths().sandbox_user_data_dir(thread_id, user_id=user_id).resolve() + relative = path.resolve().relative_to(root) + return f"{VIRTUAL_PATH_PREFIX}/{relative.as_posix()}" + + +def _thread_directories(runtime: ToolRuntime[ContextT, ThreadState]) -> tuple[str, str | None, Path, Path]: + thread_id = _thread_id(runtime) + user_id = resolve_path_user_id(thread_id) + paths = get_paths() + workspace = paths.sandbox_work_dir(thread_id, user_id=user_id) + outputs = paths.sandbox_outputs_dir(thread_id, user_id=user_id) + workspace.mkdir(parents=True, exist_ok=True) + outputs.mkdir(parents=True, exist_ok=True) + return thread_id, user_id, workspace, outputs + + +def _safe_output_filename(output_name: str) -> str: + raw = (output_name or "report-page.html").strip() + if not raw.lower().endswith(".html"): + raw += ".html" + if Path(raw).name != raw or not _SAFE_OUTPUT_NAME.fullmatch(raw): + raise ValueError("output_name 必须是单个安全的 .html 文件名,不能包含路径或 Windows 非法字符。") + return raw + + +def _apply_minimum_font_size(html: str) -> str: + """Normalize editable template copies to the report designer's font floor. + + The library includes some legacy dashboard skeletons with compact labels. + They are useful layout starting points, but the designer contract requires + that visible text is at least 16px. Normalize the *per-thread copy* here + so a weaker model does not have to remember a large CSS-only cleanup before + it can work on the actual report content. The immutable source template is + never changed, and ``validate`` remains the final guard if later edits add + a smaller declaration. + """ + + def replace(match: re.Match[str]) -> str: + size = float(match.group(1)) + if size >= _MIN_TEXT_FONT_SIZE: + return match.group(0) + return f"font-size: {_MIN_TEXT_FONT_SIZE:g}px" + + return _FONT_SIZE_RE.sub(replace, html) + + +def _edit_contract(template_id: str) -> dict[str, object]: + profile = get_template_profile(template_id) + chart_driven = "reportData" in profile.data_entry + return { + "data_entry": profile.data_entry, + "edit_order": [ + "先把用户材料整理为文字摘要、指标、表格行、图表数据和待办事项。", + "只编辑工作区的副本;禁止改动模板源文件。", + "若存在 reportData,先改该对象中的图表数组,再替换标题、段落、卡片和表格文案。", + "根据材料删掉无数据的卡片或整页;不要为了凑页数保留空白面板。", + "将最终 HTML 写入 outputs 后调用 validate;通过后用 present_files 交付。", + ], + "must_keep": ( + ["reportData 的字段名和图表渲染函数", "页面切换及 prefers-reduced-motion 逻辑"] + if chart_driven + else ["已有布局类名", "移动端 / reduced-motion 样式"] + ), + "illustrative_data_rule": "没有可核验数值但用户明确要求图表时,可画示意图;页面必须在图例或数据口径处标注“示意数据 / 待补充数据”,不得伪装为事实。", + } + + +def _prepare( + runtime: ToolRuntime[ContextT, ThreadState], + *, + theme: str, + content_density: str, + required_features: list[str], + preferred_page_count: int | None, + selection_key: str, + exclude_template_ids: list[str], + template_id: str | None, + output_name: str, + page_brief: str, +) -> str: + profile = ( + get_template_profile(template_id) + if (template_id or "").strip() + else choose_template( + theme=theme, + content_density=content_density, + required_features=required_features, + preferred_page_count=preferred_page_count, + selection_key=selection_key, + exclude_template_ids=exclude_template_ids, + ) + ) + source = resolve_template_file(profile.id) + thread_id, user_id, workspace, outputs = _thread_directories(runtime) + filename = _safe_output_filename(output_name) + working_copy = workspace / f"{Path(filename).stem}--{profile.id}.html" + brief_path = workspace / f"{Path(filename).stem}--page-brief.json" + # Copy first, then normalize only the editable thread-local copy. This + # preserves the bundled assets exactly as supplied while giving every run a + # usable 16px-or-larger starting point. + working_copy.write_text(_apply_minimum_font_size(source.read_text(encoding="utf-8")), encoding="utf-8") + brief = { + "template": profile.to_dict(), + "requested_theme": theme or "auto", + "requested_content_density": content_density or "balanced", + "required_features": required_features, + "recommended_final_output": _virtual_path(outputs / filename, thread_id=thread_id, user_id=user_id), + "working_copy": _virtual_path(working_copy, thread_id=thread_id, user_id=user_id), + "user_material_brief": (page_brief or "").strip(), + "edit_contract": _edit_contract(profile.id), + "font_rule": "所有可见文字最小字号为 16px;生成后必须通过 validate 校验。", + } + brief_path.write_text(json.dumps(brief, ensure_ascii=False, indent=2), encoding="utf-8") + return json.dumps( + { + "ok": True, + "template": profile.to_dict(), + "working_copy": _virtual_path(working_copy, thread_id=thread_id, user_id=user_id), + "brief_path": _virtual_path(brief_path, thread_id=thread_id, user_id=user_id), + "final_output": brief["recommended_final_output"], + "next_step": "读取 brief_path 和 working_copy,改完后写入 final_output,再调用 action=validate。", + }, + ensure_ascii=False, + ) + + +def _resolve_current_thread_file( + runtime: ToolRuntime[ContextT, ThreadState], + virtual_path: str, +) -> tuple[Path, str, str | None]: + thread_id, user_id, workspace, outputs = _thread_directories(runtime) + normalized = (virtual_path or "").strip() + if not normalized.startswith(f"{VIRTUAL_PATH_PREFIX}/"): + raise ValueError(f"file_path 必须位于 {VIRTUAL_PATH_PREFIX}/workspace 或 {VIRTUAL_PATH_PREFIX}/outputs。") + actual = get_paths().resolve_virtual_path(thread_id, normalized, user_id=user_id) + permitted_roots: Iterable[Path] = (workspace.resolve(), outputs.resolve()) + if not any(actual.is_relative_to(root) for root in permitted_roots): + raise ValueError("file_path 只能指向当前会话的 workspace 或 outputs 目录。") + if not actual.is_file(): + raise ValueError(f"待校验 HTML 不存在:{virtual_path}") + return actual, thread_id, user_id + + +def _count_textual_content(html: str) -> int: + plain = re.sub(r"||<[^>]+>", " ", html, flags=re.IGNORECASE) + return len(re.sub(r"\s+", "", plain)) + + +def _quality_report(html: str, *, data_mode: str, expected_features: set[str]) -> dict[str, object]: + lowered = html.lower() + errors: list[str] = [] + warnings: list[str] = [] + if "" not in lowered: + errors.append("HTML 不完整:需要 和 。") + if "" not in lowered: + errors.append("HTML 缺少完整 body 结构。") + if " str: + actual, thread_id, user_id = _resolve_current_thread_file(runtime, file_path) + if actual.stat().st_size > _MAX_HTML_BYTES: + raise ValueError(f"HTML 超过 {_MAX_HTML_BYTES // 1024 // 1024}MB,拒绝读取。") + html = actual.read_text(encoding="utf-8") + report = _quality_report( + html, + data_mode=data_mode, + expected_features={item.strip().lower() for item in expected_features if item.strip()}, + ) + report_path = actual.with_name(f"{actual.stem}.quality.json") + report_path.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8") + report["quality_report"] = _virtual_path(report_path, thread_id=thread_id, user_id=user_id) + report["file_path"] = _virtual_path(actual, thread_id=thread_id, user_id=user_id) + return json.dumps(report, ensure_ascii=False) + + +@tool("page_report_template", parse_docstring=True) +def page_report_template_tool( + runtime: ToolRuntime[ContextT, ThreadState], + action: str, + theme: str = "auto", + content_density: str = "balanced", + required_features: list[str] | None = None, + preferred_page_count: int | None = None, + selection_key: str = "", + exclude_template_ids: list[str] | None = None, + template_id: str | None = None, + output_name: str = "report-page.html", + page_brief: str = "", + file_path: str = "", + data_mode: str = "provided", +) -> str: + """Select, copy, and quality-check reusable HTML report-page templates. + + Use this tool instead of editing a source template in place. + + Args: + action: One of ``catalog``, ``prepare``, or ``validate``. ``catalog`` lists + profiles; ``prepare`` selects/copies a source into this thread's + workspace and writes an editing brief; ``validate`` checks an edited + HTML file and writes a JSON quality report next to it. + theme: ``dark`` or ``light``. Use the UI-provided presentation theme when + available; ``auto`` lets the selector use all profiles. + content_density: ``text-heavy``, ``balanced``, or ``data-heavy``. + required_features: Needed components such as ``line``, ``pie``, + ``radar``, ``scatter``, ``gantt``, ``table``, ``text-panels``. + preferred_page_count: Preferred number of report pages. The agent may + remove unused skeleton pages after preparation. + selection_key: Stable request/thread-derived text used to vary equally + good template choices. + exclude_template_ids: Recently-used template ids to avoid where possible. + template_id: Optional explicit catalog id. Omit to select automatically. + output_name: Final safe HTML filename, e.g. ``经营月报.html``. + page_brief: Concise summary of supplied materials and desired output. + file_path: For ``validate`` only: current-thread HTML under workspace or + outputs. + data_mode: ``provided`` for factual data, ``illustrative`` when charts + are intentionally demonstrative, or ``mixed``. + """ + normalized_action = (action or "").strip().lower() + if normalized_action == "catalog": + return json.dumps({"templates": [profile.to_dict() for profile in list_template_profiles()]}, ensure_ascii=False) + if normalized_action == "prepare": + return _prepare( + runtime, + theme=theme, + content_density=content_density, + required_features=required_features or [], + preferred_page_count=preferred_page_count, + selection_key=selection_key, + exclude_template_ids=exclude_template_ids or [], + template_id=template_id, + output_name=output_name, + page_brief=page_brief, + ) + if normalized_action == "validate": + return _validate( + runtime, + file_path=file_path, + data_mode=data_mode, + expected_features=required_features or [], + ) + raise ValueError("action 仅支持 catalog、prepare、validate。") + + +__all__ = ["page_report_template_tool"]