DeerFlow chart-visualization 技能实战:generate_fishbone_diagram 鱼骨图参数全解
本文围绕 DeerFlow 仓库中 chart-visualization 技能的鱼骨图(generate_fishbone_diagram)参考文档展开,完整讲解其输入字段、树形数据设计与默认值,并深入 scripts/generate.js 的调用链,说明从 JSON 载荷到图片 URL 的完整生成流程。读完后可在 DeerFlow 的 Agent 对话中准确构造鱼骨图生成参数,并理解底层脚本如何路由、批处理和返回结果。
一、鱼骨图在技能体系中的定位
鱼骨图(Ishikawa Diagram,因果图)专用于根因分析:将中心问题放在主干,左右分支展示不同类别的原因及其细化节点,常见于质量管理、流程优化等场景(见 generate_fishbone_diagram.md 的功能概述)。
chart-visualization 是 DeerFlow 内置的公共技能,位于 skills/public/chart-visualization/ 目录,其 SKILL.md 声明了技能元数据(name: chart-visualization、Node.js 兼容性要求 >=18.0.0)与完整工作流。技能从 26 种可视化类型中智能选型,鱼骨图对应的选型规则是:
generate_fishbone_diagram: Cause-effect analysis.(因果/根因分析)
即当用户的数据特征表现为"一个问题、多类原因、逐层细化"时,应选中该图表。技能目录结构为:
- SKILL.md:工作流定义(选型 → 参数提取 → 生成 → 返回);
- references/:26 个图表类型的参数规格文档,鱼骨图对应
references/generate_fishbone_diagram.md; - scripts/generate.js:统一的图表生成入口脚本。
二、输入字段规格
参考文档将输入分为必填与可选两部分,全部作为 args 传入:
必填字段
| 字段 | 类型 | 说明 |
|---|---|---|
data |
object | 必填。至少提供根节点 name,可通过 children(array<object>)递归拓展子节点,最大建议 3 层 |
data 是一棵节点树:根节点描述中心问题,children 数组中每个子节点同样是 { name, children } 结构。层数控制在 3 层以内是为了保证渲染后的可读性——主干、一级分支、叶子三层恰好对应"问题 → 原因类别 → 具体现象"的因果层次。
可选字段
| 字段 | 类型 | 默认值 | 取值 |
|---|---|---|---|
style.texture |
string | default |
default / rough(切换线条风格,rough 为手绘风) |
theme |
string | default |
default / academy / dark |
width |
number | 600 |
画布宽度(像素) |
height |
number | 400 |
画布高度(像素) |
其中 texture 位于 style 对象内(即 args.style.texture),而 theme、width、height 直接挂在 args 顶层。需要区分"学术报告风"(academy)、"暗色仪表盘"(dark)与默认风格时,theme 是关键开关;在节点较多、标签拥挤时,可显式调大 width。
使用建议(来自参考文档)
- 主干节点:写问题陈述,例如"产品退货率上升 5%";
- 一级分支:命名原因类别,质量管理领域惯用"人、机、料、法"(Man/Machine/Material/Method),也可按业务场景替换为"人员、设备、数据、流程"等;
- 叶子节点:写具体现象,保持短语式表达,避免长句。
三、完整载荷示例
结合 SKILL.md 定义的 Payload Format,一份可直接执行的鱼骨图生成载荷如下:
{
"tool": "generate_fishbone_diagram",
"args": {
"data": {
"name": "订单交付延迟",
"children": [
{
"name": "人",
"children": [
{ "name": "拣货员排班不足" },
{ "name": "新员工操作不熟练" }
]
},
{
"name": "机",
"children": [
{ "name": "打包机故障率上升" }
]
},
{
"name": "料",
"children": [
{ "name": "热销 SKU 缺货" }
]
},
{
"name": "法",
"children": [
{ "name": "波次策略未按峰值调整" }
]
}
]
},
"theme": "default",
"style": { "texture": "default" },
"width": 600,
"height": 400
}
}
执行命令(见 SKILL.md 的 Execution Command):
node ./scripts/generate.js '<payload_json>'
工作流要求返回给用户的不仅是图片 URL,还包括完整的 args(规格),以便后续增删节点时复用。
四、底层调用链:generate.js 是如何处理 fishbone-diagram 的
scripts/generate.js 是所有 26 种图表的统一入口。从源码结构看,鱼骨图的处理链路如下:
- 工具名到图表类型的映射:
CHART_TYPE_MAP中generate_fishbone_diagram映射为fishbone-diagram(见 generate.js)。该映射注释说明其与上游src/utils/callTool.ts保持一致,是渲染服务的类型标识。 - 载荷解析:
main()读取process.argv[2],若参数是已存在的文件路径则读取文件内容,否则按 JSON 字符串解析(generate.js)。这意味着长载荷可以写成 JSON 文件再传入,规避 shell 引号转义问题。 - 批处理支持:若解析结果是数组,脚本会逐个处理(generate.js),一次命令可生成多张图;单条 spec 中
tool缺失或类型未知时打印错误并continue,不会中断其余项。 - 服务端调用:非地图类图表(鱼骨图不属于
generate_district_map/generate_path_map/generate_pin_map这三个走generateMap分支的工具)统一走generateChartUrl():构造{ type: "fishbone-diagram", source: "chart-visualization-creator", ...options }的 POST 请求,请求地址取自环境变量VIS_REQUEST_SERVER,未设置时回退到脚本内置的默认服务端点(见 generate.js 的getVisRequestServer())。因此部署方可以通过设置VIS_REQUEST_SERVER指向自建或内网渲染服务,而不修改脚本代码。 - 结果输出:服务端响应中
success为假时抛出errorMessage;成功时取data.resultObj——对鱼骨图即生成的图片 URL,由脚本console.log输出到 stdout(generate.js)。
五、返回结果与后续迭代
参考文档"返回结果"一节说明:
- 返回鱼骨图 URL(图片地址);
- 并在
_meta.spec中保存树形结构,便于后续增删节点。
这与 SKILL.md 的"Result Return"步骤呼应:Agent 应把图片 URL 与完整 args 一并返回给用户。由于 data 本身是纯 JSON 节点树,迭代方式就是基于 _meta.spec 修改 children(如给"法"分支新增叶子"复核流程缺签字"),再以同样的 tool + args 重新调用脚本重新生成,无需任何服务端改动。
六、在 DeerFlow 中如何被加载与使用
chart-visualization 属于 DeerFlow 技能系统的公共技能:
- 目录约定:公共技能位于
skills/public/,自定义技能位于skills/custom/,每个技能以SKILL.md为权威定义(见 frontend 技能文档); - 加载机制:
load_skills()每次调用都重新扫描技能路径下的public/与custom/目录,并重新读取扩展配置,因此通过 Gateway API 启停技能会立即生效、无需重启; - 运行位置:技能在沙箱中挂载,
container_path默认为/mnt/skills,即 Agent 执行node ./scripts/generate.js时工作目录即技能目录; - 能力前置条件:
SKILL.mdfrontmatter 声明nodejs: ">=18.0.0",因为脚本依赖 Node 18 内置的全局fetch(见 generate.js 的httpPost实现)。
此外,仓库测试 backend/tests/test_skill_catalog.py 会校验 SKILL.md 的存在与解析,说明该技能目录结构是受测试契约保护的。
七、实践要点小结
- 因果/根因分析场景选用
generate_fishbone_diagram,树深建议 ≤3 层:根节点 = 问题陈述,一级 = 原因类别,叶子 = 具体现象短语; data是唯一必填字段,theme、style.texture、width、height全部可选且有默认值(default/default/600/400);- 载荷既可内联为 JSON 字符串,也可写成 JSON 文件后把路径传给 scripts/generate.js,数组形式还可一次批量出多张图;
- 结果 = 图片 URL +
_meta.spec中的节点树,基于该 spec 增删children即可低成本迭代图表; - 需要内网/自建渲染端点时,通过环境变量
VIS_REQUEST_SERVER覆盖默认服务端,无需改动脚本。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00