用DeepSeek Harness实现免安装的远程Agent开发
总有些机器,你除了能SSH上去之外,啥都连不上。他可能在内部网络环境里,codex/claude app的ssh无法工作,agent软件如codex CLI和codebuddy无法下载,而且可能是个生命周期不稳定、定时回收的容器。当然,大部分人需要连接的机器都可以通过codex/claude/cursor的ssh连接上;但是当你需要连接的机器不幸地处于诡异的网络环境内的时候,这就是一个极其烦人的问题。
在这种受限场景下,目标机器无法直接访问外部公共网络,更无法反向连接开发者的本地端口。现有的远程agent依赖在远端宿主机部署常驻进程,面对随时可能销毁的临时容器,每次都需要耗费大量时间重新初始化环境,甚至因缺少系统权限导致命令终止,或者因为远程网络环境的限制而无法将Agent软件本体安装在远程机器上,或者无法在远程机器上请求LLM的API。
好在DeepSeek Harness(dsh)“一切皆插件”的设计给我们提供了将本地Agent定制为远程Agent的能力。通过ssh这条唯一的管道,插件可以在完全避免在远程机器安装dsh、在远程机器上调用LLM的API的前提下,完成在远程机器上的开发工作。
插件
这一套插件的设计目标,是在完全不改动远端环境、不依赖远端对外联网的前提下,让开发者与智能体能够顺畅协作完成开发。
整个架构的核心原则是保持智能体完全运行在本地。Agent 的进程、会话状态、交互记录与上下文记忆均完整保留在本地运行环境中,所有LLM的推理请求同样完全由本地环境发起。远端机器不需要具备访问模型服务接口的网络通路,也无需安装或运行任何智能体相关的进程。即便远端容器遭遇销毁或随时重置,本地的思考过程、对话历史与任务记录均不受影响,只需要有一个能持久化数据的盘,通过新的连接接入新创建的容器即可无缝衔接工作。
在远端不保留常驻进程的条件下,系统通过类似RPC的通信设计实现了完整的远端文件增删查改与命令执行(CRUD+X)。
- 对于信息的传输,本地直接借助系统的 OpenSSH 配置通过解析主机别名获取连接参数,完整继承网络跳转与代理通道能力,并使用连接池复用加密会话。
- 在文件操作(CRUD)层面,由于我们主要服务于深度学习系统,插件利用远端系统普遍内置的标准 Python3 解释器,通过stdio即时投递脚本并交换结构化 JSON 数据;文件写入通过同目录下的临时文件完成原子替换,防止传输中断引发文件损坏;在执行修改时自动在远端提取基准文本,由本地完成行级差异比对并呈现变动。
- 在命令执行(X)层面,提供了与原生工具参数完全一致的执行工具,在指定的工作目录启动独立的远程登录 Shell 执行任务,并对返回的标准输出和错误流施加精确的长度与大小截断。
为了支撑耗时较长的构建、测试与训练任务,系统设计了前台超时自动升级的后台任务模型。
- 常规命令在发起后保持同步等待;
- 当运行时间超出设定的前台等待预算时,底层的执行器保持远端进程持续运行,自动将该进程提升为后台受管任务,同时向智能体返回任务标识符以及当前已产生的输出片段,使对话轮次能够及时解除挂起状态。
在任务管理方面:
- 远端通过轻量的包裹脚本在专用目录内记录任务的进程标识符、最终退出状态码与持续追加的日志文件;
- 本地则将任务登记至全局的任务注册表,支持智能体后续发起异步状态轮询、分段读取增量日志,或者在必要时向远端进程组发送信号终止任务。
远程模式
远程模式进一步通过对环境的物理隔离与提示词规范智能体的行为。
得益于dsh“一切皆插件”的理念,所有内置的read/bash等工具都是可以被移除的。远程模式在初始化时就移除了所有针对本地文件系统的操作工具以及本地命令执行工具,从而根绝了模型将本地文件系统和远程文件系统混淆的问题,从代码层面确保智能体所有的代码探索、文件编辑与验证动作只能定向作用于远程目标机器。
与此同时,为了防范模型在单次调用中生成脆弱且难以维护的超长多行内联指令,系统内置了针对执行调用的行数与字符检测规则。针对现有的大部分国产LLM输出进行一些分析之后,可以发现:
- 有时会有一些无害的超长的单行脚本(通常包含许多pipe);
- 但是一旦出现了多行脚本,就很容易有把Python或者JS代码内联到命令里面去执行这种bad pattern。
因此,我设计了以下规则:
- 单行指令允许较高的字符容量以允许多个命令及其之间的pipe;
- 2~8行的多行指令则设定了严格的字符数量上限(2000 char),超出限制的调用会在实际执行前被直接拦截。
- 不允许任何大于8行的命令。
配合提示词引导,智能体会主动将多步骤的复杂逻辑编写为独立的脚本文件并保存至远端,再通过执行工具触发运行,确保操作步骤清晰可查。