SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Recall:讓 Claude Code 在 VPS 保留記憶

Recall 是完全本機運作的 Claude Code 外掛,會記錄每次工作階段並濃縮成可續接摘要。本文示範在 VPS 安裝,並實測可節省多少 token。

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

Claude Code 記憶功能中的 Recall

Recall 是 Claude Code 外掛程式,可讓每個專案在不同工作階段之間保留記憶。它會在專案中的 .recall/ 資料夾內寫入 2 個 Markdown 檔案:一份記錄已發生事件的僅能附加日誌,以及一份簡短的目前進度摘要。這 2 個檔案都由本機 Python 摘要工具在你的工作電腦上產生,因此記憶本身不會耗用任何 API token。

它解決的是一個小而持續存在的問題。你在星期二於 VPS 上結束工作階段。星期三重新開啟工作階段時,系統不會自動載入星期二的對話,但 Claude Code 內建的自動記憶功能可以在不同工作階段之間保留備註。如果這些備註沒有涵蓋你上次停止的位置,你就必須手動重新說明專案,或讓模型再次讀取半個 repository 來推斷目前狀態。這 2 種方式都會耗用 token,後者的耗用量尤其大。

Recall 版本 0.4.0 於 18 July 2026 發布。截至 October 2026,這仍是最新版本,且專案採用 MIT 授權。它是外掛程式。其中沒有任何功能會發出網路請求。

VPS 所需項目

Recall 的擷取掛鉤是隨外掛一同提供的 Python 指令碼。不需要第三方相依套件,因此唯一真正的需求是直譯器。

python3 -V

Ubuntu 24.04 可回答 Python 3.12.3。Recall 支援 Python 3.9 以上版本。精簡容器映像有時完全不含直譯器,此時 shell 會回答 python3: command not found。繼續操作前,請先安裝直譯器。

sudo apt update && sudo apt install -y python3

NumPy 是摘要器其中一個步驟的選用加速器。不需要安裝。

python3 -c "import numpy"

ModuleNotFoundError: No module named 'numpy' 在這裡是可接受的答案。摘要器提供純 Python 路徑,專案的測試套件也會確認兩條路徑選出的句子相同。

在伺服器上,工作階段記憶體比在筆記型電腦上更重要,因為伺服器工作通常會分散在數天內,以短時間連線的形式進行。如果你已在 VPS 的 tmux 中執行 Claude Code,Recall 就是把昨天的工作階段延續到今天的元件。

從外掛市集安裝 Recall

在 Claude Code 工作階段中輸入以下 2 個命令:

/plugin marketplace add raiyanyahya/recall
/plugin install recall@recall

第 2 個命令會讀取 plugin@marketplace。這兩個名稱在此都顯示為 recall,看起來像是複製貼上錯誤,但實際上並不是。

執行外掛本身的命令,確認安裝是否成功:

/recall:show

/recall:show 會顯示目前的摘要。全新的專案尚無資料可供顯示,因此實際要確認的是該命令是否存在。如果 Claude Code 無法辨識 /recall:show,表示外掛尚未載入,也不會觸發任何 hook。

若要改用 checkout 執行,請先複製儲存庫並進行驗證:

git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .

claude plugin validate . 會讀取 .claude-plugin/ 中的 manifest,並回報外掛格式是否正確。接著在專案目錄中使用 claude --plugin-dir ~/recall 啟動 Claude Code。

Hook 寫入的內容與執行時機

Recall 會註冊 3 個 Claude Code hook。每個 hook 都會從 plugin 目錄執行 Python script。

  • SessionStart 會在啟動、恢復及清除時觸發。它會顯示 context.md,讓工作階段開啟時即可看到摘要。
  • Stop 會在 Claude 完成每次回應時觸發。它會將該回合附加至日誌。
  • SessionEnd 會在工作階段關閉時觸發,並可重新產生摘要。

