DeepSeek Harness

按照「先用起来、再理解、后深入」的三阶段路径学习

npx @deepseek-ai/dsh web 或 pnpm dsh web 开始
经历了一系列精心编排的步骤,把一组离散的插件组装成一个可运行的 Agent 实例。

第一步是解析命令行参数,确定要启动的 Profile(默认是 web 或 headless)。
Profile 是存储在 Harness home 中的命名组合,它列出了要堆叠的 Bundle。
第二步是 Cordis Loader 介入,读取 Profile 指定的 Bundle 列表,
解析每个 Bundle 的 cordis.yml 配置行,确定要加载的插件及其配置。

启动流程
const ctx = new Context(); // 创建插件树根
ctx.provide('dshHomePath', dshHomePath); // 注册第一个服务
await ctx.plugin(Loader); // 挂载配置加载插件
await mountRootInclude(ctx, configPath); // 展开配置成插件树
await assertEntriesActivated(ctx, binName);// 审计:谁没激活就报错

组件不仅须声明"我需要什么",还须声明"我会改变什么";
agent loop
agent-loop,理解 claim、step、turn 的调度逻辑

vendor

vendor/
├─ cordis # 核心框架 @deepseek‑ai/cordis
├─ cosmokit # 基础工具库 @deepseek‑ai/cosmokit
├─ schemastery # 配置校验模式库 @deepseek‑ai/schemastery
├─ loader # 插件加载器插件
├─ include # 配置文件包含/合并插件
├─ group # 插件分组管理
├─ hmr # 热模块重载(配置热更新)
├─ timer # 定时任务插件
└─ logger‑console # 控制台日志插件

运行时核心 cordis

vendor/cordis
├── src
│ ├─ context.ts # 上下文 Context,插件通信、服务注入核心
│ ├─ fiber.ts # ✅核心:Fiber(协程),插件生命周期管理器
│ ├─ service.ts # Service 服务定义,单例可注入组件
│ ├─ registry.ts # 插件注册表,插件注册、元信息存储
│ ├─ effect.ts # Effect:副作用自动回收机制
│ ├─ events.ts # 事件系统,on / off / emit
│ ├─ util.ts # 工具函数,异步工具、错误处理
│ └── index.ts # 对外导出入口
├── package.json
└── tsconfig.json

核心源码

fiber.ts
export const enum FiberState { PENDING, LOADING,ACTIVE,FAILED, DISPOSED,UNLOADING,}
readonly ctx: Context disposables

JS-TS

了解ts的异步编程 -异步逻辑:连接数据库、初始化 LLM 客户端、启动后台轮询任务
Promise await State

了解 ts的代理 extend/isolate/intercept
ctx.xxx 动态解析意味着属性不是在编译时固定的,而是在运行时根据已安装/激活的插件解析的
拦截属性的 get 操作来实现“按需加载”和“动态解析
new Proxy(target, handler),带有 get 和 set 陷阱
const self = new Proxy(this, ReflectService.handler)

Service 是 Cordis 的可注入全局单例组件抽象
静态 inject + @Inject() 装饰器

读取类上静态字段、装饰器元数据、解析依赖列表、提取插件配置 schema。给 loader、registry、schemastery 提供反射能力

registry.ts:存储解析出来的插件元数据 registry “应该加载什么

ctx.plugin() 手动加载插件,此时完全不需要 yaml。
根实例直接就是根 Context + 根 Fiber
Context.new():内部直接构造根 Fiber,就是整个框架的根
bin.js(命令行入口)
// 1. 创建根上下文(根fiber)
const ctx = Context.new()
// 2. 手动挂载 loader 插件
await ctx.plugin(loaderPlugin)
// 3. loader 插件读取 ./cordis.yml,解析配置,写入 registry,applyDiff,加载全部业务插件

工程判断力

从"怎么实现"到"要实现什么,什么不该做
场景 : 重复、可验证、有明确成功标准的流程的
如果插件化成为共识,那么社区的力量将集中在开发高质量插件上,而非重复造框架

DSH

Pi 的哲学是“最小核心 + 按需扩展”,适合终端工作流,强调可控、低噪音、高缓存命中

Deepseek harness
一个内核加一套协议的味道 重新定义了封装的边界,把复杂性拆成模块,再把修改权交给你
为了自进化打好基础,进化什么,怎么进化?
Harness primitives(Harness 原语)。二是组合这些原语的能力。
1. Plugin
2. capability seam 能力接缝:Service Definition / Provider / Consumer
3. append-only log Trajectory
4. Profile 和 Bundle 机制, 以声明式方式组合插件
Bundle → Profile → Patch → Overlay 进行分层
apps/ # 可运行应用(web、headless 等)
apps 是面向最终用户的可运行应用入口,如 Web UI 和 headless 模式
packages/ # 核心工作区(50+ 个 @deepseek-ai/dsh-* 包) Capability Seam(能力接缝)
dsh 启动
packages/boot/app-boot/src/index.ts
packages/boot/cmdline/src/index.ts
new Context() 创建插件树的根。Context 既是服务仓库,也是树节点——每个插件挂载后有自己子 context,父卸载时子树跟着卸载
ctx.provide() 注册第一个服务。把值挂到 ctx 上,全局可读
ctx.plugin(Loader) 程序化挂载插件。Loader 负责读 YAML 配置
mountRootInclude() 把 cordis.yml 交给 Loader,声明式展开成整棵插件树
Capability Seam (能力接缝) 挂载和启动是两个分离的动作

一个能力被拆成三个包:契约包(Definition)定义服务本身,实现包(Provider)提供实现,消费方包(Consumer)使用能力。

复杂的运行时管理(如配置文件监听、插件热更新),Cordis 提供了 @cordisjs/plugin-loader 这个官方插件。它维护了一个 EntryTree(入口树)

app-boot 管理“如何启动”,而 cmdline 管理“应用能识别哪些参数”。它们是启动流程中分工明确的上下游关系
「组合优于配置」:通过 Profile 和 Bundle 机制,让用户以声明式方式组合插件,而非编写胶水代码。
:每项能力拆分为服务定义、提供者、消费者三角色,通过 ctx 键解耦,独立演进。
「服务定义」与「服务实现」的分离
component observability(组件可观测性)

从岗位看数据

预训练数据工程师
持续搭建和改进现有的数据生产管线,与数据上下游保持紧密合作
数据采集 pipeline 用独到的经验和品味,去发现问题、定义评测标准、改进训练数据,教大模型更好地写代码。
将审美判断转化为可度量的评测维度与数据规范;具备一定动手能力,能借助工具高效支撑数据生产与质量校验。
定义图文/视频数据集的采集方式、质量标准和筛选方法,多部门协作建设大规模自动化清洗、质量筛选与数据合成管线,从数据侧提高模型表现
从复杂、多源的数据中提炼信号,并将数据清洗、筛选与合成流程系统化、自动化
日常生产流水线,支持每日增量处理、任务调度、数据统计、质量回归、线上问题排查和稳定性保障。
优化大规模数据清洗系统的性能、稳定性和可观测性,完善日志、指标、监控、测试与调试工具

数据 pipeline

功能的实现:逻辑层
性能的优化:并发 分布式 单机提速 --指标(内存和时间)
可观测性和稳定性: 日志- 数据库记录
灵活性和可拓展性: 不使用硬编码的方式,agent的方式呢
skill mcp等方式--pipeline

参考

https://github.com/cordiverse/cordis

posted on 2026-08-20 17:25  辰令  阅读(8)  评论(0)    收藏  举报