news 2026/9/14 13:35:52

memU memu-cli npm 启动器:文件化个人记忆 CLI(commit / retrieve / list-files)与底层实现剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
memU memu-cli npm 启动器:文件化个人记忆 CLI(commit / retrieve / list-files)与底层实现剖析

memU memu-cli npm 启动器:文件化个人记忆 CLI(commit / retrieve / list-files)与底层实现剖析

【免费下载链接】memUPersonal memory across agents项目地址: https://gitcode.com/GitHub_Trending/mem/memU

本文以 npm/README.md 为主体,系统讲解 memU 项目在 npm 上的发布形态memu-cli:一个只有几 kB、零依赖的 Node 启动器,负责把commit(持久化记忆)、retrieve(纯 embedding 检索)、list-files(列出全部记忆/技能文件)三个命令委派给 PyPI 上的 Python 引擎。读完后你可以独立完成本地 SQLite 与 MemU Cloud 两种模式下的安装、配置与调用,并理解启动器回退策略、环境变量解析顺序与云端客户端的底层行为。

memu-cli 的定位:Python 引擎之上的薄启动层

memU 是一个"个人记忆即文件"(personal memory as files)的项目:由外部 Agent 准备好记忆与技能文档,memU 负责持久化这些文档,并在后续对话中用 embedding 相似度检索出紧凑、排序好的上下文,替代"把每个 prompt 重新塞满"的粗放做法。一个关键设计约束是embedding-only——memU 内部不发生任何 LLM 调用,因此检索路径快速且无额外推理成本(见 npm/README.md 开头说明与 src/memu/cli.py 的模块注释)。

项目有两种安装面:

形态说明
npm 包memu-clinpm/package.json薄启动器(bin 入口 npm/bin/memu.js),几 kB、无第三方依赖,要求 Node >= 18
PyPI 包memu-clipyproject.tomlmemU 引擎本体,提供memu可执行入口与MemoryService库 API,预构建 wheel 覆盖 Linux(x86_64/aarch64)、macOS(Intel/Apple Silicon)与 Windows

npm 与 PyPI 两个包同名但职责不同,当前仓库中 npm 侧版本为0.2.0,PyPI 侧引擎版本为0.11.0-beta.3requires-python = ">=3.11",支持 3.11/3.12/3.13)。启动器把"如何找到 Python 运行时"这一麻烦封装掉,用户只需npx memu-cli <command>

快速开始:唯一前置依赖是 uv

官方快速开始要求只预装 uv ——它会同时拉取 Python 3.13 运行时和 memU 引擎本身,无需其他预装:

curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux # Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

然后设置 embedding 服务的密钥并执行三个基本命令:

export OPENAI_API_KEY=sk-... # 持久化准备好的记忆:{"recall_files": [...], "resource": [...]} npx memu-cli commit results.json # 列出所有已存储的记忆/技能文件 npx memu-cli list-files # 单发 embedding 检索 —— 无 LLM、速度快 npx memu-cli retrieve "deploy checklist"

默认情况下,状态持久化在本地 SQLite 数据库./data/memu.sqlite3

三个核心命令

commit <payload.json>:持久化外部准备好的记忆

commit接收一个 JSON 文件(-表示从 stdin 读取),把外部流程(例如 Agent 会话)准备好的召回文件(recall files)和工作区资源(resources)写入存储。从 src/memu/cli.py 的_cmd_commit可以看到,payload 支持三个可选顶层字段:

  • recall_files:召回文件数组(记忆与技能两个 track 的文件);
  • resource:工作区资源数组;
  • user:用户/Agent 作用域字段。

提交成功后,默认输出形如committed N recall file(s) and M resource(s),并逐行列出track/name;加--json则输出原始 JSON 响应。文件不存在时命令返回退出码 2 并打印error: no such file: ...

retrieve <query>(别名search):零 LLM 调用的单发检索

retrieve对记忆分段、文件与资源按 embedding 相似度排序并返回,全程不调用 LLM。命令实现见 src/memu/cli.py:构建后端后直接调用progressive_retrieve(query),打印 JSON 结果。该协议在 src/memu/agentic_backend.py 中以 Protocol 形式定义,本地MemoryService与云端CloudMemoryClient都满足同一接口,保证两条执行路径行为一致。

list-files:跨 track 列出全部召回文件

list-files会遍历 memory 与 skill 两个 track 的全部召回文件。从 src/memu/cli.py 的实现可以看出,它并非一次拉取:而是跟随next_cursor逐页请求list_all_recall_files(对应 docs/adr/0014-paginated-list-all-recall-files.md 的分页设计),拼齐全量后再打印N recall file(s)与每行- {track}/{name}: {description};加--json输出完整{"recall_files": [...]}

公共选项与环境变量映射

每个子命令都挂载了同一组"本地服务选项"(在 cloud 模式下被忽略),来自 src/memu/cli.py 的_add_common_options。每个命令行参数都有对应的MEMU_*环境变量,CI 或 Agent 只需配置一次环境即可:

