开源基础设施,把散落的 SKILL.md 文件整理成精选、可直接检索的智能体技能语料库,还自带检索与评估工具。
69.7/100
综合分
694
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add EverMind-AI/SkillCorpus该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 skillcorpus_plugin/engine-typescript/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包@evermind-ai/dsh-skill-search(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 02:36:55
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 168 处,展示前 104 条)
- 写入本地文件skillcorpus_plugin/engine-typescript/src/bundle.ts:71
await mkdir(staging, { recursive: true }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/bundle.ts:87
await mkdir(join(target, '..'), { recursive: true }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/bundle.ts:88
await writeFile(target, data) - 写入本地文件skillcorpus_plugin/engine-typescript/src/bundle.ts:91
await rename(staging, destination) - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/bundle.ts:97
await rm(staging, { recursive: true, force: true }) - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/bundle.ts:100
await rm(staging, { recursive: true, force: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/bundle.ts:118
entries = await readdir(destination, { withFileTypes: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/hub-source.ts:124
if (!existsSync(destination)) { - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/hub-source.ts:168
rmSync(staging, { recursive: true, force: true }) - 发起网络请求skillcorpus_plugin/engine-typescript/src/hub-source.ts:189
const response = await fetch(this.downloadUrl(id), { headers, signal: controller.signal }) - 发起网络请求skillcorpus_plugin/engine-typescript/src/hub-source.ts:243
const res = await fetch(url, { headers, signal: controller.signal }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/index.ts:358
mkdirSync(root, { recursive: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/local-source.ts:122
text = await readFile(file, 'utf8') - 读取本地文件skillcorpus_plugin/engine-typescript/src/local-source.ts:186
entries = await readdir(dir, { withFileTypes: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:59
if (!existsSync(destination)) { - 读取本地文件skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:74
const skillMd = await readFile(join(dir, 'SKILL.md'), 'utf8') - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:79
await rm(destination, { recursive: true, force: true }).catch(() => {}) - 读取本地文件skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:109
const skillMd = await readFile(join(body, 'SKILL.md'), 'utf8') - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:120
await rm(staging, { recursive: true, force: true }).catch(() => {}) - 读取本地文件skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:125
const skillMd = await readFile(join(dir, 'SKILL.md'), 'utf8') - 发起网络请求skillcorpus_plugin/engine-typescript/src/marketplace-source.ts:193
const response = await fetch(url, { signal: controller.signal }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:137
mkdirSync(skillDir, { recursive: true }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:140
writeFileSync(scratch, `${JSON.stringify(payload, null, 2)}\n`, 'utf8') - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:141
renameSync(scratch, join(skillDir, MARKER)) - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/provenance.ts:148
rmSync(staging, { recursive: true, force: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:165
raw = JSON.parse(readFileSync(join(skillDir, MARKER), 'utf8')) - 读取本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:186
return readdirSync(root, { withFileTypes: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:276
destExists = statSync(dest).isDirectory() - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:281
renameSync(staging, dest) - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:286
renameSync(dest, retired) - 写入本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:288
renameSync(staging, dest) - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/provenance.ts:298
rmSync(retired, { recursive: true, force: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/provenance.ts:364
text = readFileSync(target, 'utf8') - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/provenance.ts:401
rmSync(retired, { recursive: true, force: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/refs.ts:70
if (relFile && existsSync(join(baseDir, relFile))) { - 读取本地文件skillcorpus_plugin/engine-typescript/src/refs.ts:85
if (trimmed && existsSync(join(baseDir, trimmed))) { - 读取本地文件skillcorpus_plugin/engine-typescript/src/refs.ts:104
return statSync(path).isDirectory() - 读取本地文件skillcorpus_plugin/engine-typescript/src/shared.ts:104
return statSync(path).isDirectory() - 读取本地文件skillcorpus_plugin/engine-typescript/src/shared.ts:121
raw = JSON.parse(readFileSync(target, 'utf8')) - 写入本地文件skillcorpus_plugin/engine-typescript/src/shared.ts:159
mkdirSync(parent, { recursive: true }) - 写入本地文件skillcorpus_plugin/engine-typescript/src/shared.ts:162
writeFileSync(scratch, `${JSON.stringify(payload, null, 2)}\n`, 'utf8') - 写入本地文件skillcorpus_plugin/engine-typescript/src/shared.ts:163
renameSync(scratch, path) - 删除本地文件递归skillcorpus_plugin/engine-typescript/src/shared.ts:170
rmSync(staging, { recursive: true, force: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/watch.ts:65
entries = readdirSync(dir, { withFileTypes: true }) - 读取本地文件skillcorpus_plugin/engine-typescript/src/watch.ts:79
out.push(`${path}:${statSync(path, { bigint: true }).mtimeNs}`) - 发起网络请求skillcorpus_plugin/plugin-openclaw/src/model.ts:42
const response = await fetch(`${base}/chat/completions`, { - 写入本地文件skillcorpus_plugin/plugin-openclaw/src/register.ts:58
mkdirSync(root, { recursive: true }) - 发起网络请求skillcorpus_plugin/plugin-openclaw2/src/model.ts:42
const response = await fetch(`${base}/chat/completions`, { - 写入本地文件skillcorpus_plugin/plugin-openclaw2/src/register.ts:96
mkdirSync(root, { recursive: true }) - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:135
const parsed = JSON.parse(readFileSync(path, "utf8")); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:443
if (relFile && existsSync(join2(baseDir, relFile))) { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:454
if (trimmed && existsSync(join2(baseDir, trimmed))) { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:469
return statSync(path).isDirectory(); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:566
entries = readdirSync(dir, { withFileTypes: true }); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:577
out.push(`${path}:${statSync2(path, { bigint: true }).mtimeNs}`); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:969
mkdirSync(skillDir, { recursive: true }); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:972
writeFileSync(scratch, `${JSON.stringify(payload, null, 2)} - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:974
renameSync(scratch, join4(skillDir, MARKER)); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:981
rmSync(staging, { recursive: true, force: true }); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1019
renameSync(staging, dest); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1023
renameSync(dest, retired); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1025
renameSync(staging, dest); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1033
rmSync(retired, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1187
await rm(staging, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1190
await rm(staging, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1408
rmSync2(staging, { recursive: true, force: true }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1432
const response = await fetch(this.downloadUrl(id), { headers, signal: controller.signal }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1484
const res = await fetch(url, { headers, signal: controller.signal }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1600
await rm2(destination, { recursive: true, force: true }).catch(() => { - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:1715
const response = await fetch(url, { signal: controller.signal }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/hook.mjs:2230
const response = await fetch(`${base}/chat/completions`, { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:134
const parsed = JSON.parse(readFileSync(path, "utf8")); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:434
if (relFile && existsSync(join2(baseDir, relFile))) { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:445
if (trimmed && existsSync(join2(baseDir, trimmed))) { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:460
return statSync(path).isDirectory(); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:557
entries = readdirSync(dir, { withFileTypes: true }); - 读取本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:568
out.push(`${path}:${statSync2(path, { bigint: true }).mtimeNs}`); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:960
mkdirSync(skillDir, { recursive: true }); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:963
writeFileSync(scratch, `${JSON.stringify(payload, null, 2)} - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:965
renameSync(scratch, join4(skillDir, MARKER)); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:972
rmSync(staging, { recursive: true, force: true }); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1010
renameSync(staging, dest); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1014
renameSync(dest, retired); - 写入本地文件skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1016
renameSync(staging, dest); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1024
rmSync(retired, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1178
await rm(staging, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1181
await rm(staging, { recursive: true, force: true }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1399
rmSync2(staging, { recursive: true, force: true }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1423
const response = await fetch(this.downloadUrl(id), { headers, signal: controller.signal }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1475
const res = await fetch(url, { headers, signal: controller.signal }); - 删除本地文件递归skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1591
await rm2(destination, { recursive: true, force: true }).catch(() => { - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:1706
const response = await fetch(url, { signal: controller.signal }); - 发起网络请求skillcorpus_plugin/plugin-workbuddy/dist/mcp.mjs:2221
const response = await fetch(`${base}/chat/completions`, { - 读取本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:82
const parsed: unknown = JSON.parse(readFileSync(this.cachePath, 'utf8')) - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:94
mkdirSync(dirname(this.cachePath), { recursive: true }) - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:99
writeFileSync(temp, JSON.stringify(file)) - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:100
renameSync(temp, this.cachePath) - 读取本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:111
entries = readdirSync(dir, { withFileTypes: true }) - 读取本地文件skillcorpus_plugin/plugin-workbuddy/src/cached-local-source.ts:121
out.push(`${path}:${statSync(path).mtimeMs}`) - 读取本地文件skillcorpus_plugin/plugin-workbuddy/src/config.ts:267
const parsed: unknown = JSON.parse(readFileSync(path, 'utf8')) - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/hook.ts:83
mkdirSync(dirname(config.logPath), { recursive: true }) - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/hook.ts:84
appendFileSync(config.logPath, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\n`) - 发起网络请求skillcorpus_plugin/plugin-workbuddy/src/model.ts:42
const response = await fetch(`${base}/chat/completions`, { - 写入本地文件skillcorpus_plugin/plugin-workbuddy/src/retrieve.ts:51
mkdirSync(root, { recursive: true })
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 整理SKILL.md文件
- 构建技能语料库
- 检索与评估工具
README
由 DeepSeek 最新模型翻译生成English · 简体中文
SkillCorpus 能给你什么
SkillCorpus 是 EverMind 将公开仓库中散落的 SKILL.md 文件转化为可靠 agent 上下文的开源流水线:它聚合源仓库,执行安全与许可门禁,评估质量,并在 agent 作答前匹配与任务相关的技能。
你可以直接使用线上的 SkillHub,不需要 clone 本仓库。只有当你想拥有这套能力的开源底座时,才需要 clone SkillCorpus:
- 构建自己的技能层 —— 把流水线指向自己的 source registry,使用策展、安全和许可门禁,再为自己的 agent 导出语料。
- 修改它的行为 —— 修改分类体系、质量与去重规则、检索配方、导出字段、评测套件或宿主插件。
- 掌控部署方式 —— 自己部署已发布的检索模型,把自己的 agent 接进来,而不是依赖托管的 SkillHub API。
核心代码采用 Apache-2.0 许可(match/、evaluate/ 和 lifecycle/ 三个工具包为 MIT);每个技能保留其上游许可。
公开的 1,000 条 demo 语料、三个 agent benchmark 和线上的 SkillHub 展示了结果。
展开完整文档(README 剩余 1 节)
English · 简体中文
SkillCorpus 能给你什么
SkillCorpus 是 EverMind 将公开仓库中散落的 SKILL.md 文件转化为可靠 agent 上下文的开源流水线:它聚合源仓库,执行安全与许可门禁,评估质量,并在 agent 作答前匹配与任务相关的技能。
你可以直接使用线上的 SkillHub,不需要 clone 本仓库。只有当你想拥有这套能力的开源底座时,才需要 clone SkillCorpus:
- 构建自己的技能层 —— 把流水线指向自己的 source registry,使用策展、安全和许可门禁,再为自己的 agent 导出语料。
- 修改它的行为 —— 修改分类体系、质量与去重规则、检索配方、导出字段、评测套件或宿主插件。
- 掌控部署方式 —— 自己部署已发布的检索模型,把自己的 agent 接进来,而不是依赖托管的 SkillHub API。
核心代码采用 Apache-2.0 许可(match/、evaluate/ 和 lifecycle/ 三个工具包为 MIT);每个技能保留其上游许可。
公开的 1,000 条 demo 语料、三个 agent benchmark 和线上的 SkillHub 展示了结果。
https://github.com/user-attachments/assets/4d9a3241-df13-4b20-9798-fb7920069995
🔥 最新动态
- 2026-10-28 十月版语料已有 300,473 条技能,其中商用版 178,173 条——策展流水线与 schema 不变。
HuggingFace 发布即将到来。
- 2026-10-23 SkillRep —— 技能检索难在请求与技能的表述错位,而既有方法各自只动一两个维度。我们 首次完整定义这个表示空间(五个维度,前人多半只占其中一点),在整个空间上寻优,在两个主流 benchmark 上双双 SOTA:0.6B 编码器在 SRA-Bench 上 MRR@10 超出同尺寸最强检索器 7.02 分, SkillsBench 第一。更进一步,我们让这个空间变得可解释——三个可测量的量指出每个维度缩小的是错位的哪一部分,以及它们何时相互抵消。代码与模型均已开源。
arXiv:2610.32336 | 代码 | HF 编码器 · reranker
- 2026-10-23 Beyond Gain —— 技能库在持续膨胀(我们十月版已 30 万条),模型又在不断更新,hub 必须按模型退役它已经内化的技能。但"内化"此前无法可靠度量:通行的按增益退役对"模型已吸收"和 "根本没人用得了"读数完全相同。我们首次让内化变得可度量——扣住技能直接测模型,且只在另有模型确实能从它获益时才采信高分:旧判据下 SkillsBench 九成以上的退役建立在没人做得出的题上,新判据则无收益损失、可复现性高出近一倍。代码与数据均已开源。
arXiv:2610.32322 | 代码 | HF 1,251 条技能 × 4 个模型
- 2026-09-17 · v0.4.0 新增跨 agent 共享技能库:六个宿主共读同一个 ~/.evermind-skillsearch/ 目录并各自登记,一处拥有的 skill 在其他 agent 里也能用;从目录检索到的 skill 落盘保留,不再用完即弃;改动下一轮即生效,无需重启。Raven 和 Hermes 另外新增 skills_dirs / SKILLSEARCH_SKILLS_DIRS。
- 2026-09-02 支持 OpenClaw 2.0,并新增更智能的 Skill 注入策略:可选择每轮自动检索,或由主 Agent 按需调用 skill_search。
- 2026-08-27 支持本地 Skill、EverMind SkillHub、ClawHub 和 skillhub.cn 多源检索,并完成过滤、去重和最终 0–2 条选择。
- 2026-08-26 支持 PathGuard 占位符解析和宿主路径适配,正确处理 Skill 文件与 Agent 工作目录。
- 2026-08-25 新增面向 WorkBuddy、OpenClaw、Hermes、Raven 和 DeepSeek Harness 的官方 SkillCorpus 插件。
让 agent 每一轮都更强
在 agent 作答时,真正的区别是一层检索:SkillHub 根据当前任务选出经过审核的过程性知识,并把它放进 agent 的上下文里。
维度没有 SkillCorpus 接入 SkillCorpus 之后
上下文模型自身知识,加上人工维护的 prompt。
自动或按需检索与任务匹配、经过许可审计的 SKILL.md。
执行通用流程可能漏掉具体步骤、边界情况或配套脚本。
在执行前把流程、参考资料和可选脚本带进上下文。
集成每个宿主都要自己维护一套任务指令。
同一套策展后的技能层服务 OpenClaw、Hermes、Raven、WorkBuddy、DeepSeek Harness 和其他宿主。
结果不是换了一个 agent,而是让同一个 agent 在真正需要时获得更贴合任务的过程性知识——不需要用户记技能名字,也不需要自己接工具调用。
效果
同一 harness、同一 backbone,通过率从「无技能」到「接入 SkillCorpus」的变化(论文 Table 1):
| Harness × backbone | SkillsBench | GDPVal | QwenClawBench |
| OpenClaw × Qwen3.5-27B | 8.8 → 13.0 | 81.2 → 83.1 | 65.2 → 66.7 |
| OpenClaw × Qwen3.5-397B | 11.1 → 16.9 | 82.2 → 84.0 | 65.7 → 67.0 |
| Raven × Qwen3.5-27B | 10.0 → 16.5 | 82.6 → 83.8 | 66.9 → 70.8 |
| Raven × Qwen3.5-397B | 9.2 → 22.6 | 84.0 → 85.2 | 68.8 → 73.2 |
| 合并 ∆ | +7.5±2.3 (z=3.2) | +1.51±0.49 (z=3.1) | +2.79±0.70 (z=4.0) |
任务越依赖模型本身不具备的过程性知识,收益越大(SkillsBench);模型本来就能做的开放式经济类任务收益最小(GDPVal)。
SkillHub 集成
SkillHub 已为下面五个 agent 平台提供技能检索。点击对应平台,直接查看插件指南:
DeepSeek Harness
Hermes
OpenClaw1.x / 2.0
Raven
WorkBuddy
两种模式,一个开关。按需检索(默认)把 skill_search 工具交给 agent,由它自己判断:长任务只在真正需要的那一步付检索成本,其余轮次不花钱。mode: auto 是原来的行为——每一轮、模型作答之前就检索并注入,不需要工具调用,也不用记技能名字。两者互斥,同时开会让同一轮检索两遍。
OpenClaw 分成两个包,因为 2.0 去掉了 1.x 插件所依赖的那个 hook:plugin-openclaw 面向 2026.7.x 及更早,plugin-openclaw2 面向 2.0(2026.8.1)及以后。Raven 插件现在就能装、按需模式可用;mode: auto 要等 Raven 上游合并 context_segments 插槽后才能认领 skills 阶段,在那之前是静默失效的。Raven 自带的检索无论哪种情况都照常工作。
根据 https://github.com/EverMind-AI/SkillCorpus/blob/main/skillcorpus_plugin/INSTALL.agent.md 安装 SkillCorpus Plugins。
把上面这句粘给你的 agent,它会自己装好。各宿主的具体配置、你真正会碰的五个配置项、每轮的开销、以及哪些数据会离开你的机器——都在 skillcorpus_plugin/。
公开产物
下面这张表列出目前真正公开的产物。
| | 产物 | 内容 | 链接 |
| 🌐 | SkillHub | 当前 114,190 条在线目录 + 那两个模型的托管 API,无需安装 | evermind.ai/skillhub |
| 📚 | 语料 (demo) | 可下载的 1,000 条样本 —— skills.parquet + attachments.tar.zst + dataset card;完整目录由 SkillHub 提供服务 | 🤗 demo-1k |
| 🗂️ | 完整语料 (即将发布) | 完整的 114,190 条数据集,schema 与目录结构同 demo —— skills.parquet + attachments.tar.zst + dataset card | 🤗 即将发布 |
| 🔡 | 检索模型 | 从 Qwen3-Embedding-0.6B 和 Qwen3-Reranker-0.6B 微调出的 bi-encoder 与 reranker | 🤗 bi-encoder · reranker |
| 🛠️ | 代码 | 本仓库 —— 构建语料、训练那两个模型的流水线(aggregate · curate · match · evaluate · export) | GitHub |
| 🔌 | 插件 | 为 OpenClaw · Hermes · WorkBuddy · Raven 提供宿主适配器,另有 DeepSeek Harness 与 HTTP adapter | skillcorpus_plugin/ |
目前开源:代码、1,000 条 demo 语料和检索模型。完整的 114,190 条语料正在准备发布到 HuggingFace。托管的 SkillHub 服务本身不开源。
论文所评测的 96,401 条快照,按 16 类体系和三个质量维度(utility / robustness / safety)组织,并带 1024 维检索向量。字段约定见 docs/corpus-schema.md。
直接调 API
SkillHub 把语料分三级提供:发现(元数据)、读正文(skill_md)、下载(含 scripts/ 的 zip)。大多数技能是纯指令,读正文这一级通常已足够。
curl "https://skillhub.evermind.ai/openapi/v1/skills?q=extract+tables+from+a+PDF"
从结果中取一个 id,获取它的 skill_md,注入 agent 的 prompt。
examples/skillhub_demo.py 把三级都跑通了:
检索 + 读正文 —— 纯标准库,不用安装,不用 API key
python examples/skillhub_demo.py "extract tables from a scanned PDF invoice"
顺带把命中的第一个技能的脚本包拉下来
python examples/skillhub_demo.py --install ./skills "convert a PDF to images"
检索并把正文注入 prompt 后真正执行任务 —— 任意 OpenAI 兼容 LLM(OpenAI / OpenRouter / 本地 vLLM…)
export OPENAI_API_KEY=... # 用 OpenRouter / vLLM 时再设
export OPENAI_BASE_URL=https://openrouter.ai/api/v1 # OPENAI_BASE_URL + --model openai/gpt-4o-mini
python examples/skillhub_demo.py --ask "extract tables from a scanned PDF invoice"
task: extract tables from a scanned PDF invoice
[1/2] search → 2 hit(s), metadata only
1. ocr-and-documents q=0.808 DOC-PROC MIT
Extract text from PDFs/scans (pymupdf, marker-pdf).
2. document-workflows q=0.86 DOC-PROC MIT
Build end-to-end document processing workflows and pipelines …
[2/2] detail → fetching skill_md for 2 skill(s)
ocr-and-documents: 4916 chars u=8 r=7 s=9 files=4 flags=['no_steps']
document-workflows: 31628 chars u=9 r=9 s=9 files=7
→ built a prompt of 36,742 chars with the skill bodies injected
端点、响应信封、状态码和限速见 docs/integrations.md。
自建模型服务
若不想依赖托管端点,可自己跑 selection。语料和两个检索模型都已发布:加载数据、部署两个模型,自己做 encode → top-k → rerank。
数据 —— 目前是 1,000 条 demo;完整的 114,190 条语料后续发布 from datasets import load_dataset
skills = load_dataset("EverMind-AI/skillcorpus-demo-1k", split="train") # 1,000 条 demo 技能
或者用 pandas 直接读文件(不依赖 datasets): pip install pandas import pandas as pd; skills = pd.read_parquet("skills.parquet")
附件(scripts/、references/)以同级的 attachments.tar.zst 形式发布。
先装 serving 依赖(torch、transformers 等),再把两个环境变量指向已发布的检查点(脚本自带的默认值是训练产物,全新克隆里并不存在),然后把两个模型部署在同一个端点后面 -> /embed + /score
pip install -r skillcorpus/match/requirements.txt
EMBEDDING_MODEL=<embedding 检查点目录> RERANKER_MODEL=<reranker 检查点目录> \
bash skillcorpus/match/scripts/run_server.sh
这个端点只提供模型的 /embed + /score (见 skillcorpus/match/ → Serving),并不是 SkillHub 那个仅托管的 /openapi/v1/skills API 的替代品。因此:
- examples/skillhub_demo.py 和 C 节的集成只对接托管的 SkillHub;自部署时,你直接在 /embed + /score 之上运行自己的 selection。
- 它同时也是 producer 去重所用的 embedding 端点,把 embedding.provider 配成 skillrouter_remote,即可用它来构建自己的语料。
想策展自己的源,见 构建自己的语料。
工作原理
收集和策展是基础,真正的价值是 agent 执行前能拿到与任务匹配的技能。
skillcorpus/
├── core/ 数据模型 · SQLite/faiss 存储 · LLM 与 embedding 客户端 ├── aggregate/ 源注册表 + 多仓库克隆 ├── curate/ 解析 · 安全 · 许可 · 分类 · 质量 · 去重 + 全库扫描 ├── export/ 语料写出(parquet + 附件 + dataset card) ├── match/ 发布的两个模型 + 训练配方 ← 依赖独立 ├── evaluate/ skillsbench · qwenclawbench · gdpval 评测 ← 依赖独立 ├── lifecycle/ 按不带技能的水平、逐模型退役技能 └── cli.py build · stats · export
cli build 会执行完整的策展链路(ingest → quality_pass → dedup_pass → license_audit → export.corpus)。当没有可用的模型端点时,LLM 分类与质量打分会自动降级为规则实现,因此整条管线始终能端到端跑通。
match/ 和 evaluate/ 是独立的工具包,各自带有 requirements.txt(torch / transformers,按 benchmark 区分);安装主包时不会被一并拉入。
- 检索 —— skillcorpus/match/ 就是发布的那两个模型:从 Qwen3-Embedding-0.6B 微调的 bi-encoder 负责候选召回,从 Qwen3-Reranker-0.6B 微调的 reranker 负责对候选打分重排。SkillHub 已托管这两个模型;如需自行部署,见 Serving(serve.py + run_server.sh)。该目录还包含训练配方(合成 query → InfoNCE → listwise CE)和 eval_compare.py(检索指标 nDCG / MRR / Hit / Recall)。
- 评测 —— skillcorpus/evaluate/:skillsbench、qwenclawbench、 gdpval,各自独立,带自己的 README 和依赖。
- 退役 —— skillcorpus/lifecycle/ 针对每个部署模型判断它已经内化、可以退役哪些技能:从每个技能合成任务,分别在不带技能和带技能时给模型打分,按不带技能的水平而非增益退役。它是论文 Beyond Gain: Measuring Skill Internalization for Agent Skill Retirement 的代码。
构建自己的语料
仅当你想策展自己的源时才需要这一节。它需要一个 LLM 端点做分类与质量打分,以及一个 embedding 端点做去重,详见 docs/running.md。
git clone https://github.com/EverMind-AI/SkillCorpus.git skillcorpus && cd skillcorpus
python3 -m venv .venv && source .venv/bin/activate
python -m pip install --upgrade pip && pip install -e .
python -m skillcorpus.cli build # 4 个 demo 源 -> 策展 -> 导出
python -m skillcorpus.cli stats # 按 source / category / license 统计
python -m skillcorpus.cli export --out ./corpus
只有来自 GREEN 许可源仓库的技能才会被导出(demo 直接信任 audit/license_safe_sources.json 里的白名单;生产环境按源仓库 SPDX 逐个把关)。每行的 license 是技能自己声明的值,因此 demo 语料里仍可能出现非 GREEN 的 license 字符串。
用 --sources-config your.yaml 指定自己的源注册表,或用 --source <name> 只构建单个源。
pip install -e ".[dev]"
python -m pytest skillcorpus/tests -p no:cacheprovider --import-mode=importlib
路线图
- [x] 策展管线:16 类体系、三维质量、逐源许可审计
- [x] 微调检索栈 + 三个 benchmark 的评估
- [x] 按不带技能的水平、逐模型退役技能(skillcorpus/lifecycle/)
- [x] 公开的 SkillHub 端点
- [x] 检索模型(bi-encoder + reranker)与 1k demo 语料上 HuggingFace
- [ ] 完整的 114,190 条语料上 HuggingFace —— 即将发布
- [x] 两个检索模型的部署脚本(自建 match/)
- [x] 把 skill 库 + 检索框架打包成插件,供 WorkBuddy · Hermes · OpenClaw · DeepSeek Harness 使用
- [ ] Raven 插件——已打包,等上游 context_segments 插槽
EverMind 生态
EverMind 将记忆研究、可直接使用的产品与实际集成连接为一个开源生态。
产品
EverOS
本地优先、Markdown 原生的 Agent 与用户长期记忆运行时。
Raven
以记忆为核心的自进化 Agent Harness,具备主动性、上下文控制与 Skill 进化能力。
EverMe(CLI)面向跨设备、跨 Agent 个人记忆的 CLI 与 Agent 插件套件。
研究与评测
SkillCorpus
将分散的 Agent Skill 整理为可检索语料库,并提供检索与评测工具。
EverAlgo
为 EverOS 提供无状态的提取、排序、解析与记忆算法。
HyperMem
基于超图的分层记忆架构,用于由粗到细的长期对话检索。
MSA
面向可扩展潜在记忆与一亿 Token 上下文的 Memory Sparse Attention。
EverMemBench
从事实召回、应用推理和个性化泛化三个层面评测记忆系统。
EvoAgentBench
纵向评测 Agent 自进化、迁移效率、错误规避和 Skill 使用能力。
插件与集成
OpenClaw
OpenClaw 插件,自动管理召回、写入与会话记忆生命周期。
Hermes Agent
Hermes 插件,为 Hermes 会话提供持久记忆。
DeepSeek Harness
DSH 插件,让 DeepSeek Harness Agent 使用长期记忆。
Dify
本地版与云端版工具,在工作流和 Agent 中显式搜索与写入记忆。
这些项目共同构成 EverMind 从研究到运行时的完整链路:将方法与评测转化为可复用的记忆基础设施、产品和 Agent 集成。
引用
@article{wang2026skillcorpus,
title = {SkillCorpus: Consolidating and Evaluating the Open Skill Ecosystem for Real-World LLM Agents},
author = {Wang, Yanze and Yao, Pengfei and Sun, Tianyi and Hu, Chuanrui and Xiao, Yan and Luo, Xiaotian and Han, Yunyun and Chen, Yifan and Sun, Jun and Deng, Yafeng},
year = {2026},
eprint = {2607.15557},
archivePrefix = {arXiv},
url = {https://arxiv.org/abs/2607.15557}
}
许可
- 代码 —— Apache-2.0(match/、evaluate/ 和 lifecycle/ 三个工具包各自为 MIT,见其目录下的 LICENSE)。
- 语料 —— 每个技能保留其上游原始许可;只收录 GREEN(MIT / Apache-2.0 / BSD / ISC / …)
许可的技能,不做任何重新授权。每行都带 source、source_url、license,下游使用须遵循各技能自身的条款。
完整的 GREEN/RED/YELLOW 策略、许可数据流与 opt-out 通道见 docs/licence-and-governance.md。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
EverMind-AI/SkillCorpus
开源基础设施,把散落的 SKILL.md 文件整理成精选、可直接检索的智能体技能语料库,还自带检索与评估工具。
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,266已汉化DSH
72
智能体记忆系统MemTensor/MemOS
MemOS 2.0 Stardust星尘
★ 12,228已汉化DSH
71.3
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
跨智能体会话记忆vshulcz/deja-vu
你的编码智能体不再重复调试你已经修好的问题。
★ 1,367已汉化MCP
70.4
动画花园资源检索yjl9903/AnimeGarden
按番剧、字幕组和类型搜索动画 BT 资源
★ 1,391已汉化DSH
69.2
代码图谱记忆syncable-dev/memtrace-public
你的智能体值得拥有结构化记忆。
★ 510已汉化MCP
67.8