README.zh.md 9.1 KB


description: "抽象代码执行 seam(ctx.codeRuntime),供用户与维护者组合、消费或构建后端,以针对宿主提供的绑定运行一段模型编写的程序。"

kind: "package-reference"

@deepseek-ai/dsh-code-runtime

English | 中文

概述

使用 dsh-code-runtime,可通过已配置的后端,针对宿主提供的异步函数运行一段模型编写的程序。请求返回无损 JSON 值、通道内有序的日志或结构化错误;程序失败在结果中 resolve,而 Promise reject 表示调用方误用。每次运行都与先前运行隔离,且运行时不了解工具或会话。执行后端需另行选择;其语言与隔离描述符标明所需的源语言和执行基底,但这些描述符本身不承诺安全边界。

目录


使用本包

当你要组合一个执行模型程序的部署、直接消费 ctx.codeRuntime,或构建运行程序的后端时,选择本包。在已发布的组合中,dsh-tools 里的 PTC mode 是消费方:只有程序打印和返回的内容重新进入对话。

运行一个程序

向运行时提供程序与绑定命名空间,然后依次调用 resolve(request)run(spec)。解析根据提供方能力验证可选 cwd、timeout 与沙箱策略,并填入部署默认值。程序作为异步函数体运行,支持顶层 awaitreturn;无损 JSON 完成值成为 result.value,捕获文本成为 result.logs,程序失败成为 result.error。每个输出通道保持自身顺序,跨通道交错由后端决定。

const spec = ctx.codeRuntime.resolve({
  program: 'return await tools.add({ a: 1, b: 2 })',
  bindings: [{ global: 'tools', functions: { add: async (args) => args.a + args.b } }],
})
const result = await ctx.codeRuntime.run(spec)
// result.value === 3

选择后端

后端以 languageisolation 提供诊断描述符;两者都不授予权限或证明约束。dsh-code-runtime-node 在全新的受管 Node 进程中按已解析沙箱策略执行可擦除 TypeScript。私有的 dsh-experimental-code-runtime-python 提供方在全新 CPython 子进程中执行 Python,不提供文件约束。sandboxMode 声明提供方的部署文件策略模式;不支持该能力时则缺省。

可移植地命名绑定

binding-global 与 error-class 名称是语言可移植的:必须匹配 [A-Za-z_][A-Za-z0-9_]*,避开每个可移植目标语言的保留字,并避开后端拥有的槽位,因此同一份命名空间列表对每个后端都有效。$toolslambdaconsole 之类的名称会在运行开始前失败;确切的排除集是 seam 约定的一部分。

可能出什么问题

失败以 result.error 返回,带正交的 kindexceptiontimeoutabortworker-exitinvalid-outputoutput-limitprotocolsandbox-unavailable。提供方在成功或失败之外,单独返回适用的 result.sandbox 事实。无效或不支持的执行选项在 resolve 期间失败;run 拒绝调用方误用,例如未解析输入、无效绑定名或资源释放后的调用。


理解实现

实现细节——点击展开 本节解释 seam 背后的设计;可观察行为已在[使用本包](#use-this-package)中完整说明。 ### 设计理念 本包是代码执行能力 seam 的 Service Definition 角色([能力 seam](../../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md)):一个注册为 `ctx.codeRuntime` 的抽象 `CodeRuntime extends Service`,加上两个后端与消费方共享的词汇。提供方继承 `CodeRuntime`、实现 `resolve` 和 `run` 并注册服务;消费方(`dsh-tools` 中的 PTC mode)生成面向模型的 SDK 并桥接工具分发。按约定,运行时不了解工具与会话:它接收程序、具名异步绑定和已解析执行选项,然后返回捕获输出、执行结果与适用的沙箱事实。 ### 服务 API `resolve(request)` 负责支持选项的验证与部署默认值。`run(spec)` 执行完整输入,并在清理后返回程序结果。语言和执行基底描述符指导呈现;`sandboxMode` 表示消费方能否传入已解析文件策略。描述符与程序成功结果都不能代替后端报告的强制能力事实。 穷尽式语义见[代码运行时子系统参考](../../../docs/subsystems/code-runtime.zh.md);确切签名见 [`src/index.ts`](src/index.ts)。 ### 词汇 `CodeRunRequest` 携带程序、Host 绑定、取消和可选执行选择。`CodeRunSpec` 要求已解析的 cwd 与经过时间截止。`CodeBindingNamespace` 声明程序全局对象与可选的类型化拒绝构造器。`CodeRunResult` 将日志/值、失败与 `CodeRunSandbox` 事实分开;确切字段与提供方义务见 [`src/types.ts`](src/types.ts)。 ### 可移植标识符 binding-global 与 error-class 名称是语言可移植的:必须匹配标识符子集 `[A-Za-z_][A-Za-z0-9_]*`(不含 JS 专有的 `$`)并通过 seam 导出的排除集,因此同一份 `bindings` 列表对每个后端都有效。本包导出每个后端都执行的约定——`PORTABLE_RESERVED_WORDS`(ECMAScript ∪ Python 保留字)、`RESERVED_BINDING_GLOBALS`(如 `console`、`__dsh_main__` 等后端拥有的 global)、`RESERVED_ERROR_MEMBERS` 与 `DUNDER_MEMBER`(error-member 排除)——因此 `$tools`、`lambda` 或 `__dsh_main__` 之类的名称会让 `run()` 在任何后端上作为 seam 误用而 reject。确切集合见 `src/index.ts`。 ### 源码地图 | 文件 | 职责 | |---|---| | [`src/index.ts`](src/index.ts) | 插件入口:抽象 `CodeRuntime` 服务与可移植标识符排除集 | | [`src/types.ts`](src/types.ts) | 词汇:`CodeRunRequest`、`CodeRunSpec`、绑定、结果、失败与沙箱事实 | | — | 不发布运行时不变式伴生入口;本包不公开任何独立的事件序列或可变数据关系,相关约束仅由其所属 seam 的约定实施。 |

进一步探索

当包级约定不够用时阅读以下内容。它们从 PTC mode 消费方进入后端与能力 seam 模型。


模型体验

通过 dsh-tools 中的 PTC mode 间接提供;后者公开 run_code,并将程序日志、值或失败作为保留的工具结果 token 返回。

KV Cache 影响

不会直接失效;由上述消费方负责请求前缀变更。

已知限制与延期工作

这些限制说明 seam 不能做什么;它们是当前包约束,不是任务积压。

  • run() 是一次性的——logs 只有在 CodeRunResult resolve 后才能获得;seam 不提供正在运行的程序所产生输出的流式日志或进度接口。
  • 运行之间不保留状态——每次请求都在全新环境中运行;持久 REPL 风格内核在某个后端带来自己的日志方案之前保持延期。
  • 提供方的约束能力不同——已发布 Node 提供方强制执行已解析文件策略,私有实验性 Python 提供方拒绝显式策略。不提供容器提供方。
  • 提供方之间没有统一的绑定字节上限——各提供方负责自己的传输限制;绑定仍可能在结果到达这些限制前分配内存。

开发备注

维护者的工作上下文——点击展开 本开发备注是维护者的工作上下文:尚未决定的方向与开放问题。它明确不具权威性——已交付的行为与限制以上文和包代码为准。 #### 未来:持久内核后端 跨 `run_code` 调用保留状态的 REPL 风格内核仍未决定;它需要自己的日志方案,因为「运行之间不保留状态」的约定正是让每次请求仅凭会话日志即可重建的原因。 #### 未来:容器后端 容器级后端将为代码与 shell 执行都提供硬性的多租户边界;除已知的 `isolation` 值外,暂无任何决定。