memos/apps/memos-local-openclaw/docs/index.html

704 lines
75 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>MemOS — OpenClaw 记忆插件文档</title>
<link rel="icon" href="https://statics.memtensor.com.cn/logo/color-m.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" crossorigin>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{
--bg:#06080f;--bg-card:rgba(14,18,32,.85);--bg-alt:rgba(20,26,48,.7);
--border:rgba(99,140,255,.1);--border-glow:rgba(99,140,255,.25);
--text:#eef1ff;--text-sec:rgba(200,210,255,.55);--text-thr:rgba(160,175,220,.3);
--muted:rgba(99,140,255,.06);
--accent:#00e5ff;--accent-light:#638cff;--accent-bg:rgba(0,229,255,.08);
--blue:#638cff;--blue-bg:rgba(99,140,255,.08);
--purple:#b16cff;--purple-bg:rgba(177,108,255,.08);
--green:#00e676;--green-bg:rgba(0,230,118,.08);
--amber:#ffca28;--amber-bg:rgba(255,202,40,.08);
--rose:#ff3cac;--rose-bg:rgba(255,60,172,.08);
--grad-main:linear-gradient(135deg,#00e5ff,#638cff,#b16cff);
--code-bg:rgba(10,14,28,.9);--code-text:rgba(200,210,255,.75);
--radius:10px;
--font:'Inter',system-ui,-apple-system,sans-serif;
--mono:'JetBrains Mono','SF Mono',ui-monospace,monospace;
--sidebar-w:250px;--header-h:56px;
}
[data-theme="light"]{
--bg:#f0f2f8;--bg-card:#fff;--bg-alt:#e8ecf4;
--border:rgba(99,140,255,.12);--border-glow:rgba(99,140,255,.25);
--text:#0a0e1a;--text-sec:rgba(10,14,26,.55);--text-thr:rgba(10,14,26,.3);
--muted:rgba(99,140,255,.05);
--accent:#0080cc;--accent-light:#0099ee;--accent-bg:rgba(0,128,204,.06);
--blue:#4060dd;--blue-bg:rgba(64,96,221,.06);
--purple:#7c3aed;--purple-bg:rgba(124,58,237,.06);
--green:#16a34a;--green-bg:rgba(22,163,74,.06);
--amber:#b45309;--amber-bg:rgba(180,83,9,.06);
--rose:#e11d48;--rose-bg:rgba(225,29,72,.06);
--grad-main:linear-gradient(135deg,#0080cc,#4060dd,#7c3aed);
--code-bg:#eef0f6;--code-text:#1a1e2e;
}
::selection{background:rgba(99,140,255,.25);color:#fff}
[data-theme="light"] .header{background:rgba(240,242,248,.92)}
[data-theme="light"] .sidebar{background:var(--bg-card)}
html{scroll-behavior:smooth;scroll-padding-top:76px}
body{font-family:var(--font);color:var(--text);background:var(--bg);line-height:1.7;font-size:15px;transition:background .2s,color .2s}
.header{position:fixed;top:0;left:0;right:0;height:var(--header-h);background:rgba(6,8,15,.85);backdrop-filter:blur(20px) saturate(1.4);border-bottom:1px solid var(--border);z-index:100;display:flex;align-items:center;padding:0 24px}
.header .logo{display:flex;align-items:center;gap:8px;font-weight:700;font-size:16px;color:var(--text);text-decoration:none}
.header .logo:hover{color:var(--accent)}
.header .logo .icon{font-size:22px}
.header .logo .powered{font-size:10px;color:var(--text-sec);font-weight:400;display:block;line-height:1.1}
.header nav{margin-left:auto;display:flex;align-items:center;gap:4px}
.header nav a{color:var(--text-sec);text-decoration:none;padding:5px 12px;border-radius:6px;font-size:13px;font-weight:500;transition:all .15s}
.header nav a:hover{color:var(--text);background:var(--muted)}
.sidebar{position:fixed;top:var(--header-h);left:0;bottom:0;width:var(--sidebar-w);overflow-y:auto;background:var(--bg-card);border-right:1px solid var(--border);padding:18px 0;z-index:50}
.sidebar::-webkit-scrollbar{width:4px}
.sidebar::-webkit-scrollbar-thumb{background:rgba(99,140,255,.15);border-radius:2px}
.sidebar .group{margin-bottom:14px}
.sidebar .group-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-thr);padding:4px 18px 5px}
.sidebar a{display:block;padding:4px 18px 4px 22px;font-size:13px;color:var(--text-sec);text-decoration:none;border-left:2px solid transparent;transition:all .15s}
.sidebar a:hover,.sidebar a.active{color:var(--text);background:var(--muted);border-left-color:var(--accent)}
.main{margin-left:var(--sidebar-w);margin-top:var(--header-h);padding:36px 44px 100px;max-width:860px}
h1{font-size:32px;font-weight:800;letter-spacing:-.02em;margin-bottom:10px;background:var(--grad-main);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
h2{font-size:22px;font-weight:700;margin:48px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border);color:var(--text)}
h3{font-size:16px;font-weight:600;margin:28px 0 8px;color:var(--text)}
h4{font-size:14px;font-weight:600;margin:20px 0 6px;color:var(--text-sec)}
p{margin-bottom:12px;color:var(--text-sec)}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline;color:var(--accent-light)}
strong{color:var(--text);font-weight:600}
.hero-badge{display:inline-flex;align-items:center;gap:6px;background:var(--accent-bg);color:var(--accent);font-size:12px;font-weight:600;padding:4px 12px;border-radius:16px;margin-bottom:14px;border:1px solid rgba(0,229,255,.2)}
.hero-desc{font-size:16px;color:var(--text-sec);margin-bottom:28px;max-width:600px;line-height:1.8}
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px;margin:18px 0}
.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:18px;transition:all .2s}
.card:hover{border-color:var(--border-glow)}
.card .card-icon{font-size:24px;margin-bottom:8px}
.card h4{margin:0 0 4px;color:var(--text);font-size:14px}
.card p{margin:0;font-size:12px;color:var(--text-sec);line-height:1.6}
pre{background:var(--code-bg);color:var(--code-text);border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;overflow-x:auto;font-family:var(--mono);font-size:12.5px;line-height:1.7;margin:12px 0 18px;position:relative}
pre .lang{position:absolute;top:6px;right:10px;font-size:10px;color:var(--text-thr);font-weight:500;text-transform:uppercase}
code{font-family:var(--mono);font-size:.88em;background:var(--muted);padding:2px 6px;border-radius:4px;color:var(--accent)}
pre code{background:none;padding:0;color:inherit;font-size:inherit}
.kw{color:#00e5ff}.str{color:#00e676}.cmt{color:rgba(160,175,220,.3);font-style:italic}.num{color:#ffca28}.fn{color:#b16cff}.type{color:#638cff}
table{width:100%;border-collapse:collapse;margin:12px 0 20px;font-size:13px}
th{text-align:left;padding:8px 12px;background:var(--bg-alt);font-weight:600;font-size:12px;color:var(--text-sec);border-bottom:2px solid var(--border)}
td{padding:8px 12px;border-bottom:1px solid var(--border);color:var(--text-sec)}
tr:hover td{background:var(--bg-alt)}
.callout{border-left:3px solid var(--accent);background:var(--accent-bg);padding:12px 16px;border-radius:0 var(--radius) var(--radius) 0;margin:14px 0;font-size:13px;color:var(--text-sec)}
.callout strong{color:var(--text)}
.callout.warn{border-color:var(--amber);background:var(--amber-bg)}
.callout.success{border-color:var(--green);background:var(--green-bg)}
.diagram{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:24px 20px;margin:18px 0;overflow-x:auto}
.diagram-flow{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:center;min-width:560px}
.diagram-box{padding:8px 14px;border-radius:8px;font-size:11px;font-weight:600;text-align:center;white-space:nowrap;border:1px solid var(--border);background:var(--bg-card);color:var(--text-sec);transition:all .15s}
.diagram-box:hover{border-color:var(--border-glow);color:var(--text)}
.diagram-box.pur{border-color:rgba(0,229,255,.2);color:var(--accent)}
.diagram-box.grn{border-color:rgba(34,197,94,.2);color:var(--green)}
.diagram-box.amb{border-color:rgba(234,179,8,.2);color:var(--amber)}
.diagram-sub{font-size:9px;font-weight:400;display:block;opacity:.7}
.diagram-arrow{color:var(--text-thr);font-size:16px;padding:0 2px}
ul,ol{margin:6px 0 14px 22px;color:var(--text-sec)}
li{margin-bottom:5px}
li code{font-size:11px}
.local-callout{background:var(--blue-bg);border:1px solid rgba(99,140,255,.15);border-radius:var(--radius);padding:14px 18px;margin:18px 0;font-size:13px;color:var(--text-sec)}
.local-callout strong{color:var(--text)}
.katex,.katex-display{color:var(--text) !important}
.katex-display{margin:1em 0 1.2em;overflow-x:auto;padding:10px 0}
.math-block{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:18px 22px;margin:14px 0;overflow-x:auto}
.math-block .math-display{display:block;text-align:center;padding:4px 0}
@media(max-width:900px){.sidebar{display:none}.main{margin-left:0;padding:24px 18px 80px}.card-grid{grid-template-columns:1fr}.diagram-flow{min-width:auto;flex-direction:column}.diagram-arrow{transform:rotate(90deg)}}
.section{scroll-margin-top:76px}
body.lang-en .lang-zh{display:none !important}
body.lang-zh .lang-en{display:none !important}
.lang-switch{display:inline-flex;align-items:stretch;margin-left:10px;padding:2px;background:var(--muted);border-radius:14px}
.lang-switch .lang-btn{background:transparent;border:none;color:var(--text-thr);padding:3px 10px;font-size:10px;font-weight:600;cursor:pointer;border-radius:12px;transition:all .2s}
.lang-switch .lang-btn:hover{color:var(--text-sec)}
.lang-switch .lang-btn.active{background:var(--grad-main);color:#06080f}
.theme-toggle-btn{width:32px;height:32px;margin-left:8px;padding:0;border:1px solid var(--border);border-radius:50%;background:var(--bg-card);color:var(--text-sec);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}
.theme-toggle-btn:hover{border-color:var(--accent);color:var(--accent)}
.theme-toggle-btn .icon-sun{display:none}.theme-toggle-btn .icon-moon{display:inline}
[data-theme="light"] .theme-toggle-btn .icon-sun{display:inline}
[data-theme="light"] .theme-toggle-btn .icon-moon{display:none}
.logo-light{display:none}
[data-theme="light"] .logo-dark{display:none}
[data-theme="light"] .logo-light{display:inline}
</style>
</head>
<body>
<header class="header">
<a href="../" class="logo"><img class="logo-dark" src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS" style="width:38px;height:38px"><img class="logo-light" src="https://statics.memtensor.com.cn/logo/color-m.svg" alt="MemOS" style="width:38px;height:38px"><span>MemOS<span class="powered"><span class="lang-zh">OpenClaw 插件 · 文档</span><span class="lang-en">OpenClaw Plugin · Docs</span></span></span></a>
<nav>
<a href="../" class="lang-zh">首页</a><a href="../" class="lang-en">Home</a>
<a href="#overview" class="lang-zh">概览</a><a href="#overview" class="lang-en">Overview</a>
<a href="#quickstart" class="lang-zh">快速开始</a><a href="#quickstart" class="lang-en">Quick Start</a>
<a href="#migration" class="lang-zh">记忆迁移</a><a href="#migration" class="lang-en">Migration</a>
<a href="#api">API</a>
<a href="#sharing-overview" class="lang-zh">团队共享</a><a href="#sharing-overview" class="lang-en">Sharing</a>
<a href="#config" class="lang-zh">配置</a><a href="#config" class="lang-en">Config</a>
<button type="button" class="theme-toggle-btn" onclick="toggleDocsTheme()" title="Toggle theme"><span class="icon-moon">&#127769;</span><span class="icon-sun">&#9728;</span></button>
<span class="lang-switch"><button type="button" class="lang-btn active" data-lang="zh"></button><button type="button" class="lang-btn" data-lang="en">EN</button></span>
</nav>
</header>
<aside class="sidebar">
<div class="group"><div class="group-title"><span class="lang-zh">开始</span><span class="lang-en">Start</span></div>
<a href="#overview"><span class="lang-zh">产品概览</span><span class="lang-en">Overview</span></a>
<a href="#features"><span class="lang-zh">核心特性</span><span class="lang-en">Features</span></a>
<a href="#architecture"><span class="lang-zh">架构</span><span class="lang-en">Architecture</span></a>
<a href="#data-flow"><span class="lang-zh">数据流</span><span class="lang-en">Data Flow</span></a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">安装</span><span class="lang-en">Install</span></div>
<a href="#quickstart"><span class="lang-zh">快速开始</span><span class="lang-en">Quick Start</span></a>
<a href="#config"><span class="lang-zh">配置</span><span class="lang-en">Configuration</span></a>
<a href="#viewer"><span class="lang-zh">Viewer</span><span class="lang-en">Viewer</span></a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">记忆迁移</span><span class="lang-en">Migration</span></div>
<a href="#migration"><span class="lang-zh">功能概述</span><span class="lang-en">Overview</span></a>
<a href="#mig-usage"><span class="lang-zh">操作步骤</span><span class="lang-en">Usage</span></a>
<a href="#mig-postprocess"><span class="lang-zh">后处理</span><span class="lang-en">Post-Processing</span></a>
<a href="#mig-resume"><span class="lang-zh">断点续传</span><span class="lang-en">Resume</span></a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">模块</span><span class="lang-en">Modules</span></div>
<a href="#mod-capture">Capture</a><a href="#mod-ingest">Ingest</a><a href="#mod-task"><span class="lang-zh">任务</span><span class="lang-en">Tasks</span></a><a href="#mod-skill"><span class="lang-zh">技能</span><span class="lang-en">Skills</span></a><a href="#mod-recall">Recall</a><a href="#mod-viewer">Viewer</a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">算法</span><span class="lang-en">Retrieval</span></div>
<a href="#algo-rrf">RRF</a><a href="#algo-mmr">MMR</a><a href="#algo-recency"><span class="lang-zh">时间衰减</span><span class="lang-en">Recency</span></a>
</div>
<div class="group"><div class="group-title">API</div>
<a href="#tool-search">memory_search</a><a href="#tool-get">memory_get</a><a href="#tool-timeline">memory_timeline</a><a href="#tool-task">task_summary</a><a href="#tool-skill">skill_get / install</a><a href="#tool-write-public">memory_write_public</a><a href="#tool-skill-search">skill_search</a><a href="#tool-skill-publish">skill_publish</a><a href="#tool-viewer">memory_viewer</a><a href="#api-viewer">Viewer HTTP</a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">团队共享</span><span class="lang-en">Team Sharing</span></div>
<a href="#sharing-overview"><span class="lang-zh">概述</span><span class="lang-en">Overview</span></a>
<a href="#sharing-setup"><span class="lang-zh">配置</span><span class="lang-en">Setup</span></a>
<a href="#sharing-admin"><span class="lang-zh">管理员</span><span class="lang-en">Admin</span></a>
<a href="#sharing-multi"><span class="lang-zh">多实例</span><span class="lang-en">Multi-Instance</span></a>
<a href="#sharing-notif"><span class="lang-zh">通知</span><span class="lang-en">Notifications</span></a>
</div>
<div class="group"><div class="group-title"><span class="lang-zh">进阶</span><span class="lang-en">Advanced</span></div>
<a href="#multi-agent"><span class="lang-zh">多智能体</span><span class="lang-en">Multi-Agent</span></a><a href="#llm-fallback"><span class="lang-zh">LLM 降级链</span><span class="lang-en">LLM Fallback</span></a><a href="#database"><span class="lang-zh">数据库</span><span class="lang-en">Database</span></a><a href="#security"><span class="lang-zh">安全</span><span class="lang-en">Security</span></a><a href="#defaults"><span class="lang-zh">默认值</span><span class="lang-en">Defaults</span></a><a href="troubleshooting.html"><span class="lang-zh">安装排查</span><span class="lang-en">Troubleshooting</span></a>
</div>
</aside>
<div class="main">
<section id="overview" class="section">
<div class="hero-badge"><img src="https://statics.memtensor.com.cn/logo/color-m.svg" alt="" style="width:22px;height:22px;vertical-align:middle"> <span class="lang-zh">MemOS OpenClaw 插件</span><span class="lang-en">MemOS OpenClaw Plugin</span></div>
<h1>MemOS</h1>
<p class="hero-desc">
<span class="lang-zh"><strong>OpenClaw</strong> 提供完全本地化的持久记忆、智能任务总结、技能自动进化和多智能体协同。npm 一键安装,支持分级模型配置。</span>
<span class="lang-en">Fully local persistent memory, smart task summarization, auto skill evolution, and multi-agent collaboration for <strong>OpenClaw</strong>. One-command install, tiered model support.</span>
</p>
<div class="local-callout">
<span class="lang-zh"><strong>完全本地化:</strong>数据存于本机 SQLite零云依赖。Viewer 仅 127.0.0.1,密码保护。</span>
<span class="lang-en"><strong>Fully local:</strong> Data in local SQLite, zero cloud dependency. Viewer 127.0.0.1 only, password-protected.</span>
</div>
<div class="card-grid" id="features">
<div class="card"><div class="card-icon">💾</div><h4><span class="lang-zh">全量写入</span><span class="lang-en">Full-Write</span></h4><p><span class="lang-zh">每次对话自动捕获,语义分片后持久化。</span><span class="lang-en">Auto-captures every conversation, chunks semantically.</span></p></div>
<div class="card"><div class="card-icon"></div><h4><span class="lang-zh">任务总结与技能进化</span><span class="lang-en">Tasks & Skills</span></h4><p><span class="lang-zh">碎片对话归纳为结构化任务,再提炼为可复用技能并持续升级。</span><span class="lang-en">Conversations organized into tasks, then distilled into skills that auto-upgrade.</span></p></div>
<div class="card"><div class="card-icon">🔍</div><h4><span class="lang-zh">混合检索</span><span class="lang-en">Hybrid Search</span></h4><p><span class="lang-zh">FTS5 + 向量RRFMMR时间衰减。</span><span class="lang-en">FTS5 + vector, RRF, MMR, recency decay.</span></p></div>
<div class="card"><div class="card-icon">🧠</div><h4><span class="lang-zh">全量可视化</span><span class="lang-en">Visualization</span></h4><p><span class="lang-zh">记忆/任务/技能/分析/日志/导入/设置 7 个管理页。</span><span class="lang-en">7 pages: memories, tasks, skills, analytics, logs, import, settings.</span></p></div>
<div class="card"><div class="card-icon">💰</div><h4><span class="lang-zh">分级模型</span><span class="lang-en">Tiered Models</span></h4><p><span class="lang-zh">Embedding/摘要/技能可独立配置不同模型。</span><span class="lang-en">Each pipeline configurable with different models.</span></p></div>
<div class="card"><div class="card-icon">🤝</div><h4><span class="lang-zh">多智能体协同</span><span class="lang-en">Multi-Agent</span></h4><p><span class="lang-zh">记忆隔离 + 公共记忆 + 技能共享,多 Agent 协同进化。</span><span class="lang-en">Memory isolation + public memory + skill sharing for collective evolution.</span></p></div>
<div class="card"><div class="card-icon">🦐</div><h4><span class="lang-zh">原生记忆导入</span><span class="lang-en">Native Memory Import</span></h4><p><span class="lang-zh">一键迁移 OpenClaw 内置记忆,智能去重、断点续传、实时进度。</span><span class="lang-en">One-click migration from OpenClaw built-in memories with smart dedup, resume, and real-time progress.</span></p></div>
<div class="card"><div class="card-icon">👥</div><h4><span class="lang-zh">团队共享中心</span><span class="lang-en">Team Sharing Hub</span></h4><p><span class="lang-zh">Hub-Client 架构,跨实例共享记忆/任务/技能。审批流程、角色管理、实时通知、端口自动推导。</span><span class="lang-en">Hub-Client architecture for cross-instance sharing. Approval flow, role management, real-time notifications, auto port derivation.</span></p></div>
<div class="card"><div class="card-icon">🔗</div><h4><span class="lang-zh">LLM 智能降级</span><span class="lang-en">LLM Fallback Chain</span></h4><p><span class="lang-zh">技能模型 → 摘要模型 → OpenClaw 原生模型三级自动降级,零手动干预。</span><span class="lang-en">Skill model → summarizer → OpenClaw native model, auto-fallback with zero manual intervention.</span></p></div>
<div class="card"><div class="card-icon">✏️</div><h4><span class="lang-zh">任务/技能 CRUD</span><span class="lang-en">Task & Skill CRUD</span></h4><p><span class="lang-zh">列表卡片直接编辑、删除、重试技能生成、切换可见性。</span><span class="lang-en">Edit, delete, retry skill gen, toggle visibility — all from list cards.</span></p></div>
</div>
</section>
<section id="architecture" class="section">
<h2><span class="lang-zh">系统架构</span><span class="lang-en">Architecture</span></h2>
<p><span class="lang-zh">四条流水线:记忆写入 → 任务总结与技能进化(异步)→ 智能检索 → 协同共享。每个 Agent 拥有独立记忆空间,通过公共记忆和技能共享实现协同进化。</span><span class="lang-en">Four pipelines: write → task & skill evolution (async) → retrieval → collaboration. Each agent has isolated memory; public memory and skill sharing enable collective evolution.</span></p>
<div class="diagram"><div class="diagram-flow">
<div class="diagram-box">OpenClaw<span class="diagram-sub">agent_end</span></div><span class="diagram-arrow"></span>
<div class="diagram-box">Capture</div><span class="diagram-arrow"></span>
<div class="diagram-box">Ingest<span class="diagram-sub">chunk→summary→embed→dedup</span></div><span class="diagram-arrow"></span>
<div class="diagram-box pur">SQLite+FTS5</div>
</div></div>
<div class="diagram" style="margin-top:10px"><div class="diagram-flow">
<div class="diagram-box pur">Task Processor<span class="diagram-sub lang-zh">异步 · 话题检测 → 摘要</span><span class="diagram-sub lang-en">async · topic → summary</span></div><span class="diagram-arrow"></span>
<div class="diagram-box pur">Skill Evolver<span class="diagram-sub lang-zh">异步 · 评估 → 生成/升级</span><span class="diagram-sub lang-en">async · eval → create/up</span></div>
</div></div>
<div class="diagram" style="margin-top:10px"><div class="diagram-flow">
<div class="diagram-box">before_agent_start<span class="diagram-sub">auto-recall</span></div><span class="diagram-arrow"></span>
<div class="diagram-box amb">Recall<span class="diagram-sub">FTS+Vector</span></div><span class="diagram-arrow"></span>
<div class="diagram-box">LLM filter</div><span class="diagram-arrow"></span>
<div class="diagram-box">Inject context</div>
</div></div>
<div class="diagram" style="margin-top:10px"><div class="diagram-flow">
<div class="diagram-box">Agent<span class="diagram-sub">memory_search</span></div><span class="diagram-arrow"></span>
<div class="diagram-box amb">RRF→MMR→Decay</div><span class="diagram-arrow"></span>
<div class="diagram-box">LLM filter</div><span class="diagram-arrow"></span>
<div class="diagram-box grn">excerpts+chunkId/task_id</div><span class="diagram-arrow"></span>
<div class="diagram-box">task_summary / skill_get / memory_timeline</div>
</div></div>
<h3 id="data-flow"><span class="lang-zh">数据流</span><span class="lang-en">Data Flow</span></h3>
<h4><span class="lang-zh">写入</span><span class="lang-en">Write</span></h4>
<ol>
<li><code>agent_end</code> → Capture → Chunk → LLM Summary → Embed → Dedup → Store</li>
<li><span class="lang-zh">异步:任务检测 → 任务摘要 → 技能评估 → 技能生成/升级</span><span class="lang-en">Async: task detect → summary → skill eval → create/upgrade</span></li>
</ol>
<h4><span class="lang-zh">检索</span><span class="lang-en">Read</span></h4>
<ol>
<li><span class="lang-zh">每轮自动:<code>before_agent_start</code> 用用户消息检索 → LLM 过滤相关 → 注入 system 上下文;无结果时提示 agent 自生成 query 调 <code>memory_search</code></span><span class="lang-en">Per turn: <code>before_agent_start</code> searches with user message → LLM filters relevant → inject system context; if no hits, hint agent to call <code>memory_search</code> with self-generated query.</span></li>
<li><code>memory_search</code> → FTS5+Vector → RRF → MMR → Decay → LLM filter → excerpts + chunkId/task_id无 summary</li>
<li><code>task_summary</code> / <code>skill_get</code>(skillId|taskId) / <code>memory_timeline</code>(chunkId) / <code>skill_install</code></li>
</ol>
</section>
<section id="quickstart" class="section">
<h2><span class="lang-zh">快速开始</span><span class="lang-en">Quick Start</span></h2>
<ul>
<li><strong>Node.js</strong> ≥ 18</li>
<li><span class="lang-zh"><strong>OpenClaw</strong> 已安装</span><span class="lang-en"><strong>OpenClaw</strong> installed</span></li>
<li><span class="lang-zh">Embedding / Summarizer API 可选,不配自动用本地模型</span><span class="lang-en">Embedding / Summarizer APIs optional, falls back to local</span></li>
</ul>
<h4><span class="lang-zh">Step 0安装 C++ 编译工具macOS / Linux 推荐)</span><span class="lang-en">Step 0: Install C++ Build Tools (macOS / Linux recommended)</span></h4>
<p><span class="lang-zh">插件依赖 <code>better-sqlite3</code> 原生模块。<strong>macOS / Linux</strong> 用户建议先安装编译工具,可大幅提升安装成功率。<strong>Windows</strong> 用户使用 Node.js LTS 版本时通常有预编译文件,可直接跳到 Step 1。</span><span class="lang-en">The plugin depends on <code>better-sqlite3</code>, a native C/C++ module. <strong>macOS / Linux</strong> users should install build tools first. <strong>Windows</strong> users with Node.js LTS usually have prebuilt binaries and can skip to Step 1.</span></p>
<pre><code><span class="cmt"># macOS</span>
xcode-select --install
<span class="cmt"># Linux (Ubuntu / Debian)</span>
sudo apt install build-essential python3
<span class="cmt"># Windows: 通常无需操作。如安装失败,安装 Visual Studio Build Tools:</span>
<span class="cmt"># https://visualstudio.microsoft.com/visual-cpp-build-tools/</span></code><span class="lang">bash</span></pre>
<h4><span class="lang-zh">Step 1安装插件 & 启动</span><span class="lang-en">Step 1: Install Plugin & Start</span></h4>
<pre><code><span class="kw">openclaw</span> plugins install @memtensor/memos-local-openclaw-plugin
<span class="kw">openclaw</span> gateway start</code><span class="lang">bash</span></pre>
<div class="callout warn"><span class="lang-zh"><strong>安装失败?</strong>最常见的问题是 <code>better-sqlite3</code> 原生模块编译失败。请确认已执行上方 Step 0然后手动重建<code>cd ~/.openclaw/extensions/memos-local-openclaw-plugin && npm rebuild better-sqlite3</code>。更多方案请查看 <a href="troubleshooting.html">安装排查指南</a><a href="https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md" target="_blank">better-sqlite3 官方文档</a></span><span class="lang-en"><strong>Install failed?</strong> The most common issue is <code>better-sqlite3</code> compilation failure. Ensure Step 0 is done, then manually rebuild: <code>cd ~/.openclaw/extensions/memos-local-openclaw-plugin && npm rebuild better-sqlite3</code>. See the <a href="troubleshooting.html">troubleshooting guide</a> or <a href="https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md" target="_blank">official better-sqlite3 docs</a> for more solutions.</span></div>
<h3><span class="lang-zh">升级</span><span class="lang-en">Upgrade</span></h3>
<pre><code><span class="kw">openclaw</span> plugins update memos-local-openclaw-plugin
<span class="kw">openclaw</span> gateway stop && <span class="kw">openclaw</span> gateway start</code><span class="lang">bash</span></pre>
<div class="callout"><span class="lang-zh">升级自动完成依赖安装、旧版清理和原生模块编译,无需手动操作。如果 update 命令不可用,先删除旧目录再重新安装:<code>rm -rf ~/.openclaw/extensions/memos-local-openclaw-plugin && openclaw plugins install @memtensor/memos-local-openclaw-plugin</code>(记忆数据不受影响)。</span><span class="lang-en">Upgrade automatically handles dependencies, legacy cleanup, and native module compilation. If update is unavailable, delete the old directory first: <code>rm -rf ~/.openclaw/extensions/memos-local-openclaw-plugin && openclaw plugins install @memtensor/memos-local-openclaw-plugin</code> (memory data is stored separately and won't be affected).</span></div>
<h3 id="config"><span class="lang-zh">配置</span><span class="lang-en">Configuration</span></h3>
<p><span class="lang-zh"><strong>两种方式</strong>:编辑 <code>openclaw.json</code> 或通过 Viewer 网页面板在线修改。支持分级模型。</span><span class="lang-en"><strong>Two methods</strong>: edit <code>openclaw.json</code> or via Viewer web panel. Tiered models supported.</span></p>
<pre><code>{
<span class="str">"plugins"</span>: {
<span class="str">"slots"</span>: { <span class="str">"memory"</span>: <span class="str">"memos-local-openclaw-plugin"</span> },
<span class="str">"entries"</span>: { <span class="str">"memos-local-openclaw-plugin"</span>: {
<span class="str">"config"</span>: {
<span class="str">"embedding"</span>: { <span class="cmt">// lightweight</span>
<span class="str">"provider"</span>: <span class="str">"openai_compatible"</span>,
<span class="str">"model"</span>: <span class="str">"bge-m3"</span>,
<span class="str">"endpoint"</span>: <span class="str">"https://your-api-endpoint/v1"</span>,
<span class="str">"apiKey"</span>: <span class="str">"sk-••••••"</span>
},
<span class="str">"summarizer"</span>: { <span class="cmt">// mid-tier</span>
<span class="str">"provider"</span>: <span class="str">"openai_compatible"</span>,
<span class="str">"model"</span>: <span class="str">"gpt-4o-mini"</span>,
<span class="str">"endpoint"</span>: <span class="str">"https://your-api-endpoint/v1"</span>,
<span class="str">"apiKey"</span>: <span class="str">"sk-••••••"</span>
},
<span class="str">"skillEvolution"</span>: {
<span class="str">"summarizer"</span>: { <span class="cmt">// high-quality</span>
<span class="str">"provider"</span>: <span class="str">"openai_compatible"</span>,
<span class="str">"model"</span>: <span class="str">"claude-4.6-opus"</span>,
<span class="str">"endpoint"</span>: <span class="str">"https://your-api-endpoint/v1"</span>,
<span class="str">"apiKey"</span>: <span class="str">"sk-••••••"</span>
}
},
<span class="str">"recall"</span>: { <span class="cmt">// optional</span>
<span class="str">"vectorSearchMaxChunks"</span>: <span class="num">0</span> <span class="cmt">// 0=search all; set 200000300000 only if slow on huge DB</span>
},
<span class="str">"viewerPort"</span>: <span class="num">18799</span>
}
}}
}
}</code><span class="lang">json</span></pre>
<div class="callout success"><span class="lang-zh">安装后每次对话自动存入记忆。访问 <code>http://127.0.0.1:18799</code> 使用 Viewer。</span><span class="lang-en">Every conversation auto-stored. Visit <code>http://127.0.0.1:18799</code> for Viewer.</span></div>
</section>
<section id="migration" class="section">
<h2><span class="lang-zh">🦐 记忆迁移 — 再续前缘</span><span class="lang-en">🦐 Memory Migration — Reconnect</span></h2>
<p><span class="lang-zh">将 OpenClaw 原生内置的记忆数据SQLite 存储的对话历史)无缝迁移到 MemOS 的智能记忆系统。你和 AI 共同积累的每一段对话,都值得被记住。</span><span class="lang-en">Seamlessly migrate OpenClaw's native built-in memory data (SQLite conversation history) to MemOS's intelligent memory system. Every conversation you've built with AI deserves to be remembered.</span></p>
<div class="callout success"><span class="lang-zh"><strong>核心特性:</strong>一键导入 · 智能去重 · 断点续传 · 任务与技能生成 · 实时进度 · 🦐 标识导入来源</span><span class="lang-en"><strong>Key Features:</strong> One-click import · Smart dedup · Resume anytime · Task & skill gen · Real-time progress · 🦐 source tagging</span></div>
<h3 id="mig-usage"><span class="lang-zh">操作步骤</span><span class="lang-en">Usage</span></h3>
<h4><span class="lang-zh">方式一:通过 Viewer 网页面板(推荐)</span><span class="lang-en">Method 1: Via Viewer Web Panel (Recommended)</span></h4>
<ol>
<li><span class="lang-zh">访问 <code>http://127.0.0.1:18799</code>,切换到 <strong>Import</strong> 页面。</span><span class="lang-en">Visit <code>http://127.0.0.1:18799</code>, switch to the <strong>Import</strong> page.</span></li>
<li><span class="lang-zh">点击 <strong>扫描 OpenClaw 原生记忆</strong>,系统自动扫描 <code>~/.openclaw/</code> 下的 SQLite 数据库和 JSONL 日志。</span><span class="lang-en">Click <strong>Scan OpenClaw Native Memories</strong> — the system auto-scans SQLite databases and JSONL logs under <code>~/.openclaw/</code>.</span></li>
<li><span class="lang-zh">查看扫描结果(文件数、会话数、消息数),确认后点击 <strong>开始导入</strong></span><span class="lang-en">Review scan results (files, sessions, messages), then click <strong>Start Import</strong>.</span></li>
<li><span class="lang-zh">实时查看导入进度条、统计数据(已导入/跳过/合并/错误)和日志。</span><span class="lang-en">Monitor real-time progress bar, stats (stored/skipped/merged/errors), and logs.</span></li>
</ol>
<h4><span class="lang-zh">方式二:通过 Agent 对话</span><span class="lang-en">Method 2: Via Agent Chat</span></h4>
<p><span class="lang-zh">在与 OpenClaw 的对话中,直接让 AI 操作:</span><span class="lang-en">In your conversation with OpenClaw, tell the AI:</span></p>
<pre><code><span class="cmt">// Example prompts</span>
<span class="str">"请帮我导入 OpenClaw 的原生记忆"</span>
<span class="str">"Import my OpenClaw native memories"</span></code><span class="lang">text</span></pre>
<h4><span class="lang-zh">方式三:通过 HTTP API</span><span class="lang-en">Method 3: Via HTTP API</span></h4>
<pre><code><span class="cmt"># 1. 扫描</span>
<span class="kw">curl</span> http://127.0.0.1:18799/api/migrate/scan
<span class="cmt"># 2. 开始导入SSE 流式进度)</span>
<span class="kw">curl</span> http://127.0.0.1:18799/api/migrate/start
<span class="cmt"># 3. 停止导入</span>
<span class="kw">curl</span> -X POST http://127.0.0.1:18799/api/migrate/stop</code><span class="lang">bash</span></pre>
<h3 id="mig-postprocess"><span class="lang-zh">后处理:任务与技能生成</span><span class="lang-en">Post-Processing: Task & Skill Generation</span></h3>
<p><span class="lang-zh">导入完成后,可选择对导入的记忆进行后处理:</span><span class="lang-en">After import, optionally post-process imported memories:</span></p>
<ul>
<li><span class="lang-zh"><strong>任务生成</strong>:自动检测会话中的任务边界,为每个会话生成结构化摘要(目标/步骤/结果)。</span><span class="lang-en"><strong>Task generation</strong>: Auto-detect task boundaries per session, generate structured summaries (goal/steps/result).</span></li>
<li><span class="lang-zh"><strong>技能进化</strong>:从已完成的任务中提炼可复用技能,生成 SKILL.md 文件并安装到工作区。</span><span class="lang-en"><strong>Skill evolution</strong>: Distill reusable skills from completed tasks, generate SKILL.md and install to workspace.</span></li>
</ul>
<p><span class="lang-zh">后处理在同一 Agent 内串行执行,不同 Agent 之间可并行(并发度可配置 18。已处理过的会话自动跳过。支持选择只生成任务、只生成技能或两者同时执行。</span><span class="lang-en">Post-processing runs serially within each agent, with parallel processing across agents (configurable concurrency 18). Already processed sessions are auto-skipped. Choose task-only, skill-only, or both.</span></p>
<h3 id="mig-resume"><span class="lang-zh">断点续传</span><span class="lang-en">Resume & Stop</span></h3>
<p><span class="lang-zh">导入和后处理均支持随时暂停:</span><span class="lang-en">Both import and post-processing support pause/resume:</span></p>
<ul>
<li><span class="lang-zh">点击 <strong>停止</strong> 按钮后,进度自动保存。</span><span class="lang-en">Click <strong>Stop</strong>, progress auto-saved.</span></li>
<li><span class="lang-zh">刷新页面后自动检测未完成的导入,恢复进度条显示。</span><span class="lang-en">On page refresh, auto-detect incomplete imports and restore progress display.</span></li>
<li><span class="lang-zh">再次点击开始即从上次中断处继续,已处理的记忆自动跳过。</span><span class="lang-en">Click start again to continue from where you left off — processed memories are auto-skipped.</span></li>
<li><span class="lang-zh">导入和后处理在后台运行,关闭 Viewer 页面不影响执行。</span><span class="lang-en">Import and post-processing run in the background — closing the Viewer page won't interrupt them.</span></li>
</ul>
<div class="callout"><span class="lang-zh"><strong>🦐 来源标识:</strong>所有通过迁移导入的记忆都带有 🦐 标识,在 Viewer 的记忆列表中可一眼区分原生导入和对话生成的记忆。</span><span class="lang-en"><strong>🦐 Source Tag:</strong> All migrated memories are tagged with 🦐, making them visually distinguishable from conversation-generated memories in the Viewer.</span></div>
</section>
<section id="modules" class="section">
<h2><span class="lang-zh">模块</span><span class="lang-en">Modules</span></h2>
<h3 id="mod-capture">Capture</h3>
<p><span class="lang-zh">过滤 system/self-tool剥离 OpenClaw 元数据。保留 user/assistant/tool。</span><span class="lang-en">Filter system/self-tool, strip metadata. Keep user/assistant/tool.</span></p>
<h3 id="mod-ingest">Ingest</h3>
<p><span class="lang-zh">异步队列:语义分片 → LLM 摘要 → 向量化 → 智能去重Top-5 相似 + LLM 判 DUPLICATE/UPDATE/NEWUPDATE 合并摘要并追加内容)→ 存储;演化块记录 merge_history。</span><span class="lang-en">Async queue: chunk → summary → embed → smart dedup (Top-5 similar + LLM DUPLICATE/UPDATE/NEW; UPDATE merges summary and appends content) → store; evolved chunks track merge_history.</span></p>
<h3 id="mod-task"><span class="lang-zh">任务总结</span><span class="lang-en">Task Summarization</span></h3>
<p><span class="lang-zh">异步逐轮检测任务边界:分组为用户回合 → 第一条直接分配 → 后续每条由 LLM 判断话题是否切换(强偏向 SAME避免过度分割→ 2h 超时强制切分 → 结构化摘要(目标/步骤/结果)。支持编辑、删除、重试技能生成。</span><span class="lang-en">Async per-turn boundary detection: group into user turns → first turn assigned directly → each subsequent turn checked by LLM topic judge (strongly biased toward SAME to avoid over-splitting) → 2h timeout forces split → structured summary (goal/steps/result). Supports edit, delete, retry skill generation.</span></p>
<h3 id="mod-skill"><span class="lang-zh">技能进化</span><span class="lang-en">Skill Evolution</span></h3>
<p><span class="lang-zh">规则过滤 → LLM 评估(可重复/有价值的任务才生成技能)→ SKILL.md 生成(步骤/警告/脚本)/ 升级 → 质量评分 → 安装。LLM 使用三级降级链(技能模型 → 摘要模型 → OpenClaw 原生模型)。支持编辑、删除、设为公开/私有。</span><span class="lang-en">Rule filter → LLM evaluate (only repeatable/valuable tasks generate skills) → SKILL.md (steps/warnings/scripts) / upgrade → score → install. LLM uses a 3-level fallback chain (skill model → summarizer → OpenClaw native model). Supports edit, delete, toggle visibility.</span></p>
<h3 id="mod-recall">Recall</h3>
<p><span class="lang-zh">FTS5+Vector → RRF(k=60) → MMR(λ=0.7) → Decay(14d) → Normalize → Filter(≥0.45) → Top-K。自动关联 Task/Skill。</span><span class="lang-en">FTS5+Vector → RRF(k=60) → MMR(λ=0.7) → Decay(14d) → Normalize → Filter(≥0.45) → Top-K. Auto-links Task/Skill.</span></p>
<h3 id="mod-viewer">Viewer</h3>
<p><span class="lang-zh">7 页:记忆 CRUD/搜索/演化标识、任务(对话气泡)、技能(版本/下载、分析、日志工具调用输入输出、OpenClaw 原生记忆导入、在线配置。密码保护。</span><span class="lang-en">7 pages: memory CRUD/search/evolution badges, tasks (chat bubbles), skills (versions/download), analytics, logs (tool call I/O), OpenClaw native memory import, online config. Password-protected.</span></p>
</section>
<section id="algo-rrf" class="section">
<h2><span class="lang-zh">检索算法</span><span class="lang-en">Retrieval</span></h2>
<h3>RRF</h3>
<div class="math-block"><span class="math-display">\[ \text{RRF}(d) = \sum_i \frac{1}{k + \text{rank}_i(d) + 1} \]</span></div>
<h3 id="algo-mmr">MMR</h3>
<div class="math-block"><span class="math-display">\[ \text{MMR}(d) = \lambda \cdot \text{rel}(d) - (1-\lambda) \cdot \max \text{sim}(d, d_s) \]</span></div>
<h3 id="algo-recency"><span class="lang-zh">时间衰减</span><span class="lang-en">Recency</span></h3>
<div class="math-block"><span class="math-display">\[ \text{final} = \text{score} \times \bigl(0.3 + 0.7 \times 0.5^{t/14}\bigr) \]</span></div>
</section>
<section id="api" class="section">
<h2>API</h2>
<h3 id="tool-search">memory_search</h3>
<p><code>query</code> (required), <code>maxResults</code> (20), <code>minScore</code> (0.45), <code>role</code>. Returns <span class="lang-zh">excerpts原文片段+ chunkId / task_id无 summary经 LLM 相关性过滤。</span><span class="lang-en">excerpts + chunkId/task_id, no summary; LLM relevance filter.</span></p>
<h3 id="tool-get">memory_get</h3>
<p><span class="lang-zh">获取记忆块完整原文。</span><span class="lang-en">Get full original text of a memory chunk.</span> <code>chunkId</code>, <code>maxChars</code> (optional).</p>
<h3 id="tool-timeline">memory_timeline</h3>
<p><span class="lang-zh">以 chunkId 为锚点的上下文邻居。</span><span class="lang-en">Context neighbors by chunkId.</span> <code>chunkId</code>, <code>window</code> (2).</p>
<h3 id="tool-task">task_summary</h3>
<p><span class="lang-zh">任务结构化摘要。</span><span class="lang-en">Structured task summary.</span> taskId or query.</p>
<h3 id="tool-skill">skill_get / skill_install</h3>
<p><span class="lang-zh">skill_get 支持 skillId 或 taskId按任务解析技能skill_install 安装到工作区。</span><span class="lang-en">skill_get accepts skillId or taskId; skill_install installs to workspace.</span></p>
<h3 id="tool-write-public">memory_write_public</h3>
<p><span class="lang-zh">写入公共记忆owner="public"),所有 Agent 均可检索。</span><span class="lang-en">Write public memory (owner="public"), discoverable by all agents.</span> <code>content</code> (required), <code>summary</code> (optional).</p>
<h3 id="tool-skill-search">skill_search</h3>
<p><span class="lang-zh">搜索技能FTS5 关键词 + 向量语义双通道RRF 融合后经 LLM 判断相关性。</span><span class="lang-en">Search skills via FTS5 + vector, RRF fusion, then LLM relevance judgment.</span> <code>query</code> (required), <code>scope</code> ("mix" | "self" | "public", default "mix").</p>
<h3 id="tool-skill-publish">skill_publish / skill_unpublish</h3>
<p><span class="lang-zh">skill_publish 将技能设为公开,其他 Agent 可通过 skill_search 发现并安装。skill_unpublish 设为私有。</span><span class="lang-en">skill_publish makes a skill public and discoverable via skill_search. skill_unpublish sets it private.</span> <code>skillId</code> (required).</p>
<h3 id="tool-viewer">memory_viewer</h3>
<p><span class="lang-zh">返回 Viewer URL。</span><span class="lang-en">Returns Viewer URL.</span></p>
<h3 id="api-viewer">Viewer HTTP</h3>
<table>
<tr><th>Method</th><th>Path</th><th><span class="lang-zh">说明</span><span class="lang-en">Description</span></th></tr>
<tr><td>GET</td><td>/</td><td>Memory Viewer HTML</td></tr>
<tr><td>POST</td><td>/api/auth/*</td><td>setup / login / reset / logout</td></tr>
<tr><td>GET</td><td>/api/memories</td><td><span class="lang-zh">记忆列表(分页、过滤)</span><span class="lang-en">Memory list (pagination, filters)</span></td></tr>
<tr><td>GET</td><td>/api/search</td><td><span class="lang-zh">混合搜索(向量 minScore 0.64 + FTS5 降级)</span><span class="lang-en">Hybrid search (vector minScore 0.64 + FTS5 fallback)</span></td></tr>
<tr><td>POST/PUT/DELETE</td><td>/api/memory/:id</td><td><span class="lang-zh">记忆 CRUD</span><span class="lang-en">Memory CRUD</span></td></tr>
<tr><td>GET</td><td>/api/tasks</td><td><span class="lang-zh">任务列表(状态过滤)</span><span class="lang-en">Task list (status filter)</span></td></tr>
<tr><td>GET/PUT/DELETE</td><td>/api/task/:id</td><td><span class="lang-zh">任务详情/编辑/删除</span><span class="lang-en">Task detail/edit/delete</span></td></tr>
<tr><td>POST</td><td>/api/task/:id/retry-skill</td><td><span class="lang-zh">重试技能生成</span><span class="lang-en">Retry skill generation</span></td></tr>
<tr><td>GET</td><td>/api/skills</td><td><span class="lang-zh">技能列表</span><span class="lang-en">Skill list</span></td></tr>
<tr><td>GET/PUT/DELETE</td><td>/api/skill/:id</td><td><span class="lang-zh">技能详情/编辑/删除</span><span class="lang-en">Skill detail/edit/delete</span></td></tr>
<tr><td>PUT</td><td>/api/skill/:id/visibility</td><td><span class="lang-zh">设置公开/私有</span><span class="lang-en">Set public/private</span></td></tr>
<tr><td>GET</td><td>/api/skill/:id/download</td><td><span class="lang-zh">技能 ZIP 下载</span><span class="lang-en">Download as ZIP</span></td></tr>
<tr><td>GET</td><td>/api/stats, /api/metrics</td><td><span class="lang-zh">统计与分析</span><span class="lang-en">Stats & metrics</span></td></tr>
<tr><td>GET</td><td>/api/logs</td><td><span class="lang-zh">工具调用日志</span><span class="lang-en">Tool call logs</span></td></tr>
<tr><td>GET/PUT</td><td>/api/config</td><td><span class="lang-zh">在线配置</span><span class="lang-en">Online configuration</span></td></tr>
<tr><td>GET/POST</td><td>/api/migrate/*</td><td><span class="lang-zh">记忆导入(扫描/开始/停止/SSE 进度)</span><span class="lang-en">Memory import (scan/start/stop/SSE)</span></td></tr>
<tr><td>POST/GET</td><td>/api/migrate/postprocess/*</td><td><span class="lang-zh">后处理(任务/技能生成)</span><span class="lang-en">Post-process (task/skill gen)</span></td></tr>
</table>
</section>
<section id="sharing-overview" class="section">
<h2><span class="lang-zh">👥 团队共享中心</span><span class="lang-en">👥 Team Sharing Hub</span></h2>
<p><span class="lang-zh">Team Sharing 将多个 OpenClaw 实例连接为协作网络。一个实例作为 <strong>Hub</strong>(团队服务端),其他实例作为 <strong>Client</strong> 连接。私有数据始终留在本地,仅明确共享的任务、记忆和技能对团队可见。</span><span class="lang-en">Team Sharing connects multiple OpenClaw instances into a collaborative network. One instance serves as the <strong>Hub</strong> (team server) while others connect as <strong>Clients</strong>. Private data stays local — only explicitly shared tasks, memories, and skills are visible to the team.</span></p>
<!-- Hub-Client Architecture Diagram -->
<div style="max-width:780px;margin:32px auto;background:rgba(0,0,0,.15);border:1px solid rgba(0,229,255,.12);border-radius:16px;padding:24px 12px 16px;overflow-x:auto">
<svg viewBox="0 0 780 200" width="780" height="200" xmlns="http://www.w3.org/2000/svg" style="display:block;width:100%;height:auto">
<defs>
<linearGradient id="dgHub" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="rgba(0,229,255,.18)"/><stop offset="100%" stop-color="rgba(99,140,255,.18)"/></linearGradient>
<linearGradient id="dgCli" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="rgba(177,108,255,.14)"/><stop offset="100%" stop-color="rgba(99,140,255,.14)"/></linearGradient>
<linearGradient id="dgClaw" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#ff4d4d"/><stop offset="100%" stop-color="#991b1b"/></linearGradient>
</defs>
<!-- Hub -->
<rect x="280" y="10" width="220" height="80" rx="12" fill="url(#dgHub)" stroke="rgba(0,229,255,.3)" stroke-width="1.5"><animate attributeName="stroke-opacity" values=".3;.6;.3" dur="3s" repeatCount="indefinite"/></rect>
<path d="M306 42c-4-2-6 0-5 5s4 3 5 0c1-2 1-4 0-5z" fill="url(#dgClaw)"/><path d="M322 42c4-2 6 0 5 5s-4 3-5 0c-1-2-1-4 0-5z" fill="url(#dgClaw)"/>
<circle cx="314" cy="38" r="9" fill="url(#dgClaw)"/>
<circle cx="311" cy="36" r="1.8" fill="#050810"/><circle cx="317" cy="36" r="1.8" fill="#050810"/>
<circle cx="311.5" cy="35.4" r=".7" fill="#00e5cc"><animate attributeName="opacity" values="1;.3;1" dur="3s" repeatCount="indefinite"/></circle>
<circle cx="317.5" cy="35.4" r=".7" fill="#00e5cc"><animate attributeName="opacity" values="1;.3;1" dur="3s" repeatCount="indefinite" begin=".1s"/></circle>
<text x="334" y="40" font-size="13" font-weight="800" fill="#00e5ff" font-family="system-ui,sans-serif">Hub</text>
<text x="334" y="55" font-size="9" fill="rgba(200,210,255,.55)" font-family="system-ui,sans-serif"><tspan class="lang-zh">团队服务端 · 共享记忆/技能</tspan><tspan class="lang-en">Team Server · Shared Memory/Skills</tspan></text>
<rect x="334" y="64" width="40" height="14" rx="4" fill="rgba(0,229,255,.1)" stroke="rgba(0,229,255,.15)" stroke-width=".5"/><text x="340" y="74" font-size="7" font-weight="600" fill="#00e5ff" font-family="monospace">🧠 86</text>
<rect x="380" y="64" width="40" height="14" rx="4" fill="rgba(0,229,255,.1)" stroke="rgba(0,229,255,.15)" stroke-width=".5"/><text x="386" y="74" font-size="7" font-weight="600" fill="#00e5ff" font-family="monospace">📋 12</text>
<rect x="426" y="64" width="36" height="14" rx="4" fill="rgba(0,229,255,.1)" stroke="rgba(0,229,255,.15)" stroke-width=".5"/><text x="432" y="74" font-size="7" font-weight="600" fill="#00e5ff" font-family="monospace">⚡ 5</text>
<!-- Client A -->
<rect x="20" y="120" width="200" height="70" rx="10" fill="url(#dgCli)" stroke="rgba(177,108,255,.25)" stroke-width="1"/>
<path d="M44 148c-3-1.5-5 0-4 4s3 2 4 0c.8-1.5.8-3 0-4z" fill="url(#dgClaw)"/><path d="M56 148c3-1.5 5 0 4 4s-3 2-4 0c-.8-1.5-.8-3 0-4z" fill="url(#dgClaw)"/>
<circle cx="50" cy="145" r="7" fill="url(#dgClaw)"/><circle cx="47.5" cy="143.5" r="1.2" fill="#050810"/><circle cx="52.5" cy="143.5" r="1.2" fill="#050810"/>
<text x="66" y="148" font-size="10" font-weight="700" fill="#b16cff" font-family="system-ui,sans-serif">OpenClaw A</text>
<text x="66" y="161" font-size="8" fill="rgba(200,210,255,.4)" font-family="system-ui,sans-serif"><tspan class="lang-zh">前端开发 · 234 记忆</tspan><tspan class="lang-en">Frontend · 234 Memories</tspan></text>
<circle cx="182" cy="142" r="4" fill="#00e676"/><text x="192" y="146" font-size="7" fill="rgba(0,230,118,.7)" font-family="monospace">online</text>
<rect x="40" y="170" width="80" height="13" rx="4" fill="rgba(0,229,255,.06)" stroke="rgba(0,229,255,.1)" stroke-width=".5"/><text x="48" y="180" font-size="6.5" fill="rgba(0,229,255,.6)" font-family="monospace">📤 skill_publish</text>
<!-- Client B -->
<rect x="250" y="120" width="200" height="70" rx="10" fill="url(#dgCli)" stroke="rgba(177,108,255,.25)" stroke-width="1"/>
<path d="M274 148c-3-1.5-5 0-4 4s3 2 4 0c.8-1.5.8-3 0-4z" fill="url(#dgClaw)"/><path d="M286 148c3-1.5 5 0 4 4s-3 2-4 0c-.8-1.5-.8-3 0-4z" fill="url(#dgClaw)"/>
<circle cx="280" cy="145" r="7" fill="url(#dgClaw)"/><circle cx="277.5" cy="143.5" r="1.2" fill="#050810"/><circle cx="282.5" cy="143.5" r="1.2" fill="#050810"/>
<text x="296" y="148" font-size="10" font-weight="700" fill="#b16cff" font-family="system-ui,sans-serif">OpenClaw B</text>
<text x="296" y="161" font-size="8" fill="rgba(200,210,255,.4)" font-family="system-ui,sans-serif"><tspan class="lang-zh">后端开发 · 158 记忆</tspan><tspan class="lang-en">Backend · 158 Memories</tspan></text>
<circle cx="412" cy="142" r="4" fill="#00e676"/><text x="422" y="146" font-size="7" fill="rgba(0,230,118,.7)" font-family="monospace">online</text>
<rect x="270" y="170" width="80" height="13" rx="4" fill="rgba(0,229,255,.06)" stroke="rgba(0,229,255,.1)" stroke-width=".5"/><text x="278" y="180" font-size="6.5" fill="rgba(0,229,255,.6)" font-family="monospace">📤 task_share</text>
<!-- Client C -->
<rect x="480" y="120" width="200" height="70" rx="10" fill="url(#dgCli)" stroke="rgba(177,108,255,.25)" stroke-width="1"/>
<path d="M504 148c-3-1.5-5 0-4 4s3 2 4 0c.8-1.5.8-3 0-4z" fill="url(#dgClaw)"/><path d="M516 148c3-1.5 5 0 4 4s-3 2-4 0c-.8-1.5-.8-3 0-4z" fill="url(#dgClaw)"/>
<circle cx="510" cy="145" r="7" fill="url(#dgClaw)"/><circle cx="507.5" cy="143.5" r="1.2" fill="#050810"/><circle cx="512.5" cy="143.5" r="1.2" fill="#050810"/>
<text x="526" y="148" font-size="10" font-weight="700" fill="#b16cff" font-family="system-ui,sans-serif">OpenClaw C</text>
<text x="526" y="161" font-size="8" fill="rgba(200,210,255,.4)" font-family="system-ui,sans-serif"><tspan class="lang-zh">测试工程 · 89 记忆</tspan><tspan class="lang-en">QA/Testing · 89 Memories</tspan></text>
<circle cx="642" cy="142" r="4" fill="#00e676"/><text x="652" y="146" font-size="7" fill="rgba(0,230,118,.7)" font-family="monospace">online</text>
<rect x="500" y="170" width="80" height="13" rx="4" fill="rgba(0,229,255,.06)" stroke="rgba(0,229,255,.1)" stroke-width=".5"/><text x="508" y="180" font-size="6.5" fill="rgba(0,229,255,.6)" font-family="monospace">⬇ skill_pull</text>
<!-- ...N -->
<rect x="710" y="130" width="56" height="50" rx="10" fill="rgba(99,140,255,.06)" stroke="rgba(99,140,255,.15)" stroke-width="1" stroke-dasharray="4 3"/>
<text x="738" y="153" text-anchor="middle" font-size="16" font-weight="800" fill="rgba(99,140,255,.3)" font-family="system-ui,sans-serif">…N</text>
<text x="738" y="170" text-anchor="middle" font-size="7" fill="rgba(200,210,255,.25)" font-family="system-ui,sans-serif"><tspan class="lang-zh">更多实例</tspan><tspan class="lang-en">More</tspan></text>
<!-- Connections -->
<path d="M340,90 C300,105 170,110 120,118" fill="none" stroke="#00e5ff" stroke-width="1.2" opacity=".5"><animate attributeName="stroke-dasharray" values="0,200;200,0" dur="2s" repeatCount="indefinite"/></path>
<line x1="390" y1="90" x2="350" y2="118" fill="none" stroke="#00e5ff" stroke-width="1.2" opacity=".5"><animate attributeName="stroke-dasharray" values="0,100;100,0" dur="2s" repeatCount="indefinite" begin=".3s"/></line>
<path d="M440,90 C480,105 530,110 580,118" fill="none" stroke="#00e5ff" stroke-width="1.2" opacity=".5"><animate attributeName="stroke-dasharray" values="0,200;200,0" dur="2s" repeatCount="indefinite" begin=".6s"/></path>
<path d="M490,90 C550,100 680,110 710,148" fill="none" stroke="rgba(99,140,255,.2)" stroke-width="1" stroke-dasharray="4 4" opacity=".4"/>
<!-- Particles -->
<circle r="2" fill="#00e5ff" opacity=".6"><animateMotion dur="3s" repeatCount="indefinite" path="M120,170 C170,130 300,100 340,50"/><animate attributeName="opacity" values="0;.8;0" dur="3s" repeatCount="indefinite"/></circle>
<circle r="2" fill="#b16cff" opacity=".6"><animateMotion dur="3s" repeatCount="indefinite" begin="1s" path="M350,170 C360,130 370,100 390,50"/><animate attributeName="opacity" values="0;.8;0" dur="3s" repeatCount="indefinite" begin="1s"/></circle>
<circle r="2" fill="#00e5ff" opacity=".6"><animateMotion dur="3s" repeatCount="indefinite" begin="2s" path="M580,170 C530,130 480,100 440,50"/><animate attributeName="opacity" values="0;.8;0" dur="3s" repeatCount="indefinite" begin="2s"/></circle>
<circle r="1.5" fill="#00e676" opacity=".5"><animateMotion dur="2.5s" repeatCount="indefinite" begin=".5s" path="M440,50 C480,100 530,130 570,170"/><animate attributeName="opacity" values="0;.7;0" dur="2.5s" repeatCount="indefinite" begin=".5s"/></circle>
<circle r="1.5" fill="#ffca28" opacity=".5"><animateMotion dur="2.5s" repeatCount="indefinite" begin="1.5s" path="M340,50 C300,100 170,130 120,170"/><animate attributeName="opacity" values="0;.7;0" dur="2.5s" repeatCount="indefinite" begin="1.5s"/></circle>
</svg>
</div>
<div class="card-grid">
<div class="card"><div class="card-icon">🏗️</div><h4>Hub-Client</h4><p><span class="lang-zh">一个 Hub 存储共享数据,客户端按需查询。角色可动态切换。</span><span class="lang-en">One Hub stores shared data; clients query on demand. Roles switchable dynamically.</span></p></div>
<div class="card"><div class="card-icon">🔌</div><h4><span class="lang-zh">端口自动推导</span><span class="lang-en">Auto Port</span></h4><p><span class="lang-zh">Hub 端口自动从网关端口推导(+11冲突时重试最多 3 次。</span><span class="lang-en">Hub port auto-derived from gateway port (+11); retries up to 3 times on conflict.</span></p></div>
<div class="card"><div class="card-icon"></div><h4><span class="lang-zh">审批流程</span><span class="lang-en">Approval Flow</span></h4><p><span class="lang-zh">新成员提交加入申请,管理员审批后方可访问团队数据。</span><span class="lang-en">New members submit join requests; admin approval required before accessing team data.</span></p></div>
<div class="card"><div class="card-icon">🔔</div><h4><span class="lang-zh">实时通知</span><span class="lang-en">Notifications</span></h4><p><span class="lang-zh">角色变更、资源共享/移除、Hub 上下线等事件即时通知。</span><span class="lang-en">Instant notifications for role changes, resource sharing/removal, Hub status changes.</span></p></div>
</div>
<h3 id="sharing-setup"><span class="lang-zh">配置</span><span class="lang-en">Setup</span></h3>
<h4><span class="lang-zh">启动 Hub团队服务端</span><span class="lang-en">Start a Hub (Team Server)</span></h4>
<pre><code>{
<span class="str">"sharing"</span>: {
<span class="str">"enabled"</span>: <span class="kw">true</span>,
<span class="str">"role"</span>: <span class="str">"hub"</span>,
<span class="str">"hub"</span>: {
<span class="str">"teamName"</span>: <span class="str">"My Team"</span>,
<span class="str">"teamToken"</span>: <span class="str">"${MEMOS_TEAM_TOKEN}"</span>
<span class="cmt">// port auto-derived from gateway; set explicitly only if needed</span>
}
}
}</code><span class="lang">json</span></pre>
<h4><span class="lang-zh">加入 Hub客户端</span><span class="lang-en">Join a Hub (Client)</span></h4>
<pre><code>{
<span class="str">"sharing"</span>: {
<span class="str">"enabled"</span>: <span class="kw">true</span>,
<span class="str">"role"</span>: <span class="str">"client"</span>,
<span class="str">"client"</span>: {
<span class="str">"hubAddress"</span>: <span class="str">"192.168.1.100:18800"</span>
}
}
}</code><span class="lang">json</span></pre>
<div class="callout success"><span class="lang-zh">也可以通过 <strong>Viewer → 设置 → 团队共享</strong> 面板直接配置,无需手动编辑 JSON。</span><span class="lang-en">You can also configure sharing through the <strong>Viewer → Settings → Team Sharing</strong> panel without editing JSON.</span></div>
<h3 id="sharing-admin"><span class="lang-zh">管理员功能</span><span class="lang-en">Admin Features</span></h3>
<table>
<tr><th><span class="lang-zh">功能</span><span class="lang-en">Feature</span></th><th><span class="lang-zh">说明</span><span class="lang-en">Description</span></th></tr>
<tr><td><span class="lang-zh">审批加入</span><span class="lang-en">Approve/Reject</span></td><td><span class="lang-zh">审批或拒绝待审用户</span><span class="lang-en">Approve or reject pending members</span></td></tr>
<tr><td><span class="lang-zh">提升/降级</span><span class="lang-en">Promote/Demote</span></td><td><span class="lang-zh">提升成员为管理员或降级为普通成员;被操作用户收到通知</span><span class="lang-en">Promote members to admin or demote to regular member; affected users receive notifications</span></td></tr>
<tr><td><span class="lang-zh">移除成员</span><span class="lang-en">Remove Member</span></td><td><span class="lang-zh">移除团队成员(带确认弹窗,不可移除自己)</span><span class="lang-en">Remove team members (with confirmation, self-removal prevented)</span></td></tr>
<tr><td><span class="lang-zh">团队概览</span><span class="lang-en">Team Overview</span></td><td><span class="lang-zh">查看团队名称、总成员数、活跃成员数</span><span class="lang-en">View team name, total members, active member count</span></td></tr>
<tr><td><span class="lang-zh">Hub 关闭通知</span><span class="lang-en">Shutdown Notify</span></td><td><span class="lang-zh">关闭 Hub 时自动通知所有客户端</span><span class="lang-en">All clients notified automatically when Hub shuts down</span></td></tr>
</table>
<h3 id="sharing-multi"><span class="lang-zh">多实例部署</span><span class="lang-en">Multi-Instance Deployment</span></h3>
<p><span class="lang-zh">同一台机器上可运行多个 OpenClaw 实例(如个人 + 工作),端口和数据完全隔离:</span><span class="lang-en">Run multiple OpenClaw instances on the same machine (e.g., personal + work) with full isolation:</span></p>
<table>
<tr><th><span class="lang-zh">资源</span><span class="lang-en">Resource</span></th><th><span class="lang-zh">隔离方式</span><span class="lang-en">Isolation</span></th><th><span class="lang-zh">示例</span><span class="lang-en">Example</span></th></tr>
<tr><td>Viewer</td><td><span class="lang-zh">自动推导端口</span><span class="lang-en">Auto-derived port</span></td><td>18799 / 19011</td></tr>
<tr><td>Hub</td><td>gatewayPort + 11</td><td>18800 / 19012</td></tr>
<tr><td>Cookie</td><td><span class="lang-zh">基于端口的唯一名称</span><span class="lang-en">Port-based unique name</span></td><td>memos_session_18799 / memos_session_19011</td></tr>
<tr><td>Database</td><td><span class="lang-zh">独立 state 目录</span><span class="lang-en">Separate state dir</span></td><td>~/.openclaw/memos-local/ / ~/oc-work/memos-local/</td></tr>
</table>
<h3 id="sharing-notif"><span class="lang-zh">通知事件</span><span class="lang-en">Notification Events</span></h3>
<table>
<tr><th><span class="lang-zh">事件</span><span class="lang-en">Event</span></th><th><span class="lang-zh">接收方</span><span class="lang-en">Recipient</span></th></tr>
<tr><td>role_promoted</td><td><span class="lang-zh">被提升的用户</span><span class="lang-en">Promoted user</span></td></tr>
<tr><td>role_demoted</td><td><span class="lang-zh">被降级的用户</span><span class="lang-en">Demoted user</span></td></tr>
<tr><td>resource_shared</td><td><span class="lang-zh">团队成员</span><span class="lang-en">Team members</span></td></tr>
<tr><td>resource_removed</td><td><span class="lang-zh">资源所有者</span><span class="lang-en">Resource owner</span></td></tr>
<tr><td>hub_shutdown</td><td><span class="lang-zh">所有客户端</span><span class="lang-en">All clients</span></td></tr>
<tr><td>member_joined / left</td><td><span class="lang-zh">管理员</span><span class="lang-en">Admin</span></td></tr>
</table>
<h3><span class="lang-zh">团队共享 API 工具</span><span class="lang-en">Team Sharing API Tools</span></h3>
<table>
<tr><th>Tool</th><th><span class="lang-zh">说明</span><span class="lang-en">Description</span></th></tr>
<tr><td><code>task_share</code> / <code>task_unshare</code></td><td><span class="lang-zh">将任务推送到 / 移除出团队</span><span class="lang-en">Push task to / remove from team</span></td></tr>
<tr><td><code>skill_publish</code> / <code>skill_unpublish</code></td><td><span class="lang-zh">发布 / 取消发布技能到团队</span><span class="lang-en">Publish / unpublish skill to team</span></td></tr>
<tr><td><code>network_memory_detail</code></td><td><span class="lang-zh">获取团队记忆完整内容</span><span class="lang-en">Fetch full team memory content</span></td></tr>
<tr><td><code>network_skill_pull</code></td><td><span class="lang-zh">拉取团队技能到本地</span><span class="lang-en">Pull team skill bundle locally</span></td></tr>
<tr><td><code>network_team_info</code></td><td><span class="lang-zh">查看当前团队连接状态</span><span class="lang-en">Show current team connection state</span></td></tr>
</table>
<div class="callout"><span class="lang-zh">完整的团队共享工作流请参阅 <a href="https://github.com/MemTensor/MemOS/blob/main/apps/memos-local-openclaw/HUB-SHARING-GUIDE.md" target="_blank">HUB-SHARING-GUIDE.md</a></span><span class="lang-en">For the complete team sharing workflow, see <a href="https://github.com/MemTensor/MemOS/blob/main/apps/memos-local-openclaw/HUB-SHARING-GUIDE.md" target="_blank">HUB-SHARING-GUIDE.md</a>.</span></div>
</section>
<section id="multi-agent" class="section">
<h2><span class="lang-zh">多智能体协同</span><span class="lang-en">Multi-Agent Collaboration</span></h2>
<p><span class="lang-zh">MemOS 原生支持多 Agent 场景。每个 Agent 的记忆和任务通过 <code>owner</code> 字段隔离(格式 <code>agent:{agentId}</code>),检索时自动过滤为当前 Agent + public。</span><span class="lang-en">MemOS natively supports multi-agent scenarios. Each agent's memories and tasks are isolated via an <code>owner</code> field (<code>agent:{agentId}</code>); retrieval automatically filters to current agent + public.</span></p>
<ul>
<li><span class="lang-zh"><strong>记忆隔离</strong>Agent A 无法检索 Agent B 的私有记忆</span><span class="lang-en"><strong>Memory Isolation</strong>: Agent A cannot retrieve Agent B's private memories</span></li>
<li><span class="lang-zh"><strong>公共记忆</strong>:通过 <code>memory_write_public</code> 写入 owner="public" 的记忆,所有 Agent 可检索</span><span class="lang-en"><strong>Public Memory</strong>: Use <code>memory_write_public</code> to write owner="public" memories discoverable by all agents</span></li>
<li><span class="lang-zh"><strong>技能共享</strong>:通过 <code>skill_publish</code> 将技能设为公开,其他 Agent 可通过 <code>skill_search</code> 发现并安装</span><span class="lang-en"><strong>Skill Sharing</strong>: Use <code>skill_publish</code> to make skills public; other agents discover and install via <code>skill_search</code></span></li>
<li><span class="lang-zh"><strong>技能检索</strong><code>skill_search</code> 支持 scope 参数mix/self/publicFTS + 向量双通道 + RRF 融合 + LLM 相关性判断</span><span class="lang-en"><strong>Skill Discovery</strong>: <code>skill_search</code> supports scope (mix/self/public), FTS + vector dual channel + RRF fusion + LLM relevance judgment</span></li>
</ul>
</section>
<section id="llm-fallback" class="section">
<h2><span class="lang-zh">LLM 降级链</span><span class="lang-en">LLM Fallback Chain</span></h2>
<p><span class="lang-zh">所有 LLM 调用(摘要、话题检测、去重、技能生成/升级)均使用三级自动降级机制:</span><span class="lang-en">All LLM calls (summary, topic detection, dedup, skill generation/upgrade) use a 3-level automatic fallback chain:</span></p>
<div class="diagram"><div class="diagram-flow">
<div class="diagram-box pur">skillSummarizer<span class="diagram-sub lang-zh">技能专用模型(可选)</span><span class="diagram-sub lang-en">Skill-dedicated (optional)</span></div><span class="diagram-arrow"></span>
<div class="diagram-box">summarizer<span class="diagram-sub lang-zh">通用摘要模型</span><span class="diagram-sub lang-en">General summarizer</span></div><span class="diagram-arrow"></span>
<div class="diagram-box grn">OpenClaw Native<span class="diagram-sub lang-zh">从 openclaw.json 读取</span><span class="diagram-sub lang-en">Auto-detected from openclaw.json</span></div>
</div></div>
<ul>
<li><span class="lang-zh">每一级失败后自动尝试下一级,无需手动干预</span><span class="lang-en">Each level auto-falls back to the next on failure, zero manual intervention</span></li>
<li><span class="lang-zh"><code>skillSummarizer</code> 未配置时直接跳到 <code>summarizer</code></span><span class="lang-en">If <code>skillSummarizer</code> is not configured, skips directly to <code>summarizer</code></span></li>
<li><span class="lang-zh">OpenClaw 原生模型从 <code>~/.openclaw/openclaw.json</code><code>agents.defaults.model.primary</code> 自动读取</span><span class="lang-en">OpenClaw native model auto-detected from <code>~/.openclaw/openclaw.json</code><code>agents.defaults.model.primary</code></span></li>
<li><span class="lang-zh">如果所有模型均失败,回退到规则方法(无 LLM或跳过该步骤</span><span class="lang-en">If all models fail, falls back to rule-based methods (no LLM) or skips the step</span></li>
</ul>
</section>
<section id="database" class="section">
<h2><span class="lang-zh">数据库</span><span class="lang-en">Database</span></h2>
<p><code>~/.openclaw/memos-local/memos.db</code>, WAL. Tables: chunks (owner), chunks_fts, embeddings, tasks (owner), skills (owner, visibility), skill_versions, task_skills, skill_embeddings, skills_fts.</p>
</section>
<section id="security" class="section">
<h2><span class="lang-zh">安全</span><span class="lang-en">Security</span></h2>
<p><span class="lang-zh">Viewer 仅 127.0.0.1;密码 SHA-256HttpOnly+SameSite Cookie会话 24h数据仅本地。</span><span class="lang-en">127.0.0.1 only; SHA-256 password; HttpOnly+SameSite; 24h session; data stays local.</span></p>
</section>
<section id="defaults" class="section">
<h2><span class="lang-zh">默认值</span><span class="lang-en">Defaults</span></h2>
<table>
<tr><th><span class="lang-zh">参数</span><span class="lang-en">Parameter</span></th><th><span class="lang-zh">默认</span><span class="lang-en">Default</span></th><th><span class="lang-zh">说明</span><span class="lang-en">Description</span></th></tr>
<tr><td>maxResults</td><td>6 (max 20)</td><td><span class="lang-zh">默认返回数</span><span class="lang-en">Default result count</span></td></tr>
<tr><td>minScore (tool)</td><td>0.45</td><td><span class="lang-zh">memory_search 最低分</span><span class="lang-en">memory_search minimum</span></td></tr>
<tr><td>minScore (viewer)</td><td>0.64</td><td><span class="lang-zh">Viewer 搜索向量阈值</span><span class="lang-en">Viewer search vector threshold</span></td></tr>
<tr><td>rrfK</td><td>60</td><td><span class="lang-zh">RRF 融合常数</span><span class="lang-en">RRF fusion constant</span></td></tr>
<tr><td>mmrLambda</td><td>0.7</td><td><span class="lang-zh">MMR 相关性 vs 多样性</span><span class="lang-en">MMR relevance vs diversity</span></td></tr>
<tr><td>recencyHalfLife</td><td>14d</td><td><span class="lang-zh">时间衰减半衰期</span><span class="lang-en">Recency decay half-life</span></td></tr>
<tr><td>vectorSearchMaxChunks</td><td>0 (all)</td><td><span class="lang-zh">0=搜索全部;大库可设 200k-300k</span><span class="lang-en">0=search all; set 200k-300k for large DBs</span></td></tr>
<tr><td>dedup threshold</td><td>0.75</td><td><span class="lang-zh">语义去重余弦相似度</span><span class="lang-en">Semantic dedup cosine similarity</span></td></tr>
<tr><td>viewerPort</td><td>18799</td><td>Memory Viewer</td></tr>
<tr><td>taskIdle</td><td>2h</td><td><span class="lang-zh">任务空闲超时</span><span class="lang-en">Task idle timeout</span></td></tr>
<tr><td>topicJudgeWarmup</td><td>1</td><td><span class="lang-zh">LLM 话题判断预热(用户消息数)</span><span class="lang-en">LLM topic judge warm-up (user turns)</span></td></tr>
<tr><td>skillMinChunks</td><td>6</td><td><span class="lang-zh">技能评估最小 chunk 数</span><span class="lang-en">Min chunks for skill evaluation</span></td></tr>
<tr><td>importConcurrency</td><td>1 (max 8)</td><td><span class="lang-zh">导入 Agent 并行度</span><span class="lang-en">Import agent parallelism</span></td></tr>
</table>
</section>
<div style="margin-top:60px;padding-top:20px;border-top:1px solid var(--border);text-align:center;color:var(--text-thr);font-size:12px">
<p><img class="logo-dark" src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS" style="width:24px;height:24px;vertical-align:middle"><img class="logo-light" src="https://statics.memtensor.com.cn/logo/color-m.svg" alt="MemOS" style="width:24px;height:24px;vertical-align:middle"> MemOS — OpenClaw Plugin · Docs</p>
<p style="margin-top:4px"><a href="../" class="lang-zh">首页</a><a href="../" class="lang-en">Home</a> · <a href="troubleshooting.html" class="lang-zh">安装排查指南</a><a href="troubleshooting.html" class="lang-en">Troubleshooting</a> · <a href="https://www.npmjs.com/package/@memtensor/memos-local-openclaw-plugin" target="_blank">npm</a> · <a href="https://github.com/MemTensor/MemOS/tree/main/apps/memos-local-openclaw" target="_blank">GitHub</a> · <a href="https://github.com/MemTensor/MemOS/blob/main/LICENSE" target="_blank">MIT</a></p>
</div>
</div>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js" crossorigin></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" crossorigin></script>
<script>
document.addEventListener('DOMContentLoaded',function(){
function tryRender(){if(typeof renderMathInElement==='function'){renderMathInElement(document.body,{delimiters:[{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false});}else{setTimeout(tryRender,200);}}
setTimeout(tryRender,300);
});
</script>
<script>
(function(){
var key='memos-local-lang',lang=(typeof localStorage!=='undefined'&&localStorage.getItem(key))||'zh';
document.body.classList.add('lang-'+lang);
document.querySelectorAll('.lang-btn').forEach(function(btn){
btn.classList.toggle('active',btn.getAttribute('data-lang')===lang);
btn.addEventListener('click',function(){
var L=this.getAttribute('data-lang');document.body.classList.remove('lang-zh','lang-en');document.body.classList.add('lang-'+L);
try{localStorage.setItem(key,L);}catch(e){}
document.querySelectorAll('.lang-btn').forEach(function(b){b.classList.toggle('active',b.getAttribute('data-lang')===L);});
});
});
})();
var MEMOS_THEME_KEY='memos-theme';
function initDocsTheme(){var s=localStorage.getItem(MEMOS_THEME_KEY);document.documentElement.setAttribute('data-theme',(s==='light'||s==='dark')?s:'dark');}
function toggleDocsTheme(){var el=document.documentElement;var n=(el.getAttribute('data-theme')||'dark')==='dark'?'light':'dark';el.setAttribute('data-theme',n);localStorage.setItem(MEMOS_THEME_KEY,n);}
initDocsTheme();
</script>
<script>
(function(){
const links=document.querySelectorAll('.sidebar a'),secs=[];
links.forEach(a=>{const h=a.getAttribute('href');if(h&&h.startsWith('#')){const el=document.getElementById(h.slice(1));if(el)secs.push({el,link:a});}});
function upd(){let c=null;for(const s of secs){if(s.el.getBoundingClientRect().top<=90)c=s;}links.forEach(l=>l.classList.remove('active'));if(c)c.link.classList.add('active');}
window.addEventListener('scroll',upd,{passive:true});upd();
})();
</script>
</body>
</html>