SkillOpt 的 Devin 插件:为 Cognition Devin 接入 SkillOpt-Sleep 夜间技能进化循环的 MCP 集成指南
2026/9/21 14:57:01 网站建设 项目流程
  • 人工智能
  • 大模型
  • 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.

项目地址:https://gitcode.com/gh_mirrors/sk/SkillOpt
点击查看免费下载

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_enginepython -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.mdinstall.sh复制到.devin/rules/skillopt-sleep.md的规则片段
hooks/hooks.v1.jsonSessionEnd 钩子配置,由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):

  1. 环境变量SKILLOPT_DEVIN_WORKSPACES(冒号/分号分隔的绝对路径列表,跨平台用os.pathsep分割);
  2. Devin 注册表~/.config/Devin/User/workspaceStorage/*/workspace.json(按 mtime 从新到旧排序);
  3. 当前工作目录兜底。

由于 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 SUCCESSN passed0 failedtraceback等),产出success+verifiertestsbuild)+ 证据文本,以及可复跑的命令引用reference.repro。若没有任何硬信号,则退化为_judge_rubric_fallback()success=Noneverifier:"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,幂等、可重复执行):

  1. 把 on-session-end.sh 复制为<project>/.devin/hooks/skillopt-sleep-on-session-end.sh并赋予执行权限;
  2. 把 hooks.v1.json合并<project>/.devin/hooks.v1.json(若已存在则用内嵌 Python 按事件合并数组、跳过完全重复的条目,避免破坏项目已有 hooks;不存在则直接复制);
  3. 把 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_statusstatus显示迄今运行的夜晚数 + 最新暂存(staged)提议
sleep_dry_rundry-run预览一轮周期(harvest+mine+replay),不暂存;真实后端仍会产生 provider 调用
sleep_runrun运行完整周期,暂存一份供审阅的提议
sleep_adoptadopt应用审阅过的 legacy 或 per-skill 提议(先备份)
sleep_harvestharvest调试用:列出挖掘到的重复任务
sleep_scheduleschedule安装夜间 cron 条目(--hour/--minute
sleep_unscheduleunschedule移除夜间 cron 条目

statusdry-runrunharvest这四个读取数据的动作在执行引擎前,会先自动运行harvest_devin.py刷新本地缓存(源码中的_HARVEST_ACTIONS集合),并把--claude-home指向转换目录、默认--source claude(因为 Devin 转录已被转换成 Claude 格式)。

统一参数(_TOOL_SCHEMA

所有工具共享同一套输入 Schema(mcp_server.py),服务端在运行时还会二次校验(_validate_tool_arguments:类型、控制字符、数值边界、enum、互斥模式都逐一检查,因为"客户端不可信、不能指望客户端强制 schema"):

参数类型/取值范围说明
projectstring要进化的项目目录(默认 cwd)
backendenum:mock/claude/codex/copilot/handoffmock不消耗 API(默认);后三者使用对应已认证 CLI;handoff无模型子进程与 API Key
scopeenum:invoked/allharvest 范围(默认仅被调用项目)
sourceenum:claude/codex/auto转录来源(默认claude
modelstring后端特定的模型覆盖
tasks_filestring已审阅 TaskRecord JSON 路径(跳过 harvest)
target_skill_pathstring要进化/暂存/采纳的显式SKILL.md路径
progressboolean向 stderr 打印阶段进度
max_sessionsinteger 0–1,000,000每次运行的 harvest 会话数上限
max_tasksinteger 0–1,000,000每次运行的挖掘任务数上限
lookback_hoursinteger 0–1,000,000harvest 时间窗口(小时,默认 72)
auto_adoptboolean门控通过时自动采纳(默认 false)
jsonboolean返回机器可解析的 JSON 输出
edit_budgetinteger 0–1,000,000每晚最大有界编辑次数(默认 4)

另外两个参数只在特定工具上有效,服务端会强制约束(_ADOPT_ONLY_ARGS/_SCHEDULE_ONLY_ARGS):

  • hour(0–23,默认 3)、minute(0–59,默认 17):仅用于sleep_schedule
  • stagingskillsall_skillslegacy:仅用于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 文件。

skillsall_skillslegacy三种选择模式只能选其一,禁止组合(服务端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_backendcodex_backendcopilot_backend,插件本身不实现额外的 API Key 流程);
  • handoff:以"无模型子进程、无 API Key"的方式运行整轮周期。引擎把待处理的模型调用写入.skillopt-sleep-handoff/PROMPTS.mdpending.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.

项目地址:https://gitcode.com/gh_mirrors/sk/SkillOpt
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询