Recall:讓 Claude Code 在 VPS 保留記憶
Recall 是完全本機運作的 Claude Code 外掛,會記錄每次工作階段並濃縮成可續接摘要。本文示範在 VPS 安裝,並實測可節省多少 token。
Recall 為 Claude Code 記憶提供的功能
Recall 是 Claude Code 外掛,可讓每個專案跨工作階段保留記憶。它會在專案內的 .recall/ 資料夾寫入 2 個 Markdown 檔案:一個是僅能附加內容的事件記錄,另一個是簡短的目前進度摘要。這 2 個檔案都由本機 Python 摘要工具在目前使用的機器上產生,因此記憶本身不會耗用任何 API token。
它解決的是一個小而持續存在的問題。你在 Tuesday 關閉 VPS 上的工作階段。到了 Wednesday,Claude Code 不知道 Tuesday 發生過什麼。你可以手動重新說明專案,或讓模型再次讀取半個儲存庫來理解狀況。這 2 種方式都會耗用 token,後者的耗用量更高。
截至 July 2026,Recall 的目前版本是 0.4.0,專案採用 MIT 授權。它是外掛,內部不會發出網路要求。
VPS 所需項目
Recall 的擷取掛鉤是隨外掛一同提供的 Python 指令碼。不需要第三方相依套件,因此唯一真正的需求是直譯器。
python3 -VUbuntu 24.04 可回答 Python 3.12.3。Recall 支援 Python 3.9 以上版本。精簡容器映像有時完全不含直譯器,此時 shell 會回答 python3: command not found。繼續操作前,請先安裝直譯器。
sudo apt update && sudo apt install -y python3NumPy 是摘要器其中一個步驟的選用加速器。不需要安裝。
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。
Hooks 寫入的內容與時機
Recall 會註冊 3 個 Claude Code hooks。每個 hook 都會從 plugin 目錄執行 Python 指令碼。
SessionStart會在啟動、恢復及清除時觸發,顯示context.md,讓工作階段開啟時即可看到摘要。Stop會在 Claude 完成每次回應時觸發,將該回合附加到日誌。SessionEnd會在工作階段關閉時觸發,並可重新產生摘要。
這會產生 2 個檔案,兩者都位於 .recall/ 內。
history.md是只能附加內容的記錄檔,包含提示、回應、處理過的檔案及執行過的命令。context.md是產生的摘要,包含目標、摘要、後續步驟、處理過的檔案、執行過的命令及 git context。
完成一次實際工作階段後,查看該目錄。
ls -la .recall/你應該會看到其中有內容的 history.md。你可能完全看不到 context.md,這是預設行為,不代表發生錯誤。除非你設定 auto_save_context,否則它會是 off,因此只有在你要求時才會寫入摘要:
/recall:save此命令會對 history.md 執行本機摘要工具,並重新寫入 context.md。演算法會先使用 TF-IDF(term frequency, inverse document frequency)評分,再以 TextRank 進行句子排序。此流程具決定性且採抽取式摘要,也就是選取日誌中原本已存在的句子。不會呼叫模型,因此此步驟不需額外費用,且可在離線的機器上執行。
設定單一專案的 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會在任何內容寫入磁碟前,移除常見的秘密模式。include_git將目前的差異與近期提交加入摘要。max_input_chars限制摘要程式單次讀取的history.md數量。
對於 VPS 上的專案,實用的變更是啟用自動儲存,因為伺服器上的工作階段通常會在終端機中斷時結束,而不是在你決定停止時結束。
{
"auto_save_context": "on_end",
"summary_sentences": 12
}若要暫停一段時間的擷取而不修改設定,請建立暫停標記檔案。刪除該檔案即可再次開始擷取。
touch .recall/.capture-paused在處理正式環境認證資訊的工作階段前,請先執行此操作,因為遮蔽功能只是篩選器,並非保證。同樣的原則也適用於一般情況下 避免讓 AI 代理程式接觸秘密:最安全的秘密,是代理程式從未看見的秘密。
Recall 可節省多少 token?
這取決於替代方案。工作階段開始時載入摘要的成本很低。但它取代的工作可能成本很高,因為沒有專案記憶的模型必須重新讀取檔案,才能了解專案內容。
The data behind this chart
[
{
"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 需要 1000 到 2000 個 token 相符。重播先前的完整轉錄內容會重新載入整段對話,約為 85,000 個 token。讓模型透過讀取檔案重新了解專案,所需 token 數介於兩者之間,約為 30,000 個 token;而且儲存庫越大,這個數字越高。CLAUDE.md 列可用來比較規模:它較便宜,因為內容簡短且固定,並且告訴模型你一貫的規則,而不是昨晚發生的事情。
請測量你自己的數值。英文散文平均約每 4 個字元使用 1 個 token,程式碼則略少一些。如果你也在同一台 VPS 上將摘要提供給本機模型,請先確認摘要所進入的 context window,再相信 resume 的結果,因為 Ollama 會在較小的預設 context length 下截斷過長的提示,而不會告知你結尾內容已遭捨棄。
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/ 目錄。 Hook 從未執行。輸入 /recall:show 確認外掛程式已載入,然後執行 python3 -V。Hook 指令會先嘗試 python3,再嘗試 python;因此,兩者皆不存在的主機不會寫入任何內容,也不會顯示相關警告。
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 檔案,任何人都能編輯。
它不提供搜尋功能。每個專案只有一份目前摘要和一份持續增加的日誌,沒有可跨專案查詢的記憶。如果你想知道三週前對資料庫做了什麼決定,就必須使用 grep 搜尋 history.md。它也不會在工作階段之間傳遞資訊:兩個工作階段同時開啟於同一台 VPS 時,彼此看不到對方的日誌。因此,其中一個需要知道另一個正在做什麼時,只能在執行期間直接在工作階段之間傳遞文字。
它無法協助處理工作階段內的問題。工作階段進行到一半時內容視窗填滿,是另一種問題,也有不同的處理方式;在單一工作階段內管理內容視窗是本指南的配套文章。
摘要依設計會被視為不受信任的輸入。context.md 會以 fenced 格式注入並加上標籤,Claude 在依據它行動前會先詢問。這項設計是必要的,因為任何具備 commit 存取權的人都能在已提交的 .recall/ 目錄中寫入文字,而 agent 會讀取這些文字。agent 讀取內容時會停下來詢問多少問題,取決於工作階段啟動時使用的權限模式;auto mode 會在 14 August 2026 成為 Claude Code 的預設模式。請先決定 .recall/ 是個人使用還是共用:個人記憶請將它加入 .gitignore;若要共用,請提交它,並像檢視其他貢獻一樣檢視內容。若 agent 會在無人看管的情況下執行,在 VPS 上安全執行 Claude Code說明了更廣泛的安全邊界。
編修只能盡力而為。它會處理常見模式,例如 API 金鑰、token、PEM 區塊和 .env 指派。提交前請閱讀 .recall/。
版本號如實反映成熟度。2026 年 7 月的版本為 0.4.0,設定鍵和檔案配置在不同版本之間仍可能變更,因此升級依賴中的環境前,請先閱讀變更日誌。
FAQ
Recall 會將我的程式碼或逐字稿傳送到其他地方嗎?
不會。擷取 hook 與摘要程式都是在本機執行的 Python 指令碼,外掛程式不包含 API key,也不會發出網路連線。摘要使用 TF-IDF 與 TextRank,而不是模型,因此不會產生額外費用,離線時也能運作。代價是摘要採抽取式方式:它會從日誌中選取句子,而不是重新撰寫內容。
為什麼找不到我的 .recall/context.md,或內容不是最新的?
auto_save_context 預設為 off,因此只有在執行 /recall:save 時才會重新產生摘要。在 recall.config.json 中設定 "auto_save_context": "on_end",即可在每次工作階段結束時重新寫入摘要。如果連 history.md 都不存在,表示 hook 完全沒有執行:使用 /recall:show 確認外掛程式已載入,接著確認該主機上的 python3 -V 有回應,因為這些 hook 是 Python 指令碼。
Recall 每個工作階段可以節省多少內容?
載入摘要約需 1,200 個 token;一般模型若要再次讀取儲存庫、判斷目前進度,通常需要 30,000 個 token。這些只是一般估計值。請在工作階段中使用 wc -c .recall/context.md 與 /context 命令測量實際數值,比較冷啟動與從摘要恢復的工作階段。
我仍然需要 CLAUDE.md 檔案嗎?
需要,而且兩者用途不同。CLAUDE.md 是你刻意撰寫的內容:固定規則與建置命令。context.md 則根據上一個工作階段實際發生的事情產生,因此會記錄你通常不會特別寫下來的未完成遷移工作。兩者都應保留。
一台 VPS 可以為多個專案保留記憶嗎?
可以。Recall 會將記憶保存在每個專案目錄中的 .recall/,因此同一台伺服器上的兩個專案會保有各自獨立的日誌與摘要。每次都要從專案根目錄啟動 Claude Code,因為這些檔案是依工作目錄區分,而不是依使用者帳號區分。