Skip to main content
Glama
lna-lab

distill-kura

by lna-lab

蒸留蔵 — distill-kura

エージェントのための長期記憶で、蓄積ではなく蒸留によって作られます。 想起は 意味 によって機能し、書き込みは 証拠 によって制御され、1つのサーバーは複数の独立した記憶を保持できます — エージェントのモードごとに1つ — そのためモードを切り替えるとエージェントが覚えている内容も切り替わります。

DeepSeek Harness プラグイン、その他のホスト向け MCP サーバー、HTTP サービス、そして Python ライブラリとして提供されます。標準ライブラリのみを使用し、ベクターデータベースも、埋め込みも、フレームワークもありません。

        ┌── recall ──────────────────────────────────────────────┐
        │  question → whole index in one prompt → picked slugs   │
        │           → walk [[links]] → the neighbourhood         │  ~0.4 s
        └────────────────────────────────────────────────────────┘
        ┌── distil ──────────────────────────────────────────────┐
        │  journal → classed evidence → candidates → GATE        │
        │  → new? → composed → draft → judged → poured           │
        └────────────────────────────────────────────────────────┘

存在理由

エージェントの長期記憶を損なう失敗は2つあり、その2つは正反対の方向から記憶を損なわせます。

キーワードによる検索は、必要なものを見逃します。 「SSD推論チップ」 についての質問は、「SSD階層から2.6Tモデルを実行する」 というタイトルの記憶と単語を共有していません — しかしこれらは同じ主題です。単語検索では何も返らず、エージェントは根拠なく答えます。ここでの修正は埋め込みではなく 認識 です。インデックス全体(記憶ごとに1行、認識トリガーとして書かれる)を1つのプロンプトに入れ、小さなモデルが質問に関係するものを名指しします。約500件の記憶のインデックスは約6kトークンで、現代のコンテキストウィンドウの数パーセントであり、プレフィックスキャッシュに載ります。

すべてを書き込むとストアが汚染されます。 エージェントがあることを主張し、素朴な蒸留器がその主張を事実として記録し、次のエージェントがそれを正真正銘の事実として読み戻し、より強い確信で繰り返します。そのループは自己強化型であり、プロンプトの指示では止められません — 推測ではなく、測定されています。そのため書き込み経路は決定論的なPythonで制御されます。候補となる記憶はそれぞれ、生の素材に 文字単位で 存在する引用を、出典を示すタグ付きで保持しなければなりません。

class

説明

許可されること

[USER]

人間自身の言葉

「彼らが決めた」「彼らが尋ねた」

[TOOL]

機械の出力

数値 — 唯一の情報源

[ACT]

呼び出されたツール

「これが実行された」

[SELF]

エージェント自身の散文

一人称による判断であり、決して裸の事実ではない

逐語的に見つからない引用は破棄されます。生き残った引用がない候補は捨てられます。背後に [TOOL] のない数値は削除されます。[USER] の引用が残っていないのに、人間が決定したとするテキストは、最後の関門で拒否されます。アイデアは歓迎されます — それらはシードファイルに行き、ストアには決して入らず、後の証拠が確認したときだけ昇格します。


Related MCP server: Memsolus MCP Server

クイックスタート

git clone https://github.com/lna-lab/distill-kura && cd distill-kura
pip install -e .                       # or just run: python3 -m distill_kura.cli

cp kura.example.toml kura.toml         # edit: one model endpoint is enough to start
kura init main --path ~/kura/main      # create an empty store
kura serve                             # http://127.0.0.1:8085
curl -s -X POST localhost:8085/recall -H 'content-type: application/json' \
     -d '{"question":"what did we decide about the archive disk?","hops":1}'

インデックスを装着させ、エージェントが常に何が既知かを把握できるようにします:

kura weave                             # build the three-layer cloth
kura prefill                           # the block to put in the system prompt

エージェントのトランスクリプトを投入します:

kura distill run      # drink a batch → candidates → gate → drafts
kura distill drafts   # look at what it wants to write
kura distill drain    # the scribe re-reads each draft cold: pour / fix / toss
kura distill night    # stay resident and do it whenever things go quiet

drain(または手動実行の pour)まで、ストアに何も入りません。下書きは証拠をHTMLコメントとして保持するため、なぜ記憶が存在するのかを常に確認できます。


常駐マップ

