结论:四层补丁都能改内置参数,但 config 是整体替换、不是往下合并;少写一个必填项,--dump-config 照样通过,真跑 1.5 秒退出。

前几期看过装法、任务表现、无头模式、会话记录。这期只碰一件事:内置参数怎么改,改错了它会怎样。

本次实测

环境:WSL2(Ubuntu)、Node 22.23.2、dsh 0.2.0-rc.2。为了不动日常目录,把 ~/.dsh 整份复制到 /tmp/dsh_20261030/home1,用 DSH_HOME 指过去,每条命令都套 timeout 280。

先量规模:dsh --profile headless --dump-config 输出 96 个插件条目、379 行 YAML。覆盖层一共四层:

层位置
bundlepackage.json 里 dsh.profile.bundles 列的 dsh-base 加 dsh-headless
profile$DSH_HOME/profiles/<名字>/cordis.patch.yml
home$DSH_HOME/cordis.patch.yml,一份,所有 profile 共用
CLI--patch some.yml

自建 profile 只要一条命令:dsh probe --from-default-profile headless。它顺手就启动,headless 模板缺任务立刻 exit 1,但四个文件已经复制进 profiles/probe/ 了,不耽误用。

五档测试,目标都是同一个内置项 agent-default-model,默认值 provider: deepseek-official、model: deepseek-flash。

#写法结果
1只写 model,不写 provider--dump-config exit 0,树照出;真跑 exit 1、1.5 s,报 ValidationError: invalid config: $.provider missing required value
2三个字段写全,再给 llm-deepseek 加 maxTokens: 8000exit 0、6.1 s;请求头变成 model: deepseek-v4-pro、reasoningEffort: low、maxTokens: 8000
3id 拼错成 agent-default-modellstderr 一行 patch: entry "agent-default-modell" not found,照跑 exit 0、3.3 s,请求头还是 deepseek-flash / 256000 / high
4不建 profile,用 --patch 临时叠一层exit 0、7.1 s;model 改了,maxTokens 仍 256000
5同一道题,reasoningEffort 分别 off 和 high都 exit 0;2.52 s 对 2.56 s,答的都是 70%;差别在 stderr 里的推理文本,0 B 对 67 B

第 5 档是我自己最想让配置生效的一处:一行 reasoningEffort: off 就能把推理关掉。简单算术上看不出秒差,两道都两秒半;能看出区别的是 stderr,high 多出 67 字节思考文本,off 一条不剩。要看它到底省了什么,得放进真任务里跑,这次没测。

怎么确认改动真落地,不用猜:会话落盘的 zstd 里记着最终请求头。

zstd -dc ~/.dsh/sessions/--tmp-xxx--/session-*/session.v4.jsonl.zstd | grep request/header

解出来是 "config":{"provider":"deepseek-official","model":"deepseek-v4-pro","reasoningEffort":"low","maxTokens":8000},跟补丁逐项对上。前三期用这个文件核 token 账,这次用它核配置。

层序也测了:profile 层写 deepseek-flash、CLI 层写 deepseek-v4-pro,结果是 deepseek-v4-pro。后面的层压前面的,写反了不报错,只是不生效。home 层那份 cordis.patch.yml 也一样能全局生效,放进 $DSH_HOME 根下就行。

一条坑:config 是整体替换,dump 不会替你挡

现象:只想换个模型,补丁里写一行 model:。--dump-config 里那个条目确实变成了新模型,看着没毛病。真跑直接退出,任务都没开始:1 required plugin did not activate,下面写着 $.provider missing required value;紧跟着还有一行 headless-runner (required) agent,上游插件没起来,服务缺席,后面一排跟着废。

复现:

cat > $DSH_HOME/profiles/probe/cordis.patch.yml <<'EOF'
- id: agent-default-model
  config:
    model: deepseek-v4-pro
EOF
dsh --profile probe --dump-config      # exit 0,看着正常
dsh --profile probe "只回答一个字"      # exit 1,1.5 秒

解法:抄那个条目时把必填项写全,config 是整块换掉,不会跟原配置合并。不确定哪些字段必填,就看 dsh --profile <名字> --dump-config-schema 打出来的 JSON Schema,每个条目都带 required;agent-default-model 要 provider 和 model 两个。改完别只信 dump,用一个一句话的小任务跑通,再从会话文件里核请求头,两分钟能省一次白查。

拼错 id 那档也记一笔:它是 warned and skipped,只往 stderr 打一行,混在推理文本里,很容易当成噪音划过去。

一句话总评

4 / 5,只评"配置能不能改、改了能不能核"这一项。 四层覆盖、每层一份 YAML、改完能从落盘的请求头里核实,做脚本和排障都够用;扣分在整体替换的语义不显眼,--dump-config 又不校验必填,写错只警告不停。


测试环境:WSL2(Ubuntu)、Node 22.23.2、dsh 0.2.0-rc.2。命令、退出码、耗时、请求头均为本机实测。

文 / 程实