跳转到主要内容
WASM 工具运行在 wasmtime 沙箱中。除 IronClaw 暴露的宿主函数外,网络、文件系统、凭据等能力都必须在 capabilities.json 中显式声明。 对于需要强隔离的自定义集成,这是 IronClaw 推荐方案。

工作流程

LLM 选择工具

IronClaw 加载 WASM 模块(缓存或磁盘)

模块在 wasmtime 沙箱执行

网络请求经由代理

代理校验域名白名单

代理从加密存储注入凭据

响应返回模块

输出经 Safety Layer 清洗

LLM 接收结果

沙箱机制

Fuel 计量

每条 WASM 指令都会消耗 fuel,耗尽即终止,防止死循环。
# 默认 100,000,000
export WASM_FUEL_LIMIT=100000000

内存限制

模块使用固定线性内存,超限会 trap 并终止。
# 默认 16 MB
export WASM_MEMORY_LIMIT=16777216

速率限制

每个工具可配置独立限流:
{
  "rate_limit": {
    "requests_per_minute": 60,
    "requests_per_day": 1000
  }
}

capabilities.json

每个 WASM 工具都需与 .wasm 放在同目录,并包含 capabilities.json
{
  "name": "my-tool",
  "version": "0.1.0",
  "description": "Fetches data from example.com API",
  "network": {
    "allowed_hosts": ["api.example.com", "auth.example.com"]
  },
  "filesystem": {
    "read": ["/workspace/data/*"],
    "write": ["/workspace/output/*"]
  },
  "credentials": [
    {
      "name": "example_api_key",
      "inject_as": "Authorization",
      "format": "Bearer {value}"
    }
  ],
  "rate_limit": {
    "requests_per_minute": 30,
    "requests_per_day": 500
  }
}

网络白名单

network.allowed_hosts 决定允许访问的域名。未命中白名单的请求会在建立连接前被拒绝。

文件系统访问

默认无主机文件系统权限,filesystem.read/filesystem.write 声明的路径才会挂载进沙箱。

凭据注入

凭据不会进入 WASM 内存。模块发出请求后,由代理在转发时注入 Header。

宿主函数

函数说明
log(level, message)写结构化日志
now_unix_secs()返回当前 Unix 时间戳
workspace_read(path)读取工作区文档
workspace_write(path, content)写入工作区文档

工具发现与安装

启动时从以下目录发现工具:
  • ~/.ironclaw/tools/
  • <workspace>/tools/
每个工具目录至少包含:
  • <toolname>.wasm
  • capabilities.json
安装示例:
ironclaw tool install ./my-tool.wasm
ironclaw tool install https://example.com/tools/my-tool.wasm
ironclaw tool list

安全说明

安装来自不可信来源的 WASM 工具前,请先审阅 capabilities.json
凭据仅由代理注入到出站请求,模块无法直接读取密钥存储。
模块不能执行 shell、fork 子进程或加载动态库。
无限循环会在 fuel 用尽时被强制终止。