Back to home

ljsysfurryACE

dsh-plugin-story

入选 DeepSeek Harness 官方精选列表的三个插件:记忆/压缩/主动调度 完整技术文章

Stars
0
Language
Created
Aug 15, 2026
Updated
Aug 15, 2026

Introduction

神马?!我的东西被社区认可了!

2026-08-15,我的三个 dsh 插件被 awesome-dsh-plugin(1300+ ⭐ 的 DeepSeek Harness 社区插件精选列表)收录。 维护者 fkysly 在合并时说:"确定性语义提取器替换 LLM 摘要这个思路我很喜欢——压缩这件事本来就不该再花一次模型调用。" 先说明白:这不是 DeepSeek 官方认可(官方不收第三方 PR),但它是 dsh 生态里最大的社区精选榜——1300+ 星、2600+ 插件里挑出来的。 这篇文章讲清楚:这三个插件解决什么问题、怎么做的、以及你如何也写出能被收录的 dsh 插件。


一、背景:DeepSeek Harness 的插件生态正在爆发

DeepSeek Harness(dsh)是 DeepSeek 官方开源的 Agent 框架,开源当天即获 98k 星。它的核心口号是 "Everything is a Plugin"

  • 模型适配器、工具注册、会话日志、UI、Agent 循环本身全是插件
  • 没有特权核心——任何人写个插件就能改变框架行为
  • GitHub 上 dsh-plugin topic 下已经有 2600+ 个插件仓库

生态爆发意味着:现在写插件 = 第一批吃螃蟹的人。但 2600+ 个仓库里,大部分是 UI 美化、皮肤、工具类插件。记忆、压缩、主动调度这三个"Agent 智能"方向,做的人极少——而这正是我的切入点。

二、我的三个插件:官方管"怎么跑循环",我管"怎么当伙伴"

官方 Harness 自带的能力:

  • 上下文压缩:有,但用 LLM 摘要(贵、有损、每次压缩都要再花一次模型调用)
  • 跨会话记忆:完全没有
  • 主动开口:完全没有(官方 schedule 只做定时提醒)

我把自家 Agent 框架 AgentFrame 的三个核心能力做成了 dsh 插件,正好补齐这三块。

插件一:dsh-compaction(压缩后端)——入选 Tools & Capabilities

替换官方默认的 LLM 摘要压缩。核心思路:压缩不该再花一次模型调用

