🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

插件式智能体内核课 Prism-Shadow/learn-deepseek-harness

DeepSeek Harness
Prism-Shadow72 天前有提交已提供中文文档扫描:含敏感能力

学习 DeepSeek Harness

34/100
综合分
10
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/Prism-Shadow/learn-deepseek-harness.git
按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · tool
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 72 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/26) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装

展开查看检查明细 ↓

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

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

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 08:38:09

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 38 处,展示前 37 条)
  • 读取密钥环境变量
    advanced/L09_subagent/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    advanced/L09_subagent/code.ts:115
    return execSync(args.command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] }).trim().slice(0, 50_000) || "(no output)"
  • 读取密钥环境变量
    advanced/L10_self_modification/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    advanced/L10_self_modification/code.ts:115
    return execSync(args.command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] }).trim().slice(0, 50_000) || "(no output)"
  • 读取密钥环境变量
    basics/L01_agent_loop/code.ts:11
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L01_agent_loop/code.ts:39
    const out = execSync(command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] })
  • 读取密钥环境变量
    basics/L02_everything_is_a_plugin/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L02_everything_is_a_plugin/code.ts:88
    const out = execSync(command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] })
  • 读取密钥环境变量
    basics/L03_session_log/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L03_session_log/code.ts:116
    const out = execSync(command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] })
  • 读取密钥环境变量
    basics/L04_kv_cache/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L04_kv_cache/code.ts:121
    const out = execSync(command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] })
  • 读取密钥环境变量
    basics/L05_tool_pipeline/code.ts:11
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L05_tool_pipeline/code.ts:167
    const out = execSync(command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] })
  • 读取本地文件
    basics/L05_tool_pipeline/code.ts:193
    return readFileSync(args.path, "utf8").slice(0, 50_000)
  • 读取密钥环境变量
    basics/L06_compaction/code.ts:10
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L06_compaction/code.ts:125
    return execSync(args.command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] }).trim().slice(0, 50_000) || "(no output)"
  • 读取密钥环境变量
    basics/L07_memory/code.ts:11
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L07_memory/code.ts:111
    return execSync(args.command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] }).trim().slice(0, 50_000) || "(no output)"
  • 读取本地文件
    basics/L07_memory/code.ts:126
    const memories: Memory[] = existsSync(MEMORY_FILE) ? JSON.parse(readFileSync(MEMORY_FILE, "utf8")) : []
  • 读取本地文件
    basics/L07_memory/code.ts:126
    const memories: Memory[] = existsSync(MEMORY_FILE) ? JSON.parse(readFileSync(MEMORY_FILE, "utf8")) : []
  • 写入本地文件
    basics/L07_memory/code.ts:138
    writeFileSync(MEMORY_FILE, JSON.stringify(memories, null, 2))
  • 读取密钥环境变量
    basics/L08_assemble/code.ts:11
    apiKey: process.env.DEEPSEEK_API_KEY,
  • 执行外部命令来自配置/变量
    basics/L08_assemble/code.ts:151
    return execSync(args.command, { encoding: "utf8", timeout: 120_000, stdio: ["ignore", "pipe", "pipe"] }).trim().slice(0, 50_000) || "(no output)"
  • 读取本地文件
    basics/L08_assemble/code.ts:165
    return readFileSync(args.path, "utf8").slice(0, 50_000)
  • 读取本地文件
    basics/L08_assemble/code.ts:196
    const memories: Memory[] = existsSync(MEMORY_FILE) ? JSON.parse(readFileSync(MEMORY_FILE, "utf8")) : []
  • 读取本地文件
    basics/L08_assemble/code.ts:196
    const memories: Memory[] = existsSync(MEMORY_FILE) ? JSON.parse(readFileSync(MEMORY_FILE, "utf8")) : []
  • 写入本地文件
    basics/L08_assemble/code.ts:203
    writeFileSync(MEMORY_FILE, JSON.stringify(memories, null, 2))
  • 发起网络请求
    docs/app.js:48
    const res = await fetch("./lessons.json")
  • 写入剪贴板
    docs/app.js:179
    navigator.clipboard?.writeText(cmd)
  • 读取本地文件
    docs/build.mjs:21
    if (!existsSync(secPath)) return []
  • 读取本地文件
    docs/build.mjs:22
    return readdirSync(secPath)
  • 读取本地文件
    docs/build.mjs:23
    .filter((name) => /^L\d+_/.test(name) && statSync(join(secPath, name)).isDirectory())
  • 读取本地文件
    docs/build.mjs:26
    const readme = readFileSync(join(repoRoot, dir, "README.md"), "utf8")
  • 读取本地文件
    docs/build.mjs:27
    const code = readFileSync(join(repoRoot, dir, "code.ts"), "utf8")
  • 读取本地文件
    docs/build.mjs:30
    const readme_en = existsSync(enPath) ? readFileSync(enPath, "utf8") : ""
  • 写入本地文件
    docs/build.mjs:36
    writeFileSync(join(docsDir, "lessons.json"), JSON.stringify(lessons, null, 0))
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
学习 DeepSeek Harness 从最裸的一个循环开始,一课一课地把它长成一个真正的 agent harness。每一课是一个能独立运行的 TypeScript 小包,npm install && npm run dev 就能跟真实 DeepSeek 模型对话。 📖 有网页版:不想 clone 也能读——点此在线阅读,目录、README、代码、逐课 Diff 都在一个页面里。 和 Learn Claude Code 的区别 本课的形式借鉴自 Learn Claude Code(一课一个可运行小包 + README),但内核完全不同。Claude Code 与 DeepSeek Harness 的设计逻辑是两条不同的路子——这门课只讲后者,并紧扣它区别于 Claude Code 的三个根本设计: - 🧩 一切皆插件:极瘦的核心循环 + 一切能力皆为可插拔插件。 - 📜 Session Log 是永久的历史与记忆:对话是一条 append-only 事件日志,是唯一真相源。 - ⚡ 对 KV Cache 的极度敏感:所有上下文操作都以「是否破坏前缀缓存」为第一约束。 课程主体紧扣这三点逐层展开(下文详述)。
展开完整文档(README 剩余 1 节)
学习 DeepSeek Harness