ツールによる想起は 「Xについて何を知っていますか?」 に答えます — しかしそれはエージェントが質問しようと決めた場合だけです。エージェントが思いつかない質問には決して答えません:そもそもここに何かあるのか? マップを見られないエージェントは、自分が何を見逃しているのかを知らず、推測します。そしてあなたの家庭についての自信に満ちた推測こそ、このプロジェクトが防ぐために存在する失敗です。

そのためインデックスも装着されます。毎ターン、システムプロンプト内の常設ブロックとして。

kura weave      # re-weave the index into the three-layer cloth
kura prefill    # print the block a host should inject

3つの層、詳細は最近のことにしか報われないから

盲検のA/Bテスト — 20問、太いインデックス対スリムなインデックス、どちらか分からない状態で採点 — によって形状が決まりました:

帯域

太い

スリム

全体

9

11

最近の出来事

4

1

ドクトリン

1

4

分野をまたぐ飛躍

1

4

ドクトリンの行は両方のインデックスでバイト単位で同一でしたが、スリムなインデックスがその帯域でも勝ちました:周囲が軽いほど、常設の行はより良く機能します。 詳細は洞察の源泉ではありません。詳細が居場所を得るのは、物事がまだ動いている場所だけです。

ルール

pinned

frontmatter の typepinned_types にある

完全な形で保持

fresh

fresh_days 以内に変更された

完全な形で保持

trigger

それ以外のすべて

trigger_tokens に圧縮

トリガー行は scribe モデルが書き、説明 予算をキーとする台帳にキャッシュされるため、定常状態での織り直しはコストがかかりません。モデルに到達できない場合、織機は代わりに機械的にトリミングします — 記憶システムはGPUが停止したからといって空白になってはなりません。

経過時間はmtimeではありません。 cp -r、リストア、チェックアウトはすべてのタイムスタンプをリセットし、インデックス全体が "fresh" になり、何もトリミングされず、機構は静かにオフになります。そのため織機は記憶 の中に 書かれた日付を好み、ストアの5分の1が1暦日と共有するmtimeは信用しません。

それがどこに行くのか、そしてなぜそれがキャッシュの決定なのか

- id: kura
  name: distill-kura
  config: { store: eq, promptOrder: -50 }   # before the persona

プレフィックスキャッシュは、最初に変更されたバイト以降すべて失われます — 1つのローカルサーバーでの測定では、同一の4,029トークンのプリアンブルは0.68秒から0.14秒に再価格化され、末尾 への追加は0.14秒のままですが、先頭に1語追加するとキャッシュ全体が失われます(0.66秒)。ペルソナは通常クロックを保持するため、毎分変わります。マップはプロンプト内で最大のブロックであり、1日に数回変わります。大きくて安定したものを、刻々と変わるものの前に置きます。

したがって、ブロック自体には日付も時計もカウンターも含まれません — そして build() はそれらを含むヘッダーを、3週間後の不可解に遅いターンではなく、ビルド時に拒否します。

半分のマップを渡すことは決してない

状況

エージェントが受け取るもの

すべて正常

<<<KURA-MAP>>> マーカーで囲まれたマップ

budget_fraction 超過

全体 のマップと、JSON内の警告(テキスト内には決してない — バナーは揮発性コンテンツだから)

hard_fraction 超過

インデックス行のないスタブで、空ではなくマップが欠落していると示す

kura 到達不能

マップが欠落しているという明示的な注記であり、決して空文字列ではない

切り詰められたマップは、利用可能な最悪の成果物です。完全に見え、カット位置より下のすべての記憶が存在しないように見えます。weave は収まるように fresh ウィンドウを短縮しますが、行を落とすことは決してありません — そしてどの設定も予算に達しない場合は、その旨を伝え、より良いマップを保持し、重みがどこにあるかを教えます。

ホストへの組み込み

ホスト

仕組み

DSH

ネイティブプラグイン — バックグラウンドで更新される systemPrompt.section

Claude Code, VS Code, Goose

MCP の instructions は短いポインタを運びます(2KB上限)。マップ自体は kura_map ツール、または kura prefill を実行するセッションフックから取得します

Claude Desktop, claude.ai

instructions を完全に無視 — kura_map を使用

その他

GET /prefill?format=text、またはシェルフック内の kura prefill

MCP の instructions フィールドは仕様上 MAY であり、9,000トークンのインデックスはそもそも2KBの上限を通れないため、このプロジェクトはそうでないふりをしません。


