← 返回列表
✓ 可直接安装
一个不改动 DSH 源码的外部插件:让模型在对话流里边生成边渲染可视化内容——流式 SVG/HTML…
自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=20);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/8/23 · 已提供中文文档
综合分
31.2
GitHub 分
31.2
用户评分
—
★ Stars
6
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-visualizernpm 包 dsh-visualizer 已校验归属本仓库,走 npm 安装最省事
信任档位:已验证本站已于 3 天前真实安装成功(L4 · 真实安装)
- 是什么
- dsh 原生插件 · vision
- 装得上吗
- 本站已真实安装成功(L4 · 真实安装,非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 更新放缓:最近一次提交在 33 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/22(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-visualizer @ 0.3.0
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/22 08:27:35
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools@deepseek-ai/cordis用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-visualizer
English · 简体中文
一个不改动 DSH 源码的外部插件:让模型在对话流里边生成边渲染可视化内容——流式 SVG/HTML 组件,以及结构化图表(ChartSpec → echarts)。
License: MIT
Node.js: 20+
Tests: 97 passing
CI
这是什么
在 DSH(DeepSeek Harness)的对话里,让模型直接生成可视内容,安全地渲染到对话流中:
- 结构化图表——visualize 工具的 spec,用 echarts 渲染(折线 / 柱状 / 面积 / 饼图 / 散点)。
- SVG / HTML 组件——模型写了 ```svg / ```html 围栏,逐 token 流式渲染到沙箱 iframe;也可用 visualize 的 widget 参数整件交付。
它复用 DSH 已有的 assistant/chunk 与 tool/call + tool/result 事件,不改 DSH 源码。
特性
- 两类产物、三条交付路径:visualize(spec) 出图表;正文 ```svg / ```html 围栏流式出组件;visualize(widget) 出完整组件。
- 流式渲染:复用已有 assistant/chunk 事件拿到逐 token 输出,组件随文本流逐帧更新。
- 双端校验:host execute 与客户端折叠共用同一套纯函数解析器(chartspec / widget),模型漂移不会静默通过。
- 安全隔离:组件代码原样插入 sandbox="" iframe + CSP default-src 'none',无 sanitizer 可绕过。
- 渲染体验:图表主题采样 --dsw-alias-* 令牌;SVG 按固有宽高比自适应高度;卡片带「适应 / 1.5× / 2×」缩放与状态徽标(生成中 / 已截断 / 完成)。
- 优雅降级:任何校验 / 渲染失败都不留空白、不抛错——退回普通代码块或 JSON 卡。
- 纯函数、可测试:核心逻辑均为无 DSH 依赖的纯模块,97 个单测在 Node 里独立跑。
效果一览
真实对话截图(DSH Web 客户端内渲染):
结构化图表 · visualize(spec) → echarts(主题跟随 DSH)
组件 · visualize(widget) → 沙箱 iframe
更多渲染示例(由插件自身代码渲染生成):
左:柱状图 · 右:SVG 组件 · 下左:HTML 组件 · 下右:流式渲染(```svg 围栏逐 token 边生成边更新)
安装
从 GitHub 直接安装(推荐,构建产物已入库):
dsh plugin --profile web add github:Moses14159/dsh-visualizer
也可以先克隆、再从本地路径安装:
git clone https://github.com/Moses14159/dsh-visualizer.git
dsh plugin --profile web add /path/to/dsh-visualizer
- 从 Git 安装的插件会在安装时通过 prepare 脚本构建。pnpm 为安全起见会拦截构建脚本,若它提示授权,把对应的 allowBuilds 键加到 profile 的 pnpm-workspace.yaml 后再执行即可。
- 待 dsh-visualizer 发布到 npm 后,也可以用裸名安装:dsh plugin --profile web add dsh-visualizer。
- 需要本机已安装 DSH(deepseek-harness)并能启动 dsh web。依赖 DSH 的 @deepseek-ai/dsh-client-runtime、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-tools(见 peerDependencies)。
用法
安装后,在对话里告诉模型即可:
- 说「用 visualize 画个图」→ 模型调用 visualize 工具传 spec;
- 说「写一个 SVG 徽章 / HTML 组件」→ 模型在正文直接流式输出 ```svg / ```html 围栏,生成过程中即可看到逐帧渲染;
- 模型也可用 visualize 传 widget 参数整件交付(经 host 校验、持久化、可重放)。
工具载荷
visualize 二选一:
// 结构化图表
{ "spec": {
"kind": "bar", // bar | line | area | pie | scatter
"title": "深圳 · 未来 7 天气温",
"xAxis": ["周六", "周日", "周一", "周二", "周三", "周四", "周五"],
"yName": "°C",
"series": [{ "name": "最高温", "data": [32, 32, 30, 31, 29, 31, 32] }]
} }
// SVG / HTML 组件
{ "widget": { "kind": "svg", "code": "…", "title": "卡片标题" } }
流式围栏
svg
…逐 token 边生成边渲染…
示例
在对话里直接这样说,就能看到效果(这些图取自真实对话)。
生成一张天气卡片
帮我生成一张深圳现在的天气卡片
模型会调用 visualize 传 widget(HTML),渲染成沙箱组件卡片:
visualize(widget) · 沙箱 iframe 渲染的 HTML 卡片
画一个折线图
用 visualize 画一张北京明天 24 小时的气温变化图
模型会传 spec(line),用 echarts 渲染:
visualize(spec) · echarts 渲染(主题跟随 DSH)
边生成边渲染(流式)
写一个深圳实时天气的 SVG 卡片
模型会在正文写 ```svg 围栏,边生成边渲染:
正文 ```svg 围栏 · 逐 token 流式渲染
一次要多种
同时画一张柱状图、一张饼图,再写一个天气卡片
模型会多次调用 visualize,分别产出图表与组件,在对话流里排开。
💡 提示:以上示例要求模型已加载 visualize 工具(安装插件后即注册)。若模型没有主动用该工具,直接描述你想要的内容即可,它会优先调用 visualize。
架构
架构图
两条交付路径
| 产物 | 触发 | 会话事件 | 折叠 | 渲染 |
|---|---|---|---|---|
| 结构化图表 | visualize(spec) | tool/call + tool/result | visualizer-chart | echarts |
| 组件(整件交付) | visualize(widget) | tool/call + tool/result | visualizer-widget | 沙箱 iframe |
| 组件(流式) | 正文 ```svg / ```html | assistant/chunk | visualizer-widget(逐帧更新) | 沙箱 iframe |
为什么这个形态可行(源码级事实)
- assistant/chunk 是已存在的会话事件家族:agent-loop 把每个 StreamChunk 落盘为 { turn, step, chunk },Web 客户端的流式文本正是折叠这些事件得来的——插件复用同一事件流即可拿到逐 token 输出,无需新增 host 侧事件家族。
- conversationEvents 是 cordis Service,外部插件可 inject;visualizer-widget 与内置 assistant-step 并行折叠同一批 assistant/chunk 事件,互不干扰。
- conversation.chat.node 是 keyed slot(replaceRisk: 'none'),外部插件按字符串名注册 { key: 'visualizer-chart' | 'visualizer-widget' } 即增量贡献。
- ChatNodeViewProps / ConversationNodeDefinition / ChatNodeDataMap 都是纯类型,构建期擦除,不触发客户端 bundle 的纯度门。
- 确定性:match 只读当前事件;同一 Context 每个事件携带或独立推导同一稳定 id(step:: / widget:);update 按日志 seq 折叠,可重放。
安全边界
| 层 | 处理 |
|---|---|
| 模型 → spec / widget | host execute 用 parseChartSpec / parseWidgetSpec 校验;非法载荷拒绝执行(工具报错) |
| 正文流 → widget | 客户端 WidgetScanner 只认行首 ```svg / ```html 围栏;组件代码不做标记校验(流式中任意字节都可能是合法前缀),安全边界在渲染侧 |
| session log → 客户端 | Definition 的 update/fallback 对结果文本再次解析;assistant/message 全文是冷回放的恢复源 |
| 渲染(组件) | 双层隔离:iframe sandbox=""(禁脚本/同源/表单/弹窗/导航,opaque origin)+ srcdoc 注入 CSP default-src 'none';代码原样插入,无 sanitizer 可绕过 |
| 渲染(图表) | ChartSpec 是纯数据 → echarts setOption;无 HTML/SVG 注入面 |
任何校验 / 渲染失败都降级(不渲染该节点 / 围栏仍以普通代码块显示 / JSON 卡),绝不让对话流出现空白行或抛错中断。
载荷上限
- 图表:≤ 8 个 series、≤ 500 个点、标签 ≤ 120 字符;
- 组件:单件 ≤ 128 KB(UTF-8)、每节点 ≤ 12 件 / 总计 ≤ 512 KB,超限截断或省略并显示「已截断」徽标。
开发
pnpm install
pnpm test # 纯函数单测(97 用例)
pnpm typecheck # tsc --noEmit
pnpm build # tsdown:host + replay + 两渠道 client bundle
pnpm render-demo # 重新生成 docs/ 里的演示图(需本机 Chrome)
- 纯函数模块(chartspec / widget / to-echarts / to-iframe / svg-geometry / 两个 fold)不 import DSH、不触达 DOM,因此能在 Node 里独立测试。
- 客户端聚合入口是 src/client/index.tsx;host 工具入口是 src/index.ts。
已知边界
- 图表仍是「整图出现」:ChartSpec 经工具调用交付,没有逐 token 流式图表(工具参数本身不是流式的);围栏组件才是流式路径。
- 围栏原文与组件卡并存:模型写出的代码块仍会按普通 markdown 代码块渲染(作为「源码」视图),组件卡在流中增量渲染——两者不互斥。
- 组件是静态的:sandbox 禁脚本,交互式组件(按钮逻辑、动画脚本)不会执行;需要交互时请用图表或让组件纯展示。
- 不包含 mermaid:v1 只支持 svg/html 两种围栏,mermaid 图请走普通代码块或后续版本。
- 围栏必须在行首(≤ 3 空格缩进),行内 ```svg 不是围栏;围栏内容里的 ``` 单独成行会闭合围栏(CommonMark 语义)。
- echarts 按需 import('echarts') 内联进客户端 bundle(registry 路由只服务单文件,暂不能 code-split)。
兼容性
- Node:>= 20;DSH:通过外部插件机制加载(profile bundle patch)。
- peer 依赖:@deepseek-ai/cordis、@deepseek-ai/dsh-client-runtime、@deepseek-ai/dsh-client-ui-conversation、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-tools、react、react-dom。
许可
MIT · Copyright (c) 2026 Moses14159