← 返回技术实践

AIAgent

DeepSeek Harness 架构解析

约 10 分钟阅读

DeepSeek Harness 架构解析

DeepSeek Harness Agent Framework 不只是把模型接到几个函数上:如果你需要替换模型适配器、工具注册、会话存储或 Agent Loop,可以优先评估它;如果只是做简单问答或单函数调用,就不必承担完整框架的复杂度。

症状: 你的 Agent 能调用工具,却难以替换执行循环、恢复中断任务,也无法还原模型为什么做出某次操作。
最快解法: 先按“模块边界、调用链、状态恢复、权限隔离”四项检查,再决定采用 DeepSeek Harness,还是自研一个更轻的执行层。

这篇文章适合三类读者:需要理解 DeepSeek Harness 内部职责边界的 Agent 工程师;准备开发或审查第三方插件的框架维护者;正在决定自研执行循环,还是采用现成 Harness 的技术负责人。

最后更新于 2026 年 8 月 17 日,结构核实自官方代码仓库、架构文档、工具执行说明与开发文档。

先按模块边界判断扩展能力

评估一个 Agent Framework,第一步不是看宣传语,而是看核心执行路径是否真的能被替换。DeepSeek Harness 官方架构将模型适配、系统提示词、工具注册、会话日志、Agent 接口和 Agent Loop 分开组织,并由 Cordis 提供插件化组合机制。官方架构文档

可以把它理解成下面这条职责链:

模型适配器
    ↓
提示词与工具 Schema 组装
    ↓
Agent Loop
    ↓
工具选择与参数生成
    ↓
权限、沙箱、超时与执行
    ↓
结果写入 Session Log
    ↓
下一轮推理或任务结束
    ↓
Web UI / Headless / 外部控制器

这里最关键的不是“每个功能都有插件”,而是插件是否位于模型可见和任务可控的路径上。例如,单纯增加一个命令入口,只能说明外围功能可扩展;如果 ctx.llmctx.toolsctx.sessionsctx.agentLoop 都有清晰的替换边界,才说明框架可以支持真正的组件重组。

官方文档列出的核心包职责包括:core/session 负责追加式会话事件日志,core/system-prompt 负责提示词和工具 Schema,core/tools 负责工具注册及受保护执行,core/agent 提供 Agent 接口,core/agent-loop 提供默认驱动,llm/llm 则提供模型适配边界。核心子系统说明

这对采购和架构决策的含义很直接:

  • ✅ 需要替换模型、沙箱、工具策略或会话存储时,插件边界能减少核心代码改动。
  • ✅ 需要审查插件时,可以沿着服务、事件和配置层分别检查,而不是只看一个巨大入口。
  • ⚠️ 插件化不等于风险消失。插件仍然可能拥有文件、网络、进程或密钥访问能力。
  • ⚠️ 官方仓库明确说明当前仍处于开发者预览阶段,并存在兼容性破坏变更。官方项目说明

再看插件系统如何装载、覆盖与卸载

DeepSeek Harness 的插件系统不是简单扫描一个目录后加载脚本,而是通过 Profile、Bundle 和 Patch 组成运行时插件树。Profile 决定要叠加哪些 Bundle,Bundle 提供配置行和需要挂载的代码,随后再由 Profile 级、用户目录级以及命令行 Patch 进行覆盖。

官方架构文档给出的装载顺序是:

  1. 载入 Profile 中声明的 Bundle。
  2. 应用 Profile 自己的 cordis.patch.yml
  3. 应用 Harness home 下的用户级 Patch。
  4. 应用命令行 --patch 覆盖层。
  5. 根据最终配置建立运行时插件树。

这种机制的价值在于:你不一定要复制和修改核心包,可以通过 Patch 指向某个配置行,替换模型提供者、工具实现、沙箱后端或界面组合。官方还提供 dsh --profile web --dump-config,用于查看机器实际启动的配置树。配置与组合机制

但有一个容易被忽略的边界:Patch 替换的是目标配置行的完整配置,而不是自动进行深度合并。也就是说,你替换一个插件配置时,必须重新确认 API 凭据、权限策略、依赖服务和默认参数是否仍然存在。采购第三方插件时,这一点应当列入验收项,否则“成功覆盖”可能同时意味着“静默丢失原配置”。

插件生命周期也不能只看装载成功。Cordis 的设计强调注册动作可回滚,插件卸载时应当撤销其服务注册、事件监听和相关效果。对于生产任务,你至少要验证三件事:

  • 插件卸载后,工具是否仍出现在 Schema 中;
  • 正在运行的 Agent 是否能够停止并释放资源;
  • 失败的初始化是否会留下半成品会话、临时文件或后台进程。