モード:kuraはひとつではない

「これをビルドするのを手伝って」と「これをじっくり考えさせて」の両方に役立つ単一の記憶は、どちらにもうまく役立ちません。デバッグに役立つ想起は、次に何をするかの会話ではノイズです。そこで、ストアはディレクトリであり、モードはストアに対応付けられます。

[stores.maker]
path = "~/kura/maker"
label = "maker mode — building things"

[stores.eq]
path = "~/kura/eq"
label = "EQ mode — talking things through"

[modes]
maker = "maker"
eq    = "eq"

すべてのルートはセレクタを受け取るため、1つのプロセスがすべてを提供します:

curl -s -X POST localhost:8085/recall -d '{"question":"...","mode":"eq"}'
curl -s localhost:8085/index?store=maker
curl -s localhost:8085/s/eq/doctor          # path form, for clients that only vary a base URL

ストアは記憶も、インデックスも、蒸留器のウォーターマークも共有しません。モードを切り替えると、本当に記憶される内容が変わります — 同じ記憶が別の声で語られるのではありません。

部屋は会話の前に選ばれます。 モードとはホストが送るものです — DSHプリセット、MCP環境の KURA_STORE、CLIの -s — そしてそれがセッション全体の家です。このプロジェクトでは、メッセージを読んでどのストアに属するかを決定するものはありません。ビルドから感情へと漂流する会話は、開始した場所に留まり、ホストは次のセッションのために別の部屋を提供することができます。未知のセレクタは入り口でエラーになり、静かにデフォルトへ落ちることは決してありません。

1つの部屋、多くのタグ。 記憶は正確に1つのストアに存在し、その性格を説明する複数のタグ(decisionlandmineemotion-carried、…)を持つことができます。タグは単語であり、重みではありません。タグでランク付けされるものも、数えられるものもありません。emotion-carried とタグ付けされた Develop の記憶は、依然として Develop の記憶です。記憶を別のストアに移動またはコピーするコマンドはなく、モード変更は将来のセッションにのみ影響します。同じ話題が2つの部屋で出された場合、2つの記憶が生まれ、それぞれがその部屋自身の証拠から蒸留されます。Research の「私たちが学んだこと」と Develop の「私たちがやったこと」は異なる事実であり、それらを重複排除するために境界を越えるものはありません。

広い部屋は少し柔らかく想起します。 固定された憲章を持つ狭いストアは鋭く認識します。何でも受け入れるストア — 目的ではなく人に従う USER ルーム — はより緩やかになると予想され、その代わりに理解が成長しうるストアです。憲章の隣に profile.md を文単位で置き、憲章の後に読まれ、自身の記憶から下書きされ、人間によって適用されます。そのような5つの部屋(憲章と設定付き)が examples/rooms/ にあります。

ルーティングとしては独立しているが、機密性としては独立していない。 サーバーには認証がないため、そのポートに到達できるプロセスは、保持している任意のストアを指定できます。エージェントをバインドすることで、モデル をレーンに留めておくことができます。プロセス を締め出すわけではありません。プロセスごとに1つの信頼レベル — docs/TRUST.md は短く、プライベートストアを置く前に読む価値があります。また、見逃しやすい2つの境界についても説明しています。1つのジャーナルルートから飲む2つのストアと、1つのモデルエンドポイントの背後にある2つのストアです。

DeepSeek Harness の場合

DSH はエージェントプリセットによってペルソナとツールを切り替えます。distill-kura はストアによって記憶を切り替えます。それらを結びつければ、1つのプリセット変更で自己全体が動きます:

# .agent-presets/eq/agent.cordis.yml
- id: kura-eq
  name: distill-kura
  config:
    url: http://127.0.0.1:8085
    store: eq            # this preset's memory
    readonly: true       # the CLIENT's own switch: do not even offer a write tool
    # (the store's own `write_policy` is the authority; this just keeps the tool
    #  out of the model's hands. Naming a store already binds the preset.)

依存関係は1つ、そしてそれがなぜpeerなのか。 プラグインは @deepseek-ai/dsh-tools から defineTool をインポートします。プロファイルローカルな2番目のコピーは、同じバージョンであっても、パッケージのモジュールローカルな Symbol の同一性を分割し、最初のツール呼び出しを undefined.prepare で失敗させる可能性があります。そのためプラグインは、プロファイルがバージョンの不一致なくコピーを供給できるように、パッケージを "*" の peer として宣言します。古い物理的な重複は依然として重複排除が必要な場合があります。examples/dsh-presets/ のインストールチェックを参照してください。

