DeepSeek Harness Hub
← 返回列表

flysheep-ai/learn_deepseek_harness

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
需源码安装

一门关于 Agent Harness 内部机制的可运行课程。

暂不能直接安装(需源码编译或环境不满足):仓库缺少 package.json,无法用 dsh 插件安装命令安装。 · 最近上游提交 2026/8/14 · 已提供中文文档

一个可运行、循序渐进的 deepseek harness 内部原理课程——18 章,从 60 行的 agent 循环到完整的可插拔 harness(事件日志、工具流水线、权限、子代理、插件系统、能力接缝、目标循环)。每一章都可离线运行,无需 API key。中文课程;英文主文档。

综合分
34.8
GitHub 分
34.8
用户评分
★ Stars
6
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add flysheep-ai/learn_deepseek_harness
仓库缺少 package.json,无法用 dsh 插件安装命令安装,改用 GitHub 源安装
数据截至 2026/9/17(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包learn_deepseek_harness(未发布到 npm,仅可源码安装)
Node 引擎未声明 engines.node
dsh CLI 依赖未声明 dsh 版本约束
入口文件缺少入口声明

仓库缺少 package.json,无法用 dsh 插件安装命令安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 05:20:11

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

learn-agent-harness

一门关于 Agent Harness 内部机制的可运行课程。
从一个 60 行的脚本开始,一章一章地观察,一个现代
编码 agent 的 harness 是如何被真实问题逼出来的。

CI Python 3.11+ 23 chapters 22 tests passing offline demo deps License

English · 中文版 README.cn.md

一门可运行、循序渐进的agent harness 内部机制课程——讲述一个现代
编码 agent(Claude Code / DeepSeek Harness 风格)在底层是如何工作的,从
一个 60 行的 agent 循环到一个完整的可插拔 harness。23 章,每章一个概念,
每一章都是一个完整、自包含、可离线运行的 Python 文件
(python code.py --demo,无需 API key)。

agent-harness · llm-agents · tool-calling · ai-coding-agent · plugin-system · educational

这是什么

User ──▶ Agent Loop ──▶ LLM ──▶ Tool Calls ──▶ Filesystem / Shell / Sandbox
│  ▲
▼  │
Session (event log)

像 LangChain、LangGraph、Claude Code 和 DeepSeek Harness 这样的框架有
数万行代码——难以阅读,更难以修改。本课程讲授它们底层真正发生了什么:
agent 循环 / 工具注册表 / 会话事件日志 / 权限 / 上下文压缩 / 子 agent / 插件系统
/ 能力接缝 / 目标循环——以及那些让 deepseek-harness
真正新颖的部分:可回退的副作用、响应式依赖、惯性
生命周期,以及自我扩展。

适合:懂 Python、调用过 LLM API、用过工具
调用,但想理解 harness 实际如何工作的开发者。学完本
课程后,DeepSeek Harness 的 architecture.md 的每一页都能对应到这里的
某一章。

deepseek-harness 有何不同

一个通用的 harness 教程会讲授本课程开篇的那个 60 行循环——
while True: call the model, run its tools, append messages。它很少
讲授的是为什么一个工业级 harness 看起来完全不像那个循环。其中大部分
距离并非“更多功能”,而是一些被命名的结构性
决策——这才是本课程真正的主题:

| 独特决策 | 为什么它并不显而易见 | 章节 | 此处的最小形式 |
|---|---|---|---|
| 事件日志才是真相 | messages 看起来像是记忆,但它只是一个投影;实际存储的是一个仅追加的日志 | s05 | Session + derive_messages() |
| 轮次 / 步骤 / 回合 | “一次输入” ≠ “一次模型调用”;没有这些词,你就无法对预算、重放或被拒绝的轮次进行推理 | s06 → s17 | run_turn() + 内部步骤循环 |
| 权限是监听器,不是 if | 工具执行是一条瀑布流(pre → execute → post);策略挂在其上,可在不触碰循环的情况下添加/移除 | s04 → s13 | 一个 6 行的 EventBus.waterfall |
| 能力接缝 | 定义 / 提供者 / 消费者——替换一个提供者,整个产品随之改变,无需分叉提供者 | s15 | FileSystem / Shell 协议 + Local / Memory / DryRun |
| 一切皆插件 | 不存在需要打补丁的特权核心;一个功能就是一个单元,整体挂载、整体卸载 | s14 | PluginContext + 逆序清理器 |
| 可逆效果 | 注册会返回其自身的逆操作,因此复合清理是自动的——这正是插件能够热卸载的原因 | s14 → s19 | on()/use()/register() 返回一个清理器 |
| 响应式辅助效果 | 依赖会在每一次上下文变化时重新求值;卸载会级联触发停止提供 → 守卫 → 撤回 | s20 | DependencyRuntime._reevaluate |
| 惯性生命周期 | 状态转换会运行至完成,然后才响应新的目标;失败先恢复,后记录 | s21 | 目标视图 vs 已提交视图 |
| 作用域 | 子代理的价值在于上下文隔离 + 受限的动作空间,而不是“多一次 LLM 调用” | s09 | registry.restricted() |
| 目标即持久状态 | 目标在终端之后依然存在,并由模型来评判,而不是由 while not done 来评判 | s17 → s22 | 事件日志之上的 GoalStore |
| 自我扩展 | 模型在会话中途检查并修改其自身的运行时 | s23 | harness_inspect/mount/unmount |

这些想法并非民间传说——它们扎根于一篇正式论文,Cordis
(可逆效果 + 响应式辅助效果)。本课程用一个 30 行的 EventBus + PluginContext 重新表达了
该论文的核心;
论文阅读笔记将
每一个 Cordis 概念映射回某一章,包括哪些内容被有意
没有移植。阅读路径:docs/。

学习路径

第 1 部分——代理如何运行

| | | |
|---|---|---|
| s01 agent_loop | 一个对话循环——以及为什么它还不是代理 |
| s02 tool_use | 第一个工具;内部步骤循环由此诞生 |
| s03 tool_registry | if/elif → Tool / Schema / Registry / Executor |
| s04 permission | pre → execute → post 流水线;权限位于 pre 中 |
| s05 session_event_log | 消息不再是真相;事件日志接管一切 |
| s06 turn_and_step | 一次用户输入 ≠ 一次模型调用 |
第 2 部分 — 智能体如何管理上下文、状态和任务

| | | |
|---|---|---|
| s07 prompt_assembly | 系统提示词是运行时产物,而非常量 |
| s08 skill_loading | 渐进式披露:目录始终存在,正文按需加载 |
| s09 subagent | 上下文隔离 + 受限动作空间 |
| s10 context_compaction | 压缩遮蔽的是投影,而非日志 |
| s11 task_system | 任务是 harness 状态,而非模型记忆 |
| s12 background_jobs | 同步工具调用 vs 异步作业 |

第 3 部分 — 为什么工业级 harness 需要 Event / Plugin / Capability

| | | |
|---|---|---|
| s13 event_bus | 权限/日志/指标从循环中移出,交给监听器 |
| s14 plugin_system | Context / Registry / Plugin — 一切皆插件 |
| s15 capability_seams | Definition / Provider / Consumer — 换掉提供者,就换掉整个世界 |
| s16 agent_team | spawn / send / receive / status;策略属于模型 |
| s17 goal_loop | 目标是持久状态,而非 while not done |
| s18 full_harness | 集成,通过自主修复失败的测试来验证 |

第 4 部分 — deepseek-harness 的独特机制(进阶)

| | | |
|---|---|---|
| s19 revertible_effects | 注册返回其逆操作:track / accumulator / LIFO / independence |
| s20 reactive_coeffects | 依赖在每次上下文变化时重新求值;三阶段级联 |
| s21 inertial_lifecycle | 目标视图 vs 已提交视图驱动一切;惯性;失败时优先恢复 |
| s22 session_lifecycle | 会话/结束种子边界、分叉、目标激活(armed/disarmed)、派生缓存 |
| s23 self_extending | inspect / mount / unmount — 模型修改自己的运行时 |

每一章结尾都会指出下一章存在是为了修复的痛点。
对比相邻两章的差异,你就能得到“这一章添加了什么”的确切答案。

快速开始

pip install -r requirements.txt        # one dependency: httpx

python s01_agent_loop/code.py --demo                 # any chapter runs offline
python s18_full_harness/code.py --demo --debug       # trace the inside of a turn
python s23_self_extending/code.py --demo             # the model modifies its own runtime

real model (OpenAI-compatible API or Anthropic)
cp .env.example .env          # LLM_API_KEY / LLM_BASE_URL / LLM_MODEL
python s18_full_harness/code.py
Help me find out why the tests are failing and fix them.

python3 -m unittest discover tests                    # 22 deterministic tests
学习无需密钥——每一章的 --demo 都在离线的脚本化模型(ScriptedProvider)上运行。环境变量见 .env.example。

两条铁律

1. 模型可见即被记录(在 s05 中形式化)。
任何进入模型请求的内容都必须能从事件日志中重建。messages 是一种投影,绝不是真相。
2. 模型决策。框架赋能(在 s02 中形式化,在 s18 中检验)。
框架构建一个由工具、上下文、状态和权限组成的可操作世界——它从不脚本化模型的思考。测试套件会扫描核心代码中形如 if task_type == "research" 的分支:零命中。

仓库布局

learn-agent-harness/
├── README.md / README.cn.md   ← 双语入口
├── DESIGN.md                  ← 研究发现 + 课程设计决策
├── harness_llm.py             ← 唯一共享文件:模型访问层
│                                (不包含任何框架逻辑)
├── tests/                     ← 每章的冒烟测试 + 确定性机制测试
├── docs/                      ← Cordis 论文笔记 + 阅读索引
├── s01_agent_loop/ … s23_self_extending/
│     每一章:code.py + README.md(中文)+ README.en.md

为什么每章一个 code.py,而不是共享的 src/?
因为 from src.agent import Agent 会隐藏学习过程——你永远看不到 Agent 是如何成长的。本项目倾向于重复:每一章都展示完整、最小、可运行的实现。唯一的例外是 harness_llm.py——HTTP 传输不属于框架机制。

与参考项目的关系

- shareAI-lab/learn-claude-code
——借鉴了其教学方法:每章一个概念,README 从痛点出发,代码内标注“新增 / 未变”,愿意重复。
- deepseek-ai/deepseek-harness
——吸收了其工业级设计:会话事件日志、Turn/Step 术语、工具流水线、能力接缝、一切皆插件、自我扩展。不是它的 Cordis 框架——相同的理念在这里用 30 行的 EventBus + PluginContext 表达。参见概念 → 章节映射 上文。

本项目不是这两个仓库的 fork、翻译或重写。设计决策见:DESIGN.md。

延伸阅读

- docs/README.md ——索引和建议阅读路径。
- Cordis 论文笔记(中文)
——对 deepseek-harness 的 Cordis 框架所依据的 88 页形式化论文的阅读指南,将每个概念映射到某一章(最好在 s14–s23 之后阅读)。

贡献

欢迎贡献——代码或文字的修正、新练习、更好的解释、翻译或测试覆盖。

- 阅读 CONTRIBUTING.md 了解工作流程和内部规则。
- 所有参与者都应遵守行为准则。
- 在开始大型更改之前,请先创建一个 issue,以便我们能够就方向达成一致。

安全

请私下报告漏洞,而不是创建公开的 issue。
请参阅 SECURITY.md。

支持

如有问题、想法和讨论,请参阅 SUPPORT.md。

许可证

MIT © 2026 flysheep-ai

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群