可视化(profy-visualize)
一句话定义
profy-visualize 让专家把可视化结果直接画在对话里——图表、3D 展品、地理地图、交互式界面——而不是给你一段代码或一张静态图片。产出是可交互的(能悬停、能旋转、能点击),并且平台提供了配套的自检工具让模型在给你看之前先验证渲染有没有出问题。
激活条件
browser 工具是故意被这个插件一起绑定的:视觉校验流程要调 browser(action='screenshot'),如果你只勾了 Visualize 而没有浏览器能力,提示词里引用的工具就不存在,自检环节会整个失效。这也是为什么单独勾选 Visualize 时你会看到浏览器工具也被激活。三个渲染工具怎么选
这是使用这个插件时唯一需要理解的判断,其余都是模型的事。
判断口诀写在提示词里:输出是「布局 + 数据 + 动作」用
render_ui,输出是「自定义画面」用 visualize。
两者最实际的差别在于观感一致性:render_ui 渲染出来的东西和 Profy 界面本身是同一套设计系统(因为就是同一批 React 组件),而 visualize 是 iframe 里的独立世界,好看与否完全取决于模型写的 CSS。所以做「一张对比表」用 render_ui 会比让模型手写 HTML 表格稳定得多。
visualize:内联 HTML 可视化
参数
沙箱与网络
渲染发生在 sandboxed iframe 里,默认无网络访问。但 CDN 是放行的——这是唯一的例外,因为几乎所有可视化库都靠 CDN 引入。已验证可用的源:设计规范(提示词层强制)
模型被要求遵守六条:- 自包含:所有东西在一个 HTML 片段里,不引用外部文件
- 响应式:
width: 100%,高度典型值 400–600px - 明暗自适应:用
color-scheme: light dark或prefers-color-scheme - 可交互:该有悬停提示、点击、缩放平移的地方要有
- 可访问:关键元素带 ARIA 标签
- 性能:DOM 元素控制在 1000 以内,大数据集走 canvas/WebGL
<div> 画一万个点的散点图会让页面卡死,必须换 canvas。
视觉自检循环(这个插件最有价值的部分)
提示词里写死了一套「Vision in the Loop」协议——模型在把结果给你看之前必须先自己看一眼:1
生成或修改代码
写出 HTML 片段
2
截图
browser(action="screenshot", html=<your_html>)3
读图
image(action="read", image_urls=[...], prompt="检查渲染、构图、标签、可见错误")4
自己分析
按症状对照:画布全白 → WebGL 上下文错误或脚本报错;元素缺失 → 几何/材质/光照问题;布局错位 → 相机或位置缩放;坐标轴没了 → scale domain 或 append 顺序;数据没渲染 → 数据绑定或解析错误
5
有问题就回到第 1 步
修完重新截图,直到看起来对了才呈现给用户
render_ui:声明式原生界面(A2UI)
参数
协议版本固定为
0.9.1。
组件类型
Card / Row / Column / Text / Button / Image / Table / PricingTable,可通过 children 数组嵌套。
校验会先于渲染
每个组件(含所有层级的 children)都会被递归校验必须带type 字段。校验不通过时返回的是错误详情而不是界面:
components[0].children[2]),所以模型能精确定位问题。children 不是数组时也会被指出(.children: must be an array)。
render_ui 渲染的是原生 React 组件,不走 iframe。所以它没有 visualize 的网络限制问题,但也不能跑任意 JS——你只能用平台提供的组件类型。这是安全性与灵活性的取舍:能力上限低,但产出必然和产品设计系统一致。inspect_3d:Three.js 场景诊断
这个工具不产出画面,它回答「我刚渲染的 3D 场景到底健不健康」。参数
前提:场景必须被暴露出来
工具通过 CDP 注入 JS 遍历场景图,页面必须把场景挂在window.__THREE_SCENE__ 或 window.scene 上。没挂就会拿到:
window.__THREE_SCENE__ = scene; 就能让整个诊断链路可用。
它会告诉你什么
「画面全白」这个症状在 3D 里非常常见且难以从截图判断原因——可能是 WebGL 挂了、可能是相机看错方向、可能是场景根本没物体。
inspect_3d 的价值就是把这三种情况区分开。
双模式支持
沙箱模式走 CDP,桌面模式走 browser 工具路由,两边行为一致。解析失败时会返回{"raw_output": ..., "warnings": ["Could not parse inspection result as JSON"]} 而不是抛错,所以拿到 raw_output 说明注入执行了但输出格式异常。
技能层
manifest 显式声明 8 篇技能,这 8 篇的正文会被注入进提示词:visualize / threejs-showcase / molecular-visualization / data-visualization / d3-data-visualization / geospatial-visualization / statistical-visualization / a2ui-patterns
但插件目录下实际有 22 个技能目录。平台的技能注册表会递归扫描 plugins/builtin/*/skills/ 下所有 SKILL.md,所以另外 14 篇同样能通过 skill 工具按名加载,只是不会默认占用上下文:
3d-data-visualization / accessibility-visualization / canvas2d-data-visualization / dashboards-realtime / gantt-chart / grammar-of-graphics / interactive-3d-atlas / node-link-diagram / react-nextjs-visualization / reports-pdf-slides / scrollytelling / threejs-data-visualization / uml-architecture / visualization-strategy
这是一条通用规律,不止 visualize:manifest 的
skills 列表 = 默认注入的,目录里的 SKILL.md = 可按需加载的。前者花上下文买确定性,后者省上下文但需要模型主动去取。所以你说「用甘特图展示排期」时模型会先去加载 gantt-chart 再动手,中间那一步不是它在磨蹭。可执行示例
数据图表
数据图表
visualize + D3 或 Vega-Lite,画完截图自检,确认坐标轴和悬停都正常后再给你。3D 产品展示
3D 产品展示
3D.md 提示词与 threejs-showcase 技能,并在渲染后调 inspect_3d 确认 draw call 和三角面在合理范围。结构化对比界面
结构化对比界面
render_ui 的典型场景——布局 + 数据 + 动作,不需要自定义画面。地理数据
地理数据
geospatial-visualization 技能。边界与失败态
验证
1
确认插件已激活
问「你现在能在对话里直接画图吗?」。激活时专家会区分
visualize 与 render_ui 两种产出;未激活时它会说”我可以给你代码”。2
最小图表
「用 [1,3,2,5,4] 画一个柱状图」。应该直接看到可交互图表,不是代码块。
3
验证自检生效
提一个稍复杂的 3D 需求,观察模型是否在给你结果前调用了截图与
inspect_3d。跳过自检直接交付的,多半是浏览器工具没绑上。相关页面
渲染表面
对话里各类渲染表面的总览与区别
A2UI
声明式界面协议的组件与模式
3D 开发
Blender / Godot 桥接与 3D 资产管线
画布
自由创作画布(与内联可视化正交)
核对日期 2026-08-11。来源:
services/agent-runtime/src/plugins/builtin/visualize/plugin.json、tools/{visualize,render_ui,inspect_3d,_inspect_runner}.py、prompts/VISUALIZE.md、services/agent-runtime/src/skills/registry.py。
