前言¶
用 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