你给 DSH 一句“修复采购合计”,它为什么能先读文件、再改代码、再运行测试?关键不在几个发光模块,而在模型请求与工具结果之间反复往返的循环。
本文使用 采购合计练习 解释机制。只想马上上手,可以直接看 从安装到首次修复的一站式教程;已经在用 DSH,则可以拿本页对照自己的运行轨迹。
先把四个概念放对位置
| 概念 | 在 DSH 中负责什么 | 不应该怎样理解 |
|---|---|---|
| 模型 | 根据请求内容返回文字或工具调用 | 直接访问你的电脑 |
| Harness | 组装上下文、组织循环、执行工具、记录结果 | 一个固定的聊天皮肤 |
| Cordis 插件组合 | 提供和连接运行能力、服务与扩展点 | 必须按插件列表顺序执行任务 |
| 工作区 | 本次工作涉及的项目目录 | 自动等于完整系统隔离 |
DeepSeek Harness 是 DeepSeek 的开源 Agent 框架;Harness.io 是另一个公司的 DevOps 产品。通用词 agent harness 也可以指一类运行框架。遇到同名教程时先核对组织和仓库。
启动时发生的事,与每次对话不同
dsh web 启动 Web profile。profile 是进程级组合;bundle 提供成组插件配置,用户 patch 再覆盖对应配置。这里决定进程拥有哪些基础服务和入口。
创建会话时,agent preset 决定该会话的工具、提示片段与技能组合。profile 不等于 preset:一个服务进程可以承载不同预设的会话。标准模式适合作为本教程起点,避免同时改变工具呈现方式和任务材料。
想只看配置、不执行任务,可以在自己的练习环境运行:
npx @deepseek-ai/dsh@0.1.2-rc.1 --profile web --dump-config
它查看组合后的配置,不是“显示模型正在想什么”。命令可能初始化缺失的 profile 文件,但不会启动模型任务;输出包含本地配置上下文,分享前应检查并脱敏。本文不要求新手修改它。
一次任务实际怎样推进
我们的文件里有一行错误:
return items.reduce((sum, item) => sum + item.unitPriceCents, 0);
下面以模型先读、再改、最后回答为例。真实模型可能先搜索文件、并行读多个文件或额外运行测试;步骤数量不是固定的。
第 1 次主要模型请求:告诉模型它能做什么
DSH 组装系统提示、对该会话可见的工具定义,以及从会话派生出的历史。模型看到工具名称、用途和参数结构,不会得到工具执行函数本身。
如果历史里尚无 budget.mjs 内容,模型不能仅凭工作区名称知道里面的实现。它可以提出一个读取调用,例如:
{"name":"read","arguments":{"file_path":"budget.mjs"}}
这是为了说明内容而简化的表示,不是 HTTP 请求完整结构。
DSH 执行读取,产生工具结果
执行器检查参数与策略,调用文件能力;成功则返回文件内容,失败则返回错误。调用和结果进入会话记录,前端可以呈现相应过程。
重要的是:**刚返回工具调用的模型请求已经结束,文件内容不会倒流进那一次请求。**DSH 需要把读取结果用于下一次模型请求。
第 2 次主要模型请求:模型现在有了文件依据
在新的请求里,模型能看到上一次调用及其结果。它可以提出 edit,把旧表达式替换成新表达式:
{
"name": "edit",
"arguments": {
"file_path": "budget.mjs",
"old_string": "sum + item.unitPriceCents",
"new_string": "sum + item.unitPriceCents * item.quantity"
}
}
这三个参数来自当前默认文件工具接口。换一个工具预设后,名称与参数可能不同,不应把此例扩展成全部模式的规范。
权限在执行处介入,不是任务中的必经会议
工具管线可遇到 allow、deny 或 ask。允许时继续执行;拒绝时不发生本次修改;需要询问时才等确认。还有参数校验、守卫和底层执行失败等其他可能,allow 也不保证磁盘修改最终成功。
默认文件工具组合还包含读后改观察策略,避免模型未读文件就盲改;该策略属于独立插件。不能把 Skills、Plan 或用户审批画成所有任务都必经的三个阶段。
第 3 次主要模型请求:根据结果决定继续还是结束
edit 成功后,模型在下一步看到成功结果,可以继续请求测试,或回答目前做了什么。edit 被拒绝或失败后,模型看到的是相应结果,应据此调整;它不应声称已经修复。
默认循环不是“只要没有工具调用就永远结束”:还要考虑待处理输入、继续运行扩展、取消和错误等状态。教学中展示的是没有其他待处理工作的一条最小路径。
turn、step、会话分别是什么
- **会话(session):**承载历史与运行记录,可以包含多次用户交互。
- **轮次(turn):**一次被唤醒后处理工作的区间,可能有零个或多个 step。
- **步骤(step):**一次模型请求及它引出的工具调用处理。工具结果通常推动下一步模型请求。
从轨迹看,关注 step/start、assistant/message、tool/call、tool/result、step/end 与 turn/end。界面未必直接展示这些底层名称;它们用于帮助你对照源码,不是要求你操作的菜单。
会话日志与模型上下文也不是原样复制的同一物件。DSH 会从日志派生模型历史,部分记录服务于回放、状态或诊断,不意味着全部原文每次都发给模型。
Skills 和 MCP 应该放在哪里
Skill 提供可复用的方法与材料。默认文件系统 Skill 提供方先发现目录元信息,具体内容按需加载;不是模型先经过“Skills 节点”才能执行。
MCP 可把外部能力接入工具体系。当模型调用这些工具时,仍需要经过对应参数、策略、执行与结果处理。连接成功不代表任务自动成功,也不代替验收。
插件组合影响“有哪些能力、怎样呈现、在哪些事件介入”;任务循环解释“这一次请求怎样推进”。把这两个层次分开,DSH 就更容易理解。
用实际验证对照,而不是背框图
本站在独立安装的 0.1.2-rc.1 中,用本地脚本模型返回 read → edit → final,真实 DSH 执行器完成了文件修改,外部测试由 1 通过 / 2 失败变为 3 通过 / 0 失败。运行还产生了一个不携带工具定义的辅助模型请求,所以不能简单把服务端所有 HTTP 次数当作主 Agent 的 step 数。
这项验证支持工具往返机制,不支持“DeepSeek 一定能自主修好此任务”的结论。查看验证摘要,或到 交互演示 逐步观察输入、调用、结果与下一次请求。