# curl one-liner (macOS / Linux)
curl -fsSL https://skillvm.ai/install.sh | sh
# or via npm (any platform with Node ≥ 18; postinstall fetches the matching binary)
npm i -g @ipads-skvm/skvm
# self-check
skvm --help
The installer drops a standalone binary at ~/.local/share/skvm/bin/skvm (symlinked into ~/.local/bin/skvm) and bundles a private, isolated headless agent runtime used internally by skvm jit-optimize — it is fully self-contained and does not touch any agent or CLI you may have installed globally.
Agent-facing skills ship inside the install. Copy them into your agent harness’s skills directory to teach it how to drive skvm:
Writes a target capability profile to ~/.skvm/profiles/.
If your target model + adapter pair is already covered by the pre-built profiles shipped in skvm-data/profiles/, you can copy the cached result into your local profile cache and skip skvm profile entirely:
With the default --concurrency=1, this example typically takes about 20 minutes for one full run. If you want it to finish faster, increase --concurrency to profile more primitives in parallel.
2. Compile a skill against that profile
The compiler rewrites the skill to match the target’s capabilities. A cached profile for the same --model + --adapter pair must exist (run skvm profile first, or use skvm pipeline which profiles automatically).
The cache is user-global and shared across every directory you invoke skvm from, so profiles cached in one project are reused everywhere. Override the location via:
--skvm-cache=<path> flag (one-off)
SKVM_CACHE env var (persistent), e.g. export SKVM_CACHE=/mnt/fast/skvm
Individual subdirectories can also be pointed elsewhere with SKVM_PROFILES_DIR, SKVM_LOGS_DIR, and SKVM_PROPOSALS_DIR.
Dataset: skvm-data
The benchmark skills, tasks, and pre-built profiles live in a separate Git submodule (SJTU-IPADS/SkVM-data). Clone it if you plan to run skvm bench and want to use the bundled skills/tasks directly:
skvm bench resolves skills and tasks from skvm-data/ by default. Override the location via:
--skvm-data-dir=<path> flag (one-off)
SKVM_DATA_DIR env var (persistent)
Commands that take an explicit --skill=<path> or --task=<path> do not need the submodule — they work with any directory on disk.
skvm-data/profiles/ already includes pre-built profiles for some model + adapter combinations. If the pair you need is already there, copy skvm-data/profiles/ into your profile cache directory (default: ~/.skvm/profiles/, or SKVM_PROFILES_DIR if set) and you can skip running skvm profile for that target. See the profile list in the profiling section above for the currently bundled combinations.
@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}
}
SkVM
Compile and run LLM agent skills across heterogeneous models and harnesses
English | 中文
Website · GitHub · Paper
SkVM is a compilation and runtime system that makes LLM agent skills portable across heterogeneous models and harnesses. It has four major parts:
Reference: SkVM: Revisiting Language VM for Skills across Heterogenous LLMs and Harnesses — https://arxiv.org/abs/2604.03088
Demo
SkVM Optimization: Skill Quality Comparison
SkVM Accelerates Agent Execution
Install
The installer drops a standalone binary at
~/.local/share/skvm/bin/skvm(symlinked into~/.local/bin/skvm) and bundles a private, isolated headless agent runtime used internally byskvm jit-optimize— it is fully self-contained and does not touch any agent or CLI you may have installed globally.Agent-facing skills ship inside the install. Copy them into your agent harness’s skills directory to teach it how to drive skvm:
skvm-jit— post-task JIT optimization skill for submitting conversation logs toskvm jit-optimizeskvm-general— drivesprofile/aot-compile/bench/proposalson behalf of a userQuick Start
If you are running SkVM from the source tree instead of an installed binary, use
bun run skvmin the examples below.Set your API key:
If you use another provider, see docs/providers.md.
1. Profile a model’s primitive capabilities
Writes a target capability profile to
~/.skvm/profiles/.If your target model + adapter pair is already covered by the pre-built profiles shipped in
skvm-data/profiles/, you can copy the cached result into your local profile cache and skipskvm profileentirely:Currently bundled pre-built profiles:
qwen/qwen3.5-35b-a3b,deepseek/deepseek-v3.2,anthropic/claude-opus-4.6, and others.With the default
--concurrency=1, this example typically takes about 20 minutes for one full run. If you want it to finish faster, increase--concurrencyto profile more primitives in parallel.2. Compile a skill against that profile
The compiler rewrites the skill to match the target’s capabilities. A cached profile for the same
--model+--adapterpair must exist (runskvm profilefirst, or useskvm pipelinewhich profiles automatically).Compiled variants are written under
~/.skvm/proposals/aot-compile/<adapter>/<safeModel>/<skillName>/<passTag>/by default.3. Autotune the skill with synthetic tasks
The optimizer LLM derives tasks from the skill itself, then loops edit → rerun → score.
By default, synthetic mode generates 2 training tasks and 1 held-out test task.
Results are written under
~/.skvm/proposals/jit-optimize/<adapter>/<safeTargetModel>/<skillName>/<timestamp>/by default.4. Optimize from an existing conversation log
No rerun, just diagnose and edit. Good for post-mortems and for the
skvm-jitpost-task optimization hook.Review, accept, or reject the proposal
Configuration
SkVM keeps all runtime artifacts — cached profiles, proposal trees, bench and compile logs — under a single cache root:
The cache is user-global and shared across every directory you invoke
skvmfrom, so profiles cached in one project are reused everywhere. Override the location via:--skvm-cache=<path>flag (one-off)SKVM_CACHEenv var (persistent), e.g.export SKVM_CACHE=/mnt/fast/skvmIndividual subdirectories can also be pointed elsewhere with
SKVM_PROFILES_DIR,SKVM_LOGS_DIR, andSKVM_PROPOSALS_DIR.Dataset: skvm-data
The benchmark skills, tasks, and pre-built profiles live in a separate Git submodule (SJTU-IPADS/SkVM-data). Clone it if you plan to run
skvm benchand want to use the bundled skills/tasks directly:This populates the
skvm-data/directory:skvm benchresolves skills and tasks fromskvm-data/by default. Override the location via:--skvm-data-dir=<path>flag (one-off)SKVM_DATA_DIRenv var (persistent)Commands that take an explicit
--skill=<path>or--task=<path>do not need the submodule — they work with any directory on disk.skvm-data/profiles/already includes pre-built profiles for some model + adapter combinations. If the pair you need is already there, copyskvm-data/profiles/into your profile cache directory (default:~/.skvm/profiles/, orSKVM_PROFILES_DIRif set) and you can skip runningskvm profilefor that target. See the profile list in the profiling section above for the currently bundled combinations.Learn more
profile,aot-compile,run,bench,jit-optimize,proposals, and moregrade.pytask gradersCitation
If you use SkVM in your research, please cite: