• 简体中文
  • 沙箱信息与能力

    沙箱接口返回 aiod 的环境和当前能力。能力来自对各个子系统的探测,因此返回结果反映运行时状态,而不是固定清单。

    子系统缺失时,能力会降级。请求仍然成功。结果有缓存,重复轮询代价很低。

    v1 和 v2 路由的对照见 从 1.x 迁移

    读取环境信息

    客户端的第一个请求用于获取三类信息:当前环境、已安装的运行时,以及具备后端的 plane:

    curl "$BASE_URL/v2/sandbox"

    一个对象同时包含这三类信息。capabilities 就是 能力快照与分支 中介绍的快照,无需额外请求。

    curl "$BASE_URL/v1/sandbox"

    data 是纯文本摘要,detailversionworkspace 位于顶层。

    响应还包含 home_dir。它是 workspace_dir 的另一个名称,并会在 detail.system 下再出现一次;只有 v1 接口会返回该字段。

    这里没有 capabilities 字段,需要再调用一次 GET /v1/capabilities

    需要用一次请求同时取到身份、workspace 和能力时,切到 v2:

    两种响应都包含相同的环境字段:

    • workspace_dirworkspace —— 同一个值的两个名字:daemon 账户的 home 目录,没指定工作目录的命令在这里运行
    • version —— daemon 的版本号
    • detail.system —— osos_versionarchusertimezoneoccupied_ports,以及前面的两个 workspace 字段
    • detail.runtime —— pythonnodejs,各是一个 {ver, bin, alias} 数组
    • detail.utils —— 在 PATH 上找到的工具,按 editorsnetworksearch 等类别分组

    detail.system.sandbox_user 只在镜像预置了非特权账户时出现,内容为该账户实际解析到的 {name, uid, gid, home}

    occupied_ports 读取 /proc/net/tcp。因此它只在 Linux 上列出监听端口,其他平台始终为空。

    workspace 不可配置,也没有 --workspace 参数;workspace_dir 就是账户的 home 目录。

    能力快照与分支

    文档把一组相关接口叫做 plane:commands(命令)、files(文件)、terminals(终端)、code(代码)、browser(浏览器)和 desktop(桌面 GUI)。

    调用某个 plane 前,先读取一次快照,再按能力字段分支。

    curl "$BASE_URL/v1/capabilities"

    客户端启动时需要的每一项信息都对应一个字段:

    信息字段
    命令的工作目录workspace_dir
    浏览器 plane 的状态capabilities.browser.status
    执行代码的 Python 解释器capabilities.code_interpreter.default_python
    桌面 GUI plane 的状态capabilities.computer.status
    plane 未就绪的原因该 plane 的 missing

    快照的内容按组组织:

    分组字段
    files十二个开关,每个文件操作一个
    execshellbashpty
    bins解析到的二进制:bashshps,Windows 上还有 powershellcmd
    code_interpreterstatusbackendjavascript_backendjupyter_backendkindsdefault_pythondefault_nodepython_kernelsendpoint
    browserstatusexecutableexecutable_sourceprocesscdpcdp_endpoint
    computerstatusproviderdisplayscreenshotactionsclipboardrecordingaccessibilityresolution

    以下三个条目带状态探测:browser(浏览器 plane)、computer(桌面 GUI plane)和 code_interpreter(代码 plane)。它们都有 statusmissingwarnings 字段。

    missing 列出未就绪的原因,warnings 说明能力只有部分可用的原因。status 的取值如下:

    • ready —— plane 可正常应答
    • degraded —— 依赖存在,但 plane 无法应答,例如浏览器可执行文件存在、CDP 端口不通
    • absent —— 完全不可用;code_interpreter 只用 readyabsent 两种

    没有浏览器的主机上,浏览器 plane 是这样:

    "browser": {
      "cdp": false,
      "cdp_endpoint": "http://127.0.0.1:9222",
      "executable": null,
      "executable_source": null,
      "missing": [
        "browser executable",
        "cdp"
      ],
      "process": true,
      "status": "absent",
      "warnings": [
        "browser process detected but CDP is unreachable"
      ]
    }

    读取快照并据此分支:

    AioExamples 中用于解析返回结构的辅助客户端:

    Python
    TypeScript
    sb = Aio(BASE_URL)
    
    info = sb.get("/v2/sandbox")
    caps = info["capabilities"]
    
    print(info["workspace_dir"], info["version"])
    # /Users/USER 0.9.1
    statuses = {name: caps[name]["status"]
                for name in ("browser", "code_interpreter", "computer")}
    print(statuses)
    
    if caps["browser"]["status"] != "ready":
        print("browser unusable:", caps["browser"]["missing"])
    Python
    TypeScript
    import httpx
    
    info = httpx.get(f"{BASE_URL}/v1/sandbox").json()
    caps = httpx.get(f"{BASE_URL}/v1/capabilities").json()["data"]
    
    print(info["workspace_dir"], info["version"])
    # /Users/USER 0.9.1
    statuses = {name: caps[name]["status"]
                for name in ("browser", "code_interpreter", "computer")}
    print(statuses)
    
    if caps["browser"]["status"] != "ready":
        print("browser unusable:", caps["browser"]["missing"])

    Python SDK 在这里直接通过 HTTP 读取 /v1/sandbox

    其他需要直接发 HTTP 请求的 SDK 调用,见 1.x SDK 兼容性

    后端缺失的 plane 仍然保留自己的路由,返回 503,并在 hint 里给出修复方向:

    {
      "data": null,
      "hint": "Ensure the browser capability is ready (GET /v1/capabilities).",
      "message": "Browser screenshot unavailable: list targets: error sending request for url (http://127.0.0.1:9222/json/list)",
      "success": false
    }

    调用时应根据能力快照选择分支,而不是根据 404 判断。

    缺少后端的 plane 仍然保留路由,因此仅凭状态码无法区分“后端缺失”和“路径错误”。

    探测结果缓存 5 秒。daemon 启动时会先探测一次,因此第一次读取就能获取快照。

    快照过期后,接口会立即返回旧快照,并在后台重新探测。GET /v1/capabilities?refresh=true 会等待探测完成;GET /v2/sandbox 不会按请求重新探测,需要强制重测时请调用 /v1/capabilities

    浏览器探测只调用一次 GET /json/version,预算为 300 ms。

    已安装的包

    daemon 列出全局安装的 Python 和 Node.js 包。

    路由作用说明
    GET /v2/sandbox/packages?lang=pythonPython 清单lang 必填
    GET /v2/sandbox/packages?lang=nodejsNode.js 清单两个运行时共用一个路由

    不传 lang 时返回 422,并在 errors[0].location 中指出 ["query", "lang"]

    lang 取值无法识别时,返回结构中的状态码为 400,例如 unknown lang "ruby": expected python or nodejs

    路由作用说明
    GET /v1/sandbox/packages/pythonPython 清单每个运行时一个路由
    GET /v1/sandbox/packages/nodejsNode.js 清单SDK 里是 sandbox.get_nodejs_packages()

    data 是文本清单,不是结构化数据。

    Python 清单来自 code plane 选中的解释器执行的 pip list,每行一个 - name==version。Node.js 清单来自 npm list -g --depth=0,并带有一行表头:

    Node.js Packages:
      - agent-browser@0.34.0
      - npm@10.5.0
      - pnpm@7.33.7

    同样的清单也是 MCP 工具 sandbox_get_packages,它的 language 参数取 pythonnodejs,不传即 python。见 MCP