选项环境变量默认值说明
--providerMEMU_EMBED_PROVIDERopenaiembedding 提供商标识,如openaijinavoyage
--embed-modelMEMU_EMBED_MODEL取 provider 默认模型覆盖 embedding 模型
--base-urlMEMU_BASE_URL取 provider 端点API base URL 覆盖
--api-keyMEMU_API_KEY取 provider 的密钥变量(如OPENAI_API_KEYAPI key 值或环境变量名
--dbMEMU_DB./data/memu.sqlite3SQLite 文件路径、postgres://DSN 或:memory:
--json打印原始 JSON 响应

关于--db,src/memu/env.py 的database_config说明了取值范围:裸 SQLite 路径、完整 SQLAlchemy URL(sqlite:///…postgres://…)或内存哨兵值(:memory:/inmemory)。裸路径会自动创建父目录。

本地与云端双模式

本地模式(默认)

不设任何记忆模式变量时,引擎在本地构建MemoryService:embedding 在客户端计算,元数据与向量写入MEMU_DB指定的 SQLite(或 Postgres DSN)。这里有一个容易踩坑的点,src/memu/env.py 的模块注释解释得很清楚:写入侧(record)与检索侧(inject)必须使用同一个 DSN 和同一个 embedding provider,否则查询向量与被比较向量处于"不同的向量空间",检索会静默返回空结果。因此配置解析遵循三级顺序:

  1. 进程环境变量(MEMU_DB=… memu retrieve …可一次性覆盖,无需改文件);
  2. ~/.memu/config.env(安装时写入的 dotenv,可用MEMU_CONFIG_ENV改路径)——定时任务没有可靠的工作目录,也不继承交互式 shell,绝对路径下的文件是唯一稳健的载体;
  3. 代码内默认值。

Cloud 模式

设置两个变量即可让完全相同的命令改走 MemU Cloud:

export MEMU_MEMORY_MODE=cloud export MEMU_CLOUD_API_KEY=<memu-api-key>
  • API key 需在 memu.so 注册后获取;
  • 生产 API base 默认为https://api.memu.so/api/v4/memory/,可用MEMU_CLOUD_BASE_URL覆盖以对接兼容部署(见 src/memu/cloud.py 的DEFAULT_CLOUD_BASE_URL与 src/memu/env.py);
  • 本地 embedding 配置(MEMU_EMBED_PROVIDERMEMU_EMBED_MODELMEMU_DB等)与云端凭证完全独立、互不复用,cloud 模式下本地专用选项被忽略(见build_agentic_memory_backend_from_env,src/memu/env.py);
  • 能力边界:Cloud 目前持久化 memory 与 skill 召回文件,但不持久化提交的工作区资源
  • MEMU_MEMORY_MODE只接受local/cloud,其他取值直接抛ConfigError;cloud 模式下缺少MEMU_CLOUD_API_KEY同样显式报错而不是猜测。

从 src/memu/cloud.py 的CloudMemoryClient还可以看到几个实现细节,对排障很有用:

  • 三个操作(list_all_recall_files/progressive_retrieve/commit_results)分别映射为GET(带cursor分页参数)、POST searchPOST(payload 为{user, recall_files, resource}),鉴权头为Authorization: Bearer <key>
  • 默认 3 次尝试、超时 30s(连接 5s),对可重试状态码做指数退避重试(max_attempts最小为 1);
  • 作用域(where)只支持user_idagent_id的精确过滤,缺省值为"default"user字段仅支持user_idagent_iduser_nameagent_name,其他字段会抛出配置错误;
  • 错误按状态码分类:401 认证失败、403 授权失败、400/409/422 请求被拒、429 限流,其余归为服务错误;
  • 支持MEMU_HTTP_PROXY显式代理,未设置时默认绕过代理的 mount 规则;~/.memu/config.env中的NO_PROXY/no_proxy会被透传进进程环境(src/memu/env.py)。

embedding 配置:memU 唯一的模型能力

因为 memU 内部没有 LLM,MEMU_EMBED_PROVIDER命名的就是"唯一剩下的模型能力"。src/memu/embedding/defaults.py 是 provider 知识的单一来源,内置五个后端(均在 src/memu/embedding/backends/ 下有真实实现):

provider默认模型端点密钥环境变量
openaitext-embedding-3-small(字段默认值)OPENAI_API_KEY
jinajina-embeddings-v3https://api.jina.ai/v1JINA_API_KEY
voyagevoyage-3.5https://api.voyageai.com/v1VOYAGE_API_KEY
doubaodoubao-embedding-large-text-250515https://ark.cn-beijing.volces.comARK_API_KEY
openrouteropenai/text-embedding-3-smallhttps://openrouter.aiOPENROUTER_API_KEY

provider 的解析还带一个兼容性细节:MEMU_LLM_PROVIDER作为MEMU_EMBED_PROVIDER的后备被读取,让旧版~/.memu/config.env继续可用(见 src/memu/env.py)。

npm shim 如何拉起 Python:四级回退策略

npm/package.json 声明了bin入口memu -> bin/memu.js,且files只包含bin目录——整个 npm 包就是 npm/bin/memu.js 这一个几十行的 Node 脚本。它按优先级依次探测并委派:

  1. $MEMU_PYTHON -m memu——显式解释器覆盖,适合自定义虚拟环境;
  2. uvx --from memu-cli memu——无需安装、由 uv 缓存(官方推荐路径);
  3. pipx run --spec memu-cli memu——无需安装、由 pipx 缓存;
  4. python3 -m memu——要求已执行pip install memu-cli

探测逻辑本身也很直接:has(cmd)spawnSync(cmd, ["--version"])判断可执行文件存在且退出码为 0;第 4 级还会先python3 -c "import memu"确认包已安装才使用。若四级全部落空,脚本打印安装指引(安装 uv / pipx / 或 pip 安装,或用MEMU_PYTHON指向已装 memU 的解释器)并以退出码 1 结束。子进程的退出码会原样透传给用户,stdio 直接继承。

已经使用 Python 的用户:可以完全跳过 npm

npm 层只是分发糖。若环境中已有 Python,可以:

uvx --from memu-cli memu --help # 无需安装,uv 缓存 # 或 pip install memu-cli

同一个 PyPI 包还携带库 API(MemoryService、Postgres 后端)——一次安装同时覆盖 CLI、宿主适配器与库调用。从 pyproject.toml 的[project.scripts]可以看到完整的可执行入口面:除核心memu(算法面)外,还有memu-codexmemu-claude-codememu-cursormemu-openclawmemu-hermesmemu-workbuddymemu-colamemu-pi等宿主适配器二进制,以及用于任意 Agent 的memu-agent通用适配器(ADR 0008/0009/0010/0011 描述的设计)。核心memu二进制的retrieve/list-files/commit用法与npx memu-cli完全一致。

小结

npx memu-cli的价值在于把"Python 引擎 + 运行时管理"封装成一条 npx 命令:npm 启动器(npm/bin/memu.js)负责按MEMU_PYTHONuvxpipxpython3的顺序找到可用运行时,PyPI 引擎(入口memu.cli:main)负责实际的 commit/retrieve/list-files 语义,MEMU_*环境变量统一了本地与云端两条路径的配置面。对 CI 与 Agent 集成而言,"配置一次环境、只传命令"正是这套设计的直接收益;而 embedding-only、零 LLM 调用的检索路径,则是它可以在低延迟、低成本前提下被高频调用的原因。项目采用 Apache-2.0 许可(见 LICENSE.txt)。

【免费下载链接】memUPersonal memory across agents项目地址: https://gitcode.com/GitHub_Trending/mem/memU

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 13:33:54

VC++随机密码生成器:从安全随机数到7z打包全解析

简介&#xff1a;这是一份面向C/C初学者与编程爱好者的VC随机密码生成器源码包。该项目演示了如何利用C标准库完整实现一个支持自定义长度、可选数字/大小写字母/特殊字符的随机密码生成程序&#xff0c;适合用Visual Studio直接打开编译运行&#xff0c;帮助读者将随机数生成、…

作者头像 李华
网站建设 2026/9/14 13:31:24

Golang Map底层实现与并发安全详解

1. Golang Map 面试核心要点解析在Golang面试中&#xff0c;Map相关的知识点几乎是必考内容。作为Golang中最重要的数据结构之一&#xff0c;Map的底层实现、并发安全性和扩容机制等都是面试官重点考察的方向。下面我将从实际面试角度出发&#xff0c;深入剖析Golang Map的核心…

作者头像 李华
网站建设 2026/9/14 13:30:46

AI巨头的商业化困境与技术挑战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:29:24

JavaWeb车辆管理系统课设源码解析:工程结构、数据库与部署实战

简介&#xff1a;面向JavaWeb课程设计的车辆管理系统完整项目&#xff0c;源码与数据库齐备&#xff0c;适合需要高质量课程设计参考的在校生。系统基于Servlet/JSP实现&#xff0c;涵盖车辆信息管理、车位分配、用户角色与卡片管理等功能模块&#xff0c;代码结构清晰&#xf…

作者头像 李华
网站建设 2026/9/14 13:28:50

安卓图书管理系统开发实战:从SQLite数据设计到APK打包全解析

简介&#xff1a;这是一套安卓图书管理系统完整工程源码&#xff0c;基于安卓Studio开发&#xff0c;面向安卓初中级开发者、计算机专业学生以及需要管理个人藏书或小型图书室的用户。系统实现了图书信息增删改查、用户登记与权限控制、借阅归还、支持按书名、作者、分类进行模…

作者头像 李华