allowSwitch をデフォルトのままにすると、エージェントは kura_use も取得し、プリセット変更なしで会話中に kura 間を移動できます。ツール:kura_recallkura_readkura_doctorkura_listkura_use、そして kura_remember(ストアが書き込み可能な場合のみ)。MCP ブリッジとサービス行のための isolate レルムルールを含む完全な配線は、examples/dsh-presets/ にあります。

ペルソナはホスト側のビジネスであり、当プロジェクトの管轄外です。 このプロジェクトはペルソナをレンダリングも注入もせず、ストアごとにどのペルソナファイルが対応するかを記録するだけです。GET /profile?store=eq で読み取れるので、プリセットの所有者が両者を同期させられます。エージェントの指示も同様にホスト側の AGENTS.md メカニズムに委ねます。このコードベース 上で 作業するエージェントが従うべき規約については、このリポジトリの AGENTS.md を参照してください。

任意の MCP ホストで

{ "mcpServers": { "kura": {
    "command": "python3", "args": ["-m", "distill_kura.mcp"],
    "env": { "KURA_URL": "http://127.0.0.1:8085", "KURA_STORE": "eq", "KURA_READONLY": "1" }
}}}

フリーモードでは KURA_STORE を未設定のままにします。ツールは任意の store 引数を受け取り、kura_use がセッション中に切り替えます。


モデル: デフォルトは1つ、ロール単位でアップグレード

3つのロールであり、3台のマシンではありません:

ロール

実行されるタイミング

求められるもの

thinker

すべてのリコール

小型で高速。意味で関連性を判断できなければならない

brain

蒸留時: ジャーナルのバッチ全体を読む

コンテキスト長と忍耐

scribe

蒸留時: メモリを書き、ドラフトを判定する

あなたの言語での優れた散文、判断力

[models.thinker] だけを宣言すれば、1つのモデルが3つすべてを担います — あなたが話しているモデルが、メモリを書き判定する編集者でもあるのです。それがデフォルトであり、妥当なものです。高性能な GPU モデルは、アイドル時間に編集者の仕事を十分にこなせます。そして kura tend はあなたが戻ってきた瞬間にそれを停止します(後述の「無人運転」を参照)。

アップグレードの道は、編集者に専用の席を与えることです — より大きなモデル、オンライン API、あるいはGPU をまったく競合しない CPU モデルで、会話中もメンテナンスを続けられます。この家で構築された環境では、CPU 上で約3トークン/秒の1兆パラメータ MoE を編集者として実行しています。遅いですが、会話が使う席には一切触れず、5日間で書いたメモリは今日のストアの3分の1を占めています。他のロールはそれぞれ独立してアップグレードできます — より大きなローカルモデル、またはオンライン API(OpenAI 互換の /chat/completions であれば何でも。キーはあなたが指定した環境変数から読み取られ、設定に保存されることはありません):

[models.thinker]                       # always-on, local, small
url = "http://127.0.0.1:8000/v1"
model = "local-small"

[models.scribe]                        # upgrade just the writing
url = "https://api.example.com/v1"
model = "big-model"
api_key_env = "EXAMPLE_API_KEY"

これが自動で処理してくれる2つのこと: 推論努力の方言はモデルファミリーごとに異なるため(reasoning_effortthinking_effortenable_thinking)、すべてが送信されます — 未知のものはテンプレートが無視し、一方でデフォルトで深い思考に設定されたモデルは予算全体を推論に費やして何も返さない可能性があります。また、憲章テキストはすべてのロールのプロンプトの先頭にバイト単位で同一に配置されるため、遅いローカルモデルでは3つのロールが1つのキャッシュ済みプレフィックスを共有でき、3回のプリフィルを支払う代わりになります。

遅い編集者にはプレフィックスが必要です。 憲章はすべての呼び出しの先頭にバイト単位で同一に配置されるため、3トークン/秒の CPU 編集者は、ドラフトごとではなく、沈黙ごとに1回だけプリフィルを支払います。llama.cpp では、リカレントモデルには --cache-reuse 0 をテーブルから外し、サーバーのスロットを温かいままに保ちます(--slot-save-path)。編集者の呼び出しは、意図的に1時間待つもの(timeout=3600)です。

