@ executor-js/ 执行
用于执行器的 Sandboxed JavaScript 执行 。 手一个 tools.<namespace>.<name>(...) 代理到一个代码沙盒中,这样一个代理(或任何呼叫者)就可以运行生成的TypeScript/JavaScript,以引用执行器已注册的工具.
支持暂停/ 重置引出驱动的流: 需要用户输入的工具( Outh, 窗体填充, 批准) 暂停沙盒, 表面 a PausedExecution,然后继续 ResumeResponse。 。 。 .
安装
bun add @executor-js/sdk @executor-js/execution @executor-js/runtime-quickjs
# or
npm install @executor-js/sdk @executor-js/execution @executor-js/runtime-quickjs
@executor-js/runtime-quickjs 是沙盒运行时间。 这不是依赖 @executor-js/execution 你带了自己的消费者来 这样不同的运行时间 就不会载运~13 MB的WASM 他们从来没有使用.
使用量
import { createExecutor } from "@executor-js/sdk";
import { createExecutionEngine } from "@executor-js/execution";
import { makeQuickJsExecutor } from "@executor-js/runtime-quickjs";
const executor = await createExecutor({
onElicitation: "accept-all",
});
const engine = createExecutionEngine({
executor,
codeExecutor: makeQuickJsExecutor({
timeoutMs: 2_000,
memoryLimitBytes: 32 * 1024 * 1024,
}),
});
const result = await engine.execute(
`
const pets = await tools.petstore.findPetsByStatus({ status: "available" });
return pets.length;
`,
{
onElicitation: async (ctx) => {
// A tool asked for user input mid-execution. Your UI decides what to do.
console.log("tool needs input:", ctx.request);
return { action: "decline" };
},
},
);
console.log(result);
// { result: 12, logs: [...] }
自定义工具的发现
tools.search(...) 默认情况下使用执行器的内置词典工具发现. 主机可以提供自己的执行,例如索引化或语义化的搜索提供者,而不替换沙盒运行时间:
import { createExecutionEngine, type ToolDiscoveryProvider } from "@executor-js/execution";
const toolDiscoveryProvider: ToolDiscoveryProvider = {
searchTools: ({ query, namespace, limit, offset }) =>
mySearchIndex.searchTools({ query, namespace, limit, offset }),
};
const engine = createExecutionEngine({
executor,
codeExecutor: makeQuickJsExecutor(),
toolDiscoveryProvider,
});
暂停/恢复引出
当主机不支持内含引出时,使用 executeWithPause 作为暂停点拦截第一个请求:
import type { ExecutionEngine } from "@executor-js/execution";
declare const engine: ExecutionEngine;
declare const code: string;
const started = await engine.executeWithPause(code);
if (started.status === "paused") {
const { id, elicitationContext } = started.execution;
// Render the elicitation request in your UI. Later:
const resumed = await engine.resume(id, {
action: "accept",
content: { name: "Ada" },
});
}
LLM 工作流程描述
import type { ExecutionEngine } from "@executor-js/execution";
declare const engine: ExecutionEngine;
const description = await engine.getDescription();
// Returns the short `execute` tool description: a one-line intro, a pointer to
// the `execute` skill, and the live connection-prefix inventory. Feed this to
// an LLM as the execute tool's description.
完整的“ 使用工具. search (), 然后是工具. description.tool (), 然后调用...) 工作流程
传道活在 execute 而非总是装入的描述,所以
从不运行代码的模型不会为此付出代价。 MCP主机通过
skills 工具;直接读取:
import { EXECUTE_SKILL } from "@executor-js/execution";
const howTo = EXECUTE_SKILL.body;
有效使用
如果你在继续发展 @executor-js/sdk/core (原始效果条目),从 /core 子路径。 返回的引擎为 Effect-native : execute, (中文(简体) ), executeWithPause,以及 resume 都变成 Effect.Effect<...>,以及 onElicitation 是一个 ElicitationHandler 返回时 Effect.Effect<ElicitationResponse>。 。 。 .
import { createExecutionEngine } from "@executor-js/execution/core";
状态
预1.0. API在β释放之间仍然可能改变. 部分 执行器单曲。 。 。 .
许可证
麻省理工学院