外观
Cordis 与时空可组合性:DeepSeek Harness 的内核范式
摘要:DeepSeek Harness(dsh)的内核 Cordis 源自一个看似无关的项目——QQ 聊天机器人框架 Koishi。它解决了 Agent 时代插件系统最核心的难题:干净卸载。本文拆解"时空可组合性"编程范式(时间维度:可逆副作用;空间维度:依赖反应式管理)、dsh 如何在这颗内核上构建 Agent 运行时,以及为什么"可逆"是自进化 Agent 的安全带。
一、Cordis 从哪来
- 作者:Shigma(史一凡),北大人;2026 年加入 DeepSeek,名字出现在 DeepSeek V3 技术报告
- 前身:Koishi(2020 年发布的 QQ 聊天机器人框架,社区 4000+ 插件)
- 独立:2022 年 5 月,Shigma 把 Koishi 的插件管理内核抽出为独立元框架 Cordis(拉丁语"心")
- 关键节点:2026-08-13,Cordis 以 vendor 身份进入 dsh 主仓库(附带 18 条本地补丁,改名 @deepseek-ai/cordis);同日北大+DeepSeek 联合论文《A Programming Paradigm for Spatiotemporal Composability》挂上预印本(high)
- 体格:仓库 7,634 行 TypeScript,核心逻辑约 2000 行,运行时零依赖,550 个 commit 中 90%+ 出自 Shigma 一人(stated)
二、插件系统的难题:能装,不能卸
传统插件系统"装"的能力几十年前就有,难的是**"卸"**:
- 插件注册的全局事件监听、定时器、文件句柄、全局状态,卸载时往往留一地"钉子"(内存泄漏、僵尸监听器)
- 大多数系统的解法是重启整个进程——长驻进程"跑得越久越慢,重启包治百病"(stated)
- Agent 时代被放大:agent loop 是带状态的多步流程机,中途拔掉组件会让已承诺的多步计划崩溃;且 agent 要能改自己的运行时(装新工具、换技能、挂适配器),改动不能干净回滚 = 进程状态污染
主流框架都只解了半道题(stated):
- NestJS:有依赖注入,无副作用追踪
- pytest Pluggy:有 hook 系统,插件间不能声明依赖
- Effect-TS:有完整 effect 模型,但不是框架
- Vue/React:plugin 只覆盖 UI 层
Cordis 的赌注:干净卸载应该是框架在结构上保证的属性,而不是每个插件作者自觉重写的纪律(stated)。
三、时空可组合性(Spatiotemporal Composability)
论文把"动态组合"切成两个正交维度:
时间维度:Temporal Composability —— 副作用可逆
- 组件卸载时,其所有副作用(监听、句柄、内存、命令)必须完整逆转,系统恢复到"插件从没来过"的状态
- 核心 API:
ctx.effect()—— 副作用操作必须返回"清理函数"(disposer),运行时按注册逆序执行
ts
ctx.effect(() => {
const timer = setInterval(poll, 1000)
return () => clearInterval(timer) // 反悔方式交出去
})- 类比:C++ RAII / Rust Drop trait,但从语言层提升到运行时层 —— 两个互不相识的团队写的第三方插件,卸载时照样干净(stated)
空间维度:Spatial Composability —— 依赖反应式管理
- 插件不"接收注入",而是"声明需求",运行时保证:B 依赖 A → B 在 A 就绪后启动;A 要停 → B 先于 A 卸载;A 起不来 → B 不启动(high)
- 变化时刻:A 被替换/重连/升级时,只有依赖真正变化的插件被重启,无关插件纹风不动
- 实现:每个插件跑在一个 fiber 里,运行时维护"纪元"(epoch = 所有依赖的指纹);依赖变 → 指纹变 → 调度重载(先清副作用列表,再逆序 dispose,inertia 锁防并发)
路径无关性(两者合一的产物)
系统的最终状态只取决于"开了哪些插件",与安装顺序/装卸次数无关(stated)。
- 绝大多数系统状态与操作顺序耦合(先装 A 再装 B ≠ 先装 B 再装 A)
- Cordis 把痕迹装进可逆 effect,装卸互为逆操作,历史被抹平 —— 这是热重载在数学上安全的全部前提,也是"agent 改自己运行时不留烂摊子"的全部前提
四、支撑机制(暴露在共享 ctx 上)
- ctx.effect():可逆副作用
- 生命周期事件:ready / dispose / fork(挂载/销毁/分叉)
- 服务系统:插件贡献以服务注册进上下文,靠 Proxy + Symbol 命名空间做依赖路由(同名服务在不同隔离域对应不同实例)
- Context 嵌套:extend(继承)/ isolate(隔离)/ intercept(拦截)
- 配置解析:声明式配置模式,原型链解析,子级覆盖父级
另外 Cordis 事件系统有五种派发模式:emit(广播)/ parallel(并发)/ serial(串行)/ bail(短路)/ waterfall(瀑布流,监听器链式传递 next(),不调用则断链)(stated)。
五、dsh 在这颗内核上造的发动机
dsh = 49 个包的 TypeScript monorepo,约 1980 个 TS 文件,npx @deepseek-ai/dsh web 起浏览器 Agent 运行时(默认端口 3080)。
"产品的每一个部分都是插件——包括模型适配器、工具注册表、会话日志,以及 agent 循环本身——所以每一部分都能从配置里替换掉。这里没有一个特权内核可供修补。" —— dsh 架构文档(stated)
三根承重柱
1. 瀑布式工具流水线
- 工具执行走 cordis waterfall:
tools/pre-execute → tools/execute → tools/post-execute → tools/result,监听器不调用 next() 则断链 - 统一所有横切关注点:超时挂在 execute、沙箱提醒挂 post-execute、审批在 pre-execute、外部 hook 桥挂 pre/post —— 安全逻辑共享同一条主干道,加关卡 = 挂监听器
- 模型调用、workflow、subagent、PTC 子调用全部过同一个 ToolRuntime.execute 闸门,无法绕过审批和沙箱
2. 会话日志是唯一事实源
- 每次运行记 append-only 日志(系统提示、推理、工具调用、结果、子代理调度、上下文注入全量留痕)
- Turn/Step 都是日志事件,模型消息序列由
deriveMessages()纯函数从日志投影 - 派发请求前用 JSON.stringify 比对"即将发出的请求"与"日志重建结果",不一致直接 fail —— 机械上强制"模型看到的"和"日志记录的"一致(排障/评测/合规底座)
3. Capability Seam(能力接缝)
- 可替换能力拆成三角色:服务定义(接口)/ 服务提供方(实现)/ 消费方(模型面向的工具)
- "执行世界"抽象:文件系统和子进程共享同一 provider,指向远端沙箱(E2B 概念验证)时 Bash/终端/LSP 整体迁移、消费方零改动
- subagent 一个接口下并存六七个 provider(含调 Claude Agent SDK、Codex app-server 的第三方实现)
- 模型无关写进 DNA:Anthropic/OpenAI/Bedrock/Vertex/Azure + OpenAI 兼容端点,近 40 个模型可换
- 沙箱是 OS 级真隔离:Windows CreateRestrictedToken / Linux Landlock+bwrap / macOS Seatbelt;社区已有三款沙箱插件
预设体系(每会话级)
四个预设:standard(常规任务全集)/ code(PTC 模式:工具列表塌缩成 run_code,模型直接写 TypeScript 编排多步调用,五轮往返压成一轮)/ minimal(最小环境,官方跑分用)/ creator(创造模式:agent 运行时内省、试装插件、创作新 preset)。预设是每会话级别的——同一进程可同时跑组装方式完全不同的 agent。连 Web 界面本身也是默认挂载的插件,可卸可换(stated)。
六、为什么偏偏是 Cordis
1. 自进化的前提是可逆
- 会自我演化的 agent 需要三件事:动态加载(装得上)、安全卸载(改坏能回滚)、状态无关性(终态一致)——市面框架大多只做到第一条(high)
- dsh 有
packages/self-modification/("agent 检查并挂载它自己的插件");当前动态包是仅内存态、重启即失,但方向明确:一个能改自己运行时的 agent,只有在改动可逆时才值得拥有(stated)
2. 不重造已验证四年的轮子
- Koishi 四年、4000+ 插件、几百个互不相识作者的开放生态验证
- 工程适配:零依赖、核心 2000 行、TS 原生,vendor 进 monorepo 一个下午的活
- 插件系统深坑(并发卸载、循环依赖、部分失败、热重载缓存一致性)已被四年生产环境趟完
3. 可换,比选对更重要
- 模型/agent 能力远未收敛,今天正确的 loop/工具协议/记忆方案明天可能被论文推翻
- "押注哪个答案"是伪问题,"保留更换答案的能力"才是真问题
- 开源成插件市场 = 把探索问题外包给全世界(dsh-plugin 话题已近 300 个)
- 迁移路径铺好:hooks-claude-code 直接吃现有 hooks.json;DeepSeek 官方提供 OpenAI 与 Anthropic 两种格式 BASE URL
七、现状与展望
- 当前 GitHub 暂不接收外部 PR,文档即仓库,UX 未打磨(stated)
- 类比:Claude Code 走苹果路线(闭源垂直整合),dsh 走安卓路线(图纸全公开)—— 若跑通,dsh 可能成为"Agent 时代的 npm / Kubernetes"
模型决定一辆车能跑多快,harness 决定这辆车能不能边跑边换轮子。(stated)
关联词条
- Harness(智能体执行框架)(concept · 锚点)
- Harness 专题总览(overview)
- DeepSeek Harness 与 Pi 的架构拆解对比(comparison)
- DeepSeek Harness vs Codex Harness:发动机之争(comparison)
- Agent 核心技术概念与范式演变(concept)