第 10 章 实战:把知识串成能力
案例 A:让 Harness 自动修复失败的测试
场景:你有一个出问题的仓库,想快速知道 agent 能不能自己定位并修复。
做法(无头模式,适合 CI 和本地一次运行):
代码块
Plain Text
dsh --profile headless "run the test suite, analyze the failures, fix them, then rerun to confirm"
看点:
•
agent 会先读仓库、跑测试、看失败输出;
•
它在工作区里改文件,是真实操作——所以请用 git checkout 或可丢弃的副本;
•
跑完后,用 --dump-config 检查它实际用到的配置层。
进阶:把这条命令放进 GitHub Actions,PR 时自动让 agent 试修一遍并附上报告。
案例 B:用 Python SDK 批量处理多个仓库
场景:10 个仓库都要"升级依赖并跑通测试",人工逐个做很费时。
做法(第 5 章批量例子的完整版):
代码块
Plain Text
from pathlib import Path
from deepseek_harness import DeepSeekHarness
repos = {
"svc-auth": "Upgrade all dependencies to latest compatible, run tests, fix issues.",
"svc-billing": "Upgrade all dependencies to latest compatible, run tests, fix issues.",
"svc-notify": "Upgrade all dependencies to latest compatible, run tests, fix issues.",
}
with DeepSeekHarness(
provider="deepseek-official",
model="deepseek-v4-flash",
cwd="/workspaces",
session_root="/sessions",
cordis=Path("minimal.cordis.yml").resolve(),
) as harness:
for repo, task in repos.items():
result = harness.run(task, session_id=repo)
print(f"### {repo}\n{result.final_response}")
看点:
•
每个仓库独立 session id,Bash 状态和对话互不污染;
•
/sessions 下每个 session 一份 JSONL,出事可以回放"模型到底看到了什么、干了什么";
•
别忘了:这个组合默认 danger-full-access,务必在容器或可丢弃环境里跑。
案例 C:给 Harness 加一个"文档检索"工具
场景:你有一个内部知识库,想让 agent 回答问题时能查文档,而不是瞎猜。
思路:写一个工具插件,execute 里调用你的检索服务(比如向量库或 Elasticsearch),返回命中片段。模型会在需要时自动调用它。
骨架:
代码块
Plain Text
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'docs-search'
export const inject = ['tools']
export function apply(ctx: Context) {
ctx.tools.register(defineTool({
name: 'search_docs',
description: 'Search internal docs and return relevant snippets.',
parameters: {
query: { type: 'string', required: true, description: 'Search query' },
limit: { type: 'number', description: 'Max results, default 5' },
},
output: {
schema: { type: 'array', items: { type: 'string' } },
render: (_args, value) => [{ type: 'text', text: value.join('\n---\n') }],
},
async execute(args) {
// 在这里调用你的检索服务
return fetchSearch(args.query, args.limit ?? 5)
},
}))
}
关键设计:
•
output.render 把检索结果渲染成模型可读的文本——这是"模型体验"的落点;
•
检索服务的地址、密钥等做成配置字段(第 7 章的约定),别硬编码;
•
需要权限审批的操作,可以在 tools/pre-execute 事件上做策略。
效果:agent 遇到"某某接口怎么用"时,会先 search_docs,再基于检索结果回答,比裸模型的幻觉率低一个量级。
案例 D(彩蛋):做一个"自动化研究循环"
社区里已经有 Loops(auto-research) 类插件:让 agent 自己规划步骤、反复搜索、产出报告。原理其实就是本书第 9 章说的——**在 agent/* 事件上挂一个"续跑"策略**:只要目标未完成且预算未耗尽,就让轮次继续。
想动手的话,从 docs/agent-lifecycle.md 和 docs/subsystems/core.md 读起,那里有续跑机制的完整说明。
本章小结
•
无头模式适合"一次性的真实修复",配合 git/CI 使用;
•
Python SDK 适合"批量编排",session id 是状态边界;
•
工具插件是给模型"接世界"的标准姿势,检索类工具能显著降低幻觉;
•
更复杂的自动化(循环、研究、编排)本质都是在事件扩展点上做策略。
下一章:生态、坑和 FAQ——让你少走弯路。