jsc-mod-companion
指令
/jsc-mod-companion:info
預設是短版:名字與主情緒、關係階段(好感)、前 3 強情緒、適應度、待辦數。
--all 顯示完整數值:時間感與天氣、8 維度情緒(心情、精力、害羞、忌妒、想念、心跳、想家、不悅,12 格 ▰▱ 量表依維度上色)、關係四維度(好感、信賴、親密、依賴)長條、人格 18 參數(基準、存檔偏移、今日偏移與有效值)、世界(適應度、想家)與角色基本資訊。
輸入框上方的狀態列顯示最強的兩種情緒(不含精力)與關係階段;寬度不夠時依序捨棄氣泡、待辦、情緒條、階段。
/jsc-mod-companion:info
/jsc-mod-companion:info --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 會帶上目前時段、離上次互動多久;
/jsc-mod-companion:info顯示同樣資訊。 - 主動發話沿用
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),適應度越高越不想家;
/jsc-mod-companion:info顯示適應度與描述。 - 舊存檔沒有適應度時,從升級當天起算 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 指向同一支腳本即可。