公式の OpenClaw および Hermes プラグインで、エージェントを Tablestore メモリサービスに接続します。これらのプラグインは、各会話のターンの前に関連する長期記憶を自動的に取得し、その後に新しい記憶を書き戻します。
OpenClaw プラグイン
openclaw-tablestore-memory は、Tablestore Agent Storage SDK (@tablestore/agent-storage の AgentStorageClient) を介してメモリサービスを呼び出す OpenClaw メモリプラグインです。このプラグインは、AccessKey (AK/SK) と API キーの両方の認証に対応しています。
インストール
openclaw plugins install @tablestore/openclaw-tablestore-memory
認証方法
このプラグインは、以下の 2 つの認証モードに対応しています。いずれかを選択してください。
-
AccessKey (AK/SK): すべての機能に対応しています。AK/SK を使用する場合、
endpointとotsInstanceNameが未設定であれば、プラグインはcn-beijingリージョンにマネージドインスタンスを自動的に作成し、再利用します。 -
API キー:
apiKeyが設定されている場合、AK/SK よりも優先されます。API キーは、メモリサービスのデータプレーン操作のみを許可し (コントロールプレーンは許可されません)、HTTPS のendpointとotsInstanceNameを明示的に指定する必要があります。また、マネージドインスタンスの自動作成には対応していません。
設定
最小限の AK/SK 設定:
{
"plugins": {
"slots": {
"memory": "tablestore-mem"
},
"entries": {
"tablestore-mem": {
"enabled": true,
"config": {
"endpoint": "https://<instance>.cn-beijing.ots.aliyuncs.com",
"otsInstanceName": "<instance-name>",
"accessKeyId": "<AccessKey ID>",
"accessKeySecret": "<AccessKey Secret>"
}
}
}
}
}
API キー設定:
{
"plugins": {
"slots": { "memory": "tablestore-mem" },
"entries": {
"tablestore-mem": {
"enabled": true,
"hooks": { "allowConversationAccess": true },
"config": {
"apiKey": "<API Key>",
"endpoint": "https://<instance>.cn-beijing.ots.aliyuncs.com",
"otsInstanceName": "<instance-name>"
}
}
}
}
}
hooks.allowConversationAccess=true は、OpenClaw 2026.4.26+ で導入された信頼スイッチです。有効にすると、agent_end 時に書き戻しが実行されます。無効にすると、before_prompt_build 時の取得は引き続き機能しますが、OpenClaw は自動書き戻しをブロックします。
以下の設定は、環境変数 TABLESTORE_MEMORY_APP_ID、TABLESTORE_MEMORY_TENANT_ID、TABLESTORE_MEMORY_API_KEY を使用して上書きすることもできます。
オプションパラメーター
|
パラメーター |
デフォルト |
説明 |
|
|
自動作成 |
データエンドポイント。AK/SK を使用する場合は不要です (プラグインが |
|
|
自動作成 |
インスタンス名。AK/SK を使用する場合は不要です (自動作成されます)。API キーを使用する場合は必須です。 |
|
|
なし |
メモリサービスの API キー。設定すると、AK/SK よりも優先されます。HTTPS の |
|
|
|
アプリケーション識別子。 |
|
|
セッションユーザー情報から取得 |
テナントまたはユーザー識別子。設定されている場合、セッションユーザーのアイデンティティよりも優先されます。 |
|
|
|
メモリストアの名前。 |
|
|
|
メモリストアの作成時に記述される説明。 |
|
|
なし |
メモリストアレベルのカスタム抽出指示 (最大 4,096 文字)。長期記憶の抽出をガイドするために使用されます。作成時に適用されるか、ストアがすでに存在する場合は |
|
|
|
メモリストアが存在しない場合に自動的に作成するかどうか。 |
|
|
|
会話終了後に記憶を書き戻すかどうか。 |
|
|
|
取得した記憶をコンテキストに挿入する際に、関連性スコアを含めるかどうか。 |
|
|
|
取得ごとに返される記憶エントリの数 ( |
|
|
|
類似度フィルターのしきい値 ( |
|
|
|
プロンプトがこの長さより短い場合、自動取得はスキップされます。 |
|
|
|
リランキングを有効にするかどうか。 |
|
|
|
オフラインの Dream メモリ統合 (バックグラウンドスケジュールと |
|
|
|
バックグラウンドでの Dream 統合サイクル (時間単位)。 |
|
|
|
同じスコープが再度統合されるまでの最小間隔。 |
|
|
|
|
|
|
|
|
|
|
なし |
|
|
|
なし |
Dream の動作をガイドするカスタム統合指示 (最大 4,000 文字)。 |
|
|
|
バックグラウンド実行ごとに統合されるスコープの最大数。 |
|
|
|
セッション終了時に、現在のスコープに対して Dream 統合を即座にトリガーするかどうか。 |
スコープマッピング
記憶を書き込む際、プラグインは現在のランタイムアイデンティティを使用します。
{
"appId": "openclaw",
"tenantId": "<current-user>",
"agentId": "<runtime-agent>",
"runId": "<runtime-session>"
}
記憶を取得する際、プラグインは、すべてのエージェントとセッションにわたるテナントレベルのスコープを使用し、agentId と runId を * に設定します。
{
"appId": "openclaw",
"tenantId": "<current-user>",
"agentId": "*",
"runId": "*"
}
ランタイムの動作
-
before_prompt_build時に、関連する長期記憶を取得します。 -
取得した記憶を非表示のコンテキストに挿入します (会話履歴には表示されません)。
-
agent_end時に、現在のターンからユーザーおよびアシスタントのメッセージを収集します。 -
AddMemoriesを介してメモリストアに書き戻します (デフォルトでは非同期)。
メモリ統合 (Dream)
このプラグインには、以前に書き込まれた長期記憶の重複排除、書き換え、マージ、クリーンアップを行うオフラインの Dream 統合プロセスが含まれています。
-
書き戻しが成功するたびに、正確なスコープ (
appId/tenantId/agentId/runId) が統合のためにキューに追加されます。 -
バックグラウンドスケジューラは、
dreamIntervalHours(デフォルト: 24時間) ごとにキューを処理し、applyMode=safe_autoとincremental=trueを使用して、実行ごとに最大dreamMaxScopesPerRun個のスコープを統合します。 -
dreamOnSessionEndが有効 (デフォルト) の場合、セッション終了 (ローテーション、リセット、アイドル、またはコンパクション) により、そのセッションスコープが即座に統合されます。これは、バックグラウンドスケジューラとスコープごとのウォーターマークおよびdreamMinIntervalHoursスロットリングを共有するため、同じスコープが間隔内に 2 回統合されることはありません。 -
safe_autoは、信頼度のしきい値を満たすadd、update、mergeアクションを自動的に適用します。DELETEは自動的に適用されることはありません。しきい値の優先順位:--threshold(すべてのアクションをカバー) > アクションごとのdreamConfidenceThresholds> 単一値のdreamConfidenceThreshold(デフォルト:0.9)。 -
dreamInstructionsが設定されている場合、バックグラウンドジョブ、session_endトリガー、および CLI Dream ジョブはすべて、カスタム指示を渡します。 -
統合は、特定のスコープのみを対象とし (ワイルドカードなし)、結果をその場で保持し (
preserve_scope)、リアルタイムパスとは完全に独立して実行されます。失敗はログに記録されるだけで、取得や書き戻しには影響しません。 -
バックグラウンドスケジューラは、OpenClaw プロセスが稼働している間のみ実行されます。非常駐環境の場合は、cron で CLI を実行してください (以下を参照)。
CLI とスラッシュコマンド
OpenClaw プラグインは、以下のデバッグおよび操作コマンドを提供します。
# 書き込みと取得
openclaw tablestore-mem add "田中一郎はジャスミンティーが好きです" --uid ichirou
openclaw tablestore-mem search "田中一郎の好みは" --uid ichirou
openclaw tablestore-mem search "田中一郎の好みは" --uid ichirou --top-k 10 --min-similarity 0.3
# 接続性、メモリストア、スコープの一覧表示を診断
openclaw tablestore-mem doctor --uid ichirou
# オンデマンドでメモリ統合 (Dream) をトリガー
openclaw tablestore-mem dream --uid ichirou --wait
openclaw tablestore-mem dream --uid ichirou --apply-mode proposal --wait
openclaw tablestore-mem dream --uid ichirou --threshold 0.8 --wait
openclaw tablestore-mem dream --uid ichirou --instructions "Prioritize merging duplicate preferences" --wait
OpenClaw セッション内では、以下のスラッシュコマンドを使用します。
/tablestore-mem-add 田中一郎はジャスミンティーが好きです
/tablestore-mem-search jasmine tea
Hermes プラグイン
hermes-tablestore-memory は、Tablestore Python SDK を介してメモリサービスに接続する Hermes エージェントプラグインです。
インストール
hermes plugins install https://github.com/aliyun/hermes-tablestore-memory
hermes memory setup
hermes memory setup の際に、tablestore-mem を選択します。
このプラグインには tablestore>=6.4.5 が必要です。この依存関係が Hermes Python 環境に存在しない場合は、SDK を手動でインストールしてください。
認証情報の設定
認証情報を ~/.hermes/.env に保存します:
TABLESTORE_MEMORY_AK=<AccessKey ID>
TABLESTORE_MEMORY_SK=<AccessKey Secret>
メモリサービスの設定
機密性の低い設定を $HERMES_HOME/tablestore_memory.json に保存します:
{
"endpoint": "https://<instance>.cn-beijing.ots.aliyuncs.com",
"instance_name": "<instance-name>",
"memory_store_name": "hermes_mem",
"description": "",
"app_id": "hermes",
"tenant_id": "",
"enable_rerank": true,
"auto_create_store": true,
"timeout": 30
}
デフォルト値
|
パラメーター |
デフォルト |
説明 |
|
|
|
メモリストアの名前。 |
|
|
|
アプリケーション識別子。 |
|
|
空文字列 |
空欄の場合、セッションコンテキストから派生します。デフォルトは |
|
|
|
再ランキングを有効にするかどうか。 |
|
|
|
メモリストアが存在しない場合に自動的に作成するかどうか。 |
|
|
|
リクエストのタイムアウト期間 (秒)。 |
スコープのマッピング
Hermes プラグインは、4 つのスコープフィールドを次のようにマッピングします:
|
フィールド |
ソース |
|
|
|
|
|
Hermes セッションの |
|
|
Hermes セッション ID。デフォルトは |
|
|
|
書き込み時、プラグインは正確なセッションスコープを使用します。取得時は、agentId="" と runId="" が設定されることで、スコープはテナントレベルに拡張されます。
利用可能なツール
|
ツール |
説明 |
|
|
現在のスコープ配下のメモリを表示します。 |
|
|
長期記憶を取得します。 |
|
|
長期記憶を書き込みます。 |
|
|
長期記憶を削除します。 |
また、プラグインは各ターンの後にユーザーとアシスタントのメッセージを自動的に同期し、次のターンの前に関連するメモリをプリフェッチします。
Hermes CLI コマンド
memory.provider を tablestore-mem に設定した後、次のコマンドを実行します:
hermes tablestore-mem add "User prefers concise answers."
hermes tablestore-mem add "User likes Rust." --metadata source=manual --metadata topic=preferences
hermes tablestore-mem add "Write this memory synchronously." --sync
hermes tablestore-mem search "concise answers"
hermes tablestore-mem search "Rust" --top-k 10
Claude Code プラグイン
Claude Code プラグインは、Claude Code に長期記憶を追加します。@tablestore/agent-storage を介して Tablestore メモリサービスを呼び出します。機能は OpenClaw の tablestore-mem プラグインと同等で、さらに MCP ツールを公開します。
機能
-
ターンごとの自動取得 (
UserPromptSubmitフック):プロンプトの送信前に関連する長期記憶を取得し、会話の表示には含まれない非表示コンテキストに挿入します。 -
ターンごとの自動書き戻し (
Stopフック):ターンの終了後、そのターンの新しいユーザー メッセージとアシスタント メッセージを増分的にメモリストアに書き込みます。バッチはサービス制限 (1 バッチあたり最大 20 メッセージ、32,000 バイト) に準拠します。 -
オフラインの Dream 統合 (
SessionEndフックと CLI または cron):重複排除、書き換え、マージを行い、古いメモリを削除します。 -
MCP ツール (モデルが明示的に呼び出し):
search_memory、add_memory、consolidate_memory。 -
スラッシュコマンド:
/search、/add、/doctor、/dream。 -
CLI:
search、add、doctor、dream。 -
API キー と AccessKey (AK/SK) の両方の認証をサポートします。
要件
-
Node.js 18 以降。
-
作成済みの Tablestore インスタンス (メモリサービスは China (Beijing) リージョンでのみ利用可能です)。HTTPS エンドポイント と インスタンス名 に加えて、API キーまたは AK/SK のペアを用意してください。
-
このプラグインはインスタンスを自動作成しません。エンドポイントとインスタンス名を明示的に指定してください。
インストール
リポジトリ:https://github.com/aliyun/tablestore-memory-claude-plugin。依存関係は esbuild によって dist/ に事前にバンドルされ (リポジトリに同梱)、インストール時に npm install を実行する必要はありません。
# オプション1 (推奨): GitHub マーケットプレイスからインストール
claude plugin marketplace add aliyun/tablestore-memory-claude-plugin
claude plugin install tablestore-memory@tablestore-memory-marketplace
# オプション2: リポジトリをクローンし、ローカルディレクトリからインストール
git clone https://github.com/aliyun/tablestore-memory-claude-plugin.git
claude plugin marketplace add ./tablestore-memory-claude-plugin
claude plugin install tablestore-memory@tablestore-memory-marketplace
開発時はマーケットプレイスを使用せず、プラグインディレクトリを直接参照します:
claude --plugin-dir /path/to/tablestore-memory-claude-plugin
プラグインのソースを変更した後、バンドルを再ビルドします:
# dist/ に再ビルド
npm run build
設定
~/.claude/settings.json の env ブロックに次の変数を設定します。これらはフックと MCP サーバーの両方に注入されます:
{
"env": {
"TABLESTORE_MEMORY_ENDPOINT": "https://<instance>.cn-beijing.ots.aliyuncs.com",
"TABLESTORE_MEMORY_INSTANCE": "<instance>",
"TABLESTORE_MEMORY_API_KEY": "<api-key>"
}
}
代わりに AK/SK を使用する場合は、TABLESTORE_MEMORY_API_KEY を TABLESTORE_ACCESS_KEY_ID と TABLESTORE_ACCESS_KEY_SECRET に置き換えます。
認証の優先度:TABLESTORE_MEMORY_API_KEY が設定されている場合、プラグインは API キー認証 (HTTPS エンドポイントが必要) を使用します。それ以外の場合は AK/SK を使用します。どちらも設定されていない場合、プラグインは通知なく無効化されます。
設定ファイルをフォールバックとして使用することもできます:~/.tablestore-memory/config.json (キャメルケースキー endpoint、instanceName、apiKey、accessKeyId、accessKeySecret、storeName)。環境変数は設定ファイルより優先されます。
環境変数の一覧:
|
環境変数 |
デフォルト |
説明 |
|
|
なし |
必須。Tablestore インスタンスのエンドポイント。 |
|
|
なし |
必須。Tablestore インスタンス名。 |
|
|
なし |
API キー認証 (AK/SK より優先)。 |
|
|
なし |
AK/SK 認証。 |
|
|
なし |
AK/SK 認証。 |
|
|
|
メモリストア名。 |
|
|
|
メモリストアが存在しない場合に自動作成するかどうか。 |
|
|
|
Dream 統合を有効にするかどうか。 |
|
|
|
|
|
|
|
|
|
|
|
1 回の実行で統合するスコープの最大数。 |
|
|
|
同一スコープを再度統合するまでの最小間隔。 |
|
|
空 |
設定すると、デバッグログが stderr に出力されます。 |
スコープ設計 (ユーザー単位のグローバル プール)
-
特定のセッションにアンカーを書き込みます:
appId / tenantId / agentId / runId=<session_id>。 -
取得範囲は固定のテナント内で拡張されます:
agentId=*とrunId=*。これにより、セッション間およびプロジェクト間の呼び出しが可能になります。 -
ワイルドカードはサービス階層ルールに従います。あるレベルで
*を使用した場合、それより下位のすべてのレベルでも*を使用する必要があります。
Dream (メモリ統合)
-
セッションの終了 (
SessionEnd) により、テナントスコープの統合がトリガーされます。DREAM_MIN_INTERVAL_HOURSによってスロットリングされます。状態は~/.tablestore-memory/dream-state.jsonに保存されます。 -
このプラグインはバックグラウンドデーモンとして実行できないため、cron から CLI を呼び出して定期的に統合処理を実行してください:
# 例: テナントのメモリを毎日 03:17 に統合し、結果を待つ
17 3 * * * node /path/to/tablestore-memory/dist/cli.mjs dream --uid <tenant> --wait
CLI
node dist/cli.mjs search "What beverages does the user like?" --top-k 5
node dist/cli.mjs add "The user likes Americano." --sync
node dist/cli.mjs doctor
node dist/cli.mjs dream --uid <tenant> --apply-mode safe_auto --wait
--uid はテナントを上書きします (運用や cron での使用を想定)。-q/--quiet はデータ フィールドのみを出力します。
動作と制約
-
フェイルオープン:設定の不足、または SDK の例外が発生した場合でも、会話は中断されません。フックは stderr にログを出力し、ステータス 0 で終了します。
-
フックの stdout にはプロトコル JSON のみが出力されます。ログはすべて stderr に出力されます。
-
非同期書き込み (
sync=false) の後、長期記憶は 約 15 秒以内に取得可能になります。--syncを使用すると、直ちに取得できます。
統合方法の選択
要件に基づいて方法を選択してください。
|
シナリオ |
推奨方法 |
説明 |
|
アプリケーションが OpenClaw または Hermes を使用する場合 |
公式プラグイン |
同じテナント内のすべてのエージェントとセッションから長期記憶を取得します。ほとんどのパーソナル アシスタントおよびビジネス エージェントのシナリオに適しています。 |
|
カスタムのメモリ書き込み、取得、またはコンテキスト組み立てロジックが必要な場合 |
SDK |
詳細については、「Python SDK」または「Node.js SDK」をご参照ください。 |
|
厳密なセッションレベルの取得分離が必要な場合 |
カスタムの完全な Scope を使用する SDK |
フィールドの定義については、「Memory Storage API」をご参照ください。 |
エージェント間でメモリを共有するには、同じ Tablestore インスタンスを使用し、両方の設定で appId、tenantId、memoryStoreName が完全に一致していることを確認してください。agentId は、各エージェントのランタイムによって決定され、取得時には * に設定されます。