
Mem0 Pin 技能深度解析固定关键记忆抵御 OpenCode Dream 整合裁剪【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchainMem0 插件为 AI 编码 Agent 提供了跨会话的持久记忆但在记忆量增长后自动整合Dream consolidation会合并重复项并裁剪过期条目——此时架构决策、安全约束这类“永远不能丢”的记忆就需要一个显式的保护机制。本文基于 OpenCode 插件版mem0-pin技能SKILL.md完整讲解 Pin/Unpin 的四步执行流程、[PINNED]标记的设计原理以及它与mem0-dream剪枝逻辑之间的配合关系。读完本文你可以直接在 OpenCode 中使用/mem0-pin命令固化关键记忆并理解该机制在插件源码中的实际落地方式。定位Pin 解决什么问题mem0-pin技能的元信息声明了它的职责与适用场景Pins or unpins a memory to protect it from pruning during dream consolidation. Use when a memory is critical and must never be removed, such as architecture decisions, security constraints, or immutable team conventions. ——将记忆固定以在 Dream 整合期间保护其免于被裁剪。适用于架构决策、安全约束、不可变更的团队约定等关键记忆。要理解 Pin 的价值先要看它的“对手”——mem0-dream技能mem0-dream/SKILL.md执行的整合流程拉取项目全部记忆 → 按metadata.type分组 → 识别近重复对合并候选、矛盾对与裁剪候选 → 打印 diff 报告 → 经用户确认后应用。其中裁剪规则有两类metadata.type命中保留策略且超过保留天数比较created_at。内建默认值为session_state90 天、compact_summary90 天其余类型默认不裁剪confidence 0.3且不含项目独有信息无文件路径、标识符或领域名词。而 Dream 对固定记忆的处理只有一条硬规则见该技能 Step 3a 与 3c合并候选要求“Neither memory is pinned (metadata.pinned ! true)”裁剪候选“Always skip memories wheremetadata.pinned true, regardless of age or confidence”。也就是说一条被 Pin 的记忆无论多老、置信度多低都不会在自动整合中被合并或删除。这正是 Pin 技能存在的意义给关键记忆上“永久豁免”。核心机制为什么用[PINNED]文本前缀Pin 技能的关键设计原文 Step 3是不依赖 metadata 更新而是把标记写进记忆文本本身——pinned_text [PINNED] original_text if not original_text.startswith([PINNED]) else original_text update_memory(idselected_id, textpinned_text)选择“前缀标记随文本走”而不是更新metadata.pinned源于工具能力的约束。同仓库 Claude Code 版技能 skills/pin/SKILL.md 说得更加直白The MCPupdate_memorytool only acceptsmemory_id,text, andsource— it does not accept ametadataparameter. To pin, append a pin marker to the text.即远程 MCP 版本的update_memory只接受memory_id、text、source三个参数无法改 metadata因此只能改文本。OpenCode 原生插件版的update_memory工具其实暴露了可选metadata参数见 opencode-mem0.ts 中的工具定义但技能仍统一采用前缀方案好处是跨端兼容——无论底层走 MCP 还是原生 SDK 工具标记都落在文本上行为一致幂等——startswith([PINNED])判断保证重复 Pin 不会叠加前缀可见可审计——用get_memories/search_memories浏览记忆时[PINNED]前缀一目了然。固定新记忆时则“文本前缀 metadata”双管齐下见下文 Step 3同时满足文本可见性与 Dream 的metadata.pinned判定。与插件源码的对应关系对照 opencode-mem0.ts 可以印证技能流程中用到的每个工具技能中的调用插件中的实现关键行为search_memories(query, filters, top_k)L466-L490top_k缺省为 10limit ?? top_k ?? 10技能指定top_k5以控制候选列表get_memory(id)L516-L526按 ID 精确取回完整内容与 metadataupdate_memory(id, text)L528-L543原地覆盖文本保留 ID 与历史优于“删了重加”add_memory(text, user_id, app_id, metadata, infer)L418-L464自动补默认 metadataconfidence、source、type、session_id、branch当confidence 1.0且未显式指定infer时自动置inferFalseL446-L449get_event_status(event_id)L616-L626v3 写入是异步的返回的event_id需轮询/v1/event/端点确认落库值得注意的是add_memory的这段逻辑Pin 新记忆时技能指定metadata{pinned: true, type: decision, confidence: 1.0}并显式传inferFalse——即使忘了传inferconfidence: 1.0也会触发 L447-L449 的兜底保证关键记忆按原文逐字存储verbatim不经过 LLM 事实抽取。这与“固定即不可失真”的语义完全一致。另外技能流程中user_idactive_user_id、app_idactive_project_id的取值并非凭空而来插件在启动时解析身份L30-L67项目 ID 优先取 git remote 的owner/repo跨 clone、worktree 稳定分支取git branch --show-current并通过shell.envhook 导出MEM0_USER_ID、MEM0_APP_ID、MEM0_SESSION_ID、MEM0_BRANCH供各技能直接读取。执行流程Pin 一条已存在的记忆技能定义的完整流程是“查找 → 读取 → 打标记 → 确认”四步严格顺序执行。Step 1: Find the memory用户提供二选一搜索查询词或记忆 ID。有 ID直接get_memory按 ID 取回搜索查询search_memories带项目作用域过滤与条数限制search_memories( query用户查询, filters{AND: [{user_id: id}, {app_id: pid}]}, top_k5, )filters中的user_idapp_id双键是 Mem0 Platform 的实体作用域模型记忆挂在“用户 × 应用项目”维度上缺了app_id就可能在跨项目的全局搜索下误操作到别的仓库。查询完成后向用户展示带编号的内容预览列表并询问“Which memory to pin? Enter a number.”Step 2: Read current content用选定记忆的 ID 再次调用get_memory读取并保存两个字段original_text—— 记忆文本内容original_metadata—— 现有metadata字典。“先读后改”是为了在 Step 3 做幂等的前缀判断也避免覆盖用户已有的内容。Step 3: Pin it按上文核心机制将[PINNED]前缀拼到原文本前已存在则跳过调用update_memory覆盖pinned_text [PINNED] original_text if not original_text.startswith([PINNED]) else original_text update_memory(idselected_id, textpinned_text)参数名提示OpenCode 原生工具用的是id若走远程 MCP 版工具MCP 工具表见 integrations/mem0-plugin/README.md 的 “MCP Tools” 一节参数名写作memory_id两者语义相同。固定一条新记忆用户想 Pin 一段尚未存储的文本走新增路径调用add_memorytext[PINNED] the users textuser_idactive_user_idapp_idactive_project_idmetadata{pinned: true, type: decision, confidence: 1.0}inferFalse响应中包含event_idv3 写入为异步。调用get_event_status(event_idevent_id)一次拿到落库后的记忆 ID然后进入确认环节。metadata三个字段的用意各不相同pinned: true供 Dream 剪枝逻辑判定豁免type: decision命中插件自动安装的编码分类法architecture_decisions等 17 个开发向类别由 opencode-mem0.ts#L122-L128 附近的后台任务配置详见 README “Coding-tuned categories” 一节让固定记忆天然归入“决策”语义分组confidence: 1.0既表达确定性也兜底触发inferFalse的原文存储。Step 4: Confirm固定成功后按固定格式回执Pinned: memory content, first 80 chars Memory ID: id仅当内容超过 80 字符时才在末尾补...。回执给出 Memory ID方便后续unpin或直接按 ID 操作。Unpin解除固定技能同时定义了反向操作用户说出 unpin 时触发get_memory读取当前内容去除前缀后写回unpinned_text original_text.removeprefix([PINNED] ) update_memory(memory_idid, textunpinned_text)打印回执Unpinned: content...。removeprefix只移除开头的一个标记与 Pin 时的幂等判断互为镜像——无论被 Pin 过几次Unpin 一次即恢复原文。OpenCode TUI 输出格式约束技能末尾有一条容易被忽视但影响体验的硬性要求IMPORTANT: Do NOT use markdown in your output. OpenCode TUI renders text verbatim — markdown likebold,## headers, and | table | syntax appears as raw characters. Use plain text with indentation for structure. Use dashes for lists. Use spaces to align columns instead of markdown tables.原因是 OpenCode 的 TUI 逐字渲染文本markdown 语法会以原始字符形式裸露出来。因此技能的列表、对齐都要求纯文本缩进做层级、短横线做列表、空格对齐列。同仓库其余技能如 mem0-dream/SKILL.md、mem0-status/SKILL.md也带同一约束属于 OpenCode 技能生态的统一规范。运行前提与操作路径mem0-pin是 OpenCode 插件版mem0/opencode-plugin内置的 9 个技能之一其余为mem0-remember、mem0-tour、mem0-search、mem0-status、mem0-scope、mem0-dream、mem0-forget、mem0-context-loader技能清单见 opencode-plugin/README。操作前提设置环境变量MEM0_API_KEYm0-开头的平台密钥插件 opencode-mem0.ts#L262-L277 启动时解析不到 key 会直接报错并禁用全部记忆工具安装插件opencode plugin mem0/opencode-plugin加--global可全局安装重启 OpenCode。插件的confighook 会扫描 opencode-skills/ 目录把每个含SKILL.md的子目录注册进config.command/mem0-pin才会出现在 TUI 斜杠菜单中注册逻辑见 opencode-mem0.ts#L334-L362。典型工作流先/mem0-pin固定“认证数据库使用 PostgreSQL”这类决策 → 日常使用 → 记忆积累后跑/mem0-dream做整合此时 Pin 过的记忆在合并候选与裁剪候选两个环节都会被跳过其余重复、过期条目按 diff 报告经用户确认后清理。若某条固定后来不再关键再用/mem0-pin的 unpin 分支解除保护。小结Pin 的本质是一条“双保险”标记文本[PINNED]前缀保证跨工具版本可见且可幂等增删新增路径的metadata{pinned: true, ...}则直接对接mem0-dream的剪枝豁免判定流程上严格遵循“按 ID/搜索定位 → 读取原文 → 原地update_memory覆盖 → 带 ID 回执确认”新记忆走add_memory(inferFalse)get_event_status异步确认原理上Pin 与 Dream 构成 Mem0 记忆生命周期的一对机制前者给关键记忆上永久豁免后者负责其余记忆的合并、矛盾消解与按保留策略的清理两者共同维持记忆库的信噪比。【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考