Files
jsc-marketplace/plugins/jsc-mod-companion/README.md
T
adminandClaude Sonnet 5.5 7e6e323473 feat: companion 作息、主動發話、適應度與外部素材
- 作息與疲勞、想念累積與時間感,主動發話沿用 care.ts 的冷卻、日限、靜音
- 想家與適應度(9.13)
- 獨立腳本 fetch-materials.mjs 由系統排程寫入快取,hook 只讀、不連網
- 新增 /jsc-mod-companion:materials 與 setup location=、feeds=
- 天氣微調心情基準,新聞依適應度每天最多 2 則並寫入情節記憶
- 版本 0.0.5

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 09:29:46 +00:00

11 KiB
Raw Blame History

jsc-mod-companion

指令

/jsc-mod-companion:status

查看目前角色、心情、關係階段與四維度(好感、信賴、親密、依賴)與待辦數量。

查看目前角色、心情、好感與待辦數量。情緒有 8 個維度(心情、精力、害羞、忌妒、想念、心跳、想家、不悅),預設列出前 3 強,--all 顯示完整數值(▰▱ 量表依維度上色);band 上的情緒名稱為目前最強的主情緒。

/jsc-mod-companion:status
/jsc-mod-companion:status --all

/jsc-mod-companion:switch <角色>

切換角色;不給角色會列出可用角色。

/jsc-mod-companion:switch 小明

/jsc-mod-companion:disable

關閉陪伴,所有資料保留。

/jsc-mod-companion:disable

/jsc-mod-companion:setup [key=value…]

不給參數時顯示目前設定;給 key=value 則儲存。可設定:nickname、wake=HH:MM、sleep=HH:MM、tz=+0800、careLimit=N(每日主動關心上限)、quietStart=HH:MM、quietEnd=HH:MM、location=緯度,經度或地名(啟用外部素材)、feeds=網址,網址…(自設 RSS,預設空清單)。

/jsc-mod-companion:setup nickname=阿明 wake=07:30 sleep=23:30 tz=+0800 careLimit=3 quietStart=22:00 quietEnd=08:00

/jsc-mod-companion:todo [list]

列出未完成的待辦。

/jsc-mod-companion:todo

/jsc-mod-companion:todo add <內容> [due=YYYY-MM-DDTHH:MM]

新增待辦,可指定到期時間(依 tz 設定換算)。

/jsc-mod-companion:todo add 買牛奶 due=2026-10-15T18:00

/jsc-mod-companion:todo promise <內容> [due=YYYY-MM-DDTHH:MM]

記錄角色答應使用者的事(列表中標示【承諾】),用法同 todo add。

/jsc-mod-companion:todo promise 週末一起討論新章節 due=2026-10-17T10:00

/jsc-mod-companion:todo done <編號>

將待辦標為完成。

/jsc-mod-companion:todo done 1

/jsc-mod-companion:quiet [分鐘]

暫時靜音,不主動關心;預設 60 分鐘,0 取消靜音。

/jsc-mod-companion:quiet 30

/jsc-mod-companion:materials [list]

查看外部素材(天氣、新聞)的快取狀態;list 列出有效新聞的標題與連結。需先 setup location= 才啟用。

/jsc-mod-companion:materials
/jsc-mod-companion:materials list

/jsc-mod-companion:ingest

解析單章小說(txt/md),逐一詢問合併、新建或略過後寫入角色資料;提供章節檔或要求建立角色時也會自動使用。

/jsc-mod-companion:ingest chapter1.md 章節編號 1

關係與階段

關係有好感、信賴、親密、依賴四個維度(0–100),各有「原典基準」(朋友線為 0)與「存檔累積」兩本帳,有效值為兩者相加。階段為 陌生、熟人、朋友、好友,只升不降:

階段 條件
熟人 好感 ≥ 15
朋友 好感 ≥ 30、信賴 ≥ 25
好友 好感 ≥ 50、信賴 ≥ 45、親密 ≥ 30
  • 每日增量有日限(好感 4,信賴、親密、依賴依角色 relationTraits 的心防、害羞、撒嬌、依賴傾向調整);有效增量 = 原始增量 × (1 − 今日累計 / 日限) × (1 − 目前值 / 100)。
  • 被罵時好感 −3,信賴依期望違反公式扣除(越親密扣越多,單次上限 −30)。
  • 14 天無互動後,每個維度每天 −0.5;階段不會降低。
  • 舊版單一好感值(affinity)的存檔在讀檔時自動升級:好感值保留,其餘維度依比例推估,階段不低於原本。

