dsh-web-search-session-follow
DSH web_search provider that follows the conversation's routed model provider — per-provider endpoint/credential/dialect table with built-in official fallback
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 23, 2026
- Updated
- Aug 23, 2026
Introduction
dsh-web-search-session-follow
web_search provider that follows the conversation's routed model — per-provider endpoint, credential, and wire dialect.每次调用读会话真实路由 ——
ctx.web.registerSearchProvider
一个替换 DeepSeek Harness 内置
web_search搜索后端的 provider 插件。 内置实现把端点和凭据写死为 DeepSeek 官方(自配网关的用户必现认证失败);本插件改为按当前会话路由的 model provider 查路由表:用该 provider 自己的端点、凭据引用与协议方言完成搜索,未识别的 provider 默认回退内置官方方案,整条链路在报错中透明说明。English: per-session routed search with a configurable dialect table and a built-in official fallback.
能力
| 能力 | 机制 |
|---|---|
| 会话跟随路由 | 每次 search 实时读 agents.currentInitiator().session.requestHeader().config 的 {provider, model},不缓存、不猜测 |
| 方言路由表 | 路由条目 protocol 二选一:anthropic-web-search(Anthropic Messages + server tool web_search_20250305)|openrouter-online(chat/completions + 服务端 web 插件,解析 url_citation 注释) |
| 官方方案回退 | 未配置或方言不支持的 provider 自动走内置官方路由(同 @deepseek-ai/dsh-web-search-deepseek 默认值);回退失败时错误信息同时说明两跳;fallback: none 可关闭 |
| 凭据分平面 | 解析顺序与内置一致:字面 apiKey → credentials 服务(apiKeyEnv 引用)→ 环境变量;聊天 key 与搜索 key 各管各的 |
| 模型跟随 | 路由未指定 model 时使用会话当前模型(openrouter 方言)或内置默认(anthropic 方言) |
| 调用审计 | 每次搜索向会话 JSONL 追加 web/session-follow-search-request 事件(含 provider/endpoint/fallback 标记,不含密钥) |
Quick Start
前置:DeepSeek Harness(developer preview,dsh web 可用)。
# 本地目录安装(也可推到 GitHub 后 github:owner/repo 安装)
dsh plugin --profile web add /path/to/dsh-web-search-session-follow
在 profile 的 cordis.patch.yml 把搜索选择器切到本插件:
- id: web
config:
searchProvider: session-follow
重启 dsh web 生效。回滚 = 删除上面的覆盖段,恢复内置行为。
Configuration
路由表随插件自带默认值安装,可在插件的 cordis.patch.yml 或安装副本中调整:
config:
fallback: official # official(默认)| none:miss 时回退官方方案还是保持报错
routes:
deepseek-official: # key = 会话里看到的 provider id
baseURL: https://api.deepseek.com/anthropic/v1
apiKeyEnv: DEEPSEEK_API_KEY
model: deepseek-v4-flash # 缺省跟随会话模型(anthropic 方言缺省内置默认)
openrouter:
protocol: openrouter-online # OpenRouter 自己的搜索方言
apiKeyEnv: OPENROUTER_API_KEY
maxResults: 5 # 注入的搜索结果条数
# <其他 provider id>:
# baseURL: https://<支持所选方言的端点>
# apiKeyEnv: <该网关的凭据名>
| 字段 | 适用方言 | 说明 |
|---|---|---|
protocol | 全部 | 缺省 anthropic-web-search;OpenRouter 网关填 openrouter-online |
baseURL | 全部 | anthropic 方言自动追加 /messages;openrouter 方言追加 /chat/completions |
apiKeyEnv / apiKey | 全部 | 凭据引用名 / 字面密钥(二选一,字面优先) |
model | 全部 | 缺省跟随会话模型(anthropic 方言最终兜底 deepseek-v4-flash) |
maxResults | openrouter | 服务端 web 插件注入的结果条数(默认 5) |
maxTokens / maxUses / apiVersion | 全部 | 同内置默认(4096 / 5 / 2023-06-01;openrouter maxTokens 默认 1024) |
FAQ
和内置 provider 的区别?
内置 deepseek-official 只有一个写死的端点 + 一把固定引用的 key;本插件按会话路由切换端点/凭据/方言,
并对未知 provider 回退而非报死。参见上游讨论 deepseek-harness #408、#1078。
任意网关都能接吗?
只有说这两种方言之一的网关可以纯配置接入。网关完全不支持服务端搜索时(如仅 OpenAI chat-completions
的代理),换 key 无法修复——要么让它走回退的官方方案,要么在 routes 里把它指向一个支持搜索的端点。
成本怎么算? 两种方言都是「一次搜索 = 一轮带搜索结果的完整模型调用」:anthropic 方言计费在端点所属 provider, openrouter 方言按你 OpenRouter 账号上的模型计费。
开发
npm test # node --test,20 例:路由决策 / 回退链路 / 凭据解析序 / 双方言响应映射 / 端到端 fetch
Footer
MIT License · 为 DeepSeek Harness 插件生态编写