dsh-ptc-moejs:DeepSeek Harness 的高性能 PTC 运行时

前言

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 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye