DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑
各大媒体的 dsh 实测文章已经铺完了,但全是表演型任务。本文用三轮真实编码任务实测 headless 模式,附完整 token 数据和 5 个踩坑记录。
实验环境
- 模型:deepseek-v4-flash(headless 默认)
- 环境:macOS, Node v22.22.2
- 靶场:40 行 Python 计算器模块,6 个函数埋 4 个 bug
- 安装 :
npm install @deepseek-ai/dsh→dsh --profile headless "task"
三轮任务
| 轮次 | 任务 | 权限模式 | 耗时 |
|---|---|---|---|
| 1 | 找bug+写测试+跑通 | workspace-write(默认) | 213s |
| 2 | 同上 | danger-full-access | 162s |
| 3 | 用不存在的 API 加功能 | danger-full-access | 31s |
坑1:默认沙箱跑不了命令
第一轮用默认配置,dsh 改了文件、写了测试,但 pytest 一步都跑不动:
makefile
sandbox-exec: Operation not permitted
dsh 默认权限模式 workspace-write 允许读写文件,但 bash 命令走沙箱。macOS 上 sandbox-exec 需要特殊权限,普通终端跑不了。dsh 检测到被拒后尝试升级到 danger-full-access,但 headless 没有审批 UI,这条路也是死的。
善后:
bash
export DSH_PERMISSION_MODE=danger-full-access
不开这个,headless 模式等于残废------只能改文件不能跑命令。
坑2:自动装依赖可能装错 Python
第二轮开了全权限,dsh 全程无人工介入完成了任务:
- 读代码 → 推理出 4 个 bug
- 逐个修复
- 写 67 个参数化测试
- 发现没 pytest → 自己
pip install - 跑测试 → 67 passed
但 dsh 装 pytest 时用的是系统默认 python3。如果你的项目有 venv,dsh 不会自动激活它。
善后: 任务描述里指定 Python 路径,或启动前激活 venv。
坑3:缓存命中率 96.6%,但只在 session 内
第二轮完整任务的 token 数据:
makefile
总输入: 569,630
缓存命中: 550,272 (96.6%)
输出: 23,254
推理: 16,442
费用(谷时): ¥0.056
DeepSeek 的 prompt cache 在同一 session 内越打越热。但每个新 session 冷启动要全量输入。
善后: 相关任务放一个 session 里连续做。别每个任务都开新 session。
三轮总费用:
| 轮次 | 总输入 | 缓存率 | 费用 |
|---|---|---|---|
| 1 | 43K | 75.1% | ¥0.009 |
| 2 | 570K | 96.6% | ¥0.056 |
| 3 | 254K | 94.1% | ¥0.037 |
| 合计 | ¥0.102 |
坑4:它不脑补,反而纠正了我
第三轮设了个陷阱:让它用 math.median()(不存在,标准库在 statistics 模块)。
dsh 的反应:
- 执行
hasattr(math, 'median')→False - 回复里明确说 "Python's math module has no median() function"
- 改用
from statistics import median - 写测试 → 76 passed
session 日志(.jsonl.zstd)记录了完整的 17 次工具调用和 446 个推理 chunk。这就是 Trajectory 页的价值------每一步可追溯。
但 headless 下日志是压缩格式,没有现成的费用汇总,得自己解压提取:
python
import zstandard, json
dctx = zstandard.ZstdDecompressor()
with open("session.jsonl.zstd", "rb") as f:
raw = dctx.stream_reader(f).read()
for line in raw.decode().strip().split("\n"):
obj = json.loads(line)
if obj.get("type") == "assistant/chunk":
chunk = obj["data"]["chunk"]
if chunk.get("type") == "usage":
print(chunk["usage"]) # inputTokens, outputTokens, cacheReadTokens
坑5:headless 默认用 Flash 不是 Pro
查了 session 日志的 request/header 事件:
json
{"model": "deepseek-v4-flash"}
不是 V4-Pro。Flash 对找 bug、写测试已经够用,但复杂架构设计可能需要手动切 Pro。
代码修复质量验证
dsh 修复的 4 个 bug,我手动跑了 pytest 验证:
python
# Bug 1: divide 除零
def divide(a, b):
if b == 0:
raise ValueError("除数不能为 0")
return a / b
# Bug 2: average 空列表
def average(numbers):
if not numbers:
raise ValueError("不能计算空列表的平均值")
return sum(numbers) / len(numbers)
# Bug 3: format_price 丢小数
def format_price(cents):
return round(cents / 100, 2)
# Bug 4: parse_range 非法输入
def parse_range(expr):
if not isinstance(expr, str):
return None
parts = expr.split("-")
if len(parts) != 2:
return None
try:
return int(parts[0]), int(parts[1])
except ValueError:
return None
67 个测试全部通过,覆盖了正常路径和边界情况。
总结
| 坑 | 善后 |
|---|---|
| 默认沙箱跑不了命令 | DSH_PERMISSION_MODE=danger-full-access |
| 自动装依赖装错 Python | 指定路径或提前激活 venv |
| 冷启动贵 | 相关任务放一个 session |
| 日志压缩无费用汇总 | 解压 .jsonl.zstd 自己算 |
| 默认 Flash 不是 Pro | 简单任务用 Flash,复杂任务切 Pro |
编码能力:Flash 就能找对 bug、写测试、自己装依赖、自己跑通。工程成熟度:沙箱默认锁死、没费用汇总、日志不友好、配置隐蔽。
但一毛钱干三活、96.6% 缓存、不脑补还主动纠错------"让 dsh 帮你善后"已经可以开始了。
领资料
文中用到的靶场代码(40 行带 4 个 bug 的计算器)、session 日志解压脚本、三轮完整 token 数据,都打包好了:公众号「啫煲捞饭」后台回复 dsh 领取。