从最裸的一个循环开始,一课一课地把它长成一个真正的 agent harness。每一课是一个能独立运行的 TypeScript 小包,npm install && npm run dev 就能跟真实 DeepSeek 模型对话。

📖 有网页版:不想 clone 也能读——点此在线阅读,目录、README、代码、逐课 Diff 都在一个页面里。

和 Learn Claude Code 的区别

本课的形式借鉴自 Learn Claude Code(一课一个可运行小包 + README),但内核完全不同。Claude Code 与 DeepSeek Harness 的设计逻辑是两条不同的路子——这门课只讲后者,并紧扣它区别于 Claude Code 的三个根本设计:

- 🧩 一切皆插件:极瘦的核心循环 + 一切能力皆为可插拔插件。
- 📜 Session Log 是永久的历史与记忆:对话是一条 append-only 事件日志,是唯一真相源。
- ⚡ 对 KV Cache 的极度敏感:所有上下文操作都以「是否破坏前缀缓存」为第一约束。

课程主体紧扣这三点逐层展开(下文详述)。

至于各类 agent 通用的能力——子 agent、更多工具、task 系统、plan 系统等——它们并非 DeepSeek Harness 的独特之处,因此放在靠后的章节简要提及;而且一律以 DeepSeek Harness 最偏爱的形式接入:作为插件插进来(见 L9 起)。

为什么执着于「一切皆插件」? 因为它为 RSI(Recursive Self-Improvement,递归自我进化) 铺路:当一切能力都是可热插拔的插件,agent 就能在运行过程中对自己的 harness 代码做热更新、热插拔——先给自己造能力,再把有用的沉淀下来。L10 展示了这一机制的雏形;如何在 DeepSeek Harness 之上真正实现 RSI / Self-Evolution,将在后续章节展开。

三根支柱(这门课的骨架)

DeepSeek Harness 之所以是它,就靠这三件事。整门课都在反复强化它们:

🧩 P1 · 一切皆插件

核心循环极瘦,只负责驱动流程并在固定扩展点触发事件。工具、上下文、压缩、记忆——所有真正的能力都是外挂的插件,通过一个共享上下文 ctx 与一套事件系统接入。加功能 = 加插件,主干不改。

