前言¶
DSH 的智能體默認只會活在一次會話裏。會話結束之後,那些關於用戶偏好、項目約定、上次進展的信息就全丟了,下一次又要重新問一遍。常見的解法是自己掛一個向量庫做檢索,或者把日誌塞進一個 JSON 文件,但前者運維重,後者記到最後往往變成一鍋粥——什麼都想留,最後什麼也找不到。
dsh-journal 走的是第三條路:不追求相似度檢索,而是給每條記憶打上分級,讓重要的留得久、不重要的按時淡出。下面介紹這個插件。
這是什麼¶
dsh-journal 是 Ghill-0131 維護的一個 DeepSeek Harness 插件,屬「記憶」分類,目前星標爲 0。它把一個純文本的 JSONL 文件包裝成宿主裏一等公民的 journal 工具,核心能力是分級長期記憶:每條記錄帶一個級別、一個過期時間和一個複覈日期,讓長期運行的智能體把對的東西留對的時間,其餘的自動交給時間處理。
一句話定位:它是一個小的、可人工審閱的、手工整理的日誌,更接近記事本而不是數據庫。
分級模型¶
插件的邏輯是:寫的時候要問的不是「這條重要嗎」,而是「這條屬於骨架還是文件」。等級直接決定生命週期:
| 級別 | 含義 | 生命週期 |
|---|---|---|
S |
關係、情緒、共同經歷、承諾 | 永不自動刪除,釘住 |
A |
持久事實、偏好、關鍵決策 | 365 天 |
B |
項目上下文、任務進展 | 60 天 |
C |
臨時細節、一次性操作 | 7 天 |
規則很簡單,但很實用:怎麼跟人說話歸 S,昨天排查的端口號歸 B,留給下個會話的交接說明歸 A,因爲它只需要活到被讀一次。
過期不會物理刪除。prune 是軟刪除,把過期行移進 archive/;被釘住的行豁免。
核心功能¶
插件暴露一個工具、八種動作:
| 動作 | 作用 |
|---|---|
add |
寫入一條記錄(level、title、text 必填) |
list |
列出記錄,可按級別 / 狀態過濾 |
search |
在標題、正文、標籤裏做子串搜索 |
digest |
輸出 S + A 摘要,新會話最先該讀的內容 |
stats |
各級別計數、文件大小、已過期但未清理的數量 |
review |
把某條記錄的過期時間往後推 |
prune |
軟刪除所有超期記錄 |
render |
重寫 JOURNAL.md,生成可讀摘要 |
存儲只有一個文件:<root>/journal.jsonl,一行一個 JSON 對象。寫入走臨時文件再 rename,中途崩潰不會撕裂存儲;讀取時如果最後一行爲殘行則跳過,而不是讓調用失敗。記錄結構如下:
{
"id": "j-20261104-140902-479d",
"ts": "2026-11-04T14:09:02+00:00",
"level": "B",
"kind": "fact",
"title": "short one-line title",
"text": "the body; facts, not reflections",
"tags": ["..."],
"pinned": false,
"status": "active",
"expires_at": "2027-01-03T14:09:02+00:00",
"reviewed_at": null,
"source": ""
}
格式刻意保持樸素:任何能讀 JSONL 的腳本都能讀它,任何能寫一行的腳本都能往裏加。
安裝與啓用¶
這個插件的安裝方式和一般的 npm 依賴不同,需要特別注意。DSH 插件只有在以 link 形式安裝時才能拿到宿主包(@deepseek-ai/*);普通的 npm 依賴會導入失敗並被靜默跳過。README 給出的安裝步驟如下。
1、先把代碼放到一個穩定的位置,不要放在 profile 目錄裏,例如 D:\DSH-Plugins\dsh-journal\0.1.0\。
2、用真正的 junction 建立鏈接。跨盤 symlink 可能被建成壞鏈且不會報錯,所以這裏要用 junction:
New-Item -ItemType Junction `
-Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-journal" `
-Target "D:\DSH-Plugins\dsh-journal\0.1.0"
3、profile 的 package.json 裏兩個列表都要加上它:
// dependencies
"dsh-journal": "link:D:/DSH-Plugins/dsh-journal/0.1.0"
// dsh.profile.bundles
"dsh-journal"
此處要讓 Node 來改文件,不要做純文本替換:多一個逗號就會讓 profile 無法解析,harness 直接起不來。
4、重啓 harness。
配置寫在 bundle 層的 cordis.patch.yml 裏:
# key / 默認值 / 含義
# root: D:/dsh-data/journal (Windows) 或 /dsh-data/journal
# —— journal.jsonl 所在目錄
# toolName: journal
# —— 該工具在模型工具集裏的名字
另外 JOURNAL_ROOT 環境變量可以覆蓋 root。
典型用法¶
下面是在 agent 循環裏的典型調用,直接來自 README:
journal action=digest # 每次新會話開始時跑一次
journal action=add level=S title="..." text="..."
journal action=search query=備考
journal action=prune dryRun=true # 先看哪些會過期,不做任何改動
日常的節奏是:會話開始讀 digest 拿到該知道的部分;過程中把不斷產生的信息按級別寫進去;結束前跑一次 prune dryRun=true 確認沒有要提前 review 的內容,需要延長就 review,不需要就讓過期項自然歸檔。
適用場景與注意事項¶
適合那些需要跨會話延續上下文、但不想引入向量庫和檢索鏈路的 DSH 開發者。它的賭注是:一個寫下幾百條關鍵行、並按時遺忘其餘內容的智能體,勝過一個什麼都要存、再靠搜索找回來智能體。
要注意幾點:
- 這是一個插件,以當前 dsh 進程的權限運行,安裝前應先檢查源碼與許可證(MIT)。
- 它不是向量庫,不做相似度檢索,無法替代語義召回。
journal工具會出現在模型的工具集裏,級別劃分是否合理、過期時間是否合適,需要結合實際任務調。- 依賴 Node >= 22.13。
結尾¶
dsh-journal 的價值不在於存儲量,而在於它給了智能體一套「該記什麼、記多久」的明確規則,並且整個存儲是純 JSONL,可以人工讀、可以腳本讀寫。如果你在用 DSH 做長期運行的助手,值得把它作爲第一個記憶層試一下。
- 目錄頁:https://www.skillhub.cn/plugins/Ghill-0131/dsh-journal
- GitHub:https://github.com/Ghill-0131/dsh-journal