兰 亭 墨 苑
期货 · 量化 · AI · 终身学习
首页
归档
编辑文章
标题 *
URL 别名 *
内容 *
(支持 Markdown 格式)
# 一切皆插件:DeepSeek Harness 的“操作系统”野望 ## 导语:一个正在被重塑的世界 2026年的AI Agent框架赛道,早已不是“有没有”的问题,而是“选哪个”的问题。Cursor、Cline、OpenCode、Pi…… 加上新出的DeepSeek Harness,市面上能叫出名字的Agent框架不下二十个。 但如果你仔细观察,会发现一个有趣的现象:绝大多数框架在做同一件事——往核心里塞更多功能。 加更多的工具、加更多的预设、加更多的“开箱即用”——然后把整个包打成一个“全家桶”卖给你。你拿到手的是一个已经替你做好所有决定的黑箱:模型用哪家、工具用哪些、循环怎么跑、上下文怎么管——全都定好了。你只能在这个框架划定的边界里“自由发挥”。 DeepSeek Harness(dsh)选择了一条完全相反的路。 它做了一个激进的断言:好的Harness不应该替你做任何决定。它应该是一套“可插拔的操作系统”——没有特权内核,没有不可替换的组件,没有“框架替你选好了”的默认值。一切皆插件。 这个断言,不是一句营销口号。我们去读dsh的源码,几乎找不到一个“核心模块”——因为所有东西都是插件。模型是插件,工具是插件,会话是插件,沙箱是插件,存储是插件,UI是插件,甚至连Agent Loop(智能体循环)本身,都是插件。 在dsh的世界里,不存在需要打补丁的“特权内核”。没有哪个组件天生比另一个组件更重要。你替换Agent Loop,跟替换一个工具插件,在架构层面上是同一件事。 这篇文章,我们就以DeepSeek Harness为主线,把它的设计思路拆开来看。同时,我会把它放在另外两种Agent设计模式的参照系里——Pi Agent的“极简核心+深度Hooks”和OpenCode的“模型中立+终端优先”——去回答一个问题:为什么“一切皆插件”不是炫技,而是一种对“Agent应该长什么样”这个问题的深刻回答。 ## 一、一切皆插件:把Agent拆成乐高 DeepSeek Harness最核心的设计原则,写在它的官方文档第一行:“一切皆插件”。 这句话背后,是一个极其彻底的解耦思路。在dsh中,所有Agent能力——模型、工具、技能、会话、沙箱、存储、循环、调度、UI——全部由插件组合而成,可自由替换、灵活重组。 ### 1.1 Cordis:没有“核心”的核心 dsh底层的技术基座是Cordis,一个轻量级的控制反转(IoC)框架。Cordis只做两件事:管理插件的生命周期,以及处理依赖关系。 这意味着什么?意味着dsh没有传统意义上的“内核”。大多数框架有一个不可撼动的核心引擎,其他模块围绕它运转。但在dsh里,所有组件都在同一层。Agent Loop不是内核,模型客户端不是内核,会话管理不是内核——它们都是插件,地位完全平等。 这种设计的第一个直接后果是:不存在需要打补丁的特权内核。你想扩展dsh的能力,不需要fork源码,不需要hack核心逻辑——你只需要写一个新的插件,然后把它挂载到系统里。所有注册行为都是“副作用”,插件卸载时会自动、干净地撤销一切痕迹。 第二个直接后果是:“模式”本身也是插件组合的产物。dsh提供了四种运行模式——标准模式、PTC模式、极简模式、创造模式——它们的区别仅仅是加载了不同的插件集合。你完全可以自己定义第五种模式,加载你自己写的那套插件组合。 ### 1.2 四种原生形态,同一个骨架 - 标准模式:完整工具组合,功能完整的编码Agent,开箱即用。 - PTC模式(程序化工具调用):模型生成TypeScript代码来组合多轮工具调用,更适合需要复杂推理链的场景。 - 极简模式:仅保留Shell工具与文件编辑工具,用于最小环境下的模型基准测试——你可以精准测量模型本身的推理能力,不被工具复杂度干扰。 - 创造模式:可检查当前运行时,在内存中试验Cordis插件,组合和创作新的模式——这是一个“元模式”,用于构建新的模式。 四种模式,共享同一套插件机制。它们不是四个不同的产品,而是同一个产品在不同插件组合下的四种状态。 ### 1.3 可观测性:每一帧都可回放 每一次运行,系统会通过仅追加(Append-only)的会话日志,记录模型看到的一切——系统提示词、思维链、工具调用与结果、子Agent调度、每一次上下文注入。恢复、分叉、回放,全都在同一个事件流里流转,像一盘可以倒带重放的磁带。 这不是“日志”的常规用法。大多数框架的日志是给人看的,而dsh的会话日志是给系统本身用的——它是状态恢复的基石,是调试的工具,是实验复现的凭证。一个事件流,四种用途。 ## 二、另外两种答案:Pi与OpenCode 在开始分析“为什么这样设计”之前,先看看另外两条路。这会帮助我们理解dsh的选择,不是唯一的,但一定是深思熟虑的。 ### 2.1 Pi Agent:“极简核心 + 深海级Hooks” Pi Agent走的是一条截然相反的路。它的架构本质是:一个极简的核心循环 + 密密麻麻的深度Hooks挂载点。 不加扩展的原生Pi“简陋”得令人发指。默认只给模型四件工具:`read`、`write`、`edit`、`bash`。没有计划模式,没有内置MCP,没有Git检查点,没有子Agent调度——这些统统没有。 但Pi的“阴险”之处在于:它把Agent运行的每一层、每一步、每个数据流都切开,暴露成了可拦截、可替换的Hooks。 Hooks分布在四个层次: - Layer 1 - 会话生命周期:`session_start`、`session_shutdown`、`session_before_fork` - Layer 2 - Agent核心循环:`before_agent_start`、`before_provider_request`、`after_provider_response` - Layer 3 - 工具执行管道:`tool_call`、`tool_execution_start`、`tool_result` - Layer 4 - Provider传输层:`onPayload`、`onResponse`、`registerApiProvider` 通过Extension API,你可以在不改动Pi内核一行代码的前提下,给它装上并发调度、模型热切换、RAG知识库、自定义权限体系。引擎是固定的,但方向盘、踏板、仪表盘全部可以替换和调校。 Pi还有一个标志性设计:子Agent进程隔离。主Agent通过触发工具启动一个独立的OS级Pi进程作为子Agent,子Agent只带着被委派的那一句话和自身配置去干活,完事后返回结果并销毁。上下文在物理层面完全隔离,拒绝任何认知污染。 ### 2.2 OpenCode:“模型中立 + 终端优先 + 开发者主权” OpenCode选择的是一条完全不同的路。它的核心定位只有八个字:终端优先、模型中立。 它不绑定任何一家模型厂商,支持75种以上的模型提供商——Anthropic、OpenAI、Google Gemini、DeepSeek,以及本地部署的Ollama和llama.cpp。你用谁的API Key,就连谁的模型。工具本身不抽成、不锁定、不干预。它甚至支持会话中途切换模型——你在写代码的过程中,随时可以换一个模型继续。 OpenCode的架构是客户端-服务器(C/S)模式,分为四层:客户端层(终端TUI为核心)、核心服务层(代理调度与任务管理)、扩展层(插件与配置)、模型适配层(75+模型兼容接口)。 核心设计理念是“主从Agent分层”: - Plan Agent:只分析不改码,编辑权限被明确拒绝,用于代码库探索和方案规划 - Build Agent:拥有完整权限,负责代码实现、重构、文件读写 - 子Agent(Explore等):按需调用的专业工种,每个都有最小权限集 主Agent通过Tab键在Plan和Build之间切换——“想”和“做”在架构层面彻底分离。 OpenCode对“自由度”的回答是:不替你决定用哪家模型,不替你决定用什么工具,不替你决定怎么工作。你选,你配,你决定。 ## 三、三条路,三种“好”的答案 现在我们把三个项目放在一起看。 | 维度 | DeepSeek Harness | Pi Agent | OpenCode | |:---|:---|:---|:---| | 核心隐喻 | 可插拔操作系统(无特权核心) | 裸机主板(极简核心+插槽) | 自由集市(模型任选,工具自备) | | 回答的问题 | “怎么拼装Agent?” | “怎么高效执行Agent?” | “你凭什么替我做选择?” | | 扩展范式 | 横向:增加插件节点 | 纵向:劫持执行流注入逻辑 | 生态:接入任意模型+自定义Agent | | 有无特权内核 | 无——Agent Loop也是插件 | 有——核心循环不可替换 | 有——主Agent框架固定 | | 模型策略 | 深度绑定自家模型 | 模型可切换 | 75+模型自由选择,会话中切换 | | 子Agent | 插件化实现 | 进程级隔离 | 主从分层,权限隔离 | | 默认能力 | 完整全家桶(四种模式) | 4个原子工具 | Plan/Build双模式+多子Agent | 三个项目,三种完全不同的“好”。 Pi的好,是“干净” 。它给你一个极小的核心,让你在它上面搭建任何东西。它的克制让它的上下文极简,配合Prompt Caching能跑出99.93%的缓存命中率,单次任务成本压到0.028美元。Pi的价值在于:我知道我要什么,给我一个干净的底座让我自己折腾。 OpenCode的好,是“自由” 。它不关心你怎么拼装Agent,也不关心你用什么引擎执行——它只关心一件事:你还能不能自由地选择。75种模型,会话中随时切换,工具不抽成、不锁定、不干预。OpenCode的价值在于:我不想被任何人替我做选择。 DeepSeek Harness的好,是“彻底” 。它不给你核心,也不替你选择——它把整个Agent系统变成了一组可组合的插件,连Agent Loop都可以替换。你要什么形态的Agent,你自己拼。dsh的价值在于:你不只是在使用一个框架,你是在构建一个框架。 ## 四、为什么“一切皆插件”是一次架构级的回答 现在我们可以回到dsh本身,理解它为什么选择了“一切皆插件”这条路。 ### 4.1 Agent的本质是不确定的 Agent系统与传统软件有一个根本区别:你无法预知它需要什么能力。 传统软件的功能边界是确定的——一个文字处理器不需要图像识别,一个数据库不需要语音合成。但Agent不同。今天它需要调用搜索API,明天可能需要操作数据库,后天可能需要控制机器人。你不知道未来的Agent会做什么,就像1990年代的人不知道互联网会做什么。 “一切皆插件”是对这种不确定性的架构级回应:既然我不知道你需要什么,那我就不替你决定。你自己加。 ### 4.2 耦合是创新的敌人 另一个观察:Agent框架的演化速度极快。模型每周在变,工具每月在变,最佳实践每季度在变。如果你把框架设计成“核心+插件”的模式,核心的变化频率会成为整个系统的瓶颈——每次核心升级,所有插件作者都要跟着适配。 dsh把“核心”彻底拆掉了。没有核心,就没有瓶颈。Agent Loop可以独立演化,模型适配层可以独立演化,工具系统可以独立演化——它们互不依赖,只通过Cordis的服务与事件协作。 耦合是创新的敌人。解耦到极致,就是“一切皆插件”。 ### 4.3 插件架构是生态的土壤 还有一个更深层的考量:只有可插拔的系统,才能长出真正的生态。 你去看任何一个成功的开发者生态——VSCode、JetBrains、WordPress、Chrome——它们都有一个共同特征:核心极小,接口稳定,插件可以做任何事。核心不替插件做决定,插件也不依赖核心的内部实现。 dsh把这种模式推到了极致。它甚至没有一个“核心”可以依赖——所有东西都是插件,所有插件的地位都平等。这意味着第三方开发者可以构建任何东西:一个新的模型适配器,一个全新的Agent Loop,一个完全不同的UI——所有这些的“接口”,就是Cordis的插件契约。 ### 4.4 开源与插件:同一个逻辑 dsh选择MIT协议开源,与“一切皆插件”的设计是同一个逻辑的两面。开源意味着代码可以被任何人fork、修改、重新分发。插件意味着功能可以被任何人扩展、替换、重新组合。 开源是代码层面的“不锁死”,插件是架构层面的“不锁死”。 DeepSeek Harness说:我不替你做选择,我给你所有的零件,你自己拼。这种“不锁死”的承诺,从开源协议一直延伸到架构设计,再到运行模式——它是一个完整的、逻辑自洽的体系。 ## 五、未来展望 DeepSeek Harness的v0.1只是起点。它的插件生态还在萌芽,核心接口还会迭代,文档还在完善。但它的设计方向已经清晰了。 在这个Agent框架狂飙突进的时代,每家公司都在用自己的方式回答同一个问题:“什么是好的Agent框架?” DeepSeek Harness的答案是:好的框架不应该替你决定任何事。它应该给你一套完整的、可组合的、无特权核心的插件系统,让你自己拼装你想要的任何Agent形态。 这是一种被低估的野心。大多数框架的野心是“成为标准”,而dsh的野心是“成为承载标准的基础设施”。它不想告诉你Agent应该长什么样,它只想让你在任何你想要的样子上,都能跑得起来。 “一切皆插件”不是功能,是承诺。
配图 (可多选)
选择新图片文件或拖拽到此处
标签
更新文章
删除文章