概览
dsh-custom-search
README / ZH
插件文档
目录摘要
dsh.pub 核对固定版本的组合包契约、运行时事实与分发语义;完整 README 请查看源仓库。
在 GitHub 阅读完整 READMELIMITATIONS
已知限制
- **「测试连接」的探测层可能缺席**。本地检查(字段合法性、凭证状态,不联网)永远可用; 「真实请求」要经 Remote 调用到宿主,靠 Typert 的源模式发现,宿主没挂载那套包时只剩本地检查。 两条路都**不影响搜索本身**——最坏情况是少一个按钮。面板会说明是哪一种缺席(见上文 「测一下配好没有」),清单层面的原因见「依赖:为什么 `peerDependencies` 是必需的」。 - 探针走的是 Typert 的**源模式兜底**(手写 descriptor + 原型标记),因为本包没有构建步骤、 产不出 `dsh-typert-generator` 的那两份文件。这是 DSH 的内部机制,大版本升级后可能要跟着调; 调不动时的表现是面板点名说明,而不是搜索坏掉。 - 明细里的端点是**去掉查询串**的 `scheme://host/path`:Google CSE 把 `key=` 拼在 URL 上, 时限报错也会把整条 URL 写进消息,所以报告生成前统一脱敏(`engines.js` 的 `publicEndpoint` / `redactUrls`,`smoke.mjs` 有对应断言)。 - **换引擎不会迁移密钥**。`apiKeyEnv` 留空时引用名跟着主引擎走(`brave` → `BRAVE_API_KEY`), 所以从 Brave 换到 Tavily 要在表单里另填一个 key;旧的那个仍留在凭证服务里。 - `engine` 在 schema 里是 `union`,表单上是文本框 + 一排胶囊。填了 union 之外的值**保存会失败**, 表单会保留草稿让你改(`SettingsForm` 的既定行为)。 - 仍可以把密钥明文写进 profile patch 的 `apiKey` 字段(只在本机),但推荐走表单/凭证服务。 - `ctx.web` 的搜索请求只有 `query` 和 `maxResults` 两个参数,所以**没有**时间范围、域名过滤、 站点限定这类 provider 级控制(这是服务层的既定边界,不是本插件的取舍)。 - `search()` 是每次查询一次请求。`fallback` 里多个引擎串行尝试,最坏情况耗时是各超时之和。 - `available()` 必须是同步、离线的——服务层在选中 `custom-search` 时就是这么调它的——所以它只能 回答「有没有声明一个凭证**引用**」,回答不了「引用背后有没有值」:那个答案只有异步的凭证服务有。 **声明了引用就算可用**,判的是「有没有解析器」而不是「解析器当前有没有值」;官方 DeepSeek 搜索提供方用的也是这个判据(它检查自己的 resolver 闭包是否存在)。代价是缺 key 会推迟到 **搜索时**才报错——报的是引擎名与引用名,比在请求发出前被拦下更有用。`process.env` 里有值 不是必要条件,因为 key 的正常落点在凭证服务;未知引擎与不合理的 `timeoutMs` 仍判为不可用, SearXNG 实例挂了同样体现为搜索报错。
