前言¶
用 DSH 跑智能体任务时,一个会话往往包含多轮推理、几十次工具调用,事件日志逐条排下来很长。内置的「轨迹」视图是账本式的,能查,但想快速回答「这一轮做了什么、哪一步最慢、token 花在哪」并不直观。DSH 的理念是一切皆插件,会话视图本身也留了接缝。下面介绍的 dsh-decision-map,就是利用这个接缝做的一层可视化。
这是什么¶
dsh-decision-map(决策地图)是 Scitiger-AI 维护的 DeepSeek Harness bundle 插件,当前版本 0.1.0,MIT 许可证。一句话定位:把当前会话的执行轨迹渲染成一眼能看懂的时间线卡片与统计卡。
它是一个「双面」插件:
1、node 半边注册一个 decisionMap 会话投影,把事件日志折叠成时间线和统计;
2、browser 半边在会话视图里注册一个「决策地图」标签页,读取投影并渲染。
包结构也很直接:
dsh-decision-map/
├── package.json # 双面包身份声明(dsh.bundle.patch + dsh.client)
├── cordis.patch.yml # bundle patch:insert 一行 { id: decision-map, name: dsh-decision-map }
├── lib/
│ ├── index.js # node half:注册 decisionMap 会话投影
│ └── client.js # browser half:注册 conversation.view 标签页
└── README.md
核心功能¶
卡片式时间线¶
安装后,会话视图(conversation.view slot,order 20)会多出一个「决策地图」标签页。时间线上每个动作是一张卡片,分三类:
💭 思考(琥珀色):该步产生了 reasoning🔧 工具(蓝色):一次工具调用✍️ 写文件(绿色):工具名恰为write/edit的调用
轮次之间用「第 N 轮 · N 个动作 · 跨度 X」分隔。每张卡片标注类型、工具名、耗时、第N轮·第S步,下方缩进显示详情——思考显示推理片段,工具显示参数。
点击任一卡片,右侧展开一个详情面板,显示该动作的类型、耗时、时间与完整详情,选中卡片有高亮描边。与内置「轨迹」的区别在于:决策地图把每一步做成带图标的卡片、按时间顺序铺开,每一步做了什么、花了多久一眼能看清。
统计卡¶
时间线旁边是一排统计卡:总 Token(含输入/输出拆分)、工具调用次数、轮次数、最耗时的步骤。
数据从哪来¶
node 半边注册 decisionMap 会话投影,折叠这些事件:turn/start、step/start、assistant/chunk、assistant/message、tool/call、tool/result、step/end,结果是一个 timeline + stats 结构。口径如下:
- token 取
usage的inputTokens + cacheReadTokens + cacheWriteTokens + outputTokens,只计入 adapter 上报了usage的assistant/message,未上报则为 0; - 工具耗时按
callId配对tool/call → tool/result; - 思考耗时是 TTFT 近似:该步首次 reasoning 到首个非 reasoning token 的时长,无输出 token 的步思考节点耗时为空。
browser 半边注册 conversation.view 标签页,通过 useProjection("decisionMap") 读取投影。数据链路是:会话事件日志 → 投影折叠 → 经 api-proxy 的 tail page 与 session/projection push 帧送达浏览器 → 标签页渲染。
纯前端实现,零依赖¶
渲染全部在前端完成:内联样式 + div,不引用任何外部库、CDN、字体或图片。配色使用 shell 自带的 --dsw-static-* 静态色与 --dsw-alias-* 主题别名,明暗主题自动适配。
整个包零运行时依赖、无构建、无 TypeScript,装下来开箱即用。两半都不创建进程级或页面级副作用,可被 Cordis 的 stop/update/unload 干净回收。
安装与启用¶
先取包,再用 dsh plugin 把它装进某个 profile。三种方式:
# 方式 A:在本包目录内(package.json 所在目录)用 `.`:
cd /path/to/dsh-decision-map
dsh plugin --profile web add .
# 方式 B:在本包目录的父级目录,用相对路径:
dsh plugin --profile web add ./dsh-decision-map
# 方式 C:发布到 npm 后按包名安装:
dsh plugin --profile web add dsh-decision-map
两个注意点:
1、dsh plugin add 会把相对路径锚定到你执行命令时所在的目录。别在包目录内写成 add ./decision-map——那会指向一个不存在的子目录。
2、本包声明了 dsh.bundle.patch,dsh plugin add 会自动把它并入该 profile 的 dsh.profile.bundles 层栈,随后 profile 组合器应用包内自带的 cordis.patch.yml:
- insert:
- id: decision-map
name: dsh-decision-map
也就是说,不需要手工编辑 profile 的 cordis.patch.yml。
经过上面的步骤,重启(或触发配置热重载)后,进入任意会话,标题栏的视图标签里会出现「决策地图」。
已知取舍¶
- 投影值随 tail page 全量携带:
timeline是完整动作列表,会话很长时投影值会变大。每个节点的detail已截断至 120 字符,对常规会话可忽略。 - 「写文件」是启发式分类:只把工具名恰为
write/edit的调用标为绿色;bash这类既能读也能写的工具归入「工具」,不臆测是否落盘。 - 思考耗时是 TTFT 近似,不是精确的推理墙钟时间;无输出 token 的步,思考节点耗时为空。
- token 是 provider 上报值,与核心的 token 记账口径一致,adapter 未上报 usage 则计为 0。
适用场景与注意¶
适合需要复盘智能体执行过程的开发者:确认多轮里的动作顺序、看每一步的耗时、检查 token 消耗分布。它只做展示,不改动会话数据。
提醒一点:插件以当前 dsh 进程权限运行,安装前建议先读源码、确认许可证。本包的核心就是 lib/index.js 和 lib/client.js 两个文件,无构建、零运行时依赖,阅读成本不高,许可证为 MIT。
结尾¶
dsh-decision-map 做的事情很克制:在会话视图加一个标签页,把事件日志折成时间线和统计卡,让执行轨迹从「能查」变成「能看」。装完即用,卸载干净,符合 DSH 一切皆插件的思路。
- 插件目录页:https://www.skillhub.cn/plugins/Scitiger-AI/dsh-decision-map (社区维护的独立目录站点,与 DeepSeek / 幻方无官方从属关系)
- 源码仓库:https://github.com/Scitiger-AI/dsh-decision-map