🐳 第一章 Harness不只是另一个Coding Agent
📄 一句话概括

同一套 Runtime 能长出很多个产品——DSH 是 Runtime,浏览器界面、桌面客户端、命令行都只是它的不同外壳;分清这一层,后面一半的困惑会自动消失。

📝 本节和前面几节的关系

导读讲完了【这是什么】,第 1 章开始给 DSH 定位。1.1 是全章第一刀:把【你看得见的产品】和【底下跑起来的运行时】切开。1.2 讲【一切皆插件】、1.3 讲为什么它不只是多挂几个工具,都建立在这一刀上。

一、一句话区分

产品是你看到、点开、付款的那个东西——界面、安装包、账号、价格。 Runtime(运行时)是底下真正让模型动起来的那个东西——工具、会话、沙箱、循环。

打个比方:产品是车,Runtime 是发动机加传动系统。 同一台发动机可以装进轿车、面包车、皮卡——车不一样,里面转动的道理是一样的。

所以问到【这个工具好用吗】的时候,要先问一句:你说的是哪一层? 界面丑不丑是产品层的事,工具会不会被卡住是 Runtime 层的事。

二、三层的责任划分

把整条链拆开,大概是三层:

这三层的改动成本差得很远:

改动一次比一次外移,越往里越稳定。这就是为什么分清层次有用—— 你永远知道该在哪一层动手。

三、同一个 Runtime,多种产品

DSH 这套 Runtime,已经被做成了好几种产品形态:

关键是:这几种形态底下是同一套 Runtime。 你在 Web 界面里配好的模型、装好的插件,换到命令行形态依然是那套东西。 因为【界面】本身在 DSH 里也是一个插件——换界面不叫换系统,叫卸一个插件装一个插件。

四、分清它,有什么用

这一刀分下去,至少三个常见困惑自动有答案了:

  1. 【换个模型是不是要重写代码?】——不用。模型是 Runtime 层的插件,改一行配置。
  2. 【换了个客户端,我的工具是不是要重装?】——不用。工具挂在 Runtime 上,不在产品里。
  3. 【为什么同一套底子,不同产品能力差这么多?】——因为挂哪些插件由预设决定, 不同产品默认的预设可能不同。

注意第 3 条的反面:Runtime 相同,不等于能力相同。 底子一样、装配不同,出来的东西可以差很远——这正是第 3 章要讲的事。

五、动手 Demo:把三层各管什么列清楚

先做个最直白的对照,把三层各自的职责分开:

layers = [
    ("模型", "推理、生成 Token"),
    ("Harness(Runtime)", "工具、会话、沙箱、循环、调度"),
    ("产品", "界面、安装、账号、收费"),
]
for k, v in layers:
    print("%-20s %s" % (k, v))
print()
print("换模型的改动量 = 1 行配置")
print("换界面的改动量 = 换 1 个 UI 插件")
print("两者都不需要动对方")

实跑输出:

--------------------------------------------------------------------
把产品和 Runtime 分开
--------------------------------------------------------------------
  这是全书第一刀,也是后面所有讨论的地基:
  同一套 Runtime,可以长出很多个产品。

  问题                     属于产品     属于 Runtime
  ---------------------------------------------------
  界面长什么样             是           不是
  有哪些工具可用           不是         是
  会话怎么存               不是         是
  命令在哪里跑             不是         是
  模型怎么连               不是         是
  装在哪台机器上           是           不是
  要不要登录、怎么收费     是           不是
  ---------------------------------------------------

  分清楚之后就能看懂:DSH 是 Runtime,
  而这套 Runtime 已经被做出了好几种产品形态。

  产品形态     长什么样                   什么时候用
  -----------------------------------------------------------------
  Web UI       浏览器里的界面             默认方式,一条 npx 命令
  桌面应用     Windows / macOS 客户端     不想开命令行的人
  Headless     没有界面,跑完打印结果     CI、脚本、批处理
  TUI          终端里的界面               社区替换版,偏好键盘的人
  -----------------------------------------------------------------

  注意最后一行:连【界面】本身都是一个插件。
  同一个 Runtime,换一个 UI 插件就变成另一种产品。

  小算例:一个 Runtime 配几种界面,能开出几种产品?
    界面插件 4 种 × 部署位置 3 种(本地 / 自托管服务器 / 桌面)
    = 12 种组合
  这 12 种背后的运行时逻辑,是同一套。

  分清这一层,后面很多问题就自动有答案了——
  比如【换个模型要不要改代码】:模型是 Runtime 层的插件,
  改一行配置就行,界面和工具都不用动。

最后三行是这一节的重点:换模型和换界面互不影响, 因为它们在两个不同的层上。 这种【互不影响】不是碰巧,是故意设计出来的—— 后面第 3 章讲的两个平面、第 4 章讲的接缝,都是在保证这件事。

30 秒实验

  1. 挑一个你天天用的 AI 产品,把它的【模型】【运行时】【产品外观】三层分别写出来。
  2. 在终端里跑一次 dsh --help,看 --profile 后面能跟哪些名字——那些就是不同的产品形态。
  3. 想一个你现在遇到的问题,判断它属于哪一层的问题:模型不行、运行时卡住,还是界面难用。

常见误区

  1. 错误:产品就是 Runtime,是一回事。——纠正:产品是外壳(界面、安装、收费),Runtime 是里子(工具、会话、沙箱、循环);同一个 Runtime 能长出好几个产品。
  2. 错误:换个界面就得重做工具。——纠正:连界面本身都是插件,换 UI 插件不影响工具和会话。
  3. 错误:既然 Runtime 一样,各产品能力就一样。——纠正:Runtime 相同不等于能力相同——挂哪些插件由预设决定,不同产品默认预设可能不同。
自测三问(点开对答案) 1. 产品和 Runtime 怎么区分? —— 产品是你看到、点开、付款的东西(界面、安装方式、账号、收费);Runtime 是底下让模型动起来的那层(工具、会话、沙箱、循环)。 2. DSH 这套 Runtime 被做成了哪几种产品形态? —— Web UI、桌面应用、headless(无界面)、TUI(终端界面)。 3. 为什么【换个模型】这么便宜? —— 因为模型是 Runtime 层的插件,**改一行配置即可**,界面和工具都不用动。

相关笔记