@ipads-skvm/skvm
v0.1.5
Published
SkVM — compile and run LLM agent skills across heterogeneous models and harnesses
Readme
SkVM
跨异构模型与 Harness 的 LLM Agent Skill 编译和运行系统
SkVM 是一个面向 LLM Agent Skill 的编译与运行时系统,用来让 Skill 能在不同模型和 Harness 之间迁移与复用。它主要包含四个部分:
- Profiling — 评测某个模型 + Harness 组合在一组预定义原语能力上的表现
- AOT 编译 — 通过多阶段 AOT 编译器对 Skill 进行编译
- JIT 优化 — 同时优化运行效率(JIT-boost)和 Skill 内容质量(JIT-optimize)
- 基准测试 — 在不同任务、条件和模型下评估原始、编译后和优化后的 Skill
参考论文:SkVM: Revisiting Language VM for Skills across Heterogenous LLMs and Harnesses — https://arxiv.org/abs/2604.03088
Demo
SkVM 优化 skill 质量对比
SkVM 加速 Agent 执行
安装
# 一键安装(macOS / Linux)
curl -fsSL https://skillvm.ai/install.sh | sh
# 或通过 npm(任意支持 Node >= 18 的平台;postinstall 会自动拉取对应平台的二进制)
npm i -g @ipads-skvm/skvm
# 自检
skvm --help安装器会将独立二进制放在 ~/.local/share/skvm/bin/skvm(并链接到 ~/.local/bin/skvm),同时内置一份隔离的 headless agent 运行时,供 skvm jit-optimize 内部使用;整个安装完全自包含,不会影响你系统中已有的任何 agent 或 CLI。
面向 Agent 的 Skill 会随安装包一起提供。把它们复制到对应 Agent Harness 的 skills 目录后,Agent 就能学会如何驱动 skvm:
# OpenClaw
cp -r ~/.local/share/skvm/skills/skvm-jit ~/.openclaw/workspace/skills/
cp -r ~/.local/share/skvm/skills/skvm-general ~/.openclaw/workspace/skills/
# Hermes Agent
cp -r ~/.local/share/skvm/skills/skvm-jit ~/.hermes/skills/
cp -r ~/.local/share/skvm/skills/skvm-general ~/.hermes/skills/skvm-jit— 任务结束后收集对话日志,并提交给skvm jit-optimizeskvm-general— 帮助用户驱动profile/aot-compile/bench/proposals
快速开始
如果你是直接从源码仓库运行 SkVM,而不是使用已经安装好的二进制,那么下面的命令示例请把 skvm 替换为 bun run skvm。
先配置 API Key:
export OPENROUTER_API_KEY=sk-or-...如果你使用其他 provider,可以参考 docs/providers.md。
命令行上的 model id 形式为 <provider>/<model-id>:开头的 <provider> 用来匹配 providers.routes 中的路由(skvm 会在调用后端 SDK 前剥掉这一段)。走 OpenRouter 时是三段,例如 openrouter/qwen/qwen3.5-35b-a3b;走原生 SDK(Anthropic / OpenAI 等)时是两段,例如 anthropic/claude-sonnet-4.6。下文示例统一用 <provider>/<model-id> 占位符。
1. 评测模型的原语能力
运行后会在 ~/.skvm/profiles/ 下生成对应的能力 Profile。
如果你要使用的目标模型 + adapter 组合已经包含在 skvm-data/profiles/ 提供的预构建 Profile 里,那么可以直接把这些缓存结果复制到本地 Profile 缓存目录中,跳过 skvm profile:
mkdir -p ~/.skvm/profiles
cp -R skvm-data/profiles/. ~/.skvm/profiles/当前仓库内已提供的预构建 Profile 组合如下:
- 例如目前内置了
openrouter/qwen/qwen3.5-35b-a3b、openrouter/deepseek/deepseek-v3.2、openrouter/anthropic/claude-opus-4.6等目标的预构建 Profile。
skvm profile \
--model=<provider>/<model-id> \
--adapter=bare-agent在默认 --concurrency=1 的情况下,这个示例完整运行一次通常约需 20 分钟。如果你希望更快完成,可以调大 --concurrency,让更多原语能力评测并行执行。
2. 基于 Profile 编译 Skill
编译器会根据目标模型的能力改写 Skill。你需要先准备好同一组 --model + --adapter 对应的缓存 Profile(先运行 skvm profile,或者直接使用会自动完成 profiling 的 skvm pipeline)。
skvm aot-compile \
--skill=path/to/skill-dir \
--model=<provider>/<model-id> \
--adapter=bare-agent \
--pass=1 \
--compiler-model=<provider>/<model-id>编译产物默认会写入:
~/.skvm/proposals/aot-compile/<adapter>/<safeModel>/<skillName>/<passTag>/
3. 用合成任务自动调优 Skill
优化器会从 Skill 本身生成任务,然后反复执行“修改 → 重跑 → 评分”的循环。
默认情况下,synthetic 模式会生成 2 个 training task 和 1 个独立的 test task。
skvm jit-optimize \
--skill=path/to/skill-dir \
--task-source=synthetic \
--task-concurrency=3 \
--target-adapter=bare-agent \
--optimizer-model=<provider>/<model-id> \
--rounds=1 \
--target-model=<provider>/<model-id>生成的 proposal 默认会写入:
~/.skvm/proposals/jit-optimize/<adapter>/<safeTargetModel>/<skillName>/<timestamp>/
4. 基于已有对话日志进行优化
这种模式不会重跑任务,而是直接基于已有日志做诊断和修改。适合做事后分析,也适合配合 skvm-jit 的任务后反馈流程使用。
skvm jit-optimize \
--skill=path/to/skill-dir \
--task-source=log \
--target-adapter=bare-agent \
--logs=path/to/session.jsonl \
--optimizer-model=<provider>/<model-id> \
--target-model=<provider>/<model-id>查看、接受或拒绝 Proposal
skvm proposals list # CLI:列出 proposal
skvm proposals show <id> # CLI:查看 proposal 详情
skvm proposals accept <id> # CLI:接受 proposal
skvm proposals serve # Web:打开本地审阅界面配置
SkVM 会把所有运行时产物统一放在同一个缓存根目录下,包括缓存的 Profile、Proposal 树,以及 bench 和 compile 日志:
~/.skvm/
├── profiles/ # 缓存的目标能力 Profile
├── log/ # Profile、compile、bench 和运行时日志
└── proposals/ # AOT-compile、jit-boost、jit-optimize 产物这个缓存目录是用户级共享的。无论你在什么目录下运行 skvm,都会共用同一份缓存;因此,在一个项目中生成的 Profile,也可以在其他项目中复用。
你可以通过以下方式覆盖缓存位置:
--skvm-cache=<path>参数(单次生效)SKVM_CACHE环境变量(长期生效),例如:export SKVM_CACHE=/mnt/fast/skvm
此外,也可以分别通过 SKVM_PROFILES_DIR、SKVM_LOGS_DIR、SKVM_PROPOSALS_DIR 单独指定子目录位置。
数据集:skvm-data
基准测试使用的 Skill、Task 和预构建 Profile 存放在一个独立的 Git 子模块中:SJTU-IPADS/SkVM-data。
如果你计划运行 skvm bench,或者想直接使用内置的 Skill / Task,请先拉取这个子模块:
git submodule update --init # 或:git clone --recurse-submodules执行后会得到 skvm-data/ 目录:
skvm-data/
├── skills/ # 108 个 Skill 目录(每个目录都包含一个 SKILL.md)
├── tasks/ # 216 个 Task 目录(每个目录都包含一个 task.json)
└── profiles/ # 预构建的目标能力 Profile
├── bare-agent/
└── openclaw/skvm bench 默认会从 skvm-data/ 中解析 Skill 和 Task。你也可以通过下面的方式覆盖它的位置:
--skvm-data-dir=<path>参数(单次生效)SKVM_DATA_DIR环境变量(长期生效)
对于显式传入 --skill=<path> 或 --task=<path> 的命令,则不依赖这个子模块,可以直接使用磁盘上的任意目录。
skvm-data/profiles/ 已经包含了一部分模型 + adapter 组合的预构建 Profile。如果你需要的组合已经存在,那么只需要先把它们复制到本地 Profile 缓存目录中(默认是 ~/.skvm/profiles/,也可以通过 SKVM_PROFILES_DIR 指定),就可以跳过该目标上的 skvm profile。当前内置组合可以参考上面“评测模型的原语能力”一节中的列表:
mkdir -p ~/.skvm/profiles
cp -R skvm-data/profiles/. ~/.skvm/profiles/更多文档
- docs/usage.md — 完整命令参考,包括
profile、aot-compile、run、bench、jit-optimize、proposals等 - docs/architecture.md — 子系统结构图、数据流和磁盘布局
- docs/grade-protocols.md — 自定义
grade.py任务评分器的协议说明 - 论文:https://arxiv.org/abs/2604.03088
引用
如果你在研究中使用了 SkVM,请引用:
@article{chen2026skvm,
title={SkVM: Revisiting Language VM for Skills across Heterogenous LLMs and Harnesses},
author={Chen, Le and Feng, Erhu and Xia, Yubin and Chen, Haibo},
journal={arXiv preprint arXiv:2604.03088},
year={2026}
}