📜 P2 · Session Log 是永远的唯一真相

一次对话不是内存里的一个消息数组,而是一条只增不改(append-only)的事件日志。模型看到的对话是从日志派生出来的。这让 harness 能确定性重放、可崩溃恢复、可压缩、可 fork。

⚡ P3 · 对 KV Cache 的敏感

服务端前缀缓存的铁律是「token 序列逐字节一致才命中」。所以往对话里加东西一律 append-only(只往末尾加,绝不动中间);一旦改了中间,从那个位置往后的缓存全废。这门课会让你亲手实测缓存命中,并理解每个设计为什么这么做。

每课 README 都有一个固定小节:「三根支柱在本课如何体现」。

课程地图

课程分两大轨道:基础篇 Basics(L1–L8) 打地基,进阶篇 Advanced(L9 起) 在地基上叠更强的能力(会陆续扩充)。仓库里也按 basics/、advanced/ 两个目录组织。

基础篇 Basics(basics/)

| # | 课程 | 主打支柱 | 你会学到 |
| L1 | 最裸的循环 | (铺垫) | agent 的本质:user→LLM→tool→loop;并故意留下三根支柱要解决的三处局限 |
| L2 | 一切皆插件 | P1 | 迷你框架:ctx + 事件系统 + waterfall;把 bash 变成插件 |
| L3 | Session Log 是唯一真相 | P2 | 用事件日志替换消息数组;从日志派生消息;surface |
| L4 | 对 KV Cache 敏感 | P3 | append-only 上下文注入插件;实测 cacheReadTokens |
| L5 | 工具管线 + 权限 | P1+P2 | 六段执行管线;权限做成插件 |
| L6 | 上下文压缩 | P1+P2+P3 | 皇冠课:压缩=插件+replace事件+缓存悬崖 |
| L7 | 跨 session 记忆 | P2+P3 | memory 插件:召回 + 写入 |
| L8 | 组装成小 harness | 三支柱合体 | 把所有插件拼成一个完整体 |

进阶篇 Advanced(advanced/)

| # | 课程 | 主打支柱 | 你会学到 |
| L9 | 子 agent | P1 | 派生子 agent 当工具 |
| L10 | 自我修改 | P1 极致 | 运行时挂插件(一切皆插件的终极形态) |

建议按顺序读。每课的 README.md 里有「问题 → 核心代码 → 工作原理 → 三根支柱体现 → 试一下 → 接下来埋了什么坑」。

怎么跑

每一课都是独立的包(在 basics/ 或 advanced/ 下):

cd basics/L01_agent_loop
cp .env.example .env # 填入你的 DEEPSEEK_API_KEY
npm install
npm run dev
需要一个 DeepSeek API key(platform.deepseek.com)。DeepSeek 的 API 与 OpenAI 兼容,所以我们用 openai 这个 SDK 指向 DeepSeek 的地址。

给 TypeScript 小白的一句话(关于类型)

这门课追求极简。类型策略是「够用就好」:

- 外围该补的都补——消息、工具、函数签名都用真实类型,让你在编辑器里有自动补全、写错立刻标红。
- 迷你框架内部故意从简——ctx.services、事件 payload 这些「运行期才定型」的地方保持 any,绝不为了类型引入泛型这类复杂语法(真实 harness 用泛型换来了完整类型安全,那是它的取舍;我们把注意力留给「harness 怎么运作」)。
- 偶尔你会看到一句手动类型标注(比如 (args: { command: string }))——那是「穿过 any 框架」处唯一要付的小税,代码注释里都会点明。

一句话:看得懂优先于类型严谨。凡是能省的类型体操我都省了,并配了中文注释。

如果你确实不熟 TypeScript,完全可以借助 AI 帮你逐句解析语法与含义,配合读完这约一百行的 agent 代码——这比直接去读 DeepSeek Harness 的真实源码容易得多。
预览分享卡片长什么样 ↓Prism-Shadow/learn-deepseek-harness
分享 · DeepSeek Harness Hub
Prism-Shadow/learn-deepseek-harness

学习 DeepSeek Harness

回到顶部