@qthinker/opencode-deepseek-search

中文文档
0.2.1发布于 2026/11/02MITES Module零依赖构建来源已验证

OpenCode V2的DeepSeek搜索和获取:一个可切换的web搜索后端,干净的Markdown获取,本地使用/成本统计,以及TUI +桌面边栏

中文使用文档
文档目录15 节
  1. 要求
  2. 安装
  3. 选项
  4. 工具
  5. 切换后端
  6. 切换方式
  7. 优先级
  8. 原生模式还能给你什么
  9. TUI和桌面侧栏
  10. 使用和成本
  11. 费率限制和成本
  12. 隐私
  13. 故障排除
  14. 地方发展
  15. 许可证

OpenCode V2的深度搜索

npm version license node opencode

DeepSeek Search & Fetch作为一个OpenCode V2插件: 内置的 websearch 工具路由到DeepSeek,加上一个干净的。 降价取货工具,本地使用/成本统计,a 坚持 后端开关,以及 TUI +桌面边栏 显示 状态和数字,一键翻转接管。

回到原生搜索:侧边栏开关, mode 选择,一个 deepseek_mode 电话,或 tools/switch-mode.ps1 从回购中。 中文说明见 文档/ README.zh-CN.md。

不同于现有的同名V1包:这个包的目标是 V2插件API切换后端 在 运行时,以及报告 当地使用情况和估计费用.

验证对 opencode 2.2.5 与 @opencode/[email protected] 在Windows上。搜索/获取API事实来自 https://api-docs.deepseek.com/zh-cn/guides/search.

