- 人工智能
- 大模型
- AI Agent
- 提示工程
【免费下载链接】SkillOpt
SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.
SkillOpt-Sleep 是 SkillOpt 项目中用于让 LLM Agent 在夜间自动挖掘重复任务、复盘轨迹并以"门控更新"方式沉淀可复用技能的引擎。本篇文章聚焦于它的 Devin 集成方案:通过一个纯标准库实现的 MCP(stdio)服务器,把skillopt_sleep引擎以sleep_*工具的形式暴露给 Cognition 的 Devin(CLI 与 IDE 均可使用),并借助一个Devin 专用 harvester把本地 Devin 数据转换为引擎能消费的 Claude Code 兼容 JSONL。读完本文,你将掌握该插件的文件布局、数据转换原理、安装步骤、七个 MCP 工具的完整参数语义、handoff无密钥后端的工作方式以及数据边界注意事项,并能在自己的 Devin 工作区中跑通"运行睡眠周期 → 查看提议 → 采纳"的完整流程。
为什么 Devin 需要独立的集成插件
Devin(Cognition)添加自定义工具的标准方式是MCP(Model Context Protocol),因此plugins/devin/目录以 MCP 服务器为核心形态提供集成。但有一个关键障碍:Devin 并不会把 Agent 会话记录以 SkillOpt-Sleep 引擎能够直接读取的格式落盘。于是该插件在 MCP 服务器之外,额外提供一个Devin 专用 harvester(harvest_devin.py),把本地所有可用数据源统一转换成引擎可读的 Claude Code 兼容 JSONL 会话文件,从而复用与其它共享引擎集成完全相同的python -m skillopt_sleep动作(见 mcp_server.py 中_run_engine对python -m skillopt_sleep <action> ...的调用)。
从源码结构看,这套插件的设计原则是"薄适配层、零重复逻辑":
- 转换(harvest)由插件负责:把 Devin 生态的数据翻译成引擎的会话格式;
- 优化(optimize)完全交给核心引擎:adapter 不做任何"采纳后二次复制",核心引擎直接将审阅过的提议应用到选定目标,并自行负责备份与回滚行为(README 中 "The adapter performs no post-adoption copy" 即指此意,参见 harvest_devin.py 与 devin-rules.snippet.md)。
目录结构与各文件职责
plugins/devin/下的文件及其用途如下(README "What's here" 的完整清单):
| 文件 | 用途 |
|---|---|
| mcp_server.py | 纯标准库 MCP(stdio)服务器,暴露sleep_*工具 |
| harvest_devin.py | 将 Devin ATIF-v1.7 转录、agentmemory、.devin/skills转换为 JSONL,附带taskKey与结果(outcome)信封 |
| judge.py | 验证门(validation gate)deferred/judge 分支的参考评分器 |
| mcp-config.example.json | 开箱即用的 MCP 服务器配置模板 |
| install.sh | 把 hooks 与 rules 复制进项目的.devin/,并打印 MCP 注册命令 |
| devin-rules.snippet.md | 由install.sh复制到.devin/rules/skillopt-sleep.md的规则片段 |
| hooks/hooks.v1.json | SessionEnd 钩子配置,由install.sh安装/合并到.devin/hooks.v1.json |
| hooks/on-session-end.sh | 尽力而为(best-effort)的活动标记脚本,由钩子调用 |
数据采集:harvester 把三类 Devin 本地数据变成 JSONL
三个数据源与所在位置
harvest_devin.py会从以下三个本地数据源合成 JSONL 会话(README "What it harvests"):
| 数据源 | 位置 |
|---|---|
| Devin 转录(ATIF-v1.7) | ~/.local/share/devin/cli/transcripts/*.json |
| agentmemory | ~/.agentmemory/standalone.json |
| Skill 文件 | .devin/skills/*/SKILL.md |
工作区(workspace)自动检测来自~/.config/Devin/User/workspaceStorage/*/workspace.json;从源码看,检测顺序还有两个额外的回退层级(harvest_devin.py 的_detect_workspaces):
- 环境变量
SKILLOPT_DEVIN_WORKSPACES(冒号/分号分隔的绝对路径列表,跨平台用os.pathsep分割); - Devin 注册表
~/.config/Devin/User/workspaceStorage/*/workspace.json(按 mtime 从新到旧排序); - 当前工作目录兜底。
由于 Devin 是 VS Code 家族应用,其用户数据目录随操作系统移动(Linux~/.config/<App>、Windows%APPDATA%\<App>、macOS~/Library/Application Support/<App>),源码中的_app_data_roots()与_devin_transcript_candidates()会按当前 OS 依次探测所有候选路径。
三种来源如何被"翻译"成会话
- ATIF-v1.7 转录:
source:"user"/source:"agent"消息被直接转换为 user/assistant JSONL 回合;每条转录还会被提炼出taskKey(见下)与 outcome 信封,并写入outcomes.jsonl; - agentmemory:每条记忆的
title成为合成的用户提示,content成为助手回复; - Skill 文件:每个
.devin/skills/<name>/SKILL.md的描述被转换为一个会话——用户提问"请使用<skill>技能",助手回复如何应用该技能(正文截取前 1200 字符)。
输出目录结构与~/.claude/projects/<slug>/<sessionId>.jsonl对齐,即<out_dir>/projects/<slug>/<session_id>.jsonl,其中<slug>是项目绝对路径的 SHA-256 前 16 位十六进制(与 Claude Code 的方案一致,见_slug())。默认输出目录为~/.skillopt-sleep-devin(环境变量SKILLOPT_DEVIN_CLAUDE_HOME可覆盖)。
为验证门准备的 taskKey 与 outcome 信封
SkillOpt 的门控(gate)"只在任务可重复且存在可检查的正确性信号时"才有效(README 明确:"The gate only works where tasks recur and have a checkable correctness signal")。为此,harvester 给原始转录补充两样东西(源码注释中的原话):
- 稳定的
taskKey:把重复出现的内容折叠成同一个"重复任务"。_normalize_task_key()生成的键格式为语言:意图:目标,例如java:fix:order-service——语言通过_LANG_HINTS(java/python/ts/js/sql/go/rust)正则推断,意图通过_INTENT_HINTS(fix/implement/refactor/test/review/optimize/explain)推断,目标优先取 CamelCase 标识符、其次文件名、再次首个非停用词; - outcome 信封:
_detect_outcome()从 agent 消息中正则匹配通过/失败信号(如BUILD SUCCESS、N passed、0 failed、traceback等),产出success+verifier(tests或build)+ 证据文本,以及可复跑的命令引用reference.repro。若没有任何硬信号,则退化为_judge_rubric_fallback():success=None、verifier:"judge",并附带由_build_rubric()从任务文本推导出的评分标准(rubric),告知门控"延迟到 judge 评分"而不是直接信任。
源码中还有一个容易被忽略的工程细节:合成的 user/reply 之间被刻意间隔至少 5 秒(ts += 5000),以避免"单轮会话被误判为<3s的无头回放而遭引擎 harvest 过滤器丢弃"(源码注释引用了 skillopt_sleep Issue #62 的处理)。采样夹具 devin_sample.json 展示了一份最小 ATIF-v1.7 转录:OrderService.persist()的空指针修复任务,含rtk mvn test -Dtest=OrderServiceTest -> BUILD SUCCESS, 142 passed, 0 failed这样的可检查信号,可用于理解 outcome 提取的正则匹配对象。
独立运行 harvester
harvest_devin.py也可以脱离 MCP 服务器单独运行:
python plugins/devin/harvest_devin.py \ [--out-dir PATH] \ [--agentmemory ~/.agentmemory/standalone.json] \ [--devin-transcripts /path/to/transcripts] \ [--workspaces /ws/a /ws/b ...] \ [--quiet]默认--out-dir为~/.skillopt-sleep-devin;--devin-transcripts按 OS 自动探测;--workspaces缺省时走上面描述的自动检测。结束时打印三类来源各自转换的会话数及总数。
参考评分器:judge.py 如何给"无硬信号"任务打分
对于没有测试/构建硬信号的任务,harvester 会在 outcome 信封中写入verifier: "judge"和rubric。验证门在回放(replay)阶段调用 judge.py 为候选回复打分,分数落在[0, 1];只有新技能在留出任务上严格得分更高时,门控才接受技能编辑。
judge.py 刻意保持自包含(self-contained)——完整部署中由 SkillOpt 引擎拥有回放+评分,但提供可独立运行的参考实现,便于脱离引擎做冒烟验证。两种后端通过环境变量SKILLOPT_JUDGE选择:
heuristic(默认):关键词覆盖率打分,离线、无需 API Key、确定性输出。每条评分标准只要回复中出现其任一内容词即视为"满足",最终得分为满足数/总条数;claude:经 Anthropic API 的 LLM 评分器(需要ANTHROPIC_API_KEY,模型默认claude-haiku-4-5-20251001,可用SKILLOPT_JUDGE_MODEL覆盖)。实现采用纯标准库urllib,密钥缺失或调用失败时优雅降级回 heuristic,保证门控永不硬错误。
# 从文件读取 rubric 与 reply python plugins/devin/judge.py --rubric rubric.json --reply reply.txt # 从 stdin 读取 reply,rubric 内联传入 echo "<reply>" | python plugins/devin/judge.py --rubric-inline '["Addresses OrderService", ...]'安装与注册:三步接入 Devin
前置条件:Python ≥ 3.10,且零第三方依赖——MCP 服务器是纯标准库实现(json/subprocess/sys等,见 mcp_server.py 顶部 import)。这也意味着插件不需要额外的pip install。
第 1 步:向项目安装 hooks 与 rules
在仓库根目录执行:
bash plugins/devin/install.sh /path/to/your/project脚本会做三件事(详见 install.sh,幂等、可重复执行):
- 把 on-session-end.sh 复制为
<project>/.devin/hooks/skillopt-sleep-on-session-end.sh并赋予执行权限; - 把 hooks.v1.json合并到
<project>/.devin/hooks.v1.json(若已存在则用内嵌 Python 按事件合并数组、跳过完全重复的条目,避免破坏项目已有 hooks;不存在则直接复制); - 把 devin-rules.snippet.md 复制为
<project>/.devin/rules/skillopt-sleep.md,让 Devin 在会话中主动了解这些工具(规则文件会提示 Devin"当用户询问 sleep 周期或技能进化时,优先调用这些工具而非解释概念",并要求始终以绝对工作区路径传project)。
最后脚本打印 MCP 注册命令。SessionEnd 钩子默认开启,但它只是一个"记录会话结束时间戳"的廉价活动标记(写入~/.skillopt-sleep/session-end.log),供本地检查或外部自动化使用;当前引擎按转录时间戳进行 harvest,并不消费该标记。钩子非阻塞、不消耗任何 API 预算,绝不会导致会话失败(脚本内exit 0保证)。
第 2 步:注册 MCP 服务器
直接使用install.sh打印的命令,或参考 mcp-config.example.json:
devin mcp add skillopt-sleep \ --env "SKILLOPT_DEVIN_CLAUDE_HOME=$HOME/.skillopt-sleep-devin" \ -- python3 /abs/path/to/SkillOpt/plugins/devin/mcp_server.py其中SKILLOPT_DEVIN_CLAUDE_HOME指定转换后 JSONL 的存放目录(默认~/.skillopt-sleep-devin);mcp_server.py还会读取SKILLOPT_SLEEP_REPO环境变量来定位仓库根(用于PYTHONPATH),缺省时按自身路径向上推导两级。
第 3 步:用自然语言驱动
安装完成后,直接向 Devin 说:
- "run the sleep cycle"(运行睡眠周期)
- "what did the last sleep propose?"(上次睡眠提议了什么)
- "adopt it"(采纳它)
七个 MCP 工具:完整语义与参数
MCP 服务器暴露以下工具(与 TOOLS 表 对应),每个工具底层都调用python -m skillopt_sleep <action> ...:
| 工具 | 对应引擎 action | 作用 |
|---|---|---|
sleep_status | status | 显示迄今运行的夜晚数 + 最新暂存(staged)提议 |
sleep_dry_run | dry-run | 预览一轮周期(harvest+mine+replay),不暂存;真实后端仍会产生 provider 调用 |
sleep_run | run | 运行完整周期,暂存一份供审阅的提议 |
sleep_adopt | adopt | 应用审阅过的 legacy 或 per-skill 提议(先备份) |
sleep_harvest | harvest | 调试用:列出挖掘到的重复任务 |
sleep_schedule | schedule | 安装夜间 cron 条目(--hour/--minute) |
sleep_unschedule | unschedule | 移除夜间 cron 条目 |
status、dry-run、run、harvest这四个读取数据的动作在执行引擎前,会先自动运行harvest_devin.py刷新本地缓存(源码中的_HARVEST_ACTIONS集合),并把--claude-home指向转换目录、默认--source claude(因为 Devin 转录已被转换成 Claude 格式)。
统一参数(_TOOL_SCHEMA)
所有工具共享同一套输入 Schema(mcp_server.py),服务端在运行时还会二次校验(_validate_tool_arguments:类型、控制字符、数值边界、enum、互斥模式都逐一检查,因为"客户端不可信、不能指望客户端强制 schema"):
| 参数 | 类型/取值范围 | 说明 |
|---|---|---|
project | string | 要进化的项目目录(默认 cwd) |
backend | enum:mock/claude/codex/copilot/handoff | mock不消耗 API(默认);后三者使用对应已认证 CLI;handoff无模型子进程与 API Key |
scope | enum:invoked/all | harvest 范围(默认仅被调用项目) |
source | enum:claude/codex/auto | 转录来源(默认claude) |
model | string | 后端特定的模型覆盖 |
tasks_file | string | 已审阅 TaskRecord JSON 路径(跳过 harvest) |
target_skill_path | string | 要进化/暂存/采纳的显式SKILL.md路径 |
progress | boolean | 向 stderr 打印阶段进度 |
max_sessions | integer 0–1,000,000 | 每次运行的 harvest 会话数上限 |
max_tasks | integer 0–1,000,000 | 每次运行的挖掘任务数上限 |
lookback_hours | integer 0–1,000,000 | harvest 时间窗口(小时,默认 72) |
auto_adopt | boolean | 门控通过时自动采纳(默认 false) |
json | boolean | 返回机器可解析的 JSON 输出 |
edit_budget | integer 0–1,000,000 | 每晚最大有界编辑次数(默认 4) |
另外两个参数只在特定工具上有效,服务端会强制约束(_ADOPT_ONLY_ARGS/_SCHEDULE_ONLY_ARGS):
hour(0–23,默认 3)、minute(0–59,默认 17):仅用于sleep_schedule;staging、skills、all_skills、legacy:仅用于sleep_adopt。
关于 sleep_adopt 的采纳控制(重点)
在sleep_adopt之前,务必先查看sleep_status与审阅过的 staging manifest,再选择与之一致的控制参数:
staging—— 指定要采纳的精确 staging 目录(替代"最新一晚");skills—— 要采纳的技能名数组;每个技能名会被转发为一条独立的--skill参数,不做 shell 插值(源码中_append_adopt_args用 argv token 逐条追加;若技能名以-开头则改为--skill=<name>形式,防止被解析为选项);all_skills—— 采纳所有已暂存的 per-skill 提议;legacy—— 仅采纳受管的SKILL.md/CLAUDE.md这一对 legacy 文件。
skills、all_skills、legacy三种选择模式只能选其一,禁止组合(服务端modes > 1时直接报错)。裸调用(不带任何选择参数)仅为了兼容"仅 legacy 暂存"的场景;fan-out 暂存(多技能)必须显式选择。若要对特定的 Devin 技能操作,把它的SKILL.md作为target_skill_path传入——adapter 在核心引擎返回后不会做第二次复制。
工具返回约定:exit_code、isError 与 json 模式
工具结果会在structuredContent中保留引擎的exit_code:
- 普通非零退出会置
isError: true; - 退出码 3 是预期的
handoff_pending状态,不是 MCP 工具错误(isError只在退出码不属于{0, 3}时为 true); - 当
json: true时,文本内容(content)就是引擎可解析的 JSON stdout,而 harvest 与引擎诊断信息仍单独放在structuredContent.diagnostics中,互不混淆。
后端选择与 handoff 无密钥模式
mock(默认):完全本地、不产生任何 API 花费,适合先跑通工作流;claude/codex/copilot:使用各自已安装并认证的 CLI 与预算(对应 SkillOpt 的claude_backend、codex_backend、copilot_backend,插件本身不实现额外的 API Key 流程);handoff:以"无模型子进程、无 API Key"的方式运行整轮周期。引擎把待处理的模型调用写入.skillopt-sleep-handoff/PROMPTS.md与pending.json,以退出码 3 结束;你把答案放入answers/<id>.md后,用相同参数重新运行sleep_run即可继续(devin-rules 片段提示通常需要 3–6 轮往返)。
handoff模式由引擎侧统一实现(见skillopt_sleep中_handoff_dir_for/_flush_handoff等逻辑),Devin 插件与其它的共享引擎集成共用同一套机制。若你有已审阅的任务文件,可传tasks_file跳过 harvest;在使用真实后端之前,务必检查/脱敏该文件,并确保其元数据包含"reviewed": true(devin-rules 片段中的明确要求)。
数据边界与隐私注意事项
Devin harvester 只读取本地的 ATIF 转录、agentmemory 与 skill 文件并转换为引擎会话格式。使用mock后端时整个工作流完全本地化;一旦切换到真实后端,截断后的摘录与派生任务会被发送到所选 provider,用于挖掘(mining)、回放(replay)、判定(judging)与反思(reflection)。
需要特别强调(README 原文):转换步骤并不保证出站提示中不含机密——在启用真实后端之前,请审阅敏感数据源与 provider 政策。相关指引见共享的 plugins/README.md 数据边界章节 与 已实现 CLI 参考。
另外,devin-rules 片段还提醒了一个容易踩的坑:sleep_schedule/sleep_unschedule是底层共享引擎的 cron 控制;当前被调度的命令不会执行 Devin 的转换步骤,因此不要把它当作"无人值守的 Devin harvest 工作流"使用——夜间自动化的正确姿势是让 Devin 会话中主动调用sleep_run,或显式把 harvest 纳入调度链路。
小结:一条可验证的本地闭环
从安装到生效,整套流程可以总结为一条闭环:install.sh植入钩子与规则 → Devin 每轮会话结束留下转录/记忆/技能文件 → MCP 服务器每次数据读取前自动运行 harvester 转成 JSONL → 引擎执行status/dry-run/run挖掘重复任务并暂存提议 → 人工(或 Devin)审阅sleep_status与 manifest 后用sleep_adopt显式采纳 → 引擎只对选定目标应用提议并自行备份。全程零第三方依赖、默认零 API 花费,且采纳行为始终掌握在审阅者手中。
- 人工智能
- 大模型
- AI Agent
- 提示工程
【免费下载链接】SkillOpt
SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.
相关推荐
为 Devin Desktop 接入 Hindsight 长期记忆:MCP 集成完整指南
为 Devin Desktop 接入 Hindsight 长期记忆:MCP 集成完整指南 Devin Desktop(原 Windsurf / Codeium)
人工智能AI AgentAgent 记忆MCP 服务为 Devin Desktop 接入 Hindsight 长期记忆:hindsight-devin-desktop 双 Agent 配置实战
为 Devin Desktop 接入 Hindsight 长期记忆:hindsight devin desktop 双 Agent 配置实战 本指南基于 hin
人工智能AI AgentAgent 记忆MCP 服务gbrain skillopt 完全指南:把 SKILL.md 当参数训练的自进化技能优化器
gbrain skillopt 完全指南:把 SKILL.md 当参数训练的自进化技能优化器 gbrain skillopt 是 gbrain 仓库中"自我进化
人工智能RAGAgent 记忆MCP 服务知识管理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考