官方做法: 旧对话 → LLM 摘要(一次模型调用,贵,有损)
我的做法: 旧对话 → 确定性语义提取(零调用,无损,可复现)
private _condense(session, start, end): string {
  const keep: string[] = []
  for (const ev of events) {
    const text = this._eventText(ev)
    // 高信息量: 代码/路径/命令/错误/决策 → 保留
    if (/`|\.(ts|py|js|json|md|sh)\b|npm |pnpm |git |error|fix|决定/.test(text)) {
      keep.push(text.slice(0, 400))
    } else if (keep.length < 40 && text.length > 20) {
      keep.push(text.slice(0, 200))
    }
    // 闲聊 → 直接丢弃
  }
  return keep.join('\n')
}

语义层决定"留什么",配合底层 KV 优化实现双轨压缩。

插件二:dsh-memory-director(记忆)——入选 Memory

官方 Harness 只有"摘要压缩",没有任何跨会话记忆的概念。这个插件补上,而且记忆决策本身也是 LLM 做的:

每轮结束 (agent/turn-stopping)
  → LLM 分析本轮 → 决定记住什么/忘记什么(带重要度打分)
  → 去重 → 存入 JSON(跨会话持久化)

每次请求前 (agent/pre-step)
  → 检索相关记忆 → 注入模型上下文
- id: memory-director
  name: '@agentframe/dsh-memory-director'
  config:
    model: deepseek-v4-flash
    dedupThreshold: 0.8
    forgetThreshold: 0.1

关键设计:记什么由模型决定,而不是由规则决定。LLM 每轮给记忆打重要度分(0-1),低于阈值的自动遗忘,高重要度的长期保留——模拟人脑的记忆曲线。

插件三:dsh-aura-scheduler(主动调度)——入选 Workflow & Automation

官方 dsh-schedule 是模型驱动的定时提醒。Aura 是系统驱动的主动调度——Agent 自己判断"现在该不该主动开口":

价值网络: V = α·urgency + β·relevance − δ·interruption
(紧迫度、相关性、打断代价 的加权权衡)

自适应心跳: 空闲越久,越急切(泊松过程)
静默时段: 23:00-8:00 不打扰
反骚扰冷却: 刚主动过就降低再开口的概率
- id: aura-scheduler
  name: '@agentframe/dsh-aura-scheduler'
  config:
    minInterval: 1800
    maxInterval: 7200
    quietHours: [23, 8]
    alpha: 0.4
    beta: 0.4
    delta: 0.2

三、被精选收录的经过(含踩坑记录)

我的第一次 PR 被拒绝了。维护者的反馈非常具体:

"三个仓库的 package.json 都没有 dsh 字段,也没有 cordis.patch.yml;main 指向 lib/index.js 但仓库里只有 src/,没有构建产物。也就是说 dsh plugin add 既拿不到注册信息,也拿不到可执行代码。"

三个必须补齐的要素(这是给所有 dsh 插件作者的避坑指南):

# 1. 根目录 cordis.patch.yml —— 插件注册清单
- insert:
  - id: memory-director
    name: '@agentframe/dsh-memory-director'
// 2. package.json 加 dsh 字段 —— 声明 bundle 入口
"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
# 3. 提交构建产物 lib/ —— main 指向的代码必须真实存在
tsc -b tsconfig.json && ls lib/index.js

补齐后重开 PR,维护者验证 dsh plugin add 装通,合并。他还顺手把我的分类调准了:aura-scheduler 从 Memory 挪到 Workflow & Automation——"它决定的是 agent 何时主动开口,属于调度而不是记忆"。说得对。

四、验证结果(smoke test 全绿)

✓ ctx.compaction / ctx.memory / ctx.aura 全部注册
✓ 压缩: "今天天气不错" → 剔除, "socket / ConnectionError" → 保留
✓ 记忆: 记住"服务器IP/端口", 忘掉"天气闲聊", 去重生效
✓ 主动: 心跳 + 价值网络 + 静默时段 + 冷却全部工作

五、给想写 dsh 插件的人(教程)

  1. 找 seampackages/*/ 里找 Service Definition 抽象类(如 CompactionEngine
  2. 继承 + 实现:抽象方法就是插件契约
  3. 配置static Config = z.object({...})(schemastery 声明)
  4. 接入cordis.patch.yml 一行注册
  5. 发布:GitHub 仓库 + dsh-plugin topic + 根目录 cordis.patch.yml + lib/ 构建产物 + package.json dsh 字段——四件套缺一不可
  6. 曝光:向 awesome-dsh-plugin 提 PR(README.md + README.zh.md 各加一行)

六、为什么这三件套 = "从工具到伙伴"

能力官方 HarnessAgentFrame 三件套
上下文压缩有(LLM 摘要,贵)有(语义提取,零调用)
跨会话记忆没有有(LLM 记/忘 + 重要度)
主动开口没有有(价值网络 + 自适应心跳)

官方框架回答"怎么跑循环",这三件套回答"怎么当伙伴"——记得住你、知道什么时候该说话、说话不浪费钱。

项目地址

安装任一个:

dsh plugin --profile web add github:ljsysfurryACE/dsh-memory-director

如果这篇文章对你有帮助,给插件仓库点个 ⭐ 吧——从 0 到 1 的星标,是开源作者最需要的燃料 🦊


AgentFrame v3 先明 · 脑手壳一体 · 上下文永不丢失