oh-my-pi learn 工具:开启 autolearn 让 agent 沉淀可复用经验并生成托管技能
【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi
在 oh-my-pi(omp)里,learn工具负责把一条可复用的经验写进长期记忆,并可选地在同一次调用中创建或更新一个托管技能(managed skill)。这两个能力默认都是关闭的:autolearn.enabled和memory.backend的默认值分别是false和off,不配置时learn工具根本不会注册到会话里。本文的任务是:在配置中启用 autolearn 和一个受支持的 memory backend,让 agent 在工作结束后把「非显而易见的修复、项目约定、可复用流程」沉淀下来,并验证落盘的learned.md与SKILL.md产物。
前提与配置位置
learn工具的注册条件是(见 docs/tools/learn.md):
autolearn.enabled = true(默认false);memory.backend为"hindsight"、"mnemopi"或"local"三者之一。
manage_skill工具只要求autolearn.enabled = true,与 memory backend 无关(见 docs/tools/manage_skill.md)。
omp 的设置存放在 plain YAML 中(见 docs/settings.md):
| 作用域 | 路径 |
|---|---|
| 全局 | ~/.omp/agent/config.yml(若已存在config.yaml也会就地加载更新) |
| 项目级 | <cwd>/.omp/config.yml |
全局文件还受PI_CODING_AGENT_DIR环境变量影响——设置它之后,config.yml、auth store 以及 agent 目录下的所有内容都会跟着迁移。可以用omp config path打印当前生效的 agent 目录。
开启 autolearn 与本地记忆后端
最短主路径是使用文档推荐的localbackend(见 docs/memory.md)。在~/.omp/agent/config.yml(或项目级<cwd>/.omp/config.yml)中加入:
memory: backend: local autolearn: enabled: true也可以在 shell 里用omp config set写入全局配置:
omp config set memory.backend local omp config set autolearn.enabled true两个可选行为开关(见 docs/settings.md):
| 键 | 默认 | 作用 |
|---|---|---|
autolearn.autoContinue | false | 为true时,agent 停止后自动跑一轮 capture turn(消耗额外 token);为false时只会在你下一轮输入时附带一条被动提醒 |
autolearn.minToolCalls | 5 | 只有单轮使用了不少于该数量的工具时,停止后才触发 nudge |
启用后,顶层会话的工具列表中会自动包含learn和manage_skill;子代理(subagent)不会自动获得它们,只有在其 requested-tools/frontmatter 列表显式包含时才能使用。
验证配置是否生效
用omp config get确认生效值:
omp config get autolearn.enabled omp config get memory.backend omp config path # 打印当前 agent 目录,后续验证产物路径要用如果autolearn.enabled为true但memory.backend仍是off,learn不会注册,会话里只有manage_skill可用。
agent 如何调用 learn
learn由模型在会话中调用,不是用户直接敲的命令。它的触发路径(见 docs/tools/learn.md 与 controller 源码):
- 一轮实质性对话结束后(工具调用数达到
autolearn.minToolCalls,且该轮不是 aborted、不在 plan 模式审查中、不处于 goal 循环),controller 触发 capture:autoContinue: true时自动跑一个合成 capture turn;autoContinue: false时是一条被动提醒,附着在你的下一轮输入上。
- capture 轮里 agent 自行判断:可重复流程 →
manage_skill;持久事实/约定/非显而易见的修复 →learn;两者兼有 → 同一次learn调用里带上skill字段;没有值得保留的就什么都不做。
learn的入参:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
memory | string | 是 | 要记住的持久教训:what / when / why |
context | string | 否 | 教训的来源上下文 |
skill | { action: "create" \| "update"; name; description; body } | 否 | 教训写入成功后创建或增强的托管技能;body是不含 frontmatter 的 Markdown |
执行顺序是先落记忆、再动技能:local backend 下调用localBackend.save(...)写项目级learned.md,stored === 0视为失败;Hindsight 入队 retention;Mnemopi 以source: "coding-agent-learn"、importance: 0.8、scope: "bank"调用rememberScoped(...),未返回 id 视为失败。技能写入失败时,由于教训已经落盘,结果会报告为部分成功。
返回文本(文档定义的字面输出,可直接用于判断调用是否成功):
- 仅教训:
"Lesson stored."或"Lesson queued for retention."(details = { skill: null }); - 教训 + 技能:
"<lesson result>. Created managed skill \"<name>\"."或"... Updated ..."(details = { skill: "<name>" })。
验证落盘产物
按 backend 不同,验证位置不同。以localbackend 为例:
- 教训文件:写入
<agent-dir>/memories/<encoded-cwd>/learned.md(<agent-dir>默认为~/.omp/agent)。lesson 按新到旧排列、按规范化行去重、上限 100 条;单条 content 上限 2,000 字符,context 上限 400 字符,写入前会做 secret redaction。 - 托管技能文件:写入
<agent-dir>/managed-skills/<sanitized-name>/SKILL.md。frontmatter 由name和description生成,body里不要自己写 frontmatter。 - 会话内读取:agent 可以用
read工具直接读memory://root/learned.md(learn 捕获的教训)和memory://root/skills/<name>/SKILL.md(技能 playbook);/memory view可查看当前 backend 的注入负载(见 docs/memory.md)。
注入时机要注意两条:
- local lesson 从下一个会话开始注入到 system prompt 的 Memory Guidance 块,
learn调用本身不会修改当前会话的 prompt-cache 前缀; - 通过
learn写的托管技能不会立刻注入当前技能列表,而是在后续 skill refresh / 新会话中被发现。这与manage_skill不同——后者在写入成功后会立即刷新活跃技能列表,所以「当前会话必须立刻可用」的变更应改用manage_skill。
托管技能在发现流水线中走omp-managedprovider(priority 5,最低),同名时 authored skill 永远优先,托管技能只做兜底(见 docs/skills.md)。
限制与已知边界
来自 docs/tools/learn.md 的硬性限制:
- 托管技能名会被 trim、lowercase 后必须匹配
[a-z0-9][a-z0-9-]{0,63}; - 最终
SKILL.md(含生成的 frontmatter 和 description)上限 64,000 UTF-8 字节; create在技能文件已存在时失败,update在文件不存在时失败;- local backend 不提供结构化记忆检索,
recall、retain、reflect、memory_edit均不可用; - Hindsight 的 retain 队列会稍后 flush 到配置的服务器,Mnemopi 可能在同步写入后继续跑配置的 embedding / fact-extraction 任务。
常见报错对照
| 报错 | 原因 |
|---|---|
Mnemopi backend is not initialised for this session. | 会话缺少 Mnemopi 状态 |
Mnemopi did not store the lesson (no memory id returned). | 本地 Mnemopi 写入未返回 id,可选技能不会尝试 |
Lesson was empty after sanitization; nothing stored. | local backend 规范化后教训为空,可选技能不会尝试 |
Hindsight backend is not initialised for this session. | 会话缺少 Hindsight 状态 |
isError: true+details = { skill: null, shadowed: true } | skill.action = "create"时与活跃 authored skill 重名;教训已写入/入队,技能未写 |
<lesson result>, but the managed skill could not be written: <reason> | 技能校验、创建/更新、安全检查或体积失败 |
如果create报 shadowed,说明该名字已被你自己编写的技能占用——托管技能永远不会覆盖 authored skill,换名或改用update已有的托管技能即可。
下一步
- 想让当前会话立即发现技能变更,改用
manage_skill的create/update/delete(输出形如Created managed skill "<name>" (managed-skills/<name>/SKILL.md).); - 想调整记忆流水线的扫描、去重与注入 token 上限,参考 docs/memory.md 中的
memories.*配置表; - 想清空当前 backend 的记忆数据/产物,使用
/memory clear(注意:Hindsight 下它只清本地会话状态与 recall 缓存,不删服务器端 bank)。
【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考