跳转到内容

脚本执行引擎

脚本执行引擎 让 AI 能在浏览器中执行 JavaScript / TypeScript 代码,将 AI 的能力从”文件读写”扩展到”任意计算”。脚本通过 rtcAgent.* 操作 UI、读写虚拟文件系统、调用宿主注册的函数——所有这一切都发生在一个精心设计的沙箱中。

💡 设计哲学:LLM 的创造力在逻辑层——数据处理、控制流、rtcAgent 调用组合。沙箱限制的是”副作用”(存储/网络/DOM),不是”表达力”(语言/数据结构/逻辑)。这一层完全敞开。

限制敞开
目标防止 LLM 幻觉误用平台 API释放 LLM 的逻辑创造力
手段AST 静态阻断 + 权限确认完整语言特性 + 纯计算标准库
威胁模型LLM 幻觉导致的误操作(如误调平台 API)非恶意代码注入场景

AI 通过 script 工具与引擎交互,有三种执行模式:

Action功能必需参数使用场景
📁 save保存脚本到文件系统name, code创建可复用的脚本
▶️ run执行已保存的脚本name运行之前写好的脚本
💬 eval直接执行内联代码code一次性计算、快速验证

脚本以 Markdown + YAML frontmatter 格式存储,兼顾可读性和元数据管理:

保存后的文件格式如下:

部分内容用途
YAML frontmatternamedescriptioncreatedAt元数据存储,便于管理
代码块TypeScript / JavaScript 源码实际执行的代码

📌 执行时提取代码块中的纯代码,frontmatter 仅用于管理。如果没有代码块,整个文件内容作为代码执行。

脚本执行时可以使用以下 API:

通过 rtcAgent.* 可访问所有已注册的 Function Group,实现完整的 UI 操作能力:

方法功能说明
rtcAgent.callFunction()调用已注册的函数触发宿主注册的任何 Function Group
rtcAgent.readFile()读取文件操作虚拟文件系统
rtcAgent.writeFile()写入文件操作虚拟文件系统
rtcAgent.listDir()列出目录操作虚拟文件系统

💡 通过 rtcAgent.task.create() 等链式调用,脚本可以操作任何已注册的功能模块。

沙箱显式注入以下标准库,使 API 表面可审计:

类别可用的全局对象/函数
语言构造器Promise, Date, Math, JSON, Array, Object, String, Number, Boolean, Error
数据结构Map, Set, WeakMap, WeakSet, RegExp, Symbol, BigInt
Error 子类TypeError, RangeError, ReferenceError, SyntaxError, URIError, AggregateError
解析与编码parseInt, parseFloat, isNaN, isFinite, encodeURIComponent, decodeURIComponent, encodeURI, decodeURI, atob, btoa
工具函数structuredClone
特殊值NaN, Infinity, undefined
URL 解析URL, URLSearchParams
consolelog, warn, error(劫持版,输出同时收集给 AI)

沙箱阻断了 setTimeoutcrypto.randomUUID 等”灰色 API”。为了让脚本仍能用这些常用功能,系统默认注册了 rtcAgent.system.* 工具组:

函数功能包装的平台 API
rtcAgent.system.delay(ms)暂停执行指定毫秒数setTimeout
rtcAgent.system.uuid(count?)生成 UUID v4(支持批量)crypto.randomUUID
rtcAgent.system.now()获取当前时间戳(毫秒)Date.now
rtcAgent.system.random(opts?)生成随机数(支持范围/整数)Math.random
rtcAgent.system.time(format?)获取格式化时间(iso/locale/ts)Date

📌 这些工具遵循标准 FunctionDef 规范,AI 通过虚拟文档自动发现,与用户自定义的 Function Group 使用方式一致。

脚本安全采用 两层防线:AST 编译期阻断 + 运行时权限确认。

沙箱在 Babel 转换阶段静态阻断以下类别的 API:

类别阻断目标替代方案
🗄️ 存储 APIlocalStorage, sessionStorage, indexedDB, caches, cookieStorertcAgent.readFile / writeFile
🌐 网络 APIfetch, XMLHttpRequest, WebSocket, EventSource, BroadcastChannelrtcAgent.callFunction
🖥️ DOM / 浏览器window, self, document, navigator, location, history, alert, confirm, promptrtcAgent(UI 走 Function 注册)
🔄 元编程 / 逃逸eval, Function, globalThis, global无需替代
👷 WorkerWorker, SharedWorker, ServiceWorker, importScripts无需替代
⏱️ 定时器setTimeout, setIntervalrtcAgent.system.delay
🧠 共享内存SharedArrayBuffer, Atomics无需替代
📦 CJS 全局require, module, exports, __dirname, __filename无需替代
🔗 原型链逃逸.constructor, .__proto__(含字符串索引形式)无需替代
📥 动态 importimport(...)无需替代
🔁 无限循环while, do...while, for(;;)for…of / 有界 for / 数组迭代方法

智能识别:如果标识符有本地绑定(如用户声明了同名变量 const fetch = ...),不会误阻断。TypeScript 类型注解(如 const fn: Function)也不触发阻断。

约束说明
🔐 权限除 bypass 外都需要用户确认
⏱️ 超时默认 30 秒,可自定义
⏭️ 超时行为放弃等待,不终止脚本(脚本仍在后台运行)
🔒 作用域隔离编译期注入白名单绑定,脚本无法访问未授权的全局变量
🔐 this 绑定"use strict" 模式下执行,防止 this 逃逸

脚本执行后,引擎收集完整的执行结果返回给 AI:

字段来源用途
result脚本返回值AI 获取计算结果
logsconsole.logAI 查看调试信息
warningsconsole.warnAI 识别潜在问题
errorsconsole.errorAI 处理异常情况

💡 console 是劫持版本——输出正常显示给用户的同时,也会被收集并返回给 AI,让 AI 能”看到”脚本的运行过程。

脚本完整支持异步编程:

特性说明
async / await完整支持
执行包装脚本包装为 async IIFE 执行
Promise沙箱提供 Promise 构造器
rtcAgent 调用宿主 API 调用天然支持异步