DeepSeek Harness 搜索页填的 key 为什么对话也在用:同一凭据引用名排查
「我在搜索页填了 key,结果后面聊天的消耗也走这个 key」——这不是错觉,也不是搜索把对话的 token 算进去了,而是两处默认用了同一个凭据引用名。 搜索插件根本不存 key,它只往凭据域写一个名字;而模型路由默认读的也是这个名字(#11174)。把「名字」和「值」分开想,这段关系就清楚了。
DeepSeek Harness 第一层:「在搜索页填 key」写进去的是什么
它写的不是搜索插件的配置项,而是一条凭据条目的引用名。
- 提交动作调用
credentials.set(this.ref(), value),把值写进凭据域。 this.ref()就是引用名,默认值DEEPSEEK_API_KEY。- 搜索插件的 schema 里,默认引用名也是同一个字符串。
- 所以「填 key」实际是「给这个名字赋值」。
- 搜索插件侧只保存「我用哪个名字」,不保存密钥本体。
DSH插件 第二层:三个默认值凑成了同一个名字
搜索页、搜索插件、API-key 模型路由的默认引用名是同一个,于是默认状态下它们天然共享。
- 搜索设置页:默认引用名
DEEPSEEK_API_KEY。 - 搜索插件 schema:同一个默认值。
- DeepSeek API-key 模型连接:默认解析的也是这个名。
- 三个默认值指向同一条凭据,谁写谁生效。
- 因此你在搜索页填入的 key,会被模型路由读到。
DeepSeek Harness 第三层:为什么表现为「对话也在用这个 key」
因为走 API-key 路由时,模型请求带的正是这条凭据;不是搜索转发了它,而是它们本来就是同一条。
- 会话请求模型前,适配器按引用名取密钥。
- 取到的就是你刚填的那条。
- 于是对话的调用自然用这个 key。
- 这与搜索结果无关,也与搜索的计费无关。
- 判断依据是「provider 是 API-key 路由」而不是「开了搜索」。
DeepSeek插件 第四层:这个解释什么时候不成立
如果会话走账号登录路由,模型根本不读这个引用名,那现象就要另找原因。
- 打开该会话的
request/header,看 provider 是哪条。 - 如果是账号登录(deepseek-account),模型不走 API-key。
- 这时「共用 key」不适用,得去查账号额度或其它配置。
- 同理,只有在使用 API-key 路由时,改引用名才有意义。
- 先确认这一条,能省掉一半无效排查。
DeepSeek Harness 默认值在哪里撞车
三处默认值并排看,撞车这件事就一目了然。
| 位置 | 默认引用名 | 作用 |
|---|---|---|
| 搜索设置页 | DEEPSEEK_API_KEY | 写入凭据域的值 |
| 搜索插件 schema | DEEPSEEK_API_KEY | 读取同一个名字 |
| API-key 模型连接 | DEEPSEEK_API_KEY | 模型请求也读它 |
三行都指向同一个名字,所以「填一次、两边生效」是默认行为,不是意外。
DSH插件 三个常见误解
把这三条拆掉,基本就不会再误判。
- 「搜索把对话的 token 算进去了」——不是。搜索只引用密钥,不参与对话计量。
- 「key 存在搜索插件里」——不是。key 存在凭据域,插件只记引用名。
- 「改搜索地址就能分开」——不是。地址与凭据是两个维度,
DEEPSEEK_SEARCH_BASE_URL只管落点。
怎么把两者分开
给搜索换一个独立的引用名,是最小且可逆的改动。
- 打开搜索设置页,把「凭据引用」从
DEEPSEEK_API_KEY改成DEEPSEEK_SEARCH_API_KEY。 - 把搜索要用的 key 填到这个新名字下。
- 确认模型路由里仍然是
DEEPSEEK_API_KEY,值保持不变。 - 发一条会触发搜索的消息,确认搜索正常。
- 再发一条普通对话消息,确认模型用的还是原来那条 key。
- 如果搜索有自己的服务地址,用
DEEPSEEK_SEARCH_BASE_URL单独设置,别和对话的 baseURL 混。
注意事项
- 别把「共用」当成「搜索计费对话」。两者只是同一条密钥。
- 改引用名要两处同步。改了名字却没在新名字下填 key,搜索会失效。
- 账号登录路由不适用这套解释。先看 provider。
- 搜索地址与对话地址是两个变量。混用会让你误判成凭据问题。
- 改完做一次双向验证。搜索要能跑,对话要用回原 key。
关于「cmd+R 强制刷新」这类界面快捷方式,社区回复里没有给出内置实现,建议单独提需求,不要混进这条凭据问题里。
最后提醒一句:改完引用名后,如果哪天发现搜索又开始用对话的 key,先回头看是不是某次重装或重置把引用名恢复成了默认值。
如果你根本不需要分开两者,保持默认反而更省事——一个 key 管两处,少一处配置。相关排查见 DSH plugin web_search 走官方端点认证失败?自定义网关配置与替代方案排查。
常见问题
因为 DeepSeek Harness 的这两处用的是同一个凭据引用名。搜索页只做 credentials.set(引用名, 值),默认引用名是 DEEPSEEK_API_KEY;而 API-key 模型路由默认解析的也正是这个名字,所以填进去等于覆盖了模型读到的那条。
不会,DeepSeek Harness 的搜索插件本身不存 key,它只引用凭据域里的一个名字;key 的实际存储由凭据服务负责。理解这一点,才能明白「改引用名」为什么能分离两者。
在 DeepSeek Harness 里把搜索设置那个「凭据引用」改成另一个名字,比如 DEEPSEEK_SEARCH_API_KEY,再把搜索用的 key 填到这个新名字下。这样模型路由继续读 DEEPSEEK_API_KEY,互不影响。
不是,DeepSeek Harness 的搜索有自己独立的 endpoint 变量 DEEPSEEK_SEARCH_BASE_URL,与对话路由的 baseURL 无关,两者可以分别指向不同服务。
如果该会话走的是 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
来源
- #11174 — 新版 websearch 填了 key 后面对话消耗的也是这个 key· deepseek-ai(GitHub Discussions)
- deepseek-ai/deepseek-harness(源码仓库)· GitHub