"DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑"

145 阅读4分钟

DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑

各大媒体的 dsh 实测文章已经铺完了,但全是表演型任务。本文用三轮真实编码任务实测 headless 模式,附完整 token 数据和 5 个踩坑记录。

实验环境

  • 模型:deepseek-v4-flash(headless 默认)
  • 环境:macOS, Node v22.22.2
  • 靶场:40 行 Python 计算器模块,6 个函数埋 4 个 bug
  • 安装npm install @deepseek-ai/dshdsh --profile headless "task"

三轮任务

轮次任务权限模式耗时
1找bug+写测试+跑通workspace-write(默认)213s
2同上danger-full-access162s
3用不存在的 API 加功能danger-full-access31s

坑1:默认沙箱跑不了命令

第一轮用默认配置,dsh 改了文件、写了测试,但 pytest 一步都跑不动:

sandbox-exec: Operation not permitted

dsh 默认权限模式 workspace-write 允许读写文件,但 bash 命令走沙箱。macOS 上 sandbox-exec 需要特殊权限,普通终端跑不了。dsh 检测到被拒后尝试升级到 danger-full-access,但 headless 没有审批 UI,这条路也是死的。

善后:

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 数据:

总输入:     569,630
缓存命中:   550,272 (96.6%)
输出:       23,254
推理:       16,442
费用(谷时):  ¥0.056

DeepSeek 的 prompt cache 在同一 session 内越打越热。但每个新 session 冷启动要全量输入

善后: 相关任务放一个 session 里连续做。别每个任务都开新 session。

三轮总费用:

轮次总输入缓存率费用
143K75.1%¥0.009
2570K96.6%¥0.056
3254K94.1%¥0.037
合计¥0.102

坑4:它不脑补,反而纠正了我

第三轮设了个陷阱:让它用 math.median()(不存在,标准库在 statistics 模块)。

dsh 的反应:

  1. 执行 hasattr(math, 'median')False
  2. 回复里明确说 "Python's math module has no median() function"
  3. 改用 from statistics import median
  4. 写测试 → 76 passed

session 日志(.jsonl.zstd)记录了完整的 17 次工具调用和 446 个推理 chunk。这就是 Trajectory 页的价值——每一步可追溯。

但 headless 下日志是压缩格式,没有现成的费用汇总,得自己解压提取:

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 事件:

{"model": "deepseek-v4-flash"}

不是 V4-Pro。Flash 对找 bug、写测试已经够用,但复杂架构设计可能需要手动切 Pro。

代码修复质量验证

dsh 修复的 4 个 bug,我手动跑了 pytest 验证:

# 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 领取。