thinker がダウンしても、リコールは沈黙しません — 単語の重複にフォールバックし、回答に how=words とラベル付けします。ツールはこれを ⚠ degraded として表示します。静かな劣化は、劣化よりも悪いのです。

無人運転: kura tend

蒸留器、注ぎ手、織機は静かな時間に実行されることを意図しており、そのタイミングを判断する監視役はモデルを必要としません:

kura distill catchup -s maker   # first: start from today, do not drink a year of history
kura tend -s maker              # stays resident; one process per store
kura tend -s maker --once       # one tick, for a scheduler or a test

蒸留器を一度も見たことのないジャーナルに向けるときは、catchup を一度実行してください — そうしないと、最初の行動が履歴全体を飲み込むことになり、1年前のジャーナルでは、ストアがすでに知っているかもしれないことを再学習するために数日分のモデル時間がかかります。マーカーを前方に動かすだけなので、進捗を失うことはありません。

「静か」とは、最新のジャーナルファイルの mtime です。idle_min(10)の沈黙の後、待機中のドラフトを排出し(編集者はそれぞれをコールドで読みます: 注ぐ / 修正 / 捨てる)、ない場合は1回の蒸留パスを実行します。何かが注がれた場合は、常駐マップを1回再織りし、沈黙ごとにインデックスを1回整理します。何もすることがなかったトラックは終了コード2で終了し、backoff_min(20)の間休止するため、空のジャーナルがスピンすることはありません。作業(注いだ、捨てた、修正した、ドラフトした)を数えますが、起動は数えません。各トラックの出力は _still/tend.log に保持されます。また、kura doctor が読み取るハートビート(tending.alive)を書き込みます。静かに死ぬ監視役こそ、監視役が絶対に起こしてはならない唯一の失敗だからです。

ジャーナルが変更されると、実行中のトラックは停止されます。編集者は通常、あなたがまさに話そうとしている GPU と同じだからです。編集者を別の席(CPU モデル、別のマシン)に置く場合は、[distill] の下で yield_on_return = false を設定すると、進行中の判定は完了まで残されます。これは、この家が CPU 編集者を5日間実行した監視役であり、その教訓を基に再構築されたものです。docs/OPERATING.md に systemd ユニットがあります。

このプロジェクトが提供しないもの: 論文を読んでストアを自律的に成長させる自律研究ループ。家にはありますが、質問1つにつき1時間放置できるモデルが必要であり、その結果はゲートが使用する意味での証拠ではありません。それは家側の線の内側に留まります。


メモリの外観

1ファイル、1事実。

---
name: archive-on-slow-disk
description: the archive lives on the slow disk; the fast one stays scratch
metadata:
  type: project          # user | feedback | project | reference
  tags: ["decision", "landmine"]
  evidence_manifest: sha256:…
belongs_because: this store keeps how the machine is laid out and why
keep: which disk, and the reason
may_fade: the df figures from that afternoon
---

The archive goes on the slow disk. The fast disk is scratch space.

**Why:** the other way round burns write endurance for nothing.
**How to apply:** check which disk a target directory is on before writing there.
Related: [[disk-layout]]

そして MEMORY.md の1行:

- [Archive on the slow disk](archive-on-slow-disk.md) — the archive lives on the slow disk; the fast one stays scratch

その行だけが毎回読まれるものです。これは認識トリガーであり、要約ではありません: 固有名詞、数字、⚠️ 地雷、到達した結論。ある行を別のメモリの行と交換しても問題なく読めるなら、それは役割を果たしていません — kura distill tidy が機械的に検出可能なケースを見つけて書き換えます。

metadata の下/先頭の4行はキュレーションであり、事実ではありません: tags はメモリの性質に関する言葉です — 複数あるのが普通で、タグが存在する前に書かれたメモリには単にありません — そして3つの文は、なぜこのストアに属するのか、どのような意味が後の間引きを生き残らなければならないのか、どのような詳細が不要かを述べます。蒸留器はストアの憲章に照らしてこれらを提案します。人間について何かを主張するタグ(entrustedemotion-carriedrecurred)は引用と照合され、そのチェックはマニフェストに記録されます。recurred は、人間が別のセッションから再び話題を持ち出したときに、蒸留器によって一度だけ書かれます — これはプロパティであり、カウンターではなく、背後に数字はありません。

