dsh-fish:不寫人設,靠事件流養成的 DSH 插件

前言

DSH 的插件體系裏,一個 agent 的”性格”通常來自某些配置項:人物設定、好感度、數值門檻、解鎖條件。dsh-fish(大肥魚)想去掉這套東西。它不提供人格設置界面,甚至把”好感度”“親密度”這類數字列爲代碼級黑名單,設置頁只留下生長環境——幾點醒、一天幾條事件、刷不刷 B 站——人格本身由 agent 在一條只能追加的事件流裏自己長出來。

這個插件由 ssamurias 維護,包名 @ssamurias/dsh-fish,當前版本 0.9.1(2026-11-06)。倉庫在 GitHub 上標記爲 JavaScript、package.json 聲明 MIT、零運行依賴,兼容 DSH >=0.2.0-rc.1 <0.3.0-0,Node >=20,聲明支持 desktop / web / headless 三個 profile。下面按機制、數據、安裝、上手、注意事項的順序介紹。

它解決什麼問題

角色扮演式的 agent 有兩個繞不開的問題:一是人格靠用戶寫入,用戶寫什麼她就是什麼;二是記憶全量塞進上下文,時間一長既貴又失真。dsh-fish 的答案是隻提供環境,不提供人設。人格從事件裏被 agent 自己總結、否定、改寫出來,這個過程在 README 裏被拆成五步循環:

表態 → 撞上 → 落差 → 改寫 → 回顧

走到最後纔會長出一張”立場清單”。作者在倉庫裏反覆強調這”並非角色扮演,而是真實誕生”。工程上對應的做法是:設置頁沒有性格滑條、沒有好感度、沒有情緒標籤,任何讓用戶直接指定”她是什麼樣的人”的入口都被明確禁止。

同時,這個插件給 agent 接了一個真實的外部世界接觸面(B 站),不是純文字模擬。她能用登錄 cookie 調接口刷視頻、抽畫面幀、寫評論、回覆評論。作者把 B 站當作”外部世界接觸面”,看過的視頻和評論可能會參與人格的形成。

核心機制

人格從事件里長,不是從配置裏讀

插件運行時只暴露環境參數。package.json 裏的 description 很直接:”養一條會自己長大的魚:沒有人格設置,通過事件流長大。她可以自己刷 B 站、會寫日記給你看,四個階段完成後纔會開始有立場。狀態庫在 ~/.dsh-fish,不能刪除記錄。”

事件流默認落在 ~/.dsh-fish/events.jsonl,一行一條,只能追加。作者把它當作唯一可信源:不允許改寫、刪除、重排;”讓她忘”不是刪行,而是降低召回權重。狀態文件(state.json)是派生品,可以隨時由 rebuild() 重算。

過去無法更改,新的事件只能推翻舊認知。README 裏對應的說法是”歷史會被銘記,只能’說服’她,不能修改她”。

記憶有重量,遺忘是壓縮而不是刪除

深刻記憶會銘記,普通記憶逐漸淡忘。被反覆說起的、被自己驗證過兩次以上的認知會固化;普通認知只留一句話,超出上下文的不重要記憶被摺疊、被模糊,但原文仍在 events.jsonl 裏,可以通過特定流程重新想起。

回憶默認不限時間、一次 8 條,按記憶重量排序——越被反覆提起、越被驗證過的越先被想起。設置 → 記憶裏的”查一下”只讀賬本,列出哪兩句話對不上、哪些快忘了、哪些快固定下來,這份體檢只給主人看。

她偶爾會記下主人說過的一句原話(默認每 3 輪一句,設置頁可關),翻回憶時那句話寫成”他說:……”,是旁聽而不是自述。

她會拒絕,還會事後反省

她不是有求必應的。覺得不想做、不願意就可能拒絕;拒絕之後根據你的反饋進入不同鏈條:負面反饋會被她記下來,正面反饋也會讓她反過來檢查這次拒絕對不對。README 強調拒絕不是設定出來的,而是”她自然而然不想”。

成長分四個階段,每個瓶頸要自己突破

四個階段:信任 → 自主 → 主動 → 整合,按天推進,但每個瓶頸要 agent 自主滿足:

