一个支持双沙箱方案的 Claude Skills 兼容运行时:macOS seatbelt 用于原生 Python 和 Shell 脚本执行(主要方式),加上实验性的基于 WASM 的沙箱用于跨平台安全。OpenSkills 实现了 Claude Code Agent Skills 规范,为任何智能体框架提供安全、灵活的运行时来执行技能。
OpenSkills 与 Claude Skills 100% 语法兼容,这意味着任何遵循 Claude Skills 格式(带有 YAML 前置元数据的 SKILL.md)的技能都可以在 OpenSkills 上运行。OpenSkills 的独特之处在于其双沙箱架构:
主要执行模型:通过 macOS seatbelt 的原生 Python 和 Shell 脚本(计划支持 Linux seccomp)。这是推荐的生产就绪方法,可与完整的 Python 生态系统和原生工具配合使用。
实验性 WASM 支持:WASM 沙箱可供希望探索跨平台确定性执行的开发者使用,但使用 OpenSkills 并不需要它。大多数技能使用原生脚本即可完美运行。
OpenSkills 可以集成到任何智能体框架(LangChain、Vercel AI SDK、自定义框架)中,为智能体提供 Claude 兼容的技能访问能力。
100% 语法兼容性:OpenSkills 使用与 Claude Skills 完全相同的 SKILL.md 格式来读取和执行技能。技能可以在 Claude Code 和 OpenSkills 之间共享,无需修改。
双沙箱架构:OpenSkills 结合了 macOS seatbelt(主要方式)与实验性的 WASM/WASI 0.3 沙箱:
原生优先:大多数技能使用原生脚本;WASM 是特定用例的可选方案
原生脚本优先:OpenSkills 优先考虑原生 Python 和 Shell 脚本执行,这提供了对完整 Python 生态系统和原生工具的访问。WASM 编译作为实验性选项,适用于需要跨平台确定性的特定用例。
OpenSkills 专为需要 Claude 兼容技能的任何智能体框架而设计:
推荐方法:大多数技能使用原生 Python 和 Shell 脚本。WASM 可用于实验性用例,但不是必需的。
Linux seccomp 支持正在规划中
WASM 支持(实验性):
建议:生产技能使用原生 Python 和 Shell 脚本。WASM 可用于实验性用例,但不是必需的。
OpenSkills 将在保持其原生优先方法的同时不断发展以解决限制:
Linux 原生脚本:计划支持 Linux seccomp 以完成跨平台原生沙箱(macOS seatbelt 已经生产就绪)。
WASM 改进(实验性):继续开发 WASM 支持,用于需要确定性和跨平台一致性的特定用例。
增强的工具:为原生脚本和 WASM 编译提供更好的开发工具和模板。
openskills build 用于将 TS/JS 编译为 WASM 组件(实验性)# Rust(从源码)
git clone https://github.com/Geeksfino/openskills.git
cd openskills
# 初始化子模块(测试和示例需要)
git submodule update --init --recursive
cd runtime
cargo build --release
# TypeScript
npm install @finogeek/openskills
# Python
pip install finclip-openskills
# 注意:预构建的 wheel 包仅适用于 macOS 和 Linux。
# Windows 用户需要从源码构建:git clone https://github.com/Geeksfino/openskills.git && cd openskills/bindings/python && pip install maturin && maturin develop
OpenSkills 使用插件化构建系统将 JavaScript/TypeScript 编译为 WASM。系统支持多个构建后端(插件),您可以选择最适合您需求的编译器。
插件系统架构:
- 插件:处理编译的模块化构建后端(例如:javy、quickjs、assemblyscript)
- 自动检测:未指定插件时,系统按顺序尝试可用插件,直到找到一个可用的
- 插件选择:通过 --plugin 标志或 .openskills.toml 配置文件显式选择
新用户推荐:quickjs 插件(设置最简单 - 只需运行下面的设置脚本)
首次设置(构建技能前必需):
运行设置脚本以安装构建工具并下载依赖:
# 这将:
# - 下载 WASI 适配器
# - 安装 javy CLI(如果可用则下载预构建二进制文件)
# - 安装 wasm-tools
# - 检查可选工具(AssemblyScript)
./scripts/setup_build_tools.sh
构建技能:
# 从 TypeScript/JavaScript 构建技能
cd my-skill
openskills build
# 自动检测:按顺序尝试插件(javy → quickjs → assemblyscript)
# 直到找到一个可用且具有所有依赖项的插件
显式选择插件:
openskills build --plugin quickjs # 推荐:设置最简单
openskills build --plugin javy # 需要 javy plugin.wasm 文件
openskills build --plugin assemblyscript # 需要 asc 编译器
openskills build --list-plugins # 显示所有可用插件及其状态
插件对比:
- quickjs(推荐):设置最简单 - 只需运行设置脚本。使用 javy CLI + wasm-tools。支持 WASI 0.3。
- javy:需要构建 javy plugin.wasm 文件。使用 javy-codegen 库。传统支持。
- assemblyscript:高性能的类似 TypeScript 的语言。需要 asc 编译器。
替代方案:javy 插件设置(如果您更喜欢默认的 javy 插件):
如果您想使用 javy 插件而不是 quickjs,您需要构建 javy 插件:
# 构建 javy 插件(一次性设置)
./scripts/build_javy_plugin.sh
# 导出插件路径(或添加到您的 shell 配置文件中)
export JAVY_PLUGIN_PATH=/tmp/javy/target/wasm32-wasip1/release/plugin_wizened.wasm
配置文件(可选):在技能目录放置 .openskills.toml 或 openskills.toml。
[build]
plugin = "quickjs" # 或 "assemblyscript"
# 插件选项通常自动检测
# [build.plugin_options]
# adapter_path = "~/.cache/openskills/wasi_preview1_adapter.wasm"
插件系统工作原理:
1. 插件选择:您可以通过 --plugin 标志、配置文件指定插件,或让系统自动检测
2. 自动检测:未指定插件时,系统按顺序尝试已注册的插件,直到找到一个:
- 可用(具有所有必需的依赖项)
- 支持源文件扩展名(.ts、.js 等)
3. 插件执行:每个插件处理完整的编译管道:
- TypeScript 转译(如需要)
- JavaScript/TypeScript → WASM 核心模块
- WASM 核心 → WASI 0.3 组件(用于 quickjs/assemblyscript)
4. 自动设置:QuickJS/AssemblyScript 插件在需要时自动下载 WASI 适配器
5. 配置:可以通过 .openskills.toml 或 --plugin-option 标志配置插件
查看 构建工具指南 了解有关构建过程和插件机制的详细信息。
use openskills_runtime::{OpenSkillRuntime, ExecutionOptions};
use serde_json::json;
// 从标准位置发现技能
let mut runtime = OpenSkillRuntime::new();
runtime.discover_skills()?;
// 执行技能
let result = runtime.execute_skill(
"my-skill",
ExecutionOptions {
timeout_ms: Some(5000),
input: Some(json!({"input": "data"})),
..Default::default()
}
)?;
查看 开发者指南 获取详细的使用示例。
OpenSkills 可与任何智能体框架配合使用,为智能体提供 Claude 兼容的技能访问。以下是一些示例:
LangChain (TypeScript/Python)
import { OpenSkillRuntime } from "@finogeek/openskills";
import { DynamicStructuredTool } from "@langchain/core/tools";
const runtime = OpenSkillRuntime.fromDirectory("./skills");
runtime.discoverSkills();
const tool = new DynamicStructuredTool({
name: "run_skill",
schema: z.object({ skill_id: z.string(), input: z.string() }),
func: async ({ skill_id, input }) => {
const result = runtime.executeSkill(skill_id, { input });
return result.outputJson;
},
});
Vercel AI SDK
import { OpenSkillRuntime } from "@finogeek/openskills";
import { tool } from "ai";
const runtime = OpenSkillRuntime.fromDirectory("./skills");
const runSkill = tool({
inputSchema: z.object({ skill_id: z.string(), input: z.string() }),
execute: async ({ skill_id, input }) => {
return runtime.executeSkill(skill_id, { input }).outputJson;
},
});
查看 examples/agents 获取与 LangChain、Vercel AI SDK 等的完整集成示例。
OpenSkills 使用 Rust 核心运行时和语言绑定:
┌────────────────────┐
│ 您的应用程序 │
│ (TS/Python/Rust) │
└──────────┬──────────┘
│
┌──────▼──────┐
│ 绑定层 │ (napi-rs / PyO3)
└──────┬──────┘
│
┌──────▼──────┐
│ Rust 核心 │ (openskills-runtime)
└──────┬──────┘
│
┌──────▼──────┐
│ 执行层 │ (WASM/WASI 0.3 + macOS seatbelt)
└─────────────┘
wasm/skill.wasm 或通过 macOS seatbelt 运行原生 .py/.shallowed-tools 映射能力到 WASM 或 seatbeltOpenSkills 是唯一结合以下特性的运行时:
这种双重方法意味着您将获得: - 原生灵活性:通过 seatbelt 获得完整的 Python 生态系统和原生工具(主要方式) - 实验性 WASM:用于特定用例的跨平台确定性(可选) - 安全性:两种沙箱方法都提供强大的隔离 - 兼容性:100% 兼容 Claude Skills 规范
状态:WASM 沙箱是实验性的,不是主要的执行方法。大多数技能使用原生 Python 和 Shell 脚本即可完美运行。
虽然原生脚本是我们的主要执行模型,但我们正在为特定用例投资 WASM 支持,在这些用例中它提供独特的价值。以下是我们对 WASM 角色的观点:
✅ 确定性:相同输入 → 相同输出,对审计、重放和合规性至关重要
✅ 快速启动:毫秒级启动时间,非常适合频繁调用的智能体技能
✅ 设计上的强隔离:除非明确暴露,否则无系统调用,通过 WASI 实现基于能力的访问
✅ 可移植性:在 macOS、Linux、Windows 上执行完全相同
✅ 窄攻击面:无 Shell,无 fork 炸弹,无 ptrace 漏洞利用
最适合:策略逻辑、编排、验证、评分、推理粘合剂和确定性工作流。
❌ 完整 Python 生态系统:NumPy、SciPy、pandas、PyTorch 依赖原生扩展、BLAS、CUDA
❌ GPU 和硬件加速:实验性、脆弱、不符合监管要求
❌ 操作系统原生行为:文件监视器、共享内存技巧、复杂 IPC
❌ 传统技能:许多假设 Python + 操作系统能力
您无法回避这些限制。 这就是为什么我们优先考虑生产环境使用原生脚本。
Docker 是操作系统边界。WASM 是语言边界。
它们是互补的,而非竞争的:
┌─────────────────────────────┐
│ 智能体运行时 │
│ │
│ ┌───────────────────────┐ │
│ │ WASM 技能沙箱 │ │ ← 实验性:逻辑、策略、编排
│ │ - 确定性 │ │
│ │ - 可审计 │ │
│ │ - 快速启动 │ │
│ └───────────────────────┘ │
│ │ │
│ 委托调用 │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ 原生技能沙箱 │ │ ← 主要方式:Python、ML、量化、原生工具
│ │ - Python │ │
│ │ - ML / 量化 │ │
│ │ - Seatbelt/seccomp │ │
│ └───────────────────────┘ │
└─────────────────────────────┘
WASM 是: - 始终可用(实验性) - 需要确定性的特定用例的默认选择 - 值得信赖的逻辑和策略执行
原生是: - 主要执行模型 - 完整生态系统访问所必需 - 通过操作系统沙箱严格控制
不是。也不应该是。
它们解决不同的问题。试图用 WASM 替代 Docker 会导致复杂性、失望和变通方案。
WASM 是一个强大的沙箱,但不是完整的沙箱。
WASM 隔离良好的方面: - ✅ 内存安全(无任意内存访问) - ✅ CPU 指令(无特权操作) - ✅ 除非暴露,否则无系统调用 - ✅ 确定性执行
WASM 无法完全单独控制的方面: - ❌ 资源耗尽(CPU 时间、内存增长、无限循环)- 需要主机强制限制 - ❌ 主机漏洞 - 如果 WASM 运行时存在漏洞,没有第二道防线 - ❌ 通过主机函数的原生逃逸 - 文件系统、网络、加密函数在原生环境中运行
行业现实:即使是严肃的系统也分层使用沙箱: - Cloudflare Workers:WASM + 操作系统隔离 - Fastly Compute@Edge:WASM + VM - 生产环境中的 Wasmtime:WASM + seccomp - Deno:V8 + 操作系统沙箱
没有人在高信任边界上裸运行 WASM。
对于金融智能体,您关心:
| 需求 | 原生脚本 | WASM(实验性) |
|---|---|---|
| 可审计性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 确定性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 策略执行 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 传统量化代码 | ⭐⭐⭐⭐⭐ | ❌ |
| ML 生态系统 | ⭐⭐⭐⭐⭐ | ❌ |
答案不是"WASM 或否"。
答案是:原生脚本优先,必要时使用 WASM。
WASM 将: - 获得更好的 WASI 支持 - 获得更好的语言支持 - 成为标准控制层
WASM 不会: - 替代 Python ML 堆栈 - 替代操作系统级沙箱 - 成为"运行任何东西"
将其作为通用运行时下注是有风险的。
将其作为核心逻辑沙箱下注是明智的。
✅ 是的,长期支持 WASM/WASI - 用于特定用例
❌ 不,不要仅依赖 WASM - 原生脚本是主要方式
✅ 将 WASM 视为控制平面 - 逻辑、策略、编排
✅ 为原生代码分层操作系统沙箱 - 完整生态系统访问
❌ 不要承诺"Docker 替代品" - 它们解决不同问题
一句话来锚定我们的架构:
"WASM 给我们确定性控制;操作系统沙箱给我们实用能力。"
这给我们带来: - 可信度:对限制诚实 - 安全性:深度防御 - 灵活性:适合的工具 - 未来可选性:可以随着 WASM 成熟而发展
| 方面 | Claude Code | OpenSkills |
|---|---|---|
| SKILL.md 格式 | ✅ 完整支持 | ✅ 100% 兼容 |
| 沙箱 | seatbelt/seccomp | seatbelt (macOS, 主要方式) + WASM/WASI 0.3 (实验性) ⭐ |
| 跨平台 | 操作系统特定 | 原生 macOS(生产环境),Linux 计划中;WASM 相同(实验性) |
| 脚本执行 | 原生(Python、shell) | 原生(macOS,主要方式)+ WASM 组件(实验性) |
| 需要构建 | 否 | 原生脚本不需要。WASM 需要(实验性,TS/JS → WASM) |
| 原生 Python | ✅ 支持 | ✅ macOS (seatbelt) |
| Shell 脚本 | ✅ 支持 | ✅ macOS (seatbelt) |
| 智能体框架 | Claude Desktop/Claude Agent SDK | 任何框架 ⭐ |
| 用例 | 桌面用户,任意技能 | 企业智能体,任何智能体框架 |
openskills/
├── runtime/ # Rust 核心运行时
│ ├── src/
│ │ ├── build.rs # TS/JS → WASM 构建工具
│ │ ├── wasm_runner.rs # WASI 0.3 执行
│ │ ├── native_runner.rs # Seatbelt 执行 (macOS)
│ │ └── ...
│ └── BUILD.md # 构建工具文档
├── bindings/ # 语言绑定
│ ├── ts/ # TypeScript (napi-rs)
│ └── python/ # Python (PyO3)
├── docs/ # 文档
│ ├── developers.md # 开发者指南
│ ├── contributing.md # 贡献指南
│ ├── architecture.md # 架构详情
│ └── spec.md # 规范
├── examples/ # 示例技能
└── scripts/ # 构建脚本
# 克隆并初始化子模块(用于测试和示例)
git clone https://github.com/Geeksfino/openskills.git
cd openskills
git submodule update --init --recursive
# 构建所有内容
./scripts/build_all.sh
# 仅构建运行时
cd runtime
cargo build --release
# 构建绑定
./scripts/build_bindings.sh
examples/claude-official-skills 目录是一个指向 anthropics/skills 的 git 子模块。这提供了对官方 Claude Skills 的访问,用于测试和参考。
git clone --recursive <url> 或在克隆后运行 git submodule update --init --recursivecd examples/claude-official-skills && git pull && cd ../.. && git add examples/claude-official-skills && git commitopenskills build 用于 TS/JS → WASM 编译(实验性)Apache-2.0
$ claude mcp add openskills \
-- python -m otcore.mcp_server <graph>