kura doctor は、件数、壊れたリンク、島(何もリンクしていないメモリ)、インデックスのドリフト、読み取れないタグ行、メモリが指しているが存在しないマニフェスト、学習済みプロファイルの状態、そしてストアの容量を4つの単位で並べて報告します — メモリ数、インデックストークン、ボディトークン、バイト — limitpressureNone のままです。これは代謝に必要な目です。棚がいっぱいになったときに何が起こるかはまだ決定されていません: docs/DESIGN.md §8 を参照してください。


HTTP サーフェス

ルート

機能

POST /recall

{question, hops, top, chars, total_chars, store|mode} → 選択、走査、コンテキスト。chars はメモリごと。total_chars はコンテキスト全体のハード上限

POST /remember

{slug, description, body, type, title, tags, belongs_because, keep, may_fade} — 直接書き込み。write_policy = "direct-allowed" でない限り拒否

POST /annotate

{slug, tags, belongs_because, keep, may_fade} — 既存のメモリにタグ/3つの文をマージ。直接の扉。/remember と同じ拒否。何も追加しないマージは何にも触れません

GET /index

生のインデックス

GET /prefill

常駐ブロック。注入準備済み(フック用に &format=text)

GET /memory/<slug>

1つのメモリを完全に、tagsannotations 付きで

GET /doctor

1つのストアの健全性(?all=1 ですべてのストア)

GET /stores

ストア、モード、各ロールを担うモデル

GET /profile

ストアの憲章、状態(不在 / 存在 / 破損)付きの学習済みプロファイル、およびペルソナへのポインタ(ここでは決してレンダリングされません)

GET /health

生存確認

任意のルートは ?store= / ?mode=、ボディ内の store/mode フィールド、または /s/<name>/… パスプレフィックスを受け付けます。認証はありません: ループバックにバインドするか、前面に何かを置いてください。


変更前に読む価値のある設計ノート

  • docs/DESIGN.md — なぜ認識が検索に勝るのか、ゲートがもたらすもの、各メカニズムを動機づけた失敗。

  • docs/OPERATING.md — 常駐実行、スケジューラと終了コード、バックアップ、監視すべきもの。

  • docs/TRUST.md — ストア境界とは何か、何でないか、書き込みポリシー、見落としやすい2つの境界(共有ジャーナル、共有モデル)。プライベートストアを導入する前に読んでください。

それが防ぐ問題に直面するまで奇妙に見えるいくつかの決定:

  • 飲む前に予約。 蒸留器はジャーナルの区間を読む前にロックの下で確保し、ウォーターマークは前方にしか進みません。それぞれが自分のスナップショットを書き戻す2つの蒸留器は、互いの進捗を消し去り、同じ水を十数回飲み直しました。

  • ウォーターマークはアダプター単位。 追記専用トランスクリプトにはバイトオフセット、書き換えられるアーカイブにはシーケンス番号(再圧縮されたファイルへのバイトオフセットは嘘です)。

  • エコー抑制。 ストアにすでに存在する引用は新しい素材ではありません — ツールの結果を通してストアが自分自身を読み返しているだけです。これがないと、メモリシステムは自分の内容を永遠に再発見して再記録し続けます。

  • 最後のゲートはモデルであり、人間ではありません。 人間がすべてのドラフトを承認しなければならないなら、システムは静かにその人間をボトルネックにし、ドラフトは永遠に積み上がります。ループ内の何も、常に存在しない誰かを必要としてはいけません。

  • kura distill run は何もすることがなかったときに終了コード2で終了します。 スケジューラは「仕事をした」と「何も見つからなかった」を区別できなければなりません。そうしないと、ウォッチドッグが空のキューでスピンし、アイドル時間を必要とするステップを飢えさせます。

主張する代わりに測定する

2つの質問が1つの数字で答えられており、そうあるべきではありません。

どれだけ小さくなったか? store_ratio = メモリとインデックスのトークン / 実際に消費された生ジャーナルのトークン。何が失われたか? それは別の測定であり、100件に1件のメモリしか保持しないストアは、前者では見事なスコアを出しながら役に立たないのです。

kura bench compress                       # what this store cost, from the distiller's own metrics
kura bench compress --tokenizer-command "./count-tokens"   # exact, not estimated
kura bench retention --questions bench/fixtures/questions.json

