mcpField
L
Leteo

Leteo

本地服务
github.com/asanabrial记忆与知识42 周前更新

关于 Leteo

Leteo 是面向编码 Agent 的持久记忆工具,将项目决策、修复和约定保存在本地 SQLite 数据库中。它以单个二进制文件运行,可在不同会话间提供相关笔记;指定项目后也可选择云端复制。

主要功能

  1. 01跨会话保存项目知识
  2. 02按含义或词语检索记忆
  3. 03将数据存入本地 SQLite 数据库
  4. 04配置受支持的编码 Agent
  5. 05查看、导出或删除已存记忆

适用场景

  1. 01在新会话中沿用项目约定
  2. 02编码时找回先前的缺陷修复
  3. 03向 Agent 提供持久项目上下文

MCP 相关

Leteo 通过 MCP 服务向编码 Agent 提供记忆工具。其 setup 命令可为受支持的 Agent 写入 MCP 配置项。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
cargoleteo0.4.2
npm@asanabrial/leteo0.4.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Leteo — AI Agent 的鲜活记忆。轻量。本地。属于你。

安装 • 工作原理 • 命令 • 语言

CI 许可证:MIT Rust 1.97+ MCP:22 个工具 Linux、macOS、Windows


Leteo — AI 编码 Agent 的持久记忆

编码 Agent 会在会话结束时忘记一切,在上下文压缩时也会忘掉大部分内容。Leteo 就是它能保留下来的记忆:决策、错误修复、约定,以及那些代价高昂才得出的发现。它们存储在本地 SQLite 数据库中,并会在相关时提供给 Agent。

一个二进制文件,无需服务,也无需 API 密钥。除非你为指定的项目启用云端复制,否则任何内容都不会离开你的设备。

与自身对比的实测结果——同一个 Agent、同一组问题,分别在使用和未使用 Leteo 的情况下测试:

在代码无法回答的那个问题上,每次运行的令牌数。未使用 Leteo:运行 3 次,分别为 27,394、85,950、98,733 个令牌,3 次中答对 0 次。使用 Leteo:运行 4 次,分别为 29,996*、55,189、71,037、100,417 个令牌,4 次全部答对。中位数从 85,950 降至 63,113,即令牌数减少 27%。最佳运行减少 70%,中位数减少 27%。标有 * 的运行不符合测试协议:它的提示词要求提供其他运行未要求的一个字段;去掉这次运行后,最佳运行减少 44%,中位数减少 17%,答对 3 次(共 3 次),而未使用 Leteo 时答对 0 次(共 3 次。

四次全部答对,而未使用 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 就已掌握项目的已有知识,并在你工作时持续保存内容——修复的错误、达成的约定、学到的非显而易见的信息。这些笔记是写给未来的它自己的,而不是写给你的,因此不会出现在对话中。

终端画面:新会话询问项目有哪些已知信息,并收到 Agent 自行保存的三条记忆——在 20 个工作线程时耗尽的连接池、以整数分保存的金额、Stripe 会重试 Webhook 三次——随后在任务过程中搜索这些记忆

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

终端中的 Leteo 仪表板:两个项目共有十一条记忆,输入“connection pool”后筛选出一条,再打开以查看完整记忆

它值得吗?

不是凭空断言,而是基于 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自由文本每段对话所用的语言
voiceall、reminders、quietreminders
context_sizeslim、full、deepfull
semantic_searchtrue、falsetrue

这两种语言都使用该语言自身的名称填写——例如 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_TOOLSmcp --toolsagent、admin、all 或单个工具名称。未指定任何名称时启用所有工具
LETEO_MODEL_DIR—存放语义搜索模型的目录;会优先在此处查找
LETEO_MODEL_URLmodel install --urlleteo model install 和 leteo setup 获取模型的位置,而非使用提交在此版本标签中的文件:一个包含这三个文件(文件名保持原样)的目录
LETEO_PROJECTmcp --projectMCP 服务在整个进程中信任的项目;未设置时由工作目录决定
LETEO_AGENT_CLIconflicts 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_SERVERcloud 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_POOLPostgreSQL 连接池上限
LETEO_CLOUD_MAX_PUSH_BYTES云端推送请求正文的最大大小

浏览服务器上保存的内容。 使用管理员令牌登录 /dashboard/login,/dashboard 会链接到只读浏览页面:可查看项目、每个项目的会话和记忆,以及对记忆标题、内容和主题键的搜索。页面由服务器渲染,不会修改任何内容,并显示日志的当前状态,因此已删除的记忆不会出现。管理员身份可以让你登录,但并不意味着你可以访问所有项目:浏览页面仅显示你的令牌获准访问的项目(持有 * 授权时则显示所有项目);按名称请求任何其他项目都会被拒绝,并返回 403。列表最多显示 200 个项目、100 个会话、100 条记忆或 50 个搜索结果;达到上限时,页面会予以说明。用户、授权和令牌的管理不在此功能范围内。

许可证与归属

Leteo 根据 MIT 许可证分发。有关上游归属和确切的参考修订版本,请参阅 LICENSE 和 NOTICE。带标签的二进制归档还包含生成的 THIRD_PARTY_LICENSES.html,其中涵盖其 Rust 依赖项。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。