deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
777-Zen/dsh-capability-index
给 DSH agent 的插件库"起飞前检查单"——任务型请求时自动预检插件库并注入 Top-K 适用插件提示,让插件库利用率可预期、不靠运气。Pre-flight plugin-library check for DSH agents — task-type requests trigger a Top-K hint of suitable plugins injected into the runtime context, making plugin usage predictable instead of opportunistic.
PROJECT TOPICS
PROJECT README
dsh-capability-index 是 DeepSeek Harness (dsh) 的元插件:让 agent 对自身插件库的处理,
从"机会主义的直觉判断"变成"规律性的预先审视"。任务量上来时,它在动手前给 agent
做一次插件库预检——任务型请求命中触发规则后,自动注入"可能适用的 Top-K 插件"
提示块,并带上插件作者声明的 use_when / not_for 能力说明;模型最终调不调,
决策权仍在模型。插件只读、只提示:不改写任何其他插件的工具定义,不强制调用,
不替代工具对比类插件。
三行要点:
以下话语是我的一些原始设计想法,尽量保留原样:
- "让 agent 对自身插件库的处理,从'机会主义的直觉判断'变成'规律性的预先审视': 任务量上来时,动手前先系统性过一遍已知插件库,而不是做到哪算哪、凭感觉决定要不要用工具。"
- "现象:agent 明明有可用的插件/工具,却常常闭门造车(自己手搓),或机会主义地漏用, 直到任务中/任务后才发现'其实有个插件能用'。"
- "类比:给 agent 加一道'起飞前检查单'——先看清自己带了什么装备,再起飞。"
- "真正的价值:插件库利用率可预期——有合适插件时就用上,规律、稳定,不靠运气。"
- "规则宁缺毋滥,避免正常交流也被跑一遍(倒反天罡)。"
- "用户希望拿来就能用:插件一开,自己扫完插件库,对话过程中就自己识别、按触发规则来走。"
- "只扫已启用的插件库;没被启用的就不管,那是用户的隐私。"
雏形 / early version。dsh 目前处于 developer preview,正式发布时本插件
的注入通道(systemPrompt.context 快照)、声明约定(capabilityIndex.declarations)
与触发表词表都可能有兼容性变化;升级 dsh 后如提示块消失或异常,先检查
README 与本仓库的发布说明。实验证据与方法见 eval-results/(活样本库 +
评分脚本 + 离线模拟器)。
这部分就是交给agent来进行的,没有人为干预
同 profile、同会话入口、同消息原文,仅切换本插件开关(部署级 disabled: true
补丁,热更新免重启)对比真实行为;真值信 tool/call 日志与 runtime-context
快照,不信模型总结。样本库 10 条(S1–S10,见 eval-results/samples.json),
评分脚本 eval-results/eval-metrics.mjs。
| 指标 | B 组(无提示,14 条) | C 组(有提示,7 条) |
|---|---|---|
| 工具调用率(正例) | 50% | 100% |
| 误触发(漏推/错推) | 0 / 0 | 0 / 0 |
| 上下文增量 | 0 字符/条 | 约 180–200 字符/条(预算 ≤260) |
(差异集中在非显而易见的工具)
执行主体(如实说明):以上实验的执行、记录与统计由模型在会话中自主完成 (探针、模拟器与评分脚本均由模型编写运行),无人为干预、无筛选;真值由场景级 人工标注一次确定。样本规模小(B 14 条 / C 7 条,每场景 2~3 次),结论是方向性的, 不构成统计显著性验证。
结论:对显而易见的内置工具(read/echo 等),有无提示行为一致;对 不显而易见的插件工具(concat_text/format_text 等),提示块把调用率从 0% 提升到 100%(无提示时模型全程心算、完全没发现这些工具),且零误触发 (提示不会造成强制误用——样本 S9 中模型正确拒绝了不适用工具)。
v0 边界(实测):提示面向主会话注入;子代理会话不接收提示块
(依赖 agent/inbox/claimed 消息路径,子会话不触发)。
| 层 | 触发 | 行为 |
|---|---|---|
| 硬层 | 触发表 v0.1 命中(任务型请求) | 注入 Top-K(默认 3)提示块:可能适用的工具 + 能力声明(use_when/not_for) |
| 软层 | 未命中 / 模糊宏大 / 闲聊 | 注入轻量"插件库总览"兜底(当前可用工具清单) |
lib/trigger-table.js,中文起步,词条带 lang 标记):systemPrompt.context() 函数式提供者 → 提示落进 runtime-context 快照,
只在内容变化时替换、不逐轮堆积(快照 commit-on-change 语义)。tools.schemas(agent) —— 当前会话模型可见工具集的精确口径,
隐私边界自动成立(不可见工具不进索引)。# 安装一次(在 DSH checkout 根目录跑;<path> 换成本目录绝对路径)
pnpm dsh plugin --profile <name> add <path>\dsh-capability-index
# 确认进了插件树
pnpm dsh --profile <name> --dump-config | Select-String capability-index
# 重启 web 应用后生效;设置 → Plugins 页可见本插件条目
disabled: true(见 cordis.patch.yml
注释)后重启;会话粒度开关走 dsh 的 preset 机制(本插件挂在哪个组合,
就对哪个组合的会话生效)。插件作者随插件发布能力声明,本插件在命中时把它们集中渲染进自己的提示块
(不改写任何其他插件的工具定义)。声明通道:ctx.provide('capabilityIndex.declarations', …)
——v0 单聚合器约定:每个组合只应有一个插件提供该服务;多来源聚合属后续演进。
// 示例(见样例插件 dsh-tool-demo-cap)
ctx.provide('capabilityIndex.declarations', {
version: 1,
declarations: [
{
tool: 'echo',
keywords: ['回显', '原样返回', 'echo'], // 消息命中 → 排序加分
use_when: '用户要求文本原样返回', // 集中渲染进提示块
not_for: '任何加工、转换、格式化',
min_complexity: 'low', // 低于该任务量级不推
lang: 'zh',
},
],
})
package.json — 包清单 + dsh.bundle.patch 声明cordis.patch.yml — patch 层:insert capability-index 行(含关闭示例)lib/index.js — 插件本体:触发表判定 + 索引排序 + 提示渲染lib/trigger-table.js — 触发表 v0.1 词表数据(lang 标记,实测校准只改这里)公开 GitHub 仓库 + dsh-plugin topic 即可被官方生态发现
(官方立场:社区插件与官方包地位平等,无 marketplace/审批制);
GitHub Discussions / Discord 社区用于反馈与曝光。
三组消融:A 无工具列表 / B 有列表无提示 / C 有列表+提示;真值信 tool/call
日志不信总结;场景级人工标注(每场景标一次"该用哪些、绝不推哪些")。
PTC / Code Mode 呈现适配(待做):
run_code,其余工具经生成的
TypeScript SDK 间接调用;本插件索引读的是呈现无关的注册表视图,因此:run_code 传输工具会混入索引与推荐,应过滤(tools/src/code-mode.ts:20 的
RUN_CODE_NAME);tools.schemas(agent) 中出现 run_code 即 code 模式
(visibility resolver 只为 code 作用域追加它),适配层可用此信号;插件规模(待做):
tools/src/index.ts:1234-1236),
插件变多后需 tools/change 事件驱动缓存;其它:多声明来源聚合(v0 单聚合器约定);Q2 多轮遗忘后的重扫策略 (快照替换已防堆积,重扫阈值待实测)。
lang 标记;英文覆盖后补为纯数据追加,不改判定代码;lib/trigger-table.js,
实测校准只改数据文件;欢迎大家在GitHub Discussions里面交流和反馈以及互动
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: awesome-dsh-plugin。