這會產生 2 個檔案,兩者都位於 .recall/ 內。

  • history.md 是僅可附加的記錄:提示、回應、處理過的檔案及執行的命令。
  • context.md 是產生的摘要:目標、摘要、後續步驟、處理過的檔案、執行的命令及 git context。

完成一次實際工作階段後,查看該目錄。

ls -la .recall/

啟用擷取功能、沒有 pause marker 且 transcript 可用時,應會看到 history.md 內有內容。你可能完全看不到 context.md,這是預設行為,不是錯誤。除非你設定 auto_save_context,否則它是 off,因此只有在你要求時才會寫入摘要:

/recall:save

該命令會對 history.md 執行本機摘要工具,並重新寫入 context.md。演算法會先以 TF-IDF(term frequency, inverse document frequency)評分,再使用 TextRank 進行句子排序。這個流程具備決定性,且採用擷取式摘要,也就是選取日誌中原本已存在的句子。不會呼叫 model,因此此步驟不需付費,也能在機器離線時運作。

設定單一專案的 Recall

設定位於專案根目錄的 recall.config.json 檔案中。以下是軟體隨附的預設值:

{
  "output_dir": ".recall",
  "capture_history": true,
  "summary_sentences": 8,
  "redact": true,
  "include_git": true,
  "max_input_chars": 200000
}
  • output_dir 設定兩個檔案的存放位置。請將其保留在專案內。
  • capture_history 控制是否啟用 history.md 日誌。
  • auto_save_context 接受 off 或 on_end,預設值為 off。
  • summary_sentences 設定保留到 context.md 的句子數量。提高此值會產生較長的摘要,也會稍微增加工作階段啟動時的負載。
  • redact 會在任何內容寫入磁碟前,移除常見的 secret 模式。
  • include_git 會將目前的 diff 統計與最近的提交加入摘要。
  • max_input_chars 限制摘要器單次讀取的 history.md 數量。

對於 VPS 上的專案,實用的變更是啟用自動儲存。因為在伺服器上,工作階段通常會在終端機中斷時結束,而不是在你決定停止時結束。

{
  "auto_save_context": "on_end",
  "summary_sentences": 12
}

若要暫停擷取一段時間而不修改設定,請建立 pause marker。刪除該 marker 即可重新開始擷取。

touch .recall/.capture-paused

在處理 production credentials 的工作階段前,請先執行此操作,因為 redaction 是篩選器,不是保證。同樣的原則也適用於一般情況下 避免讓 secrets 暴露給 AI agents:安全的 secret 是 agent 從未看見的 secret。

Recall 可節省多少 token?

這取決於原本採用的替代方式。在工作階段開始時載入摘要,成本很低。但它取代的工作可能成本很高,因為不具備專案記憶的模型,必須重新讀取檔案來了解專案。

圖表Typical cost of resuming work, per session
此圖表背後的資料
[
  {
    "label": "Recall context.md",
    "char_count": "4,800",
    "est_tokens": "1,200"
  },
  {
    "label": "Hand-written CLAUDE.md",
    "char_count": "3,200",
    "est_tokens": "800"
  },
  {
    "label": "Re-reading the repo",
    "char_count": "120,000",
    "est_tokens": "30,000"
  },
  {
    "label": "Full transcript replay",
    "char_count": "340,000",
    "est_tokens": "85,000"
  }
]

以下是中型專案的典型數據,不是針對你的專案測量所得。載入 Recall 摘要約需 1,200 個 token,與專案公開宣稱的 resume 需要 1,000 到 2,000 個 token 相符。重播完整的先前 transcript 會重新載入整段對話,約為 85,000 個 token。讓模型透過讀取檔案重新了解專案,所需數量介於兩者之間,約為 30,000 個 token,而且會隨 repository 增大。CLAUDE.md 列是用來提供尺度參考:它較短且內容固定,因此成本較低;它告訴模型的是固定規則,而不是昨晚發生的事情。

請測量你自己的數據。英文散文的 1 個 token 約相當於 4 個字元,程式碼則略少。如果你也在同一台 VPS 上將摘要提供給本機模型,請先確認摘要進入的 context window,再依據 resume 判斷,因為 Ollama 的預設 context length 取決於可用的 VRAM。

wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))

在工作階段內,/context 會顯示目前載入 context window 的內容,/cost 則會回報工作階段的總量。先冷啟動一個工作階段,再在已有摘要的情況下啟動下一個,然後比較兩者。若要完整了解工作階段的 token 實際耗用位置,Claude Code 如何使用 token 提供了詳細拆解。

有一項限制可讓這項說法保持準確。摘要會在每次工作階段開始時載入,因此從未實際使用的摘要只是小幅額外成本,而不是節省。除非你的工作階段執行時間很長,否則請將 summary_sentences 維持在預設值附近。較安靜的工作階段也能減少另一端的成本,因為將 agent 引導至採用能運作的最小變更,會讓摘要工具需要排序的日誌更短。

不使用工作階段重建摘要

如果您已複製此儲存庫,摘要工具有自己的命令列入口點。當 VPS 上的工作階段隨終端機中斷,而您仍需要摘要時,這項功能很實用。

python3 ~/recall/scripts/make_context.py --help

說明輸出會列出可用的旗標:--cwd 指定專案根目錄,--transcript 指定明確的逐字稿檔案,--quiet 停止輸出,--harness 在 claude 與 opencode 之間選擇。將它指向專案:

python3 ~/recall/scripts/make_context.py --cwd /srv/projects/api

它會讀取工作階段逐字稿並執行 history.md,然後將 context.md 寫入您指定的目錄。如果您是透過 marketplace 安裝,外掛程式會位於由 Claude Code 管理的目錄中,而 /recall:save 是執行相同工作的支援方式。

為何沒有寫入任何內容

完整工作階段結束後沒有 .recall/ 目錄。 先確認擷取功能是否已停用、輸出目錄是否改設在其他位置,或是否找不到任何逐字記錄,再判定 hooks 從未執行。輸入 /recall:show 確認外掛程式已載入,接著執行 python3 -V。hook 指令會先嘗試 python3,再嘗試 python;因此,兩者皆不存在的主機會輸出 stderr,並以結束狀態 127 失敗。Claude Code 會顯示非阻斷式的 hook 錯誤通知,其中包含 stderr 的第一行。

history.md 持續增加,但 context.md 從未變更。 auto_save_context 預設為 off。執行 /recall:save,或將該鍵設為 on_end,交由 SessionEnd hook 執行。

檔案出現在錯誤的專案下。 Recall 會以 Claude Code 啟動時所在的目錄作為相對路徑基準,因此從家目錄啟動工作階段時,記憶檔案會寫入家目錄。請從專案根目錄啟動,並使用 ls -la .recall/ 找出檔案實際寫入的位置。

擷取已停止,但沒有任何警告。 使用 ls -a .recall/ 檢查是否存在暫停標記。上週建立的 .capture-paused 檔案仍會繼續運作。

長時間工作階段結束後,摘要內容很少。 max_input_chars 會將摘要器輸入限制為 200000 個字元,因此過長的日誌會被截斷。請輪替該日誌。

mv .recall/history.md .recall/history-2026-07-30.md

之後執行一個簡短的工作階段,再次檢查 ls -la .recall/,確認已產生新的 history.md。

Recall 的適用範圍

Recall 是日誌加摘要工具,因此有些內容不在它的處理範圍內,這點值得先說明。

摘要器採用擷取式摘要。TextRank 會挑選已存在於 history.md 的句子,因此不會判斷某項決策是否正確。星期二記錄的錯誤方向,到了星期三看起來會和正確決策完全一樣。涉及實際風險時,請閱讀 context.md 並手動修正。它是 markdown 檔案,編輯時不受任何限制。

它沒有搜尋功能。每個專案只有一份目前摘要和一份持續成長的日誌,無法在多個專案之間查詢記憶。如果你想知道 3 週前對資料庫做了什麼決定,就必須對 history.md 執行 grep。它也不提供即時協調功能:同一專案中的 2 個工作階段會共用日誌檔案,但 Recall 不會將新的日誌項目推送到另一個工作階段的內容中。因此,當其中一個工作階段需要知道另一個正在做什麼時,工作階段可以在執行期間直接互相傳遞文字。

