# Search First [English](./README.md) **先检索、再核实、最后回答 —— 由 DSH 强制执行。** [![Search First 演示视频](./assets/enable-button.png)](https://youtu.be/rGc5OCydHyY) ▶ 演示视频:https://youtu.be/rGc5OCydHyY > 一个 DeepSeek Harness(dsh)Cordis 插件,用于在模型回答前**强制进行多源网络检索**。 > 在 `agent/pre-step` 阶段,当 **Search First** 启用时,它会依次执行: > 查询抽取 → 统一检索引擎(AnySearch / TinyFish / Tavily)→ 抓取 → 整理 → 缓存 + `runs/` 落盘 > → 注入整理好的实时线索以指导核实,然后把控制权交还 agent 循环。最终回答仍由 LLM 完成。 ## 特点 1. 执行查询任务的子模型可自定义。 2. 引导宿主模型规范引用,如下图。 ![自定义 HTML 标签](./assets/sf_tag.png) 3. 建模评价多源搜索结果,有针对性的抓取页面返回给宿主模型。 ## 安装 前置条件:已挂载的 `dsh` web 配置(dsh ≥ 0.1.1-rc.2),Node ≥ 22。 ```bash # 从 GitHub 仓库安装: dsh plugin --profile web add https://github.com/v587d/dsh-search-first.git ``` 卸载:`dsh plugin --profile web remove dsh-search-first`(之后重启)。 ### 从源码构建 ```bash pnpm install pnpm check # vitest + 类型检查(host + client) pnpm build # lib/(host ESM + d.ts)+ lib/client.js(浏览器打包产物) pnpm test ``` ## 快速开始 > [!IMPORTANT] > 运行前请至少导出 **一个** API key([AnySearch](https://anysearch.com/) / [Tinyfish](https://www.tinyfish.ai/) / [Tavily](https://www.tavily.com/))。 > **免费额度就够用**。 1. 安装后重启 `dsh web`。 2. 打开 Settings → **Search first** → **Search APIs** → **Test all connections** (请先按第 3 步配置 key,否则探测会报"缺少 key")。 3. 至少提供一个检索服务 key —— 把它加入 `$DSH_HOME/.credentials.yaml`, 或在环境中 `export TAVILY_API_KEY` / `ANYSEARCH_API_KEY` / `TINYFISH_API_KEY`。 AnySearch 也支持匿名使用(省略 Bearer 头)。 4. 回到会话中,输入框下方的 **Search First** 开关按会话决定是否启用 (右键开关可恢复为跟随全局默认)。 ## 配置(Settings → Search first) | 分区 | 字段 | |---|---| | 常规 | 默认启用、失败策略(`continue` / `block`)、注入模式、整体超时 | | 查询抽取 | 显式 provider/model(留空 = 跟随当前会话模型)、超时、最大 token 数 | | 缓存 | 目录(留空 = `$DSH_HOME/search-first`;根目录改动需重启生效)、检索/抓取 TTL、清除按钮 | | 限制 | 最大检索结果数、最大抓取页数、最大注入字符数 | | 检索 API | 模式(顺序故障转移 / 并行扇出+合并)、三大服务商启用/credential-ref/优先级、单服务商超时、`ctx.web` 回退、本地 HTTP 回退、**Test all connections** | 密钥仅以 **credential ref** 形式保存(例如 `TAVILY_API_KEY`);真实值存放在 `$DSH_HOME/.credentials.yaml` 或环境变量中 —— 绝不写入 settings。 ## 许可证 MIT —— 见 [LICENSE](./LICENSE)。