dsh-jev-screen: Screening Local File Candidates into a Shortlist Using Jev

前言

在 DeepSeek Harness(DSH)里,Agent 常要在本地知识库或项目目录里找「和当前任务最相关的几个文件」。字面检索(glob、grep)召回面大,但容易把「正文里顺带出现关键词、主旨却无关」的文档一起捞上来;若让 Agent 逐个通读,上下文和延迟都会失控。

下面介绍社区插件 dsh-jev-screen(维护者 chaoguang668):代码遍历目录并读取每个文件的前部摘要,Jev(OpenJev / Codiv 判别式模型)逐文件打分排序,把几十个候选压成短名单,供 Agent 再读全文做终审。插件归类为「模型推理」,MIT 许可,当前版本 0.3.0,零 npm 依赖——index.js 不 import 任何包。

这是什么

一句话:不是找全,是排序。 glob / grep 已经是召回超集;Jev 不提供「多找文件」的优势,而是在已有候选上做语义降噪。README 里的一次实测(154 个资料文件,query 为「量化交易 选股 回测 策略」)中,规则层读文件头部命中 34 个,Jev 层高度相关 4 个、部分相关 3 个,其余 147 个判无关,且没有出现「Jev 高相关但规则层漏掉」的额外召回——价值在于把 34 收敛到 4。文件名几乎不含查询词、但正文相关的文件,反而可能被 Jev 排到前面(README 举例:Agent记忆/02_金融数据源与实证方法论红线.md 被排到第 1,conf 0.964)。

DSH 生态里是「一切皆插件」;插件目录在 SkillHub,与 DeepSeek / 幻方无官方从属关系。

核心功能

工具 jev_screen

Agent 通过 DSH 调用:

jev_screen(root = "/path/to/knowledge-base", query = "用量化方法做股票投资决策", top = 20)
  • root:待检索目录的绝对路径。
  • query:自然语言检索目标,会编入分档标准;README 建议写清主题,而不是罗列关键词。
  • top:返回条数,默认 20,上限 200。

返回按相关度排序的候选(路径、档位、归一化分、连续分、档位来源、置信度等)以及统计(扫描数、失败数、failedPaths、并列比例 tieRatio、tokens、耗时)。

代码侧保证的三件事

  1. 凭据类文件不外发:.env、credentials*、密钥扩展名,以及 .git、node_modules 等目录在遍历阶段即排除,不读也不送到 Jev 端点。
  2. 逐文件一次请求:N 个文件对应 N 次请求,靠并发摊薄;不能把多文件塞进一份 state 做一次 Choice。
  3. 档位取 argmax(probabilities):不能对连续 score 做 round 当档位;score 作为连续分用于同级并列时的次级排序。

同质门控与失败名单

当同档并列占比 tieRatio 超过 tieWarnRatio(默认 0.3)时,输出会提示候选集同质、Jev 降不了噪——这只用于否决「别指望 Jev 筛掉噪音」,不能证明排序正确。请求失败的文件会在正文中逐个列出并计入 stats.failedPaths。

安装与启用

插件以当前 DSH 宿主进程权限运行;安装前请自行查看 GitHub 仓库 源码与 LICENSE。Node 要求 >=20。

方式一:本地路径登记为 bundle(README 推荐)

将仓库放到本地后,在 profile 的 package.json 里声明 file 依赖并加入 bundles(路径换成实际位置):

{
  "dependencies": {
    "dsh-jev-screen": "file:/absolute/path/to/dsh-jev-screen"
  },
  "dsh": {
    "profile": {
      "bundles": ["dsh-jev-screen"]
    }
  }
}

方式二:tarball

在插件目录执行 npm pack 得到例如 dsh-jev-screen-0.3.0.tgz,再在 profile 里用 file:/absolute/path/to/dsh-jev-screen-0.3.0.tgz 引用。

方式三:插件管理器

若宿主提供 plugin_manager(DSH 桌面版自带):

plugin_manager install_bundle  /absolute/path/to/dsh-jev-screen

生效与验证

cordis.patch.yml 会向组合树插入 loader entry(id: jev-screen,name: dsh-jev-screen)。登记后执行 profile 的依赖解析(如 pnpm install 或插件管理器安装命令),宿主重启后 entry 生效。改插件代码后应 node --check 并重启宿主验证;README 说明存在版本闸,勿用强制热重载验证。

验证是否装好,可让模型调用:

jev_screen(root = "/path/to/some/dir", query = "这类文件是干什么的", top = 5)

凭据

工具按 apiKeyEnv(默认 TYPESAFE_API_KEY)从 DSH 凭据服务解析密钥,优先级为:进程环境 > $DSH_HOME/.credentials.yaml(可写)> 宿主 cwd 的 .env > $DSH_HOME/.env。插件不含内置密钥。示例:

export TYPESAFE_API_KEY=<your-key>

或通过凭据服务写入(值来自你自己的安全位置):

await ctx.credentials.set('TYPESAFE_API_KEY', process.env.MY_JEV_KEY)

换 key 无需重启宿主。

配置

默认值可在 profile 的 cordis.patch.yml 里覆盖,常用项包括:

键 默认 说明
apiKeyEnv TYPESAFE_API_KEY 凭据环境变量名
baseUrl https://api.codiv.ai OpenJev 兼容端点
model openjev-latest 也可用 openjev-0.1
maxFiles 400 送审文件数上限
concurrency 6 并发请求数
headBytes 4096 每文件读取字节数
headChars 500 送审摘要字符数
tieWarnRatio 0.3 同质警告阈值

完整表格见仓库 README。

本地 Laya(可选)

若使用 Jev 兼容的本地模型 convaiinnovations/laya-multilingual,须显式设置 model: multilingual,且 levelOrder 必须为 ascending(默认 descending 面向 Codiv Jev)。示例:

- id: jev-screen
  name: dsh-jev-screen
  config:
    baseUrl: http://127.0.0.1:11500
    model: multilingual
    levelOrder: ascending

README 注明:Laya 适合快速粗筛,不宜替代终审;文件摘要仍会发往 baseUrl,敏感目录勿指向不可信端点。

适用场景与注意

适合:先用 grep 等拿到候选或在中等规模目录里做语义重排,再让 Agent 只读 top 短名单。

不适合:指望 Jev「找全」、交互式实时检索(README 记录单次调用 p50 约 2.0s,靠并发摊薄)、或把返回清单当最终结论而不读全文。

其他限制(来自 README):摘要会出境到配置的 baseUrl;Codiv 公共服务稳定性取决于社区维护者环境;按文档估算成本约为输入 $0.042 / 百万 tokens。插件定位是降噪排序器,找全仍交给 grep。

结尾

dsh-jev-screen 把目录遍历与 Jev 逐文件打分接到 DSH 工具链里:在已有召回之上做精度排序,并用排除规则、失败名单和同质提示划清输出边界。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye