私は複数のマシンを行き来しながら、タスクに応じて異なるコーディングエージェントを使い分けています。
どのエージェントも、私のプロジェクトに向き合うときは見知らぬ存在のように感じられます。「先週の火曜日」の推論過程は、セッションが終わると消えてしまいます。新しいホスト上で起動する新しいエージェントは、毎回ゼロから始めるしかありません。
今年の初め、「ソフトウェアは忘れる:エージェントの軌跡こそが記憶である」という記事で、コーディングエージェントは、私たちが失い続けている記録をすでに生成している、という指摘がありました。エージェントはコードベースを検索し、さまざまなアプローチを試し、エラーに遭遇し、ドキュメントを読み、方針を変えていきます。その過程で、「何を変更したか」だけでなく「なぜそのように変更したのか」についても、詳細な記録が残されます。
この指摘は正しいものの、軌跡はあくまで潜在的な記憶にすぎません。エージェントのセッションログは、依然として単なるアーカイブです。1万回に及ぶインタラクションを前にして、「なぜストリーミングパーサーを諦めたのか?」という問いへの答えを、grep だけで見つけることはできません。エージェントが作業中にこうした軌跡を利用できるようにするには、インデックス作成、検索、ランキング、そして正確な出典の追跡が必要です。
それを実現するのが funes です。funes はエージェント向けの永続メモリーレイヤーで、Claude Code、Codex、pi、Hermes に対応しています。すでにマシン上に存在するセッションを基盤として、完全にローカルで動作します。コマンド1つで、エージェントの日常的なワークフローに組み込むことができます。必要であれば、自分で所有する Hugging Face データセットに同期することもでき、デフォルトでは非公開に保たれます。
すでに使っているエージェントに記憶を追加する
funes は単一ファイルのバイナリです。デフォルトの推論バックエンドは機械学習ランタイムに依存せず、埋め込み生成とリランキングはあなたのマシン上で実行されます。インストールするには、次のコマンドを実行します。
curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh続いて、エージェントに追加します。
funes add claude # または:codex、pi、hermesこの add コマンドによって、最初のインデックスが作成され、エージェントに recall と get のツールが提供されます。また、完了した各インタラクションを自動的にインデックス化する仕組みもインストールされます。インデックス作成は増分方式で行われます。新しい実行では、履歴全体を再度埋め込むのではなく、新しいインタラクションだけが追加されます。より古く、より深い内容については、分割して制御しながら後からインデックスに追加できます。
あとは、いつもどおり作業するだけです。過去の決定やその理由、発見した内容が関係するタスクでは、エージェントが自分で recall を呼び出せます。古いセッションを覚えておく必要も、新しいセッションに過去のコンテキストを貼り付ける必要もありません。
funes を追加すると、会話の中で記憶が呼び出されます。エージェントは自分で記憶を検索し、その回答の根拠となったセッションを示します。
recallが返すのは要約ではなく元のテキストであり、出典(エージェント、タイムスタンプ、セッション、インタラクション)も正確に表示されます。各結果にはgetコマンドが含まれており、完全なインタラクションとその前後のコンテキストを開くことができます。
内部では、決定論的なパイプラインが、対応するすべての軌跡を統一された「ターン—ブロック」構造に解析し、チャンクに分割します。続いて、固定バージョンのローカルモデルで埋め込みを生成し、ローカルの Lance データセットに書き込みます。クエリではベクトル検索と BM25 検索を組み合わせ、両者のランキング結果を融合します。その後、クロスエンコーダーで候補をリランキングし、時間的な新しさに基づいて重みを再調整したうえで、隣接するブロックを追加します。
この設計により、funes には次の3つの重要な特性があります。
-
複数のエージェントで同じ記憶を共有できる: Claude Code、Codex、pi、Hermes はすべて同じ構造に書き込みます。
recallはそれらすべての履歴を横断して検索でき、各ヒット結果には、どのエージェントが生成したものかが示されます。 -
元の証拠を完全な形で保持する: 書き込み時に内容を事実へ要約することはありません。結果は常に、それを生み出したインタラクションまでたどることができます。
-
recallはデフォルトでローカルに実行される: アカウントも Hub リポジトリも必要ありません。インデックス作成のためにホスト型モデルがセッションを処理することはありません。埋め込み生成とリランキングはあなたのマシン上で実行され、推論はコーディングエージェントが行います。
1台のマシン上では、「エージェントが見知らぬ存在のように振る舞う」という問題は解決しました。しかし、次のエージェントが別の場所で動く場合、記憶はさらに役立つものになります。
記憶はサービスではなくデータセット
作業に記憶を持ち運ばせるには、funes をエージェントに追加する際に記憶を紐付けます。
funes add codex acme/funes-memory紐付けを行うと、現在の記憶がその場所に公開されます。その後、funes は各インタラクションをローカルでインデックス化し、セッションの境界で更新を公開することで、記憶を常に最新の状態に保ちます。エージェントは継続的にそこから記憶を呼び出します。別のマシンで同じコマンドを実行すれば、過去の記憶があなたについてきます。
内部では、ローカルメモリーは Lance データセットであり、共有メモリーはあなたが所有する Hugging Face データセットです(デフォルトでは非公開に保たれます)。
Hub に到達する前に、認証情報はインデックス作成の段階ですでに秘匿化されます。公開時には各ブロックが再度スキャンされ、依然として機密情報に見える内容はブロックされます。その背後にあるスキャナーについては、SECURITY.md に記載されています。そこでは、何を対象とし、何を対象としていないかが説明されています。
エージェントがリモートの記憶を読み取ると、funes はデータセットファイルをローカルにキャッシュします。そのため、キャッシュがウォームアップされた後は、クエリの速度をローカルと同等の水準に戻すことができます。Hub は、他のデータセットですでに提供されている所有権、アクセス制御、バージョン管理、配布の機能をすべて備えています。あなたの記憶が独立したメモリーサービスのアカウントに変わることも、それを API 経由で借り戻す必要もありません。
まずは質問し、後から接続する
recall はエージェント向けに設計されています。自分で記憶に質問したい場合は、ask を使います。デフォルトでは、ローカルの記憶を読み取ります。
funes ask claude "ストリーミングパーサーについてどのような決定をしたか"また、共有メモリーを指定することもできます。funes の開発に関する記憶を公開しているため、自分の記憶を作成しなくても、funes がなぜ現在のような動作方法を採用しているのかを尋ねられます。
funes ask claude "なぜ funes は追記のみの方式を採用しているのか" --memory huggingface/funes-memory
funes askは、funes addの読み取り専用・単一質問版です。関連する段落を検索し、それらをコーディングエージェントに渡して、証拠に基づく回答を返します。同時に、回答の出典も示します。統合機能をインストールしたり、エージェントの永続化設定を変更したりすることはありません。検索結果が見つからなかった場合も隠されることはありません。検索された段落だけでは回答を裏付けるのに不十分な場合、エージェントはそのことを明確に説明します。質問を書き換えることも、funes をエージェントに追加して、通常の作業中に記憶の検索を繰り返し行わせることもできます。
エージェントを切り替えてもコンテキストを失わない
共有メモリーは、それを作成したエージェントやモデルに紐付いていません。Claude Code でタスクを開始し、翌週に Codex で続きを行えば、2つ目のエージェントは1つ目のエージェントの推論過程を思い出せます。ローカルモデルで pi を実行することも、Hugging Face Router が提供するモデルを使うこともでき、その後 Claude に戻ることもできます。
Claude が決定を下し、フックがその決定をインデックス化し、Codex が別のセッションでその決定を思い出しています。デモの序盤で表示されるヒット結果は、同じ実験に関するさらに前の記録です。追記のみの記憶は、以前のリハーサルの過程も記憶しています。
これは、いくつかの異なる範囲で重要になります。
-
マシン間: 各エージェントを同じ記憶に紐付け、現在使用している任意のホストから履歴を検索できます。
-
チーム間: 新しいチームメンバーのエージェントは、初日から数か月分の意思決定を検索できます。これには deta