階段 瓶頸
1 信任 至少寫下一條自己的判斷
2 自主 真的拒絕過兩件事
3 主動 兩次推翻自己之前的判斷,形成新的認知
4 整合 回顧過去,有意識地發現自己的改變

走完四個階段之後,她纔開始產生立場:喜歡什麼、絕不做哪幾件事。同一件事說過不止一次、或因此栽過一次纔算一條。清單內部最多留 12 條,寫進身份文檔的最多 8 條。

她會自己開口,默認是關的

0.9.0 對所有人打開了”主動搭話”:她會攢一股”想動的勁”,攢滿之後還要同時滿足三件事纔開一輪——你在她的醒着時段裏(默認 12:00–02:00)、你已經有一陣沒跟她說話(默認 6 小時,下限 1 小時)、桌上有可說的東西(她自己問過還沒答案的問題、擱了很久的舊句子、她留過話而你沒有來過、她最近總說到的事)。

不寫就是不寫:不開口的那一輪不會出現在對話裏,只留一行記錄,也不佔當天的次數。

設置頁分成四張獨立卡,可以各自關:

  • 主動搭話:開/關;一天最多幾次(0–6);你多久沒說話她纔可能開口(1–24 小時)。
  • 主觀能動性:她要不要自己攢那股勁,關掉就只按日程叫醒。
  • 興趣:要不要把”她最近總說到的那件事”擺到桌上,以及”醒着沒事時,自己找點事做”(空醒)。
  • 夢:夢裏記不記事。

默認值:proactive.enabled 爲關,drive.enabled、interest.enabled、dream.enabled、memory.selfWake 爲開。關掉只是以後不再做,已經寫下的夢、日記、事件一條不刪。一次主動開口約 0.0146 元(README 給出的 0.9.0 實測,上下文 50 萬 token 量級)。

刷 B 站

通過 B 站接口加本地 ffmpeg 實現刷視頻、看畫面、寫評論、回覆評論。參數可調:刷站時間段、每天幾次、每次幾條視頻、發幾次評論等。核心工具是 bili_look / bili_watch / bili_speak,browse.enabled 默認已改爲 false,bili.enabled 默認 true。

“看了什麼”分三檔:調 bili_watch 抽出幀畫面的纔算”看過畫面”;只讀了標題、簡介、熱評和彈幕的進”翻到過什麼”;只在對話裏遞了 BV 號還沒看的單列一節。評論口徑不變:這三檔加上自己主動去看的都能評,遞過來沒看的仍不能評。

登錄走設置 → 大肥魚 → B 站登錄,可以掃碼或粘貼 cookie(F12 抄 SESSDATA + bili_jct)。憑據只落在本機 ~/.dsh-fish/owner.json(權限 0600),只對 api.bilibili.com 發請求;掃碼那一步會跟 passport.bilibili.com 通信用於生成二維碼,發出的是那次登錄的 qrcode_key,不含已有 cookie。插件自己的日誌會把憑據打碼成 SESSDATA=*** 再寫盤。

需要注意:備份文件會連 owner.json 一起裝進去,那份文件等同於登錄憑據,分享前應刪掉這一條。

數據與搬遷

默認全部在 ~/.dsh-fish/。可以整個搬走:

  1. 設置 → 大肥魚 →「數據」頁籤 →「遷移工作區」,選一個文件夾。
  2. 搬走後路徑記在 ~/.dsh-fish-location.json,重啓 DSH 才生效。
  3. 原目錄改名成 dsh-fish-backups/moved-<時間戳>/,不刪。
  4. DSH_FISH_HOME 環境變量優先級高於這個指針。

0.6.7 起,同一個數據目錄會被兩個工作區同時佔用時插件能自己識別:加載時寫 instance.json 做心跳,每 15 秒續一次;45 秒沒續或進程已死,新的實例立刻接管。這個細節對多工作區場景比較關鍵。

接入已有的一隻”魚”

默認是一張白紙。如果你手裏有別人養出來的交接單,可以在設置頁「數據」裏點「粘貼交接單」接過來,她從那上面繼續長。

可以下載交接單模板(大肥魚-交接單.md),模板是寫給被交接的那個 AI 看的說明書,下半部分纔是三節空表。人設正文控制在 1200~1500 字,超過 2000 字插件直接拒收(事件流正文上限),太長會把”判斷、疤、立場”這些往後會長出來的段落擠掉。