要求

  • opencode >= 2.2.5 (V2插件API)
  • node . js >= 22.18 (该插件附带TypeScript源代码)
  • 具有Search/Fetch访问权限的DeepSeek API密钥
  • 对于侧边栏:没有额外的- TUI和桌面应用程序提供渲染器(@opentui/*, solid-js), 从同一个包中加载插件的两个部分

安装

设置键一次(Windows,用户范围):

[Environment]::SetEnvironmentVariable("DEEPSEEK_API_KEY", "sk-...", "User")
opencode service restart   # User-scope variables only reach new processes

然后将插件添加到 opencode.jsonc:

{
  "$schema": "https://opencode.ai/config.json",
  "plugins": ["@qthinker/opencode-deepseek-search"]
}

哪个文件加载哪一半。 读取服务器插件和桌面面板 opencode.json(c) -桌面应用程序只读取该文件,a 全球 ~/.config/opencode/opencode.jsonc 入口使面板出现在每个窗口中。读取TUI的一半 cli.json ("plugins": [...]). 所以一个插件每一半都是启用的:在你想要的那一半的文件中列出它,无论它来自npm(按包名)还是来自本地目录(按路径)。

与选项(推荐-这是哪里 mode 和朋友一起生活):

{
  "plugins": [
    {
      "package": "@qthinker/opencode-deepseek-search",
      "options": {
        "mode": "deepseek",
        "count": 5,
        "apiKey": "{env:DEEPSEEK_API_KEY}"
      }
    }
  ]
}

存储库目录中的本地开发点(配置项必须是 目录,而不是文件):

{
  "plugins": [
    { "package": "D:/repos/opencode-deepseek-search", "options": { "mode": "deepseek" } }
  ]
}

opencode plugin add <package-or-directory> 同样的编辑为您(它写 全球 配置), opencode plugin list 然后应该显示 deepseek-search 与源 local 或者包名。

重载规则: 服务器一半 保存源文件时在适当位置重新运行-否 /reload,没有重启服务。 另外两半是客户端:重新启动 途易,并重新加载 桌面窗口,去捡个零钱来 tui.ts / gui-experimental.cjs (和运行 npm run build:gui 首先是克隆)。

选项

选项类型默认的意义
mode"deepseek" | "native"deepseek的默认后端 websearch;一个坚持 deepseek_mode Switch覆盖它
apiKey字符串DEEPSEEK_API_KEY通常 "{env:DEEPSEEK_API_KEY}";未设置的嫉妒变成 ""
count1-505每次搜索结果(不改变价格)
fetchMaxChars500 - 20000030000截断极限 deepseek_fetch,并附有明确通知
pricePerThousand0 - 100005每1000个请求人民币(整数),仅用于本地成本估算

工具

工具它是做什么的
websearch (内置)相同的名称和输入;在 deepseek 模式这个插件提供结果
deepseek_fetch输入一个URL,清除Markdown,删除 fetchMaxChars 有通知
deepseek_usage本地搜索/获取计数和估计成本; reset: true 清除它
deepseek_mode报告或切换搜索后端;交换机被持久化

路由 保留内置权限检查和声明的 output 形状,所以审批提示和呈现 是不变的。结果把 summary (600-800字,为模型编写)或 snippet -从来没有整页的文本, 和 need_content 从未被要求过。

切换后端

切换方式

道路如何坚持用它来
侧边栏点击途易卡上的动作([停用] / [启用]),或面板按钮是(插件存储) mode/v1)当你工作的时候
配置编辑 options.mode;保存时适用是(在配置文件中)长期违约
工具让模特打电话 deepseek_mode,或者你自己叫它是(插件存储) mode/v1)在不接触文件的情况下切换会话
脚本.\tools\switch-mode.ps1 native是(脚本编辑配置)从终端快速切换,不需要编辑器

deepseek_mode 行动:

呼叫效果
deepseek_mode (或 {"mode": "status"})报告当前后端 以及它的来源 (配置文件/持久化开关)
deepseek_mode({"mode": "deepseek"})路由内置 websearch 深度搜索工具
deepseek_mode({"mode": "native"})让内置后端保持原样
deepseek_mode({"mode": "config"})清除持久化开关 options.mode 再决定

优先级

deepseek_mode switch (storage: mode/v1)  >  options.mode  >  built-in default
  • 开关存在于OpenCode的本地插件存储(mode/v1) - - - 对于安装是全局的,并在整个过程中持久化 重新启动 -它永远不会修改你的配置文件。
  • 因为它胜过了配置文件,所以“什么都不做”的编辑意味着存在一个存储开关:ask deepseek_mode (它命名源),然后使用 mode: "config".
  • 提供者在两种模式下都注册了,所以在任何步骤中最坏的情况都是“保留以前的后端”——永远不会 “无法搜索”。

原生模式还能给你什么

websearch 完全独立,并服务于您现有的后端。 deepseek_fetch, deepseek_usage 和 deepseek_mode 保持注册(它们是附加的),并且提供者仍然是注册的,因此您可以选择它 明确与 providerID: "deepseek" 或配置 "websearch": { "provider": "deepseek" }.

为什么工具被重新路由,而不是依赖于一个默认的提供商:在2.2.5中,一个插件 websearch.default.set() 是 被后来注册的内置配置插件覆盖,因此该工具继续使用内置提供程序。插件 因此修补内置工具本身;保留内置的权限检查,而“选择搜索”则保留 “提供者”表单在深度搜索模式中不会出现。如果某个版本没有公开该工具, deepseek_mode 说它不能 在运行时切换-使用 websearch.provider 在配置中。

TUI和桌面侧栏

该插件还显示您工作的地方,并且可以在没有模型或配置文件的情况下切换:

表面你得到了什么如何切换
途易一个DeepSeek块被附加到会话侧栏:state,然后是:Search · Fetch · ¥ 估计);它会退化为缩写,然后随着侧边栏的缩小而退化为更少的列单击标题右侧的操作,或运行 /deepseek 菜单的斜杠命令
桌面一、 DeepSeek 选项卡,在会话的侧区域中列出 新标签页 页面及其 + 菜单,并可使用 DeepSeek: 打开统计面板 命令面板的按钮,加上刷新控件
  • 两个表面读取相同的分类账和相同的存储开关 deepseek_usage / deepseek_mode:单身 服务器端源,通过插件自己的RPC到达,所以数字不会在TUI和桌面之间出现分歧。
  • “停止”意味着手内建 websearch 回到您配置的后端 (完全 deepseek_mode({"mode": "native"}))。 这不是卸载: deepseek_fetch, deepseek_usage 和 deepseek_mode 保持注册,国家就会 坚持 mode/v1 和其他开关一样。
  • 动作行总是说点击做什么。如果没有配置API密钥,则不需要采取任何操作,如下所示 而解决方法是(DEEPSEEK_API_KEY); 当内建工具无法修补时,它会报告,而不是 假装被启用。
  • 的状态刷新 changed 事件在每次计数和每次切换后触发,并在10秒内重新读取 两面后退。

桌面部分作为预构建的CommonJS包发布(gui-experimental.cjs). 发布的软件包包括它;如果你 从克隆中运行插件,构建一次——TUI部分不需要构建,像服务器部分一样从TypeScript加载:

npm install && npm run build:gui

使用和成本

计数器计算时宣传
searchHTTP 200和 results 非空每次请求0.005元
fetchHTTP 200和正文非空每次请求0.005元
emptyHTTP 200的空结果/正文不收费
failed网络错误,或者重试一次后非200不收费

成本以整数元为单位累积,所以重复的加法永远不会漂移。 count 不影响价格。 deepseek_usage({ "reset": true }) 报告后清理分类账。

  • 储存在 ctx.storage 关键 usage/v1,保存最近60天,日键为当地时间。
  • 存储对于OpenCode安装是全局的,并且在重新启动后仍然有效。
  • 本地统计数据≠你的DeepSeek账单:只有这台机器,这个插件。其他工具和机器不计算在内, 并发的OpenCode服务器可能会丢失计数(最后一次写入获胜)。

费率限制和成本

搜索100 QPS /获取每个帐户25 QPS(获取也限制每个目标域)。单个请求的成本 ¥0.005。仅在408/429/5xx上重试一次,荣誉 Retry-After (上限为5分钟),并可取消。

隐私

查询和url被发送到 https://api.deepseek.com. 没有其他东西离开你的机器;使用分类帐和 模式切换留在本地OpenCode存储。API密钥永远不会被记录。

搜索结果和获取的页面是 第三方文本将它们视为数据,而不是指令——页面可以这样做 包含试图引导模型的文本。

故障排除

症状原因/修复
不确定使用哪个后端搜索呼叫 deepseek_mode -报告后端 和 其来源
配置编辑似乎被忽略了存在一个持久化开关(源文件是这么说的);清除它 deepseek_mode({"mode": "config"})
未配置 DeepSeek API Key (缺少键)集 DEEPSEEK_API_KEY,重新启动OpenCode服务一次,以便新进程继承它
401 无效的关键检查一下钥匙和那个 apiKey/env指向它
402 余额不足充值;失败的请求不会被计费
429 速度有限已经后退过一次了;重试后
403 / 404 在获取网站阻止提取或页面没有可读的文本;试试内置的 webfetch
搜索仍然会访问本地后端mode 或者持久化开关是 native;如果两者都是 deepseek,内置的 websearch 没有找到工具-使用配置 "websearch": { "provider": "deepseek" }
TUI侧边栏没有DeepSeek卡TUI一半已启用 cli.json ("plugins": [...]),不在 opencode.jsonc;添加路径/包并重新启动TUI
中没有DeepSeek条目 新标签页 列表程序中读取插件 全球 opencode.jsonc,并且它的bundle必须存在- run npm run build:gui 当从克隆中工作时,请重新加载窗口
侧边栏表示 读取失败一半无法到达RPC: check opencode plugin list 报告 deepseek-search 作为主动,然后寻找 /api/rpc/deepseek-search/status 在 ~/.local/share/opencode/log/opencode.log. 一个 400 rpc.invalid_input 意味着一半和服务器不同意合同-重新加载该客户端

地方发展

cd D:\repos\opencode-deepseek-search
npm install
npm run typecheck     # tsc --noEmit, both the server/TUI config and the GUI config
npm test              # node --test, pure functions, zero cost
npm run build:gui     # src/gui -> gui-experimental.cjs (the desktop half's bundle)
node --experimental-strip-types scripts/check-gui-bundle.ts   # bundle shape check, run in CI
npm run smoke         # real API smoke; skipped without DEEPSEEK_API_KEY
npm pack --dry-run    # audit the publish artifacts — run build:gui first, `pack` does not build the bundle

一命令开关(仅支持repo的助手)编辑 options.mode 在 opencode.jsonc把它备份到 opencode.jsonc.bak-switch):

.\tools\switch-mode.ps1 status
.\tools\switch-mode.ps1 native
.\tools\switch-mode.ps1 deepseek

如果ExecutionPolicy阻止它:

powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\switch-mode.ps1 native

更短,通过别名 $PROFILE:

function dsmode { & "D:\repos\opencode-deepseek-search\tools\switch-mode.ps1" @args }

布局:

index.ts              # directory-plugin entry, re-exports src/index.ts
tui.ts                # TUI entry, re-exports src/tui/main.ts
src/index.ts          # plugin: options, registration, websearch patch, three tools
src/deepseek.ts       # HTTP core: timeout/cancel, single backoff retry, Chinese errors, mapping
src/usage.ts          # pure ledger: micro-CNY pricing, 60-day prune, defensive parse, formatting
src/rpc.ts            # RPC contract shared by the server, TUI and desktop halves
src/status-view.ts    # pure view model both sidebars derive their copy from
src/tui/              # TUI half: card element tree + plugin wiring
src/gui/              # desktop half: side panel component + plugin wiring
vite.config.ts        # builds src/gui into the root gui-experimental.cjs bundle
test/*.test.ts        # pure-function tests
scripts/smoke.ts      # real-API smoke (5 steps)
scripts/check-gui-bundle.ts # bundle shape check, run in CI after build:gui
tools/switch-mode.ps1 # terminal backend switch
.github/workflows/    # ci (build + typecheck + test + bundle check) / release

两个包装陷阱(已经避免-不要再引入它们):

  1. 配置的本地插件路径必须为 目录;单个文件被删除。
  2. 做。 不 添加 exports 来 package.json: name + exports, OpenCode按包解析目录 名称,当解析的入口点位于目录之外时,它就是 默默的下降 (没有计程仪, 它就这样从 plugin list)。

两者都适用于插件的每一半: index.ts, tui.ts 和 gui-experimental.cjs 位于存储库根, 这就是目录和安装包解析路径所查找的内容。 test/packaging.test.ts 失败,如果 exports 返回或根条目停止解析。

源代码编辑在保存时热重新加载;验证与 opencode plugin list 加上一次真正的搜索。

许可证

麻省理工学院。与DeepSeek无关。

版本与发布记录

@qthinker/opencode-deepseek-search 共发布 5 个版本,首次发布于 2026/11/01;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.1latest2026/11/021 天前
0.2.02026/11/021 天前
0.1.12026/11/011 天前
0.1.02026/11/011 天前
0.0.0-stage2026/11/011 天前

关于 @qthinker/opencode-deepseek-search 的常见问题

@qthinker/opencode-deepseek-search 是什么?

OpenCode V2的DeepSeek搜索和获取:一个可切换的web搜索后端,干净的Markdown获取,本地使用/成本统计,以及TUI +桌面边栏

如何安装 @qthinker/opencode-deepseek-search?

在项目目录运行 npm install @qthinker/opencode-deepseek-search,或使用 pnpm add / yarn add / bun add。

@qthinker/opencode-deepseek-search 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/qthinker__opencode-deepseek-search 是否存在。

@qthinker/opencode-deepseek-search 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@qthinker/opencode-deepseek-search 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@qthinker/opencode-deepseek-search 可以商用吗?

@qthinker/opencode-deepseek-search 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@qthinker/opencode-deepseek-search 还在维护吗?

最新版本 0.2.1 发布于 2026/11/02(1 天前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/11/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。