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

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 的反应:

  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 下日志是压缩格式,没有现成的费用汇总,得自己解压提取:

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

相关推荐
IT_陈寒4 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala4 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
ikoala4 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
wo_jack8 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
mCell9 小时前
AI 时代,我为什么开始追求 100% 的测试覆盖率?
llm·ai编程·测试
ZzT9 小时前
AI-SDLC 实践 04|方案设计:把 Spec 转化为技术方案,并拆解为多 SubAgent 可执行的任务
ai编程·claude
量化分析码农9 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
GISer_Jing10 小时前
如何学习Agent
后端·langchain
JWASX11 小时前
【Go】map 源码解析 - group
后端·golang·map·源码分析
量化分析码农12 小时前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端