• 简体中文
  • Node.js

    /v1/nodejs/execute 是 aiod 的 JavaScript 执行接口:脚本、JSON 处理、前端工具链、基于 JS 的自动化。

    它始终运行在 daemon 的原生 REPL 上,直接启动一个进程。只要 PATH 中存在 node 即可,无需外部服务。

    同样的执行也可以按语言而不是按路由来调用:给 POST /v2/code/executelanguage: "javascript"(或 "node")。v2 没有单独的 /v2/nodejs

    运行要求

    PATH 中必须存在 node

    可以通过 GET /v1/capabilities 检查:code_interpreter.kinds 应包含 nodejsjavascript_backend 应为 nativedefault_node 会指出实际使用的二进制。

    如果安装了多个版本,可以使用 NODE_VERSIONNODE_CODE_EXEC_VERSION 选择。

    执行代码

    不带 session_id 的调用,返回之后什么都不留:

    curl -X POST "$BASE_URL/v1/nodejs/execute" \
      -H "Content-Type: application/json" \
      -d '{"code": "console.log(process.version); console.log(JSON.stringify({ ok: true }));"}'

    请求体示例:

    {
      "code": "console.log(process.version); console.log(JSON.stringify({ ok: true }));"
    }

    请求体字段与 code plane 相同:code(必填)、session_idstatefultimeout(1–900 秒,默认 30)、cwduser

    响应结构也相同,但此路由用 "" 表示空流,而不是 null

    console.log 变成一条 stream 输出;cell 的最后一个表达式变成带 text/plain 值的 execute_result,所以 globalThis.n = 41 即使没有任何打印,也会返回 41

    运行时信息

    curl "$BASE_URL/v1/nodejs/info"

    这里的 runtime_packagesglobal_packages 永远是空的。装了什么包看 GET /v2/sandbox/packages?lang=nodejs

    保留会话状态

    传入 session_id 后,可以在多次调用之间保留全局变量。

    会话状态保存在内存中:同一会话内会保留,但会在 aiod 重启后消失。

    路由作用说明
    POST /v1/nodejs/sessions提前开一个会话可选 session_idcwduser
    GET /v1/nodejs/sessions列出全部每条带 cwdstatemax_idle_time
    GET /v1/nodejs/sessions/{id}读取一个未知 id 返回 404
    DELETE /v1/nodejs/sessions/{id}结束一个返回 deleted
    DELETE /v1/nodejs/sessions结束全部返回 cleaned_sessions

    会话与原生代码 plane 共用限制:最多同时运行 20 个会话,空闲 1800 秒后自动关闭(AIO_CODE_MAX_SESSIONS / AIO_CODE_SESSION_TIMEOUT_SECS)。超过上限时返回 429

    两个 SDK 都覆盖执行和会话管理:

    Python
    TypeScript
    client = Sandbox(base_url=BASE_URL)
    
    # 1. A stateless call: nothing survives it.
    run = client.nodejs.execute_code(code="console.log(1 + 1)").data
    print(run.outputs[0].text.strip())   # 2
    
    # 2. A session keeps globals between calls.
    client.nodejs.execute_code(session_id="js-repl", code="globalThis.count = 1")
    run = client.nodejs.execute_code(
        session_id="js-repl",
        code="globalThis.count += 1; console.log(globalThis.count)",
    ).data
    print(run.stdout.strip(), run.execution_count)   # 2 2
    
    # 3. Close it.
    client.nodejs.delete_session("js-repl")

    哪些 SDK 调用可以直接访问该路由,见 1.x SDK 兼容性

    错误与超时

    抛出异常时仍返回 HTTP 200,但 successfalsestatuserror

    error 输出包含 enameevaluetraceback。栈帧中的 evalmachine.<anonymous> 表示代码运行在 VM context 中,而不是作为文件执行。

    超过 timeout 时,执行结果的 status"timeout"stderrerror 输出中都会包含 execution timed out after 2000ms; session state was reset

    daemon 会在超时 5 秒后终止解释器。会话仍然保留,但命名空间会被清空。

    选择接口

    • JavaScript 专用的执行走 /v1/nodejs/execute
    • 调用方动态决定语言时走 /v2/code/execute(或 /v1/code/execute)。
    • npm install 这类 shell 命令走 /v1/bash/exec/v2/commands