关于 Leteo
Leteo 是面向编码 Agent 的持久记忆工具,将项目决策、修复和约定保存在本地 SQLite 数据库中。它以单个二进制文件运行,可在不同会话间提供相关笔记;指定项目后也可选择云端复制。
主要功能
- 01跨会话保存项目知识
- 02按含义或词语检索记忆
- 03将数据存入本地 SQLite 数据库
- 04配置受支持的编码 Agent
- 05查看、导出或删除已存记忆
适用场景
- 01在新会话中沿用项目约定
- 02编码时找回先前的缺陷修复
- 03向 Agent 提供持久项目上下文
MCP 相关
Leteo 通过 MCP 服务向编码 Agent 提供记忆工具。其 setup 命令可为受支持的 Agent 写入 MCP 配置项。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Leteo — AI 编码 Agent 的持久记忆
编码 Agent 会在会话结束时忘记一切,在上下文压缩时也会忘掉大部分内容。Leteo 就是它能保留下来的记忆:决策、错误修复、约定,以及那些代价高昂才得出的发现。它们存储在本地 SQLite 数据库中,并会在相关时提供给 Agent。
一个二进制文件,无需服务,也无需 API 密钥。除非你为指定的项目启用云端复制,否则任何内容都不会离开你的设备。
与自身对比的实测结果——同一个 Agent、同一组问题,分别在使用和未使用 Leteo 的情况下测试:
四次全部答对,而未使用 Leteo 的 Agent 三次都没答对。 这是经受住了结果波动考验的发现,令牌数则是其中更不稳定的一半。这里列出了每次运行——包括两组基线、每次会话约 15,400 个令牌的固定成本(两组都要支付),以及根据这七次相同运行的配对结果得出的结论:Leteo 成本高出 3.7 倍。
适用于: Claude Code · ZCode · Codex · Cursor · Gemini CLI · OpenCode · Windsurf · VS Code Copilot · Kilo Code · Qwen · Kiro · Antigravity · Pi · DeepSeek Harness · Command Code
使用体验
你不需要提示它记住任何内容。这正是设计的核心。每次会话开始时,Agent 就已掌握项目的已有知识,并在你工作时持续保存内容——修复的错误、达成的约定、学到的非显而易见的信息。这些笔记是写给未来的它自己的,而不是写给你的,因此不会出现在对话中。

其余内容都保存在你拥有的 SQLite 文件中。leteo tui 会打开它,leteo export 可将其带走,而 leteo delete 则表示删除它。