與第 9 章的差異:不實作曖昧、戀人、穩定戀人與冷戰子狀態;負向事件目前只有「被罵」一種嚴重度(0.4);增量沿用原有的「有意義互動/被罵」判斷,尚未接標籤管線。

人格 18 參數(與第 9 章的差異)

人格參數依 wiki 9.2 實作於 hooks/companion/core/params.ts:

  • 三層值:角色包基準(core.json 的 params)+存檔偏移(每次 ±1,上限 ±15)+今日偏移(N(0,5),上限 ±10),總值限制在 0–100。
  • 衍生值:有效心防、有效害羞、有效口是心非,公式同 9.2;信賴與親密以 0–100 輸入。
  • Big Five 保留為推導值:有 params 時,神經質(心情半衰期)與外向性(關心頻率)改由 18 參數推導,加權為設計啟發式;沒有 params 的舊角色沿用 neuroticism、extraversion。ingest 的 Big Five 推論與證據機制不變。
  • 姓名、性別、年齡、核心信念不可由 AI 改動,filterAiPatch 會剔除這些欄位。
  • 目前只提供計算與儲存欄位(state.json 的 params);每日抽樣、存檔偏移累積的觸發時機留待後續工作項目。

評估標籤

使用者每句話會對應到一個評估標籤,再由 rules.ts 的規則表換成心情增減量;模型只負責分類,不給數值。

  • 正則先判明確的情況(責罵、感謝、完成)。
  • 正則沒判出時,採用模型於回覆末尾補的 <評估:標籤>;標籤須在 tags.ts 的白名單內,缺失或不在白名單就當作沒有標籤。
  • 白名單約 20 個,參考 wiki 第 9.4 章;不含戀愛與親密類標籤。

情緒模型

  • 8 維度各有基準與半衰期(心情 8h、精力 6h、害羞 2h、忌妒 4h、想念 12h、心跳 1h、想家 24h、不悅 4h,神經質 50 時),數值集中在 hooks/companion/emotion.ts。
  • 晝夜節律:精力基準在本地 15 點最高、凌晨 3 點最低(±0.1,依 tz 設定)。
  • 事件的情感注入、疲勞易怒(精力低於 0.3 時負面變化 ×1.5)、正向習慣化(重複 ×0.7ⁿ)、負向敏感化(重複最多 ×2),計次以 6 小時半衰期遺忘。
  • 舊的 PAD 存檔讀檔時自動映射(p→心情、a→精力、d→害羞)並升級,不需重建。
  • 與第 9 章的差異:晝夜節律振幅、習慣化係數等數值為本實作自訂,尚未逐項對照第 9 章。

記憶權重與檢索

記憶依 wiki 9.5 實作於 hooks/companion/memory.ts,數值集中在 rules.ts 的 MEMORY。

  • 權重 W = I_eff × F × A:I_eff = 初始重要度/2 + 情緒峰值/40 + 類別加成(限制在 1–5);F = 0.5^(Δ回合/200),原典記憶固定 1,被檢索到時至少回到 0.8;A 為存取加成。
  • 反覆思量:未解的負向事件(心情增量 p < 0 的標籤)每日權重 +20%,上限 3 倍;apology、soothe 標籤出現時全部標為已解。
  • 衰減與封存:暫時記憶在場景結束(end)或 7 天後封存;可升級記憶 30 天未升級降權一半、90 天未檢索封存,被檢索 3 次升為長期;長期與鎖定記憶不衰減。封存只改 status,任何記憶都不刪除。
  • 危險內容(自傷、違法等關鍵字)不固化:只留一則安全事件摘要,不留原文、不升級、不進反思。
  • 開放迴路:角色回覆末尾的問句記為開放迴路,使用者 2 回合內沒有相關回應就逾時;未收尾的對話與未解負向事件列入每回合必帶(core())。
  • 檢索:關鍵字排名經 RRF(Σ 1/(60+rank))融合後乘上 W,再加心情一致加權 w_m × 相似度(w_m = 0.10 + 0.05 × (1 − 釋懷速度))。recall 的 extra 保留外部檢索器介面,語意相似度不做。
  • 舊存檔缺少的欄位讀檔時自動補上。

