数据记者智能体 (Data2Story) 是做什么的?
将 $ARGUMENTS 转化为博客。按顺序编排以下角色。
设置
在执行任何操作之前,先解析路径:
- 切勿硬编码机器本地路径,也不要要求用户导出路径变量。
- 解析
SKILL_DIR= 包含此SKILL.md的目录(.../skills/data2story) - 解析
ARCHIVE_DIR= 包含skills/的上级目录(SKILL_DIR的上两级,即SKILL_DIR/../..) - 解析
DATA2STORY_ROOT=ARCHIVE_DIR的父级目录 - 以下命令使用符号占位符,例如
ARCHIVE_DIR;在运行 Bash 之前,将它们替换为已解析的、带引号的实际路径。 DATA_NAME= 数据集文件夹名称(例如pick_a_card)DATA_DIR= 如果$ARGUMENTS是已有路径,则使用该路径;否则使用DATA2STORY_ROOT/data/{DATA_NAME}TIMESTAMP= 当前时间,格式为MMDD_HHMM(例如0401_1618):date +%m%d_%H%M(在 bash 中运行)PROJECT_DIR=DATA2STORY_ROOT/project/{DATA_NAME}/blog_{MODEL}_{TIMESTAMP}- 创建
PROJECT_DIR/、PROJECT_DIR/assets/、PROJECT_DIR/code/
归档
创建 PROJECT_DIR 后,立即对当前技能进行快照:
mkdir -p PROJECT_DIR/archival
cp -r ARCHIVE_DIR/skills PROJECT_DIR/archival/skills
这可以保留本次运行所使用的确切技能版本。
可用工具
所有媒体工具均通过 OpenRouter 路由。在进行任何生成调用之前,请设置 OPENROUTER_API_KEY。
媒体生成是设计师的工作,因此媒体工具(text2image、text2video、image2video、text2music、embeddings)位于 SKILL_DIR/designer/scripts/openrouter-*/ 目录下。完整列表——默认模型和确切的 python3 ... 调用——在 designer/references/tools.json 中;每个工具的完整文档位于 SKILL_DIR/designer/scripts/openrouter-*/ 下该工具自身的 SKILL.md 中。
流水线概览
该流水线是一个单一的线性序列,从原始数据生成一个可追溯的 HTML 博客:
数据 → 侦探 → 分析师 → 编辑 → 设计师 → 程序员 → 审计员 → 检查员 → 最终的 index.html + viewer.html
按顺序运行每个阶段。每个阶段在开始前都会读取之前的工件。在当前工件完成之前,不要进入下一阶段。
阶段 1 — 侦探
输入:DATA_DIR
输出:PROJECT_DIR/detective.json
作用:研究外部背景——领域知识、历史背景、相关发现、这些数据为何重要。每个发现都有一个 det_xx ID。
阶段 2 — 分析师
输入:DATA_DIR、PROJECT_DIR/detective.json
输出:PROJECT_DIR/code/*.py、PROJECT_DIR/analyst.json
作用:在侦探提供的背景信息指导下,对数据进行详尽的定量分析。所有代码都作为可运行脚本保存到 code/ 中。每个发现都有一个 ana_xx ID,包含 calculation(文件+行+输出)和 data_table(可用于图表的数据)。
阶段 3 — 编辑
输入:PROJECT_DIR/detective.json、PROJECT_DIR/analyst.json
输出:PROJECT_DIR/editor.md、PROJECT_DIR/editor.json
作用:编辑决策——哪些发现重要,叙事弧线是什么,博客的论点是什么。每个部分都有一个 edt_xx ID,并明确引用 ana_xx 发现和 det_xx 背景。不涉及视觉设计。
阶段 4 — 设计师
输入:PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/analyst.json
输出:PROJECT_DIR/designer.json、PROJECT_DIR/assets/*
作用:数据驱动的创意视觉决策——如何使用图表、图片、视频、音频、地图、交互式元素、数据标注、实例或在适当时仅使用文本来呈现每个要点。媒体组合应基于数据集的属性自然生成,而不是固定的清单。页面默认应多媒体丰富:借鉴来自 frontend-design 技能的视觉语言,并使用所有五个渠道(图表、图片、视频、音频、交互式/地图),除非某个渠道的文档化回退策略会导致虚构或纯装饰性的内容。每个视觉元素都有一个 des_xx ID,包含 data_source,在数据驱动时指向 ana_xx 的 data_table。生成精选的资产。不生成 HTML。
阶段 5 — 程序员
输入:PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/analyst.json、PROJECT_DIR/designer.json
输出:PROJECT_DIR/index.html
作用:用 HTML 实现最终的博客。应用 designer.json 中 page_rhythm 记录的主题/强调色,并借鉴来自 frontend-design 技能的组件和令牌配方。从 analyst.json 的 data_table 中解析图表数据(不允许直接访问原始数据)。为每个元素添加 data-edt、data-ana、data-det、data-des 属性以实现可追溯性。
阶段 6 — 审计员
输入:PROJECT_DIR/index.html
输出:PROJECT_DIR/index.html(已修改)、PROJECT_DIR/auditor.json
作用:检测并修复布局问题(重叠、间距、对齐),但不更改内容或设计意图。在程序员之后自动运行,以确保视觉元素正确换行和间距。
调用:Skill auditor PROJECT_DIR
阶段 7 — 检查员
输入:PROJECT_DIR/index.html、所有 JSON 文件
输出:PROJECT_DIR/inspector.json、PROJECT_DIR/viewer.html
作用:运行句子级的可追溯性验证,并生成一个交互式查看器。分两步:
python3 SKILL_DIR/inspector/scripts/verify.py PROJECT_DIR --log-errors
python3 SKILL_DIR/inspector/scripts/generate_viewer.py PROJECT_DIR
步骤 1 生成 inspector.json(句子→证据映射)。步骤 2 生成 viewer.html(自包含,可在 file:// 下工作,无需服务器)。详细信息请参见 inspector/SKILL.md。
可追溯性:ID 在流水线中的流转
det_01 ──┐
det_02 ──┤
├──▶ ana_01 (based_on: [det_02]) ──┐
│ ana_02 (based_on: []) ├──▶ edt_01 (findings: [ana_01, ana_02], context: [det_01]) ──▶ des_01 (section: edt_01, data_source: ana_01)
│ ana_03 (based_on: [det_01]) │ edt_02 (findings: [ana_03], context: [det_02]) ──▶ des_02 (section: edt_02, data_source: ana_03)
└────────────────────────────────────┘
最终 HTML 中的每个值都可以追溯:HTML data-des="des_01" → designer.json des_01.data_source="ana_01" → analyst.json ana_01.calculation.code → 可验证。
交接规则
- 每个工件必须在下一阶段开始前完成。
- 如果工件缺少必需的章节,请先修复它再继续。
- 媒体丰富性门控(在设计师之后、程序员之前):
designer.json应涵盖所有五个通道(图表、图片、视频、音频、交互式或地图)。对于任何标记为used:false的通道,确认其文档化的回退策略已被实际尝试过,并且已在meta.media_decisions中记录了基于数据的理由。如果某个通道因为图省事而非数据不支持而被跳过,则应在程序员运行之前将其送回给设计师。 - 所有生成的资产仅放在
PROJECT_DIR/assets/中。 - 最终交付物:
PROJECT_DIR/index.html、PROJECT_DIR/detective.json、PROJECT_DIR/analyst.json、PROJECT_DIR/code/*.py、PROJECT_DIR/editor.md、PROJECT_DIR/editor.json、PROJECT_DIR/designer.json、PROJECT_DIR/inspector.json、PROJECT_DIR/viewer.html。