它值得吗?
不是凭空断言,而是基于 13 次运行的测量结果:对于代码无法回答的问题,4 次都答对了;而没有它的 Agent 在 3 次中一次也没答对——或者按严格协议比较,4 次中答对 3 次,对照组仍然是 3 次中一次也没答对。这是在结果存在差异的情况下仍然成立的结论。
令牌数据的噪声更大。对于同一批问题,节省量的中位数为 27%,最佳情况为 70%——或者,如果剔除那次提示词与其他情况只差一个字段的运行(文章替你做了这件事),则分别是 17% 和 44%。对于代码能够回答的问题,差异处于噪声范围内;同样的 13 次运行也支持 “成本高出 3.7 倍” 这种说法,只要挑选相反的一组数据。
记忆能节省令牌吗?展示了每次运行、两种基线、每个会话约 15,400 个令牌的固定成本,以及数据中不够可靠的部分。坦诚地说,它并不能稳定地帮你节省令牌——它能避免 Agent 自信满满地答非所问。
安装
# Linux and macOS
curl -fsSL https://raw.githubusercontent.com/asanabrial/leteo/main/scripts/install.sh | sh
# Windows
irm https://raw.githubusercontent.com/asanabrial/leteo/main/scripts/install.ps1 | iex
或者,如果你已经用包管理器统一管理工具,也可以通过包管理器安装。Homebrew 支持 macOS 和 Linux,且支持这两种架构:
brew tap asanabrial/leteo && brew install leteo
# Windows
scoop bucket add leteo https://github.com/asanabrial/scoop-leteo
scoop install leteo
# Windows, through winget
winget install asanabrial.leteo
winget 会将每个版本作为拉取请求提交,由维护者审核,因此新版本可能会比其他渠道晚一两天上线。
# Anywhere with Node, if that is what you already have
npm install -g @asanabrial/leteo
最后一种方式会将 leteo 放到你的 PATH 中,以便在命令行中使用。但它是唯一一种无法配置 Agent 的方式:如果 leteo 是由 npm 持有的二进制文件,leteo setup 就会拒绝运行,因为它要写入的路径会被 npm 删除。请改用这条 npx 命令配置 Agent,或者通过上述任一方式安装。
然后打开 Leteo,在 Setup 屏幕中设置你的 Agent:
leteo tui
就这些。无需预先安装其他任何东西——不需要 Rust、SQLite 或运行时:压缩包中包含预构建的二进制文件,且已编译内置 SQLite;每个脚本都会在安装任何内容前,使用已发布的 SHA256SUMS 校验下载文件。从脚本安装时,二进制文件会放在 ~/.local/bin 中;Windows 上则会放在 %LOCALAPPDATA%\leteo\bin 中——Homebrew、Scoop 和 winget 会将它放在各自通常使用的位置。LETEO_INSTALL_DIR 可更改安装目录,LETEO_VERSION 可指定最新版本以外的标签,LETEO_BASE_URL 可将下载来源改为 GitHub releases 以外的位置。这三个变量属于脚本,而非二进制文件,因此没有列在环境变量表格中。
每个发行版本都包含 5 种构建:x86-64 Linux、Windows 和 macOS,以及 arm64 Linux 和 macOS。两个 Linux 版本所需的 glibc 不高于 2.34,因此可在 Debian 12、Ubuntu 22.04、RHEL 9 及更高版本上运行。这个最低版本由发行工作流固定,而不是继承自 GitHub 标记为 latest 的镜像:v0.1.0 继承了该镜像的版本,其要求高于 Debian stable 提供的 glibc。Windows 版本要求 Windows 10 或更高版本,无需预先安装任何内容:其 C 运行时已链接到二进制文件中,因此连 Visual C++ Redistributable 也不需要。其他系统上则需要从源代码构建,这是唯一需要 Rust 的安装方式:
cargo install leteo
这会从 crates.io 构建已发布的版本。cargo binstall leteo 会获取相同的发行版二进制文件,而不是编译它,这样上面那句话就能省下一半时间。若要改为构建 main 上的内容(包括尚未发布的工作),请从仓库安装:cargo install --git https://github.com/asanabrial/leteo。
构建自己的工作副本
若要安装工作副本中的内容,请在任意目录中运行适用于你系统的脚本:
# Linux and macOS
scripts/build-install.sh
# Windows
scripts\build-install.ps1
脚本需要 rustup 和 cargo;如果缺少 Rust 1.97.0 工具链,则会安装它,然后使用 --locked 以发布模式构建,并安装到 Cargo 自己的根目录中——依次为 CARGO_INSTALL_ROOT、CARGO_HOME,再到 ~/.cargo——而绝不会安装到发布版安装程序使用的目录,因此从源代码构建不会覆盖发布版安装。接着,它会安装检出目录中 assets/model/ 下的模型(未发布的构建没有可供下载模型的发布标签),为已配置 Leteo 的每个 Agent 再次运行 setup,最后运行 doctor。这里的 setup 只会写入 MCP 条目,因为二进制文件移至新路径后,这正是需要更新的内容;它还会将该条目的 --tools 和 --project 重置为默认值,因此手动编辑过的条目需要重新编辑。如果需要,可自行在 Agent 中添加 --instructions 或 --hooks。尚未配置 Leteo 的 Agent 不会受到影响;可通过 leteo setup <agent> 添加。将 LETEO_SETUP_AGENTS 设为空格分隔的 Agent 名称列表,即可只设置指定的 Agent;单独设为 none,则不设置任何 Agent;为空或仅含空白字符时,表示未设置。任何步骤失败都会使脚本以非零状态退出,并指出失败的命令。若要在不触碰自己的数据存储或 Agent 文件的情况下试用,可将 HOME、CARGO_INSTALL_ROOT 和 LETEO_DATA_DIR 指向临时目录。
搜索模型
语义搜索可处理与目标记忆没有任何共同词语的问题。它会读取一个 13 MB 的模型,该模型存放在二进制文件旁边的文件中,而非二进制文件内部。发布压缩包、安装脚本、npm 封装包和 Docker 镜像都会包含该模型。其他所有安装方式——cargo install、从源代码构建、未包含模型的包——都会从对应版本标签中提交的文件下载一次:
leteo model install # downloads the model of this version, checks it
leteo model install --from ./model # from a copy, with no network
如果 leteo setup 没有找到模型,也会执行相同操作。在找到并验证模型之前,搜索只会按词语进行,和过去一样;leteo doctor 会说明以下三种情况之一:已找到并验证(并指出位置)、未安装,或模型已存在但不是此构建所接受的模型。只有在所有文件都通过二进制文件构建时所依据的哈希值检查后,才会加载模型。
无需安装任何内容
大多数 MCP 文档都会假设使用 npx,因此我们在 npm 上提供了一个封装包,它会为你的平台获取发布版二进制文件,使用相同的已发布 SHA256SUMS 对其进行校验,并将所有参数传递给它:
{
"mcpServers": {
"leteo": {
"command": "npx",
"args": ["-y", "@asanabrial/leteo", "mcp"]
}
}
}
bunx @asanabrial/leteo mcp 的工作方式也相同——它是同一注册表中的同一个包,封装包只依赖这两个运行时都已具备的内容。上文的 npm install -g 安装的也是同一个包,只是安装一次,而非每次运行时都获取。
npm 版本号就是发布标签,因此在 npm 中锁定版本,就会锁定它获取的二进制文件——有一个校验机制确保两者的版本号一致,因为若发布的 npm 版本落后于发布标签,就会悄悄地向所有通过这种方式访问的用户提供上一个版本。这是一种访问方式,而非运行它的唯一方式:位于 PATH 中的二进制文件无需下载即可启动,也是 leteo setup 写入 Agent 的内容。
作为插件
Claude Code 将 Leteo 作为插件使用,通过 Claude Code 自身的插件机制注册与 leteo setup 写入的相同 MCP 条目和五个生命周期钩子:
/plugin marketplace add asanabrial/leteo
/plugin install leteo@leteo
插件包含配置,不包含二进制文件。请先通过上述任一途径安装 leteo:插件注册的 MCP 条目和所有钩子都会从 PATH 运行 leteo,因此没有它,这五条命令都无法运行。插件替代的是设置步骤,移除插件后,这些条目也会随之移除。
两种方式选一种,不要同时使用。重复注册后,每个生命周期事件都会运行两次——这会导致每条提示词都存储两次。在发现问题之前,有一台机器上已经产生了 23 对完全相同的记录。现在,leteo setup --hooks 会查找已安装的插件包,如果发现已有注册,就会拒绝再次添加,并指出找到的文件。
Codex 的同一插件包位于 plugin/codex,在那里它是注册钩子的唯一途径——leteo setup codex 只会注册 MCP 服务,不会注册任何钩子,因此 Codex 虽然可以使用这些工具,却没有任何机制告诉它何时调用它们。
同一市场也提供 ZCode 插件,位于 plugin/zcode。添加市场需要在桌面应用中操作,而不是运行命令:依次选择 Settings → Plugins → Create → Add marketplace,然后指向 asanabrial/leteo。接着从列表中安装 leteo-zcode。
它的 CLI 不会添加市场——zcode plugins 只能列出并启用已安装的插件,仅此而已。已针对 zcode 0.16.5 验证:
$ zcode plugins --help
plugins List and enable installed plugins (`plugins list`)
它注册三个钩子,而不是五个,因为该客户端不会触发 SubagentStop 或 SessionEnd。它也是唯一不依赖他人开关的安装途径:ZCode 只有在 ~/.zcode/cli/config.json 中将 hooks.enabled 设为 true 时才会运行配置文件中的钩子,而该设置默认关闭;启用插件时,也会启用插件的钩子。
Pi 将 Leteo 作为软件包使用。leteo setup pi 会将 plugin/pi 写入 Pi 的 Agent 目录(PI_CODING_AGENT_DIR,或 ~/.pi/agent),并在 settings.json 中列出,同时移除先前的设置在 mcp.json 中留下的 leteo 条目。该软件包负责开启和关闭会话,保存你的提示词以及工具返回内容中的关键知识,保存压缩摘要,将记忆协议附加到系统提示词,并自行将 leteo mcp 注册为 MCP 服务:Pi 1.2.0 及更高版本会按需加载工具,低于该版本则会在每次请求中声明工具。
mcp.json 中的条目会按名称覆盖此注册,因此设置程序不再写入该条目。该软件包也发布在 npm 上,可通过 pi install npm:@asanabrial/leteo-pi 安装;两种途径选一种,不要同时使用。
卸载
leteo uninstall
leteo uninstall --yes
leteo uninstall --yes --keep-data
第一条命令会报告将要移除的内容,但不会更改任何内容。第二条命令会执行卸载:Leteo 会从配置过的每个 Agent 中移除,然后从这台机器上彻底移除,包括搜索模型。在 Windows 上,它还会注册到“已安装的应用”中,因此也可以在那里卸载。
--keep-data 用于保留无法重新获取的内容。使用该选项后,数据目录会保留原位——包括存储数据、settings.json 以及旁边的任何迁移副本——只移除 Agent 配置和二进制文件。不使用该选项时,存储数据及其 -wal/-shm 文件都会被移除。
这两种方式都不会移除 Leteo 未创建的文件。你手动创建的副本——例如升级说明曾要求创建的 leteo.db.bak-before-migrate——无论叫什么名字,都属于你,会继续保留;迁移留下的 leteo.db.pre-schema-N 副本也一样。运行不带 --yes 的 leteo uninstall 时,会先准确列出将移除和保留的内容,不会立即执行任何操作。
若要从一个 Agent 中移除 Leteo,同时在其他 Agent 中保留:
leteo setup claude-code --uninstall
这会移除 MCP 条目、生命周期钩子和协议块,仅此而已——其他服务、其他工具的钩子以及你自己的笔记都会保留原样。
MCP
这是一个包含 23 个工具的 MCP 服务,通过标准输入/输出运行,可直接启动,也可由 leteo setup 写入客户端:
leteo mcp
这样运行会提供全部工具。23 个工具中有三个会更改或统计整个存储库,而 leteo setup 会将它们排除:它写入 Agent 的是 --tools=agent,也就是 Agent 工作时会用到的 20 个工具。--tools 用于选择配置组或单个工具,--project 用于指定进程所使用的项目。
此外,还有一个 JSON 命令行、一个交互式终端 UI,以及对 15 种 MCP 客户端的设置支持——列表见本页顶部。
它在 MCP Registry 中的名称是 mcp-name: io.github.asanabrial/leteo,这也是 server.json 发布的名称。这里将这行内容直接写出,而不是隐藏在注释中,因为注册表会读取它,以确认此仓库拥有该 crate;而 crates.io 在渲染此文件时会移除 HTML 注释。
HTTP
对于已支持 HTTP 的脚本或插件,leteo serve 会在本地回环地址上开放相同的工具——无需 MCP 客户端,也无需为每次调用启动一个进程:
leteo serve
GET /tools 会列出端点名称,GET /health 会报告服务是否已启动,而 POST /tools/<name> 会将该工具的参数作为 JSON 请求体传入——名称和参数都与 MCP 工具相同,因此只需学习一套术语:
curl -s http://127.0.0.1:7437/tools/mem_save -d '{"title":"A decision","content":"what and why","type":"decision"}'
它使用与 MCP 和 CLI 路径相同的存储库和规则,因为它们共用同一个处理程序:通过 HTTP 保存的内容也会被索引、规范化并排队等待副本同步,与 Agent 保存的内容完全一样。默认情况下,它会绑定到本地回环地址;使用 --bind 0.0.0.0:7437 可将其开放到网络,日志也会对此进行说明,因为存储库包含 Agent 记住的所有内容。
输入内容
几乎不需要输入:保存和回忆都会自动完成。这是从外部查看存储的方式,供你想亲自查看时使用。每条命令的回答都会打印 JSON——tui 例外,它显示的是屏幕,而不是回答——默认数据库为 ~/.leteo/leteo.db。
读取。 search 是你真正会用到的命令,而 --all-projects 会将搜索范围扩展到当前所在项目之外。recent 按时间顺序列出最近几条;context 是会话开启时交给 Agent 的内容块,因此能显示你的 Agent 会从哪些内容开始;timeline 会读取某条记忆前后的保存内容;stats 会统计已有内容。tui 会在一个屏幕上显示所有内容。
leteo search "connection pool" --project leteo
leteo search "connection pool" --all-projects
leteo recent --project leteo --limit 20
leteo context leteo --scope project
leteo timeline 42 --before 5 --after 5
leteo stats
leteo tui
手动写入。 很少需要,因为 Agent 会在工作时保存内容——不过,你可以用自己的话写一条记忆,记录由 Agent 原本会替你划定的会话边界,也可以使用 consolidate 将多条记忆合并为一条,并记录被替代的内容,而非将其删除:
leteo save "SQLite architecture" "One writer, many readers" --project leteo --type architecture
leteo consolidate 12 13 --title "SQLite architecture" --content "One writer, many readers" --type architecture
leteo session-start session-1 --project leteo
leteo session-end session-1
设置 Agent。 不带参数时,它会引导你完成设置;指定 Agent 名称则会为该 Agent 设置。--hooks 会添加生命周期钩子,让记忆自动处理;--dry-run 会报告它会修改的每个文件,但不会实际写入:
leteo setup
leteo setup claude-code --hooks
leteo setup opencode --dry-run
维护。 doctor 会运行所有检查,并说明哪项检查失败以及原因;--repair 会执行可安全自动完成的修复——恢复缺失的全文搜索触发器、重建索引、重新计算过时的哈希值、合并较早接入时遗留的未合并记忆类型,以及重新处理繁忙钩子存放在存储旁的任何捕获内容。
export 和 import 可在不同机器之间迁移存储;obsidian-export 会将其以 Markdown 格式写入 vault:
leteo doctor
leteo doctor --repair
leteo export --project leteo --output leteo-export.json
leteo import leteo-export.json
leteo obsidian-export --vault C:\Vaults\Notes --project leteo
项目。 项目根据目录推断,因此同一项工作可能会归入两个名称。consolidate 会将一组项目合并为一个名称;prune 会删除其中完全不含记忆的项目:
leteo projects list
leteo projects consolidate --project leteo --apply
leteo projects prune --apply
冲突。 当新记忆看起来与旧记忆矛盾时,两条记忆会配对,由 Agent 处理。以下命令可从外部查看这些配对:list 和 show 用于查看已有配对;scan 用于查找尚未记录的配对;stats 用于按判定结果统计配对数量:
leteo conflicts list --project leteo --status pending
leteo conflicts show 7
leteo conflicts scan --project leteo --apply
leteo conflicts stats --project leteo
删除。 不带 --hard 时,记忆会被标记为已删除,并且不再出现在回答中;带上该参数时,记录会被彻底删除,相关关系也会被切断。项目也接受相同的参数。会话不接受任何参数;只要其中仍有记忆,就会拒绝删除,并说明记忆数量——会话要等到内容清空后才会删除,不会连同记忆一起删除:
leteo delete observation 42 --hard
leteo delete session session-1
leteo delete project leteo --hard
projects consolidate、projects prune 和 conflicts scan 在指定 --apply 之前都不会做任何更改:不带该参数时,每条命令都会准确报告将要执行的操作。
语言
有三个设置,因为它们分别回答三个不同的问题。
interface 是 Leteo 自身的界面:面板、菜单和帮助。共支持 13 种语言——英语、西班牙语、葡萄牙语、法语、德语、意大利语、罗马尼亚语、加泰罗尼亚语、加利西亚语、巴斯克语、荷兰语、波兰语和瑞典语——有意与记忆支持的 13 种语言相同,来自同一张表。未设置时会跟随机器的区域设置,因此,西班牙语系统会显示西班牙语仪表板,无需用户另行设置。罗马尼亚语由机器翻译,而非罗马尼亚语使用者撰写;提供该语言的菜单会注明这一点,其他 12 种语言则不会。
voice_language 是 Sardi 说话时使用的语言。它单独设置,是因为这些内容会写入 Agent 的对话,而不是显示在 Leteo 的界面上。在西班牙语系统上用英语工作很常见。未设置时会跟随 interface。支持的语言与上述 13 种相同。
language 是撰写记忆时使用的语言。这个值会传给模型,而不是经过解析,因此可以是自由文本,不限于上述 13 种语言:español、Spanish、português do Brasil 和 日本語 都可用。未设置时,每条记忆都会使用生成它的对话所用的语言。
记忆会保留撰写时使用的语言,因此更改此设置只会影响之后撰写的内容:已保存的记忆不会转换,搜索时也仍会按原来的语言词干处理。Setup 会在确认更改前告知记忆数量,而 leteo doctor 会报告语言分布——各语言分别有多少条记忆——但不会将其视为故障。
设置
这三个设置以及另外三个设置保存在数据目录中的 settings.json 内,除非你更改过位置,否则路径为 ~/.leteo/settings.json。Setup 屏幕会写入此文件,也可以手动打开编辑:无法读取某个值时,只会影响对应的那项设置,不会影响整个文件。不过,编辑时不会即时提示,因为钩子不能在你编辑到一半时失败——leteo doctor 会指出哪些设置读取失败。
| 键 | 值 | 未设置时 |
|---|---|---|
interface | 上述 13 种语言之一 | 跟随机器的区域设置 |
voice_language | 上述 13 种语言之一 | 跟随 interface |
language | 自由文本 | 每段对话所用的语言 |
voice | all、reminders、quiet | reminders |
context_size | slim、full、deep | full |
semantic_search | true、false | true |
这两种语言都使用该语言自身的名称填写——例如 español,而不是 es——读取时则会宽容处理,因为这是一个会由人手动输入的文件:英语名称、ISO 代码以及不带重音符号的拼写都有效。
voice 控制 Sardi 会大声说出多少自己的工作内容——全部、仅保存提醒,或什么也不说。除非另有设置,否则它的值为 reminders:每次提示词都显示一行报告只会带来无人需要的噪声,而提醒才是实际发挥作用的内容,因此要恢复报告,就需要设置为 all。context_size 控制会话开始时加载多少条记忆:20、30 或 80 条,适用于上下文窗口较小的情况,或是比预算限制更重要的存储空间。semantic_search 决定当搜索无法从字面词语中找到答案时,是否继续按含义进行搜索,支持全部 13 种语言;所用模型随二进制文件一同提供,搜索时绝不会访问网络。以这种方式找到的结果会标记为 semantic。如果运行时占用的记忆过多,或你只想获得包含搜索词的答案,可以关闭此功能。
六项设置中有两项也可用作标志,因为更改它们不应要求重新配置 Agent。每一项都可以单独作为完整命令使用:
leteo setup --language "español"
leteo setup --context slim
云端
可选,默认关闭,且按项目启用。你的机器是客户端;云端不会反向连接。
启用它需要回答两个问题:服务在哪里,以及哪些项目要发送到那里。config set 会将第一个答案写入数据目录中的文件——该文件权限受限,因为其中存有令牌——而 enroll 会指定一个项目。只有两者都完成后才会开始复制,下面的命令会明确说明这一点,而不会悄悄启动:
leteo cloud config set --server https://memory.example.com --token YOUR-TOKEN
leteo cloud enroll --project leteo
leteo cloud config show
config show 会读取配置,并将令牌替换为存在状态标记,因此可以安全地粘贴。
启用后,health 会询问服务是否在线并能否响应。status 完全不会联系任何服务:它会报告这台机器自己的状态——已登记哪些项目、有多少更改正在等待以及从何时开始等待,还有上次尝试是否失败以及失败原因。sync 会立即运行一个周期,而 leteo serve 会在后台持续运行这些周期——与 HTTP API 并行——直到收到中断:
leteo cloud health
leteo cloud status
leteo cloud sync
leteo serve
不要将它与 leteo cloud serve 混淆,后者是另一端——服务本身,只有在你要托管服务时才需要运行。
从 Engram 迁移
Leteo 是一款独立的 Rust 产品,衍生自 Gentleman Programming 的 Engram 工作流及其 MIT 许可实现。它与该项目没有关联,也未获其认可,并且不承诺与其 CLI 完全兼容。
一份经过测量的对比——将同一合成语料通过各自的写入路径保存到两个引擎,再分别对各自执行相同的查询——见
docs/comparison.md。
它可以直接读取 Engram 数据库,因此迁移只需复制。第一条命令会报告它将采纳哪些内容,但不会写入任何内容;第二条命令会执行复制,并会拒绝再次运行,以免重复导入所有内容:
leteo import --from-engram --dry-run
leteo import --from-engram
默认使用 ~/.engram/engram.db;如需其他路径,请传入 --source。复制过程会合并写前日志,因此正在运行的 Engram 中最新的记忆也会一并迁移,且不会写入 Engram 自身的文件。
第二条命令会在一个事务中写入目标。如果存储中已经有记忆——会话、提示词或观察记录——命令会拒绝操作,而不是替换内容,并会说明其中已有的内容;绝不会删除任何内容。如果复制中途失败,目标会保持原样,只需重新运行该命令即可重试。
构建
Leteo 要求 Rust 1.97 或更高版本。
cargo fmt --all
cargo test
cargo clippy --all-targets -- -D warnings
cargo build --release
CI 会运行测试。提交前需要由你负责格式化和 lint 检查,因此这里以及 AGENTS.md 中都列出了这些要求,而不是只写在工作流里。
云端测试需要真实的 PostgreSQL,没有可用实例时会跳过这些测试。将 TEST_DATABASE_URL 指向一个临时数据库,然后运行 cargo test -- --ignored;测试会自行创建和删除 schema,且不支持共享同一个 schema。
贡献者——无论是人还是 Agent——都应先阅读 AGENTS.md。
文档
各项测量的详细说明见 docs/。第一篇是 没有什么值得调整:第三阶段搜索有 90.2% 的时间回答的是另一个项目的问题,比回答自身项目的问题还要频繁;四条覆盖其完整范围的规则表明,这不是任何人能通过调整阈值解决的问题。
第二篇是 记忆能节省令牌吗?,它提出了本项目启动时的问题,并以本项目为对象给出答案:对于仓库已有答案的问题,节省量处于噪声范围内;对于仓库无法回答的问题,不使用记忆的 Agent 花费更多,却连续三次都答错;而从开篇部分抽取的 11 条记忆中,有 6 条其实都能从仓库中重新找回——只要结合代码、规格说明、测试和 git 历史即可。
第三篇是 Leteo 与其他记忆引擎的实测对比:将同一合成语料分别存入 Engram、另外两个引擎和 Leteo,再向每个引擎各自的搜索功能提出相同的问题,并展示一次运行得出的数据——由测试工具自动生成,因此不会出现偏差;每个引擎旁都列出了其实测版本。
环境
这些变量都无需设置。 这里列出了二进制文件读取的每个变量——如果二进制文件使用了表中遗漏的变量,测试就会导致构建失败——这不是一份配置指南。leteo setup 会将安装所需的设置写入每个 Agent 自己的配置文件,而你在界面中所做的选择会保存在 settings.json 中。两者都不会设置环境变量。
大多数变量也有对应的命令行标志,且标志优先:只有命令行没有回答同一问题时,才会读取变量。
| 变量 | 标志 | 用途 |
|---|---|---|
LETEO_DATA_DIR | --data-dir | 本地数据目录;默认为 ~/.leteo |
LETEO_DATABASE | --database | 指定本地 SQLite 路径 |
LETEO_TOOLS | mcp --tools | agent、admin、all 或单个工具名称。未指定任何名称时启用所有工具 |
LETEO_MODEL_DIR | — | 存放语义搜索模型的目录;会优先在此处查找 |
LETEO_MODEL_URL | model install --url | leteo model install 和 leteo setup 获取模型的位置,而非使用提交在此版本标签中的文件:一个包含这三个文件(文件名保持原样)的目录 |
LETEO_PROJECT | mcp --project | MCP 服务在整个进程中信任的项目;未设置时由工作目录决定 |
LETEO_AGENT_CLI | conflicts scan --semantic | 用于判断冲突候选项的 Agent CLI:claude 或 opencode |
LETEO_SYSTEM_LANGUAGE | — | 当 LANG 未提供语言信息时,指定此机器使用的语言。仅读取一次,用于在 leteo setup 中提供该语言选项 |
有两个变量值得多说明一句,因为它们最能体现标志优先的影响:
LETEO_TOOLS已为 Leteo 配置的每个 Agent 指定好:它写入的 MCP 条目会运行leteo mcp --tools=agent。之后导出该变量不会对该 Agent 产生任何影响——请编辑其配置文件中的配置,或重新运行 setup。LETEO_DATA_DIR是唯一有充分理由导出的变量。MCP 服务由 Agent 启动,而不是由你启动,因此,如果数据库位于~/.leteo以外的位置,就必须通过该 Agent 的环境变量,或作为配置文件中命令的--data-dir参数传递给它。
云端,在你的机器上
leteo cloud config set 会将服务和令牌保存在数据目录中,这也是配置它们的方式。只有当该文件中的对应字段为空时,才会读取这两个变量,因此早于该配置方式的设置仍可照常工作。
| 变量 | 用途 |
|---|---|
LETEO_CLOUD_SERVER | cloud health、cloud sync 和客户端配置使用的云端基础 URL |
LETEO_CLOUD_TOKEN | 同步 bearer 令牌,至少 32 字节 |
leteo cloud serve 也会读取 LETEO_CLOUD_TOKEN,将其用作自己的旧版静态令牌——在同时充当客户端和服务端的机器上,一个名称代表两种含义。
云端,在服务器上
这些变量由运行 leteo cloud serve 的人员负责,并在定义该服务的位置设置——参见
docker/docker-compose.yml。特意没有为这些变量提供向导:它们属于部署机密,而非偏好设置,普通安装不会用到这些变量。
| 变量 | 用途 |
|---|---|
LETEO_DATABASE_URL | 云端服务使用的 PostgreSQL URL |
LETEO_DASHBOARD_SECRET | 仪表板签名密钥,至少 32 字节 |
LETEO_CLOUD_TOKEN_PEPPER | 托管令牌的 HMAC pepper,至少 32 字节 |
LETEO_CLOUD_ADMIN | 可选的旧版管理员 bearer 令牌,至少 32 字节 |
LETEO_CLOUD_ALLOWED_PROJECTS | 旧版云端令牌必需的允许列表 |
LETEO_CLOUD_HOST | 云端绑定主机;默认为 127.0.0.1 |
LETEO_CLOUD_PORT | 云端端口;默认为 8080 |
LETEO_CLOUD_MAX_POOL | PostgreSQL 连接池上限 |
LETEO_CLOUD_MAX_PUSH_BYTES | 云端推送请求正文的最大大小 |
浏览服务器上保存的内容。 使用管理员令牌登录 /dashboard/login,/dashboard 会链接到只读浏览页面:可查看项目、每个项目的会话和记忆,以及对记忆标题、内容和主题键的搜索。页面由服务器渲染,不会修改任何内容,并显示日志的当前状态,因此已删除的记忆不会出现。管理员身份可以让你登录,但并不意味着你可以访问所有项目:浏览页面仅显示你的令牌获准访问的项目(持有 * 授权时则显示所有项目);按名称请求任何其他项目都会被拒绝,并返回 403。列表最多显示 200 个项目、100 个会话、100 条记忆或 50 个搜索结果;达到上限时,页面会予以说明。用户、授权和令牌的管理不在此功能范围内。
许可证与归属
Leteo 根据 MIT 许可证分发。有关上游归属和确切的参考修订版本,请参阅 LICENSE 和
NOTICE。带标签的二进制归档还包含生成的 THIRD_PARTY_LICENSES.html,其中涵盖其 Rust 依赖项。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。