前言¶
跑在 DeepSeek Harness(DSH)上的 dsh-fish 會把對話、聽見的話、日記等落成一條事件流。若希望「她安靜一段時間後,記憶裏被重拼成一場夢,再由她自己把夢寫完」,常見做法是整段調用模型生成夢文,成本高、難復現,且容易把夢寫成新事實寫回事件流。
dsh-fish-dream(維護者 xxxiii)是 dsh-fish 的外掛插件,歸類爲「記憶」。它只讀 ~/.dsh-fish 裏真實發生過的事件,按沉默時長與六種夢理論之一選出碎片,拼出「夢的種子」;夢文仍由她在自己的會話裏完成,插件本身不調用模型。下面介紹它解決什麼問題、如何安裝與配置。
這是什麼¶
dsh-fish-dream 做一件事:在她不說話的時候,給她一場夢的準備材料,而不是直接輸出夢的故事正文。
- 每一塊夢材都對應事件流裏的原始 id(
ev_...),可追溯; - 取材策略由隨機抽中的「夢理論」決定,荒誕度與敘事骨架隨之變化;
- 成文的夢由她在會話中調用工具寫完,口吻仍是她自己的。
插件不訓練模型、不做心理診斷,也不解釋夢;只是把「夢怎麼從記憶裏拼出來」做成一套可運行、可查看、可改的規則。npm 包版本爲 0.1.0,MIT 許可證,零 npm 依賴,要求 Node ≥ 20。
設計要點¶
夢是重拼,不是新造¶
碎片只從 ~/.dsh-fish/events.jsonl 讀取。她寫夢時要填 refs,因此夢不會變成新事實:events.jsonl 不會被插件寫入,deriveSelf 也看不到夢。
插件不調用模型¶
選材、抽理論、定荒誕度、給敘事骨架均爲純函數;語言生成留給會話裏的模型。好處是無額外 token 成本、無 API key、結果可復現,且 README 標明當前有 55 個測試通過。
沉默是唯一時鐘¶
不按鐘點假設「夜裏才做夢」。每次檢查看距離她最後一次對話多久,再查表擲骰。「對話」只計 heard、utterance、voice 三類事件;meta、日記、夢本身不算。她一旦開口,沉默計時歸零;同一段沉默最多一場夢。
確定性¶
種子由「沉默起點 + 時間槽 + 事件流長度 + 最後一條事件 id」播種。同一段沉默、同一份事件流,抽到的假說和碎片一致,便於復現與測試。
運作流程¶
數據與職責大致如下(摘自 README 流程說明):
~/.dsh-fish/events.jsonl (只讀)
→ collectFragments → shouldFormDream → pickHypothesis
→ pickFragments → composeSeed
→ ~/.dsh-fish-dream/dreams.jsonl (status=pending)
→ system prompt 提示「有一夜你做了一個夢」
→ 她調 dream_recall 取種子 → dream_record 落庫
默認每 tickMinutes(15 分鐘)檢查一次。沉默越久,單次檢查觸發夢的概率越高(例如少於 2 小時爲 0%,2~4 小時 5%,超過 48 小時 90%)。詳細概率表見倉庫 README。
記憶碎片從 utterance、heard、voice、revise、refusal、narration、reunion、answer 等類型中篩選,並排除 seed、meta、dream、diary、ask。插件內置六個可配置權重的假說(記憶鞏固、威脅模擬、情緒調節、連續性、預測加工、社會模擬),每次按權重隨機選一個,再挑 2~5 條碎片組成種子(場景、人、感覺、荒誕規則、三段走向、最後一幀等)。假說名稱與文獻依據只寫在 dreams.jsonl,不進入她讀到的種子正文。
核心功能¶
- 沉默驅動:按距最後一次對話的時長查表擲骰,不綁定固定夜窗。
- 六個理論隨機取材:同一段日子,不同次夢的拼法可能不同。
- 可追溯:夢材指向真實事件 id,不寫回 fish 事件流。
- 她寫夢,插件只給結構:零額外模型調用成本(由插件側完成的部分)。
- 只讀 fish 記憶:
~/.dsh-fish只讀;插件數據在~/.dsh-fish-dream。 - 三個工具:
dream_recall、dream_record、dream_now(後兩者需在 dsh-fish 工具白名單中放行)。 - 失敗安靜:註冊或寫盤失敗只記日誌,不影響她正常說話。
| 工具 | 作用 |
|---|---|
dream_recall |
有 pending 夢則返回種子與寫法提示;否則返回最近記下的夢(limit 1–20,默認 3) |
dream_record |
把夢文記入 records.jsonl 與 dreams/YYYY-MM-DD.md(text 必填,refs 1–6 個碎片 id) |
dream_now |
跳過沉默表與擲骰,立刻拼一場(調試用,可選指定 hypothesis) |
安裝與啓用¶
前提:已安裝並運行 dsh-fish,且本機 Node ≥ 20。
從 npm 安裝(推薦)¶
包名 dsh-fish-dream,發佈在 npmjs.com/package/dsh-fish-dream。
pnpm add dsh-fish-dream --dir ~/.dsh/profiles/desktop
把 "dsh-fish-dream" 加入 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles,然後重啓 DSH(刷新頁面不夠,插件在進程啓動時加載)。README 說明預構建安裝不需要 allowBuilds 構建授權。
放行工具¶
編輯 ~/.dsh-fish/config.json,在 tools.allow 中加入 "dream_recall" 與 "dream_record"。dsh-fish 用白名單收窄她的工具面,未列入的工具她無法調用。
裝好後可在瀏覽器控制台查看會話,或讓她說一句「做個夢試試」做粗測。若需從源碼以 link: 方式安裝,步驟與 pnpm 注意事項見 GitHub README「從源碼裝」一節;用戶規則下本文不展開 git clone 命令。
package.json 中聲明的 DSH 兼容範圍爲 >=0.2.0-rc.1 <0.3.0-0。
配置¶
首次運行會在 ~/.dsh-fish-dream/config.json 寫入默認值,字段均可選。示例(與 README 一致):
{
"auto": true,
"dreamTable": [[2, 0], [4, 0.05], [6, 0.15], [8, 0.3], [12, 0.5], [18, 0.65], [24, 0.75], [48, 0.85], ["inf", 0.9]],
"minFragments": 3,
"maxChars": 400,
"pendingHours": 36,
"staleDays": 5,
"tickMinutes": 15,
"lucidity": 0.03,
"prompt": true,
"promptOrder": 8550,
"weights": { "threat_simulation": 0.2 }
}
常用項:auto 關閉則不再自動做夢(仍可用 dream_now);dreamTable 控制沉默小時數到單次檢查概率的映射;minFragments 碎片不足則不做夢;pendingHours 控制未寫完種子的作廢時間;prompt 控制是否在 system prompt 掛上「有一夜你做了一個夢」提示(僅 cwd 在 ~/.dsh-fish 下的會話,用戶側對話歷史不可見)。
典型用法¶
- 保持 dsh-fish 事件流正常積累,並讓她在足夠長的沉默後由插件生成 pending 種子。
- 她在自己的 fish 會話里根據 system 提示,調用
dream_recall讀取種子與寫法要求(第一人稱、現在時,約 150–400 字,需帶refs)。 - 寫完後調用
dream_record落庫;回執僅爲[記下了],避免把工具回執當成繼續閒聊的內容。 - 調試時可調用
dream_now立即拼一場,必要時在config.json的weights裏調整各假說權重。
適用場景與注意¶
適合:已在用 dsh-fish、希望給桌寵增加「沉默後.memory 重拼 + 自述成夢」體驗,且希望插件側邏輯可測、可復現的開發者。
注意:
- 插件以當前 DSH 進程權限運行,安裝前建議閱讀 倉庫源碼 與 MIT 許可證。
- 夢是敘事重拼,不是心理治療或診斷工具;六個理論在插件裏是取材策略,不是科學結論。
- 社區目錄 SkillHub 上的 dsh-fish-dream 頁 與 GitHub 爲獨立信息來源,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-fish-dream 把「安靜夠久之後,從真實事件流裏按規則拼夢的種子,再由她自己寫完」收攏成一個小而完整的 DSH 插件:只讀 fish、數據落在 ~/.dsh-fish-dream、不調用模型拼種子。進一步瞭解可看 SkillHub 目錄頁 與 GitHub 倉庫。