原文:知乎文章
在开发了 DS Harness Desktop 之后,看了下感觉自己需要一个Remote 的东西。
于是开始折腾了 DS Harness Remote。整个过程是真的有趣了,想了下所以留下一点实录。
我要做的是一个Remote 功能,翻译过来就是远程控制。我想在任何一个地方,都能控制我家里跑着DeepSeek Harness的程序。我需要在Web 、macOS、Windows、Linux、安卓手机都使用它,就如CodeX的Remote功能。
那我能怎么做呢?~~~
所以下面开始神奇故事了。
PS:下文使用DSH 代指DeepSeek Harness 。
技术路线
首先,我们都知道,DS Harness 是个Nodejs的包,启动之后是个Web站点。这个事情在知乎、推特、其他的平台已经被各种人吐槽了无数次了,甚至于今天我还看到了非常有趣的回答。怎么看 DeepSeek Harness 正式开源,采用一切皆插件的架构?( PS:里面说的问题我基本都同意,反正现状就是这个鸟样。jpg
不过,并不影响这个玩意是个很有趣的「基座」。基座,那就是咩都没有的。
Install Node.js, then run:
npx @deepseek-ai/dsh web
The command starts the Web UI,
served at http://127.0.0.1:3080 by default.
See Web UI guide.
回到这个需求来说,我们都知道DSH 是跑在本地的网站程序,那是不是直接把3080端口映射到外网就完事了,如果担心不安全,自己再套一层HTTP Auth鉴权就可以。当年OpenClaw 的远端功能,想在外网环境访问也是类似的操作。甚至于我已经建议朋友,可以基于他的网络 TUN产品给开发个定制功能了。如果说想要一个可信网络的,基于Tailscale来实现是完美的,家里的电脑和其他地方的设备,通过TailscaleVPN局域网使用即可。
那为什么还要想着做一个Remote呢?明明已经有「足够多」的解决方案了。因为,「足够多」并不意味着「足够好」 —— 我理解的好。所以,重新开始了。
网络通讯
回到需求来说,本质上我们是想要的任意两个地方,通过网络互相通信。如果学过网络原理的朋友会知道最好的办法就是两者IP直连,其次是中间人转发,再次是这里说一句那边回一句。
于是我们就有了以下四个种网络模式:LAN、P2P、TURN 、Reply
LAN → P2P → TURN → WebSocket Relay
优先:局域网直连
客户端 A <====================> 客户端 B
WebRTC LAN
↓ 失败
尝试:公网直连
客户端 A <====================> 客户端 B
WebRTC P2P
(STUN / ICE 打洞)
↓ 失败
中继通信
客户端 A ======== TURN ======== 客户端 B
(WebRTC DataChannel)
↓ 失败
服务端消息中继
客户端 A ==== WebSocket Relay ==== 客户端 B
(命令 / 消息模式)
无论使用 LAN、P2P、TURN 还是 WebSocket Relay,
业务消息都经过 Noise 端到端加密,服务端只负责授权、
信令和密文转发,无法读取具体通信内容。
在外网的情况下,最好的通讯就是P2P模式,一定是最快的一种;其次是 TURN + WebRTC,也算是流畅,然后还不行的话,服务器中继兜底,保证能用。于是我们在网页上就能看到下面这个图了。


上面我们解决了用什么网络技术打通Harness Host主机和外部设备,下面我们要解决的是,传输什么样的数据用来实现Remote。
消息传递
就如CodeX 或者Claude Code都在本地存储了完整的对话记录和Agent执行信息。我最早能想到的是,直接起一个服务读对话Session记录,不断外发。以我最朴素的认知,这个肯定是可行的。
Remote Client
(Web/Android/Desktop)
|
|
网络通道
|
↓
Remote Gateway
|
|
读取 Harness 本地 Session 数据
|
↓
DeepSeek Harness Host
|
↓
~/.deepseek-harness/sessions/*</code></pre></div><p data-pid="WpbRUUKM">当然在我能想到的版本里面,直接给对应函数做插桩拦截也是一种想法。不过研究了一下Harness发现,他们有一个很好的注入点:<b>Harness ApiProxy。</b>( PS:执行了三个小时之后,基本确认了最好的接入方式在这里。</p><p data-pid="mEH8sCSF">SO,结构变成了下面这样的了~</p><div class="highlight"><pre><code class="language-text"> Remote Client
(Web/Android/Desktop)
|
|
LAN / P2P / TURN / WebSocket Relay
|
↓
Remote Gateway / Host Plugin
|
|
调用 Harness ApiProxy
(请求 / 响应 / 实时事件流)
|
↓
DeepSeek Harness Host
|
↓
Harness 内部 Session 与运行状态</code></pre></div><p class="ztext-empty-paragraph"><br></p><h3 id="h_2072389711839213309_3" data-into-catalog-status="">Web服务:NAT网络</h3><p data-pid="ORkWGE_X">服务端的需求主要是「设备授权」、 WebRTC 、P2P打洞服务、TURN中转服务,已经 Remote 功能。前者业务需求,AI写起来基本就是几个小时完事;P2P 打洞和TURN中转,找个开源方案,直接部署和签发证书,基本也没什么难度。最后是Remote,比我想象中的难很多了。</p><p data-pid="JD027N0P">第一个版本是GPT自由发挥,参考了一下对话功能基本就做了一个样子出来了,甚至于第一次启动的时候,页面就已经走通了 -> 能看到对话和消息了。</p><figure data-size="normal"><div class="RichText-ConditionalImagePortal"><img src="https://pic2.zhimg.com/v2-19220c31b297f9707b676f6644302cd7_r.jpg" data-caption="" data-size="normal" data-rawwidth="2940" data-rawheight="1598" data-original-token="v2-4ddd7d0f37d012a8984b2224ba10d08c" class="origin_image zh-lightbox-thumb" width="2940"></div></figure><h3 id="h_2072389711839213309_4" data-into-catalog-status="">崩溃问题</h3><p data-pid="lnoZicAy">然后,会话崩了。</p><p data-pid="87rn9YYx">崩了的错误就一个harness.api timeout。很迷糊,开始让CodeX找错误信息,一抓就看到是服务端等客户端返回,一直没有消息返回。首先去怀疑了网络问题,毕竟看到网络走的是Reply模式。但是没道理,一台机器在我屋子,Web在我的电脑上跑着,不应该这样走的。接着继续分析日志和复现,发现应该是P2P连上之后,通讯不断超时,最后回退到Reply才成功。过于神奇,什么情况啊~~~!!</p><p data-pid="iu34iw8q">于是,开启了漫长的一夜。在凌晨三点的时候终于发现,是消息体积太大引起的,和网络协商没有任何关系。</p><p data-pid="-lS9dN71">终于,事情还是不可避免来到了性能问题了。一切终究不可避免走向庸俗。</p><p data-pid="BpQk4gj6">那怎么解决呢?问题出现了,总是能解决的。</p><ul><li data-pid="b_-ohz6H">消息一次太多?一次拿少一点。</li><li data-pid="h2m5gyGK">连接主机只做网络通路,不做对话消息传递。</li><li data-pid="Q4vmmOlz">不做自动重连,不要引起消息风暴。</li><li data-pid="A_nvZpcd">.....</li></ul><p data-pid="nGSU7Wrv">最后完整的过程是:</p><div class="highlight"><pre><code class="language-text">Harness 大消息
↓
48 KiB 应用层分片
↓
Noise 逐片加密
↓
8 KiB WebRTC 传输分片
↓
P2P / TURN
↓
接收端两层重组
↓
恢复为完整 Harness 消息
说起来还是并不是什么新鲜事物、神奇实现,就是一次次实验出来的局部最优解。
Web版经过了周六一天迭代,到了晚上的时候基本稳定了,所以Release了一个版本出来了。
于是有了:DS Harness Remote
但是,我想要的Remote应该随时可用,像CodeX remote 另一个设备来的。
那,DSH 的Remote是什么样的呢?
真正的Remote
真正的Remote应该是,在这个电脑上,可以直接使用其他已经配置好的电脑。
所以,应该是直接能直接用的。
所以,它来了…


好了,我累了….
回头再更新了~