ChatGPTClaudeGrok / X / CursorGemini

DeepSeek Harness 搜索页填的 key 为什么对话也在用:同一凭据引用名排查

故障排查发布于 2026-10-30作者: DeepSeek Plugin 插件市场
DeepSeek HarnessDSHweb_search凭据DEEPSEEK_API_KEY配置
在 DeepSeek Harness 的搜索设置页填了 key,之后对话消耗的也是它。拆开看:搜索插件不存 key,只写一个凭据引用名,而这三处默认值恰好都叫 DEEPSEEK_API_KEY,改个名字即可分离。

「我在搜索页填了 key,结果后面聊天的消耗也走这个 key」——这不是错觉,也不是搜索把对话的 token 算进去了,而是两处默认用了同一个凭据引用名。 搜索插件根本不存 key,它只往凭据域写一个名字;而模型路由默认读的也是这个名字(#11174)。把「名字」和「值」分开想,这段关系就清楚了。

DeepSeek Harness 第一层:「在搜索页填 key」写进去的是什么

它写的不是搜索插件的配置项,而是一条凭据条目的引用名。

  1. 提交动作调用 credentials.set(this.ref(), value),把值写进凭据域。
  2. this.ref() 就是引用名,默认值 DEEPSEEK_API_KEY。
  3. 搜索插件的 schema 里,默认引用名也是同一个字符串。
  4. 所以「填 key」实际是「给这个名字赋值」。
  5. 搜索插件侧只保存「我用哪个名字」,不保存密钥本体。

DSH插件 第二层:三个默认值凑成了同一个名字

搜索页、搜索插件、API-key 模型路由的默认引用名是同一个,于是默认状态下它们天然共享。

  1. 搜索设置页:默认引用名 DEEPSEEK_API_KEY。
  2. 搜索插件 schema:同一个默认值。
  3. DeepSeek API-key 模型连接:默认解析的也是这个名。
  4. 三个默认值指向同一条凭据,谁写谁生效。
  5. 因此你在搜索页填入的 key,会被模型路由读到。

DeepSeek Harness 第三层:为什么表现为「对话也在用这个 key」

因为走 API-key 路由时,模型请求带的正是这条凭据;不是搜索转发了它,而是它们本来就是同一条。

  1. 会话请求模型前,适配器按引用名取密钥。
  2. 取到的就是你刚填的那条。
  3. 于是对话的调用自然用这个 key。
  4. 这与搜索结果无关,也与搜索的计费无关。
  5. 判断依据是「provider 是 API-key 路由」而不是「开了搜索」。

DeepSeek插件 第四层:这个解释什么时候不成立

如果会话走账号登录路由,模型根本不读这个引用名,那现象就要另找原因。

  1. 打开该会话的 request/header,看 provider 是哪条。
  2. 如果是账号登录(deepseek-account),模型不走 API-key。
  3. 这时「共用 key」不适用,得去查账号额度或其它配置。
  4. 同理,只有在使用 API-key 路由时,改引用名才有意义。
  5. 先确认这一条,能省掉一半无效排查。

DeepSeek Harness 默认值在哪里撞车

三处默认值并排看,撞车这件事就一目了然。

位置默认引用名作用
搜索设置页DEEPSEEK_API_KEY写入凭据域的值
搜索插件 schemaDEEPSEEK_API_KEY读取同一个名字
API-key 模型连接DEEPSEEK_API_KEY模型请求也读它

三行都指向同一个名字,所以「填一次、两边生效」是默认行为,不是意外。

DSH插件 三个常见误解

把这三条拆掉,基本就不会再误判。

  1. 「搜索把对话的 token 算进去了」——不是。搜索只引用密钥,不参与对话计量。
  2. 「key 存在搜索插件里」——不是。key 存在凭据域,插件只记引用名。
  3. 「改搜索地址就能分开」——不是。地址与凭据是两个维度,DEEPSEEK_SEARCH_BASE_URL 只管落点。

怎么把两者分开

给搜索换一个独立的引用名,是最小且可逆的改动。

  1. 打开搜索设置页,把「凭据引用」从 DEEPSEEK_API_KEY 改成 DEEPSEEK_SEARCH_API_KEY。
  2. 把搜索要用的 key 填到这个新名字下。
  3. 确认模型路由里仍然是 DEEPSEEK_API_KEY,值保持不变。
  4. 发一条会触发搜索的消息,确认搜索正常。
  5. 再发一条普通对话消息,确认模型用的还是原来那条 key。
  6. 如果搜索有自己的服务地址,用 DEEPSEEK_SEARCH_BASE_URL 单独设置,别和对话的 baseURL 混。

注意事项

  1. 别把「共用」当成「搜索计费对话」。两者只是同一条密钥。
  2. 改引用名要两处同步。改了名字却没在新名字下填 key,搜索会失效。
  3. 账号登录路由不适用这套解释。先看 provider。
  4. 搜索地址与对话地址是两个变量。混用会让你误判成凭据问题。
  5. 改完做一次双向验证。搜索要能跑,对话要用回原 key。

关于「cmd+R 强制刷新」这类界面快捷方式,社区回复里没有给出内置实现,建议单独提需求,不要混进这条凭据问题里。

最后提醒一句:改完引用名后,如果哪天发现搜索又开始用对话的 key,先回头看是不是某次重装或重置把引用名恢复成了默认值。

如果你根本不需要分开两者,保持默认反而更省事——一个 key 管两处,少一处配置。相关排查见 DSH plugin web_search 走官方端点认证失败?自定义网关配置与替代方案排查。

ChatGPTClaudeGrok / X / CursorGemini

常见问题

在 DeepSeek Harness 搜索设置页填的 key,为什么对话也在用?

因为 DeepSeek Harness 的这两处用的是同一个凭据引用名。搜索页只做 credentials.set(引用名, 值),默认引用名是 DEEPSEEK_API_KEY;而 API-key 模型路由默认解析的也正是这个名字,所以填进去等于覆盖了模型读到的那条。

搜索插件会把 key 存到自己那里,还是只写进 DeepSeek Harness 的凭据引用?

不会,DeepSeek Harness 的搜索插件本身不存 key,它只引用凭据域里的一个名字;key 的实际存储由凭据服务负责。理解这一点,才能明白「改引用名」为什么能分离两者。

在 DeepSeek Harness 中,怎么让搜索和对话各自使用不同的 key?

在 DeepSeek Harness 里把搜索设置那个「凭据引用」改成另一个名字,比如 DEEPSEEK_SEARCH_API_KEY,再把搜索用的 key 填到这个新名字下。这样模型路由继续读 DEEPSEEK_API_KEY,互不影响。

搜索的地址和对话的地址,在 DeepSeek Harness 里是同一个配置吗?

不是,DeepSeek Harness 的搜索有自己独立的 endpoint 变量 DEEPSEEK_SEARCH_BASE_URL,与对话路由的 baseURL 无关,两者可以分别指向不同服务。

什么情况下,「共用 key」这个解释在 DeepSeek Harness 里不成立?

如果该会话走的是 DeepSeek Harness 的账号登录路由(deepseek-account),模型根本不读 DEEPSEEK_API_KEY,现象就要另找原因。判断方法是看该会话 request/header 里的 provider。

相关术语

凭据引用名
凭据引用名是指向凭据存储中某个条目的名字,插件与模型路由通过它取密钥。多个功能使用同一个引用名时,它们会共享同一条密钥。— https://github.com/deepseek-ai/deepseek-harness/discussions/11174
DEEPSEEK_API_KEY
DEEPSEEK_API_KEY 是 DeepSeek 相关功能默认使用的凭据引用名。搜索设置页与 API-key 模型路由的默认值都是它,因此默认状态下两者共享同一条密钥。— https://github.com/deepseek-ai/deepseek-harness/discussions/11174
DEEPSEEK_SEARCH_BASE_URL
DEEPSEEK_SEARCH_BASE_URL 是搜索功能独立的服务地址变量,与对话路由的 baseURL 分开配置。它只影响搜索请求的落点,不影响模型调用。— https://github.com/deepseek-ai/deepseek-harness/discussions/11174
credentials.set
这个写入接口是凭据域里按引用名存值的 API,即 credentials.set;搜索设置页提交时调用的就是它,因此写入位置在凭据存储而不是搜索插件内部。— https://github.com/deepseek-ai/deepseek-harness/discussions/11174

来源