沿着工具调用链检查可靠性

工具调用不是“模型发出函数名,函数返回结果”这么简单。DeepSeek Harness 的官方工具管线至少包含工具调用事件、预执行钩子、权限与沙箱检查、执行包装、工具本体、后执行钩子、结果规范化以及最终结果写入等阶段。工具执行管线

典型流程可以拆成 6 个 检查点:

  1. 工具选择: 模型输出工具调用块,框架先记录 tool/call,再展示待执行状态。
  2. 参数验证: 工具 Schema 负责约束字段类型、必填项和允许值,避免模型把自然语言直接当作可信参数。
  3. 权限判断: tools/pre-execute、审批服务和单调安全守卫共同判断是否允许执行。
  4. 执行控制: tools/execute 可承载超时、重试、指标采集等外围逻辑。
  5. 结果处理: tools/post-execute 可以接受、阻止、替换结果或追加上下文。
  6. 结果回传: 最终结果被写入 tool/result,随后进入会话日志,成为下一轮模型请求的输入。

工具调用结束后,框架会先记录工具结果,再把活动批次中的附加上下文按顺序注入;下一次模型请求从 Session Log 推导历史,而不是依赖某个内存变量拼接对话。官方工具管线说明

因此,生产插件至少要满足以下条件:

  • ✅ 参数 Schema 可验证,拒绝未知字段和危险路径。
  • ✅ 结果采用结构化错误,例如区分权限拒绝、超时、依赖不可用和业务失败。
  • ✅ 写入类操作具备幂等键或重复执行保护。
  • ✅ 外部 API、Shell、文件操作都有明确超时。
  • ✅ 工具结果中不直接回传密钥、完整环境变量或无关大段文件内容。
  • ⚠️ 重试只能用于可安全重复的操作,不能把支付、发布、删除等动作默认设置为自动重试。

用执行里程碑区分两类工作流

从官方代码结构看,扩展插件依赖 agent 接口,而不是直接依赖 agent-loop 包;默认循环只是 Agent 合约的一种具体实现。这意味着你可以在架构层面替换循环,而不是把所有插件绑定到默认驱动。核心 Agent 与 Loop 说明

但“可以替换”不等于“替换成本很低”。替代实现仍然要处理会话创建、消息进入、模型请求、工具调用、取消、空闲状态、错误恢复和持久化事件,否则插件虽然能被加载,任务却无法稳定运行。

建议把 AI Agent 工作流拆成以下里程碑:

里程碑 开放式 Agent Loop 确定性工作流
任务规划 模型根据上下文决定下一步 由 DAG、状态机或代码固定
工具选择 模型动态选择工具 节点明确指定工具
阶段切换 通过事件、状态和模型判断 通过条件分支或状态转移
人工确认 可在工具执行前拦截 通常是预先定义的审批节点
失败恢复 依赖日志、重试和上下文重建 依赖节点重放与补偿逻辑
适合场景 探索、编码、资料处理 发布、结算、合规审批、批处理

两者不能混为一谈。开放式 Agent Loop 适合目标不完全确定、需要模型自行拆解任务的场景;确定性工作流适合每个阶段都有明确输入输出和审计要求的生产流程。你可以让 DeepSeek Harness 承载两类模式,但不要因为框架支持 Agent Loop,就把所有业务都交给模型自由决定。

按故障恢复要求设计会话与状态

DeepSeek Harness 把 Session Log 作为模型可见上下文的来源。官方说明中,模型请求所能看到的内容应当能够从日志重建,原始的助手分块事件也会保留,以支持回放、界面展示、转录和持久化。会话与核心架构文档

这解决了传统 Agent 常见的三个问题:

  • 上下文丢失: 进程重启后,可以从持久化会话恢复,而不是只依赖内存。
  • 结果不可解释: 可以回看模型请求、工具输入、工具结果和状态变化。
  • 任务无法续跑: Agent 可以区分普通跟进、即时转向和下一轮注入上下文。

不过,长期任务仍要增加自己的恢复策略。你需要明确哪些状态是“已提交”、哪些状态是“执行中”、哪些状态可以重试。比如,工具已经成功写入文件但进程在写入 tool/result 前退出,就不能简单把整个工具调用重新执行,而应先做结果核验,再决定补写事件还是进入人工处理。