ここでは、同梱のフィクスチャと組み込みの推定器で測定されています:

corpus

store_ratio

scripts/demo-clean-room.sh(普通聊天,大部分是填充内容)

0.18

bench/fixtures/corpus.jsonl(密集:每一行都是信号)

1.14

第二个不是 bug。在没有填充内容的材料上,蒸馏并不会压缩——每条记忆都会增加其原因应用方法,存储结果会比转录内容略大。该比率是语料库的属性,而非此工具的属性,因此这里没有醒目的数字,命令也会报告它统计了什么。

保留率是无模型评分的:每个植入的事实都带有一个标记,该标记必须出现在召回返回的内容中,因此该分数可以在其他人的机器上复现。干扰项则相反——如果存储保留了标记为 must_not_store 的事实,则会扣分,因为记忆系统的评判标准既在于它保留了什么,也在于它拒绝了什么。

score 1.0 (10/10)   decision 1/1  number 2/2  negation 1/1  reversal 1/1
                    conditional 1/1  landmine 1/1  returning 1/1  distractor 2/2

这是合成夹具中的十个植入事实,由本地 Qwen3.8-27B(NVFP4)作为大脑和记录员进行蒸馏,使用 max_items = 8, coverage_passes = 2,并由同一模型作为思考者进行评分。不同的模型会给出不同的分数:该分数衡量的是流水线加模型,而夹具的存在是为了让模型成为唯一变化的因素。它衡量的是事实是否可找到,而不是答案是否读起来通顺——评判散文需要模型,那样基准测试就不再可复现。

kura distill run 每批次向 _still/metrics.jsonl 写入一行,原始数据就来自这里。规范侧只统计证据清单指向已记录批次的记忆——将整个存储除以少数批次的原始材料,是一个数量级方向错误的数字,而这个命令的第一个版本正是这样做的。早于清单的记忆被报告为 unattributed,而不是被静默包含。原始侧始终是蒸馏器在饮用时的估计,因此使用 --tokenizer-command 时,比率会被标记为 mixed

运行环境

要求

Python

3.11+(无依赖;pip install -e ".[dev]" 仅添加 pytest)

Node

20+,仅用于 DSH 插件

zstd

仅用于读取 DSH 会话存档

模型端点

任何以 OpenAI 格式响应 POST <url>/chat/completions 的服务

“兼容 OpenAI”比“任何提供商”更窄。 供应商的原生 API 需要在其前面放置一个兼容 OpenAI 的网关;其自身的 URL 无法满足要求。严格的服务还会拒绝未知的顶层字段,因此请设置 dialect = "openai"(或 "generic")——默认的 "vllm" 会发送 chat_template_kwargs,本地服务器需要这些参数,而严格的服务会返回 400 错误。客户端会使用普通请求体重试一次,并记录调用失败的原因,而不是将所有原因归结为静默的 None

测试

python3 -m pytest tests -q                              # 145 tests, no model required
cd dsh-plugin && npm test                               # 24 more for the plugin

该门禁是经过对抗性测试的:每个案例都是真实模型试图绕过它的方式。test_containment.py 的编写方式相同——每个案例都是一次逃逸尝试,而不是正常路径——因为它守护的是一个真实存在的漏洞:存储曾会响应任何你能拼出路径的文件。端到端测试针对脚本化的模型服务器在真实套接字上运行完整的蒸馏→排空循环。

许可证

MIT。

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents with persistent, searchable memory that survives across conversations using semantic search, temporal versioning, and smart organization. Enables long-term context retention and cross-session continuity for AI assistants.
    14
  • A
    license
    A
    quality
    D
    maintenance
    Provides persistent long-term memory for AI agents through semantic search and automated knowledge graph extraction. It enables agents to store, recall, and reason over facts, preferences, and relationships across multiple conversations and sessions.
    14
    8
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An agentic memory system that enables AI assistants to store, search, and manage persistent memories with semantic understanding using natural language instructions.
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to store, search, and recall semantic memories with three memory types (semantic, episodic, procedural) and auto-consolidation, compounding intelligence over time.
    16
    MIT

View all related MCP servers

Related MCP Connectors

  • Persistent memory for AI agents — verbatim conversations, searchable by meaning.

  • Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.

  • Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lna-lab/distill-kura'

If you have feedback or need assistance with the MCP directory API, please join our Discord server