OpenInterpreter Codex 运行时记忆机制详解:memories 扩展的读取路径提示模板与实现内幕

OpenInterpreter Codex 运行时记忆机制详解:memories 扩展的读取路径提示模板与实现内幕 OpenInterpreter Codex 运行时记忆机制详解memories 扩展的读取路径提示模板与实现内幕【免费下载链接】openinterpreterA coding agent for open models like Kimi K3 and GLM 5.3项目地址: https://gitcode.com/GitHub_Trending/op/openinterpreterOpenInterpreter 的 codex-rs 运行时内置了一套“记忆memories”子系统它会为每个会话注入一段开发者指令教模型如何查找、使用并引用历史记忆中沉淀的经验。本文以该子系统的核心模板文件 read_path.md 为主体完整拆解它的决策边界、记忆目录布局、快速检索流程、引用规范与更新约束并结合 codex-rs/ext/memories 的 Rust 源码说明这段模板是如何被渲染、注入以及由哪些工具与安全检查支撑的。读完本文你能理解“Agent 何时该查记忆、按什么路径查、查完如何向用户标注引用”并能定位到模板中每一条规则的底层实现代码。模板在运行时的角色被嵌入的开发者指令read_path.md并不是给人阅读的普通文档而是一段带 Mustache 占位符的提示模板。它在编译期就被打进二进制prompts.rs 通过include_str!(../templates/memories/read_path.md)将其作为静态字符串加载并用LazyLockTemplate缓存解析结果若模板语法非法进程会直接 panic见parse_embedded_template的错误处理prompts.rs。渲染与注入发生在 build_memory_tool_developer_instructions 中关键行为如下基础路径固定为codex_home/memories并读取其中的memory_summary.md作为摘要来源摘要会被 truncate_text 按MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT2500 token定义见 lib.rs截断防止摘要撑爆上下文两个占位符被填充{{ base_path }}→ 记忆根目录{{ memory_summary }}→ 截断后的摘要文本若摘要为空函数返回None整段记忆指令不会被注入——也就是说模板中的MEMORY_SUMMARY区块只在真正存在摘要时才出现。注入条件在 extension.rs 中只有当Feature::MemoryTool特性开启且配置项memories.use_memories为真时扩展才生效MemoriesExtensionConfig::from_config。用户侧配置示例可参考 docs/memories.md其中给出了use_memories true的写法及“Inject relevant memories into future sessions”的说明。渲染结果通过ContextContributor::contribute_thread_context以PromptFragment::developer_policy的形式加入线程上下文即模板全文成为模型必须遵守的开发者策略指令。决策边界何时该查记忆模板开篇就给出了一套“使用记忆的决策边界”其核心逻辑是只有当请求明显自包含、不需要工作区历史/惯例/先前决策时才跳过记忆。硬性跳过的例子查询当前时间/日期、简单翻译、简单句子改写、一行 shell 命令、琐碎的格式调整。默认使用记忆的四种情形查询涉及 MEMORY_SUMMARY 中出现过的工作区/仓库/模块/路径/文件用户明确要求先前上下文、一致性或之前的决定任务存在歧义可能依赖早期项目选择任务不琐碎且与 MEMORY_SUMMARY 相关。拿不准时先做一次“快速记忆巡检quick memory pass”。这套规则的工程意义在于把“记忆检索”变成一个受控的、有预算的前置步骤而不是让模型无限制地翻阅历史。模板结尾再次强调当记忆可能相关时应先做快速巡检再进行深入的仓库探索——这与源码中记忆工具的输出截断策略见下文DEFAULT_READ_MAX_TOKENS共同构成成本约束。记忆目录布局从概要到证据模板定义了四级“由泛到专”的记忆布局{{ base_path }}即codex_home/memories路径作用使用要点memory_summary.md记忆摘要已内嵌在提示的MEMORY_SUMMARY区块中不要重复打开MEMORY.md可搜索的记忆注册表首要查询文件skills/skill-name/技能文件夹含SKILL.md入口指令、可选的scripts/、examples/、templates/rollout_summaries/每次会话rollout的回顾与证据片段条目路径可从MEMORY.md或rollout_summaries/中的rollout_path字段找到对rollout_summaries/中的文件模板明确了其格式约定这对做检索的人非常关键这些文件是append-only 的jsonlsession_meta.payload.id标识会话turn_context标记轮次边界event_msg是轻量状态流response_item才是真实的消息、工具调用与工具输出高效查找时优先匹配文件名后缀或session_meta.payload.id避免大范围全文扫描。这一布局与源码目录结构严格对应LocalMemoriesBackend的根目录就是codex_home/memorieslocal.rs而模板中提到的extensions/ad_hoc/notes/更新目录在 ad_hoc_note.rs 中被硬编码为AD_HOC_NOTES_DIR [extensions, ad_hoc, notes]。快速记忆巡检Quick Memory Pass模板给出的标准流程只有五步强调“轻、快、有界”扫一遍提示内嵌的 MEMORY_SUMMARY抽取与任务相关的关键词用这些关键词搜索MEMORY.md只有当MEMORY.md直接指向某些 rollout summary 或 skill 时才打开rollout_summaries/或skills/下 12 个最相关的文件若上述都不够清晰、又需要确切命令/错误文本/精确证据才沿rollout_path进一步检索没有任何相关命中时立即停止记忆查找正常继续任务。配套的两条约束快速巡检预算记忆查找应保持轻量理想情况下主工作开始前不超过46 步搜索避免对全部 rollout summaries 做宽泛扫描。执行期重入一旦在执行中遇到反复报错、行为异常或怀疑存在相关历史上下文应重做一遍快速巡检。记忆验证策略漂移风险 × 验证成本模板用“漂移风险drift与验证成本”两个维度给出验证决策矩阵漂移风险验证便宜验证昂贵/缓慢/有干扰高回答前先验证允许直接凭记忆回答但要声明其来自记忆、可能过时并考虑主动提议实时刷新低可直接凭记忆回答可直接凭记忆回答配合“凭记忆作答”的四条行为规范若某事实是本轮未验证的记忆来源在最终回答中简短说明若该事实易漂移或来自较旧笔记/快照/历史运行摘要要提示其可能已过时交互场景下若实时刷新有意义可主动提议现场验证尤其是关于先前结果、命令、耗时或旧快照的问题不得把未验证的记忆事实呈现为“已确认的最新事实”。这一段本质上是把“可信度标注”写进了提示词它约束的不是检索行为而是模型如何向用户诚实交代信息来源的时效性。引用规范oai-mem-citation机器可读区块模板对“用了记忆就必须留痕”给出了严格的机器可解析格式。只要使用了任何一个相关记忆文件就必须在最终回复的最末尾追加且仅追加一个oai-mem-citation区块结构如下引自模板原文oai-mem-citation citation_entries MEMORY.md:234-236|note[responsesapi citation extraction code pointer] rollout_summaries/2026-02-17T21-23-02-LN3m-example.md:10-12|note[weekly report format] /citation_entries rollout_ids 019c6e27-e55b-73d1-87d8-4e01f1f75043 019c7714-3b77-74d1-9866-e1f484aae2ab /rollout_ids /oai-mem-citation两个子区块的用途与细则citation_entries用于渲染展示每行一条引用格式为file:line_start-line_end|note[记忆的使用方式]文件路径必须相对于记忆基础路径如MEMORY.md、rollout_summaries/...、skills/...只引用记忆基础路径下实际使用过的文件不能把工作区文件冒充记忆引用若同时用了MEMORY.md和某个 rollout summary/skill两者都要引用按重要性降序排列note必须单行、只用简单字符避免特殊符号、不能换行永远不要引用空行行号区间需仔细核对。rollout_ids用于追踪哪些历史 rollout 被复用每行一个 rollout id形如 UUID如019c6e27-e55b-73d1-87d8-4e01f1f75043只包含不重复的 id可在 rollout summary 文件与MEMORY.md中找到该区块内不放文件路径和注释无 id 时允许留空rollout_ids对每条citation_entries应尽量补上对应的 rollout id。此外有两条硬性禁令PR 消息中永不包含记忆引用不得引用空行。这个设计的价值在于rollout_ids让平台侧可以统计“哪些历史会话真的被后续工作复用”形成记忆价值的可观测闭环。记忆更新约束只能“提建议”不能直接改模板最后规定了记忆写入路径只有当用户明确要求时才能更新记忆且必须来自用户的直接请求更新内容写在{{ base_path }}/extensions/ad_hoc/notes/下每条更新是一个独立的小文件描述要新增/删除/修改什么文件名必须为timestamp-short slug.md不得直接编辑记忆文件本身只能新增一条更新笔记。这条约束在源码中有着逐条对应的强制执行。ad_hoc_note.rs 的validate_filename实现了比模板文字更严格的文件名校验文件名总长不超过128 字节必须以.md结尾时间戳前缀必须是严格的YYYY-MM-DDTHH-MM-SS-格式has_valid_timestamp_prefix逐字节校验位置上的-、T与数字slug 长度 180 字节且只能包含小写 ASCII 字母、数字或连字符写入使用OpenOptions::create_new(true)重名会返回AdHocNoteAlreadyExists错误保证笔记不可覆盖目录创建路径全程经过reject_symlink检查防止符号链接逃逸。因此模板里那句“Do not try to edit the memory files yourself”不仅是提示词层面的约定后端 API 层面也根本没有“编辑记忆文件”的能力——只有add_ad_hoc_note、list、read、search四个工具tools/mod.rs全部注册在memories命名空间下lib.rs且仅在dedicated_tools配置开启时才会真正提供给模型extension.rs。工具侧的安全与截断细节模板描述的“搜索 MEMORY.md → 打开 12 个相关文件”流程在实现上对应search与read两个命名空间工具其参数边界值得留意read工具按相对路径读取记忆文件支持 1 起始的line_offset与max_linestools/read.rs。底层 local/read.rs 规定line_offset不得为 0、max_lines不得为 0按行切出字节区间后再用TruncationPolicy::Tokens(DEFAULT_READ_MAX_TOKENS)截断其中DEFAULT_READ_MAX_TOKENS为20000 tokenlib.rs响应中带有truncated标志供上层感知路径沙箱所有相对路径都会经过 resolve_scoped_path 校验——拒绝..、绝对路径、盘符前缀拒绝隐藏文件组件逐级做符号链接检查并阻止“穿过非目录组件”的写法。这正是模板中“引用路径必须相对记忆基础路径”的安全底座结果数量上限list默认与上限均为 2000 条search默认与上限均为 200 条lib.rs从 API 层面堵住了“宽泛扫描全部 rollout summaries”的可能与模板的“快速巡检预算”互为呼应工具调用结果会经record_tool_call打点上报tools/read.rs记忆使用行为本身也是可观测的。小结模板与实现的一一映射把read_path.md的全部规则与 codex-rs 源码对照可以看到一个清晰的设计模板负责“教模型怎么用记忆”扩展框架负责“让模型只能用记忆”。模板规则源码佐证摘要内嵌勿重复打开memory_summary.mdprompts.rs 读取并按 2500 token 截断后注入路径相对记忆基础路径、不得越界resolve_scoped_path 的组件级校验快速巡检 ≤46 步、避免宽泛扫描search上限 200 条、read20000 token 截断lib.rs引用块oai-mem-citation机器可解析纯提示词约定供平台侧解析rollout_ids做复用统计只准写extensions/ad_hoc/notes/文件名timestamp-slug.mdvalidate_filename create_new防覆盖仅用户明确要求才更新记忆工具集只暴露add_ad_hoc_note等四个命名空间工具无直接编辑通道对使用者而言理解这段模板意味着理解 OpenInterpreter 记忆能力的“使用协议”记忆检索是有预算的前置步骤凭记忆作答必须标注来源与可能过时引用必须落到文件行号与 rollout id而记忆的写入口被刻意收窄为单向的临时笔记队列。这些约束共同保证历史经验既能被高效复用又不会以不可验证的方式污染当前会话的输出。【免费下载链接】openinterpreterA coding agent for open models like Kimi K3 and GLM 5.3项目地址: https://gitcode.com/GitHub_Trending/op/openinterpreter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考