Chapter 00

从零理解 Agent 与 Harness

目标不是背 API,而是建立能从顶层设计一路推导到源码细节的心智模型。读完本章,你应该能解释“为什么这样设计”,而不仅是“代码在哪里”。

这一章只解决一个问题:在看 DSH 之前,先把 Agent、Harness、Tool、LLM、Session 这几个词放到正确位置。

1. 先把“LLM”和“Agent”分开

LLM 本质上是一个函数:输入一串消息与可选工具描述,输出文本或工具调用。它不会自动保存会话,不会自动真的执行 shell,也不会天然知道文件系统,更不会自己无限循环。

Agent = LLM + 环境 + 状态 + 循环策略。 一次典型 agent 行为是:用户给任务 → harness 组装上下文 → 调 LLM → LLM 决定调用工具 → harness 执行工具 → 把结果写回状态 → 再次调 LLM → 直到模型给出最终答案或策略要求停止。

UserHarnessLLMTool CallEnvironment

2. Harness 到底是什么

Harness 不是模型,也不是 prompt。它是把模型“接到真实世界”的宿主运行时。它至少承担:模型路由、prompt 组装、工具注册与执行、权限/审批、会话状态、持久化、取消、错误恢复、并发、UI、日志和插件生命周期。

职责DSH 对应
模型推理与生成DeepSeek / 其他 provider
Agent一次活跃智能体实例Agent 接口 + scoped context
Loop决定何时请求模型、何时继续dsh-agent-loop
Harness把整个系统装配、隔离、持久化、扩展DeepSeek Harness

3. 为什么 DSH 值得从“架构”学,而不是从“聊天功能”学

DSH 的关键不是某个神奇循环,而是微内核式插件化:模型适配、工具、会话日志、Agent Loop 本身都可替换。理解这一点,你就能解释为什么它大量使用 service、event、effect、scope,而不是把所有能力塞进一个 Agent 类。

源码定位:架构总览 · docs/architecture.zh.md
打开官方源码/文档

4. 本教程学习法

  1. 先画架构,不打开实现文件。
  2. 再追一条真实请求:user message → session event → prompt → LLM → tool → session event。
  3. 然后拆可替换 seam:LLM、FS、Shell、Persistence。
  4. 最后自己写 DSH-Lite;当你能替换某个 provider 而不改 consumer 时,才算理解。
不要一上来读 1000 行 Session 类。先知道它为什么必须存在、谁依赖它、事件从哪里来,再读字段和边界条件。