建议在插件验收阶段记录以下字段:

  • 任务 ID、会话 ID、插件版本和配置摘要;
  • 模型请求的工具 Schema 版本;
  • 工具调用参数的脱敏快照;
  • 执行开始、结束、超时或取消原因;
  • 产物路径、校验值和提交状态;
  • 恢复时采用重放、跳过、重试还是人工确认。

用可观测性和权限隔离控制插件风险

截至 2026 年 8 月 17 日,更准确的结论是:DeepSeek Harness 可以作为生产级 Agent 的架构基础进行验证,但不应因为官方提供了插件、日志和工具管线,就直接视为已经完成生产稳定性认证。官方项目仍标注为开发者预览,兼容性破坏变更仍可能发生。官方 README

生产适配度主要取决于你能否补齐四层控制:

  1. 可观测性: 日志必须还原模型请求、工具参数、结果、插件版本和任务产物。
  2. 权限隔离: 文件系统、Shell、网络、密钥和子进程不能共享过宽的默认权限。
  3. 版本治理: 插件要锁定版本、记录依赖,并在升级前执行回归任务。
  4. 人工干预: 高风险工具需要一次性审批、取消和恢复入口,不能只依赖模型自我约束。

官方工具管线已经提供预执行、审批、沙箱、超时和后执行等扩展位置,这为权限策略提供了插入点;但具体的隔离强度仍取决于你注册的 Provider、沙箱后端和运行环境。特别是第三方插件,必须单独检查是否读取环境变量、写入工作区之外的路径、访问外网或启动后台进程。

如果你正在验证插件,建议按这个顺序执行:

  1. 先用 dump-config 固化实际启动的 Profile 和 Patch。
  2. 为插件建立最小权限账户、独立工作目录和临时密钥。
  3. 测试正常调用、参数错误、权限拒绝、超时和进程中断。
  4. 检查所有模型可见内容是否都能从 Session Log 还原。
  5. 重启后恢复同一任务,确认不会重复提交副作用操作。
  6. 卸载插件并重新启动,检查工具、事件监听和临时资源是否清理。
  7. 将插件版本、配置差异和故障样本写入发布记录。

如果只是无状态问答、单函数调用或简单网页接口,上述治理成本通常没有必要。此时直接使用模型 API 加一个轻量函数路由,会比引入完整插件树更容易部署和排障。

最后按项目特征做采用决策

你可以用下面的条件快速判断:

  • 满足“需要替换模型或工具后端”与“任务需要恢复或审计”中的至少一项,优先做 DeepSeek Harness 原型。
  • 同时满足“插件来自多个团队”与“工具涉及文件、网络或进程权限”,必须先完成隔离和日志验收,再扩大使用范围。
  • 如果流程有固定审批节点、严格合规要求和明确补偿动作,应把确定性工作流放在外层,让 Harness 负责局部推理,而不是让开放式循环控制全部业务。
  • 如果项目只有聊天、检索或单次函数调用,选择轻量实现,避免为尚未出现的扩展需求提前支付维护成本。

与直接自研一个 Agent Loop 相比,DeepSeek Harness 的优势是模块边界、事件扩展和会话重建路径更完整;缺点是开发者预览阶段的兼容性风险、插件依赖治理成本,以及团队需要理解 Cordis 组合模型。你需要把“可替换”换算成真实收益:每年是否真的会替换模型、工具执行后端、会话存储或界面层。

如果你的当前方案是本地临时环境、共享开发机或没有隔离策略的通用云主机,常见缺点是权限边界不清、日志持久化不足、远程调试条件不稳定,长期还会把插件验证和正式任务混在同一运行环境里。对于需要短期搭建独立验证节点、测试文件与网络权限、或让团队远程复现 Agent 故障的场景,租用 Kvmkit 的 Mac 环境通常比临时改造现有机器更容易控制;但长期稳定重负载、必须接入专用物理设备或需要完全自主管理硬件时,自购设备仍然更合适。你可以先通过 Kvmkit 帮助中心 核对远程运行条件,再查看 Mac mini 租用方案,把日志、权限隔离和远程调试要求逐项对照后再决定。

把 CI/CD 放在 M4 Mac mini 上,才算真正省心

本文所有流程——Xcode、Fastlane、CocoaPods、SPM——在 macOS 上都是原生一等公民。Mac mini M4 统一内存架构让签名、归档、上传不再互相拖累,~4W standby power suits 24/7 build nodes.

查看 Kvmkit 套餐方案

需要技术支持或选型建议?

在使用 Mac 实例或 CI/CD 流水线过程中遇到问题,可先查看帮助中心;下单与计价见定价页。