2026-09-10 实操记录并逐项验证。环境:macOS(mac-studio.local)、Paseo 0.8.0、DSH @deepseek-ai/dsh 0.1.5-rc.1。
DeepSeek Harness(DSH)不是只有浏览器 Web 端口。dsh web 只是 --profile web 的别名,DSH 的官方入口模式里本来就有一个标准 ACP server:
dsh --profile acp # ACP over stdio,直到客户端断开
Paseo 支持「把任意讲 ACP 的 agent 注册成 provider」,所以接入方式就是把 DSH 当通用 ACP provider 加进 Paseo。
数据流:
Paseo 客户端(手机 / 桌面 / 浏览器)
│ relay / 局域网 / Tailscale
▼
Paseo daemon
│ 按 command 自己 spawn
▼
dsh --profile acp(子进程,每个 agent 一个)
▼
DeepSeek API
这个结构带来一个额外好处:执行在本机,控制面可以远程。DSH 本身默认只监听 127.0.0.1:3080,接进 Paseo 之后,你在外面用手机就能驱动本机的 DSH。
npm i -g @deepseek-ai/dsh
dsh --version
- npm 上的
@deepseek-ai/dsh本体很小(约 48KB),它是个 launcher;真正的运行时依赖在首次启动某个 profile 时才装进$DSH_HOME/profiles/。
dsh web # 默认 http://127.0.0.1:3080
浏览器里进 Settings → Models,填入 DeepSeek API key 并保存。
dsh --profile acp --help
首次执行会初始化 ~/.dsh/profiles/acp 并把依赖装好;--help 只打印帮助后退出,不会占用 stdin/stdout。
为什么必须先手动跑一次:Paseo 的 ACP 探针有约 20 秒超时,如果让 Paseo 触发首次安装,provider 会以"不可用"告终。
编辑 ~/.paseo/config.json,在 agents.providers 下加一段(改前先备份):
"dsh": {
"extends": "acp",
"label": "DeepSeek Harness",
"description": "DeepSeek Harness (dsh) coding agent over ACP stdio.",
"command": ["dsh", "--profile", "acp"],
"env": {},
"enabled": true
}
如果 dsh 不在 daemon 的 PATH 里,command 换成绝对路径,例如:
"command": ["/Users/<你>/.local/share/fnm/node-versions/<ver>/installation/bin/dsh", "--profile", "acp"]
paseo reload # provider 改动不需要重启 daemon,不会打断正在跑的 agent
paseo provider ls
paseo provider diagnostic dsh
paseo provider models dsh
本次实测输出:
DeepSeek Harness (ACP)
Launcher binary: dsh
Resolved path: ~/.local/share/fnm/.../bin/dsh
Version: 0.1.5-rc.1
ACP spawn: ok (0ms)
ACP initialize: ok (363ms)
ACP session/new: ok (45ms; models=4; modes=0)
ACP cleanup: ok (29ms)
Status: Ready
再做一次真实冒烟:
paseo run --provider dsh --title "冒烟测试" \
"只回复两个字:ok。不要调用任何工具,不要修改任何文件。"
| 能力 | DSH acp profile | Paseo 通用 ACP adapter | 结果 |
|---|---|---|---|
| 协议 | ACP v1 over stdio | extends: "acp" |
✅ |
authenticate |
立即成功、不需要认证 | Paseo 根本不调用它 | ✅ |
| 模型选择 | config option id model ,categorymodel |
读 model 类 config option |
✅ 能切模型 |
| 推理档位 | config option reasoning_effort ,category**thought_level** |
映射为 thinking 档位 | ✅ 能选档位 |
| 会话持久化 | session/list /resume /close |
原生支持 | ✅ |
| 权限 | session/request_permission ,只有allow_once /reject_once |
Auto Accept 找 allow 选项 | ✅ |
| MCP | 支持 stdio / HTTP 声明 | 默认注入自身 MCP | ✅ 实测通过 |
| 模式(modes) | 没有 | 无 modes 时跳过 setMode |
⚠️ 别配 modeId |
| 客户端 fs / 终端 | 不使用,靠自己的工具 | 默认 fs=false | ✅ 互不干扰 |