DeepSeek Harness 技术解读:用 Cordis 插件化 Agent 运行时,从时空可组合性到一切皆插件

发布时间:2026/9/29 3:39:13

DeepSeek Harness 技术解读:用 Cordis 插件化 Agent 运行时,从时空可组合性到一切皆插件 1. 为什么我要拆 DeepSeek Harness 的插件运行时DeepSeek Harness 是 DeepSeek 开源的一个 Agent 运行时底座命令名dshMIT 许可证目前是 v0.1 开发者预览版。它和 Claude Code、Codex 那类开箱即用的成品不一样官方自己都提示不推荐直接上生产。它真正有意思的地方在于设计取向一切皆插件。模型、工具、技能、会话、沙箱、存储、主循环、调度、UI全部被实现成插件可以自由替换和重组。这套插件体系建立在 Cordis 元框架之上Cordis 只干两件事——插件的加载/卸载以及依赖关系管理。如果你正在自建 Agent 运行时或者被传统框架“插上去就拔不下来”的问题折磨过这篇就是写给你的。我会从 Cordis 插件机制切入把“时空可组合性”这个听起来很学术的概念落到可复制的插件注册骨架、settings.json配置片段、启动验证和热加载检查动作上。你跟着做能跑出一个最小可用的插件化运行时骨架。先说清楚 Harness 是什么。Agent 的能力一半在模型一半在包裹模型的 Harness。公式很直白Agent Model Harness。模型负责思考和推理Harness 负责实际执行——工具调用、任务规划、调度、状态管理、权限控制、错误重试、安全护栏、评测、运行时监控。Harness 回答的是 Prompt 和 Context 都回答不了的问题怎么让模型在真实环境里持续稳定地完成任务出错时还能自我修复。2. 时空可组合性到底在解决什么问题传统插件系统的通病是“插上去拔不下来”。卸载一个插件往往要重启整个宿主进程。在 Agent 场景下这更致命未来的自进化 Agent 可能自己生成工具、装进运行时、发现问题再自己替换。如果每次改动都要重启积累的上下文、缓存、状态全崩。DeepSeek Harness 把 effect效应和 coeffect余效应从编译期静态注解下沉成了运行时机制为动态组合建立形式化基础。动态组合有两个正交维度维度要求静态对应物对应概念时间维 temporal组件移除时对共享环境的修改必须完整、安全地反转词法作用域 RAIIeffect可逆运行时变换 左逆空间维 spatial组件能以结构化方式声明、发现、解析依赖模块导入解析coeffect响应式依赖解析时间维落地成可回滚 Effect每一次对 Context 的修改都必须配一个显式的逆函数。加载插件时按顺序叠加成撤销链卸载时按 LIFO后进先出反向执行状态精确恢复。逆操作在执行时根据当时状态动态生成也就是带见证的效应。空间维落地成反应式 Coeffect组件把依赖声明为规格说明Context 每次变化按 activating / deactivating / neutral 三种通知通知组件。依赖不可用不是错误组件保持非活动状态等待依赖满足后再自动进入 ACTIVE。两者通过统一上下文范式合并成单一上下文类型 Γ∞用 coeffect 上的观察等价赋予 effect 独立性——用空间维的可观测等价解锁时间维的独立性。这就是“时空可组合”这个名字的由来。注意这套机制的价值不在学术名词而在于它让“运行时安全地加载、卸载、替换组件”从口号变成了有形式化保证的工程能力。3. 前置准备拿到可用的模型端点在写插件之前得先让运行时能连上模型。DeepSeek Harness 是模型无关的支持 OpenAI / Anthropic 兼容端点、本地模型比如 Ollama以及约 40 家模型提供方不绑定 DeepSeek 自身模型。我这边习惯用一个兼容端点来统一管理模型调用省得每个 provider 都配一遍。你可以到 TaoToken 控制台创建一个 API Key地址是 https://taotoken.net/api-keys 注册入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。拿到 Key 之后接入文档在 https://taotoken.net/doc 里面有各语言和各框架的对接示例照着填就行。这一步别跳过因为后面插件注册骨架里的llm提供方要引用这个端点。Key 建议单独放环境变量不要硬编码进settings.json提交到仓库。4. 可复制的 Cordis 插件注册骨架Cordis 的插件模型很轻一个插件就是一个带apply函数的对象apply接收ctx上下文和可选的config。加载时 Cordis 调用apply卸载时执行你在apply里注册的清理逻辑。关键在于所有对 Context 的修改都要通过ctx提供的 API 完成这样运行时才能自动生成逆函数、叠加撤销链。下面是一个最小插件骨架我把它拆成“声明依赖 注册能力 返回清理”三段// plugins/hello-tool/index.js export const name hello-tool export const inject [llm] // 空间维声明依赖llm 不可用时本插件保持非活动 export function apply(ctx, config) { // 时间维每次修改 Context 都通过 ctx API运行时自动记录逆操作 const disposeTool ctx.tool.register({ name: hello, description: 返回一句问候用于验证插件是否生效, parameters: { type: object, properties: { who: { type: string } } }, async execute({ who }) { return hello, ${who ?? world} }, }) // 注册一个可观测事件方便回放时定位 const disposeHook ctx.on(tool:call, (payload) { ctx.logger.info([hello-tool] tool called, payload.name) }) // 返回清理函数卸载时按 LIFO 反向执行 return () { disposeHook() disposeTool() } }几个容易踩的点。第一inject是空间可组合性的入口写进去的依赖没满足时插件不会报错而是挂起等待依赖就绪后自动激活。第二apply返回的函数就是时间可组合性的落点卸载时 Cordis 会调用它你在这里把注册的东西全部撤销。第三不要在apply外面持有全局可变状态否则逆函数没法精确恢复。如果你想让 Agent 在运行时自己写插件可以用cordis_define/cordis_run这两个工具Agent 能检查、挂载、修改自己的运行时。这是自进化的铺路石但预览版阶段建议先在沙箱里试。5. settings.json 配置片段与启动验证插件写好了得让运行时知道去哪加载。settings.json里主要配三块模型提供方、插件目录、预设模式。{ llm: { provider: openai-compatible, baseURL: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY, model: deepseek-chat }, plugins: { dirs: [./plugins], entries: [hello-tool] }, preset: standard, log: { appendOnly: true, path: ./.dsh/sessions } }apiKeyEnv指向环境变量名启动前先导出export TAOTOKEN_API_KEY你的Key dsh --config ./settings.json --check--check会做一次启动自检输出插件加载顺序、依赖解析结果和 Context 变更链。看到类似下面的输出就说明骨架通了[core] presetstandard [plugin] llm provideropenai-compatible modeldeepseek-chat [plugin] hello-tool statusACTIVE deps[llm] [context] effect chain length3, revertibletrue四种预设模式——标准、PTC程序化工具调用、极简、创造——各自加载不同的插件集。验证阶段用standard就行等骨架稳定了再切PTC试程序化工具调用。6. 热加载与常见错误排查热加载是这套设计最直观的收益。改完插件代码不用重启进程直接触发重载dsh plugin reload hello-tool预期结果是旧实例的清理函数按 LIFO 执行Context 恢复到加载前状态然后新实例重新apply。你可以用dsh plugin list看状态dsh session replay id回放事件流确认“模型可见 ⟺ 已记录”。下面是我实测下来最容易撞的几个坑插件一直处于非活动状态。八成是inject里声明的依赖没就绪。先dsh plugin list看依赖树确认llm提供方是否 ACTIVE。依赖不可用不是错误是设计如此别去改代码强行激活。卸载后状态没恢复干净。检查你是不是在apply里直接改了全局对象而不是走ctxAPI。绕过 Context 的修改运行时生成不了逆函数撤销链就断了。热加载后旧事件还在触发。说明清理函数没把事件监听注销。ctx.on的返回值一定要在清理函数里调用否则监听器会叠加。模型端点连不上。先确认baseURL是https://taotoken.net/api再确认环境变量名和apiKeyEnv一致。接入细节可以对照 https://taotoken.net/doc 里面有完整的错误码说明。回放时轨迹对不上。追加式日志保证模型可见的都已记录如果对不上通常是插件在apply之外异步改了状态。把异步逻辑收进ctx管理的生命周期里。7. 下一步从骨架到可用的运行时骨架跑通之后你可以按需替换组件。想换模型提供方改llm插件的配置就行主循环不用动。想加权限控制写一个拦截tool:call的插件在事件流里做校验。想接本地模型把 provider 换成 Ollama 的兼容端点。长期做编码类 Agent 的话可以考虑 Coding Plan地址是 https://taotoken.net/coding-plan 配合插件化的运行时模型和工具都能按项目切换。想先验证模型行为直接开模型对话 https://taotoken.net/chat 试几轮确认输出符合预期再写进插件。这套东西目前是 v0.1 预览版别急着上生产。但它的设计思路值得每个自建 Agent 运行时的开发者研究一遍把主循环做成插件、把副作用做成可逆、把依赖做成响应式这三件事一旦落地运行时的可维护性会上一个台阶。
延伸阅读

更多相关文章

2026/9/29 3:39:13

Android EditText 只读配置避坑:从 XML 到代码的 3 种实现与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 3:39:13

Playwright携手MCP:AI智能体实现自主化UI回归测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 4:49:15

Vue3+TS+Vite数据大屏自适应方案详解:scale与rem两种方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 4:49:15

DDR4信号完整性仿真避坑指南:HyperLynx ODT与终端电阻配置详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 4:49:15

红外脉冲激光器驱动电路深度解析与实测指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 4:49:15

STM32开发环境搭建:CubeMX与Keil5安装配置全流程避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 4:44:15

Maven编译报错无效的标记 --release 的JDK版本排查指南

第一次运行 JDK17 的新项目,pom 文件检查过、Project Structure 也设成了 17,环境变量看起来都对,结果 Maven 一执行就报无效的标记: --release。这问题我隔三差五在技术群里看到,新人问一遍老手答一遍,本质全部指向同…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