與第 9 章的差異:A 的公式(1 + 0.1 × min(命中次數, 5))為本實作自訂,wiki 只寫「被檢索到時 F 至少回到 0.8」;回合序號以使用者回合計;情緒峰值由標籤向量長度換算;原典佔比、相似記憶合併、釘選與使用者模型容量尚未實作。

作息、想念與主動發話

依 wiki 9.11、9.12 實作,數值集中在 rules.ts 的 SCHEDULE、MISSING,邏輯在 schedule.ts、absence.ts;都在讀取時換算,不寫回存檔。

  • 作息與疲勞:依 setup wake= sleep= tz= 位移精力基準——醒超過 12 小時每小時 −0.02(上限 −0.15)、連續工作超過 1 小時每小時 −0.03(上限 −0.15)、在使用者睡眠時段仍在線再 −0.1;剛起床 2 小時內 +0.03。
  • 想念累積:離開超過 2 小時後每小時 +0.03(乘上 0.5 + 想念累積速度參數/100),上限 0.8。離開 6 小時以上再回來,先把累積的想念存下來,再套用「回來」標籤降低;想念 ≥ 0.5 時回來會主動說出口(miss_you)。
  • 時間感:prompt 會帶上目前時段、離上次互動多久;/status 顯示同樣資訊。
  • 主動發話沿用 care.ts 的冷卻、每日上限與靜音,新增三種觸發:miss_you(想念,6 小時冷卻)、homesick(想家 ≥ 0.4,12 小時冷卻)、news(本地新聞,4 小時冷卻);都以情境注入下一次回覆,不另外觸發模型回合。

與第 9 章的差異:不實作週課表、賴床、生病、生理週期、叫醒與助理、離線事件摘要;閒置門檻、打字延遲等表達層規則沿用原本的 care.ts,未改成 9.11 的公式。

適應度與想家

依 wiki 9.13 實作於 adapt.ts:每日 ΔA = k × (1 − A/100),k = 1.5 + 1.5 × (主動度 + 想像力)/2(兩個參數取自 18 參數,沒有就用 50)。本地「第一次」事件(第一次讀到天氣、第一次聊到新聞)各 +2。

  • 想家基準 = 0.25 × (1 − A/100),適應度越高越不想家;/status 顯示適應度與描述。
  • 舊存檔沒有適應度時,從升級當天起算 0。

與第 9 章的差異:成長只依日曆天數,不論當天有沒有互動;不實作「她會不會知道」的判定、運勢與星座血型,也不做 U 形曲線。

外部素材(天氣、新聞)

hook 不連網。素材由系統排程執行獨立腳本,寫入快取檔 ~/.companion/materials.json,hook 只讀。

  • 需要 /jsc-mod-companion:setup location=… 才啟用;沒設定時腳本與 hook 都什麼也不做。
  • 只存標題、摘要、連結與抓取時間。天氣 6 小時、新聞 24 小時過期;檔案缺失、損壞或過期都當作沒查。
  • 天氣用 Open-Meteo(免金鑰),只微調心情基準(晴 +0.04、雨 −0.04、雷雨 −0.06,上限 ±0.06)。新聞來自使用者自設的 RSS/Atom(setup feeds=…,預設空清單)。
  • 新聞依適應度說:< 40 不聊,40–69 每天最多 1 則,≥ 70 每天最多 2 則;同一則不重複;真的說出口才寫入情節記憶(「聊到時事:…」)並計數,時事不進原典。

排程腳本

# 單獨執行(讀 ~/.companion/user.json;可用 COMPANION_ROOT 指定資料夾)
node plugins/jsc-mod-companion/scripts/fetch-materials.mjs

# cron:每 30 分鐘
*/30 * * * * node /path/to/plugins/jsc-mod-companion/scripts/fetch-materials.mjs

# 測試
node --test plugins/jsc-mod-companion/scripts/fetch-materials.test.mjs

某一部分抓取失敗時保留該部分原本的快取,過期後自然當作沒查。systemd timer 也可以,ExecStart 指向同一支腳本即可。