前言¶
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/。可以整個搬走:
- 設置 → 大肥魚 →「數據」頁籤 →「遷移工作區」,選一個文件夾。
- 搬走後路徑記在
~/.dsh-fish-location.json,重啓 DSH 才生效。 - 原目錄改名成
dsh-fish-backups/moved-<時間戳>/,不刪。 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,在設置 → 大肥魚裏查看狀態卡、成長卡和數據頁籤。
典型用法¶
- 裝完先看默認環境:
~/.dsh-fish/config.json裏的window(醒着時段)、browse.enabled(自動刷站)、proactive.enabled(主動開口)等默認值。不想被她主動搭話,保持默認即可。 - 想讓她真正”活”起來,在設置 → 大肥魚打開主動搭話、主觀能動性、興趣、夢四張卡里需要的部分。
- 要她能刷 B 站,裝好本地 ffmpeg,在設置 → 大肥魚 → B 站登錄走掃碼或粘貼 cookie;不想掃碼就只用粘貼字段,不碰
passport.bilibili.com。 - 把她接到 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