它無法協助處理單一工作階段內的問題。工作階段進行到一半時內容視窗填滿,是另一種問題,也需要不同的處理方式;管理單一工作階段內的內容視窗 是本指南的配套文章。

摘要在設計上會被視為不受信任的輸入。context.md 會以 fenced block 形式注入並加上標籤,Claude 在採用之前會先詢問。這項設計是必要的,因為已提交的 .recall/ 目錄中,任何具備 commit 權限的人都能寫入代理程式會讀取的文字。代理程式對讀取內容停下來詢問的頻率,取決於工作階段啟動時使用的權限模式。使用 Claude Code v2.1.283 或更新版本時,auto mode 已是所有方案與 provider 的互動式終端機和 VS Code 工作階段內建的啟動模式,因此大多數動作會由分類器而非你來審查;採用 HIPAA 設定的組織仍會以 Manual mode 啟動。請先決定 .recall/ 是個人使用還是共用:個人記憶應將它加入 .gitignore;若要共用,則提交該檔案,並像審查其他貢獻一樣進行審查。如果代理程式會在無人值守的情況下執行,在 VPS 上安全執行 Claude Code 涵蓋更廣泛的安全邊界。

遮蔽功能僅能盡力處理。它會針對 API keys、tokens、PEM blocks 和 .env assignments 等常見模式。提交前請閱讀 .recall/。

版本號如實反映其成熟度。在 0.4.0 版本中,截至 2026 年 10 月仍是最新 release,設定 keys 和檔案配置仍可能在不同 release 之間變更,因此升級所依賴的設定前,請先閱讀 changelog。

FAQ

Recall 會將我的程式碼或轉錄內容傳送到其他地方嗎?

不會。擷取 hook 與摘要程式都是在您自己的電腦上執行的 Python script,plugin 不含 API key,也不會發出網路連線。摘要使用 TF-IDF 與 TextRank,而不是模型,因此不產生成本,也能在離線狀態下運作。取捨是摘要採用抽取式方式:它會從 log 中選取句子,而不是重新撰寫內容。

為什麼我的 .recall/context.md 遺失或內容過時?

auto_save_context 預設為 off,因此只有在執行 /recall:save 時才會重新產生摘要。將 "auto_save_context": "on_end" 設定在 recall.config.json 中,即可在每次工作階段結束時重新寫入摘要。如果 history.md 也遺失,請檢查 capture_history、.capture-paused 標記,以及是否有工作階段轉錄內容可用:在這些情況下,執行中的 hook 會略過歷程記錄寫入。使用 /recall:show 確認 plugin 已載入,接著確認該主機上的 python3 -V 能正常回應,因為這些 hook 是 Python script。

Recall 每個工作階段可節省多少內容?

載入摘要約需 1,200 個 token;相較之下,若模型必須重新讀取您的 repository 來判斷目前進度,通常需要 30,000 個 token。這些都是一般估算值。請在工作階段中使用 wc -c .recall/context.md 與 /context command,將冷啟動與從摘要恢復的工作階段進行比較,以測量您自己的數值。

我仍然需要 CLAUDE.md 檔案嗎?

需要,而且兩者用途不同。CLAUDE.md 是您刻意撰寫的內容:固定規則與建置 command。context.md 則根據上次工作階段實際發生的內容產生,因此會記錄您不會特別寫下的未完成 migration。兩者都應保留。

一台 VPS 可以保存多個專案的記憶嗎?

可以。Recall 會將記憶保存在每個專案目錄中的 .recall/,因此同一台伺服器上的兩個專案會各自保有獨立的 log 與摘要。每次都應從專案根目錄啟動 Claude Code,因為這些檔案會依循工作目錄,而不是使用者帳號。

這篇文章對您有幫助嗎?