前言¶
DeepSeek Harness(DSH)的 PTC 模式下,模型会以 TypeScript 程序的形式回答,程序通过工具调用与系统交互。默认的 Node 运行时会在每个程序启动一个新的 Node 进程,启动开销较大。dsh-ptc-moejs 是一个为 DSH 提供的 PTC 运行时,它使用 moejs——一个用 Go 编写的 JavaScript 引擎,在长生命周期的 sidecar 进程中运行模型程序,避免重复启动进程。
插件简介¶
dsh-ptc-moejs 是 DeepSeek Harness 的 PTC 运行时插件,由维护者 Calcium-Ion 开发,归类于模型推理。它将 moejs 引擎集成到 DSH 中,让模型生成的程序在 Go 实现的 JavaScript 运行时里执行,同时保留与 Node 运行时相同的沙箱和安全策略。
核心功能¶
1. 进程复用与性能提升¶
插件在加载时启动一个 sidecar 进程,该进程在多个程序之间保持存活。每个程序在 sidecar 内获得独立的 moejs 运行时实例,使用干净的初始化状态。这种设计避免了 Node 运行时为每个程序启动新进程的开销。
性能对比(3 个工具调用,每个工具立即返回绑定结果):
| 运行时 | 单次调用耗时 | 首次结果加载耗时 |
|---|---|---|
| dsh-ptc-moejs, workspace-write | 0.42 ms | 16.4 ms |
| dsh-ptc-moejs, danger-full-access | 0.42 ms | 6.8 ms |
| dsh-ptc-runtime-node, workspace-write | 110.4 ms | 164.4 ms |
| dsh-ptc-runtime-node, danger-full-access | 103.0 ms | 149.2 ms |
单次调用节省约 110ms,首次结果加载节省约 150ms。
2. 沙箱与安全策略¶
程序对机器的所有操作都必须通过工具调用实现。dsh 运行工具调用时,会应用工具自身的策略、审批机制和沙箱限制。Sidecar 进程本身只读取程序导入的代码文件,文件访问权限由 DSH 的会话策略决定。
沙箱限制与 Node 运行时一致:
- 文件访问:使用 DSH 会话的文件模式和 workspace 根目录
- 运行器:Linux 上使用 bubblewrap 或 Landlock,macOS 使用 Seatbelt,Windows 使用受限令牌
- 环境变量:仅保留 PATH、PATHEXT、SYSTEMROOT、WINDIR、TEMP、TMP,API 密钥等敏感信息不会暴露给 sidecar
- 会话变更:会话文件模式的变更会停止该会话下使用旧模式的运行
在 Linux 上,插件会打开 sidecar 二进制文件,沙箱化的 sidecar 从该打开的文件运行,即使二进制所在的目录被沙箱隐藏(如 workspace-write 模式下的 /tmp)也能正常启动。
3. 程序能力¶
程序可以使用以下 Node.js API:
node:path:路径操作node:util:实用工具函数node:timers:定时器功能console:标准输出
程序可以通过 dsh 的工作流工具运行脚本,并等待定时器事件。
4. 独立运行时实例¶
每个程序在 sidecar 中获得独立的 moejs 运行时,全局变量初始化为空。Sidecar 在 5 分钟无运行时自动退出,下次运行重新启动。每个文件策略模式有独立的 sidecar,相同模式和 workspace 根的会话可以共享 sidecar。
安装与启用¶
从 GitHub 克隆仓库并安装:
git clone https://github.com/Calcium-Ion/dsh-ptc-moejs.git
cd dsh-ptc-moejs
npm install
安装前需满足以下条件:
- Node.js 版本:^22.19.0 或 >=24.0.0
- DSH 版本:>=0.2.1-rc.2 <0.3.0
- 依赖:@deepseek-ai/cordis ~4.0.5, @deepseek-ai/dsh-ptc-runtime >=0.2.1-rc.2, @deepseek-ai/dsh-sandbox >=0.2.1-rc.2
插件通过 Cordis patch 打入 DSH。
典型用法¶
单个程序执行¶
在 PTC 模式下,模型生成的程序会在 dsh-ptc-moejs 的 sidecar 中运行。程序调用工具时,dsh 通过工具管道执行,记录到会话日志中。
示例:程序使用 node:timers 等待 100ms 后返回结果。
import { setTimeout } from 'node:timers/promises';
console.log('开始等待');
await setTimeout(100);
console.log('等待结束');
多程序会话¶
在长对话中,程序调用会累积。插件在会话中保持 sidecar 活跃,每个程序获得干净的运行时环境。当会话包含大量程序调用时,性能优势更加明显。
长对话性能对比¶
在模拟 40 次 run_code 调用、90 次工具调用的对话中:
| 指标 | dsh-ptc-runtime-node | dsh-ptc-moejs |
|---|---|---|
| run_code 总耗时 | 8.6 s | 3.6 s |
| 其中嵌套工具调用 | 3.5 s | 3.3 s |
| 对话总耗时 | 10.1 s | 5.0 s |
| dsh 及子进程 CPU 时间 | 8.4 s | 5.2 s |
| dsh 及子进程峰值内存(PSS) | 440 MiB | 437 MiB |
| PTC 运行时进程峰值内存(PSS) | 34.0 MiB | 18.5 MiB |
| PTC 运行时进程数 | 120 | 3 |
dsh-ptc-moejs 在程序执行上节省了约 125ms,CPU 时间节省约 82ms。
每日代理工作估算¶
以每 10 秒一个程序计算,长期运行下节省的时间:
| 每日程序数 | 等待节省 | CPU 时间节省 |
|---|---|---|
| 200 | 25 s | 16 s |
| 1,000 | 2.1 min | 1.4 min |
| 2,880 | 6.0 min | 3.9 min |
| 11,520 | 24 min | 16 min |
适用场景与注意事项¶
适用场景¶
- 模型需要频繁生成并执行 TypeScript 程序的场景
- 长对话或长时间运行的智能体应用
- 需要严格控制程序对机器访问权限的场景
- 需要较高程序执行性能的场景
注意事项¶
- 插件以当前 DSH 进程的权限运行,沙箱限制由 DSH 的会话策略决定
- 在受限模式下,如果沙箱运行器(如 bubblewrap、Landlock)不可用,运行会以
sandbox-unavailable失败 - 在非本地主机部署(如 SSH 远程执行)中,受限模式可能因无法在目标主机运行 sidecar 而失败
- danger-full-access 模式绕过沙箱限制,直接启动 sidecar,适用于有明确信任需求的场景
结尾¶
dsh-ptc-moejs 通过使用 Go 实现的 moejs 引擎和长生命周期的 sidecar 进程,显著降低了 DeepSeek Harness PTC 模式下程序执行的开销。对于需要频繁执行模型生成程序的智能体应用,它能在保持相同安全策略的前提下提供接近 100 倍的性能提升。更多细节和源代码可访问插件目录页与 GitHub 仓库。