Install
openclaw skills install report-to-visualization将文本报告转换为可视化组件流。当用户需要将报告数据可视化或提到"可视化报告"、"用图表展示"、"图文并茂"时使用。
openclaw skills install report-to-visualization将文本报告数据转换为可视化组件配置,输出严格的MODULE格式。
用户需提供以下变量:
${moduleData}: 报告数据内容使用条件: 展示数据趋势,需至少5个连续、真实的时间点原始观测值 数据格式:
{
"type": "Chart.Line",
"data": [{"name": "时间标签,≤6字", "value": 数值, "category": "系列名称,≤8字"}],
"config": {"xField": "name", "yField": "value", "title": "图表标题,≤12字"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
value 必须为 number 类型(如 78.5),禁止使用字符串(如 "78.5")使用条件: 展示数据对比,一个或多个维度有不低于2个具体数值 数据格式:
{
"type": "Chart.Column",
"data": [{"name": "分类标签,≤8字", "value": 数值, "category": "指标名称,≤8字"}],
"config": {"xField": "name", "yField": "value", "seriesField": "category", "isGroup": true, "title": "图表标题,≤12字"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
value 必须为 number 类型(如 78.5),禁止使用字符串(如 "78.5"),字符串会导致图表排序和轴刻度异常{"name": "线下摆摊", "value": "60-85"} → ✅ 拆分为 {"name": "摆摊(低)", "value": 60} 和 {"name": "摆摊(高)", "value": 85}使用条件: 展示核心指标值和环比数据,不低于4个指标 数据格式:
{
"type": "DataCard",
"data": [{"desc": "指标名称,≤12字", "value": "指标值", "cycle": "环比变化值或null"}],
"config": {"title": "卡片标题,≤10字"},
"layoutRow": "r1", "layoutCol": "c2", "rowSize": "auto", "colSize": "auto"
}
约束:
cycle 字段仅用于填写环比/同比的数值变化(如 "-0.26%"、"+5.3%"),或填 nullcycle 中填入描述性文字(如"下降""行业第一""占比47.2%")cycle 必须为 null{"desc": "斯凯奇份额", "value": "16.8%", "cycle": "行业第一"} → ✅ {"desc": "斯凯奇份额", "value": "16.8%", "cycle": null}使用条件: 展示数据占比,不低于2个指标,value值求和应为100(百分比)或1(小数) 数据格式:
{
"type": "Chart.Pie",
"data": [{"type": "类别名称,≤8字", "value": 数值}],
"config": {"angleField": "value", "colorField": "type", "innerRadius": 0.6, "statistic": {"title": false, "content": false}, "title": "图表标题,≤12字"},
"layoutRow": "r1", "layoutCol": "c2", "rowSize": "auto", "colSize": "auto"
}
约束:
value 必须为 number 类型,禁止字符串{"type": "其他年龄", "value": 38.7} ← 原文无此数据,系推算捏造使用条件: 当内容满足以下全部条件时,必须使用 Chart.List 而非 TextCard/KeyValueCard:
{
"type": "Chart.List",
"data": [{"list": [{"key": "列名,≤10字", "value": "列值,≤20字"}, {"key": "列名", "value": "列值"}]}],
"config": {"title": "分组标题,≤10字"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
典型场景:
约束(总计行表达):
{"list": [{"key": "成本项", "value": "约111.1元/双"}, {"key": "成本", "value": "-"}, {"key": "备注", "value": "含原材料25-40元"}]} ← 把金额塞进第一列,第二列留空,读者无法理解{"list": [{"key": "成本项", "value": "总计"}, {"key": "成本", "value": "约111.1元/双"}, {"key": "备注", "value": "含原材料25-40元"}]} ← 第一列标明"总计",后续列正常填写数据使用条件: 展示数据总结、趋势洞察、运营建议等定性内容,不少于2个标题 数据格式:
{
"type": "TextCard",
"data": [{"title": "标题,≤10字", "text": "内容,尽量2行,30-45字"}],
"config": {"title": "卡片标题,≤10字"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束(元素数量):
{"title": "...", "text": "..."} 对象),仅 1 个元素时应从原文上下文中提取更多观点/结论来补充,若确实无法补充则考虑将内容合并到相邻的组件中"data": [{"title": "可行性结论", "text": "..."}] ← 仅 1 个元素,卡片单薄,信息密度过低"data": [{"title": "可行性结论", "text": "..."}, {"title": "核心优势", "text": "..."}] ← 至少 2 个元素,内容充实约束(内容聚合原则):
约束(内容丰富度):
text 字段内容尽量保持 2 行左右(30-60 字),避免内容过于单薄"text": "北欧极简、无性别设计" ← 仅 1 行,信息密度过低"text": "北欧极简、无性别设计成为主流趋势,通勤休闲轻运动场景无缝切换,满足全年龄段穿搭需求" ← 约 2 行,信息丰富使用条件: 展示不低于2个分组,每个分组不低于2个指标 数据格式:
{
"type": "KeyValueCard",
"data": [{"title": "分组标题,≤8字", "list": [{"key": "指标名称,≤10字", "value": "格式化后的指标值,≤15字"}]}],
"config": {"title": "卡片主标题,≤10字"},
"layoutRow": "r1", "layoutCol": "c2", "rowSize": "auto", "colSize": "auto"
}
约束:
{"title": "...", "list": [...]} 对象),仅 1 个分组时应改用 DataCard 或 TextCard"data": [{"title": "唯一分组", "list": [...]}] ← 仅 1 个分组独占一整张卡片,信息密度过低使用条件: 展示分阶段的内容规划或执行步骤 数据格式:
{
"type": "PhaseCard",
"data": [{"phaseNumber": "阶段序号,≤5字", "phaseName": "阶段名称,≤6字", "focusPoints": [{"label": "重点项标签,≤6字", "content": "重点项内容,≤50字"}]}],
"config": {"title": "卡片标题,≤10字", "theme": "主题色,如'blue'"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
使用条件: 展示时间轴内容,如里程碑规划,不低于3个时间节点 数据格式:
{
"type": "TimelineCard",
"data": [{"month": "月份,≤6字", "title": "里程碑标题,≤8字", "description": "详细描述,≤40字", "target": "目标值,≤12字", "status": "completed或in-progress"}],
"config": {"title": "标题,≤10字", "orientation": "horizontal或vertical"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
"data": [{"month": "1月", ...}] ← 仅 1 个节点,无法构成时间轴"data": [{"month": "1月", ...}, {"month": "6月", ...}] ← 仅 2 个节点,时间线过于稀疏"data": [{"month": "1月", ...}, {"month": "3月", ...}, {"month": "6月", ...}] ← 至少 3 个节点,时间线完整使用条件: 展示警告内容,如风险提示、注意事项,不低于2条警告 数据格式:
{
"type": "AlertCard",
"data": [{"issue": "问题描述,≤25字", "consequence": "后果,≤40字", "suggestion": "建议,≤30字", "level": "warning或info或error或success"}],
"config": {"title": "卡片标题,≤10字", "showIcon": true},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
"data": [{"issue": "唯一的风险提示", ...}] ← 仅 1 条警告,信息密度过低,卡片单薄"data": [{"issue": "风险1", ...}, {"issue": "风险2", ...}] ← 至少 2 条,信息充实使用条件: 展示不同程度的影响内容,如关键转化杠杆、机会优先级 数据格式:
{
"type": "InfluenceCard",
"data": [{"name": "因素名称,≤10字", "influenceLevel": 1-5, "influenceLabel": "影响力标签,≤4字", "focusPoints": [{"label": "关注点标签,≤6字", "content": "关注点内容,≤50字"}], "warnings": [{"icon": "warning或info", "label": "警告标签,≤6字", "content": "警告内容,≤40字"}], "priority": 1-3}],
"config": {"title": "主标题,≤12字"},
"layoutRow": "r1", "layoutCol": "c1", "rowSize": "auto", "colSize": "auto"
}
约束:
按报告章节分模块输出,所有模块统一组织在一个 JSON 对象的 modules 数组中,并使用 ```seller-report 代码块包裹。最终输出必须严格遵循以下结构,不允许在代码块外输出任何额外内容:
{
"modules": [
{
"components": [
{
"type": "Title",
"content": "<章节子标题,≤8字,禁止以\"模块一\"、\"##\"等字符开头,应体现该章节的核心主题>"
},
{
"type": "<图表组件类型,如 Chart.Column / DataCard / KeyValueCard 等>",
"data": [ ... ],
"config": { ... },
"layoutRow": "r1",
"layoutCol": "c1",
"rowSize": "auto",
"colSize": "auto"
},
{
"type": "<图表组件类型>",
"data": [ ... ],
"config": { ... },
"layoutRow": "r1",
"layoutCol": "c2",
"rowSize": "auto",
"colSize": "auto"
}
]
},
{
"components": [
{
"type": "Title",
"content": "<下一章节子标题>"
},
{
"type": "<图表组件类型>",
"data": [ ... ],
"config": { ... },
"layoutRow": "r1",
"layoutCol": "c1",
"rowSize": "auto",
"colSize": "auto"
}
]
}
]
}
分模块规则:
modules 数组中一个独立的模块对象(即一个 {"components": [...]}){"type": "Title", "content": "<章节子标题>"},用于标识该模块的核心主题(如"消费者需求""竞争格局""政策环境"),而非整个报告的标题;Title 组件不参与布局编号,无需 layoutRow/layoutCol/data/config 字段components 数组中,除首个 Title 外的其他组件仅承载该章节相关的内容layoutRow 在每个模块内独立编号,从 r1 重新开始(Title 组件不占用行号)```seller-report ... ``` 包裹;JSON 中不允许出现注释、尾随逗号等非标准语法核心规则: 布局只能是一行一个组件或一行两个不同组件,不允许一行放两个相同组件。
基础图表类(可两两组合): Chart.Line、Chart.Column、Chart.Pie、DataCard、KeyValueCard
整行展示类(必须独占一行): Chart.List、TextCard、PhaseCard、TimelineCard、AlertCard、InfluenceCard
Title 组件),相邻的两个组件不得使用相同的 type。如果内容需要多个同类型组件,必须在中间插入一个不同类型的组件来间隔,或将内容合并到同一个组件中
报告的每一个章节都必须在可视化输出中有对应的组件体现,禁止跳过任何章节。
当内容符合以下条件时,必须使用对应组件,禁止用 TextCard/KeyValueCard 替代:
| 内容特征 | 必须使用的组件 | 判断标准 |
|---|---|---|
| 有风险提示、问题警示 | AlertCard | 内容包含"问题 - 后果 - 建议"结构 |
| 有执行步骤、阶段规划 | PhaseCard | 内容包含"第一步/第二步"或"阶段 1/阶段 2" |
| 有影响力分级、优先级排序 | InfluenceCard | 内容包含"高/中/低影响"或"优先级 1/2/3" |
| 有 3+ 对象的多维度对比 | Chart.List | 内容有 3 个以上对象需要对比多个维度 |
| 有时间节点、里程碑 | TimelineCard | 内容包含具体时间点或时间序列 |
reference/anti-patterns.md 文件,理解跨组件的通用反例约束。此步骤不可跳过。${moduleData},逐一列出所有一级标题和二级标题,形成章节清单```seller-report ... ``` 包裹的单个 JSON 对象,不输出任何分析过程、章节清单、规划说明等中间内容。用户看到的应该只有这一个 ```seller-report 代码块。"desc": "毛利率", "value": "35%"),则 value 中无需重复标注target、DataCard 的 value),必须在数值中内嵌含义"target": "×2.1" ← 无法理解 2.1 是什么的倍数"target": "搜索量×2.1" 或 "target": "销量增长2.1倍""value": "9500" ← 不知道 9500 是什么"value": "9500次曝光" 或配合 "desc": "曝光量" 使用