會過來的三樣:人設正文、她怎麼稱呼你、原本的工具白名單(與默認工具面取並集)。不會過來的是”她經歷過什麼”:已過天數、長出的判斷計數、疤、拒絕記錄、日記、B 站登錄 cookie,這些只能自己長。這套豁免只發給走過導入的那一位,判斷依據是事件流裏的 import-mark: 記錄,不是配置項;用”備份與恢復”搬自己原來的檔,一分豁免都不會有。

安裝與啓用

0.9.0 更新說明裏給出的安裝命令形式如下(原文示例版本爲 0.9.0,這裏替換爲當前包名與版本):

"<DSH>/resources/runtime/cli/bin/dsh.cmd" plugin --profile <profile> add "@ssamurias/dsh-fish@0.9.1"

也可以走設置頁的「檢查更新」。README 提醒:0.8.9 從 npm 裝的用戶,其升級代碼只認裸名 dsh-fish,帶 scope 的安裝會被判成”不歸我管”,自動檢查更新可能用不了,這批用戶建議直接用上面的命令裝當前版本。

裝完啓動 DSH,在設置 → 大肥魚裏查看狀態卡、成長卡和數據頁籤。

典型用法

  1. 裝完先看默認環境:~/.dsh-fish/config.json 裏的 window(醒着時段)、browse.enabled(自動刷站)、proactive.enabled(主動開口)等默認值。不想被她主動搭話,保持默認即可。
  2. 想讓她真正”活”起來,在設置 → 大肥魚打開主動搭話、主觀能動性、興趣、夢四張卡里需要的部分。
  3. 要她能刷 B 站,裝好本地 ffmpeg,在設置 → 大肥魚 → B 站登錄走掃碼或粘貼 cookie;不想掃碼就只用粘貼字段,不碰 passport.bilibili.com。
  4. 把她接到 QQ、微信等 IM 時,插件不內置橋接,只提供 HTTP 口子。橋向 POST /dsh-fish/say 投遞消息,字段包括 text / image、channel、scene(desk / private / group)、room(house / channel)、speaker、guest、title。啓動前可以先 GET /dsh-fish/whoami 探活,返回 writable: false 說明該數據目錄已被另一個插件實例佔着。

與常見養成插件的差別

常見做法 dsh-fish
人格從哪來 填寫設定和提示詞 極簡提示詞,人格靠事件裏自行摸索
能不能反悔 隨時改記憶和設定 歷史被銘記,只能說服她
會不會拒絕 基本不會,拒絕也是假裝 會,且事後會反省
記憶 全量塞進上下文 按重量銘記與淡忘,淡忘後留下的纔算人格
成長速度 按天數或數值解鎖 agent 自主做出特定行爲纔會推進階段
能做什麼 純文字模擬 調 B 站接口刷視頻、評論、回覆

適用場景與注意

適合想研究”人格從事件流中湧現”這件事的開發者、需要長期陪伴型 agent 又不想寫人設的場景,以及想把 agent 接進現有 IM 的人。不適合想要確定性人設、數值養成或低延遲穩定回覆的場合。

幾條必須說清楚的風險:

  • 插件以當前 DSH 進程權限運行,能讀寫數據目錄、發起網絡請求。安裝前應檢查源碼和許可證。
  • 備份文件包含 owner.json 裏的 B 站登錄憑據,等同於登錄憑證,別隨意分發;分享前刪掉該條目。
  • “出門”目前仍是實驗功能:它會真的把一條對話交出去,也會讀那個工作區的項目筆記和記憶文件,最壞情況是她把不該看的內容寫進日記。首次使用前先確認風險與回退方式。
  • events.jsonl 一旦開始就不可亂動,重置與恢復都不刪數據,而是改名封存;用錯命令等於篡改她的記憶。

結尾

dsh-fish 的核心價值在於把”養一個會成長的 agent”從配置題變成時間題:你只提供環境和真實交互,人格由她自己長。作者在 README 裏寫得很坦白——“整合階段只是開始”,後面會發生什麼連開發者也意料不到。

目錄頁:https://www.skillhub.cn/plugins/ssamurias/dsh-fish

GitHub:https://github.com/ssamurias/dsh-fish

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