前言¶
在 DeepSeek Harness(DSH)里做需要联网的智能体,通常会挂一个网页搜索 provider。官方 dsh-web-search-deepseek 走 api.deepseek.com/anthropic/v1,能搜,但 result.content 实测摘要覆盖率为 0%,也没有查询缓存和 Go 端点失败后的回退。社区里曾有人 fork 出 dsh-web-search-opencode-go,把请求改到 OpenCode Go;在 DSH 0.1.7-rc.2 上,它还会因静态 import 了不存在的 installSettingsSection 而加载即崩,或靠 profile 里指向旧版 dsh 的 symlink 侥幸跑起来。
dsh-web-search-ocgo 由 jitang-open 维护,从零重写并保持对外行为兼容:走 OpenCode Go(自动注入 x-opencode-session),补上失败回退官方端点、查询缓存、result.content 总结与自带设置页。下面介绍它是什么、能做什么,以及如何挂进 web profile。
这是什么¶
- 仓库:jitang-open/dsh-web-search-ocgo
- 分类:联网工具(SkillHub 目录:dsh-web-search-ocgo)
- 定位:DSH 网页搜索 provider,
provider id为opencode-go,loader entry id为web-search-ocgo - 依赖面:只 import
@deepseek-ai/schemastery一个外部包;其余通过ctx.get()取服务,避免插件目录解析不到@deepseek-ai/dsh-*的版本错配
与官方 dsh-web-search-deepseek 相比,端点改为 https://opencode.ai/zen/go/v1,模型只认 deepseek-v4-flash / deepseek-v4.1-flash;并自动注入 x-opencode-session 与 x-opencode-client。
核心功能¶
端点与会话头¶
默认 baseURL 为 https://opencode.ai/zen/go/v1(不含 /messages),默认模型 deepseek-v4.1-flash。凭据通过配置项 apiKeyEnv(默认 OPENCODE_API_KEY)从 DSH 凭据中心读取。
result.content 与结果质量¶
官方 provider 不填 result.content;本插件从响应 text 块取模型总结写入 result.content,默认截断 2000 字符(answerMaxChars,设为 0 则不返回)。单条摘要默认截断 300 字符(snippetMaxChars)。page_age 会规范成 ISO-8601;解析失败则丢弃,不塞假日期。
查询缓存¶
默认开启:TTL 5 分钟(cacheTtlMs: 300000),LRU 最多 50 条(cacheMaxEntries: 50)。命中缓存时 token 消耗为 0。README 中 32 次请求实测表明,下调 maxUses 对总 prompt 和结果条数几乎无影响(每次实际只发起 1 次 web_search),省额度应靠缓存而非改 maxUses(默认仍为 5)。
失败回退与重试¶
Go 端点重试耗尽后,可回退到官方端点(fallbackEnabled 默认 true,回退模型默认 deepseek-flash,会消耗 DeepSeek 余额)。对 429、5xx 和网络错误有退避重试(retryCount 默认 1)。
设置页¶
Web profile:「设置 → 插件」→ dsh-web-search-ocgo,改动在失焦或回车时写入 profile 的 cordis.patch.yml。dsh-tui 下会注册 TUI 设置区块(约 19 个字段、7 个分组)。响应统计走 logger.info,不写自定义会话事件,避免历史日志因未知事件类型无法加载。
诊断与开发脚本¶
仓库提供 node scripts/check.mjs、node --test test/*.test.js、node bin/doctor.mjs(可 --probe 真发搜索)、以及 bench 脚本;当前 package 版本为 0.2.0,许可证 MIT,Node 要求 ^22.19.0 || >=24.0.0。
安装与启用¶
README 未提供 dsh plugin add 一类命令,需在本地 clone 或下载源码后,用符号链接挂进 profile。以下步骤摘自仓库说明(路径请按本机实际目录替换 README 中的示例)。
1. 准备 schemastery 链接¶
让插件目录能解析唯一外部依赖:
ln -sfn ~/.dsh/profiles/web/node_modules/@deepseek-ai/schemastery \
node_modules/@deepseek-ai/schemastery
在插件源码根目录执行;node_modules/@deepseek-ai 不存在时需先创建。
2. 挂进 web profile¶
ln -sfn "$PWD" ~/.dsh/profiles/web/node_modules/dsh-web-search-ocgo
3. 登记 bundle¶
编辑 ~/.dsh/profiles/web/package.json:在 dsh.profile.bundles 中加入 dsh-web-search-ocgo,并在 dependencies 中加入指向本机绝对路径的 link,例如:
"dsh-web-search-ocgo": "link:/你的路径/dsh-web-search-ocgo"
4. 清理旧 fork(若曾用过)¶
从 ~/.dsh/profiles/web/cordis.patch.yml 删除旧的 web-search-opencode-go 段,并从 dsh.profile.bundles 移除 dsh-web-search-opencode-go。
5. 重启并验证¶
dsh web
日志中应出现类似:
[web-search-ocgo] 已装载 provider id=opencode-go endpoint=https://opencode.ai/zen/go/v1 model=deepseek-v4.1-flash fallback=deepseek-flash
进一步检查:
dsh --profile web --dump-config | grep -A5 "id: web$" # searchProvider 应为 opencode-go
node scripts/check.mjs
node --test test/*.test.js
node bin/doctor.mjs
典型配置¶
图形界面¶
Web:「设置 → 插件」→ dsh-web-search-ocgo。TUI:在 /settings 中找 web-search-ocgo 分组(端点与模型、凭据、OpenCode Go 会话头、失败回退、查询缓存、结果质量、可靠性)。
YAML 片段¶
可在 ~/.dsh/profiles/web/cordis.patch.yml 中覆盖默认值,例如:
- id: web-search-ocgo
name: dsh-web-search-ocgo
config:
apiKeyEnv: OPENCODE_API_KEY
baseURL: https://opencode.ai/zen/go/v1
model: deepseek-v4.1-flash
fallbackEnabled: true
cacheTtlMs: 300000
answerMaxChars: 2000
常用字段:sessionId(空则每次启动随机)、fallbackModel(默认 deepseek-flash)、cacheEnabled / cacheMaxEntries、retryCount。
适用场景与注意¶
适合谁:已在用或计划用 OpenCode Go 做网页搜索、需要 result.content 摘要、希望 Go 挂了还能回退官方端点、并想用缓存降重复查询成本的用户。
临时回滚:在「设置 → 插件」把 web 的 searchProvider 改回 deepseek-official 并重启,无需卸载本插件。
安全与权限:插件在 DSH 进程权限下运行,会读凭据、发外网请求。安装前应阅读 GitHub 源码 与 MIT 许可证,确认 apiKeyEnv 与端点配置符合你的合规要求。SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。
完全卸载:从 package.json 的 bundles 与 dependencies 移除、删除 cordis.patch.yml 中 web-search-ocgo 段并将 searchProvider 改回官方、删除 node_modules 下的 symlink,再重启 dsh web。
结尾¶
dsh-web-search-ocgo 把 DSH 网页搜索接到 OpenCode Go,并在官方能力之外补上摘要、缓存、回退与双端设置页,同时把依赖压到 schemastery,减轻 dsh 升级时的加载风险。目录页:SkillHub;源码与完整说明:GitHub README。