@amaster.ai/pi-memory-memm0 (英语)

语义内存扩展由 记忆,带有平台,嵌入式,以及自办后端和三种内存模式(hybrid,主动,被动).
如何运作
被动侧面:每次对话转后,用户+助理消息会自动被发送到Mem0进行事实提取和存储. 当您发送一个提示时, 语义搜索会在背景中预留, 相关记忆在代理开始前被召回 —— 无需作任何努力。 。 。 .
活动侧面: 代理人得到一个 mem0_memory 工具 (search 编号 : add 编号 : get_all 编号 : delete)这样它就可以主动地抬头去管理记忆——与官员的想法相同 @mem0/pi-agent-plugin,但以这个软件包的提供者抽象为后盾, 因此它与平台合作,嵌入, 财务报告和审定财务报表 (原始内容存档于2018-03-29). Merm0.
安全边界 :
- 召回频道:回想记忆作为用户频道发送的自定义消息被注入——从不进入系统即时. 每个条目被包裹为
[UNTRUSTED MEMORY DATA](JSON-引出),和匹配快速注入模式的条目被替换为[BLOCKED UNTRUSTED MEMORY: ...]。 。 。 . - 提醒触发:当用户提示启动运行时,自动召回会被消耗. 自定义消息运行由另一个扩展所触发, 在召回前不消耗 .
- 项目名称间距: 记忆范围为
userId:project:<cwd-hash>默认,所以一个项目的记忆在另一个项目中是不可见的. 设定userIdScope: "exact"在项目之间必须共享一个特征时. - 证书校正: 私人钥匙、无记名标志和
api_key=…- 类型值在存储任何东西之前都会被修改. - 平台模式披露: 内
platformmem0 Cloud 处理。 使用embedded或者说self-hosted模式将内存流量保持在第三方基础设施之外.
模式
后端模式
| 模式 | 矢量存储器 | 持久性 | 依赖关系 | 使用大小写 |
|---|---|---|---|---|
platform | 梅姆克・云 | 云管理 | MEM0_API_KEY | 快速启动, 多设备同步 |
embedded | Mem0 OSS 向量存储 | 管理病媒储存 | LLM + 嵌入 API | 数据隐私, 无 Mem0 Cloud |
self-hosted | Mem0 OSS REST 服务器 | 服务器管理 | 服务器 URL, 可选 API 密钥 | 共有基础设施 |
内存模式
记忆行为有三个独立的控制. 每个控件都是可选的,并返回到选定的 memoryMode 删除时预设.
独立行为控制
| 设置 | 控件 |
|---|---|
autoCapture | 自动发送每个用户 + 助手到 Mem0 进行提取和存储 |
autoRecall | 在代理机启动前自动搜索 Mem0并注入匹配的记忆 |
toolEnabled | 登记可调用模型 mem0_memory 用于搜索、添加、列表和删除操作的工具 |
toolEnabled 只影响可调用的模型工具。 用户化 /mem0 命令在提供者活动时仍然可用.
topK 是自动召回的共同结果限制 mem0_memory 搜索。 搜索。 它必须是大于 0; 使用 autoRecall: false没有 topK: 0,以禁用自动召回.
预设和覆盖
memoryMode 3个控制器仍是一个方便的预设:
memoryMode | 自动抓取 | 自动回顾 | mem0_memory 工具 | 使用大小写 |
|---|---|---|---|---|
hybrid (默认) | ✅ | ✅ | ✅ | 自动内存加代理驱动的查询 |
active | ❌ | ❌ | ✅ | 没有背景流量; 代理决定每个读/写 |
passive | ✅ | ✅ | ❌ | 0 工具表面; 全自动内存 |
明确的控制可以独立覆盖预设 。 未设置的控件继续继承其预设值,因此一个部分的覆被不能取代整个模式.
{
"pi-memory-mem0": {
"memoryMode": "hybrid",
"autoRecall": false
}
}
这保持了 hybrid 默认 autoCapture 财务报告和审定财务报表 toolEnabled,而明确 autoRecall: false 禁用自动注射。 代理仍然可以搜索通过 mem0_memory 需要时.
同样的规则适用于任何预设. 例如,从 passive 并仅允许工具覆盖 :
{
"pi-memory-mem0": {
"memoryMode": "passive",
"toolEnabled": true
}
}
召回频率
recallFrequency 控制何时自动召回的频率 autoRecall 决定: true数字 :
| 数值 | 行为 |
|---|---|
"user-input" (默认) | 在代理运行前搜索每个用户输入一次并输入匹配的记忆 |
"session" | 只搜索每次持续会话中的第一个用户输入 |
会话频率计算了第一次搜索尝试,即使它返回时没有匹配或时间。 标记被存储在 Pi 会话中,因此切换并恢复同会话不会再次搜索. /new 财务报告和审定财务报表 /fork 创建新会话ID并每次搜索一次.
何时 autoRecall 实值 false,则不启动自动搜索 recallFrequency 没有运行时间效果。 它不影响手动 mem0_memory 或者说 /mem0 search 打电话.
结构( 嵌入模式)
User ←→ Agent ←→ Mem0 OSS Memory
↕
Mem0 OSS Vector Store (source of truth)
- 矢量搜索数字 :
mem0ai开放源码软件MemoryVectorStore。尽管供应商名称memory它由 SQLite 支持;dbPath选择进程内 SQLite 数据库或 SQLite 文件. - LLM 提取: 配置提供者从对话中提取事实
- 持久性: 默认
dbPath实值<home>/memories/mem0-vectors.db,因此Mem0直接将矢量和有效载荷写入可持久SQLite文件. 无法保存第二快照 . - 提供者绘图:自定义提供者自动被映射到mem0兼容提供者(例如.
openai通过pi模型登记簿api字段. - 观察日期数字 :
add()接受可选选项observedAt(日期或弦). 在嵌入式模式下,它可以让mem0的提取即时提示如此相干的时间引用("yesterday","上周")与对话的日期而不是系统时钟相抗衡——摄取历史对话时很重要. Omit it and mem0回落到当前日期(正确为活转). 自办的OSS REST API不支持observedAt: 此提供者拒绝在发送前写出日期, 而不是默地重新解释历史日期 .
快速启动
在用户/代理设置或信任项目中存储配置 .pi/settings.json。当信任下降而不扩展时,项目设置会被忽略 ${ENV_VAR};因此,以下环境支持的例子属于用户或代理环境.
平台模式
{
"pi-memory-mem0": {
"mode": "platform",
"apiKey": "${MEM0_API_KEY}",
"userId": "${USER}"
}
}
嵌入模式( 建议)
重新使用 Pi 配置的模型提供者的 API 密钥和基础 URL —— 不需要额外的环境变量。 。 。 .
{
"pi-memory-mem0": {
"mode": "embedded",
"userId": "${USER}"
}
}
OpenAI 的默认值 text-embedding-3-small (嵌入)+ gpt-4.1-nano (取经. API密钥和基础URL由pi的模型注册自动解决.
使用 oss.customInstructions 精炼出Mem0的事实取出,例如用特定语言保存记忆:
{
"pi-memory-mem0": {
"mode": "embedded",
"oss": {
"customInstructions": "Always record memories in Simplified Chinese."
}
}
}
这些指示只会影响Mem0的取出模型,而不会影响pi的系统快取. 被召回的记忆仍然是不信任的模型输入,因此只能配置来自被信任源的提取指令.
嵌入初始化开始于背景, 因此会话启动不会等待 SDK 热身 。 内存操作共享相同的准备承诺并报告初始化失败;取消一个等待操作不会取消其他呼叫者的初始化. 自动召回其待发状态已过期的状态不会在初始化完成后启动 SDK 后期搜索 .
现有设置 mode: "open-source" 继续装入为 embedded不过 open-source 不属于支持的配置接口。 新设置应当使用 embedded。 。 。 .
自控模式
直接拨打OSS REST服务器. 服务器使用 /memories 财务报告和审定财务报表 /search,而不是Mem0平台 /v1 路径.
{
"pi-memory-mem0": {
"mode": "self-hosted",
"baseUrl": "${MEM0_BASE_URL}",
"apiKey": "${MEM0_API_KEY}",
"userId": "${PAPERCLIP_COMPANY_ID}",
"agentId": "${PAPERCLIP_AGENT_ID}",
"userIdScope": "exact"
}
}
自定义提供者
当您的模型注册 定义自定义提供者时 api: "openai-completions",可以直接使用:
{
"pi-memory-mem0": {
"mode": "embedded",
"oss": {
"llm": {
"provider": "my-provider",
"config": { "model": "deepseek-v4-pro" }
},
"embedder": {
"provider": "my-provider",
"config": { "model": "text-embedding-v4" }
}
}
}
}
自动扩展 :
- 解析模型登记册中的 API 密钥
- 喷出
baseUrl从登记册收到 - 地图
api: "openai-completions"→ 提供商"openai"
额外的 OpenAI 请求参数(嵌入)
此寄存器补丁 [email protected] 支助 oss.llm.config.extraBody 联 合 国 openai LLM 提供者. 参数同时被合并为取出和聊天请求机构,因此OpenAI相容的端点可以接收供应商特定选项:
{
"pi-memory-mem0": {
"mode": "embedded",
"oss": {
"llm": {
"provider": "openai",
"config": {
"model": "qwen3.8-flash",
"apiKey": "${DASHSCOPE_API_KEY}",
"baseURL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"extraBody": {
"enable_thinking": false,
"temperature": 0
}
}
}
}
}
}
extraBody 必须是对象。 它不能覆盖 model, (中文(简体) ), messages, (中文(简体) ), tools, (中文(简体) ), tool_choice, (中文(简体) ), response_format,或 stream;这些字段属于Mem0的请求协议. 使用 API 字段名称等 max_tokens, (中文(简体) ), reasoning_effort,或 chat_template_kwargs 内部 extraBody。端点支持取决于选定的模型和提供者.
此补丁由 pnpm install 在这个工作空间。 仅安装已发布的扩展并不适用此工作空间补丁 。 重新检查或删除 patches/[email protected] 当将Mem0升级到具有同等支持的上游版本时.
完全本地( 奥拉姆)
{
"pi-memory-mem0": {
"mode": "embedded",
"userId": "${USER}",
"oss": {
"llm": {
"provider": "ollama",
"config": { "model": "llama3", "url": "http://localhost:11434" }
},
"embedder": {
"provider": "ollama",
"config": { "model": "nomic-embed-text", "url": "http://localhost:11434" }
}
},
"useRegistryKeys": false
}
}
外部向量存储器( 如 Qdrant)
Qdrant JavaScript 客户端安装在此扩展名下;仍然需要运行的Qdrant 服务器.
对于需要专门的矢量数据库的生产工作量:
{
"pi-memory-mem0": {
"mode": "embedded",
"oss": {
"vectorStore": {
"provider": "qdrant",
"config": { "url": "http://localhost:6333" }
}
}
}
}
支持的向量存储提供者 : memory (违约), qdrant, (中文(简体) ), redis, (中文(简体) ), pgvector, (中文(简体) ), supabase。 。 。 .
配置的向量存储总是拥有持久性 。 要请求一个有意的平面SQLite数据库,请设置 memory 供应商 config.dbPath 改为 ":memory:"; 没有创建快照倒计时 .
配置参考
| 外地 | 类型 | 默认 | 说明 |
|---|---|---|---|
mode | "platform" | "embedded" | "self-hosted" | "platform" | 操作模式 |
memoryMode | "hybrid" | "active" | "passive" | "hybrid" | 用于抓取、召回和工具行为的预设 |
autoCapture | 布尔 | 选中的预设 | 覆盖自动对话抓取 |
autoRecall | 布尔 | 选中的预设 | 取代自动召回注射 |
toolEnabled | 布尔 | 选中的预设 | 覆盖 mem0_memory 工具注册 |
recallFrequency | "user-input" | "session" | "user-input" | 提醒每个用户输入, 或只提醒每个持续会话的第一个用户输入; 当 autoRecall 错误 |
apiKey | 字符串 | —— 说 | 平台或自办API密钥. 支助 ${MEM0_API_KEY} |
baseUrl | 字符串 | https://api.mem0.ai | 平台覆盖; 自托管模式需要 |
requestTimeoutMs | 正整数 | 30000 交互式/ 120000 捕获 | 自动托管请求超时和自动抓取等候预算,跨越后端 |
userId | 字符串 | $USER 或者说 "default-user" | 内存范围界定标识符 |
agentId | 字符串 | —— 说 | 可选代理范围. 支持环境内插 |
userIdScope | "project" | "exact" | "project" | 附加 Cwd 散列或使用 userId 逐字记录 |
topK | 整数大于 0 | 5 | 自动召回的最大结果 mem0_memory 搜索; 使用 autoRecall: false 以禁用自动召回 |
useRegistryKeys | 布尔 | true | OSS 模式是否从 pi 注册中解析密钥 |
oss.customInstructions | 字符串 | —— 说 | 附加的 Mem0 事实提取指令; 不修改 pi 的系统提示 |
oss.llm | 对象 | OpenAI gpt-4.1-nano (英语) | 开放源码软件提取模型 |
oss.embedder | 对象 | OpenAI 文本嵌入-3-小 | 开放源码软件嵌入模型 |
oss.vectorStore | 对象 | memory 时间 <home>/memories/mem0-vectors.db | 自定义向量存储配置 |
oss.historyStore | 对象 | SQL 打开 <home>/memories/mem0-history.db | 自定义 mem0 历史存储配置 |
oss.historyDbPath | 字符串 | <home>/memories/mem0-history.db | SQLite 历史 DB 路径快捷键 |
oss.disableHistory | 布尔 | false | 禁用 mem0 操作历史 |
嵌入式和自寄模式读取并写入精确 userId + 键 agentId 范围; 平台模式用 OR 读取用户和代理实体范围,因为 Mem0 平台将它们作为单独的记录存储. 无效的现有记忆 agent_id 不自动回填.
数据存储
| 模式 | 矢量数据 | 历史 |
|---|---|---|
| 平台 | 梅姆克・云 | 云管理 |
| 嵌入( 默认路径) | <home>/memories/mem0-vectors.db | <home>/memories/mem0-history.db |
嵌入( N)memory, (中文(简体) ), dbPath: ":memory:"(中文(简体) ) | 进程 - 本地 SQLite; 重新启动时丢失 | <home>/memories/mem0-history.db |
| 嵌入 (QDRANT) | Qdrant 服务器 | <home>/memories/mem0-history.db |
| 自办 | 远程服务器 | 远程服务器 |
这个 home 目录通过 resolveHome() 从 @amaster.ai/pi-shared/settings (违约) ~/.pi/agent) (中文(简体) ).
提供者绘图
当供应商名称与mem0的内置列表不符时,扩展使用模型注册的 api 字段来映射它 :
书记官处 api 字段 | 安装到 mem0 供应商 |
|---|---|
openai-completions, (中文(简体) ), openai-responses | openai |
anthropic-messages | anthropic |
azure-* | azure_openai |
google-*, (中文(简体) ), gemini-* | gemini |
这样做是透明的,只要配置在您 models.json。 。 。 .
安装注释
默认嵌入式配置取决于 better-sqlite3 内在附加、过境依赖 mem0ai)用于向量存储和历史。 这对 dbPath: ":memory:":它改变SQLite存储页面的位置,而不是使用哪个向量存储执行.
对于 Pi 代理用户皮阿特尔的 package.json 包含 better-sqlite3 内 pnpm.onlyBuiltDependencies 它会自动编译 pnpm install。不需要额外的步骤.
独立用户: 如果您的工程的 pnpm 配置块构建脚本, 请添加到您的根中 package.json数字 :
{
"pnpm": {
"onlyBuiltDependencies": ["better-sqlite3"]
}
}
若为 better-sqlite3 无法装入( 例如, 由于节点 ABI 不匹配 ), 默认 memory 矢量存储无法启动 。 外部向量存储仍然可以使用,历史已禁用或配置到工作提供者.
工具
当解决 toolEnabled 值是真实的,代理人获得一个动作分配工具:
mem0_memory(action="search", query="...") # Semantic search over memories
mem0_memory(action="add", content="...") # Store a durable fact
mem0_memory(action="get_all") # List every stored memory
mem0_memory(action="delete", memory_id="...") # Remove a memory by id
存储内容是先进行认证的;结果以相同方式返回 [UNTRUSTED MEMORY DATA] 包装为被动召回,包括所需的内存编号 delete。 。 。 .
平台写入是同步的 : mem0_memory 添加和 /mem0 add 报告所写的文字已被接受,并在背景中处理。 这不能确认提取已经完成; 记忆可能还不能搜索, 所以不要重试一个接受的书写 。 同步后端报告返回的记忆或明确为空的取出结果;既包括遗留结果阵列,也包括 { results: [...] } 支持信封,包括内存文本 data.memory明确 FAILED 状态报告为写入失败。 没有取出结果或未决状态的答复作为未知的写出结果报告.
图标
/mem0 status # Show current status
/mem0 search <query> # Semantic search
/mem0 profile # List all memories
/mem0 add <text> # Store a memory manually
/mem0 dedup # Preview exact duplicates in the current scope
/mem0 dedup --apply # Confirm and remove exact duplicates
/mem0 delete <id> # Remove a memory by id
与 pi- memory 的关系
pi-memory-mem0 财务报告和审定财务报表 pi-memory 运行 独立平行 作为单独的扩展:
pi-memory: Curated memory – 代理通过memory_add编号 :memory_replace编号 :memory_remove编号 :memory_read工具,当地.md文件,硬字符限制pi-memory-mem0:语义记忆——自动取出/存储和语义回想(被动),外加:mem0_memory代理驱动语义检索工具( 活动); 无容量限制
它们互不干扰,它们的工具名称也不相冲突. pi-memory-mem0 以自定义的用户频道消息方式注入重现的文本( 绝不是系统提示); pi-memory 单独输入自己的上下文.
编目 API
正常的Mem0写作使用推论,因此Mem0自己的重复和冲突处理仍然是首要的保护. 软件包还输出一个单独的维护功能,用于预览或去除遗留的精确重复:
import { dedupMemories } from "@amaster.ai/pi-memory-mem0/dedup";
const result = await dedupMemories({
userId: "my-user",
agentId: "my-agent",
config: { mode: "platform", apiKey: "..." },
dryRun: true,
});
// result: { total: 42, duplicatesFound: 3, duplicatesRemoved: 0, deleteFailures: 0 }
Dedup 将使用 Unicode NFC 的条目规范化,大小写不敏感比较,并倒塌的白空间,然后保持最新的精确匹配. 平台用户和代理实体范围独立处理;嵌入式和自托管式模式使用精确 userId + 键 agentId 范围。 平台和嵌入式瞄准镜限为一万个回想;自托管的去向请求服务器最多1000个回想,并在达到这个极限后失效,因此它只适用于被证明最多能包含999个回想的瞄准镜. 无效或重复的ID,空的内存内容,缺失,无效,或绑定的时间戳,不完全的页码,不一致的平台计数,并取消所有失败的关闭;个人删除失败被报告,没有安装自动的背景清理.
结构化结果(Pi 0.99+)
mem0_memory 声明 outputSchema。搜索/获取全部返回 { memories, total, truncated } 包含完整的ID,认证-校正内存文本,以及可用的分数/时间戳. 删除返回 { deletedId, truncated }添加曝光 writeStatus: "saved" | "pending" | "unknown" | "empty";待决/未知结果不授权重试写入. 返回的内存文本是不信任的数据,就像可读结果一样. 失败者返回 { error, truncated } 设置 isError: true。 。 。 .
const result = await tools.mem0_memory({ action: "search", query: "project language" });
if (result.error) throw new Error(result.error);
text(result.memories.filter(m => (m.score ?? 1) >= 0.7).map(m => ({ id: m.id, memory: m.memory })));
已存在的动作仍为搜索/add/get all/删除;此更改不会给Mem0添加更新的API.
结构化输出限于12个KiB,而顶级列表则限于100个完整的记录. truncated: true 表示省略的记录; total 保留已有的原始数。 超大小记录,带有 id 保留完整的ID和小分级元数据,省略大字段,并携带 truncated: true 在记录和信封上;呼叫者必须在重新使用内容进行更新之前检查该旗帜。 没有记录ID的超大小结果返回打出输出限制错误,而不是剪接路径或内容. 当发生这种情况时, 写入可能已经完成: 在重试前检查保存状态 。 可读文本和渲染器细节是独立限定的.
自动召回在模型开始前仍然等待匹配的记忆,现有3秒等待预算. 超时,替换,调用取消,会话关闭取消平台和自备后端的等待并中止搜索. 嵌入式SDK无法停止基础搜索,因此自动召回每个扩展实例只允许一次飞行中嵌入式搜索,包括跨会话过渡并跳过新的召回,直到它解决;后期结果不会被注入到另一个即时. 跳过搜索时不会消耗会话提醒允许量或者写会话标记 。 在嵌入式模式下,超时,取消,或失败的提醒也留下会话备抵,供后一提示;即使没有记忆匹配,完成的搜索也会消耗.
自动抓取在发送前使用一个被绑定的发件箱作为自定义的 Pi 会话项持续 。 它最多维持了16个转弯,最多为64,000个综合字符,一次发送一个写出,并在新捕捉超过两个限制时发出警告;原始对话仍然停留在会话史上. 背景写入默认为120秒的预算, 可以通过 requestTimeoutMs,并在会话关闭时被取消。 缓慢的无法取消的嵌入式取出在预算之后继续维持其单飞行时段;经证实的后期成功会排出下一个排队的转弯来取出,而不是拖取。 嵌入式写作无法被停止, 因此它们的原始操作仍然是单飞跨会话过渡而不阻断关闭 。 未确认的写入保留在发端会话中,当恢复该会话时,使用相同的后端配置和身份,使用其在平台上的原始观测日期和嵌入后端进行回放. 自办开放源码软件缺乏观测-日期API:新的同UTC-日转会使用其正常的当前日期API,而恢复或跨日转会则明显被存档用于人工恢复,而不是以假日期发送. 存档条目引用了原始可耐用的出箱条目并转出索引,将活动队列释放为活捉而无需复制其有效载荷. 直接日期的写作仍然不支持. 模棱两可的失败会暂停抓取直到恢复;回放至少是一次,并且可以复制服务器在取消前接受的写作. 启动不同的会话不会重放另一个会话的发件箱 .
诊断失败
失败的召回会产生一个有限度的“无法重复的回忆”上下文通知,有别于没有匹配的成功搜索。 嵌入式热身失败后仍有资格召回。 自备运输故障保留安全出错类别;无效的JSON单独报告.