memos/apps/memos-local-plugin/website/docs/index.html

271 lines
28 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 Local Plugin 文档 | OpenClaw / Hermes</title>
<meta name="description" content="MemOS Local Plugin 用户文档:安装 OpenClaw 与 Hermes 适配器、配置本地运行时、理解 Reflect2Evolve 算法、使用 Viewer 排查记忆与技能。">
<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;700&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#06080f;--card:rgba(14,18,32,.72);--card2:rgba(20,26,48,.82);--line:rgba(99,140,255,.12);--line2:rgba(99,140,255,.25);--text:#eef1ff;--muted:rgba(200,210,255,.58);--soft:rgba(160,175,220,.34);--cyan:#00e5ff;--blue:#638cff;--purple:#b16cff;--green:#00e676;--amber:#ffca28;--rose:#ff5f8f;--grad:linear-gradient(135deg,#00e5ff,#638cff,#b16cff);--mono:'JetBrains Mono','SF Mono',ui-monospace,monospace;--font:'Inter',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}
html{scroll-behavior:smooth;scroll-padding-top:86px}
body{font-family:var(--font);background:var(--bg);color:var(--text);line-height:1.72;font-size:15px;overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;z-index:0;pointer-events:none;background-image:linear-gradient(rgba(99,140,255,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(99,140,255,.03) 1px,transparent 1px);background-size:60px 60px}
body::after{content:'';position:fixed;inset:-20% -10%;z-index:0;pointer-events:none;background:radial-gradient(circle at 12% 0,rgba(0,229,255,.10),transparent 28%),radial-gradient(circle at 86% 12%,rgba(177,108,255,.09),transparent 30%),radial-gradient(circle at 50% 80%,rgba(255,60,172,.04),transparent 34%)}
a{color:var(--cyan);text-decoration:none;transition:all .2s}a:hover{color:var(--text);text-decoration:none}
.top{position:fixed;inset:0 0 auto 0;height:60px;z-index:30;display:flex;align-items:center;gap:14px;padding:0 24px;border-bottom:1px solid var(--line);background:rgba(6,8,15,.76);backdrop-filter:blur(24px) saturate(1.4)}
.brand{display:flex;align-items:center;gap:10px;color:var(--text);font-weight:800;font-size:17px;letter-spacing:-.02em;text-decoration:none}.brand:hover{color:var(--text);text-decoration:none}.brand img{width:36px;height:36px}.brand .sub,.brand small{display:block;color:var(--muted);font-size:10px;font-weight:400;line-height:1.1}
.top nav{margin-left:auto;display:flex;gap:4px;align-items:center}.top nav a,.lang button{color:var(--muted);font-size:13px;font-weight:600;padding:6px 12px;border-radius:8px;border:1px solid transparent;background:transparent;cursor:pointer}.top nav a:hover,.lang button.active{background:rgba(99,140,255,.08);border-color:var(--line);color:var(--text);text-decoration:none}
.lang{display:flex;gap:2px;margin-left:8px;padding:2px;border:1px solid var(--line);border-radius:8px;background:rgba(99,140,255,.04)}
.layout{position:relative;z-index:1;display:grid;grid-template-columns:268px minmax(0,960px);gap:40px;align-items:start;margin-top:60px;padding:44px clamp(16px,2vw,32px) 96px;max-width:none;margin-left:0;margin-right:0}
.sidebar{position:sticky;top:84px;border:1px solid var(--line);background:rgba(14,18,32,.62);border-radius:18px;padding:16px;max-height:calc(100vh - 104px);overflow:auto;backdrop-filter:blur(12px);box-shadow:0 10px 40px rgba(0,0,0,.28)}
.side-title{color:var(--soft);font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.12em;margin:14px 8px 8px}.side-title:first-child{margin-top:0}
.sidebar a{display:block;padding:7px 9px;border-radius:10px;color:var(--muted);font-size:13px;font-weight:650}.sidebar a:hover{background:rgba(99,140,255,.08);color:var(--text);text-decoration:none}
main{min-width:0}.hero{padding:42px 0 34px}.badge{display:inline-flex;gap:8px;align-items:center;border:1px solid rgba(0,229,255,.2);background:rgba(0,229,255,.06);color:var(--cyan);border-radius:24px;padding:6px 18px;font-size:12px;font-weight:700;backdrop-filter:blur(8px)}h1{font-size:clamp(40px,6vw,72px);font-weight:900;line-height:1.05;letter-spacing:-.055em;margin:18px 0;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}.lead{font-size:18px;color:var(--muted);max-width:820px;line-height:1.85}
section{border-top:1px solid var(--line);padding:50px 0}h2{font-size:clamp(28px,4vw,44px);font-weight:900;letter-spacing:-.04em;line-height:1.1;margin-bottom:14px}h3{font-size:20px;font-weight:800;margin:28px 0 8px}h4{font-size:15px;color:var(--text);margin:20px 0 8px}p{color:var(--muted);margin:8px 0 12px}ul,ol{padding-left:22px;color:var(--muted);margin:10px 0 16px}li{margin:5px 0}
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:20px 0}.card{border:1px solid var(--line);background:var(--card);border-radius:16px;padding:20px;backdrop-filter:blur(12px);transition:all .25s;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--grad);opacity:0;transition:opacity .25s}.card:hover{border-color:var(--line2);background:var(--card2);transform:translateY(-3px);box-shadow:0 0 30px rgba(0,229,255,.11)}.card:hover::before{opacity:1}.card b{display:block;color:var(--text);font-size:16px;margin-bottom:6px}.card p{font-size:13px;margin:0}
pre{position:relative;overflow:auto;background:rgba(10,14,28,.86);border:1px solid var(--line);border-radius:16px;padding:18px;color:#d4ddff;font-family:var(--mono);font-size:13px;line-height:1.7;margin:14px 0 20px;backdrop-filter:blur(12px);box-shadow:0 10px 40px rgba(0,0,0,.24)}code{font-family:var(--mono);font-size:.9em;color:#aefbf0;background:rgba(0,229,255,.08);border:1px solid rgba(0,229,255,.12);border-radius:5px;padding:1px 5px}pre code{background:transparent;border:0;padding:0;color:inherit}.c{color:rgba(212,221,255,.42)}.s{color:#00e676}.k{color:#00e5ff}.n{color:#ffca28}
table{width:100%;border-collapse:collapse;margin:16px 0 24px;border:1px solid var(--line);border-radius:16px;overflow:hidden;display:table;background:rgba(14,18,32,.5);backdrop-filter:blur(12px)}th,td{padding:11px 13px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}th{background:rgba(99,140,255,.08);color:var(--text);font-size:13px}td{color:var(--muted);font-size:13px}tr:last-child td{border-bottom:0}
.callout{border:1px solid rgba(0,229,255,.22);background:rgba(0,229,255,.07);border-radius:16px;padding:15px 17px;color:var(--muted);margin:16px 0;backdrop-filter:blur(10px)}.callout.warn{border-color:rgba(255,202,40,.25);background:rgba(255,202,40,.07)}.callout strong{color:var(--text)}
.diagram{display:grid;grid-template-columns:repeat(7,minmax(110px,1fr));gap:8px;margin:20px 0;overflow:auto}.box{border:1px solid var(--line);background:var(--card);border-radius:14px;padding:12px;text-align:center;min-height:82px;display:flex;align-items:center;justify-content:center;flex-direction:column;color:var(--text);font-weight:850;backdrop-filter:blur(12px)}.box small{display:block;color:var(--soft);font-weight:650;margin-top:4px}.arrow{display:flex;align-items:center;justify-content:center;color:var(--soft)}
.lang-en{display:none}body.en .lang-zh{display:none!important}body.en .lang-en{display:initial!important}
@media(max-width:980px){.layout{grid-template-columns:1fr}.sidebar{position:relative;top:auto;max-height:none}.cards{grid-template-columns:1fr 1fr}.top nav a{display:none}}
@media(max-width:640px){.layout{padding:30px 16px 70px}.cards{grid-template-columns:1fr}.diagram{grid-template-columns:1fr}.arrow{display:none}table{display:block;overflow:auto}.brand .sub,.brand small{display:none}.brand img{width:32px;height:32px}h1{font-size:38px}}
.site-footer{position:relative;z-index:1;border-top:1px solid var(--line);padding:36px 0;background:rgba(6,8,15,.6)}
.site-footer .inner{max-width:1200px;margin:0 auto;padding:0 24px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:14px}
.site-footer .brand-foot{display:flex;align-items:center;gap:8px;color:var(--muted);font-weight:700;font-size:13px}
.site-footer .brand-foot img{width:28px;height:28px}
.site-footer .links{display:flex;gap:20px;flex-wrap:wrap}
.site-footer .links a{color:var(--soft);font-size:12px;text-decoration:none}
.site-footer .links a:hover{color:var(--cyan)}
.site-footer .copy{color:var(--soft);font-size:10px;width:100%;text-align:center;margin-top:12px}
</style>
</head>
<body>
<header class="top">
<a class="brand" href="../index.html"><img src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS"><span>MemOS<span class="sub lang-zh">本地插件文档</span><span class="sub lang-en">Local Plugin Docs</span></span></a>
<nav>
<a href="../index.html"><span class="lang-zh">首页</span><span class="lang-en">Home</span></a>
<a href="#quickstart"><span class="lang-zh">安装</span><span class="lang-en">Install</span></a>
<a href="#algorithm"><span class="lang-zh">算法</span><span class="lang-en">Algorithm</span></a>
<a href="troubleshooting.html"><span class="lang-zh">排查</span><span class="lang-en">Troubleshooting</span></a>
</nav>
<div class="lang"><button type="button" data-lang="zh" class="active"></button><button type="button" data-lang="en">EN</button></div>
</header>
<div class="layout">
<aside class="sidebar">
<div class="side-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="#quickstart"><span class="lang-zh">快速开始</span><span class="lang-en">Quick Start</span></a>
<a href="#runtime"><span class="lang-zh">运行时路径</span><span class="lang-en">Runtime Paths</span></a>
<div class="side-title"><span class="lang-zh">架构</span><span class="lang-en">Architecture</span></div>
<a href="#architecture"><span class="lang-zh">分层架构</span><span class="lang-en">Layers</span></a>
<a href="#algorithm"><span class="lang-zh">Reflect2Evolve</span><span class="lang-en">Reflect2Evolve</span></a>
<a href="#retrieval"><span class="lang-zh">三层检索</span><span class="lang-en">Retrieval</span></a>
<div class="side-title"><span class="lang-zh">使用</span><span class="lang-en">Usage</span></div>
<a href="#viewer">Viewer</a>
<a href="#config"><span class="lang-zh">配置</span><span class="lang-en">Config</span></a>
<a href="#api">HTTP / Events</a>
<a href="#security"><span class="lang-zh">安全</span><span class="lang-en">Security</span></a>
<a href="troubleshooting.html"><span class="lang-zh">安装排查</span><span class="lang-en">Troubleshooting</span></a>
</aside>
<main>
<div class="hero" id="overview">
<div class="badge"><span class="lang-zh">用户文档</span><span class="lang-en">User Docs</span> · @memtensor/memos-local-plugin</div>
<h1><span class="lang-zh">OpenClaw 与 Hermes 的本地进化记忆系统</span><span class="lang-en">Local evolving memory for OpenClaw and Hermes</span></h1>
<p class="lead"><span class="lang-zh">MemOS Local Plugin 提供一个 agent-agnostic 的算法核心和两个宿主适配器。OpenClaw 使用进程内 TypeScript 插件Hermes 使用 Python MemoryProvider + JSON-RPC bridge两者共享同一套 L1/L2/L3/Skill 算法,但运行时数据完全隔离。</span><span class="lang-en">MemOS Local Plugin ships one agent-agnostic core with two host adapters. OpenClaw uses an in-process TypeScript plugin; Hermes uses a Python MemoryProvider and JSON-RPC bridge. Both share the same L1/L2/L3/Skill algorithm while keeping runtime data isolated.</span></p>
</div>
<section id="quickstart">
<h2><span class="lang-zh">快速开始</span><span class="lang-en">Quick Start</span></h2>
<p><span class="lang-zh">安装器支持 macOS / Linux / Windows会自动检查 Node.js 20+、下载 npm 包、重建原生依赖、写入 <code>config.yaml</code>,并按需启动宿主运行时。</span><span class="lang-en">The installer supports macOS/Linux/Windows. It checks Node.js 20+, downloads the npm package, rebuilds native dependencies, writes <code>config.yaml</code>, and starts the host runtime when needed.</span></p>
<p><strong><span class="lang-zh">macOS / Linux</span><span class="lang-en">macOS / Linux:</span></strong></p>
<pre><code><span class="c"># Latest from the repository</span>
curl -fsSL https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.sh | bash</code></pre>
<p><strong><span class="lang-zh">Windows (PowerShell)</span><span class="lang-en">Windows (PowerShell):</span></strong></p>
<pre><code><span class="c"># Latest from the repository</span>
irm https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.ps1 | iex</code></pre>
<p><span class="lang-zh">从源码目录安装或测试指定版本:</span><span class="lang-en">Install from a source checkout or test a specific version:</span></p>
<pre><code>cd apps/memos-local-plugin
bash install.sh --version 2.0.0-beta.11
<span class="c"># Or test a local package before publishing</span>
npm pack
bash install.sh --version ./memtensor-memos-local-plugin-*.tgz</code></pre>
<div class="callout warn"><strong><span class="lang-zh">注意:</span><span class="lang-en">Note:</span></strong> <span class="lang-zh">新版安装器不再支持 <code>--port</code>。OpenClaw 固定使用 <code>18799</code>Hermes 固定使用 <code>18800</code>,避免两个宿主共享一个 UI 导致写入归属不清。</span><span class="lang-en">The new installer no longer supports <code>--port</code>. OpenClaw owns <code>18799</code>; Hermes owns <code>18800</code>, avoiding ambiguous writes across hosts.</span></div>
</section>
<section id="runtime">
<h2><span class="lang-zh">运行时路径</span><span class="lang-en">Runtime Paths</span></h2>
<table>
<tr><th>Agent</th><th><span class="lang-zh">代码安装位置</span><span class="lang-en">Code Installed To</span></th><th><span class="lang-zh">数据与配置</span><span class="lang-en">Data and Config</span></th><th>Viewer</th></tr>
<tr><td>OpenClaw</td><td><code>~/.openclaw/extensions/memos-local-plugin/</code></td><td><code>~/.openclaw/memos-plugin/</code></td><td><code>http://127.0.0.1:18799</code></td></tr>
<tr><td>Hermes</td><td><code>~/.hermes/memos-plugin/</code></td><td><code>~/.hermes/memos-plugin/</code></td><td><code>http://127.0.0.1:18800</code></td></tr>
</table>
<p><span class="lang-zh">运行时目录包含:</span><span class="lang-en">Each runtime directory contains:</span></p>
<pre><code>config.yaml <span class="c"># only config file; chmod 600, secrets live here</span>
data/memos.db <span class="c"># SQLite: sessions, episodes, traces, policies, world, skills, feedback</span>
skills/ <span class="c"># crystallized skill packages</span>
logs/ <span class="c"># memos.log, error.log, audit.log, llm.jsonl, perf.jsonl, events.jsonl</span>
daemon/ <span class="c"># bridge pid/port files, mostly for Hermes</span></code></pre>
<div class="callout"><span class="lang-zh">升级或卸载插件不会删除 <code>data/</code><code>skills/</code><code>logs/</code><code>config.yaml</code></span><span class="lang-en">Upgrade and uninstall flows do not remove <code>data/</code>, <code>skills/</code>, <code>logs/</code>, or <code>config.yaml</code>.</span></div>
</section>
<section id="architecture">
<h2><span class="lang-zh">分层架构</span><span class="lang-en">Layered Architecture</span></h2>
<div class="diagram">
<div class="box">Agent Host<small>OpenClaw / Hermes</small></div><div class="arrow"></div>
<div class="box">Adapter<small>TS / Python</small></div><div class="arrow"></div>
<div class="box">agent-contract<small>DTO / events / JSON-RPC</small></div><div class="arrow"></div>
<div class="box">core<small>algorithm + storage</small></div>
</div>
<div class="cards">
<div class="card"><b>OpenClaw</b><p><span class="lang-zh">标准 OpenClaw 插件,入口、工具和 hooks 直接调用 core。</span><span class="lang-en">Standard OpenClaw plugin entry, tools, and hooks calling core directly.</span></p></div>
<div class="card"><b>Hermes</b><p><span class="lang-zh">Python MemoryProvider 通过 bridge.cts 的 JSON-RPC 方法代理到 core。</span><span class="lang-en">Python MemoryProvider proxies to core through bridge.cts JSON-RPC methods.</span></p></div>
<div class="card"><b>Viewer</b><p><span class="lang-zh">由 server/ 提供 <code>/api/v1/*</code> HTTP + SSE读取 core 的可观察事件和 SQLite 状态。</span><span class="lang-en"><code>/api/v1/*</code> HTTP + SSE served by server/, reading core events and SQLite state.</span></p></div>
</div>
</section>
<section id="algorithm">
<h2>Reflect2Evolve</h2>
<p><span class="lang-zh">新版算法把记忆拆成四个互相反馈的层级,并用 step-level 与 task-level 两类反馈持续更新。</span><span class="lang-en">The new algorithm splits memory into four cooperating layers and continuously updates them from step-level and task-level feedback.</span></p>
<table>
<tr><th><span class="lang-zh">层级</span><span class="lang-en">Layer</span></th><th><span class="lang-zh">内容</span><span class="lang-en">What It Stores</span></th><th><span class="lang-zh">价值</span><span class="lang-en">Why It Matters</span></th></tr>
<tr><td>L1 trace</td><td><span class="lang-zh">每一步 action、observation、reflection、value。</span><span class="lang-en">Step action, observation, reflection, and value.</span></td><td><span class="lang-zh">保留可验证证据,支撑后续归纳。</span><span class="lang-en">Grounded evidence for later induction.</span></td></tr>
<tr><td>L2 policy</td><td><span class="lang-zh">跨任务归纳出的 trigger、procedure、verification、boundary。</span><span class="lang-en">Induced trigger, procedure, verification, and boundary.</span></td><td><span class="lang-zh">把重复成功经验变成策略。</span><span class="lang-en">Turns repeated success into strategy.</span></td></tr>
<tr><td>L3 world model</td><td><span class="lang-zh">从 L2 + L1 压缩出的环境认知。</span><span class="lang-en">Environmental cognition compressed from L2 + L1.</span></td><td><span class="lang-zh">让 agent 知道项目长期规律。</span><span class="lang-en">Gives the agent long-term project context.</span></td></tr>
<tr><td>Skill</td><td><span class="lang-zh">可调用的 invocation guide 与 procedure。</span><span class="lang-en">Callable invocation guide and procedure.</span></td><td><span class="lang-zh">把成熟策略结晶成可复用能力。</span><span class="lang-en">Crystallizes mature policies into reusable capabilities.</span></td></tr>
</table>
<h3><span class="lang-zh">奖励回传</span><span class="lang-en">Reward Backpropagation</span></h3>
<pre><code>V_T = R_human
V_t = alpha_t * R + (1 - alpha_t) * gamma * V_{t+1}
priority = value * time_decay</code></pre>
<p><span class="lang-zh">显式反馈、隐式结果和反思质量共同影响 trace 的价值L2 候选池、L3 抽象和 Skill 生命周期都依赖这些信号。</span><span class="lang-en">Explicit feedback, implicit outcomes, and reflection quality all affect trace value. L2 candidates, L3 abstractions, and Skill lifecycle decisions depend on these signals.</span></p>
</section>
<section id="retrieval">
<h2><span class="lang-zh">三层检索</span><span class="lang-en">Three-Tier Retrieval</span></h2>
<ol>
<li><strong>Tier 1 — Skill:</strong> <span class="lang-zh">优先找到可直接调用的技能和 invocation guide。</span><span class="lang-en">Find callable skills and invocation guides first.</span></li>
<li><strong>Tier 2 — Trace + Episode:</strong> <span class="lang-zh">检索具体证据、任务片段和历史操作。</span><span class="lang-en">Retrieve concrete evidence, task slices, and historical actions.</span></li>
<li><strong>Tier 3 — World Model:</strong> <span class="lang-zh">补充项目级、环境级、长期约束级认知。</span><span class="lang-en">Add project-level, environment-level, long-term cognition.</span></li>
</ol>
<p><span class="lang-zh">检索入口包括 turn start、tool-driven、skill invoke、sub-agent 和 repair。结果通过 RRF 融合、MMR 去冗余,再形成注入包。</span><span class="lang-en">Entry points include turn start, tool-driven retrieval, skill invoke, sub-agent, and repair. Results are fused with RRF, diversified with MMR, and packed into an injection packet.</span></p>
</section>
<section id="viewer">
<h2>Viewer</h2>
<div class="cards">
<div class="card"><b>Overview</b><p>KPIs, health, recent events.</p></div>
<div class="card"><b>Traces</b><p>L1 search, value, alpha, feedback.</p></div>
<div class="card"><b>Policies</b><p>L2 candidates, support, gain, status.</p></div>
<div class="card"><b>World Model</b><p>L3 abstractions and source policies.</p></div>
<div class="card"><b>Skills</b><p>Skill lifecycle, eta, invocation guide.</p></div>
<div class="card"><b>Retrieval</b><p>Three-tier preview and debug panel.</p></div>
<div class="card"><b>Admin / Hub</b><p>Optional team-sharing settings surface.</p></div>
<div class="card"><b>Logs</b><p>Channelled logs, tail, filters.</p></div>
<div class="card"><b>Settings</b><p>Redacted config editor.</p></div>
</div>
</section>
<section id="config">
<h2><span class="lang-zh">配置</span><span class="lang-en">Configuration</span></h2>
<p><span class="lang-zh"><code>config.yaml</code> 是唯一配置文件,敏感字段也写在这里,并由安装器设置为 <code>chmod 600</code>。也可以在 Viewer 的 Settings 页面编辑。</span><span class="lang-en"><code>config.yaml</code> is the only config file. Secrets live there too, and the installer sets <code>chmod 600</code>. You can also edit it in Viewer Settings.</span></p>
<h3>OpenClaw</h3>
<pre><code>version: 1
viewer:
port: 18799
embedding:
provider: local
apiKey: ""
llm:
provider: host
apiKey: ""
model: ""
hub:
enabled: false
telemetry:
enabled: true
logging:
level: info
detailedView: false</code></pre>
<h3>Hermes</h3>
<pre><code>version: 1
viewer:
port: 18800
embedding:
provider: local
apiKey: ""
llm:
provider: openai_compatible
apiKey: "" <span class="c"># required for Hermes unless you choose another real provider</span>
model: ""
hub:
enabled: false
telemetry:
enabled: true
logging:
level: info
detailedView: false</code></pre>
<table>
<tr><th><span class="lang-zh">配置块</span><span class="lang-en">Block</span></th><th><span class="lang-zh">支持值</span><span class="lang-en">Supported Values</span></th></tr>
<tr><td><code>embedding.provider</code></td><td><code>local</code>, <code>openai_compatible</code>, <code>gemini</code>, <code>cohere</code>, <code>voyage</code>, <code>mistral</code></td></tr>
<tr><td><code>llm.provider</code></td><td><code>host</code>, <code>local_only</code>, <code>openai_compatible</code>, <code>anthropic</code>, <code>gemini</code>, <code>bedrock</code></td></tr>
<tr><td><code>logging.level</code></td><td><code>trace</code>, <code>debug</code>, <code>info</code>, <code>warn</code>, <code>error</code>, <code>fatal</code></td></tr>
</table>
</section>
<section id="api">
<h2>HTTP / Events</h2>
<table>
<tr><th>Endpoint</th><th><span class="lang-zh">用途</span><span class="lang-en">Purpose</span></th></tr>
<tr><td><code>GET /api/v1/health</code></td><td><span class="lang-zh">版本、路径与健康状态。</span><span class="lang-en">Version, paths, and health.</span></td></tr>
<tr><td><code>GET /api/v1/auth/status</code> / <code>POST /api/v1/auth/login</code></td><td><span class="lang-zh">Viewer 会话认证。</span><span class="lang-en">Viewer session authentication.</span></td></tr>
<tr><td><code>GET /api/v1/traces</code></td><td><span class="lang-zh">L1 trace 列表。</span><span class="lang-en">L1 trace list.</span></td></tr>
<tr><td><code>GET /api/v1/policies</code></td><td><span class="lang-zh">L2 policy 列表。</span><span class="lang-en">L2 policy list.</span></td></tr>
<tr><td><code>GET /api/v1/world-models</code></td><td><span class="lang-zh">L3 world model 列表。</span><span class="lang-en">L3 world-model list.</span></td></tr>
<tr><td><code>GET /api/v1/skills</code></td><td><span class="lang-zh">Skill 列表与生命周期。</span><span class="lang-en">Skill list and lifecycle.</span></td></tr>
<tr><td><code>POST /api/v1/feedback</code></td><td><span class="lang-zh">显式反馈写入。</span><span class="lang-en">Explicit feedback write.</span></td></tr>
<tr><td><code>GET /api/v1/memory/search</code> / <code>POST /api/v1/memory/search</code></td><td><span class="lang-zh">三层检索。</span><span class="lang-en">Three-tier retrieval.</span></td></tr>
<tr><td><code>GET /api/v1/logs/tail</code></td><td><span class="lang-zh">查看最近日志。</span><span class="lang-en">Tail recent logs.</span></td></tr>
<tr><td><code>GET /api/v1/events</code> / <code>GET /api/v1/logs</code></td><td><span class="lang-zh">CoreEvent 与日志行的 SSE 流。</span><span class="lang-en">SSE streams for CoreEvents and log records.</span></td></tr>
</table>
</section>
<section id="security">
<h2><span class="lang-zh">安全与本地优先</span><span class="lang-en">Security and Local-First</span></h2>
<ul>
<li><span class="lang-zh">数据库、技能包、日志和配置默认都在 <code>~/.&lt;agent&gt;/memos-plugin/</code></span><span class="lang-en">Database, skills, logs, and config live under <code>~/.&lt;agent&gt;/memos-plugin/</code>.</span></li>
<li><span class="lang-zh">API key 不进入源码目录,不写入 URL由 config loader 与 logger 做脱敏。</span><span class="lang-en">API keys never enter the source directory or URLs; config loading and logging redact secrets.</span></li>
<li><span class="lang-zh">Viewer 默认绑定本机地址,每个宿主独立端口,避免跨宿主误写。</span><span class="lang-en">Viewer binds locally by default; each host has an independent port to avoid cross-host writes.</span></li>
<li><span class="lang-zh">遥测为匿名使用事件,可随时在配置中关闭。</span><span class="lang-en">Telemetry is anonymous usage events and can be disabled in config.</span></li>
</ul>
</section>
</main>
</div>
<footer class="site-footer">
<div class="inner">
<div class="brand-foot"><img src="https://statics.memtensor.com.cn/logo/white-memos.svg" alt="MemOS"> MemOS</div>
<div class="links">
<a href="../index.html"><span class="lang-zh">首页</span><span class="lang-en">Home</span></a>
<a href="index.html"><span class="lang-zh">文档</span><span class="lang-en">Docs</span></a>
<a href="troubleshooting.html"><span class="lang-zh">排查</span><span class="lang-en">Troubleshooting</span></a>
<a href="https://www.npmjs.com/package/@memtensor/memos-local-plugin" target="_blank" rel="noopener">npm</a>
<a href="https://github.com/MemTensor/MemOS/tree/main/apps/memos-local-plugin" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/MemTensor/MemOS/blob/main/LICENSE" target="_blank" rel="noopener">MIT</a>
</div>
<div class="copy">© 2026 MemTensor. MemOS Local Plugin.</div>
</div>
</footer>
<script>
(function(){
var key='memos-site-lang';
var saved=localStorage.getItem(key)||'zh';
function setLang(lang){
document.body.classList.toggle('en',lang==='en');
document.documentElement.lang=lang==='en'?'en':'zh-CN';
localStorage.setItem(key,lang);
document.querySelectorAll('[data-lang]').forEach(function(btn){btn.classList.toggle('active',btn.getAttribute('data-lang')===lang);});
}
document.querySelectorAll('[data-lang]').forEach(function(btn){btn.addEventListener('click',function(){setLang(btn.getAttribute('data-lang'));});});
setLang(saved);
})();
</script>
</body>
</html>